@qingchencloud/openclaw-zh 2026.1.29-nightly.202601301919

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 (2602) hide show
  1. package/CHANGELOG.md +1223 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +608 -0
  5. package/assets/avatar-placeholder.svg +19 -0
  6. package/assets/chrome-extension/README.md +22 -0
  7. package/assets/chrome-extension/background.js +438 -0
  8. package/assets/chrome-extension/icons/icon128.png +0 -0
  9. package/assets/chrome-extension/icons/icon16.png +0 -0
  10. package/assets/chrome-extension/icons/icon32.png +0 -0
  11. package/assets/chrome-extension/icons/icon48.png +0 -0
  12. package/assets/chrome-extension/manifest.json +25 -0
  13. package/assets/chrome-extension/options.html +196 -0
  14. package/assets/chrome-extension/options.js +59 -0
  15. package/assets/dmg-background-small.png +0 -0
  16. package/assets/dmg-background.png +0 -0
  17. package/dist/acp/client.js +144 -0
  18. package/dist/acp/commands.js +38 -0
  19. package/dist/acp/event-mapper.js +70 -0
  20. package/dist/acp/index.js +2 -0
  21. package/dist/acp/meta.js +30 -0
  22. package/dist/acp/server.js +131 -0
  23. package/dist/acp/session-mapper.js +65 -0
  24. package/dist/acp/session.js +68 -0
  25. package/dist/acp/translator.js +344 -0
  26. package/dist/acp/types.js +6 -0
  27. package/dist/agents/agent-paths.js +19 -0
  28. package/dist/agents/agent-scope.js +118 -0
  29. package/dist/agents/anthropic-payload-log.js +160 -0
  30. package/dist/agents/apply-patch-update.js +145 -0
  31. package/dist/agents/apply-patch.js +355 -0
  32. package/dist/agents/auth-health.js +169 -0
  33. package/dist/agents/auth-profiles/constants.js +20 -0
  34. package/dist/agents/auth-profiles/display.js +10 -0
  35. package/dist/agents/auth-profiles/doctor.js +31 -0
  36. package/dist/agents/auth-profiles/external-cli-sync.js +62 -0
  37. package/dist/agents/auth-profiles/oauth.js +218 -0
  38. package/dist/agents/auth-profiles/order.js +166 -0
  39. package/dist/agents/auth-profiles/paths.js +27 -0
  40. package/dist/agents/auth-profiles/profiles.js +63 -0
  41. package/dist/agents/auth-profiles/repair.js +120 -0
  42. package/dist/agents/auth-profiles/session-override.js +97 -0
  43. package/dist/agents/auth-profiles/store.js +323 -0
  44. package/dist/agents/auth-profiles/types.js +1 -0
  45. package/dist/agents/auth-profiles/usage.js +235 -0
  46. package/dist/agents/auth-profiles.js +10 -0
  47. package/dist/agents/bash-process-registry.js +177 -0
  48. package/dist/agents/bash-tools.exec.js +1176 -0
  49. package/dist/agents/bash-tools.js +2 -0
  50. package/dist/agents/bash-tools.process.js +569 -0
  51. package/dist/agents/bash-tools.shared.js +198 -0
  52. package/dist/agents/bedrock-discovery.js +157 -0
  53. package/dist/agents/bootstrap-files.js +28 -0
  54. package/dist/agents/bootstrap-hooks.js +19 -0
  55. package/dist/agents/cache-trace.js +185 -0
  56. package/dist/agents/channel-tools.js +87 -0
  57. package/dist/agents/chutes-oauth.js +133 -0
  58. package/dist/agents/claude-cli-runner.js +3 -0
  59. package/dist/agents/cli-backends.js +126 -0
  60. package/dist/agents/cli-credentials.js +360 -0
  61. package/dist/agents/cli-runner/helpers.js +409 -0
  62. package/dist/agents/cli-runner.js +265 -0
  63. package/dist/agents/cli-session.js +27 -0
  64. package/dist/agents/compaction.js +229 -0
  65. package/dist/agents/context-window-guard.js +37 -0
  66. package/dist/agents/context.js +34 -0
  67. package/dist/agents/date-time.js +158 -0
  68. package/dist/agents/defaults.js +6 -0
  69. package/dist/agents/docs-path.js +20 -0
  70. package/dist/agents/failover-error.js +164 -0
  71. package/dist/agents/identity-avatar.js +82 -0
  72. package/dist/agents/identity-file.js +80 -0
  73. package/dist/agents/identity.js +61 -0
  74. package/dist/agents/lanes.js +2 -0
  75. package/dist/agents/live-auth-keys.js +70 -0
  76. package/dist/agents/live-model-filter.js +70 -0
  77. package/dist/agents/memory-search.js +194 -0
  78. package/dist/agents/minimax-vlm.js +81 -0
  79. package/dist/agents/model-auth.js +274 -0
  80. package/dist/agents/model-catalog.js +95 -0
  81. package/dist/agents/model-compat.js +17 -0
  82. package/dist/agents/model-fallback.js +268 -0
  83. package/dist/agents/model-scan.js +350 -0
  84. package/dist/agents/model-selection.js +284 -0
  85. package/dist/agents/models-config.js +111 -0
  86. package/dist/agents/models-config.providers.js +455 -0
  87. package/dist/agents/openclaw-tools.js +121 -0
  88. package/dist/agents/opencode-zen-models.js +254 -0
  89. package/dist/agents/pi-embedded-block-chunker.js +209 -0
  90. package/dist/agents/pi-embedded-helpers/bootstrap.js +159 -0
  91. package/dist/agents/pi-embedded-helpers/errors.js +456 -0
  92. package/dist/agents/pi-embedded-helpers/google.js +12 -0
  93. package/dist/agents/pi-embedded-helpers/images.js +92 -0
  94. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +35 -0
  95. package/dist/agents/pi-embedded-helpers/openai.js +98 -0
  96. package/dist/agents/pi-embedded-helpers/thinking.js +32 -0
  97. package/dist/agents/pi-embedded-helpers/turns.js +95 -0
  98. package/dist/agents/pi-embedded-helpers/types.js +1 -0
  99. package/dist/agents/pi-embedded-helpers.js +9 -0
  100. package/dist/agents/pi-embedded-messaging.js +24 -0
  101. package/dist/agents/pi-embedded-runner/abort.js +9 -0
  102. package/dist/agents/pi-embedded-runner/cache-ttl.js +45 -0
  103. package/dist/agents/pi-embedded-runner/compact.js +405 -0
  104. package/dist/agents/pi-embedded-runner/extensions.js +64 -0
  105. package/dist/agents/pi-embedded-runner/extra-params.js +70 -0
  106. package/dist/agents/pi-embedded-runner/google.js +302 -0
  107. package/dist/agents/pi-embedded-runner/history.js +61 -0
  108. package/dist/agents/pi-embedded-runner/lanes.js +11 -0
  109. package/dist/agents/pi-embedded-runner/logger.js +2 -0
  110. package/dist/agents/pi-embedded-runner/model.js +76 -0
  111. package/dist/agents/pi-embedded-runner/run/attempt.js +752 -0
  112. package/dist/agents/pi-embedded-runner/run/images.js +344 -0
  113. package/dist/agents/pi-embedded-runner/run/params.js +1 -0
  114. package/dist/agents/pi-embedded-runner/run/payloads.js +162 -0
  115. package/dist/agents/pi-embedded-runner/run/types.js +1 -0
  116. package/dist/agents/pi-embedded-runner/run.js +561 -0
  117. package/dist/agents/pi-embedded-runner/runs.js +107 -0
  118. package/dist/agents/pi-embedded-runner/sandbox-info.js +22 -0
  119. package/dist/agents/pi-embedded-runner/session-manager-cache.js +54 -0
  120. package/dist/agents/pi-embedded-runner/session-manager-init.js +31 -0
  121. package/dist/agents/pi-embedded-runner/system-prompt.js +33 -0
  122. package/dist/agents/pi-embedded-runner/tool-split.js +8 -0
  123. package/dist/agents/pi-embedded-runner/types.js +1 -0
  124. package/dist/agents/pi-embedded-runner/utils.js +25 -0
  125. package/dist/agents/pi-embedded-runner.js +10 -0
  126. package/dist/agents/pi-embedded-subscribe.handlers.js +45 -0
  127. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +86 -0
  128. package/dist/agents/pi-embedded-subscribe.handlers.messages.js +230 -0
  129. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +176 -0
  130. package/dist/agents/pi-embedded-subscribe.handlers.types.js +1 -0
  131. package/dist/agents/pi-embedded-subscribe.js +454 -0
  132. package/dist/agents/pi-embedded-subscribe.raw-stream.js +27 -0
  133. package/dist/agents/pi-embedded-subscribe.tools.js +166 -0
  134. package/dist/agents/pi-embedded-subscribe.types.js +1 -0
  135. package/dist/agents/pi-embedded-utils.js +341 -0
  136. package/dist/agents/pi-embedded.js +1 -0
  137. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +20 -0
  138. package/dist/agents/pi-extensions/compaction-safeguard.js +252 -0
  139. package/dist/agents/pi-extensions/context-pruning/extension.js +32 -0
  140. package/dist/agents/pi-extensions/context-pruning/pruner.js +263 -0
  141. package/dist/agents/pi-extensions/context-pruning/runtime.js +21 -0
  142. package/dist/agents/pi-extensions/context-pruning/settings.js +71 -0
  143. package/dist/agents/pi-extensions/context-pruning/tools.js +44 -0
  144. package/dist/agents/pi-extensions/context-pruning.js +9 -0
  145. package/dist/agents/pi-settings.js +19 -0
  146. package/dist/agents/pi-tool-definition-adapter.js +74 -0
  147. package/dist/agents/pi-tools.abort.js +41 -0
  148. package/dist/agents/pi-tools.js +297 -0
  149. package/dist/agents/pi-tools.policy.js +245 -0
  150. package/dist/agents/pi-tools.read.js +227 -0
  151. package/dist/agents/pi-tools.schema.js +147 -0
  152. package/dist/agents/pi-tools.types.js +1 -0
  153. package/dist/agents/pty-dsr.js +13 -0
  154. package/dist/agents/pty-keys.js +235 -0
  155. package/dist/agents/sandbox/browser-bridges.js +1 -0
  156. package/dist/agents/sandbox/browser.js +181 -0
  157. package/dist/agents/sandbox/config-hash.js +45 -0
  158. package/dist/agents/sandbox/config.js +114 -0
  159. package/dist/agents/sandbox/constants.js +45 -0
  160. package/dist/agents/sandbox/context.js +117 -0
  161. package/dist/agents/sandbox/docker.js +275 -0
  162. package/dist/agents/sandbox/manage.js +91 -0
  163. package/dist/agents/sandbox/prune.js +87 -0
  164. package/dist/agents/sandbox/registry.js +71 -0
  165. package/dist/agents/sandbox/runtime-status.js +90 -0
  166. package/dist/agents/sandbox/shared.js +38 -0
  167. package/dist/agents/sandbox/tool-policy.js +106 -0
  168. package/dist/agents/sandbox/types.docker.js +1 -0
  169. package/dist/agents/sandbox/types.js +1 -0
  170. package/dist/agents/sandbox/workspace.js +39 -0
  171. package/dist/agents/sandbox-paths.js +68 -0
  172. package/dist/agents/sandbox.js +7 -0
  173. package/dist/agents/schema/clean-for-gemini.js +295 -0
  174. package/dist/agents/schema/typebox.js +22 -0
  175. package/dist/agents/session-slug.js +134 -0
  176. package/dist/agents/session-tool-result-guard-wrapper.js +34 -0
  177. package/dist/agents/session-tool-result-guard.js +99 -0
  178. package/dist/agents/session-transcript-repair.js +174 -0
  179. package/dist/agents/session-write-lock.js +170 -0
  180. package/dist/agents/shell-utils.js +99 -0
  181. package/dist/agents/skills/bundled-dir.js +30 -0
  182. package/dist/agents/skills/config.js +143 -0
  183. package/dist/agents/skills/env-overrides.js +67 -0
  184. package/dist/agents/skills/frontmatter.js +128 -0
  185. package/dist/agents/skills/plugin-skills.js +55 -0
  186. package/dist/agents/skills/refresh.js +135 -0
  187. package/dist/agents/skills/serialize.js +13 -0
  188. package/dist/agents/skills/types.js +1 -0
  189. package/dist/agents/skills/workspace.js +272 -0
  190. package/dist/agents/skills-install.js +390 -0
  191. package/dist/agents/skills-status.js +183 -0
  192. package/dist/agents/skills.js +13 -0
  193. package/dist/agents/subagent-announce-queue.js +129 -0
  194. package/dist/agents/subagent-announce.js +391 -0
  195. package/dist/agents/subagent-registry.js +343 -0
  196. package/dist/agents/subagent-registry.store.js +73 -0
  197. package/dist/agents/synthetic-models.js +182 -0
  198. package/dist/agents/system-prompt-params.js +70 -0
  199. package/dist/agents/system-prompt-report.js +113 -0
  200. package/dist/agents/system-prompt.js +456 -0
  201. package/dist/agents/test-helpers/fast-coding-tools.js +18 -0
  202. package/dist/agents/test-helpers/fast-core-tools.js +24 -0
  203. package/dist/agents/timeout.js +24 -0
  204. package/dist/agents/tool-call-id.js +164 -0
  205. package/dist/agents/tool-display.js +209 -0
  206. package/dist/agents/tool-display.json +308 -0
  207. package/dist/agents/tool-images.js +166 -0
  208. package/dist/agents/tool-policy.js +199 -0
  209. package/dist/agents/tool-summaries.js +10 -0
  210. package/dist/agents/tools/agent-step.js +44 -0
  211. package/dist/agents/tools/agents-list-tool.js +66 -0
  212. package/dist/agents/tools/browser-tool.js +596 -0
  213. package/dist/agents/tools/browser-tool.schema.js +105 -0
  214. package/dist/agents/tools/canvas-tool.js +158 -0
  215. package/dist/agents/tools/common.js +146 -0
  216. package/dist/agents/tools/cron-tool.js +261 -0
  217. package/dist/agents/tools/discord-actions-guild.js +453 -0
  218. package/dist/agents/tools/discord-actions-messaging.js +383 -0
  219. package/dist/agents/tools/discord-actions-moderation.js +92 -0
  220. package/dist/agents/tools/discord-actions.js +61 -0
  221. package/dist/agents/tools/gateway-tool.js +214 -0
  222. package/dist/agents/tools/gateway.js +30 -0
  223. package/dist/agents/tools/image-tool.helpers.js +55 -0
  224. package/dist/agents/tools/image-tool.js +370 -0
  225. package/dist/agents/tools/memory-tool.js +103 -0
  226. package/dist/agents/tools/message-tool.js +321 -0
  227. package/dist/agents/tools/nodes-tool.js +399 -0
  228. package/dist/agents/tools/nodes-utils.js +92 -0
  229. package/dist/agents/tools/session-status-tool.js +357 -0
  230. package/dist/agents/tools/sessions-announce-target.js +43 -0
  231. package/dist/agents/tools/sessions-helpers.js +261 -0
  232. package/dist/agents/tools/sessions-history-tool.js +118 -0
  233. package/dist/agents/tools/sessions-list-tool.js +161 -0
  234. package/dist/agents/tools/sessions-send-helpers.js +116 -0
  235. package/dist/agents/tools/sessions-send-tool.a2a.js +119 -0
  236. package/dist/agents/tools/sessions-send-tool.js +345 -0
  237. package/dist/agents/tools/sessions-spawn-tool.js +232 -0
  238. package/dist/agents/tools/slack-actions.js +243 -0
  239. package/dist/agents/tools/telegram-actions.js +256 -0
  240. package/dist/agents/tools/tts-tool.js +47 -0
  241. package/dist/agents/tools/web-fetch-utils.js +104 -0
  242. package/dist/agents/tools/web-fetch.js +477 -0
  243. package/dist/agents/tools/web-search.js +355 -0
  244. package/dist/agents/tools/web-shared.js +62 -0
  245. package/dist/agents/tools/web-tools.js +2 -0
  246. package/dist/agents/tools/whatsapp-actions.js +32 -0
  247. package/dist/agents/transcript-policy.js +84 -0
  248. package/dist/agents/usage.js +48 -0
  249. package/dist/agents/venice-models.js +342 -0
  250. package/dist/agents/workspace.js +234 -0
  251. package/dist/auto-reply/chunk.js +358 -0
  252. package/dist/auto-reply/command-auth.js +132 -0
  253. package/dist/auto-reply/command-detection.js +56 -0
  254. package/dist/auto-reply/commands-args.js +85 -0
  255. package/dist/auto-reply/commands-registry.data.js +574 -0
  256. package/dist/auto-reply/commands-registry.js +354 -0
  257. package/dist/auto-reply/commands-registry.types.js +1 -0
  258. package/dist/auto-reply/dispatch.js +40 -0
  259. package/dist/auto-reply/envelope.js +173 -0
  260. package/dist/auto-reply/group-activation.js +22 -0
  261. package/dist/auto-reply/heartbeat.js +120 -0
  262. package/dist/auto-reply/inbound-debounce.js +74 -0
  263. package/dist/auto-reply/media-note.js +72 -0
  264. package/dist/auto-reply/model.js +28 -0
  265. package/dist/auto-reply/reply/abort.js +151 -0
  266. package/dist/auto-reply/reply/agent-runner-execution.js +467 -0
  267. package/dist/auto-reply/reply/agent-runner-helpers.js +65 -0
  268. package/dist/auto-reply/reply/agent-runner-memory.js +160 -0
  269. package/dist/auto-reply/reply/agent-runner-payloads.js +85 -0
  270. package/dist/auto-reply/reply/agent-runner-utils.js +101 -0
  271. package/dist/auto-reply/reply/agent-runner.js +379 -0
  272. package/dist/auto-reply/reply/audio-tags.js +1 -0
  273. package/dist/auto-reply/reply/bash-command.js +336 -0
  274. package/dist/auto-reply/reply/block-reply-coalescer.js +101 -0
  275. package/dist/auto-reply/reply/block-reply-pipeline.js +179 -0
  276. package/dist/auto-reply/reply/block-streaming.js +91 -0
  277. package/dist/auto-reply/reply/body.js +37 -0
  278. package/dist/auto-reply/reply/commands-allowlist.js +570 -0
  279. package/dist/auto-reply/reply/commands-approve.js +88 -0
  280. package/dist/auto-reply/reply/commands-bash.js +25 -0
  281. package/dist/auto-reply/reply/commands-compact.js +106 -0
  282. package/dist/auto-reply/reply/commands-config.js +239 -0
  283. package/dist/auto-reply/reply/commands-context-report.js +294 -0
  284. package/dist/auto-reply/reply/commands-context.js +29 -0
  285. package/dist/auto-reply/reply/commands-core.js +101 -0
  286. package/dist/auto-reply/reply/commands-info.js +154 -0
  287. package/dist/auto-reply/reply/commands-models.js +201 -0
  288. package/dist/auto-reply/reply/commands-plugin.js +35 -0
  289. package/dist/auto-reply/reply/commands-session.js +311 -0
  290. package/dist/auto-reply/reply/commands-status.js +178 -0
  291. package/dist/auto-reply/reply/commands-subagents.js +357 -0
  292. package/dist/auto-reply/reply/commands-tts.js +226 -0
  293. package/dist/auto-reply/reply/commands-types.js +1 -0
  294. package/dist/auto-reply/reply/commands.js +3 -0
  295. package/dist/auto-reply/reply/config-commands.js +58 -0
  296. package/dist/auto-reply/reply/config-value.js +35 -0
  297. package/dist/auto-reply/reply/debug-commands.js +58 -0
  298. package/dist/auto-reply/reply/directive-handling.auth.js +191 -0
  299. package/dist/auto-reply/reply/directive-handling.fast-lane.js +60 -0
  300. package/dist/auto-reply/reply/directive-handling.impl.js +380 -0
  301. package/dist/auto-reply/reply/directive-handling.js +5 -0
  302. package/dist/auto-reply/reply/directive-handling.model-picker.js +64 -0
  303. package/dist/auto-reply/reply/directive-handling.model.js +279 -0
  304. package/dist/auto-reply/reply/directive-handling.parse.js +84 -0
  305. package/dist/auto-reply/reply/directive-handling.persist.js +181 -0
  306. package/dist/auto-reply/reply/directive-handling.queue-validation.js +48 -0
  307. package/dist/auto-reply/reply/directive-handling.shared.js +43 -0
  308. package/dist/auto-reply/reply/directives.js +114 -0
  309. package/dist/auto-reply/reply/dispatch-from-config.js +374 -0
  310. package/dist/auto-reply/reply/exec/directive.js +183 -0
  311. package/dist/auto-reply/reply/exec.js +1 -0
  312. package/dist/auto-reply/reply/followup-runner.js +226 -0
  313. package/dist/auto-reply/reply/get-reply-directives-apply.js +201 -0
  314. package/dist/auto-reply/reply/get-reply-directives-utils.js +45 -0
  315. package/dist/auto-reply/reply/get-reply-directives.js +343 -0
  316. package/dist/auto-reply/reply/get-reply-inline-actions.js +257 -0
  317. package/dist/auto-reply/reply/get-reply-run.js +286 -0
  318. package/dist/auto-reply/reply/get-reply.js +234 -0
  319. package/dist/auto-reply/reply/groups.js +102 -0
  320. package/dist/auto-reply/reply/history.js +110 -0
  321. package/dist/auto-reply/reply/inbound-context.js +51 -0
  322. package/dist/auto-reply/reply/inbound-dedupe.js +39 -0
  323. package/dist/auto-reply/reply/inbound-sender-meta.js +45 -0
  324. package/dist/auto-reply/reply/inbound-text.js +3 -0
  325. package/dist/auto-reply/reply/line-directives.js +294 -0
  326. package/dist/auto-reply/reply/memory-flush.js +66 -0
  327. package/dist/auto-reply/reply/mentions.js +123 -0
  328. package/dist/auto-reply/reply/model-selection.js +398 -0
  329. package/dist/auto-reply/reply/normalize-reply.js +62 -0
  330. package/dist/auto-reply/reply/provider-dispatcher.js +19 -0
  331. package/dist/auto-reply/reply/queue/cleanup.js +19 -0
  332. package/dist/auto-reply/reply/queue/directive.js +155 -0
  333. package/dist/auto-reply/reply/queue/drain.js +111 -0
  334. package/dist/auto-reply/reply/queue/enqueue.js +43 -0
  335. package/dist/auto-reply/reply/queue/normalize.js +30 -0
  336. package/dist/auto-reply/reply/queue/settings.js +52 -0
  337. package/dist/auto-reply/reply/queue/state.js +53 -0
  338. package/dist/auto-reply/reply/queue/types.js +1 -0
  339. package/dist/auto-reply/reply/queue.js +6 -0
  340. package/dist/auto-reply/reply/reply-directives.js +30 -0
  341. package/dist/auto-reply/reply/reply-dispatcher.js +107 -0
  342. package/dist/auto-reply/reply/reply-elevated.js +166 -0
  343. package/dist/auto-reply/reply/reply-inline.js +28 -0
  344. package/dist/auto-reply/reply/reply-payloads.js +83 -0
  345. package/dist/auto-reply/reply/reply-reference.js +35 -0
  346. package/dist/auto-reply/reply/reply-tags.js +13 -0
  347. package/dist/auto-reply/reply/reply-threading.js +41 -0
  348. package/dist/auto-reply/reply/response-prefix-template.js +76 -0
  349. package/dist/auto-reply/reply/route-reply.js +108 -0
  350. package/dist/auto-reply/reply/session-reset-model.js +133 -0
  351. package/dist/auto-reply/reply/session-updates.js +233 -0
  352. package/dist/auto-reply/reply/session-usage.js +79 -0
  353. package/dist/auto-reply/reply/session.js +303 -0
  354. package/dist/auto-reply/reply/stage-sandbox-media.js +146 -0
  355. package/dist/auto-reply/reply/streaming-directives.js +92 -0
  356. package/dist/auto-reply/reply/subagents-utils.js +52 -0
  357. package/dist/auto-reply/reply/test-ctx.js +15 -0
  358. package/dist/auto-reply/reply/typing-mode.js +91 -0
  359. package/dist/auto-reply/reply/typing.js +132 -0
  360. package/dist/auto-reply/reply.js +5 -0
  361. package/dist/auto-reply/send-policy.js +30 -0
  362. package/dist/auto-reply/skill-commands.js +97 -0
  363. package/dist/auto-reply/status.js +491 -0
  364. package/dist/auto-reply/templating.js +39 -0
  365. package/dist/auto-reply/thinking.js +154 -0
  366. package/dist/auto-reply/tokens.js +15 -0
  367. package/dist/auto-reply/tool-meta.js +112 -0
  368. package/dist/auto-reply/types.js +1 -0
  369. package/dist/browser/bridge-server.js +45 -0
  370. package/dist/browser/cdp.helpers.js +136 -0
  371. package/dist/browser/cdp.js +293 -0
  372. package/dist/browser/chrome.executables.js +509 -0
  373. package/dist/browser/chrome.js +253 -0
  374. package/dist/browser/chrome.profile-decoration.js +144 -0
  375. package/dist/browser/client-actions-core.js +100 -0
  376. package/dist/browser/client-actions-observe.js +100 -0
  377. package/dist/browser/client-actions-state.js +169 -0
  378. package/dist/browser/client-actions-types.js +1 -0
  379. package/dist/browser/client-actions.js +4 -0
  380. package/dist/browser/client-fetch.js +91 -0
  381. package/dist/browser/client.js +137 -0
  382. package/dist/browser/config.js +180 -0
  383. package/dist/browser/constants.js +8 -0
  384. package/dist/browser/control-service.js +72 -0
  385. package/dist/browser/extension-relay.js +541 -0
  386. package/dist/browser/profiles-service.js +132 -0
  387. package/dist/browser/profiles.js +93 -0
  388. package/dist/browser/pw-ai-module.js +37 -0
  389. package/dist/browser/pw-ai.js +2 -0
  390. package/dist/browser/pw-role-snapshot.js +310 -0
  391. package/dist/browser/pw-session.js +431 -0
  392. package/dist/browser/pw-tools-core.activity.js +44 -0
  393. package/dist/browser/pw-tools-core.downloads.js +176 -0
  394. package/dist/browser/pw-tools-core.interactions.js +420 -0
  395. package/dist/browser/pw-tools-core.js +8 -0
  396. package/dist/browser/pw-tools-core.responses.js +83 -0
  397. package/dist/browser/pw-tools-core.shared.js +48 -0
  398. package/dist/browser/pw-tools-core.snapshot.js +142 -0
  399. package/dist/browser/pw-tools-core.state.js +147 -0
  400. package/dist/browser/pw-tools-core.storage.js +72 -0
  401. package/dist/browser/pw-tools-core.trace.js +25 -0
  402. package/dist/browser/routes/agent.act.js +466 -0
  403. package/dist/browser/routes/agent.act.shared.js +38 -0
  404. package/dist/browser/routes/agent.debug.js +133 -0
  405. package/dist/browser/routes/agent.js +10 -0
  406. package/dist/browser/routes/agent.shared.js +45 -0
  407. package/dist/browser/routes/agent.snapshot.js +269 -0
  408. package/dist/browser/routes/agent.storage.js +386 -0
  409. package/dist/browser/routes/basic.js +173 -0
  410. package/dist/browser/routes/dispatcher.js +86 -0
  411. package/dist/browser/routes/index.js +8 -0
  412. package/dist/browser/routes/tabs.js +120 -0
  413. package/dist/browser/routes/types.js +1 -0
  414. package/dist/browser/routes/utils.js +57 -0
  415. package/dist/browser/screenshot.js +39 -0
  416. package/dist/browser/server-context.js +533 -0
  417. package/dist/browser/server-context.types.js +1 -0
  418. package/dist/browser/server.js +90 -0
  419. package/dist/browser/target-id.js +16 -0
  420. package/dist/browser/trash.js +21 -0
  421. package/dist/build-info.json +5 -0
  422. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  423. package/dist/canvas-host/a2ui/a2ui.bundle.js +17775 -0
  424. package/dist/canvas-host/a2ui/index.html +307 -0
  425. package/dist/canvas-host/a2ui.js +187 -0
  426. package/dist/canvas-host/server.js +412 -0
  427. package/dist/channel-web.js +8 -0
  428. package/dist/channels/ack-reactions.js +56 -0
  429. package/dist/channels/allowlist-match.js +3 -0
  430. package/dist/channels/allowlists/resolve-utils.js +37 -0
  431. package/dist/channels/channel-config.js +131 -0
  432. package/dist/channels/chat-type.js +12 -0
  433. package/dist/channels/command-gating.js +24 -0
  434. package/dist/channels/conversation-label.js +48 -0
  435. package/dist/channels/dock.js +344 -0
  436. package/dist/channels/location.js +44 -0
  437. package/dist/channels/logging.js +13 -0
  438. package/dist/channels/mention-gating.js +26 -0
  439. package/dist/channels/plugins/actions/discord/handle-action.guild-admin.js +332 -0
  440. package/dist/channels/plugins/actions/discord/handle-action.js +165 -0
  441. package/dist/channels/plugins/actions/discord.js +93 -0
  442. package/dist/channels/plugins/actions/signal.js +115 -0
  443. package/dist/channels/plugins/actions/telegram.js +153 -0
  444. package/dist/channels/plugins/agent-tools/whatsapp-login.js +63 -0
  445. package/dist/channels/plugins/allowlist-match.js +1 -0
  446. package/dist/channels/plugins/bluebubbles-actions.js +16 -0
  447. package/dist/channels/plugins/catalog.js +218 -0
  448. package/dist/channels/plugins/channel-config.js +1 -0
  449. package/dist/channels/plugins/config-helpers.js +87 -0
  450. package/dist/channels/plugins/config-schema.js +8 -0
  451. package/dist/channels/plugins/config-writes.js +21 -0
  452. package/dist/channels/plugins/directory-config.js +185 -0
  453. package/dist/channels/plugins/group-mentions.js +314 -0
  454. package/dist/channels/plugins/helpers.js +12 -0
  455. package/dist/channels/plugins/index.js +51 -0
  456. package/dist/channels/plugins/load.js +22 -0
  457. package/dist/channels/plugins/media-limits.js +15 -0
  458. package/dist/channels/plugins/message-action-names.js +51 -0
  459. package/dist/channels/plugins/message-actions.js +35 -0
  460. package/dist/channels/plugins/normalize/discord.js +18 -0
  461. package/dist/channels/plugins/normalize/imessage.js +36 -0
  462. package/dist/channels/plugins/normalize/signal.js +52 -0
  463. package/dist/channels/plugins/normalize/slack.js +19 -0
  464. package/dist/channels/plugins/normalize/telegram.js +31 -0
  465. package/dist/channels/plugins/normalize/whatsapp.js +17 -0
  466. package/dist/channels/plugins/onboarding/channel-access.js +68 -0
  467. package/dist/channels/plugins/onboarding/discord.js +413 -0
  468. package/dist/channels/plugins/onboarding/helpers.js +33 -0
  469. package/dist/channels/plugins/onboarding/imessage.js +231 -0
  470. package/dist/channels/plugins/onboarding/signal.js +262 -0
  471. package/dist/channels/plugins/onboarding/slack.js +470 -0
  472. package/dist/channels/plugins/onboarding/telegram.js +289 -0
  473. package/dist/channels/plugins/onboarding/whatsapp.js +286 -0
  474. package/dist/channels/plugins/onboarding-types.js +1 -0
  475. package/dist/channels/plugins/outbound/discord.js +29 -0
  476. package/dist/channels/plugins/outbound/imessage.js +38 -0
  477. package/dist/channels/plugins/outbound/load.js +28 -0
  478. package/dist/channels/plugins/outbound/signal.js +36 -0
  479. package/dist/channels/plugins/outbound/slack.js +27 -0
  480. package/dist/channels/plugins/outbound/telegram.js +93 -0
  481. package/dist/channels/plugins/outbound/whatsapp.js +76 -0
  482. package/dist/channels/plugins/pairing-message.js +1 -0
  483. package/dist/channels/plugins/pairing.js +44 -0
  484. package/dist/channels/plugins/setup-helpers.js +89 -0
  485. package/dist/channels/plugins/slack.actions.js +158 -0
  486. package/dist/channels/plugins/status-issues/bluebubbles.js +76 -0
  487. package/dist/channels/plugins/status-issues/discord.js +115 -0
  488. package/dist/channels/plugins/status-issues/shared.js +23 -0
  489. package/dist/channels/plugins/status-issues/telegram.js +100 -0
  490. package/dist/channels/plugins/status-issues/whatsapp.js +52 -0
  491. package/dist/channels/plugins/status.js +26 -0
  492. package/dist/channels/plugins/types.adapters.js +1 -0
  493. package/dist/channels/plugins/types.core.js +1 -0
  494. package/dist/channels/plugins/types.js +1 -0
  495. package/dist/channels/plugins/types.plugin.js +1 -0
  496. package/dist/channels/plugins/whatsapp-heartbeat.js +56 -0
  497. package/dist/channels/registry.js +153 -0
  498. package/dist/channels/reply-prefix.js +21 -0
  499. package/dist/channels/sender-identity.js +30 -0
  500. package/dist/channels/sender-label.js +38 -0
  501. package/dist/channels/session.js +26 -0
  502. package/dist/channels/targets.js +27 -0
  503. package/dist/channels/typing.js +17 -0
  504. package/dist/channels/web/index.js +2 -0
  505. package/dist/cli/acp-cli.js +61 -0
  506. package/dist/cli/argv.js +126 -0
  507. package/dist/cli/banner.js +95 -0
  508. package/dist/cli/browser-cli-actions-input/register.element.js +228 -0
  509. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +148 -0
  510. package/dist/cli/browser-cli-actions-input/register.form-wait-eval.js +121 -0
  511. package/dist/cli/browser-cli-actions-input/register.js +10 -0
  512. package/dist/cli/browser-cli-actions-input/register.navigation.js +72 -0
  513. package/dist/cli/browser-cli-actions-input/shared.js +57 -0
  514. package/dist/cli/browser-cli-actions-input.js +1 -0
  515. package/dist/cli/browser-cli-actions-observe.js +90 -0
  516. package/dist/cli/browser-cli-debug.js +162 -0
  517. package/dist/cli/browser-cli-examples.js +33 -0
  518. package/dist/cli/browser-cli-extension.js +98 -0
  519. package/dist/cli/browser-cli-inspect.js +136 -0
  520. package/dist/cli/browser-cli-manage.js +401 -0
  521. package/dist/cli/browser-cli-shared.js +34 -0
  522. package/dist/cli/browser-cli-state.cookies-storage.js +182 -0
  523. package/dist/cli/browser-cli-state.js +287 -0
  524. package/dist/cli/browser-cli.js +37 -0
  525. package/dist/cli/channel-auth.js +49 -0
  526. package/dist/cli/channel-options.js +29 -0
  527. package/dist/cli/channels-cli.js +208 -0
  528. package/dist/cli/cli-name.js +22 -0
  529. package/dist/cli/cli-utils.js +34 -0
  530. package/dist/cli/command-format.js +18 -0
  531. package/dist/cli/command-options.js +6 -0
  532. package/dist/cli/config-cli.js +295 -0
  533. package/dist/cli/cron-cli/register.cron-add.js +188 -0
  534. package/dist/cli/cron-cli/register.cron-edit.js +160 -0
  535. package/dist/cli/cron-cli/register.cron-simple.js +98 -0
  536. package/dist/cli/cron-cli/register.js +16 -0
  537. package/dist/cli/cron-cli/shared.js +178 -0
  538. package/dist/cli/cron-cli.js +1 -0
  539. package/dist/cli/daemon-cli/install.js +112 -0
  540. package/dist/cli/daemon-cli/lifecycle.js +265 -0
  541. package/dist/cli/daemon-cli/probe.js +28 -0
  542. package/dist/cli/daemon-cli/register.js +69 -0
  543. package/dist/cli/daemon-cli/response.js +20 -0
  544. package/dist/cli/daemon-cli/runners.js +3 -0
  545. package/dist/cli/daemon-cli/shared.js +162 -0
  546. package/dist/cli/daemon-cli/status.gather.js +167 -0
  547. package/dist/cli/daemon-cli/status.js +19 -0
  548. package/dist/cli/daemon-cli/status.print.js +233 -0
  549. package/dist/cli/daemon-cli/types.js +1 -0
  550. package/dist/cli/daemon-cli.js +2 -0
  551. package/dist/cli/deps.js +28 -0
  552. package/dist/cli/devices-cli.js +181 -0
  553. package/dist/cli/directory-cli.js +227 -0
  554. package/dist/cli/dns-cli.js +206 -0
  555. package/dist/cli/docs-cli.js +17 -0
  556. package/dist/cli/exec-approvals-cli.js +378 -0
  557. package/dist/cli/gateway-cli/call.js +25 -0
  558. package/dist/cli/gateway-cli/dev.js +101 -0
  559. package/dist/cli/gateway-cli/discover.js +88 -0
  560. package/dist/cli/gateway-cli/register.js +261 -0
  561. package/dist/cli/gateway-cli/run-loop.js +87 -0
  562. package/dist/cli/gateway-cli/run.js +266 -0
  563. package/dist/cli/gateway-cli/shared.js +101 -0
  564. package/dist/cli/gateway-cli.js +1 -0
  565. package/dist/cli/gateway-rpc.js +27 -0
  566. package/dist/cli/help-format.js +16 -0
  567. package/dist/cli/hooks-cli.js +709 -0
  568. package/dist/cli/logs-cli.js +222 -0
  569. package/dist/cli/memory-cli.js +558 -0
  570. package/dist/cli/models-cli.js +321 -0
  571. package/dist/cli/node-cli/daemon.js +481 -0
  572. package/dist/cli/node-cli/register.js +81 -0
  573. package/dist/cli/node-cli.js +1 -0
  574. package/dist/cli/nodes-camera.js +52 -0
  575. package/dist/cli/nodes-canvas.js +26 -0
  576. package/dist/cli/nodes-cli/a2ui-jsonl.js +81 -0
  577. package/dist/cli/nodes-cli/cli-utils.js +27 -0
  578. package/dist/cli/nodes-cli/format.js +35 -0
  579. package/dist/cli/nodes-cli/register.camera.js +193 -0
  580. package/dist/cli/nodes-cli/register.canvas.js +215 -0
  581. package/dist/cli/nodes-cli/register.invoke.js +303 -0
  582. package/dist/cli/nodes-cli/register.js +24 -0
  583. package/dist/cli/nodes-cli/register.location.js +64 -0
  584. package/dist/cli/nodes-cli/register.notify.js +51 -0
  585. package/dist/cli/nodes-cli/register.pairing.js +99 -0
  586. package/dist/cli/nodes-cli/register.screen.js +66 -0
  587. package/dist/cli/nodes-cli/register.status.js +328 -0
  588. package/dist/cli/nodes-cli/rpc.js +88 -0
  589. package/dist/cli/nodes-cli/types.js +1 -0
  590. package/dist/cli/nodes-cli.js +1 -0
  591. package/dist/cli/nodes-run.js +19 -0
  592. package/dist/cli/nodes-screen.js +35 -0
  593. package/dist/cli/outbound-send-deps.js +11 -0
  594. package/dist/cli/pairing-cli.js +115 -0
  595. package/dist/cli/parse-duration.js +28 -0
  596. package/dist/cli/parse-timeout.js +18 -0
  597. package/dist/cli/plugin-registry.js +24 -0
  598. package/dist/cli/plugins-cli.js +469 -0
  599. package/dist/cli/ports.js +101 -0
  600. package/dist/cli/profile-utils.js +17 -0
  601. package/dist/cli/profile.js +86 -0
  602. package/dist/cli/program/build-program.js +14 -0
  603. package/dist/cli/program/command-registry.js +148 -0
  604. package/dist/cli/program/config-guard.js +67 -0
  605. package/dist/cli/program/context.js +11 -0
  606. package/dist/cli/program/help.js +71 -0
  607. package/dist/cli/program/helpers.js +26 -0
  608. package/dist/cli/program/message/helpers.js +46 -0
  609. package/dist/cli/program/message/register.broadcast.js +11 -0
  610. package/dist/cli/program/message/register.discord-admin.js +119 -0
  611. package/dist/cli/program/message/register.emoji-sticker.js +43 -0
  612. package/dist/cli/program/message/register.permissions-search.js +22 -0
  613. package/dist/cli/program/message/register.pins.js +23 -0
  614. package/dist/cli/program/message/register.poll.js +13 -0
  615. package/dist/cli/program/message/register.reactions.js +21 -0
  616. package/dist/cli/program/message/register.read-edit-delete.js +30 -0
  617. package/dist/cli/program/message/register.send.js +18 -0
  618. package/dist/cli/program/message/register.thread.js +35 -0
  619. package/dist/cli/program/preaction.js +48 -0
  620. package/dist/cli/program/register.agent.js +165 -0
  621. package/dist/cli/program/register.configure.js +32 -0
  622. package/dist/cli/program/register.maintenance.js +91 -0
  623. package/dist/cli/program/register.message.js +54 -0
  624. package/dist/cli/program/register.onboard.js +122 -0
  625. package/dist/cli/program/register.setup.js +41 -0
  626. package/dist/cli/program/register.status-health-sessions.js +109 -0
  627. package/dist/cli/program/register.subclis.js +276 -0
  628. package/dist/cli/program.js +2 -0
  629. package/dist/cli/progress.js +165 -0
  630. package/dist/cli/prompt.js +17 -0
  631. package/dist/cli/route.js +29 -0
  632. package/dist/cli/run-main.js +107 -0
  633. package/dist/cli/sandbox-cli.js +98 -0
  634. package/dist/cli/security-cli.js +123 -0
  635. package/dist/cli/skills-cli.js +341 -0
  636. package/dist/cli/system-cli.js +98 -0
  637. package/dist/cli/tagline.js +210 -0
  638. package/dist/cli/tui-cli.js +44 -0
  639. package/dist/cli/update-cli.js +1016 -0
  640. package/dist/cli/wait.js +8 -0
  641. package/dist/cli/webhooks-cli.js +140 -0
  642. package/dist/commands/agent/delivery.js +140 -0
  643. package/dist/commands/agent/run-context.js +27 -0
  644. package/dist/commands/agent/session-store.js +43 -0
  645. package/dist/commands/agent/session.js +74 -0
  646. package/dist/commands/agent/types.js +1 -0
  647. package/dist/commands/agent-via-gateway.js +119 -0
  648. package/dist/commands/agent.js +439 -0
  649. package/dist/commands/agents.bindings.js +126 -0
  650. package/dist/commands/agents.command-shared.js +18 -0
  651. package/dist/commands/agents.commands.add.js +293 -0
  652. package/dist/commands/agents.commands.delete.js +75 -0
  653. package/dist/commands/agents.commands.identity.js +168 -0
  654. package/dist/commands/agents.commands.list.js +98 -0
  655. package/dist/commands/agents.config.js +145 -0
  656. package/dist/commands/agents.js +6 -0
  657. package/dist/commands/agents.providers.js +140 -0
  658. package/dist/commands/auth-choice-options.js +175 -0
  659. package/dist/commands/auth-choice-prompt.js +36 -0
  660. package/dist/commands/auth-choice.api-key.js +34 -0
  661. package/dist/commands/auth-choice.apply.anthropic.js +77 -0
  662. package/dist/commands/auth-choice.apply.api-providers.js +550 -0
  663. package/dist/commands/auth-choice.apply.copilot-proxy.js +10 -0
  664. package/dist/commands/auth-choice.apply.github-copilot.js +47 -0
  665. package/dist/commands/auth-choice.apply.google-antigravity.js +10 -0
  666. package/dist/commands/auth-choice.apply.google-gemini-cli.js +10 -0
  667. package/dist/commands/auth-choice.apply.js +30 -0
  668. package/dist/commands/auth-choice.apply.minimax.js +72 -0
  669. package/dist/commands/auth-choice.apply.oauth.js +78 -0
  670. package/dist/commands/auth-choice.apply.openai.js +117 -0
  671. package/dist/commands/auth-choice.apply.plugin-provider.js +140 -0
  672. package/dist/commands/auth-choice.apply.qwen-portal.js +10 -0
  673. package/dist/commands/auth-choice.default-model.js +12 -0
  674. package/dist/commands/auth-choice.js +3 -0
  675. package/dist/commands/auth-choice.model-check.js +61 -0
  676. package/dist/commands/auth-choice.preferred-provider.js +33 -0
  677. package/dist/commands/auth-token.js +32 -0
  678. package/dist/commands/channels/add-mutators.js +49 -0
  679. package/dist/commands/channels/add.js +210 -0
  680. package/dist/commands/channels/capabilities.js +439 -0
  681. package/dist/commands/channels/list.js +145 -0
  682. package/dist/commands/channels/logs.js +85 -0
  683. package/dist/commands/channels/remove.js +114 -0
  684. package/dist/commands/channels/resolve.js +107 -0
  685. package/dist/commands/channels/shared.js +41 -0
  686. package/dist/commands/channels/status.js +238 -0
  687. package/dist/commands/channels.js +7 -0
  688. package/dist/commands/chutes-oauth.js +144 -0
  689. package/dist/commands/cleanup-utils.js +74 -0
  690. package/dist/commands/configure.channels.js +52 -0
  691. package/dist/commands/configure.commands.js +8 -0
  692. package/dist/commands/configure.daemon.js +106 -0
  693. package/dist/commands/configure.gateway-auth.js +64 -0
  694. package/dist/commands/configure.gateway.js +159 -0
  695. package/dist/commands/configure.js +4 -0
  696. package/dist/commands/configure.shared.js +49 -0
  697. package/dist/commands/configure.wizard.js +466 -0
  698. package/dist/commands/daemon-install-helpers.js +51 -0
  699. package/dist/commands/daemon-runtime.js +11 -0
  700. package/dist/commands/dashboard.js +47 -0
  701. package/dist/commands/docs.js +148 -0
  702. package/dist/commands/doctor-auth.js +236 -0
  703. package/dist/commands/doctor-config-flow.js +245 -0
  704. package/dist/commands/doctor-format.js +85 -0
  705. package/dist/commands/doctor-gateway-daemon-flow.js +204 -0
  706. package/dist/commands/doctor-gateway-health.js +43 -0
  707. package/dist/commands/doctor-gateway-services.js +216 -0
  708. package/dist/commands/doctor-install.js +27 -0
  709. package/dist/commands/doctor-legacy-config.js +42 -0
  710. package/dist/commands/doctor-platform-notes.js +108 -0
  711. package/dist/commands/doctor-prompter.js +64 -0
  712. package/dist/commands/doctor-sandbox.js +207 -0
  713. package/dist/commands/doctor-security.js +141 -0
  714. package/dist/commands/doctor-state-integrity.js +334 -0
  715. package/dist/commands/doctor-state-migrations.js +1 -0
  716. package/dist/commands/doctor-ui.js +119 -0
  717. package/dist/commands/doctor-update.js +65 -0
  718. package/dist/commands/doctor-workspace-status.js +56 -0
  719. package/dist/commands/doctor-workspace.js +47 -0
  720. package/dist/commands/doctor.js +252 -0
  721. package/dist/commands/gateway-status/helpers.js +200 -0
  722. package/dist/commands/gateway-status.js +306 -0
  723. package/dist/commands/google-gemini-model-default.js +33 -0
  724. package/dist/commands/health-format.js +37 -0
  725. package/dist/commands/health.js +595 -0
  726. package/dist/commands/message-format.js +345 -0
  727. package/dist/commands/message.js +45 -0
  728. package/dist/commands/model-picker.js +420 -0
  729. package/dist/commands/models/aliases.js +92 -0
  730. package/dist/commands/models/auth-order.js +95 -0
  731. package/dist/commands/models/auth.js +334 -0
  732. package/dist/commands/models/fallbacks.js +126 -0
  733. package/dist/commands/models/image-fallbacks.js +126 -0
  734. package/dist/commands/models/list.auth-overview.js +93 -0
  735. package/dist/commands/models/list.configured.js +80 -0
  736. package/dist/commands/models/list.format.js +41 -0
  737. package/dist/commands/models/list.js +2 -0
  738. package/dist/commands/models/list.list-command.js +99 -0
  739. package/dist/commands/models/list.probe.js +348 -0
  740. package/dist/commands/models/list.registry.js +81 -0
  741. package/dist/commands/models/list.status-command.js +420 -0
  742. package/dist/commands/models/list.table.js +58 -0
  743. package/dist/commands/models/list.types.js +1 -0
  744. package/dist/commands/models/scan.js +293 -0
  745. package/dist/commands/models/set-image.js +28 -0
  746. package/dist/commands/models/set.js +28 -0
  747. package/dist/commands/models/shared.js +80 -0
  748. package/dist/commands/models.js +10 -0
  749. package/dist/commands/node-daemon-install-helpers.js +35 -0
  750. package/dist/commands/node-daemon-runtime.js +6 -0
  751. package/dist/commands/oauth-env.js +16 -0
  752. package/dist/commands/oauth-flow.js +33 -0
  753. package/dist/commands/onboard-auth.config-core.js +450 -0
  754. package/dist/commands/onboard-auth.config-minimax.js +176 -0
  755. package/dist/commands/onboard-auth.config-opencode.js +40 -0
  756. package/dist/commands/onboard-auth.credentials.js +159 -0
  757. package/dist/commands/onboard-auth.js +7 -0
  758. package/dist/commands/onboard-auth.models.js +100 -0
  759. package/dist/commands/onboard-channels.js +527 -0
  760. package/dist/commands/onboard-helpers.js +360 -0
  761. package/dist/commands/onboard-hooks.js +59 -0
  762. package/dist/commands/onboard-interactive.js +17 -0
  763. package/dist/commands/onboard-non-interactive/api-keys.js +45 -0
  764. package/dist/commands/onboard-non-interactive/local/auth-choice.js +353 -0
  765. package/dist/commands/onboard-non-interactive/local/daemon-install.js +45 -0
  766. package/dist/commands/onboard-non-interactive/local/gateway-config.js +86 -0
  767. package/dist/commands/onboard-non-interactive/local/output.js +14 -0
  768. package/dist/commands/onboard-non-interactive/local/skills-config.js +21 -0
  769. package/dist/commands/onboard-non-interactive/local/workspace.js +7 -0
  770. package/dist/commands/onboard-non-interactive/local.js +105 -0
  771. package/dist/commands/onboard-non-interactive/remote.js +41 -0
  772. package/dist/commands/onboard-non-interactive.js +25 -0
  773. package/dist/commands/onboard-remote.js +125 -0
  774. package/dist/commands/onboard-skills.js +146 -0
  775. package/dist/commands/onboard-types.js +1 -0
  776. package/dist/commands/onboard.js +62 -0
  777. package/dist/commands/onboarding/__tests__/test-utils.js +20 -0
  778. package/dist/commands/onboarding/plugin-install.js +162 -0
  779. package/dist/commands/onboarding/registry.js +13 -0
  780. package/dist/commands/onboarding/types.js +1 -0
  781. package/dist/commands/openai-codex-model-default.js +44 -0
  782. package/dist/commands/opencode-zen-model-default.js +35 -0
  783. package/dist/commands/reset.js +134 -0
  784. package/dist/commands/sandbox-display.js +82 -0
  785. package/dist/commands/sandbox-explain.js +226 -0
  786. package/dist/commands/sandbox-formatters.js +31 -0
  787. package/dist/commands/sandbox.js +119 -0
  788. package/dist/commands/sessions.js +211 -0
  789. package/dist/commands/setup.js +62 -0
  790. package/dist/commands/signal-install.js +132 -0
  791. package/dist/commands/status-all/agents.js +62 -0
  792. package/dist/commands/status-all/channels.js +354 -0
  793. package/dist/commands/status-all/diagnosis.js +156 -0
  794. package/dist/commands/status-all/format.js +41 -0
  795. package/dist/commands/status-all/gateway.js +158 -0
  796. package/dist/commands/status-all/report-lines.js +135 -0
  797. package/dist/commands/status-all.js +409 -0
  798. package/dist/commands/status.agent-local.js +68 -0
  799. package/dist/commands/status.command.js +476 -0
  800. package/dist/commands/status.daemon.js +30 -0
  801. package/dist/commands/status.format.js +52 -0
  802. package/dist/commands/status.gateway-probe.js +35 -0
  803. package/dist/commands/status.js +2 -0
  804. package/dist/commands/status.link-channel.js +39 -0
  805. package/dist/commands/status.scan.js +140 -0
  806. package/dist/commands/status.summary.js +172 -0
  807. package/dist/commands/status.types.js +1 -0
  808. package/dist/commands/status.update.js +112 -0
  809. package/dist/commands/systemd-linger.js +77 -0
  810. package/dist/commands/uninstall.js +161 -0
  811. package/dist/compat/legacy-names.js +8 -0
  812. package/dist/config/agent-dirs.js +79 -0
  813. package/dist/config/agent-limits.js +16 -0
  814. package/dist/config/cache-utils.js +22 -0
  815. package/dist/config/channel-capabilities.js +42 -0
  816. package/dist/config/commands.js +38 -0
  817. package/dist/config/config-paths.js +75 -0
  818. package/dist/config/config.js +7 -0
  819. package/dist/config/defaults.js +350 -0
  820. package/dist/config/env-substitution.js +117 -0
  821. package/dist/config/env-vars.js +21 -0
  822. package/dist/config/group-policy.js +123 -0
  823. package/dist/config/includes.js +183 -0
  824. package/dist/config/io.js +491 -0
  825. package/dist/config/legacy-migrate.js +13 -0
  826. package/dist/config/legacy.js +34 -0
  827. package/dist/config/legacy.migrations.js +8 -0
  828. package/dist/config/legacy.migrations.part-1.js +308 -0
  829. package/dist/config/legacy.migrations.part-2.js +343 -0
  830. package/dist/config/legacy.migrations.part-3.js +164 -0
  831. package/dist/config/legacy.rules.js +116 -0
  832. package/dist/config/legacy.shared.js +76 -0
  833. package/dist/config/logging.js +10 -0
  834. package/dist/config/markdown-tables.js +36 -0
  835. package/dist/config/merge-config.js +22 -0
  836. package/dist/config/merge-patch.js +22 -0
  837. package/dist/config/normalize-paths.js +54 -0
  838. package/dist/config/paths.js +194 -0
  839. package/dist/config/plugin-auto-enable.js +338 -0
  840. package/dist/config/port-defaults.js +30 -0
  841. package/dist/config/runtime-overrides.js +50 -0
  842. package/dist/config/schema.js +795 -0
  843. package/dist/config/sessions/group.js +83 -0
  844. package/dist/config/sessions/main-session.js +43 -0
  845. package/dist/config/sessions/metadata.js +114 -0
  846. package/dist/config/sessions/paths.js +46 -0
  847. package/dist/config/sessions/reset.js +103 -0
  848. package/dist/config/sessions/session-key.js +34 -0
  849. package/dist/config/sessions/store.js +346 -0
  850. package/dist/config/sessions/transcript.js +113 -0
  851. package/dist/config/sessions/types.js +11 -0
  852. package/dist/config/sessions.js +9 -0
  853. package/dist/config/talk.js +31 -0
  854. package/dist/config/telegram-custom-commands.js +70 -0
  855. package/dist/config/types.agent-defaults.js +1 -0
  856. package/dist/config/types.agents.js +1 -0
  857. package/dist/config/types.approvals.js +1 -0
  858. package/dist/config/types.auth.js +1 -0
  859. package/dist/config/types.base.js +1 -0
  860. package/dist/config/types.browser.js +1 -0
  861. package/dist/config/types.channels.js +1 -0
  862. package/dist/config/types.cron.js +1 -0
  863. package/dist/config/types.discord.js +1 -0
  864. package/dist/config/types.gateway.js +1 -0
  865. package/dist/config/types.googlechat.js +1 -0
  866. package/dist/config/types.hooks.js +1 -0
  867. package/dist/config/types.imessage.js +1 -0
  868. package/dist/config/types.js +29 -0
  869. package/dist/config/types.messages.js +1 -0
  870. package/dist/config/types.models.js +1 -0
  871. package/dist/config/types.msteams.js +1 -0
  872. package/dist/config/types.node-host.js +1 -0
  873. package/dist/config/types.openclaw.js +1 -0
  874. package/dist/config/types.plugins.js +1 -0
  875. package/dist/config/types.queue.js +1 -0
  876. package/dist/config/types.sandbox.js +1 -0
  877. package/dist/config/types.signal.js +1 -0
  878. package/dist/config/types.skills.js +1 -0
  879. package/dist/config/types.slack.js +1 -0
  880. package/dist/config/types.telegram.js +1 -0
  881. package/dist/config/types.tools.js +1 -0
  882. package/dist/config/types.tts.js +1 -0
  883. package/dist/config/types.whatsapp.js +1 -0
  884. package/dist/config/validation.js +297 -0
  885. package/dist/config/version.js +30 -0
  886. package/dist/config/zod-schema.agent-defaults.js +157 -0
  887. package/dist/config/zod-schema.agent-runtime.js +520 -0
  888. package/dist/config/zod-schema.agents.js +46 -0
  889. package/dist/config/zod-schema.approvals.js +25 -0
  890. package/dist/config/zod-schema.channels.js +9 -0
  891. package/dist/config/zod-schema.core.js +452 -0
  892. package/dist/config/zod-schema.hooks.js +124 -0
  893. package/dist/config/zod-schema.js +539 -0
  894. package/dist/config/zod-schema.providers-core.js +703 -0
  895. package/dist/config/zod-schema.providers-whatsapp.js +126 -0
  896. package/dist/config/zod-schema.providers.js +29 -0
  897. package/dist/config/zod-schema.session.js +105 -0
  898. package/dist/control-ui/apple-touch-icon.png +0 -0
  899. package/dist/control-ui/assets/index-BKPyesll.css +1 -0
  900. package/dist/control-ui/assets/index-CNKLKKXX.js +3214 -0
  901. package/dist/control-ui/assets/index-CNKLKKXX.js.map +1 -0
  902. package/dist/control-ui/favicon-32.png +0 -0
  903. package/dist/control-ui/favicon.ico +0 -0
  904. package/dist/control-ui/favicon.svg +22 -0
  905. package/dist/control-ui/index.html +17 -0
  906. package/dist/cron/isolated-agent/delivery-target.js +59 -0
  907. package/dist/cron/isolated-agent/helpers.js +49 -0
  908. package/dist/cron/isolated-agent/run.js +376 -0
  909. package/dist/cron/isolated-agent/session.js +27 -0
  910. package/dist/cron/isolated-agent.js +1 -0
  911. package/dist/cron/normalize.js +111 -0
  912. package/dist/cron/parse.js +24 -0
  913. package/dist/cron/payload-migration.js +29 -0
  914. package/dist/cron/run-log.js +70 -0
  915. package/dist/cron/schedule.js +24 -0
  916. package/dist/cron/service/jobs.js +174 -0
  917. package/dist/cron/service/locked.js +12 -0
  918. package/dist/cron/service/normalize.js +55 -0
  919. package/dist/cron/service/ops.js +118 -0
  920. package/dist/cron/service/state.js +10 -0
  921. package/dist/cron/service/store.js +57 -0
  922. package/dist/cron/service/timer.js +217 -0
  923. package/dist/cron/service.js +35 -0
  924. package/dist/cron/store.js +43 -0
  925. package/dist/cron/types.js +1 -0
  926. package/dist/daemon/constants.js +75 -0
  927. package/dist/daemon/diagnostics.js +38 -0
  928. package/dist/daemon/inspect.js +350 -0
  929. package/dist/daemon/launchd-plist.js +68 -0
  930. package/dist/daemon/launchd.js +316 -0
  931. package/dist/daemon/node-service.js +53 -0
  932. package/dist/daemon/paths.js +35 -0
  933. package/dist/daemon/program-args.js +220 -0
  934. package/dist/daemon/runtime-parse.js +17 -0
  935. package/dist/daemon/runtime-paths.js +109 -0
  936. package/dist/daemon/schtasks.js +303 -0
  937. package/dist/daemon/service-audit.js +270 -0
  938. package/dist/daemon/service-env.js +132 -0
  939. package/dist/daemon/service-runtime.js +1 -0
  940. package/dist/daemon/service.js +90 -0
  941. package/dist/daemon/systemd-hints.js +24 -0
  942. package/dist/daemon/systemd-linger.js +59 -0
  943. package/dist/daemon/systemd-unit.js +108 -0
  944. package/dist/daemon/systemd.js +318 -0
  945. package/dist/discord/accounts.js +52 -0
  946. package/dist/discord/api.js +93 -0
  947. package/dist/discord/audit.js +94 -0
  948. package/dist/discord/chunk.js +200 -0
  949. package/dist/discord/directory-live.js +76 -0
  950. package/dist/discord/gateway-logging.js +48 -0
  951. package/dist/discord/index.js +2 -0
  952. package/dist/discord/monitor/allow-list.js +230 -0
  953. package/dist/discord/monitor/exec-approvals.js +406 -0
  954. package/dist/discord/monitor/format.js +27 -0
  955. package/dist/discord/monitor/listeners.js +240 -0
  956. package/dist/discord/monitor/message-handler.js +101 -0
  957. package/dist/discord/monitor/message-handler.preflight.js +438 -0
  958. package/dist/discord/monitor/message-handler.preflight.types.js +1 -0
  959. package/dist/discord/monitor/message-handler.process.js +344 -0
  960. package/dist/discord/monitor/message-utils.js +189 -0
  961. package/dist/discord/monitor/native-command.js +707 -0
  962. package/dist/discord/monitor/presence-cache.js +38 -0
  963. package/dist/discord/monitor/provider.js +551 -0
  964. package/dist/discord/monitor/reply-context.js +29 -0
  965. package/dist/discord/monitor/reply-delivery.js +57 -0
  966. package/dist/discord/monitor/system-events.js +53 -0
  967. package/dist/discord/monitor/threading.js +201 -0
  968. package/dist/discord/monitor/typing.js +8 -0
  969. package/dist/discord/monitor.gateway.js +54 -0
  970. package/dist/discord/monitor.js +7 -0
  971. package/dist/discord/probe.js +124 -0
  972. package/dist/discord/resolve-channels.js +239 -0
  973. package/dist/discord/resolve-users.js +114 -0
  974. package/dist/discord/send.channels.js +74 -0
  975. package/dist/discord/send.emojis-stickers.js +48 -0
  976. package/dist/discord/send.guild.js +79 -0
  977. package/dist/discord/send.js +7 -0
  978. package/dist/discord/send.messages.js +91 -0
  979. package/dist/discord/send.outbound.js +87 -0
  980. package/dist/discord/send.permissions.js +116 -0
  981. package/dist/discord/send.reactions.js +71 -0
  982. package/dist/discord/send.shared.js +280 -0
  983. package/dist/discord/send.types.js +16 -0
  984. package/dist/discord/targets.js +122 -0
  985. package/dist/discord/token.js +29 -0
  986. package/dist/entry.js +128 -0
  987. package/dist/gateway/assistant-identity.js +64 -0
  988. package/dist/gateway/auth.js +197 -0
  989. package/dist/gateway/boot.js +72 -0
  990. package/dist/gateway/call.js +184 -0
  991. package/dist/gateway/chat-abort.js +55 -0
  992. package/dist/gateway/chat-attachments.js +133 -0
  993. package/dist/gateway/chat-sanitize.js +103 -0
  994. package/dist/gateway/client.js +339 -0
  995. package/dist/gateway/config-reload.js +295 -0
  996. package/dist/gateway/control-ui-shared.js +48 -0
  997. package/dist/gateway/control-ui.js +258 -0
  998. package/dist/gateway/device-auth.js +19 -0
  999. package/dist/gateway/exec-approval-manager.js +40 -0
  1000. package/dist/gateway/hooks-mapping.js +287 -0
  1001. package/dist/gateway/hooks.js +169 -0
  1002. package/dist/gateway/http-common.js +43 -0
  1003. package/dist/gateway/http-utils.js +51 -0
  1004. package/dist/gateway/live-image-probe.js +156 -0
  1005. package/dist/gateway/net.js +176 -0
  1006. package/dist/gateway/node-command-policy.js +106 -0
  1007. package/dist/gateway/node-registry.js +142 -0
  1008. package/dist/gateway/open-responses.schema.js +285 -0
  1009. package/dist/gateway/openai-http.js +327 -0
  1010. package/dist/gateway/openresponses-http.js +693 -0
  1011. package/dist/gateway/probe.js +87 -0
  1012. package/dist/gateway/protocol/client-info.js +46 -0
  1013. package/dist/gateway/protocol/index.js +109 -0
  1014. package/dist/gateway/protocol/schema/agent.js +73 -0
  1015. package/dist/gateway/protocol/schema/agents-models-skills.js +47 -0
  1016. package/dist/gateway/protocol/schema/channels.js +74 -0
  1017. package/dist/gateway/protocol/schema/config.js +44 -0
  1018. package/dist/gateway/protocol/schema/cron.js +159 -0
  1019. package/dist/gateway/protocol/schema/devices.js +36 -0
  1020. package/dist/gateway/protocol/schema/error-codes.js +14 -0
  1021. package/dist/gateway/protocol/schema/exec-approvals.js +66 -0
  1022. package/dist/gateway/protocol/schema/frames.js +101 -0
  1023. package/dist/gateway/protocol/schema/logs-chat.js +53 -0
  1024. package/dist/gateway/protocol/schema/nodes.js +54 -0
  1025. package/dist/gateway/protocol/schema/primitives.js +10 -0
  1026. package/dist/gateway/protocol/schema/protocol-schemas.js +117 -0
  1027. package/dist/gateway/protocol/schema/sessions.js +69 -0
  1028. package/dist/gateway/protocol/schema/snapshot.js +40 -0
  1029. package/dist/gateway/protocol/schema/types.js +1 -0
  1030. package/dist/gateway/protocol/schema/wizard.js +76 -0
  1031. package/dist/gateway/protocol/schema.js +16 -0
  1032. package/dist/gateway/server/__tests__/test-utils.js +24 -0
  1033. package/dist/gateway/server/close-reason.js +10 -0
  1034. package/dist/gateway/server/health-state.js +69 -0
  1035. package/dist/gateway/server/hooks.js +85 -0
  1036. package/dist/gateway/server/http-listen.js +26 -0
  1037. package/dist/gateway/server/plugins-http.js +45 -0
  1038. package/dist/gateway/server/tls.js +4 -0
  1039. package/dist/gateway/server/ws-connection/message-handler.js +771 -0
  1040. package/dist/gateway/server/ws-connection.js +191 -0
  1041. package/dist/gateway/server/ws-types.js +1 -0
  1042. package/dist/gateway/server-broadcast.js +73 -0
  1043. package/dist/gateway/server-browser.js +22 -0
  1044. package/dist/gateway/server-channels.js +242 -0
  1045. package/dist/gateway/server-chat.js +221 -0
  1046. package/dist/gateway/server-close.js +99 -0
  1047. package/dist/gateway/server-constants.js +29 -0
  1048. package/dist/gateway/server-cron.js +84 -0
  1049. package/dist/gateway/server-discovery-runtime.js +77 -0
  1050. package/dist/gateway/server-discovery.js +62 -0
  1051. package/dist/gateway/server-http.js +224 -0
  1052. package/dist/gateway/server-lanes.js +7 -0
  1053. package/dist/gateway/server-maintenance.js +68 -0
  1054. package/dist/gateway/server-methods/agent-job.js +104 -0
  1055. package/dist/gateway/server-methods/agent.js +360 -0
  1056. package/dist/gateway/server-methods/agents.js +14 -0
  1057. package/dist/gateway/server-methods/browser.js +204 -0
  1058. package/dist/gateway/server-methods/channels.js +218 -0
  1059. package/dist/gateway/server-methods/chat.js +520 -0
  1060. package/dist/gateway/server-methods/config.js +269 -0
  1061. package/dist/gateway/server-methods/connect.js +6 -0
  1062. package/dist/gateway/server-methods/cron.js +109 -0
  1063. package/dist/gateway/server-methods/devices.js +95 -0
  1064. package/dist/gateway/server-methods/exec-approval.js +78 -0
  1065. package/dist/gateway/server-methods/exec-approvals.js +141 -0
  1066. package/dist/gateway/server-methods/health.js +29 -0
  1067. package/dist/gateway/server-methods/logs.js +143 -0
  1068. package/dist/gateway/server-methods/models.js +16 -0
  1069. package/dist/gateway/server-methods/nodes.helpers.js +32 -0
  1070. package/dist/gateway/server-methods/nodes.js +426 -0
  1071. package/dist/gateway/server-methods/send.js +280 -0
  1072. package/dist/gateway/server-methods/sessions.js +322 -0
  1073. package/dist/gateway/server-methods/skills.js +137 -0
  1074. package/dist/gateway/server-methods/system.js +122 -0
  1075. package/dist/gateway/server-methods/talk.js +20 -0
  1076. package/dist/gateway/server-methods/tts.js +132 -0
  1077. package/dist/gateway/server-methods/types.js +1 -0
  1078. package/dist/gateway/server-methods/update.js +96 -0
  1079. package/dist/gateway/server-methods/usage.js +63 -0
  1080. package/dist/gateway/server-methods/voicewake.js +30 -0
  1081. package/dist/gateway/server-methods/web.js +73 -0
  1082. package/dist/gateway/server-methods/wizard.js +100 -0
  1083. package/dist/gateway/server-methods-list.js +108 -0
  1084. package/dist/gateway/server-methods.js +195 -0
  1085. package/dist/gateway/server-mobile-nodes.js +10 -0
  1086. package/dist/gateway/server-model-catalog.js +11 -0
  1087. package/dist/gateway/server-node-events-types.js +1 -0
  1088. package/dist/gateway/server-node-events.js +206 -0
  1089. package/dist/gateway/server-node-subscriptions.js +93 -0
  1090. package/dist/gateway/server-plugins.js +36 -0
  1091. package/dist/gateway/server-reload-handlers.js +112 -0
  1092. package/dist/gateway/server-restart-sentinel.js +84 -0
  1093. package/dist/gateway/server-runtime-config.js +66 -0
  1094. package/dist/gateway/server-runtime-state.js +113 -0
  1095. package/dist/gateway/server-session-key.js +20 -0
  1096. package/dist/gateway/server-shared.js +1 -0
  1097. package/dist/gateway/server-startup-log.js +27 -0
  1098. package/dist/gateway/server-startup.js +119 -0
  1099. package/dist/gateway/server-tailscale.js +41 -0
  1100. package/dist/gateway/server-utils.js +35 -0
  1101. package/dist/gateway/server-wizard-sessions.js +19 -0
  1102. package/dist/gateway/server-ws-runtime.js +20 -0
  1103. package/dist/gateway/server.impl.js +437 -0
  1104. package/dist/gateway/server.js +2 -0
  1105. package/dist/gateway/session-utils.fs.js +344 -0
  1106. package/dist/gateway/session-utils.js +534 -0
  1107. package/dist/gateway/session-utils.types.js +1 -0
  1108. package/dist/gateway/sessions-patch.js +298 -0
  1109. package/dist/gateway/sessions-resolve.js +103 -0
  1110. package/dist/gateway/test-helpers.e2e.js +101 -0
  1111. package/dist/gateway/test-helpers.mocks.js +504 -0
  1112. package/dist/gateway/test-helpers.openai-mock.js +163 -0
  1113. package/dist/gateway/test-helpers.server.js +369 -0
  1114. package/dist/gateway/tools-invoke-http.js +221 -0
  1115. package/dist/gateway/ws-log.js +336 -0
  1116. package/dist/gateway/ws-logging.js +8 -0
  1117. package/dist/globals.js +41 -0
  1118. package/dist/hooks/bundled/boot-md/HOOK.md +19 -0
  1119. package/dist/hooks/bundled/boot-md/handler.js +14 -0
  1120. package/dist/hooks/bundled/command-logger/HOOK.md +122 -0
  1121. package/dist/hooks/bundled/command-logger/handler.js +56 -0
  1122. package/dist/hooks/bundled/session-memory/HOOK.md +109 -0
  1123. package/dist/hooks/bundled/session-memory/handler.js +147 -0
  1124. package/dist/hooks/bundled/soul-evil/HOOK.md +71 -0
  1125. package/dist/hooks/bundled/soul-evil/handler.js +36 -0
  1126. package/dist/hooks/bundled-dir.js +42 -0
  1127. package/dist/hooks/config.js +123 -0
  1128. package/dist/hooks/frontmatter.js +114 -0
  1129. package/dist/hooks/gmail-ops.js +243 -0
  1130. package/dist/hooks/gmail-setup-utils.js +310 -0
  1131. package/dist/hooks/gmail-watcher.js +191 -0
  1132. package/dist/hooks/gmail.js +179 -0
  1133. package/dist/hooks/hooks-status.js +135 -0
  1134. package/dist/hooks/hooks.js +2 -0
  1135. package/dist/hooks/install.js +328 -0
  1136. package/dist/hooks/installs.js +24 -0
  1137. package/dist/hooks/internal-hooks.js +121 -0
  1138. package/dist/hooks/llm-slug-generator.js +70 -0
  1139. package/dist/hooks/loader.js +110 -0
  1140. package/dist/hooks/plugin-hooks.js +91 -0
  1141. package/dist/hooks/soul-evil.js +186 -0
  1142. package/dist/hooks/types.js +1 -0
  1143. package/dist/hooks/workspace.js +207 -0
  1144. package/dist/imessage/accounts.js +61 -0
  1145. package/dist/imessage/client.js +174 -0
  1146. package/dist/imessage/index.js +3 -0
  1147. package/dist/imessage/monitor/deliver.js +45 -0
  1148. package/dist/imessage/monitor/monitor-provider.js +592 -0
  1149. package/dist/imessage/monitor/runtime.js +12 -0
  1150. package/dist/imessage/monitor/types.js +1 -0
  1151. package/dist/imessage/monitor.js +1 -0
  1152. package/dist/imessage/probe.js +68 -0
  1153. package/dist/imessage/send.js +101 -0
  1154. package/dist/imessage/targets.js +172 -0
  1155. package/dist/index.js +49 -0
  1156. package/dist/infra/agent-events.js +57 -0
  1157. package/dist/infra/archive.js +97 -0
  1158. package/dist/infra/backoff.js +19 -0
  1159. package/dist/infra/binaries.js +9 -0
  1160. package/dist/infra/bonjour-ciao.js +10 -0
  1161. package/dist/infra/bonjour-discovery.js +449 -0
  1162. package/dist/infra/bonjour-errors.js +7 -0
  1163. package/dist/infra/bonjour.js +210 -0
  1164. package/dist/infra/brew.js +55 -0
  1165. package/dist/infra/canvas-host-url.js +52 -0
  1166. package/dist/infra/channel-activity.js +32 -0
  1167. package/dist/infra/channel-summary.js +183 -0
  1168. package/dist/infra/channels-status-issues.js +15 -0
  1169. package/dist/infra/clipboard.js +24 -0
  1170. package/dist/infra/control-ui-assets.js +98 -0
  1171. package/dist/infra/dedupe.js +47 -0
  1172. package/dist/infra/device-auth-store.js +97 -0
  1173. package/dist/infra/device-identity.js +149 -0
  1174. package/dist/infra/device-pairing.js +401 -0
  1175. package/dist/infra/diagnostic-events.js +28 -0
  1176. package/dist/infra/diagnostic-flags.js +66 -0
  1177. package/dist/infra/dotenv.js +15 -0
  1178. package/dist/infra/env-file.js +43 -0
  1179. package/dist/infra/env.js +34 -0
  1180. package/dist/infra/errors.js +35 -0
  1181. package/dist/infra/exec-approval-forwarder.js +212 -0
  1182. package/dist/infra/exec-approvals.js +1040 -0
  1183. package/dist/infra/exec-host.js +75 -0
  1184. package/dist/infra/exec-safety.js +31 -0
  1185. package/dist/infra/fetch.js +58 -0
  1186. package/dist/infra/format-duration.js +20 -0
  1187. package/dist/infra/fs-safe.js +76 -0
  1188. package/dist/infra/gateway-lock.js +203 -0
  1189. package/dist/infra/git-commit.js +106 -0
  1190. package/dist/infra/heartbeat-events.js +34 -0
  1191. package/dist/infra/heartbeat-runner.js +743 -0
  1192. package/dist/infra/heartbeat-visibility.js +45 -0
  1193. package/dist/infra/heartbeat-wake.js +61 -0
  1194. package/dist/infra/is-main.js +33 -0
  1195. package/dist/infra/json-file.js +21 -0
  1196. package/dist/infra/machine-name.js +43 -0
  1197. package/dist/infra/net/ssrf.js +199 -0
  1198. package/dist/infra/node-pairing.js +228 -0
  1199. package/dist/infra/node-shell.js +9 -0
  1200. package/dist/infra/openclaw-root.js +57 -0
  1201. package/dist/infra/os-summary.js +23 -0
  1202. package/dist/infra/outbound/agent-delivery.js +86 -0
  1203. package/dist/infra/outbound/channel-adapters.js +16 -0
  1204. package/dist/infra/outbound/channel-selection.js +62 -0
  1205. package/dist/infra/outbound/channel-target.js +28 -0
  1206. package/dist/infra/outbound/deliver.js +253 -0
  1207. package/dist/infra/outbound/directory-cache.js +44 -0
  1208. package/dist/infra/outbound/envelope.js +20 -0
  1209. package/dist/infra/outbound/format.js +66 -0
  1210. package/dist/infra/outbound/message-action-runner.js +766 -0
  1211. package/dist/infra/outbound/message-action-spec.js +83 -0
  1212. package/dist/infra/outbound/message.js +189 -0
  1213. package/dist/infra/outbound/outbound-policy.js +122 -0
  1214. package/dist/infra/outbound/outbound-send-service.js +123 -0
  1215. package/dist/infra/outbound/outbound-session.js +762 -0
  1216. package/dist/infra/outbound/payloads.js +78 -0
  1217. package/dist/infra/outbound/target-errors.js +23 -0
  1218. package/dist/infra/outbound/target-normalization.js +27 -0
  1219. package/dist/infra/outbound/target-resolver.js +348 -0
  1220. package/dist/infra/outbound/targets.js +213 -0
  1221. package/dist/infra/path-env.js +94 -0
  1222. package/dist/infra/ports-format.js +54 -0
  1223. package/dist/infra/ports-inspect.js +240 -0
  1224. package/dist/infra/ports-lsof.js +33 -0
  1225. package/dist/infra/ports-types.js +1 -0
  1226. package/dist/infra/ports.js +75 -0
  1227. package/dist/infra/provider-usage.auth.js +221 -0
  1228. package/dist/infra/provider-usage.fetch.antigravity.js +212 -0
  1229. package/dist/infra/provider-usage.fetch.claude.js +129 -0
  1230. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  1231. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  1232. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  1233. package/dist/infra/provider-usage.fetch.js +7 -0
  1234. package/dist/infra/provider-usage.fetch.minimax.js +332 -0
  1235. package/dist/infra/provider-usage.fetch.shared.js +10 -0
  1236. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  1237. package/dist/infra/provider-usage.format.js +96 -0
  1238. package/dist/infra/provider-usage.js +3 -0
  1239. package/dist/infra/provider-usage.load.js +65 -0
  1240. package/dist/infra/provider-usage.shared.js +53 -0
  1241. package/dist/infra/provider-usage.types.js +1 -0
  1242. package/dist/infra/restart-sentinel.js +65 -0
  1243. package/dist/infra/restart.js +171 -0
  1244. package/dist/infra/retry-policy.js +71 -0
  1245. package/dist/infra/retry.js +85 -0
  1246. package/dist/infra/runtime-guard.js +60 -0
  1247. package/dist/infra/session-cost-usage.js +190 -0
  1248. package/dist/infra/shell-env.js +125 -0
  1249. package/dist/infra/skills-remote.js +282 -0
  1250. package/dist/infra/ssh-config.js +84 -0
  1251. package/dist/infra/ssh-tunnel.js +173 -0
  1252. package/dist/infra/state-migrations.fs.js +49 -0
  1253. package/dist/infra/state-migrations.js +657 -0
  1254. package/dist/infra/system-events.js +75 -0
  1255. package/dist/infra/system-presence.js +231 -0
  1256. package/dist/infra/tailnet.js +46 -0
  1257. package/dist/infra/tailscale.js +368 -0
  1258. package/dist/infra/tls/fingerprint.js +5 -0
  1259. package/dist/infra/tls/gateway.js +119 -0
  1260. package/dist/infra/transport-ready.js +38 -0
  1261. package/dist/infra/unhandled-rejections.js +139 -0
  1262. package/dist/infra/update-channels.js +57 -0
  1263. package/dist/infra/update-check.js +293 -0
  1264. package/dist/infra/update-global.js +95 -0
  1265. package/dist/infra/update-runner.js +577 -0
  1266. package/dist/infra/update-startup.js +86 -0
  1267. package/dist/infra/voicewake.js +74 -0
  1268. package/dist/infra/warnings.js +25 -0
  1269. package/dist/infra/widearea-dns.js +148 -0
  1270. package/dist/infra/ws.js +13 -0
  1271. package/dist/infra/wsl.js +25 -0
  1272. package/dist/line/accounts.js +130 -0
  1273. package/dist/line/auto-reply-delivery.js +102 -0
  1274. package/dist/line/bot-access.js +38 -0
  1275. package/dist/line/bot-handlers.js +258 -0
  1276. package/dist/line/bot-message-context.js +374 -0
  1277. package/dist/line/bot.js +48 -0
  1278. package/dist/line/config-schema.js +47 -0
  1279. package/dist/line/download.js +95 -0
  1280. package/dist/line/flex-templates.js +1264 -0
  1281. package/dist/line/http-registry.js +27 -0
  1282. package/dist/line/index.js +19 -0
  1283. package/dist/line/markdown-to-line.js +346 -0
  1284. package/dist/line/monitor.js +266 -0
  1285. package/dist/line/probe.js +37 -0
  1286. package/dist/line/reply-chunks.js +53 -0
  1287. package/dist/line/rich-menu.js +320 -0
  1288. package/dist/line/send.js +451 -0
  1289. package/dist/line/signature.js +11 -0
  1290. package/dist/line/template-messages.js +258 -0
  1291. package/dist/line/types.js +1 -0
  1292. package/dist/line/webhook.js +71 -0
  1293. package/dist/link-understanding/apply.js +22 -0
  1294. package/dist/link-understanding/defaults.js +2 -0
  1295. package/dist/link-understanding/detect.js +49 -0
  1296. package/dist/link-understanding/format.js +10 -0
  1297. package/dist/link-understanding/index.js +4 -0
  1298. package/dist/link-understanding/runner.js +99 -0
  1299. package/dist/logger.js +53 -0
  1300. package/dist/logging/config.js +19 -0
  1301. package/dist/logging/console.js +237 -0
  1302. package/dist/logging/diagnostic.js +236 -0
  1303. package/dist/logging/levels.js +26 -0
  1304. package/dist/logging/logger.js +185 -0
  1305. package/dist/logging/parse-log-line.js +52 -0
  1306. package/dist/logging/redact.js +115 -0
  1307. package/dist/logging/state.js +12 -0
  1308. package/dist/logging/subsystem.js +234 -0
  1309. package/dist/logging.js +5 -0
  1310. package/dist/macos/gateway-daemon.js +181 -0
  1311. package/dist/macos/relay-smoke.js +29 -0
  1312. package/dist/macos/relay.js +60 -0
  1313. package/dist/markdown/code-spans.js +67 -0
  1314. package/dist/markdown/fences.js +57 -0
  1315. package/dist/markdown/frontmatter.js +124 -0
  1316. package/dist/markdown/ir.js +687 -0
  1317. package/dist/markdown/render.js +130 -0
  1318. package/dist/markdown/tables.js +35 -0
  1319. package/dist/media/audio-tags.js +14 -0
  1320. package/dist/media/audio.js +15 -0
  1321. package/dist/media/constants.js +33 -0
  1322. package/dist/media/fetch.js +151 -0
  1323. package/dist/media/host.js +43 -0
  1324. package/dist/media/image-ops.js +385 -0
  1325. package/dist/media/input-files.js +276 -0
  1326. package/dist/media/mime.js +150 -0
  1327. package/dist/media/parse.js +175 -0
  1328. package/dist/media/server.js +88 -0
  1329. package/dist/media/store.js +200 -0
  1330. package/dist/media-understanding/apply.js +355 -0
  1331. package/dist/media-understanding/attachments.js +320 -0
  1332. package/dist/media-understanding/concurrency.js +26 -0
  1333. package/dist/media-understanding/defaults.js +30 -0
  1334. package/dist/media-understanding/errors.js +11 -0
  1335. package/dist/media-understanding/format.js +56 -0
  1336. package/dist/media-understanding/index.js +3 -0
  1337. package/dist/media-understanding/providers/anthropic/index.js +6 -0
  1338. package/dist/media-understanding/providers/deepgram/audio.js +47 -0
  1339. package/dist/media-understanding/providers/deepgram/index.js +6 -0
  1340. package/dist/media-understanding/providers/google/audio.js +64 -0
  1341. package/dist/media-understanding/providers/google/index.js +10 -0
  1342. package/dist/media-understanding/providers/google/video.js +64 -0
  1343. package/dist/media-understanding/providers/groq/index.js +10 -0
  1344. package/dist/media-understanding/providers/image.js +59 -0
  1345. package/dist/media-understanding/providers/index.js +45 -0
  1346. package/dist/media-understanding/providers/minimax/index.js +6 -0
  1347. package/dist/media-understanding/providers/openai/audio.js +46 -0
  1348. package/dist/media-understanding/providers/openai/index.js +8 -0
  1349. package/dist/media-understanding/providers/shared.js +29 -0
  1350. package/dist/media-understanding/resolve.js +113 -0
  1351. package/dist/media-understanding/runner.js +1008 -0
  1352. package/dist/media-understanding/scope.js +41 -0
  1353. package/dist/media-understanding/types.js +1 -0
  1354. package/dist/media-understanding/video.js +8 -0
  1355. package/dist/memory/batch-gemini.js +320 -0
  1356. package/dist/memory/batch-openai.js +290 -0
  1357. package/dist/memory/embeddings-gemini.js +129 -0
  1358. package/dist/memory/embeddings-openai.js +65 -0
  1359. package/dist/memory/embeddings.js +170 -0
  1360. package/dist/memory/headers-fingerprint.js +16 -0
  1361. package/dist/memory/hybrid.js +61 -0
  1362. package/dist/memory/index.js +1 -0
  1363. package/dist/memory/internal.js +222 -0
  1364. package/dist/memory/manager-cache-key.js +46 -0
  1365. package/dist/memory/manager-search.js +95 -0
  1366. package/dist/memory/manager.js +1867 -0
  1367. package/dist/memory/memory-schema.js +76 -0
  1368. package/dist/memory/node-llama.js +3 -0
  1369. package/dist/memory/openai-batch.js +2 -0
  1370. package/dist/memory/provider-key.js +23 -0
  1371. package/dist/memory/search-manager.js +11 -0
  1372. package/dist/memory/session-files.js +98 -0
  1373. package/dist/memory/sqlite-vec.js +19 -0
  1374. package/dist/memory/sqlite.js +7 -0
  1375. package/dist/memory/status-format.js +23 -0
  1376. package/dist/memory/sync-memory-files.js +69 -0
  1377. package/dist/memory/sync-session-files.js +95 -0
  1378. package/dist/node-host/config.js +53 -0
  1379. package/dist/node-host/runner.js +955 -0
  1380. package/dist/pairing/pairing-labels.js +4 -0
  1381. package/dist/pairing/pairing-messages.js +14 -0
  1382. package/dist/pairing/pairing-store.js +357 -0
  1383. package/dist/plugin-sdk/index.js +85 -0
  1384. package/dist/plugins/bundled-dir.js +35 -0
  1385. package/dist/plugins/cli.js +49 -0
  1386. package/dist/plugins/commands.js +228 -0
  1387. package/dist/plugins/config-schema.js +23 -0
  1388. package/dist/plugins/config-state.js +161 -0
  1389. package/dist/plugins/discovery.js +276 -0
  1390. package/dist/plugins/enable.js +36 -0
  1391. package/dist/plugins/hook-runner-global.js +57 -0
  1392. package/dist/plugins/hooks.js +283 -0
  1393. package/dist/plugins/http-path.js +10 -0
  1394. package/dist/plugins/http-registry.js +31 -0
  1395. package/dist/plugins/install.js +324 -0
  1396. package/dist/plugins/installs.js +21 -0
  1397. package/dist/plugins/loader.js +368 -0
  1398. package/dist/plugins/manifest-registry.js +136 -0
  1399. package/dist/plugins/manifest.js +81 -0
  1400. package/dist/plugins/providers.js +16 -0
  1401. package/dist/plugins/registry.js +312 -0
  1402. package/dist/plugins/runtime/index.js +290 -0
  1403. package/dist/plugins/runtime/native-deps.js +16 -0
  1404. package/dist/plugins/runtime/types.js +1 -0
  1405. package/dist/plugins/runtime.js +42 -0
  1406. package/dist/plugins/schema-validator.js +28 -0
  1407. package/dist/plugins/services.js +55 -0
  1408. package/dist/plugins/slots.js +68 -0
  1409. package/dist/plugins/status.js +27 -0
  1410. package/dist/plugins/tools.js +98 -0
  1411. package/dist/plugins/types.js +1 -0
  1412. package/dist/plugins/update.js +324 -0
  1413. package/dist/polls.js +41 -0
  1414. package/dist/process/child-process-bridge.js +34 -0
  1415. package/dist/process/command-queue.js +104 -0
  1416. package/dist/process/exec.js +98 -0
  1417. package/dist/process/lanes.js +1 -0
  1418. package/dist/process/spawn-utils.js +95 -0
  1419. package/dist/providers/github-copilot-auth.js +124 -0
  1420. package/dist/providers/github-copilot-models.js +35 -0
  1421. package/dist/providers/github-copilot-token.js +95 -0
  1422. package/dist/providers/qwen-portal-oauth.js +38 -0
  1423. package/dist/routing/bindings.js +87 -0
  1424. package/dist/routing/resolve-route.js +142 -0
  1425. package/dist/routing/session-key.js +174 -0
  1426. package/dist/runtime.js +15 -0
  1427. package/dist/security/audit-extra.js +833 -0
  1428. package/dist/security/audit-fs.js +133 -0
  1429. package/dist/security/audit.js +759 -0
  1430. package/dist/security/external-content.js +143 -0
  1431. package/dist/security/fix.js +402 -0
  1432. package/dist/security/windows-acl.js +162 -0
  1433. package/dist/sessions/level-overrides.js +24 -0
  1434. package/dist/sessions/model-overrides.js +57 -0
  1435. package/dist/sessions/send-policy.js +69 -0
  1436. package/dist/sessions/session-key-utils.js +51 -0
  1437. package/dist/sessions/session-label.js +16 -0
  1438. package/dist/sessions/transcript-events.js +16 -0
  1439. package/dist/shared/text/reasoning-tags.js +89 -0
  1440. package/dist/signal/accounts.js +59 -0
  1441. package/dist/signal/client.js +141 -0
  1442. package/dist/signal/daemon.js +69 -0
  1443. package/dist/signal/format.js +165 -0
  1444. package/dist/signal/identity.js +95 -0
  1445. package/dist/signal/index.js +5 -0
  1446. package/dist/signal/monitor/event-handler.js +492 -0
  1447. package/dist/signal/monitor/event-handler.types.js +1 -0
  1448. package/dist/signal/monitor.js +269 -0
  1449. package/dist/signal/probe.js +46 -0
  1450. package/dist/signal/reaction-level.js +53 -0
  1451. package/dist/signal/send-reactions.js +155 -0
  1452. package/dist/signal/send.js +192 -0
  1453. package/dist/signal/sse-reconnect.js +56 -0
  1454. package/dist/slack/accounts.js +84 -0
  1455. package/dist/slack/actions.js +156 -0
  1456. package/dist/slack/channel-migration.js +53 -0
  1457. package/dist/slack/client.js +17 -0
  1458. package/dist/slack/directory-live.js +122 -0
  1459. package/dist/slack/format.js +111 -0
  1460. package/dist/slack/http/index.js +1 -0
  1461. package/dist/slack/http/registry.js +27 -0
  1462. package/dist/slack/index.js +6 -0
  1463. package/dist/slack/monitor/allow-list.js +58 -0
  1464. package/dist/slack/monitor/auth.js +17 -0
  1465. package/dist/slack/monitor/channel-config.js +79 -0
  1466. package/dist/slack/monitor/commands.js +18 -0
  1467. package/dist/slack/monitor/context.js +242 -0
  1468. package/dist/slack/monitor/events/channels.js +116 -0
  1469. package/dist/slack/monitor/events/members.js +74 -0
  1470. package/dist/slack/monitor/events/messages.js +111 -0
  1471. package/dist/slack/monitor/events/pins.js +76 -0
  1472. package/dist/slack/monitor/events/reactions.js +54 -0
  1473. package/dist/slack/monitor/events.js +15 -0
  1474. package/dist/slack/monitor/media.js +93 -0
  1475. package/dist/slack/monitor/message-handler/dispatch.js +170 -0
  1476. package/dist/slack/monitor/message-handler/prepare.js +477 -0
  1477. package/dist/slack/monitor/message-handler/types.js +1 -0
  1478. package/dist/slack/monitor/message-handler.js +87 -0
  1479. package/dist/slack/monitor/policy.js +10 -0
  1480. package/dist/slack/monitor/provider.js +324 -0
  1481. package/dist/slack/monitor/replies.js +107 -0
  1482. package/dist/slack/monitor/slash.js +507 -0
  1483. package/dist/slack/monitor/thread-resolution.js +102 -0
  1484. package/dist/slack/monitor/types.js +1 -0
  1485. package/dist/slack/monitor.js +4 -0
  1486. package/dist/slack/monitor.test-helpers.js +119 -0
  1487. package/dist/slack/probe.js +47 -0
  1488. package/dist/slack/resolve-channels.js +88 -0
  1489. package/dist/slack/resolve-users.js +133 -0
  1490. package/dist/slack/scopes.js +87 -0
  1491. package/dist/slack/send.js +132 -0
  1492. package/dist/slack/targets.js +48 -0
  1493. package/dist/slack/threading-tool-context.js +18 -0
  1494. package/dist/slack/threading.js +26 -0
  1495. package/dist/slack/token.js +10 -0
  1496. package/dist/slack/types.js +1 -0
  1497. package/dist/telegram/accounts.js +98 -0
  1498. package/dist/telegram/allowed-updates.js +8 -0
  1499. package/dist/telegram/api-logging.js +24 -0
  1500. package/dist/telegram/audit.js +116 -0
  1501. package/dist/telegram/bot/delivery.js +447 -0
  1502. package/dist/telegram/bot/helpers.js +324 -0
  1503. package/dist/telegram/bot/types.js +1 -0
  1504. package/dist/telegram/bot-access.js +59 -0
  1505. package/dist/telegram/bot-handlers.js +578 -0
  1506. package/dist/telegram/bot-message-context.js +500 -0
  1507. package/dist/telegram/bot-message-dispatch.js +282 -0
  1508. package/dist/telegram/bot-message.js +41 -0
  1509. package/dist/telegram/bot-native-commands.js +475 -0
  1510. package/dist/telegram/bot-updates.js +25 -0
  1511. package/dist/telegram/bot.js +401 -0
  1512. package/dist/telegram/caption.js +11 -0
  1513. package/dist/telegram/download.js +34 -0
  1514. package/dist/telegram/draft-chunking.js +22 -0
  1515. package/dist/telegram/draft-stream.js +101 -0
  1516. package/dist/telegram/fetch.js +35 -0
  1517. package/dist/telegram/format.js +66 -0
  1518. package/dist/telegram/group-migration.js +53 -0
  1519. package/dist/telegram/index.js +4 -0
  1520. package/dist/telegram/inline-buttons.js +55 -0
  1521. package/dist/telegram/monitor.js +168 -0
  1522. package/dist/telegram/network-config.js +23 -0
  1523. package/dist/telegram/network-errors.js +107 -0
  1524. package/dist/telegram/pairing-store.js +77 -0
  1525. package/dist/telegram/probe.js +70 -0
  1526. package/dist/telegram/proxy.js +10 -0
  1527. package/dist/telegram/reaction-level.js +46 -0
  1528. package/dist/telegram/send.js +535 -0
  1529. package/dist/telegram/sent-message-cache.js +53 -0
  1530. package/dist/telegram/sticker-cache.js +202 -0
  1531. package/dist/telegram/targets.js +46 -0
  1532. package/dist/telegram/token.js +58 -0
  1533. package/dist/telegram/update-offset-store.js +60 -0
  1534. package/dist/telegram/voice.js +23 -0
  1535. package/dist/telegram/webhook-set.js +28 -0
  1536. package/dist/telegram/webhook.js +95 -0
  1537. package/dist/terminal/ansi.js +11 -0
  1538. package/dist/terminal/links.js +17 -0
  1539. package/dist/terminal/note.js +79 -0
  1540. package/dist/terminal/palette.js +12 -0
  1541. package/dist/terminal/progress-line.js +18 -0
  1542. package/dist/terminal/prompt-style.js +4 -0
  1543. package/dist/terminal/stream-writer.js +49 -0
  1544. package/dist/terminal/table.js +327 -0
  1545. package/dist/terminal/theme.js +22 -0
  1546. package/dist/tts/tts.js +1170 -0
  1547. package/dist/tui/commands.js +134 -0
  1548. package/dist/tui/components/assistant-message.js +16 -0
  1549. package/dist/tui/components/chat-log.js +86 -0
  1550. package/dist/tui/components/custom-editor.js +61 -0
  1551. package/dist/tui/components/filterable-select-list.js +102 -0
  1552. package/dist/tui/components/fuzzy-filter.js +113 -0
  1553. package/dist/tui/components/searchable-select-list.js +231 -0
  1554. package/dist/tui/components/selectors.js +16 -0
  1555. package/dist/tui/components/tool-execution.js +109 -0
  1556. package/dist/tui/components/user-message.js +17 -0
  1557. package/dist/tui/gateway-chat.js +146 -0
  1558. package/dist/tui/theme/syntax-theme.js +49 -0
  1559. package/dist/tui/theme/theme.js +119 -0
  1560. package/dist/tui/tui-command-handlers.js +418 -0
  1561. package/dist/tui/tui-event-handlers.js +160 -0
  1562. package/dist/tui/tui-formatters.js +158 -0
  1563. package/dist/tui/tui-local-shell.js +99 -0
  1564. package/dist/tui/tui-overlays.js +13 -0
  1565. package/dist/tui/tui-session-actions.js +205 -0
  1566. package/dist/tui/tui-status-summary.js +74 -0
  1567. package/dist/tui/tui-stream-assembler.js +54 -0
  1568. package/dist/tui/tui-types.js +1 -0
  1569. package/dist/tui/tui-waiting.js +34 -0
  1570. package/dist/tui/tui.js +551 -0
  1571. package/dist/utils/account-id.js +6 -0
  1572. package/dist/utils/boolean.js +22 -0
  1573. package/dist/utils/delivery-context.js +84 -0
  1574. package/dist/utils/directive-tags.js +54 -0
  1575. package/dist/utils/message-channel.js +84 -0
  1576. package/dist/utils/provider-utils.js +28 -0
  1577. package/dist/utils/queue-helpers.js +95 -0
  1578. package/dist/utils/time-format.js +19 -0
  1579. package/dist/utils/usage-format.js +46 -0
  1580. package/dist/utils.js +256 -0
  1581. package/dist/version.js +18 -0
  1582. package/dist/web/accounts.js +122 -0
  1583. package/dist/web/active-listener.js +37 -0
  1584. package/dist/web/auth-store.js +168 -0
  1585. package/dist/web/auto-reply/constants.js +1 -0
  1586. package/dist/web/auto-reply/deliver-reply.js +140 -0
  1587. package/dist/web/auto-reply/heartbeat-runner.js +264 -0
  1588. package/dist/web/auto-reply/loggers.js +5 -0
  1589. package/dist/web/auto-reply/mentions.js +79 -0
  1590. package/dist/web/auto-reply/monitor/ack-reaction.js +47 -0
  1591. package/dist/web/auto-reply/monitor/broadcast.js +66 -0
  1592. package/dist/web/auto-reply/monitor/commands.js +21 -0
  1593. package/dist/web/auto-reply/monitor/echo.js +36 -0
  1594. package/dist/web/auto-reply/monitor/group-activation.js +37 -0
  1595. package/dist/web/auto-reply/monitor/group-gating.js +98 -0
  1596. package/dist/web/auto-reply/monitor/group-members.js +53 -0
  1597. package/dist/web/auto-reply/monitor/last-route.js +38 -0
  1598. package/dist/web/auto-reply/monitor/message-line.js +35 -0
  1599. package/dist/web/auto-reply/monitor/on-message.js +128 -0
  1600. package/dist/web/auto-reply/monitor/peer.js +10 -0
  1601. package/dist/web/auto-reply/monitor/process-message.js +316 -0
  1602. package/dist/web/auto-reply/monitor.js +355 -0
  1603. package/dist/web/auto-reply/session-snapshot.js +40 -0
  1604. package/dist/web/auto-reply/types.js +1 -0
  1605. package/dist/web/auto-reply/util.js +47 -0
  1606. package/dist/web/auto-reply.impl.js +5 -0
  1607. package/dist/web/auto-reply.js +1 -0
  1608. package/dist/web/inbound/access-control.js +147 -0
  1609. package/dist/web/inbound/dedupe.js +13 -0
  1610. package/dist/web/inbound/extract.js +254 -0
  1611. package/dist/web/inbound/media.js +35 -0
  1612. package/dist/web/inbound/monitor.js +332 -0
  1613. package/dist/web/inbound/send-api.js +90 -0
  1614. package/dist/web/inbound/types.js +1 -0
  1615. package/dist/web/inbound.js +3 -0
  1616. package/dist/web/login-qr.js +227 -0
  1617. package/dist/web/login.js +68 -0
  1618. package/dist/web/media.js +221 -0
  1619. package/dist/web/outbound.js +132 -0
  1620. package/dist/web/qr-image.js +95 -0
  1621. package/dist/web/reconnect.js +36 -0
  1622. package/dist/web/session.js +224 -0
  1623. package/dist/web/vcard.js +63 -0
  1624. package/dist/whatsapp/normalize.js +66 -0
  1625. package/dist/wizard/clack-prompter.js +72 -0
  1626. package/dist/wizard/onboarding.finalize.js +354 -0
  1627. package/dist/wizard/onboarding.gateway-config.js +188 -0
  1628. package/dist/wizard/onboarding.js +372 -0
  1629. package/dist/wizard/onboarding.types.js +1 -0
  1630. package/dist/wizard/prompts.js +6 -0
  1631. package/dist/wizard/session.js +201 -0
  1632. package/docs/CNAME +1 -0
  1633. package/docs/_config.yml +53 -0
  1634. package/docs/_layouts/default.html +145 -0
  1635. package/docs/assets/markdown.css +179 -0
  1636. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  1637. package/docs/assets/openclaw-logo-text.png +0 -0
  1638. package/docs/assets/pixel-lobster.svg +60 -0
  1639. package/docs/assets/showcase/agents-ui.jpg +0 -0
  1640. package/docs/assets/showcase/bambu-cli.png +0 -0
  1641. package/docs/assets/showcase/codexmonitor.png +0 -0
  1642. package/docs/assets/showcase/gohome-grafana.png +0 -0
  1643. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  1644. package/docs/assets/showcase/oura-health.png +0 -0
  1645. package/docs/assets/showcase/padel-cli.svg +11 -0
  1646. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  1647. package/docs/assets/showcase/papla-tts.jpg +0 -0
  1648. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  1649. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  1650. package/docs/assets/showcase/roborock-status.svg +13 -0
  1651. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  1652. package/docs/assets/showcase/snag.png +0 -0
  1653. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  1654. package/docs/assets/showcase/wienerlinien.png +0 -0
  1655. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  1656. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  1657. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  1658. package/docs/assets/terminal.css +473 -0
  1659. package/docs/assets/theme.js +55 -0
  1660. package/docs/automation/auth-monitoring.md +41 -0
  1661. package/docs/automation/cron-jobs.md +286 -0
  1662. package/docs/automation/cron-vs-heartbeat.md +274 -0
  1663. package/docs/automation/gmail-pubsub.md +252 -0
  1664. package/docs/automation/poll.md +63 -0
  1665. package/docs/automation/webhook.md +155 -0
  1666. package/docs/bedrock.md +172 -0
  1667. package/docs/brave-search.md +40 -0
  1668. package/docs/broadcast-groups.md +407 -0
  1669. package/docs/channels/bluebubbles.md +233 -0
  1670. package/docs/channels/discord.md +404 -0
  1671. package/docs/channels/googlechat.md +220 -0
  1672. package/docs/channels/grammy.md +27 -0
  1673. package/docs/channels/imessage.md +261 -0
  1674. package/docs/channels/index.md +43 -0
  1675. package/docs/channels/line.md +183 -0
  1676. package/docs/channels/location.md +48 -0
  1677. package/docs/channels/matrix.md +230 -0
  1678. package/docs/channels/mattermost.md +123 -0
  1679. package/docs/channels/msteams.md +707 -0
  1680. package/docs/channels/nextcloud-talk.md +120 -0
  1681. package/docs/channels/nostr.md +235 -0
  1682. package/docs/channels/signal.md +179 -0
  1683. package/docs/channels/slack.md +509 -0
  1684. package/docs/channels/telegram.md +675 -0
  1685. package/docs/channels/tlon.md +133 -0
  1686. package/docs/channels/troubleshooting.md +25 -0
  1687. package/docs/channels/twitch.md +366 -0
  1688. package/docs/channels/whatsapp.md +362 -0
  1689. package/docs/channels/zalo.md +167 -0
  1690. package/docs/channels/zalouser.md +123 -0
  1691. package/docs/cli/acp.md +166 -0
  1692. package/docs/cli/agent.md +22 -0
  1693. package/docs/cli/agents.md +71 -0
  1694. package/docs/cli/approvals.md +48 -0
  1695. package/docs/cli/browser.md +104 -0
  1696. package/docs/cli/channels.md +75 -0
  1697. package/docs/cli/config.md +49 -0
  1698. package/docs/cli/configure.md +30 -0
  1699. package/docs/cli/cron.md +29 -0
  1700. package/docs/cli/dashboard.md +16 -0
  1701. package/docs/cli/devices.md +66 -0
  1702. package/docs/cli/directory.md +60 -0
  1703. package/docs/cli/dns.md +21 -0
  1704. package/docs/cli/docs.md +15 -0
  1705. package/docs/cli/doctor.md +38 -0
  1706. package/docs/cli/gateway.md +187 -0
  1707. package/docs/cli/health.md +19 -0
  1708. package/docs/cli/hooks.md +290 -0
  1709. package/docs/cli/index.md +918 -0
  1710. package/docs/cli/logs.md +23 -0
  1711. package/docs/cli/memory.md +42 -0
  1712. package/docs/cli/message.md +228 -0
  1713. package/docs/cli/models.md +68 -0
  1714. package/docs/cli/node.md +108 -0
  1715. package/docs/cli/nodes.md +68 -0
  1716. package/docs/cli/onboard.md +26 -0
  1717. package/docs/cli/pairing.md +20 -0
  1718. package/docs/cli/plugins.md +60 -0
  1719. package/docs/cli/reset.md +17 -0
  1720. package/docs/cli/sandbox.md +150 -0
  1721. package/docs/cli/security.md +24 -0
  1722. package/docs/cli/sessions.md +16 -0
  1723. package/docs/cli/setup.md +28 -0
  1724. package/docs/cli/skills.md +25 -0
  1725. package/docs/cli/status.md +24 -0
  1726. package/docs/cli/system.md +55 -0
  1727. package/docs/cli/tui.md +22 -0
  1728. package/docs/cli/uninstall.md +17 -0
  1729. package/docs/cli/update.md +96 -0
  1730. package/docs/cli/voicecall.md +33 -0
  1731. package/docs/cli/webhooks.md +23 -0
  1732. package/docs/concepts/agent-loop.md +126 -0
  1733. package/docs/concepts/agent-workspace.md +231 -0
  1734. package/docs/concepts/agent.md +117 -0
  1735. package/docs/concepts/architecture.md +122 -0
  1736. package/docs/concepts/channel-routing.md +114 -0
  1737. package/docs/concepts/compaction.md +49 -0
  1738. package/docs/concepts/context.md +151 -0
  1739. package/docs/concepts/group-messages.md +78 -0
  1740. package/docs/concepts/groups.md +344 -0
  1741. package/docs/concepts/markdown-formatting.md +132 -0
  1742. package/docs/concepts/memory.md +410 -0
  1743. package/docs/concepts/messages.md +143 -0
  1744. package/docs/concepts/model-failover.md +139 -0
  1745. package/docs/concepts/model-providers.md +319 -0
  1746. package/docs/concepts/models.md +202 -0
  1747. package/docs/concepts/multi-agent.md +354 -0
  1748. package/docs/concepts/oauth.md +135 -0
  1749. package/docs/concepts/presence.md +98 -0
  1750. package/docs/concepts/queue.md +77 -0
  1751. package/docs/concepts/retry.md +60 -0
  1752. package/docs/concepts/session-pruning.md +104 -0
  1753. package/docs/concepts/session-tool.md +171 -0
  1754. package/docs/concepts/session.md +152 -0
  1755. package/docs/concepts/sessions.md +8 -0
  1756. package/docs/concepts/streaming.md +123 -0
  1757. package/docs/concepts/system-prompt.md +110 -0
  1758. package/docs/concepts/timezone.md +89 -0
  1759. package/docs/concepts/typebox.md +281 -0
  1760. package/docs/concepts/typing-indicators.md +59 -0
  1761. package/docs/concepts/usage-tracking.md +30 -0
  1762. package/docs/date-time.md +127 -0
  1763. package/docs/debug/node-issue.md +72 -0
  1764. package/docs/debugging.md +161 -0
  1765. package/docs/diagnostics/flags.md +89 -0
  1766. package/docs/docs.json +1153 -0
  1767. package/docs/environment.md +78 -0
  1768. package/docs/experiments/onboarding-config-protocol.md +34 -0
  1769. package/docs/experiments/plans/cron-add-hardening.md +57 -0
  1770. package/docs/experiments/plans/group-policy-hardening.md +38 -0
  1771. package/docs/experiments/plans/openresponses-gateway.md +122 -0
  1772. package/docs/experiments/proposals/model-config.md +32 -0
  1773. package/docs/experiments/research/memory.md +210 -0
  1774. package/docs/gateway/authentication.md +143 -0
  1775. package/docs/gateway/background-process.md +82 -0
  1776. package/docs/gateway/bonjour.md +162 -0
  1777. package/docs/gateway/bridge-protocol.md +85 -0
  1778. package/docs/gateway/cli-backends.md +221 -0
  1779. package/docs/gateway/configuration-examples.md +573 -0
  1780. package/docs/gateway/configuration.md +3254 -0
  1781. package/docs/gateway/discovery.md +110 -0
  1782. package/docs/gateway/doctor.md +252 -0
  1783. package/docs/gateway/gateway-lock.md +28 -0
  1784. package/docs/gateway/health.md +29 -0
  1785. package/docs/gateway/heartbeat.md +297 -0
  1786. package/docs/gateway/index.md +292 -0
  1787. package/docs/gateway/local-models.md +146 -0
  1788. package/docs/gateway/logging.md +112 -0
  1789. package/docs/gateway/multiple-gateways.md +107 -0
  1790. package/docs/gateway/openai-http-api.md +112 -0
  1791. package/docs/gateway/openresponses-http-api.md +298 -0
  1792. package/docs/gateway/pairing.md +92 -0
  1793. package/docs/gateway/protocol.md +215 -0
  1794. package/docs/gateway/remote-gateway-readme.md +155 -0
  1795. package/docs/gateway/remote.md +122 -0
  1796. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +120 -0
  1797. package/docs/gateway/sandboxing.md +176 -0
  1798. package/docs/gateway/security/formal-verification.md +160 -0
  1799. package/docs/gateway/security/index.md +758 -0
  1800. package/docs/gateway/tailscale.md +124 -0
  1801. package/docs/gateway/tools-invoke-http-api.md +79 -0
  1802. package/docs/gateway/troubleshooting.md +714 -0
  1803. package/docs/help/faq.md +2726 -0
  1804. package/docs/help/index.md +20 -0
  1805. package/docs/help/troubleshooting.md +97 -0
  1806. package/docs/hooks/soul-evil.md +68 -0
  1807. package/docs/hooks.md +896 -0
  1808. package/docs/images/groups-flow.svg +52 -0
  1809. package/docs/images/mobile-ui-screenshot.png +0 -0
  1810. package/docs/index.md +249 -0
  1811. package/docs/install/ansible.md +205 -0
  1812. package/docs/install/bun.md +58 -0
  1813. package/docs/install/development-channels.md +74 -0
  1814. package/docs/install/docker.md +447 -0
  1815. package/docs/install/index.md +181 -0
  1816. package/docs/install/installer.md +122 -0
  1817. package/docs/install/migrating.md +190 -0
  1818. package/docs/install/nix.md +95 -0
  1819. package/docs/install/node.md +78 -0
  1820. package/docs/install/uninstall.md +125 -0
  1821. package/docs/install/updating.md +219 -0
  1822. package/docs/logging.md +343 -0
  1823. package/docs/multi-agent-sandbox-tools.md +374 -0
  1824. package/docs/network.md +51 -0
  1825. package/docs/nodes/audio.md +109 -0
  1826. package/docs/nodes/camera.md +152 -0
  1827. package/docs/nodes/images.md +61 -0
  1828. package/docs/nodes/index.md +305 -0
  1829. package/docs/nodes/location-command.md +95 -0
  1830. package/docs/nodes/media-understanding.md +313 -0
  1831. package/docs/nodes/talk.md +79 -0
  1832. package/docs/nodes/voicewake.md +61 -0
  1833. package/docs/northflank.mdx +53 -0
  1834. package/docs/perplexity.md +79 -0
  1835. package/docs/platforms/android.md +141 -0
  1836. package/docs/platforms/digitalocean.md +243 -0
  1837. package/docs/platforms/exe-dev.md +125 -0
  1838. package/docs/platforms/fly.md +465 -0
  1839. package/docs/platforms/gcp.md +498 -0
  1840. package/docs/platforms/hetzner.md +325 -0
  1841. package/docs/platforms/index.md +50 -0
  1842. package/docs/platforms/ios.md +104 -0
  1843. package/docs/platforms/linux.md +89 -0
  1844. package/docs/platforms/mac/bundled-gateway.md +67 -0
  1845. package/docs/platforms/mac/canvas.md +121 -0
  1846. package/docs/platforms/mac/child-process.md +67 -0
  1847. package/docs/platforms/mac/dev-setup.md +91 -0
  1848. package/docs/platforms/mac/health.md +28 -0
  1849. package/docs/platforms/mac/icon.md +26 -0
  1850. package/docs/platforms/mac/logging.md +51 -0
  1851. package/docs/platforms/mac/menu-bar.md +70 -0
  1852. package/docs/platforms/mac/peekaboo.md +62 -0
  1853. package/docs/platforms/mac/permissions.md +40 -0
  1854. package/docs/platforms/mac/release.md +77 -0
  1855. package/docs/platforms/mac/remote.md +71 -0
  1856. package/docs/platforms/mac/signing.md +43 -0
  1857. package/docs/platforms/mac/skills.md +27 -0
  1858. package/docs/platforms/mac/voice-overlay.md +52 -0
  1859. package/docs/platforms/mac/voicewake.md +56 -0
  1860. package/docs/platforms/mac/webchat.md +39 -0
  1861. package/docs/platforms/mac/xpc.md +51 -0
  1862. package/docs/platforms/macos-vm.md +275 -0
  1863. package/docs/platforms/macos.md +195 -0
  1864. package/docs/platforms/oracle.md +291 -0
  1865. package/docs/platforms/raspberry-pi.md +354 -0
  1866. package/docs/platforms/windows.md +153 -0
  1867. package/docs/plugin.md +638 -0
  1868. package/docs/plugins/agent-tools.md +96 -0
  1869. package/docs/plugins/manifest.md +67 -0
  1870. package/docs/plugins/voice-call.md +239 -0
  1871. package/docs/plugins/zalouser.md +75 -0
  1872. package/docs/prose.md +131 -0
  1873. package/docs/providers/anthropic.md +126 -0
  1874. package/docs/providers/claude-max-api-proxy.md +145 -0
  1875. package/docs/providers/deepgram.md +89 -0
  1876. package/docs/providers/github-copilot.md +70 -0
  1877. package/docs/providers/glm.md +31 -0
  1878. package/docs/providers/index.md +60 -0
  1879. package/docs/providers/minimax.md +183 -0
  1880. package/docs/providers/models.md +48 -0
  1881. package/docs/providers/moonshot.md +162 -0
  1882. package/docs/providers/ollama.md +219 -0
  1883. package/docs/providers/openai.md +60 -0
  1884. package/docs/providers/opencode.md +34 -0
  1885. package/docs/providers/openrouter.md +35 -0
  1886. package/docs/providers/qwen.md +51 -0
  1887. package/docs/providers/synthetic.md +97 -0
  1888. package/docs/providers/venice.md +264 -0
  1889. package/docs/providers/vercel-ai-gateway.md +50 -0
  1890. package/docs/providers/xiaomi.md +62 -0
  1891. package/docs/providers/zai.md +34 -0
  1892. package/docs/railway.mdx +96 -0
  1893. package/docs/refactor/clawnet.md +360 -0
  1894. package/docs/refactor/exec-host.md +265 -0
  1895. package/docs/refactor/outbound-session-mirroring.md +75 -0
  1896. package/docs/refactor/plugin-sdk.md +187 -0
  1897. package/docs/refactor/strict-config.md +81 -0
  1898. package/docs/reference/AGENTS.default.md +113 -0
  1899. package/docs/reference/RELEASING.md +107 -0
  1900. package/docs/reference/api-usage-costs.md +116 -0
  1901. package/docs/reference/device-models.md +46 -0
  1902. package/docs/reference/rpc.md +35 -0
  1903. package/docs/reference/session-management-compaction.md +273 -0
  1904. package/docs/reference/templates/AGENTS.dev.md +78 -0
  1905. package/docs/reference/templates/AGENTS.md +196 -0
  1906. package/docs/reference/templates/BOOT.md +9 -0
  1907. package/docs/reference/templates/BOOTSTRAP.md +55 -0
  1908. package/docs/reference/templates/HEARTBEAT.md +9 -0
  1909. package/docs/reference/templates/IDENTITY.dev.md +40 -0
  1910. package/docs/reference/templates/IDENTITY.md +27 -0
  1911. package/docs/reference/templates/SOUL.dev.md +74 -0
  1912. package/docs/reference/templates/SOUL.md +41 -0
  1913. package/docs/reference/templates/TOOLS.dev.md +21 -0
  1914. package/docs/reference/templates/TOOLS.md +41 -0
  1915. package/docs/reference/templates/USER.dev.md +17 -0
  1916. package/docs/reference/templates/USER.md +22 -0
  1917. package/docs/reference/test.md +46 -0
  1918. package/docs/reference/transcript-hygiene.md +95 -0
  1919. package/docs/render.mdx +158 -0
  1920. package/docs/scripts.md +31 -0
  1921. package/docs/security/formal-verification.md +160 -0
  1922. package/docs/start/getting-started.md +204 -0
  1923. package/docs/start/hubs.md +182 -0
  1924. package/docs/start/lore.md +209 -0
  1925. package/docs/start/onboarding.md +103 -0
  1926. package/docs/start/openclaw.md +235 -0
  1927. package/docs/start/pairing.md +83 -0
  1928. package/docs/start/setup.md +144 -0
  1929. package/docs/start/showcase.md +416 -0
  1930. package/docs/start/wizard.md +321 -0
  1931. package/docs/testing.md +349 -0
  1932. package/docs/token-use.md +110 -0
  1933. package/docs/tools/agent-send.md +51 -0
  1934. package/docs/tools/apply-patch.md +49 -0
  1935. package/docs/tools/browser-linux-troubleshooting.md +129 -0
  1936. package/docs/tools/browser-login.md +67 -0
  1937. package/docs/tools/browser.md +536 -0
  1938. package/docs/tools/chrome-extension.md +168 -0
  1939. package/docs/tools/clawdhub.md +201 -0
  1940. package/docs/tools/creating-skills.md +41 -0
  1941. package/docs/tools/elevated.md +49 -0
  1942. package/docs/tools/exec-approvals.md +226 -0
  1943. package/docs/tools/exec.md +167 -0
  1944. package/docs/tools/firecrawl.md +58 -0
  1945. package/docs/tools/index.md +450 -0
  1946. package/docs/tools/llm-task.md +114 -0
  1947. package/docs/tools/lobster.md +338 -0
  1948. package/docs/tools/reactions.md +20 -0
  1949. package/docs/tools/skills-config.md +75 -0
  1950. package/docs/tools/skills.md +267 -0
  1951. package/docs/tools/slash-commands.md +190 -0
  1952. package/docs/tools/subagents.md +137 -0
  1953. package/docs/tools/thinking.md +62 -0
  1954. package/docs/tools/web.md +257 -0
  1955. package/docs/tts.md +389 -0
  1956. package/docs/tui.md +134 -0
  1957. package/docs/vps.md +41 -0
  1958. package/docs/web/control-ui.md +163 -0
  1959. package/docs/web/dashboard.md +42 -0
  1960. package/docs/web/index.md +110 -0
  1961. package/docs/web/webchat.md +41 -0
  1962. package/docs/whatsapp-openclaw.jpg +0 -0
  1963. package/extensions/bluebubbles/index.ts +20 -0
  1964. package/extensions/bluebubbles/openclaw.plugin.json +11 -0
  1965. package/extensions/bluebubbles/package.json +33 -0
  1966. package/extensions/bluebubbles/src/accounts.ts +80 -0
  1967. package/extensions/bluebubbles/src/actions.test.ts +651 -0
  1968. package/extensions/bluebubbles/src/actions.ts +403 -0
  1969. package/extensions/bluebubbles/src/attachments.test.ts +346 -0
  1970. package/extensions/bluebubbles/src/attachments.ts +282 -0
  1971. package/extensions/bluebubbles/src/channel.ts +399 -0
  1972. package/extensions/bluebubbles/src/chat.test.ts +462 -0
  1973. package/extensions/bluebubbles/src/chat.ts +354 -0
  1974. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  1975. package/extensions/bluebubbles/src/media-send.ts +168 -0
  1976. package/extensions/bluebubbles/src/monitor.test.ts +2146 -0
  1977. package/extensions/bluebubbles/src/monitor.ts +2276 -0
  1978. package/extensions/bluebubbles/src/onboarding.ts +340 -0
  1979. package/extensions/bluebubbles/src/probe.ts +127 -0
  1980. package/extensions/bluebubbles/src/reactions.test.ts +393 -0
  1981. package/extensions/bluebubbles/src/reactions.ts +183 -0
  1982. package/extensions/bluebubbles/src/runtime.ts +14 -0
  1983. package/extensions/bluebubbles/src/send.test.ts +809 -0
  1984. package/extensions/bluebubbles/src/send.ts +418 -0
  1985. package/extensions/bluebubbles/src/targets.test.ts +184 -0
  1986. package/extensions/bluebubbles/src/targets.ts +323 -0
  1987. package/extensions/bluebubbles/src/types.ts +127 -0
  1988. package/extensions/copilot-proxy/README.md +24 -0
  1989. package/extensions/copilot-proxy/index.ts +142 -0
  1990. package/extensions/copilot-proxy/openclaw.plugin.json +11 -0
  1991. package/extensions/copilot-proxy/package.json +11 -0
  1992. package/extensions/diagnostics-otel/index.ts +16 -0
  1993. package/extensions/diagnostics-otel/openclaw.plugin.json +8 -0
  1994. package/extensions/diagnostics-otel/package.json +24 -0
  1995. package/extensions/diagnostics-otel/src/service.test.ts +220 -0
  1996. package/extensions/diagnostics-otel/src/service.ts +566 -0
  1997. package/extensions/discord/index.ts +18 -0
  1998. package/extensions/discord/openclaw.plugin.json +11 -0
  1999. package/extensions/discord/package.json +11 -0
  2000. package/extensions/discord/src/channel.ts +422 -0
  2001. package/extensions/discord/src/runtime.ts +14 -0
  2002. package/extensions/google-antigravity-auth/README.md +24 -0
  2003. package/extensions/google-antigravity-auth/index.ts +437 -0
  2004. package/extensions/google-antigravity-auth/openclaw.plugin.json +11 -0
  2005. package/extensions/google-antigravity-auth/package.json +11 -0
  2006. package/extensions/google-gemini-cli-auth/README.md +35 -0
  2007. package/extensions/google-gemini-cli-auth/index.ts +91 -0
  2008. package/extensions/google-gemini-cli-auth/oauth.test.ts +228 -0
  2009. package/extensions/google-gemini-cli-auth/oauth.ts +580 -0
  2010. package/extensions/google-gemini-cli-auth/openclaw.plugin.json +11 -0
  2011. package/extensions/google-gemini-cli-auth/package.json +11 -0
  2012. package/extensions/googlechat/index.ts +20 -0
  2013. package/extensions/googlechat/node_modules/.bin/openclaw +21 -0
  2014. package/extensions/googlechat/openclaw.plugin.json +11 -0
  2015. package/extensions/googlechat/package.json +39 -0
  2016. package/extensions/googlechat/src/accounts.ts +133 -0
  2017. package/extensions/googlechat/src/actions.ts +162 -0
  2018. package/extensions/googlechat/src/api.test.ts +62 -0
  2019. package/extensions/googlechat/src/api.ts +259 -0
  2020. package/extensions/googlechat/src/auth.ts +113 -0
  2021. package/extensions/googlechat/src/channel.ts +580 -0
  2022. package/extensions/googlechat/src/monitor.test.ts +27 -0
  2023. package/extensions/googlechat/src/monitor.ts +900 -0
  2024. package/extensions/googlechat/src/onboarding.ts +278 -0
  2025. package/extensions/googlechat/src/runtime.ts +14 -0
  2026. package/extensions/googlechat/src/targets.test.ts +35 -0
  2027. package/extensions/googlechat/src/targets.ts +55 -0
  2028. package/extensions/googlechat/src/types.config.ts +3 -0
  2029. package/extensions/googlechat/src/types.ts +73 -0
  2030. package/extensions/imessage/index.ts +18 -0
  2031. package/extensions/imessage/openclaw.plugin.json +11 -0
  2032. package/extensions/imessage/package.json +11 -0
  2033. package/extensions/imessage/src/channel.ts +294 -0
  2034. package/extensions/imessage/src/runtime.ts +14 -0
  2035. package/extensions/line/index.ts +20 -0
  2036. package/extensions/line/node_modules/.bin/openclaw +21 -0
  2037. package/extensions/line/openclaw.plugin.json +11 -0
  2038. package/extensions/line/package.json +29 -0
  2039. package/extensions/line/src/card-command.ts +338 -0
  2040. package/extensions/line/src/channel.logout.test.ts +96 -0
  2041. package/extensions/line/src/channel.sendPayload.test.ts +308 -0
  2042. package/extensions/line/src/channel.ts +781 -0
  2043. package/extensions/line/src/runtime.ts +14 -0
  2044. package/extensions/llm-task/README.md +97 -0
  2045. package/extensions/llm-task/index.ts +7 -0
  2046. package/extensions/llm-task/openclaw.plugin.json +21 -0
  2047. package/extensions/llm-task/package.json +11 -0
  2048. package/extensions/llm-task/src/llm-task-tool.test.ts +117 -0
  2049. package/extensions/llm-task/src/llm-task-tool.ts +218 -0
  2050. package/extensions/lobster/README.md +80 -0
  2051. package/extensions/lobster/SKILL.md +90 -0
  2052. package/extensions/lobster/index.ts +13 -0
  2053. package/extensions/lobster/openclaw.plugin.json +10 -0
  2054. package/extensions/lobster/package.json +11 -0
  2055. package/extensions/lobster/src/lobster-tool.test.ts +143 -0
  2056. package/extensions/lobster/src/lobster-tool.ts +240 -0
  2057. package/extensions/matrix/CHANGELOG.md +59 -0
  2058. package/extensions/matrix/index.ts +18 -0
  2059. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  2060. package/extensions/matrix/node_modules/.bin/openclaw +21 -0
  2061. package/extensions/matrix/openclaw.plugin.json +11 -0
  2062. package/extensions/matrix/package.json +36 -0
  2063. package/extensions/matrix/src/actions.ts +185 -0
  2064. package/extensions/matrix/src/channel.directory.test.ts +56 -0
  2065. package/extensions/matrix/src/channel.ts +417 -0
  2066. package/extensions/matrix/src/config-schema.ts +62 -0
  2067. package/extensions/matrix/src/directory-live.ts +175 -0
  2068. package/extensions/matrix/src/group-mentions.ts +61 -0
  2069. package/extensions/matrix/src/matrix/accounts.test.ts +83 -0
  2070. package/extensions/matrix/src/matrix/accounts.ts +63 -0
  2071. package/extensions/matrix/src/matrix/actions/client.ts +53 -0
  2072. package/extensions/matrix/src/matrix/actions/messages.ts +120 -0
  2073. package/extensions/matrix/src/matrix/actions/pins.ts +70 -0
  2074. package/extensions/matrix/src/matrix/actions/reactions.ts +84 -0
  2075. package/extensions/matrix/src/matrix/actions/room.ts +88 -0
  2076. package/extensions/matrix/src/matrix/actions/summary.ts +77 -0
  2077. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  2078. package/extensions/matrix/src/matrix/actions.ts +15 -0
  2079. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  2080. package/extensions/matrix/src/matrix/client/config.ts +165 -0
  2081. package/extensions/matrix/src/matrix/client/create-client.ts +127 -0
  2082. package/extensions/matrix/src/matrix/client/logging.ts +35 -0
  2083. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  2084. package/extensions/matrix/src/matrix/client/shared.ts +169 -0
  2085. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  2086. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  2087. package/extensions/matrix/src/matrix/client.test.ts +57 -0
  2088. package/extensions/matrix/src/matrix/client.ts +9 -0
  2089. package/extensions/matrix/src/matrix/credentials.ts +103 -0
  2090. package/extensions/matrix/src/matrix/deps.ts +57 -0
  2091. package/extensions/matrix/src/matrix/format.test.ts +34 -0
  2092. package/extensions/matrix/src/matrix/format.ts +22 -0
  2093. package/extensions/matrix/src/matrix/index.ts +11 -0
  2094. package/extensions/matrix/src/matrix/monitor/allowlist.ts +58 -0
  2095. package/extensions/matrix/src/matrix/monitor/auto-join.ts +68 -0
  2096. package/extensions/matrix/src/matrix/monitor/direct.ts +105 -0
  2097. package/extensions/matrix/src/matrix/monitor/events.ts +103 -0
  2098. package/extensions/matrix/src/matrix/monitor/handler.ts +645 -0
  2099. package/extensions/matrix/src/matrix/monitor/index.ts +279 -0
  2100. package/extensions/matrix/src/matrix/monitor/location.ts +83 -0
  2101. package/extensions/matrix/src/matrix/monitor/media.test.ts +103 -0
  2102. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  2103. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  2104. package/extensions/matrix/src/matrix/monitor/replies.ts +96 -0
  2105. package/extensions/matrix/src/matrix/monitor/room-info.ts +58 -0
  2106. package/extensions/matrix/src/matrix/monitor/rooms.ts +43 -0
  2107. package/extensions/matrix/src/matrix/monitor/threads.ts +64 -0
  2108. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  2109. package/extensions/matrix/src/matrix/poll-types.test.ts +22 -0
  2110. package/extensions/matrix/src/matrix/poll-types.ts +157 -0
  2111. package/extensions/matrix/src/matrix/probe.ts +70 -0
  2112. package/extensions/matrix/src/matrix/send/client.ts +63 -0
  2113. package/extensions/matrix/src/matrix/send/formatting.ts +92 -0
  2114. package/extensions/matrix/src/matrix/send/media.ts +220 -0
  2115. package/extensions/matrix/src/matrix/send/targets.test.ts +102 -0
  2116. package/extensions/matrix/src/matrix/send/targets.ts +144 -0
  2117. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  2118. package/extensions/matrix/src/matrix/send.test.ts +172 -0
  2119. package/extensions/matrix/src/matrix/send.ts +255 -0
  2120. package/extensions/matrix/src/onboarding.ts +432 -0
  2121. package/extensions/matrix/src/outbound.ts +53 -0
  2122. package/extensions/matrix/src/resolve-targets.ts +89 -0
  2123. package/extensions/matrix/src/runtime.ts +14 -0
  2124. package/extensions/matrix/src/tool-actions.ts +160 -0
  2125. package/extensions/matrix/src/types.ts +95 -0
  2126. package/extensions/mattermost/index.ts +18 -0
  2127. package/extensions/mattermost/openclaw.plugin.json +11 -0
  2128. package/extensions/mattermost/package.json +25 -0
  2129. package/extensions/mattermost/src/channel.test.ts +43 -0
  2130. package/extensions/mattermost/src/channel.ts +339 -0
  2131. package/extensions/mattermost/src/config-schema.ts +56 -0
  2132. package/extensions/mattermost/src/group-mentions.ts +14 -0
  2133. package/extensions/mattermost/src/mattermost/accounts.ts +115 -0
  2134. package/extensions/mattermost/src/mattermost/client.ts +208 -0
  2135. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  2136. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +150 -0
  2137. package/extensions/mattermost/src/mattermost/monitor.ts +921 -0
  2138. package/extensions/mattermost/src/mattermost/probe.ts +70 -0
  2139. package/extensions/mattermost/src/mattermost/send.ts +217 -0
  2140. package/extensions/mattermost/src/normalize.ts +38 -0
  2141. package/extensions/mattermost/src/onboarding-helpers.ts +42 -0
  2142. package/extensions/mattermost/src/onboarding.ts +187 -0
  2143. package/extensions/mattermost/src/runtime.ts +14 -0
  2144. package/extensions/mattermost/src/types.ts +50 -0
  2145. package/extensions/memory-core/index.ts +36 -0
  2146. package/extensions/memory-core/node_modules/.bin/openclaw +21 -0
  2147. package/extensions/memory-core/openclaw.plugin.json +9 -0
  2148. package/extensions/memory-core/package.json +17 -0
  2149. package/extensions/memory-lancedb/config.ts +138 -0
  2150. package/extensions/memory-lancedb/index.test.ts +284 -0
  2151. package/extensions/memory-lancedb/index.ts +590 -0
  2152. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  2153. package/extensions/memory-lancedb/openclaw.plugin.json +67 -0
  2154. package/extensions/memory-lancedb/package.json +16 -0
  2155. package/extensions/msteams/CHANGELOG.md +56 -0
  2156. package/extensions/msteams/index.ts +18 -0
  2157. package/extensions/msteams/node_modules/.bin/openclaw +21 -0
  2158. package/extensions/msteams/openclaw.plugin.json +11 -0
  2159. package/extensions/msteams/package.json +36 -0
  2160. package/extensions/msteams/src/attachments/download.ts +206 -0
  2161. package/extensions/msteams/src/attachments/graph.ts +319 -0
  2162. package/extensions/msteams/src/attachments/html.ts +76 -0
  2163. package/extensions/msteams/src/attachments/payload.ts +22 -0
  2164. package/extensions/msteams/src/attachments/shared.ts +235 -0
  2165. package/extensions/msteams/src/attachments/types.ts +37 -0
  2166. package/extensions/msteams/src/attachments.test.ts +424 -0
  2167. package/extensions/msteams/src/attachments.ts +18 -0
  2168. package/extensions/msteams/src/channel.directory.test.ts +46 -0
  2169. package/extensions/msteams/src/channel.ts +436 -0
  2170. package/extensions/msteams/src/conversation-store-fs.test.ts +89 -0
  2171. package/extensions/msteams/src/conversation-store-fs.ts +155 -0
  2172. package/extensions/msteams/src/conversation-store-memory.ts +45 -0
  2173. package/extensions/msteams/src/conversation-store.ts +41 -0
  2174. package/extensions/msteams/src/directory-live.ts +179 -0
  2175. package/extensions/msteams/src/errors.test.ts +46 -0
  2176. package/extensions/msteams/src/errors.ts +158 -0
  2177. package/extensions/msteams/src/file-consent-helpers.test.ts +234 -0
  2178. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  2179. package/extensions/msteams/src/file-consent.ts +122 -0
  2180. package/extensions/msteams/src/graph-chat.ts +52 -0
  2181. package/extensions/msteams/src/graph-upload.ts +445 -0
  2182. package/extensions/msteams/src/inbound.test.ts +67 -0
  2183. package/extensions/msteams/src/inbound.ts +38 -0
  2184. package/extensions/msteams/src/index.ts +4 -0
  2185. package/extensions/msteams/src/media-helpers.test.ts +186 -0
  2186. package/extensions/msteams/src/media-helpers.ts +77 -0
  2187. package/extensions/msteams/src/messenger.test.ts +245 -0
  2188. package/extensions/msteams/src/messenger.ts +460 -0
  2189. package/extensions/msteams/src/monitor-handler/inbound-media.ts +123 -0
  2190. package/extensions/msteams/src/monitor-handler/message-handler.ts +629 -0
  2191. package/extensions/msteams/src/monitor-handler.ts +166 -0
  2192. package/extensions/msteams/src/monitor-types.ts +5 -0
  2193. package/extensions/msteams/src/monitor.ts +290 -0
  2194. package/extensions/msteams/src/onboarding.ts +432 -0
  2195. package/extensions/msteams/src/outbound.ts +47 -0
  2196. package/extensions/msteams/src/pending-uploads.ts +87 -0
  2197. package/extensions/msteams/src/policy.test.ts +210 -0
  2198. package/extensions/msteams/src/policy.ts +247 -0
  2199. package/extensions/msteams/src/polls-store-memory.ts +30 -0
  2200. package/extensions/msteams/src/polls-store.test.ts +40 -0
  2201. package/extensions/msteams/src/polls.test.ts +73 -0
  2202. package/extensions/msteams/src/polls.ts +300 -0
  2203. package/extensions/msteams/src/probe.test.ts +57 -0
  2204. package/extensions/msteams/src/probe.ts +99 -0
  2205. package/extensions/msteams/src/reply-dispatcher.ts +128 -0
  2206. package/extensions/msteams/src/resolve-allowlist.ts +277 -0
  2207. package/extensions/msteams/src/runtime.ts +14 -0
  2208. package/extensions/msteams/src/sdk-types.ts +19 -0
  2209. package/extensions/msteams/src/sdk.ts +33 -0
  2210. package/extensions/msteams/src/send-context.ts +156 -0
  2211. package/extensions/msteams/src/send.ts +489 -0
  2212. package/extensions/msteams/src/sent-message-cache.test.ts +16 -0
  2213. package/extensions/msteams/src/sent-message-cache.ts +41 -0
  2214. package/extensions/msteams/src/storage.ts +22 -0
  2215. package/extensions/msteams/src/store-fs.ts +80 -0
  2216. package/extensions/msteams/src/token.ts +19 -0
  2217. package/extensions/nextcloud-talk/index.ts +18 -0
  2218. package/extensions/nextcloud-talk/openclaw.plugin.json +11 -0
  2219. package/extensions/nextcloud-talk/package.json +30 -0
  2220. package/extensions/nextcloud-talk/src/accounts.ts +154 -0
  2221. package/extensions/nextcloud-talk/src/channel.ts +404 -0
  2222. package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
  2223. package/extensions/nextcloud-talk/src/format.ts +79 -0
  2224. package/extensions/nextcloud-talk/src/inbound.ts +336 -0
  2225. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  2226. package/extensions/nextcloud-talk/src/normalize.ts +31 -0
  2227. package/extensions/nextcloud-talk/src/onboarding.ts +341 -0
  2228. package/extensions/nextcloud-talk/src/policy.ts +175 -0
  2229. package/extensions/nextcloud-talk/src/room-info.ts +111 -0
  2230. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  2231. package/extensions/nextcloud-talk/src/send.ts +206 -0
  2232. package/extensions/nextcloud-talk/src/signature.ts +67 -0
  2233. package/extensions/nextcloud-talk/src/types.ts +179 -0
  2234. package/extensions/nostr/CHANGELOG.md +51 -0
  2235. package/extensions/nostr/README.md +136 -0
  2236. package/extensions/nostr/index.ts +69 -0
  2237. package/extensions/nostr/node_modules/.bin/openclaw +21 -0
  2238. package/extensions/nostr/openclaw.plugin.json +11 -0
  2239. package/extensions/nostr/package.json +31 -0
  2240. package/extensions/nostr/src/channel.test.ts +141 -0
  2241. package/extensions/nostr/src/channel.ts +342 -0
  2242. package/extensions/nostr/src/config-schema.ts +90 -0
  2243. package/extensions/nostr/src/metrics.ts +464 -0
  2244. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +544 -0
  2245. package/extensions/nostr/src/nostr-bus.integration.test.ts +452 -0
  2246. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  2247. package/extensions/nostr/src/nostr-bus.ts +741 -0
  2248. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  2249. package/extensions/nostr/src/nostr-profile-http.ts +500 -0
  2250. package/extensions/nostr/src/nostr-profile-import.test.ts +120 -0
  2251. package/extensions/nostr/src/nostr-profile-import.ts +259 -0
  2252. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +479 -0
  2253. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  2254. package/extensions/nostr/src/nostr-profile.ts +242 -0
  2255. package/extensions/nostr/src/nostr-state-store.test.ts +129 -0
  2256. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  2257. package/extensions/nostr/src/runtime.ts +14 -0
  2258. package/extensions/nostr/src/seen-tracker.ts +271 -0
  2259. package/extensions/nostr/src/types.test.ts +161 -0
  2260. package/extensions/nostr/src/types.ts +99 -0
  2261. package/extensions/nostr/test/setup.ts +5 -0
  2262. package/extensions/open-prose/README.md +25 -0
  2263. package/extensions/open-prose/index.ts +5 -0
  2264. package/extensions/open-prose/openclaw.plugin.json +11 -0
  2265. package/extensions/open-prose/package.json +11 -0
  2266. package/extensions/open-prose/skills/prose/LICENSE +21 -0
  2267. package/extensions/open-prose/skills/prose/SKILL.md +318 -0
  2268. package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
  2269. package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
  2270. package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
  2271. package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
  2272. package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
  2273. package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
  2274. package/extensions/open-prose/skills/prose/compiler.md +2967 -0
  2275. package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
  2276. package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
  2277. package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
  2278. package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
  2279. package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
  2280. package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
  2281. package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
  2282. package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
  2283. package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
  2284. package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
  2285. package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
  2286. package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
  2287. package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
  2288. package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
  2289. package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
  2290. package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
  2291. package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
  2292. package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
  2293. package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
  2294. package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
  2295. package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
  2296. package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
  2297. package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
  2298. package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
  2299. package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
  2300. package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
  2301. package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
  2302. package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
  2303. package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
  2304. package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
  2305. package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
  2306. package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
  2307. package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
  2308. package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
  2309. package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
  2310. package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
  2311. package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
  2312. package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
  2313. package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
  2314. package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
  2315. package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
  2316. package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
  2317. package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
  2318. package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
  2319. package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
  2320. package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
  2321. package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
  2322. package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
  2323. package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
  2324. package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
  2325. package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
  2326. package/extensions/open-prose/skills/prose/examples/README.md +391 -0
  2327. package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
  2328. package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
  2329. package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
  2330. package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
  2331. package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
  2332. package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
  2333. package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
  2334. package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
  2335. package/extensions/open-prose/skills/prose/help.md +143 -0
  2336. package/extensions/open-prose/skills/prose/lib/README.md +105 -0
  2337. package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
  2338. package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
  2339. package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
  2340. package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
  2341. package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
  2342. package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
  2343. package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
  2344. package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
  2345. package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
  2346. package/extensions/open-prose/skills/prose/primitives/session.md +587 -0
  2347. package/extensions/open-prose/skills/prose/prose.md +1235 -0
  2348. package/extensions/open-prose/skills/prose/state/filesystem.md +478 -0
  2349. package/extensions/open-prose/skills/prose/state/in-context.md +380 -0
  2350. package/extensions/open-prose/skills/prose/state/postgres.md +875 -0
  2351. package/extensions/open-prose/skills/prose/state/sqlite.md +572 -0
  2352. package/extensions/qwen-portal-auth/README.md +24 -0
  2353. package/extensions/qwen-portal-auth/index.ts +127 -0
  2354. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  2355. package/extensions/qwen-portal-auth/openclaw.plugin.json +11 -0
  2356. package/extensions/signal/index.ts +18 -0
  2357. package/extensions/signal/openclaw.plugin.json +11 -0
  2358. package/extensions/signal/package.json +11 -0
  2359. package/extensions/signal/src/channel.ts +312 -0
  2360. package/extensions/signal/src/runtime.ts +14 -0
  2361. package/extensions/slack/index.ts +18 -0
  2362. package/extensions/slack/openclaw.plugin.json +11 -0
  2363. package/extensions/slack/package.json +11 -0
  2364. package/extensions/slack/src/channel.ts +577 -0
  2365. package/extensions/slack/src/runtime.ts +14 -0
  2366. package/extensions/telegram/index.ts +18 -0
  2367. package/extensions/telegram/openclaw.plugin.json +11 -0
  2368. package/extensions/telegram/package.json +11 -0
  2369. package/extensions/telegram/src/channel.ts +478 -0
  2370. package/extensions/telegram/src/runtime.ts +14 -0
  2371. package/extensions/tlon/README.md +5 -0
  2372. package/extensions/tlon/index.ts +18 -0
  2373. package/extensions/tlon/openclaw.plugin.json +11 -0
  2374. package/extensions/tlon/package.json +30 -0
  2375. package/extensions/tlon/src/channel.ts +379 -0
  2376. package/extensions/tlon/src/config-schema.test.ts +32 -0
  2377. package/extensions/tlon/src/config-schema.ts +43 -0
  2378. package/extensions/tlon/src/monitor/discovery.ts +71 -0
  2379. package/extensions/tlon/src/monitor/history.ts +87 -0
  2380. package/extensions/tlon/src/monitor/index.ts +501 -0
  2381. package/extensions/tlon/src/monitor/processed-messages.test.ts +24 -0
  2382. package/extensions/tlon/src/monitor/processed-messages.ts +38 -0
  2383. package/extensions/tlon/src/monitor/utils.ts +83 -0
  2384. package/extensions/tlon/src/onboarding.ts +213 -0
  2385. package/extensions/tlon/src/runtime.ts +14 -0
  2386. package/extensions/tlon/src/targets.ts +79 -0
  2387. package/extensions/tlon/src/types.ts +85 -0
  2388. package/extensions/tlon/src/urbit/auth.ts +18 -0
  2389. package/extensions/tlon/src/urbit/http-api.ts +36 -0
  2390. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  2391. package/extensions/tlon/src/urbit/send.ts +127 -0
  2392. package/extensions/tlon/src/urbit/sse-client.test.ts +41 -0
  2393. package/extensions/tlon/src/urbit/sse-client.ts +367 -0
  2394. package/extensions/twitch/CHANGELOG.md +26 -0
  2395. package/extensions/twitch/README.md +89 -0
  2396. package/extensions/twitch/index.ts +20 -0
  2397. package/extensions/twitch/node_modules/.bin/openclaw +21 -0
  2398. package/extensions/twitch/openclaw.plugin.json +9 -0
  2399. package/extensions/twitch/package.json +20 -0
  2400. package/extensions/twitch/src/access-control.test.ts +489 -0
  2401. package/extensions/twitch/src/access-control.ts +154 -0
  2402. package/extensions/twitch/src/actions.ts +173 -0
  2403. package/extensions/twitch/src/client-manager-registry.ts +115 -0
  2404. package/extensions/twitch/src/config-schema.ts +82 -0
  2405. package/extensions/twitch/src/config.test.ts +88 -0
  2406. package/extensions/twitch/src/config.ts +116 -0
  2407. package/extensions/twitch/src/monitor.ts +257 -0
  2408. package/extensions/twitch/src/onboarding.test.ts +311 -0
  2409. package/extensions/twitch/src/onboarding.ts +411 -0
  2410. package/extensions/twitch/src/outbound.test.ts +373 -0
  2411. package/extensions/twitch/src/outbound.ts +186 -0
  2412. package/extensions/twitch/src/plugin.test.ts +39 -0
  2413. package/extensions/twitch/src/plugin.ts +274 -0
  2414. package/extensions/twitch/src/probe.test.ts +198 -0
  2415. package/extensions/twitch/src/probe.ts +118 -0
  2416. package/extensions/twitch/src/resolver.ts +137 -0
  2417. package/extensions/twitch/src/runtime.ts +14 -0
  2418. package/extensions/twitch/src/send.test.ts +289 -0
  2419. package/extensions/twitch/src/send.ts +136 -0
  2420. package/extensions/twitch/src/status.test.ts +270 -0
  2421. package/extensions/twitch/src/status.ts +176 -0
  2422. package/extensions/twitch/src/token.test.ts +171 -0
  2423. package/extensions/twitch/src/token.ts +87 -0
  2424. package/extensions/twitch/src/twitch-client.test.ts +574 -0
  2425. package/extensions/twitch/src/twitch-client.ts +277 -0
  2426. package/extensions/twitch/src/types.ts +141 -0
  2427. package/extensions/twitch/src/utils/markdown.ts +92 -0
  2428. package/extensions/twitch/src/utils/twitch.ts +78 -0
  2429. package/extensions/twitch/test/setup.ts +7 -0
  2430. package/extensions/voice-call/CHANGELOG.md +78 -0
  2431. package/extensions/voice-call/README.md +135 -0
  2432. package/extensions/voice-call/index.ts +497 -0
  2433. package/extensions/voice-call/openclaw.plugin.json +601 -0
  2434. package/extensions/voice-call/package.json +16 -0
  2435. package/extensions/voice-call/src/cli.ts +312 -0
  2436. package/extensions/voice-call/src/config.test.ts +204 -0
  2437. package/extensions/voice-call/src/config.ts +502 -0
  2438. package/extensions/voice-call/src/core-bridge.ts +198 -0
  2439. package/extensions/voice-call/src/manager/context.ts +21 -0
  2440. package/extensions/voice-call/src/manager/events.ts +177 -0
  2441. package/extensions/voice-call/src/manager/lookup.ts +33 -0
  2442. package/extensions/voice-call/src/manager/outbound.ts +248 -0
  2443. package/extensions/voice-call/src/manager/state.ts +50 -0
  2444. package/extensions/voice-call/src/manager/store.ts +88 -0
  2445. package/extensions/voice-call/src/manager/timers.ts +86 -0
  2446. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  2447. package/extensions/voice-call/src/manager.test.ts +108 -0
  2448. package/extensions/voice-call/src/manager.ts +888 -0
  2449. package/extensions/voice-call/src/media-stream.test.ts +97 -0
  2450. package/extensions/voice-call/src/media-stream.ts +393 -0
  2451. package/extensions/voice-call/src/providers/base.ts +67 -0
  2452. package/extensions/voice-call/src/providers/index.ts +10 -0
  2453. package/extensions/voice-call/src/providers/mock.ts +168 -0
  2454. package/extensions/voice-call/src/providers/plivo.test.ts +28 -0
  2455. package/extensions/voice-call/src/providers/plivo.ts +504 -0
  2456. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  2457. package/extensions/voice-call/src/providers/telnyx.ts +364 -0
  2458. package/extensions/voice-call/src/providers/tts-openai.ts +264 -0
  2459. package/extensions/voice-call/src/providers/twilio/api.ts +45 -0
  2460. package/extensions/voice-call/src/providers/twilio/webhook.ts +30 -0
  2461. package/extensions/voice-call/src/providers/twilio.test.ts +64 -0
  2462. package/extensions/voice-call/src/providers/twilio.ts +595 -0
  2463. package/extensions/voice-call/src/response-generator.ts +171 -0
  2464. package/extensions/voice-call/src/runtime.ts +217 -0
  2465. package/extensions/voice-call/src/telephony-audio.ts +88 -0
  2466. package/extensions/voice-call/src/telephony-tts.ts +95 -0
  2467. package/extensions/voice-call/src/tunnel.ts +331 -0
  2468. package/extensions/voice-call/src/types.ts +273 -0
  2469. package/extensions/voice-call/src/utils.ts +12 -0
  2470. package/extensions/voice-call/src/voice-mapping.ts +65 -0
  2471. package/extensions/voice-call/src/webhook-security.test.ts +260 -0
  2472. package/extensions/voice-call/src/webhook-security.ts +469 -0
  2473. package/extensions/voice-call/src/webhook.ts +491 -0
  2474. package/extensions/whatsapp/index.ts +18 -0
  2475. package/extensions/whatsapp/openclaw.plugin.json +11 -0
  2476. package/extensions/whatsapp/package.json +11 -0
  2477. package/extensions/whatsapp/src/channel.ts +500 -0
  2478. package/extensions/whatsapp/src/runtime.ts +14 -0
  2479. package/extensions/zalo/CHANGELOG.md +60 -0
  2480. package/extensions/zalo/README.md +50 -0
  2481. package/extensions/zalo/index.ts +20 -0
  2482. package/extensions/zalo/node_modules/.bin/openclaw +21 -0
  2483. package/extensions/zalo/openclaw.plugin.json +11 -0
  2484. package/extensions/zalo/package.json +33 -0
  2485. package/extensions/zalo/src/accounts.ts +71 -0
  2486. package/extensions/zalo/src/actions.ts +62 -0
  2487. package/extensions/zalo/src/api.ts +206 -0
  2488. package/extensions/zalo/src/channel.directory.test.ts +35 -0
  2489. package/extensions/zalo/src/channel.ts +394 -0
  2490. package/extensions/zalo/src/config-schema.ts +24 -0
  2491. package/extensions/zalo/src/monitor.ts +760 -0
  2492. package/extensions/zalo/src/monitor.webhook.test.ts +70 -0
  2493. package/extensions/zalo/src/onboarding.ts +405 -0
  2494. package/extensions/zalo/src/probe.ts +46 -0
  2495. package/extensions/zalo/src/proxy.ts +18 -0
  2496. package/extensions/zalo/src/runtime.ts +14 -0
  2497. package/extensions/zalo/src/send.ts +117 -0
  2498. package/extensions/zalo/src/status-issues.ts +50 -0
  2499. package/extensions/zalo/src/token.ts +55 -0
  2500. package/extensions/zalo/src/types.ts +42 -0
  2501. package/extensions/zalouser/CHANGELOG.md +38 -0
  2502. package/extensions/zalouser/README.md +221 -0
  2503. package/extensions/zalouser/index.ts +32 -0
  2504. package/extensions/zalouser/node_modules/.bin/openclaw +21 -0
  2505. package/extensions/zalouser/openclaw.plugin.json +11 -0
  2506. package/extensions/zalouser/package.json +33 -0
  2507. package/extensions/zalouser/src/accounts.ts +117 -0
  2508. package/extensions/zalouser/src/channel.test.ts +17 -0
  2509. package/extensions/zalouser/src/channel.ts +641 -0
  2510. package/extensions/zalouser/src/config-schema.ts +27 -0
  2511. package/extensions/zalouser/src/monitor.ts +574 -0
  2512. package/extensions/zalouser/src/onboarding.ts +488 -0
  2513. package/extensions/zalouser/src/probe.ts +28 -0
  2514. package/extensions/zalouser/src/runtime.ts +14 -0
  2515. package/extensions/zalouser/src/send.ts +150 -0
  2516. package/extensions/zalouser/src/status-issues.test.ts +58 -0
  2517. package/extensions/zalouser/src/status-issues.ts +81 -0
  2518. package/extensions/zalouser/src/tool.ts +156 -0
  2519. package/extensions/zalouser/src/types.ts +102 -0
  2520. package/extensions/zalouser/src/zca.ts +208 -0
  2521. package/git-hooks/pre-commit +4 -0
  2522. package/openclaw.mjs +14 -0
  2523. package/package.json +287 -0
  2524. package/patches/.gitkeep +0 -0
  2525. package/scripts/format-staged.js +148 -0
  2526. package/scripts/postinstall.js +301 -0
  2527. package/scripts/setup-git-hooks.js +96 -0
  2528. package/skills/1password/SKILL.md +53 -0
  2529. package/skills/1password/references/cli-examples.md +29 -0
  2530. package/skills/1password/references/get-started.md +17 -0
  2531. package/skills/apple-notes/SKILL.md +50 -0
  2532. package/skills/apple-reminders/SKILL.md +67 -0
  2533. package/skills/bear-notes/SKILL.md +79 -0
  2534. package/skills/bird/SKILL.md +197 -0
  2535. package/skills/blogwatcher/SKILL.md +46 -0
  2536. package/skills/blucli/SKILL.md +27 -0
  2537. package/skills/bluebubbles/SKILL.md +39 -0
  2538. package/skills/camsnap/SKILL.md +25 -0
  2539. package/skills/canvas/SKILL.md +189 -0
  2540. package/skills/clawdhub/SKILL.md +53 -0
  2541. package/skills/coding-agent/SKILL.md +278 -0
  2542. package/skills/discord/SKILL.md +475 -0
  2543. package/skills/eightctl/SKILL.md +29 -0
  2544. package/skills/food-order/SKILL.md +41 -0
  2545. package/skills/gemini/SKILL.md +23 -0
  2546. package/skills/gifgrep/SKILL.md +47 -0
  2547. package/skills/github/SKILL.md +48 -0
  2548. package/skills/gog/SKILL.md +92 -0
  2549. package/skills/goplaces/SKILL.md +30 -0
  2550. package/skills/himalaya/SKILL.md +217 -0
  2551. package/skills/himalaya/references/configuration.md +174 -0
  2552. package/skills/himalaya/references/message-composition.md +182 -0
  2553. package/skills/imsg/SKILL.md +25 -0
  2554. package/skills/local-places/SERVER_README.md +101 -0
  2555. package/skills/local-places/SKILL.md +91 -0
  2556. package/skills/local-places/pyproject.toml +27 -0
  2557. package/skills/local-places/src/local_places/__init__.py +2 -0
  2558. package/skills/local-places/src/local_places/google_places.py +314 -0
  2559. package/skills/local-places/src/local_places/main.py +65 -0
  2560. package/skills/local-places/src/local_places/schemas.py +107 -0
  2561. package/skills/mcporter/SKILL.md +38 -0
  2562. package/skills/model-usage/SKILL.md +45 -0
  2563. package/skills/model-usage/references/codexbar-cli.md +28 -0
  2564. package/skills/model-usage/scripts/model_usage.py +310 -0
  2565. package/skills/nano-banana-pro/SKILL.md +35 -0
  2566. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  2567. package/skills/nano-pdf/SKILL.md +20 -0
  2568. package/skills/notion/SKILL.md +156 -0
  2569. package/skills/obsidian/SKILL.md +55 -0
  2570. package/skills/openai-image-gen/SKILL.md +71 -0
  2571. package/skills/openai-image-gen/scripts/gen.py +240 -0
  2572. package/skills/openai-whisper/SKILL.md +19 -0
  2573. package/skills/openai-whisper-api/SKILL.md +43 -0
  2574. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  2575. package/skills/openhue/SKILL.md +30 -0
  2576. package/skills/oracle/SKILL.md +105 -0
  2577. package/skills/ordercli/SKILL.md +47 -0
  2578. package/skills/peekaboo/SKILL.md +153 -0
  2579. package/skills/sag/SKILL.md +62 -0
  2580. package/skills/session-logs/SKILL.md +105 -0
  2581. package/skills/sherpa-onnx-tts/SKILL.md +49 -0
  2582. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  2583. package/skills/skill-creator/SKILL.md +371 -0
  2584. package/skills/skill-creator/license.txt +202 -0
  2585. package/skills/skill-creator/scripts/init_skill.py +378 -0
  2586. package/skills/skill-creator/scripts/package_skill.py +111 -0
  2587. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  2588. package/skills/slack/SKILL.md +144 -0
  2589. package/skills/songsee/SKILL.md +29 -0
  2590. package/skills/sonoscli/SKILL.md +26 -0
  2591. package/skills/spotify-player/SKILL.md +34 -0
  2592. package/skills/summarize/SKILL.md +67 -0
  2593. package/skills/things-mac/SKILL.md +61 -0
  2594. package/skills/tmux/SKILL.md +121 -0
  2595. package/skills/tmux/scripts/find-sessions.sh +112 -0
  2596. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  2597. package/skills/trello/SKILL.md +84 -0
  2598. package/skills/video-frames/SKILL.md +29 -0
  2599. package/skills/video-frames/scripts/frame.sh +81 -0
  2600. package/skills/voice-call/SKILL.md +35 -0
  2601. package/skills/wacli/SKILL.md +42 -0
  2602. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CNKLKKXX.js","sources":["../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../ui/src/ui/assistant-identity.ts","../../../ui/src/ui/storage.ts","../../../src/sessions/session-key-utils.ts","../../../ui/src/ui/navigation.ts","../../../ui/src/ui/icons.ts","../../../src/shared/text/reasoning-tags.ts","../../../ui/src/ui/format.ts","../../../ui/src/ui/chat/message-extract.ts","../../../ui/src/ui/uuid.ts","../../../ui/src/ui/controllers/chat.ts","../../../ui/src/ui/controllers/sessions.ts","../../../ui/src/ui/app-tool-stream.ts","../../../ui/src/ui/app-scroll.ts","../../../ui/src/ui/controllers/config/form-utils.ts","../../../ui/src/ui/controllers/config.ts","../../../ui/src/ui/controllers/cron.ts","../../../ui/src/ui/controllers/channels.ts","../../../ui/src/ui/controllers/debug.ts","../../../ui/src/ui/controllers/logs.ts","../../../node_modules/.pnpm/@noble+ed25519@3.0.0/node_modules/@noble/ed25519/index.js","../../../ui/src/ui/device-identity.ts","../../../ui/src/ui/device-auth.ts","../../../ui/src/ui/controllers/devices.ts","../../../ui/src/ui/controllers/nodes.ts","../../../ui/src/ui/controllers/exec-approvals.ts","../../../ui/src/ui/controllers/presence.ts","../../../ui/src/ui/controllers/skills.ts","../../../ui/src/ui/theme.ts","../../../ui/src/ui/theme-transition.ts","../../../ui/src/ui/app-polling.ts","../../../ui/src/ui/app-settings.ts","../../../ui/src/ui/app-chat.ts","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive-helpers.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/async-directive.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/ref.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/repeat.js","../../../ui/src/ui/chat/message-normalizer.ts","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/unsafe-html.js","../../../node_modules/.pnpm/dompurify@3.3.1/node_modules/dompurify/dist/purify.es.mjs","../../../node_modules/.pnpm/marked@17.0.1/node_modules/marked/lib/marked.esm.js","../../../ui/src/ui/markdown.ts","../../../ui/src/ui/chat/copy-as-markdown.ts","../../../ui/src/ui/tool-display.ts","../../../ui/src/ui/chat/constants.ts","../../../ui/src/ui/chat/tool-helpers.ts","../../../ui/src/ui/chat/tool-cards.ts","../../../ui/src/ui/chat/grouped-render.ts","../../../ui/src/ui/views/markdown-sidebar.ts","../../../ui/src/ui/components/resizable-divider.ts","../../../ui/src/ui/views/chat.ts","../../../ui/src/ui/views/config-form.shared.ts","../../../ui/src/ui/views/config-form.node.ts","../../../ui/src/ui/views/config-form.render.ts","../../../ui/src/ui/views/config-form.analyze.ts","../../../ui/src/ui/views/config.ts","../../../ui/src/ui/views/channels.shared.ts","../../../ui/src/ui/views/channels.config.ts","../../../ui/src/ui/views/channels.discord.ts","../../../ui/src/ui/views/channels.googlechat.ts","../../../ui/src/ui/views/channels.imessage.ts","../../../ui/src/ui/views/channels.nostr-profile-form.ts","../../../ui/src/ui/views/channels.nostr.ts","../../../ui/src/ui/views/channels.signal.ts","../../../ui/src/ui/views/channels.slack.ts","../../../ui/src/ui/views/channels.telegram.ts","../../../ui/src/ui/views/channels.whatsapp.ts","../../../ui/src/ui/views/channels.ts","../../../ui/src/ui/presenter.ts","../../../ui/src/ui/views/cron.ts","../../../ui/src/ui/views/debug.ts","../../../ui/src/ui/views/instances.ts","../../../ui/src/ui/views/logs.ts","../../../ui/src/ui/views/nodes.ts","../../../ui/src/ui/views/overview.ts","../../../ui/src/ui/views/sessions.ts","../../../ui/src/ui/views/exec-approval.ts","../../../ui/src/ui/views/gateway-url-confirmation.ts","../../../ui/src/ui/views/skills.ts","../../../ui/src/ui/app-render.helpers.ts","../../../ui/src/ui/app-render.ts","../../../ui/src/ui/app-defaults.ts","../../../ui/src/ui/controllers/agents.ts","../../../src/gateway/protocol/client-info.ts","../../../src/gateway/device-auth.ts","../../../ui/src/ui/gateway.ts","../../../ui/src/ui/controllers/exec-approval.ts","../../../ui/src/ui/controllers/assistant-identity.ts","../../../ui/src/ui/app-gateway.ts","../../../ui/src/ui/app-lifecycle.ts","../../../ui/src/ui/app-channels.ts","../../../ui/src/ui/app.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y 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,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?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),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(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,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&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[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.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(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(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!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{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 r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","const MAX_ASSISTANT_NAME = 50;\nconst MAX_ASSISTANT_AVATAR = 200;\n\nexport const DEFAULT_ASSISTANT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_AVATAR = \"A\";\n\nexport type AssistantIdentity = {\n agentId?: string | null;\n name: string;\n avatar: string | null;\n};\n\ndeclare global {\n interface Window {\n __OPENCLAW_ASSISTANT_NAME__?: string;\n __OPENCLAW_ASSISTANT_AVATAR__?: string;\n }\n}\n\nfunction coerceIdentityValue(value: string | undefined, maxLength: number): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (trimmed.length <= maxLength) return trimmed;\n return trimmed.slice(0, maxLength);\n}\n\nexport function normalizeAssistantIdentity(\n input?: Partial<AssistantIdentity> | null,\n): AssistantIdentity {\n const name =\n coerceIdentityValue(input?.name, MAX_ASSISTANT_NAME) ?? DEFAULT_ASSISTANT_NAME;\n const avatar = coerceIdentityValue(input?.avatar ?? undefined, MAX_ASSISTANT_AVATAR) ?? null;\n const agentId =\n typeof input?.agentId === \"string\" && input.agentId.trim()\n ? input.agentId.trim()\n : null;\n return { agentId, name, avatar };\n}\n\nexport function resolveInjectedAssistantIdentity(): AssistantIdentity {\n if (typeof window === \"undefined\") {\n return normalizeAssistantIdentity({});\n }\n return normalizeAssistantIdentity({\n name: window.__OPENCLAW_ASSISTANT_NAME__,\n avatar: window.__OPENCLAW_ASSISTANT_AVATAR__,\n });\n}\n","const KEY = \"openclaw.control.settings.v1\";\n\nimport type { ThemeMode } from \"./theme\";\n\nexport type UiSettings = {\n gatewayUrl: string;\n token: string;\n sessionKey: string;\n lastActiveSessionKey: string;\n theme: ThemeMode;\n chatFocusMode: boolean;\n chatShowThinking: boolean;\n splitRatio: number; // Sidebar split ratio (0.4 to 0.7, default 0.6)\n navCollapsed: boolean; // Collapsible sidebar state\n navGroupsCollapsed: Record<string, boolean>; // Which nav groups are collapsed\n};\n\nexport function loadSettings(): UiSettings {\n const defaultUrl = (() => {\n const proto = location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return `${proto}://${location.host}`;\n })();\n\n const defaults: UiSettings = {\n gatewayUrl: defaultUrl,\n token: \"\",\n sessionKey: \"main\",\n lastActiveSessionKey: \"main\",\n theme: \"system\",\n chatFocusMode: false,\n chatShowThinking: true,\n splitRatio: 0.6,\n navCollapsed: false,\n navGroupsCollapsed: {},\n };\n\n try {\n const raw = localStorage.getItem(KEY);\n if (!raw) return defaults;\n const parsed = JSON.parse(raw) as Partial<UiSettings>;\n return {\n gatewayUrl:\n typeof parsed.gatewayUrl === \"string\" && parsed.gatewayUrl.trim()\n ? parsed.gatewayUrl.trim()\n : defaults.gatewayUrl,\n token: typeof parsed.token === \"string\" ? parsed.token : defaults.token,\n sessionKey:\n typeof parsed.sessionKey === \"string\" && parsed.sessionKey.trim()\n ? parsed.sessionKey.trim()\n : defaults.sessionKey,\n lastActiveSessionKey:\n typeof parsed.lastActiveSessionKey === \"string\" &&\n parsed.lastActiveSessionKey.trim()\n ? parsed.lastActiveSessionKey.trim()\n : (typeof parsed.sessionKey === \"string\" &&\n parsed.sessionKey.trim()) ||\n defaults.lastActiveSessionKey,\n theme:\n parsed.theme === \"light\" ||\n parsed.theme === \"dark\" ||\n parsed.theme === \"system\"\n ? parsed.theme\n : defaults.theme,\n chatFocusMode:\n typeof parsed.chatFocusMode === \"boolean\"\n ? parsed.chatFocusMode\n : defaults.chatFocusMode,\n chatShowThinking:\n typeof parsed.chatShowThinking === \"boolean\"\n ? parsed.chatShowThinking\n : defaults.chatShowThinking,\n splitRatio:\n typeof parsed.splitRatio === \"number\" &&\n parsed.splitRatio >= 0.4 &&\n parsed.splitRatio <= 0.7\n ? parsed.splitRatio\n : defaults.splitRatio,\n navCollapsed:\n typeof parsed.navCollapsed === \"boolean\"\n ? parsed.navCollapsed\n : defaults.navCollapsed,\n navGroupsCollapsed:\n typeof parsed.navGroupsCollapsed === \"object\" &&\n parsed.navGroupsCollapsed !== null\n ? parsed.navGroupsCollapsed\n : defaults.navGroupsCollapsed,\n };\n } catch {\n return defaults;\n }\n}\n\nexport function saveSettings(next: UiSettings) {\n localStorage.setItem(KEY, JSON.stringify(next));\n}\n","export type ParsedAgentSessionKey = {\n agentId: string;\n rest: string;\n};\n\nexport function parseAgentSessionKey(\n sessionKey: string | undefined | null,\n): ParsedAgentSessionKey | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return null;\n const parts = raw.split(\":\").filter(Boolean);\n if (parts.length < 3) return null;\n if (parts[0] !== \"agent\") return null;\n const agentId = parts[1]?.trim();\n const rest = parts.slice(2).join(\":\");\n if (!agentId || !rest) return null;\n return { agentId, rest };\n}\n\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return false;\n if (raw.toLowerCase().startsWith(\"subagent:\")) return true;\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"subagent:\"));\n}\n\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return false;\n const normalized = raw.toLowerCase();\n if (normalized.startsWith(\"acp:\")) return true;\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"acp:\"));\n}\n\nconst THREAD_SESSION_MARKERS = [\":thread:\", \":topic:\"];\n\nexport function resolveThreadParentSessionKey(\n sessionKey: string | undefined | null,\n): string | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return null;\n const normalized = raw.toLowerCase();\n let idx = -1;\n for (const marker of THREAD_SESSION_MARKERS) {\n const candidate = normalized.lastIndexOf(marker);\n if (candidate > idx) idx = candidate;\n }\n if (idx <= 0) return null;\n const parent = raw.slice(0, idx).trim();\n return parent ? parent : null;\n}\n","import type { IconName } from \"./icons.js\";\n\nexport const TAB_GROUPS = [\n { label: \"对话\", tabs: [\"chat\"] },\n {\n label: \"控制台\",\n tabs: [\"overview\", \"channels\", \"instances\", \"sessions\", \"cron\"],\n },\n { label: \"代理\", tabs: [\"skills\", \"nodes\"] },\n { label: \"设置\", tabs: [\"config\", \"debug\", \"logs\"] },\n] as const;\n\nexport type Tab =\n | \"overview\"\n | \"channels\"\n | \"instances\"\n | \"sessions\"\n | \"cron\"\n | \"skills\"\n | \"nodes\"\n | \"chat\"\n | \"config\"\n | \"debug\"\n | \"logs\";\n\nconst TAB_PATHS: Record<Tab, string> = {\n overview: \"/overview\",\n channels: \"/channels\",\n instances: \"/instances\",\n sessions: \"/sessions\",\n cron: \"/cron\",\n skills: \"/skills\",\n nodes: \"/nodes\",\n chat: \"/chat\",\n config: \"/config\",\n debug: \"/debug\",\n logs: \"/logs\",\n};\n\nconst PATH_TO_TAB = new Map(\n Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab]),\n);\n\nexport function normalizeBasePath(basePath: string): string {\n if (!basePath) return \"\";\n let base = basePath.trim();\n if (!base.startsWith(\"/\")) base = `/${base}`;\n if (base === \"/\") return \"\";\n if (base.endsWith(\"/\")) base = base.slice(0, -1);\n return base;\n}\n\nexport function normalizePath(path: string): string {\n if (!path) return \"/\";\n let normalized = path.trim();\n if (!normalized.startsWith(\"/\")) normalized = `/${normalized}`;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nexport function pathForTab(tab: Tab, basePath = \"\"): string {\n const base = normalizeBasePath(basePath);\n const path = TAB_PATHS[tab];\n return base ? `${base}${path}` : path;\n}\n\nexport function tabFromPath(pathname: string, basePath = \"\"): Tab | null {\n const base = normalizeBasePath(basePath);\n let path = pathname || \"/\";\n if (base) {\n if (path === base) {\n path = \"/\";\n } else if (path.startsWith(`${base}/`)) {\n path = path.slice(base.length);\n }\n }\n let normalized = normalizePath(path).toLowerCase();\n if (normalized.endsWith(\"/index.html\")) normalized = \"/\";\n if (normalized === \"/\") return \"chat\";\n return PATH_TO_TAB.get(normalized) ?? null;\n}\n\nexport function inferBasePathFromPathname(pathname: string): string {\n let normalized = normalizePath(pathname);\n if (normalized.endsWith(\"/index.html\")) {\n normalized = normalizePath(normalized.slice(0, -\"/index.html\".length));\n }\n if (normalized === \"/\") return \"\";\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return \"\";\n for (let i = 0; i < segments.length; i++) {\n const candidate = `/${segments.slice(i).join(\"/\")}`.toLowerCase();\n if (PATH_TO_TAB.has(candidate)) {\n const prefix = segments.slice(0, i);\n return prefix.length ? `/${prefix.join(\"/\")}` : \"\";\n }\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function iconForTab(tab: Tab): IconName {\n switch (tab) {\n case \"chat\":\n return \"messageSquare\";\n case \"overview\":\n return \"barChart\";\n case \"channels\":\n return \"link\";\n case \"instances\":\n return \"radio\";\n case \"sessions\":\n return \"fileText\";\n case \"cron\":\n return \"loader\";\n case \"skills\":\n return \"zap\";\n case \"nodes\":\n return \"monitor\";\n case \"config\":\n return \"settings\";\n case \"debug\":\n return \"bug\";\n case \"logs\":\n return \"scrollText\";\n default:\n return \"folder\";\n }\n}\n\nexport function titleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"概览\";\n case \"channels\":\n return \"渠道\";\n case \"instances\":\n return \"实例\";\n case \"sessions\":\n return \"会话\";\n case \"cron\":\n return \"定时任务\";\n case \"skills\":\n return \"技能\";\n case \"nodes\":\n return \"节点\";\n case \"chat\":\n return \"对话\";\n case \"config\":\n return \"配置\";\n case \"debug\":\n return \"调试\";\n case \"logs\":\n return \"日志\";\n default:\n return \"控制\";\n }\n}\n\nexport function subtitleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"网关状态、入口点和快速健康检查。\";\n case \"channels\":\n return \"管理渠道和设置。\";\n case \"instances\":\n return \"来自已连接客户端和节点的存在信标。\";\n case \"sessions\":\n return \"检查活动会话并调整会话默认值。\";\n case \"cron\":\n return \"安排唤醒和定期代理运行。\";\n case \"skills\":\n return \"管理技能可用性和 API 密钥注入。\";\n case \"nodes\":\n return \"配对设备、功能和命令暴露。\";\n case \"chat\":\n return \"直接网关对话会话,用于快速干预。\";\n case \"config\":\n return \"安全编辑 ~/.openclaw/openclaw.json。\";\n case \"debug\":\n return \"网关快照、事件和手动 RPC 调用。\";\n case \"logs\":\n return \"网关文件日志的实时输出。\";\n default:\n return \"\";\n }\n}\n","import { html, type TemplateResult } from \"lit\";\n\n// Lucide-style SVG icons\n// All icons use currentColor for stroke\n\nexport const icons = {\n // Navigation icons\n messageSquare: html`<svg viewBox=\"0 0 24 24\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`,\n barChart: html`<svg viewBox=\"0 0 24 24\"><line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"10\"/><line x1=\"18\" x2=\"18\" y1=\"20\" y2=\"4\"/><line x1=\"6\" x2=\"6\" y1=\"20\" y2=\"16\"/></svg>`,\n link: html`<svg viewBox=\"0 0 24 24\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>`,\n radio: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"2\"/><path 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\"/></svg>`,\n fileText: html`<svg viewBox=\"0 0 24 24\"><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\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\"/><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\"/><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\"/></svg>`,\n zap: html`<svg viewBox=\"0 0 24 24\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg>`,\n monitor: html`<svg viewBox=\"0 0 24 24\"><rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/></svg>`,\n settings: html`<svg viewBox=\"0 0 24 24\"><path 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\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`,\n bug: html`<svg viewBox=\"0 0 24 24\"><path d=\"m8 2 1.88 1.88\"/><path d=\"M14.12 3.88 16 2\"/><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"/><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\"/><path d=\"M12 20v-9\"/><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"/><path d=\"M6 13H2\"/><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"/><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"/><path d=\"M22 13h-4\"/><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\"/></svg>`,\n scrollText: html`<svg viewBox=\"0 0 24 24\"><path d=\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\"/><path d=\"M19 17V5a2 2 0 0 0-2-2H4\"/><path d=\"M15 8h-5\"/><path d=\"M15 12h-5\"/></svg>`,\n folder: html`<svg viewBox=\"0 0 24 24\"><path 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\"/></svg>`,\n\n // UI icons\n menu: html`<svg viewBox=\"0 0 24 24\"><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/><line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\"/><line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\"/></svg>`,\n x: html`<svg viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n check: html`<svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"/></svg>`,\n copy: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`,\n search: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>`,\n brain: html`<svg viewBox=\"0 0 24 24\"><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\"/><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\"/><path d=\"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\"/><path d=\"M17.599 6.5a3 3 0 0 0 .399-1.375\"/><path d=\"M6.003 5.125A3 3 0 0 0 6.401 6.5\"/><path d=\"M3.477 10.896a4 4 0 0 1 .585-.396\"/><path d=\"M19.938 10.5a4 4 0 0 1 .585.396\"/><path d=\"M6 18a4 4 0 0 1-1.967-.516\"/><path d=\"M19.967 17.484A4 4 0 0 1 18 18\"/></svg>`,\n book: html`<svg viewBox=\"0 0 24 24\"><path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\"/></svg>`,\n loader: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 2v4\"/><path d=\"m16.2 7.8 2.9-2.9\"/><path d=\"M18 12h4\"/><path d=\"m16.2 16.2 2.9 2.9\"/><path d=\"M12 18v4\"/><path d=\"m4.9 19.1 2.9-2.9\"/><path d=\"M2 12h4\"/><path d=\"m4.9 4.9 2.9 2.9\"/></svg>`,\n\n // Tool icons\n wrench: html`<svg viewBox=\"0 0 24 24\"><path 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\"/></svg>`,\n fileCode: html`<svg viewBox=\"0 0 24 24\"><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\"/><polyline points=\"14 2 14 8 20 8\"/><path d=\"m10 13-2 2 2 2\"/><path d=\"m14 17 2-2-2-2\"/></svg>`,\n edit: html`<svg viewBox=\"0 0 24 24\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n penLine: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/></svg>`,\n paperclip: html`<svg viewBox=\"0 0 24 24\"><path 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\"/></svg>`,\n globe: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/></svg>`,\n image: html`<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n smartphone: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\"/><path d=\"M12 18h.01\"/></svg>`,\n plug: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 22v-5\"/><path d=\"M9 8V2\"/><path d=\"M15 8V2\"/><path d=\"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z\"/></svg>`,\n circle: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n puzzle: html`<svg viewBox=\"0 0 24 24\"><path 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\"/></svg>`,\n} as const;\n\nexport type IconName = keyof typeof icons;\n\nexport function icon(name: IconName): TemplateResult {\n return icons[name];\n}\n\nexport function renderIcon(name: IconName, className = \"nav-item__icon\"): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${icons[name]}</span>`;\n}\n\n// Legacy function for compatibility\nexport function renderEmojiIcon(iconContent: string | TemplateResult, className: string): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${iconContent}</span>`;\n}\n\nexport function setEmojiIcon(target: HTMLElement | null, icon: string): void {\n if (!target) return;\n target.textContent = icon;\n}\n","export type ReasoningTagMode = \"strict\" | \"preserve\";\nexport type ReasoningTagTrim = \"none\" | \"start\" | \"both\";\n\nconst QUICK_TAG_RE = /<\\s*\\/?\\s*(?:think(?:ing)?|thought|antthinking|final)\\b/i;\nconst FINAL_TAG_RE = /<\\s*\\/?\\s*final\\b[^<>]*>/gi;\nconst THINKING_TAG_RE = /<\\s*(\\/?)\\s*(?:think(?:ing)?|thought|antthinking)\\b[^<>]*>/gi;\n\ninterface CodeRegion {\n start: number;\n end: number;\n}\n\nfunction findCodeRegions(text: string): CodeRegion[] {\n const regions: CodeRegion[] = [];\n\n const fencedRe = /(^|\\n)(```|~~~)[^\\n]*\\n[\\s\\S]*?(?:\\n\\2(?:\\n|$)|$)/g;\n for (const match of text.matchAll(fencedRe)) {\n const start = (match.index ?? 0) + match[1].length;\n regions.push({ start, end: start + match[0].length - match[1].length });\n }\n\n const inlineRe = /`+[^`]+`+/g;\n for (const match of text.matchAll(inlineRe)) {\n const start = match.index ?? 0;\n const end = start + match[0].length;\n const insideFenced = regions.some((r) => start >= r.start && end <= r.end);\n if (!insideFenced) {\n regions.push({ start, end });\n }\n }\n\n regions.sort((a, b) => a.start - b.start);\n return regions;\n}\n\nfunction isInsideCode(pos: number, regions: CodeRegion[]): boolean {\n return regions.some((r) => pos >= r.start && pos < r.end);\n}\n\nfunction applyTrim(value: string, mode: ReasoningTagTrim): string {\n if (mode === \"none\") return value;\n if (mode === \"start\") return value.trimStart();\n return value.trim();\n}\n\nexport function stripReasoningTagsFromText(\n text: string,\n options?: {\n mode?: ReasoningTagMode;\n trim?: ReasoningTagTrim;\n },\n): string {\n if (!text) return text;\n if (!QUICK_TAG_RE.test(text)) return text;\n\n const mode = options?.mode ?? \"strict\";\n const trimMode = options?.trim ?? \"both\";\n\n let cleaned = text;\n if (FINAL_TAG_RE.test(cleaned)) {\n FINAL_TAG_RE.lastIndex = 0;\n const finalMatches: Array<{ start: number; length: number; inCode: boolean }> = [];\n const preCodeRegions = findCodeRegions(cleaned);\n for (const match of cleaned.matchAll(FINAL_TAG_RE)) {\n const start = match.index ?? 0;\n finalMatches.push({\n start,\n length: match[0].length,\n inCode: isInsideCode(start, preCodeRegions),\n });\n }\n\n for (let i = finalMatches.length - 1; i >= 0; i--) {\n const m = finalMatches[i];\n if (!m.inCode) {\n cleaned = cleaned.slice(0, m.start) + cleaned.slice(m.start + m.length);\n }\n }\n } else {\n FINAL_TAG_RE.lastIndex = 0;\n }\n\n const codeRegions = findCodeRegions(cleaned);\n\n THINKING_TAG_RE.lastIndex = 0;\n let result = \"\";\n let lastIndex = 0;\n let inThinking = false;\n\n for (const match of cleaned.matchAll(THINKING_TAG_RE)) {\n const idx = match.index ?? 0;\n const isClose = match[1] === \"/\";\n\n if (isInsideCode(idx, codeRegions)) {\n continue;\n }\n\n if (!inThinking) {\n result += cleaned.slice(lastIndex, idx);\n if (!isClose) {\n inThinking = true;\n }\n } else if (isClose) {\n inThinking = false;\n }\n\n lastIndex = idx + match[0].length;\n }\n\n if (!inThinking || mode === \"preserve\") {\n result += cleaned.slice(lastIndex);\n }\n\n return applyTrim(result, trimMode);\n}\n","import { stripReasoningTagsFromText } from \"../../../src/shared/text/reasoning-tags.js\";\n\nexport function formatMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n return new Date(ms).toLocaleString();\n}\n\nexport function formatAgo(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n const diff = Date.now() - ms;\n if (diff < 0) return \"just now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n return `${day}d ago`;\n}\n\nexport function formatDurationMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n if (ms < 1000) return `${ms}ms`;\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h`;\n const day = Math.round(hr / 24);\n return `${day}d`;\n}\n\nexport function formatList(values?: Array<string | null | undefined>): string {\n if (!values || values.length === 0) return \"none\";\n return values.filter((v): v is string => Boolean(v && v.trim())).join(\", \");\n}\n\nexport function clampText(value: string, max = 120): string {\n if (value.length <= max) return value;\n return `${value.slice(0, Math.max(0, max - 1))}…`;\n}\n\nexport function truncateText(value: string, max: number): {\n text: string;\n truncated: boolean;\n total: number;\n} {\n if (value.length <= max) {\n return { text: value, truncated: false, total: value.length };\n }\n return {\n text: value.slice(0, Math.max(0, max)),\n truncated: true,\n total: value.length,\n };\n}\n\nexport function toNumber(value: string, fallback: number): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function parseList(input: string): string[] {\n return input\n .split(/[,\\n]/)\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n}\n\nexport function stripThinkingTags(value: string): string {\n return stripReasoningTagsFromText(value, { mode: \"preserve\", trim: \"start\" });\n}\n","import { stripThinkingTags } from \"../format\";\n\nconst ENVELOPE_PREFIX = /^\\[([^\\]]+)\\]\\s*/;\nconst ENVELOPE_CHANNELS = [\n \"WebChat\",\n \"WhatsApp\",\n \"Telegram\",\n \"Signal\",\n \"Slack\",\n \"Discord\",\n \"iMessage\",\n \"Teams\",\n \"Matrix\",\n \"Zalo\",\n \"Zalo Personal\",\n \"BlueBubbles\",\n];\n\nconst textCache = new WeakMap<object, string | null>();\nconst thinkingCache = new WeakMap<object, string | null>();\n\nfunction looksLikeEnvelopeHeader(header: string): boolean {\n if (/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z\\b/.test(header)) return true;\n if (/\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}\\b/.test(header)) return true;\n return ENVELOPE_CHANNELS.some((label) => header.startsWith(`${label} `));\n}\n\nexport function stripEnvelope(text: string): string {\n const match = text.match(ENVELOPE_PREFIX);\n if (!match) return text;\n const header = match[1] ?? \"\";\n if (!looksLikeEnvelopeHeader(header)) return text;\n return text.slice(match[0].length);\n}\n\nexport function extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"\";\n const content = m.content;\n if (typeof content === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(content) : stripEnvelope(content);\n return processed;\n }\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) {\n const joined = parts.join(\"\\n\");\n const processed = role === \"assistant\" ? stripThinkingTags(joined) : stripEnvelope(joined);\n return processed;\n }\n }\n if (typeof m.text === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(m.text) : stripEnvelope(m.text);\n return processed;\n }\n return null;\n}\n\nexport function extractTextCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractText(message);\n const obj = message as object;\n if (textCache.has(obj)) return textCache.get(obj) ?? null;\n const value = extractText(message);\n textCache.set(obj, value);\n return value;\n}\n\nexport function extractThinking(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const parts: string[] = [];\n if (Array.isArray(content)) {\n for (const p of content) {\n const item = p as Record<string, unknown>;\n if (item.type === \"thinking\" && typeof item.thinking === \"string\") {\n const cleaned = item.thinking.trim();\n if (cleaned) parts.push(cleaned);\n }\n }\n }\n if (parts.length > 0) return parts.join(\"\\n\");\n\n // Back-compat: older logs may still have <think> tags inside text blocks.\n const rawText = extractRawText(message);\n if (!rawText) return null;\n const matches = [\n ...rawText.matchAll(\n /<\\s*think(?:ing)?\\s*>([\\s\\S]*?)<\\s*\\/\\s*think(?:ing)?\\s*>/gi,\n ),\n ];\n const extracted = matches\n .map((m) => (m[1] ?? \"\").trim())\n .filter(Boolean);\n return extracted.length > 0 ? extracted.join(\"\\n\") : null;\n}\n\nexport function extractThinkingCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractThinking(message);\n const obj = message as object;\n if (thinkingCache.has(obj)) return thinkingCache.get(obj) ?? null;\n const value = extractThinking(message);\n thinkingCache.set(obj, value);\n return value;\n}\n\nexport function extractRawText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n\nexport function formatReasoningMarkdown(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) return \"\";\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => `_${line}_`);\n return lines.length ? [\"_Reasoning:_\", ...lines].join(\"\\n\") : \"\";\n}\n","export type CryptoLike = {\n randomUUID?: (() => string) | undefined;\n getRandomValues?: ((array: Uint8Array) => Uint8Array) | undefined;\n};\n\nlet warnedWeakCrypto = false;\n\nfunction uuidFromBytes(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(\n 16,\n 20,\n )}-${hex.slice(20)}`;\n}\n\nfunction weakRandomBytes(): Uint8Array {\n const bytes = new Uint8Array(16);\n const now = Date.now();\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n bytes[0] ^= now & 0xff;\n bytes[1] ^= (now >>> 8) & 0xff;\n bytes[2] ^= (now >>> 16) & 0xff;\n bytes[3] ^= (now >>> 24) & 0xff;\n return bytes;\n}\n\nfunction warnWeakCryptoOnce() {\n if (warnedWeakCrypto) return;\n warnedWeakCrypto = true;\n console.warn(\"[uuid] crypto API missing; falling back to weak randomness\");\n}\n\nexport function generateUUID(cryptoLike: CryptoLike | null = globalThis.crypto): string {\n if (cryptoLike && typeof cryptoLike.randomUUID === \"function\") return cryptoLike.randomUUID();\n\n if (cryptoLike && typeof cryptoLike.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoLike.getRandomValues(bytes);\n return uuidFromBytes(bytes);\n }\n\n warnWeakCryptoOnce();\n return uuidFromBytes(weakRandomBytes());\n}\n","import { extractText } from \"../chat/message-extract\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport { generateUUID } from \"../uuid\";\nimport type { ChatAttachment } from \"../ui-types\";\n\nexport type ChatState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatThinkingLevel: string | null;\n chatSending: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatRunId: string | null;\n chatStream: string | null;\n chatStreamStartedAt: number | null;\n lastError: string | null;\n};\n\nexport type ChatEventPayload = {\n runId: string;\n sessionKey: string;\n state: \"delta\" | \"final\" | \"aborted\" | \"error\";\n message?: unknown;\n errorMessage?: string;\n};\n\nexport async function loadChatHistory(state: ChatState) {\n if (!state.client || !state.connected) return;\n state.chatLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"chat.history\", {\n sessionKey: state.sessionKey,\n limit: 200,\n })) as { messages?: unknown[]; thinkingLevel?: string | null };\n state.chatMessages = Array.isArray(res.messages) ? res.messages : [];\n state.chatThinkingLevel = res.thinkingLevel ?? null;\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.chatLoading = false;\n }\n}\n\nfunction dataUrlToBase64(dataUrl: string): { content: string; mimeType: string } | null {\n const match = /^data:([^;]+);base64,(.+)$/.exec(dataUrl);\n if (!match) return null;\n return { mimeType: match[1], content: match[2] };\n}\n\nexport async function sendChatMessage(\n state: ChatState,\n message: string,\n attachments?: ChatAttachment[],\n): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const msg = message.trim();\n const hasAttachments = attachments && attachments.length > 0;\n if (!msg && !hasAttachments) return false;\n\n const now = Date.now();\n\n // Build user message content blocks\n const contentBlocks: Array<{ type: string; text?: string; source?: unknown }> = [];\n if (msg) {\n contentBlocks.push({ type: \"text\", text: msg });\n }\n // Add image previews to the message for display\n if (hasAttachments) {\n for (const att of attachments) {\n contentBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: att.mimeType, data: att.dataUrl },\n });\n }\n }\n\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"user\",\n content: contentBlocks,\n timestamp: now,\n },\n ];\n\n state.chatSending = true;\n state.lastError = null;\n const runId = generateUUID();\n state.chatRunId = runId;\n state.chatStream = \"\";\n state.chatStreamStartedAt = now;\n\n // Convert attachments to API format\n const apiAttachments = hasAttachments\n ? attachments\n .map((att) => {\n const parsed = dataUrlToBase64(att.dataUrl);\n if (!parsed) return null;\n return {\n type: \"image\",\n mimeType: parsed.mimeType,\n content: parsed.content,\n };\n })\n .filter((a): a is NonNullable<typeof a> => a !== null)\n : undefined;\n\n try {\n await state.client.request(\"chat.send\", {\n sessionKey: state.sessionKey,\n message: msg,\n deliver: false,\n idempotencyKey: runId,\n attachments: apiAttachments,\n });\n return true;\n } catch (err) {\n const error = String(err);\n state.chatRunId = null;\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.lastError = error;\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Error: \" + error }],\n timestamp: Date.now(),\n },\n ];\n return false;\n } finally {\n state.chatSending = false;\n }\n}\n\nexport async function abortChatRun(state: ChatState): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const runId = state.chatRunId;\n try {\n await state.client.request(\n \"chat.abort\",\n runId\n ? { sessionKey: state.sessionKey, runId }\n : { sessionKey: state.sessionKey },\n );\n return true;\n } catch (err) {\n state.lastError = String(err);\n return false;\n }\n}\n\nexport function handleChatEvent(\n state: ChatState,\n payload?: ChatEventPayload,\n) {\n if (!payload) return null;\n if (payload.sessionKey !== state.sessionKey) return null;\n\n // Final from another run (e.g. sub-agent announce): refresh history to show new message.\n // See https://github.com/openclaw/openclaw/issues/1909\n if (\n payload.runId &&\n state.chatRunId &&\n payload.runId !== state.chatRunId\n ) {\n if (payload.state === \"final\") return \"final\";\n return null;\n }\n\n if (payload.state === \"delta\") {\n const next = extractText(payload.message);\n if (typeof next === \"string\") {\n const current = state.chatStream ?? \"\";\n if (!current || next.length >= current.length) {\n state.chatStream = next;\n }\n }\n } else if (payload.state === \"final\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"aborted\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"error\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n state.lastError = payload.errorMessage ?? \"chat error\";\n }\n return payload.state;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { toNumber } from \"../format\";\nimport type { SessionsListResult } from \"../types\";\n\nexport type SessionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n};\n\nexport async function loadSessions(\n state: SessionsState,\n overrides?: {\n activeMinutes?: number;\n limit?: number;\n includeGlobal?: boolean;\n includeUnknown?: boolean;\n },\n) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n const includeGlobal = overrides?.includeGlobal ?? state.sessionsIncludeGlobal;\n const includeUnknown = overrides?.includeUnknown ?? state.sessionsIncludeUnknown;\n const activeMinutes =\n overrides?.activeMinutes ?? toNumber(state.sessionsFilterActive, 0);\n const limit = overrides?.limit ?? toNumber(state.sessionsFilterLimit, 0);\n const params: Record<string, unknown> = {\n includeGlobal,\n includeUnknown,\n };\n if (activeMinutes > 0) params.activeMinutes = activeMinutes;\n if (limit > 0) params.limit = limit;\n const res = (await state.client.request(\"sessions.list\", params)) as\n | SessionsListResult\n | undefined;\n if (res) state.sessionsResult = res;\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n\nexport async function patchSession(\n state: SessionsState,\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n) {\n if (!state.client || !state.connected) return;\n const params: Record<string, unknown> = { key };\n if (\"label\" in patch) params.label = patch.label;\n if (\"thinkingLevel\" in patch) params.thinkingLevel = patch.thinkingLevel;\n if (\"verboseLevel\" in patch) params.verboseLevel = patch.verboseLevel;\n if (\"reasoningLevel\" in patch) params.reasoningLevel = patch.reasoningLevel;\n try {\n await state.client.request(\"sessions.patch\", params);\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n }\n}\n\nexport async function deleteSession(state: SessionsState, key: string) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n const confirmed = window.confirm(\n `Delete session \"${key}\"?\\n\\nDeletes the session entry and archives its transcript.`,\n );\n if (!confirmed) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n await state.client.request(\"sessions.delete\", { key, deleteTranscript: true });\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n","import { truncateText } from \"./format\";\n\nconst TOOL_STREAM_LIMIT = 50;\nconst TOOL_STREAM_THROTTLE_MS = 80;\nconst TOOL_OUTPUT_CHAR_LIMIT = 120_000;\n\nexport type AgentEventPayload = {\n runId: string;\n seq: number;\n stream: string;\n ts: number;\n sessionKey?: string;\n data: Record<string, unknown>;\n};\n\nexport type ToolStreamEntry = {\n toolCallId: string;\n runId: string;\n sessionKey?: string;\n name: string;\n args?: unknown;\n output?: string;\n startedAt: number;\n updatedAt: number;\n message: Record<string, unknown>;\n};\n\ntype ToolStreamHost = {\n sessionKey: string;\n chatRunId: string | null;\n toolStreamById: Map<string, ToolStreamEntry>;\n toolStreamOrder: string[];\n chatToolMessages: Record<string, unknown>[];\n toolStreamSyncTimer: number | null;\n};\n\nfunction extractToolOutputText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n const content = record.content;\n if (!Array.isArray(content)) return null;\n const parts = content\n .map((item) => {\n if (!item || typeof item !== \"object\") return null;\n const entry = item as Record<string, unknown>;\n if (entry.type === \"text\" && typeof entry.text === \"string\") return entry.text;\n return null;\n })\n .filter((part): part is string => Boolean(part));\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n\nfunction formatToolOutput(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const contentText = extractToolOutputText(value);\n let text: string;\n if (typeof value === \"string\") {\n text = value;\n } else if (contentText) {\n text = contentText;\n } else {\n try {\n text = JSON.stringify(value, null, 2);\n } catch {\n text = String(value);\n }\n }\n const truncated = truncateText(text, TOOL_OUTPUT_CHAR_LIMIT);\n if (!truncated.truncated) return truncated.text;\n return `${truncated.text}\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`;\n}\n\nfunction buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n content.push({\n type: \"toolcall\",\n name: entry.name,\n arguments: entry.args ?? {},\n });\n if (entry.output) {\n content.push({\n type: \"toolresult\",\n name: entry.name,\n text: entry.output,\n });\n }\n return {\n role: \"assistant\",\n toolCallId: entry.toolCallId,\n runId: entry.runId,\n content,\n timestamp: entry.startedAt,\n };\n}\n\nfunction trimToolStream(host: ToolStreamHost) {\n if (host.toolStreamOrder.length <= TOOL_STREAM_LIMIT) return;\n const overflow = host.toolStreamOrder.length - TOOL_STREAM_LIMIT;\n const removed = host.toolStreamOrder.splice(0, overflow);\n for (const id of removed) host.toolStreamById.delete(id);\n}\n\nfunction syncToolStreamMessages(host: ToolStreamHost) {\n host.chatToolMessages = host.toolStreamOrder\n .map((id) => host.toolStreamById.get(id)?.message)\n .filter((msg): msg is Record<string, unknown> => Boolean(msg));\n}\n\nexport function flushToolStreamSync(host: ToolStreamHost) {\n if (host.toolStreamSyncTimer != null) {\n clearTimeout(host.toolStreamSyncTimer);\n host.toolStreamSyncTimer = null;\n }\n syncToolStreamMessages(host);\n}\n\nexport function scheduleToolStreamSync(host: ToolStreamHost, force = false) {\n if (force) {\n flushToolStreamSync(host);\n return;\n }\n if (host.toolStreamSyncTimer != null) return;\n host.toolStreamSyncTimer = window.setTimeout(\n () => flushToolStreamSync(host),\n TOOL_STREAM_THROTTLE_MS,\n );\n}\n\nexport function resetToolStream(host: ToolStreamHost) {\n host.toolStreamById.clear();\n host.toolStreamOrder = [];\n host.chatToolMessages = [];\n flushToolStreamSync(host);\n}\n\nexport type CompactionStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\ntype CompactionHost = ToolStreamHost & {\n compactionStatus?: CompactionStatus | null;\n compactionClearTimer?: number | null;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nexport function handleCompactionEvent(host: CompactionHost, payload: AgentEventPayload) {\n const data = payload.data ?? {};\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n\n // Clear any existing timer\n if (host.compactionClearTimer != null) {\n window.clearTimeout(host.compactionClearTimer);\n host.compactionClearTimer = null;\n }\n\n if (phase === \"start\") {\n host.compactionStatus = {\n active: true,\n startedAt: Date.now(),\n completedAt: null,\n };\n } else if (phase === \"end\") {\n host.compactionStatus = {\n active: false,\n startedAt: host.compactionStatus?.startedAt ?? null,\n completedAt: Date.now(),\n };\n // Auto-clear the toast after duration\n host.compactionClearTimer = window.setTimeout(() => {\n host.compactionStatus = null;\n host.compactionClearTimer = null;\n }, COMPACTION_TOAST_DURATION_MS);\n }\n}\n\nexport function handleAgentEvent(host: ToolStreamHost, payload?: AgentEventPayload) {\n if (!payload) return;\n\n // Handle compaction events\n if (payload.stream === \"compaction\") {\n handleCompactionEvent(host as CompactionHost, payload);\n return;\n }\n\n if (payload.stream !== \"tool\") return;\n const sessionKey =\n typeof payload.sessionKey === \"string\" ? payload.sessionKey : undefined;\n if (sessionKey && sessionKey !== host.sessionKey) return;\n // Fallback: only accept session-less events for the active run.\n if (!sessionKey && host.chatRunId && payload.runId !== host.chatRunId) return;\n if (host.chatRunId && payload.runId !== host.chatRunId) return;\n if (!host.chatRunId) return;\n\n const data = payload.data ?? {};\n const toolCallId = typeof data.toolCallId === \"string\" ? data.toolCallId : \"\";\n if (!toolCallId) return;\n const name = typeof data.name === \"string\" ? data.name : \"tool\";\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n const args = phase === \"start\" ? data.args : undefined;\n const output =\n phase === \"update\"\n ? formatToolOutput(data.partialResult)\n : phase === \"result\"\n ? formatToolOutput(data.result)\n : undefined;\n\n const now = Date.now();\n let entry = host.toolStreamById.get(toolCallId);\n if (!entry) {\n entry = {\n toolCallId,\n runId: payload.runId,\n sessionKey,\n name,\n args,\n output,\n startedAt: typeof payload.ts === \"number\" ? payload.ts : now,\n updatedAt: now,\n message: {},\n };\n host.toolStreamById.set(toolCallId, entry);\n host.toolStreamOrder.push(toolCallId);\n } else {\n entry.name = name;\n if (args !== undefined) entry.args = args;\n if (output !== undefined) entry.output = output;\n entry.updatedAt = now;\n }\n\n entry.message = buildToolStreamMessage(entry);\n trimToolStream(host);\n scheduleToolStreamSync(host, phase === \"result\");\n}\n","type ScrollHost = {\n updateComplete: Promise<unknown>;\n querySelector: (selectors: string) => Element | null;\n style: CSSStyleDeclaration;\n chatScrollFrame: number | null;\n chatScrollTimeout: number | null;\n chatHasAutoScrolled: boolean;\n chatUserNearBottom: boolean;\n logsScrollFrame: number | null;\n logsAtBottom: boolean;\n topbarObserver: ResizeObserver | null;\n};\n\nexport function scheduleChatScroll(host: ScrollHost, force = false) {\n if (host.chatScrollFrame) cancelAnimationFrame(host.chatScrollFrame);\n if (host.chatScrollTimeout != null) {\n clearTimeout(host.chatScrollTimeout);\n host.chatScrollTimeout = null;\n }\n const pickScrollTarget = () => {\n const container = host.querySelector(\".chat-thread\") as HTMLElement | null;\n if (container) {\n const overflowY = getComputedStyle(container).overflowY;\n const canScroll =\n overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n container.scrollHeight - container.clientHeight > 1;\n if (canScroll) return container;\n }\n return (document.scrollingElement ?? document.documentElement) as HTMLElement | null;\n };\n // Wait for Lit render to complete, then scroll\n void host.updateComplete.then(() => {\n host.chatScrollFrame = requestAnimationFrame(() => {\n host.chatScrollFrame = null;\n const target = pickScrollTarget();\n if (!target) return;\n const distanceFromBottom =\n target.scrollHeight - target.scrollTop - target.clientHeight;\n const shouldStick = force || host.chatUserNearBottom || distanceFromBottom < 200;\n if (!shouldStick) return;\n if (force) host.chatHasAutoScrolled = true;\n target.scrollTop = target.scrollHeight;\n host.chatUserNearBottom = true;\n const retryDelay = force ? 150 : 120;\n host.chatScrollTimeout = window.setTimeout(() => {\n host.chatScrollTimeout = null;\n const latest = pickScrollTarget();\n if (!latest) return;\n const latestDistanceFromBottom =\n latest.scrollHeight - latest.scrollTop - latest.clientHeight;\n const shouldStickRetry =\n force || host.chatUserNearBottom || latestDistanceFromBottom < 200;\n if (!shouldStickRetry) return;\n latest.scrollTop = latest.scrollHeight;\n host.chatUserNearBottom = true;\n }, retryDelay);\n });\n });\n}\n\nexport function scheduleLogsScroll(host: ScrollHost, force = false) {\n if (host.logsScrollFrame) cancelAnimationFrame(host.logsScrollFrame);\n void host.updateComplete.then(() => {\n host.logsScrollFrame = requestAnimationFrame(() => {\n host.logsScrollFrame = null;\n const container = host.querySelector(\".log-stream\") as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n const shouldStick = force || distanceFromBottom < 80;\n if (!shouldStick) return;\n container.scrollTop = container.scrollHeight;\n });\n });\n}\n\nexport function handleChatScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n host.chatUserNearBottom = distanceFromBottom < 200;\n}\n\nexport function handleLogsScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n host.logsAtBottom = distanceFromBottom < 80;\n}\n\nexport function resetChatScroll(host: ScrollHost) {\n host.chatHasAutoScrolled = false;\n host.chatUserNearBottom = true;\n}\n\nexport function exportLogs(lines: string[], label: string) {\n if (lines.length === 0) return;\n const blob = new Blob([`${lines.join(\"\\n\")}\\n`], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, \"-\");\n anchor.href = url;\n anchor.download = `openclaw-logs-${label}-${stamp}.log`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function observeTopbar(host: ScrollHost) {\n if (typeof ResizeObserver === \"undefined\") return;\n const topbar = host.querySelector(\".topbar\");\n if (!topbar) return;\n const update = () => {\n const { height } = topbar.getBoundingClientRect();\n host.style.setProperty(\"--topbar-height\", `${height}px`);\n };\n update();\n host.topbarObserver = new ResizeObserver(() => update());\n host.topbarObserver.observe(topbar);\n}\n","export function cloneConfigObject<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function serializeConfigForm(form: Record<string, unknown>): string {\n return `${JSON.stringify(form, null, 2).trimEnd()}\\n`;\n}\n\nexport function setPathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n value: unknown,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n const nextKey = path[i + 1];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n if (current[key] == null) {\n current[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n const record = current as Record<string, unknown>;\n if (record[key] == null) {\n record[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = record[key] as Record<string, unknown> | unknown[];\n }\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current[lastKey] = value;\n return;\n }\n if (typeof current === \"object\" && current != null) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n}\n\nexport function removePathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n current = (current as Record<string, unknown>)[key] as\n | Record<string, unknown>\n | unknown[];\n }\n if (current == null) return;\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current.splice(lastKey, 1);\n return;\n }\n if (typeof current === \"object\" && current != null) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type {\n ConfigSchemaResponse,\n ConfigSnapshot,\n ConfigUiHints,\n} from \"../types\";\nimport {\n cloneConfigObject,\n removePathValue,\n serializeConfigForm,\n setPathValue,\n} from \"./config/form-utils\";\n\nexport type ConfigState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n applySessionKey: string;\n configLoading: boolean;\n configRaw: string;\n configRawOriginal: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configApplying: boolean;\n updateRunning: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaVersion: string | null;\n configSchemaLoading: boolean;\n configUiHints: ConfigUiHints;\n configForm: Record<string, unknown> | null;\n configFormOriginal: Record<string, unknown> | null;\n configFormDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n configSearchQuery: string;\n configActiveSection: string | null;\n configActiveSubsection: string | null;\n lastError: string | null;\n};\n\nexport async function loadConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n applyConfigSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configLoading = false;\n }\n}\n\nexport async function loadConfigSchema(state: ConfigState) {\n if (!state.client || !state.connected) return;\n if (state.configSchemaLoading) return;\n state.configSchemaLoading = true;\n try {\n const res = (await state.client.request(\n \"config.schema\",\n {},\n )) as ConfigSchemaResponse;\n applyConfigSchema(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSchemaLoading = false;\n }\n}\n\nexport function applyConfigSchema(\n state: ConfigState,\n res: ConfigSchemaResponse,\n) {\n state.configSchema = res.schema ?? null;\n state.configUiHints = res.uiHints ?? {};\n state.configSchemaVersion = res.version ?? null;\n}\n\nexport function applyConfigSnapshot(state: ConfigState, snapshot: ConfigSnapshot) {\n state.configSnapshot = snapshot;\n const rawFromSnapshot =\n typeof snapshot.raw === \"string\"\n ? snapshot.raw\n : snapshot.config && typeof snapshot.config === \"object\"\n ? serializeConfigForm(snapshot.config as Record<string, unknown>)\n : state.configRaw;\n if (!state.configFormDirty || state.configFormMode === \"raw\") {\n state.configRaw = rawFromSnapshot;\n } else if (state.configForm) {\n state.configRaw = serializeConfigForm(state.configForm);\n } else {\n state.configRaw = rawFromSnapshot;\n }\n state.configValid = typeof snapshot.valid === \"boolean\" ? snapshot.valid : null;\n state.configIssues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n\n if (!state.configFormDirty) {\n state.configForm = cloneConfigObject(snapshot.config ?? {});\n state.configFormOriginal = cloneConfigObject(snapshot.config ?? {});\n state.configRawOriginal = rawFromSnapshot;\n }\n}\n\nexport async function saveConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configSaving = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.set\", { raw, baseHash });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSaving = false;\n }\n}\n\nexport async function applyConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configApplying = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.apply\", {\n raw,\n baseHash,\n sessionKey: state.applySessionKey,\n });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configApplying = false;\n }\n}\n\nexport async function runUpdate(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.updateRunning = true;\n state.lastError = null;\n try {\n await state.client.request(\"update.run\", {\n sessionKey: state.applySessionKey,\n });\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.updateRunning = false;\n }\n}\n\nexport function updateConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n setPathValue(base, path, value);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n\nexport function removeConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n removePathValue(base, path);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n","import { toNumber } from \"../format\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n};\n\nexport async function loadCronStatus(state: CronState) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.status\", {})) as CronStatus;\n state.cronStatus = res;\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\nexport async function loadCronJobs(state: CronState) {\n if (!state.client || !state.connected) return;\n if (state.cronLoading) return;\n state.cronLoading = true;\n state.cronError = null;\n try {\n const res = (await state.client.request(\"cron.list\", {\n includeDisabled: true,\n })) as { jobs?: CronJob[] };\n state.cronJobs = Array.isArray(res.jobs) ? res.jobs : [];\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronLoading = false;\n }\n}\n\nexport function buildCronSchedule(form: CronFormState) {\n if (form.scheduleKind === \"at\") {\n const ms = Date.parse(form.scheduleAt);\n if (!Number.isFinite(ms)) throw new Error(\"Invalid run time.\");\n return { kind: \"at\" as const, atMs: ms };\n }\n if (form.scheduleKind === \"every\") {\n const amount = toNumber(form.everyAmount, 0);\n if (amount <= 0) throw new Error(\"Invalid interval amount.\");\n const unit = form.everyUnit;\n const mult = unit === \"minutes\" ? 60_000 : unit === \"hours\" ? 3_600_000 : 86_400_000;\n return { kind: \"every\" as const, everyMs: amount * mult };\n }\n const expr = form.cronExpr.trim();\n if (!expr) throw new Error(\"Cron expression required.\");\n return { kind: \"cron\" as const, expr, tz: form.cronTz.trim() || undefined };\n}\n\nexport function buildCronPayload(form: CronFormState) {\n if (form.payloadKind === \"systemEvent\") {\n const text = form.payloadText.trim();\n if (!text) throw new Error(\"System event text required.\");\n return { kind: \"systemEvent\" as const, text };\n }\n const message = form.payloadText.trim();\n if (!message) throw new Error(\"Agent message required.\");\n const payload: {\n kind: \"agentTurn\";\n message: string;\n deliver?: boolean;\n channel?: string;\n to?: string;\n timeoutSeconds?: number;\n } = { kind: \"agentTurn\", message };\n if (form.deliver) payload.deliver = true;\n if (form.channel) payload.channel = form.channel;\n if (form.to.trim()) payload.to = form.to.trim();\n const timeoutSeconds = toNumber(form.timeoutSeconds, 0);\n if (timeoutSeconds > 0) payload.timeoutSeconds = timeoutSeconds;\n return payload;\n}\n\nexport async function addCronJob(state: CronState) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n const schedule = buildCronSchedule(state.cronForm);\n const payload = buildCronPayload(state.cronForm);\n const agentId = state.cronForm.agentId.trim();\n const job = {\n name: state.cronForm.name.trim(),\n description: state.cronForm.description.trim() || undefined,\n agentId: agentId || undefined,\n enabled: state.cronForm.enabled,\n schedule,\n sessionTarget: state.cronForm.sessionTarget,\n wakeMode: state.cronForm.wakeMode,\n payload,\n isolation:\n state.cronForm.postToMainPrefix.trim() &&\n state.cronForm.sessionTarget === \"isolated\"\n ? { postToMainPrefix: state.cronForm.postToMainPrefix.trim() }\n : undefined,\n };\n if (!job.name) throw new Error(\"Name required.\");\n await state.client.request(\"cron.add\", job);\n state.cronForm = {\n ...state.cronForm,\n name: \"\",\n description: \"\",\n payloadText: \"\",\n };\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function toggleCronJob(\n state: CronState,\n job: CronJob,\n enabled: boolean,\n) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.update\", { id: job.id, patch: { enabled } });\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function runCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.run\", { id: job.id, mode: \"force\" });\n await loadCronRuns(state, job.id);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function removeCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.remove\", { id: job.id });\n if (state.cronRunsJobId === job.id) {\n state.cronRunsJobId = null;\n state.cronRuns = [];\n }\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function loadCronRuns(state: CronState, jobId: string) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.runs\", {\n id: jobId,\n limit: 50,\n })) as { entries?: CronRunLogEntry[] };\n state.cronRunsJobId = jobId;\n state.cronRuns = Array.isArray(res.entries) ? res.entries : [];\n } catch (err) {\n state.cronError = String(err);\n }\n}\n","import type { ChannelsStatusSnapshot } from \"../types\";\nimport type { ChannelsState } from \"./channels.types\";\n\nexport type { ChannelsState };\n\nexport async function loadChannels(state: ChannelsState, probe: boolean) {\n if (!state.client || !state.connected) return;\n if (state.channelsLoading) return;\n state.channelsLoading = true;\n state.channelsError = null;\n try {\n const res = (await state.client.request(\"channels.status\", {\n probe,\n timeoutMs: 8000,\n })) as ChannelsStatusSnapshot;\n state.channelsSnapshot = res;\n state.channelsLastSuccess = Date.now();\n } catch (err) {\n state.channelsError = String(err);\n } finally {\n state.channelsLoading = false;\n }\n}\n\nexport async function startWhatsAppLogin(state: ChannelsState, force: boolean) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.start\", {\n force,\n timeoutMs: 30000,\n })) as { message?: string; qrDataUrl?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function waitWhatsAppLogin(state: ChannelsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.wait\", {\n timeoutMs: 120000,\n })) as { connected?: boolean; message?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginConnected = res.connected ?? null;\n if (res.connected) state.whatsappLoginQrDataUrl = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function logoutWhatsApp(state: ChannelsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n await state.client.request(\"channels.logout\", { channel: \"whatsapp\" });\n state.whatsappLoginMessage = \"Logged out.\";\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n } finally {\n state.whatsappBusy = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { HealthSnapshot, StatusSummary } from \"../types\";\n\nexport type DebugState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n};\n\nexport async function loadDebug(state: DebugState) {\n if (!state.client || !state.connected) return;\n if (state.debugLoading) return;\n state.debugLoading = true;\n try {\n const [status, health, models, heartbeat] = await Promise.all([\n state.client.request(\"status\", {}),\n state.client.request(\"health\", {}),\n state.client.request(\"models.list\", {}),\n state.client.request(\"last-heartbeat\", {}),\n ]);\n state.debugStatus = status as StatusSummary;\n state.debugHealth = health as HealthSnapshot;\n const modelPayload = models as { models?: unknown[] } | undefined;\n state.debugModels = Array.isArray(modelPayload?.models)\n ? modelPayload?.models\n : [];\n state.debugHeartbeat = heartbeat as unknown;\n } catch (err) {\n state.debugCallError = String(err);\n } finally {\n state.debugLoading = false;\n }\n}\n\nexport async function callDebugMethod(state: DebugState) {\n if (!state.client || !state.connected) return;\n state.debugCallError = null;\n state.debugCallResult = null;\n try {\n const params = state.debugCallParams.trim()\n ? (JSON.parse(state.debugCallParams) as unknown)\n : {};\n const res = await state.client.request(state.debugCallMethod.trim(), params);\n state.debugCallResult = JSON.stringify(res, null, 2);\n } catch (err) {\n state.debugCallError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nexport type LogsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n logsLoading: boolean;\n logsError: string | null;\n logsCursor: number | null;\n logsFile: string | null;\n logsEntries: LogEntry[];\n logsTruncated: boolean;\n logsLastFetchAt: number | null;\n logsLimit: number;\n logsMaxBytes: number;\n};\n\nconst LOG_BUFFER_LIMIT = 2000;\nconst LEVELS = new Set<LogLevel>([\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n]);\n\nfunction parseMaybeJsonString(value: unknown) {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction normalizeLevel(value: unknown): LogLevel | null {\n if (typeof value !== \"string\") return null;\n const lowered = value.toLowerCase() as LogLevel;\n return LEVELS.has(lowered) ? lowered : null;\n}\n\nexport function parseLogLine(line: string): LogEntry {\n if (!line.trim()) return { raw: line, message: line };\n try {\n const obj = JSON.parse(line) as Record<string, unknown>;\n const meta =\n obj && typeof obj._meta === \"object\" && obj._meta !== null\n ? (obj._meta as Record<string, unknown>)\n : null;\n const time =\n typeof obj.time === \"string\"\n ? obj.time\n : typeof meta?.date === \"string\"\n ? meta?.date\n : null;\n const level = normalizeLevel(meta?.logLevelName ?? meta?.level);\n\n const contextCandidate =\n typeof obj[\"0\"] === \"string\"\n ? (obj[\"0\"] as string)\n : typeof meta?.name === \"string\"\n ? (meta?.name as string)\n : null;\n const contextObj = parseMaybeJsonString(contextCandidate);\n let subsystem: string | null = null;\n if (contextObj) {\n if (typeof contextObj.subsystem === \"string\") subsystem = contextObj.subsystem;\n else if (typeof contextObj.module === \"string\") subsystem = contextObj.module;\n }\n if (!subsystem && contextCandidate && contextCandidate.length < 120) {\n subsystem = contextCandidate;\n }\n\n let message: string | null = null;\n if (typeof obj[\"1\"] === \"string\") message = obj[\"1\"] as string;\n else if (!contextObj && typeof obj[\"0\"] === \"string\") message = obj[\"0\"] as string;\n else if (typeof obj.message === \"string\") message = obj.message as string;\n\n return {\n raw: line,\n time,\n level,\n subsystem,\n message: message ?? line,\n meta: meta ?? undefined,\n };\n } catch {\n return { raw: line, message: line };\n }\n}\n\nexport async function loadLogs(\n state: LogsState,\n opts?: { reset?: boolean; quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.logsLoading && !opts?.quiet) return;\n if (!opts?.quiet) state.logsLoading = true;\n state.logsError = null;\n try {\n const res = await state.client.request(\"logs.tail\", {\n cursor: opts?.reset ? undefined : state.logsCursor ?? undefined,\n limit: state.logsLimit,\n maxBytes: state.logsMaxBytes,\n });\n const payload = res as {\n file?: string;\n cursor?: number;\n size?: number;\n lines?: unknown;\n truncated?: boolean;\n reset?: boolean;\n };\n const lines = Array.isArray(payload.lines)\n ? (payload.lines.filter((line) => typeof line === \"string\") as string[])\n : [];\n const entries = lines.map(parseLogLine);\n const shouldReset = Boolean(opts?.reset || payload.reset || state.logsCursor == null);\n state.logsEntries = shouldReset\n ? entries\n : [...state.logsEntries, ...entries].slice(-LOG_BUFFER_LIMIT);\n if (typeof payload.cursor === \"number\") state.logsCursor = payload.cursor;\n if (typeof payload.file === \"string\") state.logsFile = payload.file;\n state.logsTruncated = Boolean(payload.truncated);\n state.logsLastFetchAt = Date.now();\n } catch (err) {\n state.logsError = String(err);\n } finally {\n if (!opts?.quiet) state.logsLoading = false;\n }\n}\n","/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y²\n const u = M(y2 - 1n); // u=y²-1\n const v = M(d * y2 + 1n); // v=dy²+1\n let { isValid, value: x } = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X²\n const Y2 = M(Y * Y); // Y²\n const Z2 = M(Z * Z); // Z²\n const Z4 = M(Z2 * Z2); // Z⁴\n const aX2 = M(X2 * a); // aX²\n const left = M(Z2 * M(aX2 + Y2)); // (aX² + Y²)Z²\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // √-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v³\n const v7 = M(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv⁷)^(p-5)/8\n let x = M(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = M(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n","import { getPublicKeyAsync, signAsync, utils } from \"@noble/ed25519\";\n\ntype StoredIdentity = {\n version: 1;\n deviceId: string;\n publicKey: string;\n privateKey: string;\n createdAtMs: number;\n};\n\nexport type DeviceIdentity = {\n deviceId: string;\n publicKey: string;\n privateKey: string;\n};\n\nconst STORAGE_KEY = \"openclaw-device-identity-v1\";\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(input: string): Uint8Array {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const binary = atob(padded);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) out[i] = binary.charCodeAt(i);\n return out;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nasync function fingerprintPublicKey(publicKey: Uint8Array): Promise<string> {\n const hash = await crypto.subtle.digest(\"SHA-256\", publicKey);\n return bytesToHex(new Uint8Array(hash));\n}\n\nasync function generateIdentity(): Promise<DeviceIdentity> {\n const privateKey = utils.randomSecretKey();\n const publicKey = await getPublicKeyAsync(privateKey);\n const deviceId = await fingerprintPublicKey(publicKey);\n return {\n deviceId,\n publicKey: base64UrlEncode(publicKey),\n privateKey: base64UrlEncode(privateKey),\n };\n}\n\nexport async function loadOrCreateDeviceIdentity(): Promise<DeviceIdentity> {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as StoredIdentity;\n if (\n parsed?.version === 1 &&\n typeof parsed.deviceId === \"string\" &&\n typeof parsed.publicKey === \"string\" &&\n typeof parsed.privateKey === \"string\"\n ) {\n const derivedId = await fingerprintPublicKey(base64UrlDecode(parsed.publicKey));\n if (derivedId !== parsed.deviceId) {\n const updated: StoredIdentity = {\n ...parsed,\n deviceId: derivedId,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n return {\n deviceId: derivedId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n return {\n deviceId: parsed.deviceId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n }\n } catch {\n // fall through to regenerate\n }\n\n const identity = await generateIdentity();\n const stored: StoredIdentity = {\n version: 1,\n deviceId: identity.deviceId,\n publicKey: identity.publicKey,\n privateKey: identity.privateKey,\n createdAtMs: Date.now(),\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n return identity;\n}\n\nexport async function signDevicePayload(privateKeyBase64Url: string, payload: string) {\n const key = base64UrlDecode(privateKeyBase64Url);\n const data = new TextEncoder().encode(payload);\n const sig = await signAsync(data, key);\n return base64UrlEncode(sig);\n}\n","export type DeviceAuthEntry = {\n token: string;\n role: string;\n scopes: string[];\n updatedAtMs: number;\n};\n\ntype DeviceAuthStore = {\n version: 1;\n deviceId: string;\n tokens: Record<string, DeviceAuthEntry>;\n};\n\nconst STORAGE_KEY = \"openclaw.device.auth.v1\";\n\nfunction normalizeRole(role: string): string {\n return role.trim();\n}\n\nfunction normalizeScopes(scopes: string[] | undefined): string[] {\n if (!Array.isArray(scopes)) return [];\n const out = new Set<string>();\n for (const scope of scopes) {\n const trimmed = scope.trim();\n if (trimmed) out.add(trimmed);\n }\n return [...out].sort();\n}\n\nfunction readStore(): DeviceAuthStore | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DeviceAuthStore;\n if (!parsed || parsed.version !== 1) return null;\n if (!parsed.deviceId || typeof parsed.deviceId !== \"string\") return null;\n if (!parsed.tokens || typeof parsed.tokens !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStore(store: DeviceAuthStore) {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(store));\n } catch {\n // best-effort\n }\n}\n\nexport function loadDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n}): DeviceAuthEntry | null {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return null;\n const role = normalizeRole(params.role);\n const entry = store.tokens[role];\n if (!entry || typeof entry.token !== \"string\") return null;\n return entry;\n}\n\nexport function storeDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n token: string;\n scopes?: string[];\n}): DeviceAuthEntry {\n const role = normalizeRole(params.role);\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: params.deviceId,\n tokens: {},\n };\n const existing = readStore();\n if (existing && existing.deviceId === params.deviceId) {\n next.tokens = { ...existing.tokens };\n }\n const entry: DeviceAuthEntry = {\n token: params.token,\n role,\n scopes: normalizeScopes(params.scopes),\n updatedAtMs: Date.now(),\n };\n next.tokens[role] = entry;\n writeStore(next);\n return entry;\n}\n\nexport function clearDeviceAuthToken(params: { deviceId: string; role: string }) {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return;\n const role = normalizeRole(params.role);\n if (!store.tokens[role]) return;\n const next = { ...store, tokens: { ...store.tokens } };\n delete next.tokens[role];\n writeStore(next);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { loadOrCreateDeviceIdentity } from \"../device-identity\";\nimport { clearDeviceAuthToken, storeDeviceAuthToken } from \"../device-auth\";\n\nexport type DeviceTokenSummary = {\n role: string;\n scopes?: string[];\n createdAtMs?: number;\n rotatedAtMs?: number;\n revokedAtMs?: number;\n lastUsedAtMs?: number;\n};\n\nexport type PendingDevice = {\n requestId: string;\n deviceId: string;\n displayName?: string;\n role?: string;\n remoteIp?: string;\n isRepair?: boolean;\n ts?: number;\n};\n\nexport type PairedDevice = {\n deviceId: string;\n displayName?: string;\n roles?: string[];\n scopes?: string[];\n remoteIp?: string;\n tokens?: DeviceTokenSummary[];\n createdAtMs?: number;\n approvedAtMs?: number;\n};\n\nexport type DevicePairingList = {\n pending: PendingDevice[];\n paired: PairedDevice[];\n};\n\nexport type DevicesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n devicesLoading: boolean;\n devicesError: string | null;\n devicesList: DevicePairingList | null;\n};\n\nexport async function loadDevices(state: DevicesState, opts?: { quiet?: boolean }) {\n if (!state.client || !state.connected) return;\n if (state.devicesLoading) return;\n state.devicesLoading = true;\n if (!opts?.quiet) state.devicesError = null;\n try {\n const res = (await state.client.request(\"device.pair.list\", {})) as DevicePairingList | null;\n state.devicesList = {\n pending: Array.isArray(res?.pending) ? res!.pending : [],\n paired: Array.isArray(res?.paired) ? res!.paired : [],\n };\n } catch (err) {\n if (!opts?.quiet) state.devicesError = String(err);\n } finally {\n state.devicesLoading = false;\n }\n}\n\nexport async function approveDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n try {\n await state.client.request(\"device.pair.approve\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rejectDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\"Reject this device pairing request?\");\n if (!confirmed) return;\n try {\n await state.client.request(\"device.pair.reject\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rotateDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string; scopes?: string[] },\n) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"device.token.rotate\", params)) as\n | { token?: string; role?: string; deviceId?: string; scopes?: string[] }\n | undefined;\n if (res?.token) {\n const identity = await loadOrCreateDeviceIdentity();\n const role = res.role ?? params.role;\n if (res.deviceId === identity.deviceId || params.deviceId === identity.deviceId) {\n storeDeviceAuthToken({\n deviceId: identity.deviceId,\n role,\n token: res.token,\n scopes: res.scopes ?? params.scopes ?? [],\n });\n }\n window.prompt(\"New device token (copy and store securely):\", res.token);\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function revokeDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string },\n) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\n `Revoke token for ${params.deviceId} (${params.role})?`,\n );\n if (!confirmed) return;\n try {\n await state.client.request(\"device.token.revoke\", params);\n const identity = await loadOrCreateDeviceIdentity();\n if (params.deviceId === identity.deviceId) {\n clearDeviceAuthToken({ deviceId: identity.deviceId, role: params.role });\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type NodesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n lastError: string | null;\n};\n\nexport async function loadNodes(\n state: NodesState,\n opts?: { quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.nodesLoading) return;\n state.nodesLoading = true;\n if (!opts?.quiet) state.lastError = null;\n try {\n const res = (await state.client.request(\"node.list\", {})) as {\n nodes?: Array<Record<string, unknown>>;\n };\n state.nodes = Array.isArray(res.nodes) ? res.nodes : [];\n } catch (err) {\n if (!opts?.quiet) state.lastError = String(err);\n } finally {\n state.nodesLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { cloneConfigObject, removePathValue, setPathValue } from \"./config/form-utils\";\n\nexport type ExecApprovalsDefaults = {\n security?: string;\n ask?: string;\n askFallback?: string;\n autoAllowSkills?: boolean;\n};\n\nexport type ExecApprovalsAllowlistEntry = {\n id?: string;\n pattern: string;\n lastUsedAt?: number;\n lastUsedCommand?: string;\n lastResolvedPath?: string;\n};\n\nexport type ExecApprovalsAgent = ExecApprovalsDefaults & {\n allowlist?: ExecApprovalsAllowlistEntry[];\n};\n\nexport type ExecApprovalsFile = {\n version?: number;\n socket?: { path?: string };\n defaults?: ExecApprovalsDefaults;\n agents?: Record<string, ExecApprovalsAgent>;\n};\n\nexport type ExecApprovalsSnapshot = {\n path: string;\n exists: boolean;\n hash: string;\n file: ExecApprovalsFile;\n};\n\nexport type ExecApprovalsTarget =\n | { kind: \"gateway\" }\n | { kind: \"node\"; nodeId: string };\n\nexport type ExecApprovalsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n execApprovalsLoading: boolean;\n execApprovalsSaving: boolean;\n execApprovalsDirty: boolean;\n execApprovalsSnapshot: ExecApprovalsSnapshot | null;\n execApprovalsForm: ExecApprovalsFile | null;\n execApprovalsSelectedAgent: string | null;\n lastError: string | null;\n};\n\nfunction resolveExecApprovalsRpc(target?: ExecApprovalsTarget | null): {\n method: string;\n params: Record<string, unknown>;\n} | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.get\", params: {} };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.get\", params: { nodeId } };\n}\n\nfunction resolveExecApprovalsSaveRpc(\n target: ExecApprovalsTarget | null | undefined,\n params: { file: ExecApprovalsFile; baseHash: string },\n): { method: string; params: Record<string, unknown> } | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.set\", params };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.set\", params: { ...params, nodeId } };\n}\n\nexport async function loadExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n if (state.execApprovalsLoading) return;\n state.execApprovalsLoading = true;\n state.lastError = null;\n try {\n const rpc = resolveExecApprovalsRpc(target);\n if (!rpc) {\n state.lastError = \"Select a node before loading exec approvals.\";\n return;\n }\n const res = (await state.client.request(rpc.method, rpc.params)) as ExecApprovalsSnapshot;\n applyExecApprovalsSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsLoading = false;\n }\n}\n\nexport function applyExecApprovalsSnapshot(\n state: ExecApprovalsState,\n snapshot: ExecApprovalsSnapshot,\n) {\n state.execApprovalsSnapshot = snapshot;\n if (!state.execApprovalsDirty) {\n state.execApprovalsForm = cloneConfigObject(snapshot.file ?? {});\n }\n}\n\nexport async function saveExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n state.execApprovalsSaving = true;\n state.lastError = null;\n try {\n const baseHash = state.execApprovalsSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Exec approvals hash missing; reload and retry.\";\n return;\n }\n const file =\n state.execApprovalsForm ??\n state.execApprovalsSnapshot?.file ??\n {};\n const rpc = resolveExecApprovalsSaveRpc(target, { file, baseHash });\n if (!rpc) {\n state.lastError = \"Select a node before saving exec approvals.\";\n return;\n }\n await state.client.request(rpc.method, rpc.params);\n state.execApprovalsDirty = false;\n await loadExecApprovals(state, target);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsSaving = false;\n }\n}\n\nexport function updateExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n setPathValue(base, path, value);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n\nexport function removeExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n removePathValue(base, path);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type PresenceState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n};\n\nexport async function loadPresence(state: PresenceState) {\n if (!state.client || !state.connected) return;\n if (state.presenceLoading) return;\n state.presenceLoading = true;\n state.presenceError = null;\n state.presenceStatus = null;\n try {\n const res = (await state.client.request(\"system-presence\", {})) as\n | PresenceEntry[]\n | undefined;\n if (Array.isArray(res)) {\n state.presenceEntries = res;\n state.presenceStatus = res.length === 0 ? \"No instances yet.\" : null;\n } else {\n state.presenceEntries = [];\n state.presenceStatus = \"No presence payload.\";\n }\n } catch (err) {\n state.presenceError = String(err);\n } finally {\n state.presenceLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SkillStatusReport } from \"../types\";\n\nexport type SkillsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsBusyKey: string | null;\n skillEdits: Record<string, string>;\n skillMessages: SkillMessageMap;\n};\n\nexport type SkillMessage = {\n kind: \"success\" | \"error\";\n message: string;\n};\n\nexport type SkillMessageMap = Record<string, SkillMessage>;\n\ntype LoadSkillsOptions = {\n clearMessages?: boolean;\n};\n\nfunction setSkillMessage(state: SkillsState, key: string, message?: SkillMessage) {\n if (!key.trim()) return;\n const next = { ...state.skillMessages };\n if (message) next[key] = message;\n else delete next[key];\n state.skillMessages = next;\n}\n\nfunction getErrorMessage(err: unknown) {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport async function loadSkills(state: SkillsState, options?: LoadSkillsOptions) {\n if (options?.clearMessages && Object.keys(state.skillMessages).length > 0) {\n state.skillMessages = {};\n }\n if (!state.client || !state.connected) return;\n if (state.skillsLoading) return;\n state.skillsLoading = true;\n state.skillsError = null;\n try {\n const res = (await state.client.request(\"skills.status\", {})) as\n | SkillStatusReport\n | undefined;\n if (res) state.skillsReport = res;\n } catch (err) {\n state.skillsError = getErrorMessage(err);\n } finally {\n state.skillsLoading = false;\n }\n}\n\nexport function updateSkillEdit(\n state: SkillsState,\n skillKey: string,\n value: string,\n) {\n state.skillEdits = { ...state.skillEdits, [skillKey]: value };\n}\n\nexport async function updateSkillEnabled(\n state: SkillsState,\n skillKey: string,\n enabled: boolean,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.update\", { skillKey, enabled });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: enabled ? \"Skill enabled\" : \"Skill disabled\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function saveSkillApiKey(state: SkillsState, skillKey: string) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const apiKey = state.skillEdits[skillKey] ?? \"\";\n await state.client.request(\"skills.update\", { skillKey, apiKey });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: \"API key saved\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function installSkill(\n state: SkillsState,\n skillKey: string,\n name: string,\n installId: string,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const result = (await state.client.request(\"skills.install\", {\n name,\n installId,\n timeoutMs: 120000,\n })) as { ok?: boolean; message?: string };\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: result?.message ?? \"Installed\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n","export type ThemeMode = \"system\" | \"light\" | \"dark\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport function getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"dark\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function resolveTheme(mode: ThemeMode): ResolvedTheme {\n if (mode === \"system\") return getSystemTheme();\n return mode;\n}\n","import type { ThemeMode } from \"./theme\";\n\nexport type ThemeTransitionContext = {\n element?: HTMLElement | null;\n pointerClientX?: number;\n pointerClientY?: number;\n};\n\nexport type ThemeTransitionOptions = {\n nextTheme: ThemeMode;\n applyTheme: () => void;\n context?: ThemeTransitionContext;\n currentTheme?: ThemeMode | null;\n};\n\ntype DocumentWithViewTransition = Document & {\n startViewTransition?: (callback: () => void) => { finished: Promise<void> };\n};\n\nconst clamp01 = (value: number) => {\n if (Number.isNaN(value)) return 0.5;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n};\n\nconst hasReducedMotionPreference = () => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n};\n\nconst cleanupThemeTransition = (root: HTMLElement) => {\n root.classList.remove(\"theme-transition\");\n root.style.removeProperty(\"--theme-switch-x\");\n root.style.removeProperty(\"--theme-switch-y\");\n};\n\nexport const startThemeTransition = ({\n nextTheme,\n applyTheme,\n context,\n currentTheme,\n}: ThemeTransitionOptions) => {\n if (currentTheme === nextTheme) return;\n\n const documentReference = globalThis.document ?? null;\n if (!documentReference) {\n applyTheme();\n return;\n }\n\n const root = documentReference.documentElement;\n const document_ = documentReference as DocumentWithViewTransition;\n const prefersReducedMotion = hasReducedMotionPreference();\n\n const canUseViewTransition =\n Boolean(document_.startViewTransition) && !prefersReducedMotion;\n\n if (canUseViewTransition) {\n let xPercent = 0.5;\n let yPercent = 0.5;\n\n if (\n context?.pointerClientX !== undefined &&\n context?.pointerClientY !== undefined &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01(context.pointerClientX / window.innerWidth);\n yPercent = clamp01(context.pointerClientY / window.innerHeight);\n } else if (context?.element) {\n const rect = context.element.getBoundingClientRect();\n if (\n rect.width > 0 &&\n rect.height > 0 &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01((rect.left + rect.width / 2) / window.innerWidth);\n yPercent = clamp01((rect.top + rect.height / 2) / window.innerHeight);\n }\n }\n\n root.style.setProperty(\"--theme-switch-x\", `${xPercent * 100}%`);\n root.style.setProperty(\"--theme-switch-y\", `${yPercent * 100}%`);\n root.classList.add(\"theme-transition\");\n\n try {\n const transition = document_.startViewTransition?.(() => {\n applyTheme();\n });\n if (transition?.finished) {\n void transition.finished.finally(() => cleanupThemeTransition(root));\n } else {\n cleanupThemeTransition(root);\n }\n } catch {\n cleanupThemeTransition(root);\n applyTheme();\n }\n return;\n }\n\n applyTheme();\n cleanupThemeTransition(root);\n};\n","import { loadLogs } from \"./controllers/logs\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadDebug } from \"./controllers/debug\";\nimport type { OpenClawApp } from \"./app\";\n\ntype PollingHost = {\n nodesPollInterval: number | null;\n logsPollInterval: number | null;\n debugPollInterval: number | null;\n tab: string;\n};\n\nexport function startNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval != null) return;\n host.nodesPollInterval = window.setInterval(\n () => void loadNodes(host as unknown as OpenClawApp, { quiet: true }),\n 5000,\n );\n}\n\nexport function stopNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval == null) return;\n clearInterval(host.nodesPollInterval);\n host.nodesPollInterval = null;\n}\n\nexport function startLogsPolling(host: PollingHost) {\n if (host.logsPollInterval != null) return;\n host.logsPollInterval = window.setInterval(() => {\n if (host.tab !== \"logs\") return;\n void loadLogs(host as unknown as OpenClawApp, { quiet: true });\n }, 2000);\n}\n\nexport function stopLogsPolling(host: PollingHost) {\n if (host.logsPollInterval == null) return;\n clearInterval(host.logsPollInterval);\n host.logsPollInterval = null;\n}\n\nexport function startDebugPolling(host: PollingHost) {\n if (host.debugPollInterval != null) return;\n host.debugPollInterval = window.setInterval(() => {\n if (host.tab !== \"debug\") return;\n void loadDebug(host as unknown as OpenClawApp);\n }, 3000);\n}\n\nexport function stopDebugPolling(host: PollingHost) {\n if (host.debugPollInterval == null) return;\n clearInterval(host.debugPollInterval);\n host.debugPollInterval = null;\n}\n","import { loadConfig, loadConfigSchema } from \"./controllers/config\";\nimport { loadCronJobs, loadCronStatus } from \"./controllers/cron\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { loadDebug } from \"./controllers/debug\";\nimport { loadLogs } from \"./controllers/logs\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadExecApprovals } from \"./controllers/exec-approvals\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { loadSkills } from \"./controllers/skills\";\nimport { inferBasePathFromPathname, normalizeBasePath, normalizePath, pathForTab, tabFromPath, type Tab } from \"./navigation\";\nimport { saveSettings, type UiSettings } from \"./storage\";\nimport { resolveTheme, type ResolvedTheme, type ThemeMode } from \"./theme\";\nimport { startThemeTransition, type ThemeTransitionContext } from \"./theme-transition\";\nimport { scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport { startLogsPolling, stopLogsPolling, startDebugPolling, stopDebugPolling } from \"./app-polling\";\nimport { refreshChat } from \"./app-chat\";\nimport type { OpenClawApp } from \"./app\";\n\ntype SettingsHost = {\n settings: UiSettings;\n theme: ThemeMode;\n themeResolved: ResolvedTheme;\n applySessionKey: string;\n sessionKey: string;\n tab: Tab;\n connected: boolean;\n chatHasAutoScrolled: boolean;\n logsAtBottom: boolean;\n eventLog: unknown[];\n eventLogBuffer: unknown[];\n basePath: string;\n themeMedia: MediaQueryList | null;\n themeMediaHandler: ((event: MediaQueryListEvent) => void) | null;\n pendingGatewayUrl?: string | null;\n};\n\nexport function applySettings(host: SettingsHost, next: UiSettings) {\n const normalized = {\n ...next,\n lastActiveSessionKey: next.lastActiveSessionKey?.trim() || next.sessionKey.trim() || \"main\",\n };\n host.settings = normalized;\n saveSettings(normalized);\n if (next.theme !== host.theme) {\n host.theme = next.theme;\n applyResolvedTheme(host, resolveTheme(next.theme));\n }\n host.applySessionKey = host.settings.lastActiveSessionKey;\n}\n\nexport function setLastActiveSessionKey(host: SettingsHost, next: string) {\n const trimmed = next.trim();\n if (!trimmed) return;\n if (host.settings.lastActiveSessionKey === trimmed) return;\n applySettings(host, { ...host.settings, lastActiveSessionKey: trimmed });\n}\n\nexport function applySettingsFromUrl(host: SettingsHost) {\n if (!window.location.search) return;\n const params = new URLSearchParams(window.location.search);\n const tokenRaw = params.get(\"token\");\n const passwordRaw = params.get(\"password\");\n const sessionRaw = params.get(\"session\");\n const gatewayUrlRaw = params.get(\"gatewayUrl\");\n let shouldCleanUrl = false;\n\n if (tokenRaw != null) {\n const token = tokenRaw.trim();\n if (token && token !== host.settings.token) {\n applySettings(host, { ...host.settings, token });\n }\n params.delete(\"token\");\n shouldCleanUrl = true;\n }\n\n if (passwordRaw != null) {\n const password = passwordRaw.trim();\n if (password) {\n (host as { password: string }).password = password;\n }\n params.delete(\"password\");\n shouldCleanUrl = true;\n }\n\n if (sessionRaw != null) {\n const session = sessionRaw.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n }\n\n if (gatewayUrlRaw != null) {\n const gatewayUrl = gatewayUrlRaw.trim();\n if (gatewayUrl && gatewayUrl !== host.settings.gatewayUrl) {\n host.pendingGatewayUrl = gatewayUrl;\n }\n params.delete(\"gatewayUrl\");\n shouldCleanUrl = true;\n }\n\n if (!shouldCleanUrl) return;\n const url = new URL(window.location.href);\n url.search = params.toString();\n window.history.replaceState({}, \"\", url.toString());\n}\n\nexport function setTab(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\")\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n else stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n void refreshActiveTab(host);\n syncUrlWithTab(host, next, false);\n}\n\nexport function setTheme(\n host: SettingsHost,\n next: ThemeMode,\n context?: ThemeTransitionContext,\n) {\n const applyTheme = () => {\n host.theme = next;\n applySettings(host, { ...host.settings, theme: next });\n applyResolvedTheme(host, resolveTheme(next));\n };\n startThemeTransition({\n nextTheme: next,\n applyTheme,\n context,\n currentTheme: host.theme,\n });\n}\n\nexport async function refreshActiveTab(host: SettingsHost) {\n if (host.tab === \"overview\") await loadOverview(host);\n if (host.tab === \"channels\") await loadChannelsTab(host);\n if (host.tab === \"instances\") await loadPresence(host as unknown as OpenClawApp);\n if (host.tab === \"sessions\") await loadSessions(host as unknown as OpenClawApp);\n if (host.tab === \"cron\") await loadCron(host);\n if (host.tab === \"skills\") await loadSkills(host as unknown as OpenClawApp);\n if (host.tab === \"nodes\") {\n await loadNodes(host as unknown as OpenClawApp);\n await loadDevices(host as unknown as OpenClawApp);\n await loadConfig(host as unknown as OpenClawApp);\n await loadExecApprovals(host as unknown as OpenClawApp);\n }\n if (host.tab === \"chat\") {\n await refreshChat(host as unknown as Parameters<typeof refreshChat>[0]);\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n !host.chatHasAutoScrolled,\n );\n }\n if (host.tab === \"config\") {\n await loadConfigSchema(host as unknown as OpenClawApp);\n await loadConfig(host as unknown as OpenClawApp);\n }\n if (host.tab === \"debug\") {\n await loadDebug(host as unknown as OpenClawApp);\n host.eventLog = host.eventLogBuffer;\n }\n if (host.tab === \"logs\") {\n host.logsAtBottom = true;\n await loadLogs(host as unknown as OpenClawApp, { reset: true });\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n true,\n );\n }\n}\n\nexport function inferBasePath() {\n if (typeof window === \"undefined\") return \"\";\n const configured = window.__OPENCLAW_CONTROL_UI_BASE_PATH__;\n if (typeof configured === \"string\" && configured.trim()) {\n return normalizeBasePath(configured);\n }\n return inferBasePathFromPathname(window.location.pathname);\n}\n\nexport function syncThemeWithSettings(host: SettingsHost) {\n host.theme = host.settings.theme ?? \"system\";\n applyResolvedTheme(host, resolveTheme(host.theme));\n}\n\nexport function applyResolvedTheme(host: SettingsHost, resolved: ResolvedTheme) {\n host.themeResolved = resolved;\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.dataset.theme = resolved;\n root.style.colorScheme = resolved;\n}\n\nexport function attachThemeListener(host: SettingsHost) {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n host.themeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n host.themeMediaHandler = (event) => {\n if (host.theme !== \"system\") return;\n applyResolvedTheme(host, event.matches ? \"dark\" : \"light\");\n };\n if (typeof host.themeMedia.addEventListener === \"function\") {\n host.themeMedia.addEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n addListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.addListener(host.themeMediaHandler);\n}\n\nexport function detachThemeListener(host: SettingsHost) {\n if (!host.themeMedia || !host.themeMediaHandler) return;\n if (typeof host.themeMedia.removeEventListener === \"function\") {\n host.themeMedia.removeEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n removeListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.removeListener(host.themeMediaHandler);\n host.themeMedia = null;\n host.themeMediaHandler = null;\n}\n\nexport function syncTabWithLocation(host: SettingsHost, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath) ?? \"chat\";\n setTabFromRoute(host, resolved);\n syncUrlWithTab(host, resolved, replace);\n}\n\nexport function onPopState(host: SettingsHost) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath);\n if (!resolved) return;\n\n const url = new URL(window.location.href);\n const session = url.searchParams.get(\"session\")?.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n\n setTabFromRoute(host, resolved);\n}\n\nexport function setTabFromRoute(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\")\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n else stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n if (host.connected) void refreshActiveTab(host);\n}\n\nexport function syncUrlWithTab(host: SettingsHost, tab: Tab, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const targetPath = normalizePath(pathForTab(tab, host.basePath));\n const currentPath = normalizePath(window.location.pathname);\n const url = new URL(window.location.href);\n\n if (tab === \"chat\" && host.sessionKey) {\n url.searchParams.set(\"session\", host.sessionKey);\n } else {\n url.searchParams.delete(\"session\");\n }\n\n if (currentPath !== targetPath) {\n url.pathname = targetPath;\n }\n\n if (replace) {\n window.history.replaceState({}, \"\", url.toString());\n } else {\n window.history.pushState({}, \"\", url.toString());\n }\n}\n\nexport function syncUrlWithSessionKey(\n host: SettingsHost,\n sessionKey: string,\n replace: boolean,\n) {\n if (typeof window === \"undefined\") return;\n const url = new URL(window.location.href);\n url.searchParams.set(\"session\", sessionKey);\n if (replace) window.history.replaceState({}, \"\", url.toString());\n else window.history.pushState({}, \"\", url.toString());\n}\n\nexport async function loadOverview(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as OpenClawApp, false),\n loadPresence(host as unknown as OpenClawApp),\n loadSessions(host as unknown as OpenClawApp),\n loadCronStatus(host as unknown as OpenClawApp),\n loadDebug(host as unknown as OpenClawApp),\n ]);\n}\n\nexport async function loadChannelsTab(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as OpenClawApp, true),\n loadConfigSchema(host as unknown as OpenClawApp),\n loadConfig(host as unknown as OpenClawApp),\n ]);\n}\n\nexport async function loadCron(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as OpenClawApp, false),\n loadCronStatus(host as unknown as OpenClawApp),\n loadCronJobs(host as unknown as OpenClawApp),\n ]);\n}\n","import { abortChatRun, loadChatHistory, sendChatMessage } from \"./controllers/chat\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { generateUUID } from \"./uuid\";\nimport { resetToolStream } from \"./app-tool-stream\";\nimport { scheduleChatScroll } from \"./app-scroll\";\nimport { setLastActiveSessionKey } from \"./app-settings\";\nimport { normalizeBasePath } from \"./navigation\";\nimport type { GatewayHelloOk } from \"./gateway\";\nimport { parseAgentSessionKey } from \"../../../src/sessions/session-key-utils.js\";\nimport type { OpenClawApp } from \"./app\";\nimport type { ChatAttachment, ChatQueueItem } from \"./ui-types\";\n\ntype ChatHost = {\n connected: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatQueue: ChatQueueItem[];\n chatRunId: string | null;\n chatSending: boolean;\n sessionKey: string;\n basePath: string;\n hello: GatewayHelloOk | null;\n chatAvatarUrl: string | null;\n refreshSessionsAfterChat: boolean;\n};\n\nexport function isChatBusy(host: ChatHost) {\n return host.chatSending || Boolean(host.chatRunId);\n}\n\nexport function isChatStopCommand(text: string) {\n const trimmed = text.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized === \"/stop\") return true;\n return (\n normalized === \"stop\" ||\n normalized === \"esc\" ||\n normalized === \"abort\" ||\n normalized === \"wait\" ||\n normalized === \"exit\"\n );\n}\n\nfunction isChatResetCommand(text: string) {\n const trimmed = text.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized === \"/new\" || normalized === \"/reset\") return true;\n return normalized.startsWith(\"/new \") || normalized.startsWith(\"/reset \");\n}\n\nexport async function handleAbortChat(host: ChatHost) {\n if (!host.connected) return;\n host.chatMessage = \"\";\n await abortChatRun(host as unknown as OpenClawApp);\n}\n\nfunction enqueueChatMessage(host: ChatHost, text: string, attachments?: ChatAttachment[]) {\n const trimmed = text.trim();\n const hasAttachments = Boolean(attachments && attachments.length > 0);\n if (!trimmed && !hasAttachments) return;\n host.chatQueue = [\n ...host.chatQueue,\n {\n id: generateUUID(),\n text: trimmed,\n createdAt: Date.now(),\n attachments: hasAttachments ? attachments?.map((att) => ({ ...att })) : undefined,\n },\n ];\n}\n\nasync function sendChatMessageNow(\n host: ChatHost,\n message: string,\n opts?: {\n previousDraft?: string;\n restoreDraft?: boolean;\n attachments?: ChatAttachment[];\n previousAttachments?: ChatAttachment[];\n restoreAttachments?: boolean;\n refreshSessions?: boolean;\n },\n) {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n const ok = await sendChatMessage(host as unknown as OpenClawApp, message, opts?.attachments);\n if (!ok && opts?.previousDraft != null) {\n host.chatMessage = opts.previousDraft;\n }\n if (!ok && opts?.previousAttachments) {\n host.chatAttachments = opts.previousAttachments;\n }\n if (ok) {\n setLastActiveSessionKey(host as unknown as Parameters<typeof setLastActiveSessionKey>[0], host.sessionKey);\n }\n if (ok && opts?.restoreDraft && opts.previousDraft?.trim()) {\n host.chatMessage = opts.previousDraft;\n }\n if (ok && opts?.restoreAttachments && opts.previousAttachments?.length) {\n host.chatAttachments = opts.previousAttachments;\n }\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0]);\n if (ok && !host.chatRunId) {\n void flushChatQueue(host);\n }\n if (ok && opts?.refreshSessions) {\n host.refreshSessionsAfterChat = true;\n }\n return ok;\n}\n\nasync function flushChatQueue(host: ChatHost) {\n if (!host.connected || isChatBusy(host)) return;\n const [next, ...rest] = host.chatQueue;\n if (!next) return;\n host.chatQueue = rest;\n const ok = await sendChatMessageNow(host, next.text, { attachments: next.attachments });\n if (!ok) {\n host.chatQueue = [next, ...host.chatQueue];\n }\n}\n\nexport function removeQueuedMessage(host: ChatHost, id: string) {\n host.chatQueue = host.chatQueue.filter((item) => item.id !== id);\n}\n\nexport async function handleSendChat(\n host: ChatHost,\n messageOverride?: string,\n opts?: { restoreDraft?: boolean },\n) {\n if (!host.connected) return;\n const previousDraft = host.chatMessage;\n const message = (messageOverride ?? host.chatMessage).trim();\n const attachments = host.chatAttachments ?? [];\n const attachmentsToSend = messageOverride == null ? attachments : [];\n const hasAttachments = attachmentsToSend.length > 0;\n\n // Allow sending with just attachments (no message text required)\n if (!message && !hasAttachments) return;\n\n if (isChatStopCommand(message)) {\n await handleAbortChat(host);\n return;\n }\n\n const refreshSessions = isChatResetCommand(message);\n if (messageOverride == null) {\n host.chatMessage = \"\";\n // Clear attachments when sending\n host.chatAttachments = [];\n }\n\n if (isChatBusy(host)) {\n enqueueChatMessage(host, message, attachmentsToSend);\n return;\n }\n\n await sendChatMessageNow(host, message, {\n previousDraft: messageOverride == null ? previousDraft : undefined,\n restoreDraft: Boolean(messageOverride && opts?.restoreDraft),\n attachments: hasAttachments ? attachmentsToSend : undefined,\n previousAttachments: messageOverride == null ? attachments : undefined,\n restoreAttachments: Boolean(messageOverride && opts?.restoreDraft),\n refreshSessions,\n });\n}\n\nexport async function refreshChat(host: ChatHost) {\n await Promise.all([\n loadChatHistory(host as unknown as OpenClawApp),\n loadSessions(host as unknown as OpenClawApp, { activeMinutes: 0 }),\n refreshChatAvatar(host),\n ]);\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0], true);\n}\n\nexport const flushChatQueueForEvent = flushChatQueue;\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n};\n\nfunction resolveAgentIdForSession(host: ChatHost): string | null {\n const parsed = parseAgentSessionKey(host.sessionKey);\n if (parsed?.agentId) return parsed.agentId;\n const snapshot = host.hello?.snapshot as { sessionDefaults?: SessionDefaultsSnapshot } | undefined;\n const fallback = snapshot?.sessionDefaults?.defaultAgentId?.trim();\n return fallback || \"main\";\n}\n\nfunction buildAvatarMetaUrl(basePath: string, agentId: string): string {\n const base = normalizeBasePath(basePath);\n const encoded = encodeURIComponent(agentId);\n return base ? `${base}/avatar/${encoded}?meta=1` : `/avatar/${encoded}?meta=1`;\n}\n\nexport async function refreshChatAvatar(host: ChatHost) {\n if (!host.connected) {\n host.chatAvatarUrl = null;\n return;\n }\n const agentId = resolveAgentIdForSession(host);\n if (!agentId) {\n host.chatAvatarUrl = null;\n return;\n }\n host.chatAvatarUrl = null;\n const url = buildAvatarMetaUrl(host.basePath, agentId);\n try {\n const res = await fetch(url, { method: \"GET\" });\n if (!res.ok) {\n host.chatAvatarUrl = null;\n return;\n }\n const data = (await res.json()) as { avatarUrl?: unknown };\n const avatarUrl = typeof data.avatarUrl === \"string\" ? data.avatarUrl.trim() : \"\";\n host.chatAvatarUrl = avatarUrl || null;\n } catch {\n host.chatAvatarUrl = null;\n }\n}\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{isSingleExpression as i}from\"./directive-helpers.js\";import{Directive as t,PartType as e}from\"./directive.js\";export{directive}from\"./directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=(i,t)=>{const e=i._$AN;if(void 0===e)return!1;for(const i of e)i._$AO?.(t,!1),s(i,t);return!0},o=i=>{let t,e;do{if(void 0===(t=i._$AM))break;e=t._$AN,e.delete(i),i=t}while(0===e?.size)},r=i=>{for(let t;t=i._$AM;i=t){let e=t._$AN;if(void 0===e)t._$AN=e=new Set;else if(e.has(i))break;e.add(i),c(t)}};function h(i){void 0!==this._$AN?(o(this),this._$AM=i,r(this)):this._$AM=i}function n(i,t=!1,e=0){const r=this._$AH,h=this._$AN;if(void 0!==h&&0!==h.size)if(t)if(Array.isArray(r))for(let i=e;i<r.length;i++)s(r[i],!1),o(r[i]);else null!=r&&(s(r,!1),o(r));else s(this,i)}const c=i=>{i.type==e.CHILD&&(i._$AP??=n,i._$AQ??=h)};class f extends t{constructor(){super(...arguments),this._$AN=void 0}_$AT(i,t,e){super._$AT(i,t,e),r(this),this.isConnected=i._$AU}_$AO(i,t=!0){i!==this.isConnected&&(this.isConnected=i,i?this.reconnected?.():this.disconnected?.()),t&&(s(this,i),o(this))}setValue(t){if(i(this._$Ct))this._$Ct._$AI(t,this);else{const i=[...this._$Ct._$AH];i[this._$Ci]=t,this._$Ct._$AI(i,this,0)}}disconnected(){}reconnected(){}}export{f as AsyncDirective,t as Directive,e as PartType};\n//# sourceMappingURL=async-directive.js.map\n","import{nothing as t}from\"../lit-html.js\";import{AsyncDirective as i}from\"../async-directive.js\";import{directive as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const e=()=>new h;class h{}const o=new WeakMap,n=s(class extends i{render(i){return t}update(i,[s]){const e=s!==this.G;return e&&void 0!==this.G&&this.rt(void 0),(e||this.lt!==this.ct)&&(this.G=s,this.ht=i.options?.host,this.rt(this.ct=i.element)),t}rt(t){if(this.isConnected||(t=void 0),\"function\"==typeof this.G){const i=this.ht??globalThis;let s=o.get(i);void 0===s&&(s=new WeakMap,o.set(i,s)),void 0!==s.get(this.G)&&this.G.call(this.ht,void 0),s.set(this.G,t),void 0!==t&&this.G.call(this.ht,t)}else this.G.value=t}get lt(){return\"function\"==typeof this.G?o.get(this.ht??globalThis)?.get(this.G):this.G?.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}});export{e as createRef,n as ref};\n//# sourceMappingURL=ref.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","/**\n * Message normalization utilities for chat rendering.\n */\n\nimport type {\n NormalizedMessage,\n MessageContentItem,\n} from \"../types/chat-types\";\n\n/**\n * Normalize a raw message object into a consistent structure.\n */\nexport function normalizeMessage(message: unknown): NormalizedMessage {\n const m = message as Record<string, unknown>;\n let role = typeof m.role === \"string\" ? m.role : \"unknown\";\n\n // Detect tool messages by common gateway shapes.\n // Some tool events come through as assistant role with tool_* items in the content array.\n const hasToolId =\n typeof m.toolCallId === \"string\" || typeof m.tool_call_id === \"string\";\n\n const contentRaw = m.content;\n const contentItems = Array.isArray(contentRaw) ? contentRaw : null;\n const hasToolContent =\n Array.isArray(contentItems) &&\n contentItems.some((item) => {\n const x = item as Record<string, unknown>;\n const t = String(x.type ?? \"\").toLowerCase();\n return t === \"toolresult\" || t === \"tool_result\";\n });\n\n const hasToolName =\n typeof (m as Record<string, unknown>).toolName === \"string\" ||\n typeof (m as Record<string, unknown>).tool_name === \"string\";\n\n if (hasToolId || hasToolContent || hasToolName) {\n role = \"toolResult\";\n }\n\n // Extract content\n let content: MessageContentItem[] = [];\n\n if (typeof m.content === \"string\") {\n content = [{ type: \"text\", text: m.content }];\n } else if (Array.isArray(m.content)) {\n content = m.content.map((item: Record<string, unknown>) => ({\n type: (item.type as MessageContentItem[\"type\"]) || \"text\",\n text: item.text as string | undefined,\n name: item.name as string | undefined,\n args: item.args || item.arguments,\n }));\n } else if (typeof m.text === \"string\") {\n content = [{ type: \"text\", text: m.text }];\n }\n\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : Date.now();\n const id = typeof m.id === \"string\" ? m.id : undefined;\n\n return { role, content, timestamp, id };\n}\n\n/**\n * Normalize role for grouping purposes.\n */\nexport function normalizeRoleForGrouping(role: string): string {\n const lower = role.toLowerCase();\n // Preserve original casing when it's already a core role.\n if (role === \"user\" || role === \"User\") return role;\n if (role === \"assistant\") return \"assistant\";\n if (role === \"system\") return \"system\";\n // Keep tool-related roles distinct so the UI can style/toggle them.\n if (\n lower === \"toolresult\" ||\n lower === \"tool_result\" ||\n lower === \"tool\" ||\n lower === \"function\"\n ) {\n return \"tool\";\n }\n return role;\n}\n\n/**\n * Check if a message is a tool result message based on its role.\n */\nexport function isToolResultMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role.toLowerCase() : \"\";\n return role === \"toolresult\" || role === \"tool_result\";\n}\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['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']);\nconst svg$1 = freeze(['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']);\nconst svgFilters = freeze(['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']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['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']);\nconst mathMl$1 = freeze(['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']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['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']);\nconst svg = freeze(['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']);\nconst mathMl = freeze(['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']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['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']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * marked v17.0.1 - a markdown parser\n * Copyright (c) 2018-2025, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=L();function Z(u){T=u}var C={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var me=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={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:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\")},xe=/^(?:[ \\t]*(?:\\n|$))+/,be=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,I=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Te=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,N=/(?:[*+-]|\\d{1,9}[.)])/,re=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,se=k(re).replace(/bull/g,N).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(),Oe=k(re).replace(/bull/g,N).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(),Q=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,we=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,ye=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Pe=k(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,N).getRegex(),v=\"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\",j=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Se=k(\"^ {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[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",j).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ie=k(Q).replace(\"hr\",I).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\",v).getRegex(),$e=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",ie).getRegex(),U={blockquote:$e,code:be,def:ye,fences:Re,heading:Te,hr:I,html:Se,lheading:se,list:Pe,newline:xe,paragraph:ie,table:C,text:we},te=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\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\",v).getRegex(),_e={...U,lheading:Oe,table:te,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",te).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\",v).getRegex()},Le={...U,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",j).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:C,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",se).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Me=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,oe=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,D=/[\\p{P}\\p{S}]/u,K=/[\\s\\p{P}\\p{S}]/u,ae=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,K).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Ie=/(?!~)[\\s\\p{P}\\p{S}]/u,Ee=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Be=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",me?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,qe=k(ue,\"u\").replace(/punct/g,D).getRegex(),ve=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",De=k(pe,\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),He=k(pe,\"gu\").replace(/notPunctSpace/g,Ee).replace(/punctSpace/g,Ie).replace(/punct/g,le).getRegex(),Ze=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),Ge=k(/\\\\(punct)/,\"gu\").replace(/punct/g,D).getRegex(),Ne=k(/^<(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(),Qe=k(j).replace(\"(?:-->|$)\",\"-->\").getRegex(),Fe=k(\"^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\",Qe).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/,je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ue=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),ne=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,W={_backpedal:C,anyPunctuation:Ge,autolink:Ne,blockSkip:Be,br:oe,code:ze,del:C,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ze,escape:Me,link:je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ue,tag:Fe,text:Ae,url:C},Ke={...W,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},G={...W,emStrongRDelimAst:He,emStrongLDelim:ve,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ne).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:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ne).getRegex()},We={...G,br:k(oe).replace(\"{2,}\",\"*\").getRegex(),text:k(G.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},E={normal:U,gfm:_e,pedantic:Le},M={normal:W,gfm:G,breaks:We,pedantic:Ke};var Xe={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ke=u=>Xe[u];function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function J(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function z(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||T}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:z(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=Je(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:r}}}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 r=z(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.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:z(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let g=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=g,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.blockquote(f);s[s.length-1]=O,r=r.substring(0,r.length-R.raw.length)+O.raw,i=i.substring(0,i.length-R.text.length)+O.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.list(f);s[s.length-1]=O,r=r.substring(0,r.length-h.raw.length)+O.raw,i=i.substring(0,i.length-R.raw.length)+O.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let g=t[2].split(`\n`,1)[0].replace(this.rules.other.listReplaceTabs,O=>\" \".repeat(3*O.length)),h=e.split(`\n`,1)[0],R=!g.trim(),f=0;if(this.options.pedantic?(f=2,c=g.trimStart()):R?f=t[1].length+1:(f=t[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=g.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let O=this.rules.other.nextBulletRegex(f),V=this.rules.other.hrRegex(f),Y=this.rules.other.fencesBeginRegex(f),ee=this.rules.other.headingBeginRegex(f),fe=this.rules.other.htmlBeginRegex(f);for(;e;){let H=e.split(`\n`,1)[0],A;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),Y.test(h)||ee.test(h)||fe.test(h)||O.test(h)||V.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||g.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Y.test(g)||ee.test(g)||V.test(g))break;c+=`\n`+h}!R&&!h.trim()&&(R=!0),p+=H+`\n`,e=e.substring(H.length+1),g=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.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 c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.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=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(g=>g.type===\"space\"),c=p.length>0&&p.some(g=>this.rules.other.anyLine.test(g.raw));i.loose=c}}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,\" \"),r=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:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=J(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(J(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}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)===`\n`?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 s=z(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),ge(t,{href:r&&r.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 r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return ge(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let g=[...r[0]][0].length,h=e.slice(0,s+r.index+g+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&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,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"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.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,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}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new y,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 t={other:m,block:E.normal,inline:M.normal};this.options.pedantic?(t.block=E.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=E.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:E,inline:M}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),g;this.options.extensions.startInline.forEach(h=>{g=h.call({lexer:this},c),typeof g==\"number\"&&g>=0&&(p=Math.min(p,g))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var P=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+w(r)+'\">'+(n?i:w(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:w(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}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 r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}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>${w(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 r=this.parser.parseInline(n),i=X(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+w(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=X(e);if(i===null)return w(n);e=i;let s=`<img src=\"${e}\" alt=\"${n}\"`;return t&&(s+=` title=\"${w(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:w(e.text)}};var $=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}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var S=class{options;block;constructor(e){this.options=e||T}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?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var B=class{defaults=L();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=$;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,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 r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}: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 s=t[i.level];s?s.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)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new S;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];S.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(s))return(async()=>{let g=await o.call(i,p);return l.call(i,g)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let g=await o.apply(i,p);return g===!1&&(g=await l.apply(i,p)),g})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.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 n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+w(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var _=new B;function d(u,e){return _.parse(u,e)}d.options=d.setOptions=function(u){return _.setOptions(u),d.defaults=_.defaults,Z(d.defaults),d};d.getDefaults=L;d.defaults=T;d.use=function(...u){return _.use(...u),d.defaults=_.defaults,Z(d.defaults),d};d.walkTokens=function(u,e){return _.walkTokens(u,e)};d.parseInline=_.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=$;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=S;d.parse=d;var Dt=d.options,Ht=d.setOptions,Zt=d.use,Gt=d.walkTokens,Nt=d.parseInline,Qt=d,Ft=b.parse,jt=x.lex;export{S as Hooks,x as Lexer,B as Marked,b as Parser,P as Renderer,$ as TextRenderer,y as Tokenizer,T as defaults,L as getDefaults,jt as lexer,d as marked,Dt as options,Qt as parse,Nt as parseInline,Ft as parser,Ht as setOptions,Zt as use,Gt as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\nimport { truncateText } from \"./format\";\n\nmarked.setOptions({\n gfm: true,\n breaks: true,\n mangle: false,\n});\n\nconst allowedTags = [\n \"a\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"del\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"hr\",\n \"i\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"strong\",\n \"table\",\n \"tbody\",\n \"td\",\n \"th\",\n \"thead\",\n \"tr\",\n \"ul\",\n];\n\nconst allowedAttrs = [\"class\", \"href\", \"rel\", \"target\", \"title\", \"start\"];\n\nlet hooksInstalled = false;\nconst MARKDOWN_CHAR_LIMIT = 140_000;\nconst MARKDOWN_PARSE_LIMIT = 40_000;\nconst MARKDOWN_CACHE_LIMIT = 200;\nconst MARKDOWN_CACHE_MAX_CHARS = 50_000;\nconst markdownCache = new Map<string, string>();\n\nfunction getCachedMarkdown(key: string): string | null {\n const cached = markdownCache.get(key);\n if (cached === undefined) return null;\n markdownCache.delete(key);\n markdownCache.set(key, cached);\n return cached;\n}\n\nfunction setCachedMarkdown(key: string, value: string) {\n markdownCache.set(key, value);\n if (markdownCache.size <= MARKDOWN_CACHE_LIMIT) return;\n const oldest = markdownCache.keys().next().value;\n if (oldest) markdownCache.delete(oldest);\n}\n\nfunction installHooks() {\n if (hooksInstalled) return;\n hooksInstalled = true;\n\n DOMPurify.addHook(\"afterSanitizeAttributes\", (node) => {\n if (!(node instanceof HTMLAnchorElement)) return;\n const href = node.getAttribute(\"href\");\n if (!href) return;\n node.setAttribute(\"rel\", \"noreferrer noopener\");\n node.setAttribute(\"target\", \"_blank\");\n });\n}\n\nexport function toSanitizedMarkdownHtml(markdown: string): string {\n const input = markdown.trim();\n if (!input) return \"\";\n installHooks();\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n const cached = getCachedMarkdown(input);\n if (cached !== null) return cached;\n }\n const truncated = truncateText(input, MARKDOWN_CHAR_LIMIT);\n const suffix = truncated.truncated\n ? `\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`\n : \"\";\n if (truncated.text.length > MARKDOWN_PARSE_LIMIT) {\n const escaped = escapeHtml(`${truncated.text}${suffix}`);\n const html = `<pre class=\"code-block\">${escaped}</pre>`;\n const sanitized = DOMPurify.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n }\n const rendered = marked.parse(`${truncated.text}${suffix}`) as string;\n const sanitized = DOMPurify.sanitize(rendered, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { html, type TemplateResult } from \"lit\";\nimport { icons } from \"../icons\";\n\nconst COPIED_FOR_MS = 1500;\nconst ERROR_FOR_MS = 2000;\nconst COPY_LABEL = \"Copy as markdown\";\nconst COPIED_LABEL = \"Copied\";\nconst ERROR_LABEL = \"Copy failed\";\n\ntype CopyButtonOptions = {\n text: () => string;\n label?: string;\n};\n\nasync function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction setButtonLabel(button: HTMLButtonElement, label: string) {\n button.title = label;\n button.setAttribute(\"aria-label\", label);\n}\n\nfunction createCopyButton(options: CopyButtonOptions): TemplateResult {\n const idleLabel = options.label ?? COPY_LABEL;\n return html`\n <button\n class=\"chat-copy-btn\"\n type=\"button\"\n title=${idleLabel}\n aria-label=${idleLabel}\n @click=${async (e: Event) => {\n const btn = e.currentTarget as HTMLButtonElement | null;\n const iconContainer = btn?.querySelector(\n \".chat-copy-btn__icon\",\n ) as HTMLElement | null;\n\n if (!btn || btn.dataset.copying === \"1\") return;\n\n btn.dataset.copying = \"1\";\n btn.setAttribute(\"aria-busy\", \"true\");\n btn.disabled = true;\n\n const copied = await copyTextToClipboard(options.text());\n if (!btn.isConnected) return;\n\n delete btn.dataset.copying;\n btn.removeAttribute(\"aria-busy\");\n btn.disabled = false;\n\n if (!copied) {\n btn.dataset.error = \"1\";\n setButtonLabel(btn, ERROR_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.error;\n setButtonLabel(btn, idleLabel);\n }, ERROR_FOR_MS);\n return;\n }\n\n btn.dataset.copied = \"1\";\n setButtonLabel(btn, COPIED_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.copied;\n setButtonLabel(btn, idleLabel);\n }, COPIED_FOR_MS);\n }}\n >\n <span class=\"chat-copy-btn__icon\" aria-hidden=\"true\">\n <span class=\"chat-copy-btn__icon-copy\">${icons.copy}</span>\n <span class=\"chat-copy-btn__icon-check\">${icons.check}</span>\n </span>\n </button>\n `;\n}\n\nexport function renderCopyAsMarkdownButton(markdown: string): TemplateResult {\n return createCopyButton({ text: () => markdown, label: COPY_LABEL });\n}\n","import rawConfig from \"./tool-display.json\";\nimport type { IconName } from \"./icons\";\n\ntype ToolDisplayActionSpec = {\n label?: string;\n detailKeys?: string[];\n};\n\ntype ToolDisplaySpec = {\n icon?: string;\n title?: string;\n label?: string;\n detailKeys?: string[];\n actions?: Record<string, ToolDisplayActionSpec>;\n};\n\ntype ToolDisplayConfig = {\n version?: number;\n fallback?: ToolDisplaySpec;\n tools?: Record<string, ToolDisplaySpec>;\n};\n\nexport type ToolDisplay = {\n name: string;\n icon: IconName;\n title: string;\n label: string;\n verb?: string;\n detail?: string;\n};\n\nconst TOOL_DISPLAY_CONFIG = rawConfig as ToolDisplayConfig;\nconst FALLBACK = TOOL_DISPLAY_CONFIG.fallback ?? { icon: \"puzzle\" };\nconst TOOL_MAP = TOOL_DISPLAY_CONFIG.tools ?? {};\n\nfunction normalizeToolName(name?: string): string {\n return (name ?? \"tool\").trim();\n}\n\nfunction defaultTitle(name: string): string {\n const cleaned = name.replace(/_/g, \" \").trim();\n if (!cleaned) return \"Tool\";\n return cleaned\n .split(/\\s+/)\n .map((part) =>\n part.length <= 2 && part.toUpperCase() === part\n ? part\n : `${part.at(0)?.toUpperCase() ?? \"\"}${part.slice(1)}`,\n )\n .join(\" \");\n}\n\nfunction normalizeVerb(value?: string): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/_/g, \" \");\n}\n\nfunction coerceDisplayValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n const firstLine = trimmed.split(/\\r?\\n/)[0]?.trim() ?? \"\";\n if (!firstLine) return undefined;\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}…` : firstLine;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n const values = value\n .map((item) => coerceDisplayValue(item))\n .filter((item): item is string => Boolean(item));\n if (values.length === 0) return undefined;\n const preview = values.slice(0, 3).join(\", \");\n return values.length > 3 ? `${preview}…` : preview;\n }\n return undefined;\n}\n\nfunction lookupValueByPath(args: unknown, path: string): unknown {\n if (!args || typeof args !== \"object\") return undefined;\n let current: unknown = args;\n for (const segment of path.split(\".\")) {\n if (!segment) return undefined;\n if (!current || typeof current !== \"object\") return undefined;\n const record = current as Record<string, unknown>;\n current = record[segment];\n }\n return current;\n}\n\nfunction resolveDetailFromKeys(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = lookupValueByPath(args, key);\n const display = coerceDisplayValue(value);\n if (display) return display;\n }\n return undefined;\n}\n\nfunction resolveReadDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n if (!path) return undefined;\n const offset = typeof record.offset === \"number\" ? record.offset : undefined;\n const limit = typeof record.limit === \"number\" ? record.limit : undefined;\n if (offset !== undefined && limit !== undefined) {\n return `${path}:${offset}-${offset + limit}`;\n }\n return path;\n}\n\nfunction resolveWriteDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n return path;\n}\n\nfunction resolveActionSpec(\n spec: ToolDisplaySpec | undefined,\n action: string | undefined,\n): ToolDisplayActionSpec | undefined {\n if (!spec || !action) return undefined;\n return spec.actions?.[action] ?? undefined;\n}\n\nexport function resolveToolDisplay(params: {\n name?: string;\n args?: unknown;\n meta?: string;\n}): ToolDisplay {\n const name = normalizeToolName(params.name);\n const key = name.toLowerCase();\n const spec = TOOL_MAP[key];\n const icon = (spec?.icon ?? FALLBACK.icon ?? \"puzzle\") as IconName;\n const title = spec?.title ?? defaultTitle(name);\n const label = spec?.label ?? name;\n const actionRaw =\n params.args && typeof params.args === \"object\"\n ? ((params.args as Record<string, unknown>).action as string | undefined)\n : undefined;\n const action = typeof actionRaw === \"string\" ? actionRaw.trim() : undefined;\n const actionSpec = resolveActionSpec(spec, action);\n const verb = normalizeVerb(actionSpec?.label ?? action);\n\n let detail: string | undefined;\n if (key === \"read\") detail = resolveReadDetail(params.args);\n if (!detail && (key === \"write\" || key === \"edit\" || key === \"attach\")) {\n detail = resolveWriteDetail(params.args);\n }\n\n const detailKeys =\n actionSpec?.detailKeys ?? spec?.detailKeys ?? FALLBACK.detailKeys ?? [];\n if (!detail && detailKeys.length > 0) {\n detail = resolveDetailFromKeys(params.args, detailKeys);\n }\n\n if (!detail && params.meta) {\n detail = params.meta;\n }\n\n if (detail) {\n detail = shortenHomeInString(detail);\n }\n\n return {\n name,\n icon,\n title,\n label,\n verb,\n detail,\n };\n}\n\nexport function formatToolDetail(display: ToolDisplay): string | undefined {\n const parts: string[] = [];\n if (display.verb) parts.push(display.verb);\n if (display.detail) parts.push(display.detail);\n if (parts.length === 0) return undefined;\n return parts.join(\" · \");\n}\n\nexport function formatToolSummary(display: ToolDisplay): string {\n const detail = formatToolDetail(display);\n return detail ? `${display.label}: ${detail}` : display.label;\n}\n\nfunction shortenHomeInString(input: string): string {\n if (!input) return input;\n return input\n .replace(/\\/Users\\/[^/]+/g, \"~\")\n .replace(/\\/home\\/[^/]+/g, \"~\");\n}\n","/**\n * Chat-related constants for the UI layer.\n */\n\n/** Character threshold for showing tool output inline vs collapsed */\nexport const TOOL_INLINE_THRESHOLD = 80;\n\n/** Maximum lines to show in collapsed preview */\nexport const PREVIEW_MAX_LINES = 2;\n\n/** Maximum characters to show in collapsed preview */\nexport const PREVIEW_MAX_CHARS = 100;\n","/**\n * Helper functions for tool card rendering.\n */\n\nimport { PREVIEW_MAX_CHARS, PREVIEW_MAX_LINES } from \"./constants\";\n\n/**\n * Format tool output content for display in the sidebar.\n * Detects JSON and wraps it in a code block with formatting.\n */\nexport function formatToolOutputForSidebar(text: string): string {\n const trimmed = text.trim();\n // Try to detect and format JSON\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(trimmed);\n return \"```json\\n\" + JSON.stringify(parsed, null, 2) + \"\\n```\";\n } catch {\n // Not valid JSON, return as-is\n }\n }\n return text;\n}\n\n/**\n * Get a truncated preview of tool output text.\n * Truncates to first N lines or first N characters, whichever is shorter.\n */\nexport function getTruncatedPreview(text: string): string {\n const allLines = text.split(\"\\n\");\n const lines = allLines.slice(0, PREVIEW_MAX_LINES);\n const preview = lines.join(\"\\n\");\n if (preview.length > PREVIEW_MAX_CHARS) {\n return preview.slice(0, PREVIEW_MAX_CHARS) + \"…\";\n }\n return lines.length < allLines.length ? preview + \"…\" : preview;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatToolDetail, resolveToolDisplay } from \"../tool-display\";\nimport { icons } from \"../icons\";\nimport type { ToolCard } from \"../types/chat-types\";\nimport { TOOL_INLINE_THRESHOLD } from \"./constants\";\nimport {\n formatToolOutputForSidebar,\n getTruncatedPreview,\n} from \"./tool-helpers\";\nimport { isToolResultMessage } from \"./message-normalizer\";\nimport { extractTextCached } from \"./message-extract\";\n\nexport function extractToolCards(message: unknown): ToolCard[] {\n const m = message as Record<string, unknown>;\n const content = normalizeContent(m.content);\n const cards: ToolCard[] = [];\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n const isToolCall =\n [\"toolcall\", \"tool_call\", \"tooluse\", \"tool_use\"].includes(kind) ||\n (typeof item.name === \"string\" && item.arguments != null);\n if (isToolCall) {\n cards.push({\n kind: \"call\",\n name: (item.name as string) ?? \"tool\",\n args: coerceArgs(item.arguments ?? item.args),\n });\n }\n }\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n if (kind !== \"toolresult\" && kind !== \"tool_result\") continue;\n const text = extractToolText(item);\n const name = typeof item.name === \"string\" ? item.name : \"tool\";\n cards.push({ kind: \"result\", name, text });\n }\n\n if (\n isToolResultMessage(message) &&\n !cards.some((card) => card.kind === \"result\")\n ) {\n const name =\n (typeof m.toolName === \"string\" && m.toolName) ||\n (typeof m.tool_name === \"string\" && m.tool_name) ||\n \"tool\";\n const text = extractTextCached(message) ?? undefined;\n cards.push({ kind: \"result\", name, text });\n }\n\n return cards;\n}\n\nexport function renderToolCardSidebar(\n card: ToolCard,\n onOpenSidebar?: (content: string) => void,\n) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const detail = formatToolDetail(display);\n const hasText = Boolean(card.text?.trim());\n\n const canClick = Boolean(onOpenSidebar);\n const handleClick = canClick\n ? () => {\n if (hasText) {\n onOpenSidebar!(formatToolOutputForSidebar(card.text!));\n return;\n }\n const info = `## ${display.label}\\n\\n${\n detail ? `**Command:** \\`${detail}\\`\\n\\n` : \"\"\n }*No output — tool completed successfully.*`;\n onOpenSidebar!(info);\n }\n : undefined;\n\n const isShort = hasText && (card.text?.length ?? 0) <= TOOL_INLINE_THRESHOLD;\n const showCollapsed = hasText && !isShort;\n const showInline = hasText && isShort;\n const isEmpty = !hasText;\n\n return html`\n <div\n class=\"chat-tool-card ${canClick ? \"chat-tool-card--clickable\" : \"\"}\"\n @click=${handleClick}\n role=${canClick ? \"button\" : nothing}\n tabindex=${canClick ? \"0\" : nothing}\n @keydown=${canClick\n ? (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n handleClick?.();\n }\n : nothing}\n >\n <div class=\"chat-tool-card__header\">\n <div class=\"chat-tool-card__title\">\n <span class=\"chat-tool-card__icon\">${icons[display.icon]}</span>\n <span>${display.label}</span>\n </div>\n ${canClick\n ? html`<span class=\"chat-tool-card__action\">${hasText ? \"View\" : \"\"} ${icons.check}</span>`\n : nothing}\n ${isEmpty && !canClick ? html`<span class=\"chat-tool-card__status\">${icons.check}</span>` : nothing}\n </div>\n ${detail\n ? html`<div class=\"chat-tool-card__detail\">${detail}</div>`\n : nothing}\n ${isEmpty\n ? html`<div class=\"chat-tool-card__status-text muted\">Completed</div>`\n : nothing}\n ${showCollapsed\n ? html`<div class=\"chat-tool-card__preview mono\">${getTruncatedPreview(card.text!)}</div>`\n : nothing}\n ${showInline\n ? html`<div class=\"chat-tool-card__inline mono\">${card.text}</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction normalizeContent(content: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(content)) return [];\n return content.filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nfunction coerceArgs(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed) return value;\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n return JSON.parse(trimmed);\n } catch {\n return value;\n }\n}\n\nfunction extractToolText(item: Record<string, unknown>): string | undefined {\n if (typeof item.text === \"string\") return item.text;\n if (typeof item.content === \"string\") return item.content;\n return undefined;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport type { AssistantIdentity } from \"../assistant-identity\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\nimport type { MessageGroup } from \"../types/chat-types\";\nimport { renderCopyAsMarkdownButton } from \"./copy-as-markdown\";\nimport { isToolResultMessage, normalizeRoleForGrouping } from \"./message-normalizer\";\nimport {\n extractTextCached,\n extractThinkingCached,\n formatReasoningMarkdown,\n} from \"./message-extract\";\nimport { extractToolCards, renderToolCardSidebar } from \"./tool-cards\";\n\ntype ImageBlock = {\n url: string;\n alt?: string;\n};\n\nfunction extractImages(message: unknown): ImageBlock[] {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const images: ImageBlock[] = [];\n\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n\n if (b.type === \"image\") {\n // Handle source object format (from sendChatMessage)\n const source = b.source as Record<string, unknown> | undefined;\n if (source?.type === \"base64\" && typeof source.data === \"string\") {\n const data = source.data as string;\n const mediaType = (source.media_type as string) || \"image/png\";\n // If data is already a data URL, use it directly\n const url = data.startsWith(\"data:\")\n ? data\n : `data:${mediaType};base64,${data}`;\n images.push({ url });\n } else if (typeof b.url === \"string\") {\n images.push({ url: b.url });\n }\n } else if (b.type === \"image_url\") {\n // OpenAI format\n const imageUrl = b.image_url as Record<string, unknown> | undefined;\n if (typeof imageUrl?.url === \"string\") {\n images.push({ url: imageUrl.url });\n }\n }\n }\n }\n\n return images;\n}\n\nexport function renderReadingIndicatorGroup(assistant?: AssistantIdentity) {\n return html`\n <div class=\"chat-group assistant\">\n ${renderAvatar(\"assistant\", assistant)}\n <div class=\"chat-group-messages\">\n <div class=\"chat-bubble chat-reading-indicator\" aria-hidden=\"true\">\n <span class=\"chat-reading-indicator__dots\">\n <span></span><span></span><span></span>\n </span>\n </div>\n </div>\n </div>\n `;\n}\n\nexport function renderStreamingGroup(\n text: string,\n startedAt: number,\n onOpenSidebar?: (content: string) => void,\n assistant?: AssistantIdentity,\n) {\n const timestamp = new Date(startedAt).toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n const name = assistant?.name ?? \"Assistant\";\n\n return html`\n <div class=\"chat-group assistant\">\n ${renderAvatar(\"assistant\", assistant)}\n <div class=\"chat-group-messages\">\n ${renderGroupedMessage(\n {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n timestamp: startedAt,\n },\n { isStreaming: true, showReasoning: false },\n onOpenSidebar,\n )}\n <div class=\"chat-group-footer\">\n <span class=\"chat-sender-name\">${name}</span>\n <span class=\"chat-group-timestamp\">${timestamp}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nexport function renderMessageGroup(\n group: MessageGroup,\n opts: {\n onOpenSidebar?: (content: string) => void;\n showReasoning: boolean;\n assistantName?: string;\n assistantAvatar?: string | null;\n },\n) {\n const normalizedRole = normalizeRoleForGrouping(group.role);\n const assistantName = opts.assistantName ?? \"Assistant\";\n const who =\n normalizedRole === \"user\"\n ? \"You\"\n : normalizedRole === \"assistant\"\n ? assistantName\n : normalizedRole;\n const roleClass =\n normalizedRole === \"user\"\n ? \"user\"\n : normalizedRole === \"assistant\"\n ? \"assistant\"\n : \"other\";\n const timestamp = new Date(group.timestamp).toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n\n return html`\n <div class=\"chat-group ${roleClass}\">\n ${renderAvatar(group.role, {\n name: assistantName,\n avatar: opts.assistantAvatar ?? null,\n })}\n <div class=\"chat-group-messages\">\n ${group.messages.map((item, index) =>\n renderGroupedMessage(\n item.message,\n {\n isStreaming:\n group.isStreaming && index === group.messages.length - 1,\n showReasoning: opts.showReasoning,\n },\n opts.onOpenSidebar,\n ),\n )}\n <div class=\"chat-group-footer\">\n <span class=\"chat-sender-name\">${who}</span>\n <span class=\"chat-group-timestamp\">${timestamp}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderAvatar(\n role: string,\n assistant?: Pick<AssistantIdentity, \"name\" | \"avatar\">,\n) {\n const normalized = normalizeRoleForGrouping(role);\n const assistantName = assistant?.name?.trim() || \"Assistant\";\n const assistantAvatar = assistant?.avatar?.trim() || \"\";\n const initial =\n normalized === \"user\"\n ? \"U\"\n : normalized === \"assistant\"\n ? assistantName.charAt(0).toUpperCase() || \"A\"\n : normalized === \"tool\"\n ? \"⚙\"\n : \"?\";\n const className =\n normalized === \"user\"\n ? \"user\"\n : normalized === \"assistant\"\n ? \"assistant\"\n : normalized === \"tool\"\n ? \"tool\"\n : \"other\";\n\n if (assistantAvatar && normalized === \"assistant\") {\n if (isAvatarUrl(assistantAvatar)) {\n return html`<img\n class=\"chat-avatar ${className}\"\n src=\"${assistantAvatar}\"\n alt=\"${assistantName}\"\n />`;\n }\n return html`<div class=\"chat-avatar ${className}\">${assistantAvatar}</div>`;\n }\n\n return html`<div class=\"chat-avatar ${className}\">${initial}</div>`;\n}\n\nfunction isAvatarUrl(value: string): boolean {\n return (\n /^https?:\\/\\//i.test(value) ||\n /^data:image\\//i.test(value) ||\n /^\\//.test(value) // Relative paths from avatar endpoint\n );\n}\n\nfunction renderMessageImages(images: ImageBlock[]) {\n if (images.length === 0) return nothing;\n\n return html`\n <div class=\"chat-message-images\">\n ${images.map(\n (img) => html`\n <img\n src=${img.url}\n alt=${img.alt ?? \"Attached image\"}\n class=\"chat-message-image\"\n @click=${() => window.open(img.url, \"_blank\")}\n />\n `,\n )}\n </div>\n `;\n}\n\nfunction renderGroupedMessage(\n message: unknown,\n opts: { isStreaming: boolean; showReasoning: boolean },\n onOpenSidebar?: (content: string) => void,\n) {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n const isToolResult =\n isToolResultMessage(message) ||\n role.toLowerCase() === \"toolresult\" ||\n role.toLowerCase() === \"tool_result\" ||\n typeof m.toolCallId === \"string\" ||\n typeof m.tool_call_id === \"string\";\n\n const toolCards = extractToolCards(message);\n const hasToolCards = toolCards.length > 0;\n const images = extractImages(message);\n const hasImages = images.length > 0;\n\n const extractedText = extractTextCached(message);\n const extractedThinking =\n opts.showReasoning && role === \"assistant\"\n ? extractThinkingCached(message)\n : null;\n const markdownBase = extractedText?.trim() ? extractedText : null;\n const reasoningMarkdown = extractedThinking\n ? formatReasoningMarkdown(extractedThinking)\n : null;\n const markdown = markdownBase;\n const canCopyMarkdown = role === \"assistant\" && Boolean(markdown?.trim());\n\n const bubbleClasses = [\n \"chat-bubble\",\n canCopyMarkdown ? \"has-copy\" : \"\",\n opts.isStreaming ? \"streaming\" : \"\",\n \"fade-in\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (!markdown && hasToolCards && isToolResult) {\n return html`${toolCards.map((card) =>\n renderToolCardSidebar(card, onOpenSidebar),\n )}`;\n }\n\n if (!markdown && !hasToolCards && !hasImages) return nothing;\n\n return html`\n <div class=\"${bubbleClasses}\">\n ${canCopyMarkdown ? renderCopyAsMarkdownButton(markdown!) : nothing}\n ${renderMessageImages(images)}\n ${reasoningMarkdown\n ? html`<div class=\"chat-thinking\">${unsafeHTML(\n toSanitizedMarkdownHtml(reasoningMarkdown),\n )}</div>`\n : nothing}\n ${markdown\n ? html`<div class=\"chat-text\">${unsafeHTML(toSanitizedMarkdownHtml(markdown))}</div>`\n : nothing}\n ${toolCards.map((card) => renderToolCardSidebar(card, onOpenSidebar))}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport { icons } from \"../icons\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\n\nexport type MarkdownSidebarProps = {\n content: string | null;\n error: string | null;\n onClose: () => void;\n onViewRawText: () => void;\n};\n\nexport function renderMarkdownSidebar(props: MarkdownSidebarProps) {\n return html`\n <div class=\"sidebar-panel\">\n <div class=\"sidebar-header\">\n <div class=\"sidebar-title\">Tool Output</div>\n <button @click=${props.onClose} class=\"btn\" title=\"Close sidebar\">\n ${icons.x}\n </button>\n </div>\n <div class=\"sidebar-content\">\n ${props.error\n ? html`\n <div class=\"callout danger\">${props.error}</div>\n <button @click=${props.onViewRawText} class=\"btn\" style=\"margin-top: 12px;\">\n View Raw Text\n </button>\n `\n : props.content\n ? html`<div class=\"sidebar-markdown\">${unsafeHTML(toSanitizedMarkdownHtml(props.content))}</div>`\n : html`<div class=\"muted\">No content available</div>`}\n </div>\n </div>\n `;\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * A draggable divider for resizable split views.\n * Dispatches 'resize' events with { splitRatio: number } detail.\n */\n@customElement(\"resizable-divider\")\nexport class ResizableDivider extends LitElement {\n @property({ type: Number }) splitRatio = 0.6;\n @property({ type: Number }) minRatio = 0.4;\n @property({ type: Number }) maxRatio = 0.7;\n\n private isDragging = false;\n private startX = 0;\n private startRatio = 0;\n\n static styles = css`\n :host {\n width: 4px;\n cursor: col-resize;\n background: var(--border, #333);\n transition: background 150ms ease-out;\n flex-shrink: 0;\n position: relative;\n }\n\n :host::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -4px;\n right: -4px;\n bottom: 0;\n }\n\n :host(:hover) {\n background: var(--accent, #007bff);\n }\n\n :host(.dragging) {\n background: var(--accent, #007bff);\n }\n `;\n\n render() {\n return html``;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"mousedown\", this.handleMouseDown);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"mousedown\", this.handleMouseDown);\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n }\n\n private handleMouseDown = (e: MouseEvent) => {\n this.isDragging = true;\n this.startX = e.clientX;\n this.startRatio = this.splitRatio;\n this.classList.add(\"dragging\");\n\n document.addEventListener(\"mousemove\", this.handleMouseMove);\n document.addEventListener(\"mouseup\", this.handleMouseUp);\n\n e.preventDefault();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n const container = this.parentElement;\n if (!container) return;\n\n const containerWidth = container.getBoundingClientRect().width;\n const deltaX = e.clientX - this.startX;\n const deltaRatio = deltaX / containerWidth;\n\n let newRatio = this.startRatio + deltaRatio;\n newRatio = Math.max(this.minRatio, Math.min(this.maxRatio, newRatio));\n\n this.dispatchEvent(\n new CustomEvent(\"resize\", {\n detail: { splitRatio: newRatio },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private handleMouseUp = () => {\n this.isDragging = false;\n this.classList.remove(\"dragging\");\n\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"resizable-divider\": ResizableDivider;\n }\n}\n","import { html, nothing } from \"lit\";\nimport { ref } from \"lit/directives/ref.js\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport type { SessionsListResult } from \"../types\";\nimport type { ChatAttachment, ChatQueueItem } from \"../ui-types\";\nimport type { ChatItem, MessageGroup } from \"../types/chat-types\";\nimport { icons } from \"../icons\";\nimport {\n normalizeMessage,\n normalizeRoleForGrouping,\n} from \"../chat/message-normalizer\";\nimport {\n renderMessageGroup,\n renderReadingIndicatorGroup,\n renderStreamingGroup,\n} from \"../chat/grouped-render\";\nimport { renderMarkdownSidebar } from \"./markdown-sidebar\";\nimport \"../components/resizable-divider\";\n\nexport type CompactionIndicatorStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\nexport type ChatProps = {\n sessionKey: string;\n onSessionKeyChange: (next: string) => void;\n thinkingLevel: string | null;\n showThinking: boolean;\n loading: boolean;\n sending: boolean;\n canAbort?: boolean;\n compactionStatus?: CompactionIndicatorStatus | null;\n messages: unknown[];\n toolMessages: unknown[];\n stream: string | null;\n streamStartedAt: number | null;\n assistantAvatarUrl?: string | null;\n draft: string;\n queue: ChatQueueItem[];\n connected: boolean;\n canSend: boolean;\n disabledReason: string | null;\n error: string | null;\n sessions: SessionsListResult | null;\n // Focus mode\n focusMode: boolean;\n // Sidebar state\n sidebarOpen?: boolean;\n sidebarContent?: string | null;\n sidebarError?: string | null;\n splitRatio?: number;\n assistantName: string;\n assistantAvatar: string | null;\n // Image attachments\n attachments?: ChatAttachment[];\n onAttachmentsChange?: (attachments: ChatAttachment[]) => void;\n // Event handlers\n onRefresh: () => void;\n onToggleFocusMode: () => void;\n onDraftChange: (next: string) => void;\n onSend: () => void;\n onAbort?: () => void;\n onQueueRemove: (id: string) => void;\n onNewSession: () => void;\n onOpenSidebar?: (content: string) => void;\n onCloseSidebar?: () => void;\n onSplitRatioChange?: (ratio: number) => void;\n onChatScroll?: (event: Event) => void;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nfunction adjustTextareaHeight(el: HTMLTextAreaElement) {\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n}\n\nfunction renderCompactionIndicator(status: CompactionIndicatorStatus | null | undefined) {\n if (!status) return nothing;\n\n // Show \"compacting...\" while active\n if (status.active) {\n return html`\n <div class=\"callout info compaction-indicator compaction-indicator--active\">\n ${icons.loader} 正在压缩上下文...\n </div>\n `;\n }\n\n // Show \"compaction complete\" briefly after completion\n if (status.completedAt) {\n const elapsed = Date.now() - status.completedAt;\n if (elapsed < COMPACTION_TOAST_DURATION_MS) {\n return html`\n <div class=\"callout success compaction-indicator compaction-indicator--complete\">\n ${icons.check} 上下文已压缩\n </div>\n `;\n }\n }\n\n return nothing;\n}\n\nfunction generateAttachmentId(): string {\n return `att-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction handlePaste(\n e: ClipboardEvent,\n props: ChatProps,\n) {\n const items = e.clipboardData?.items;\n if (!items || !props.onAttachmentsChange) return;\n\n const imageItems: DataTransferItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\")) {\n imageItems.push(item);\n }\n }\n\n if (imageItems.length === 0) return;\n\n e.preventDefault();\n\n for (const item of imageItems) {\n const file = item.getAsFile();\n if (!file) continue;\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: file.type,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n }\n}\n\nfunction renderAttachmentPreview(props: ChatProps) {\n const attachments = props.attachments ?? [];\n if (attachments.length === 0) return nothing;\n\n return html`\n <div class=\"chat-attachments\">\n ${attachments.map(\n (att) => html`\n <div class=\"chat-attachment\">\n <img\n src=${att.dataUrl}\n alt=\"附件预览\"\n class=\"chat-attachment__img\"\n />\n <button\n class=\"chat-attachment__remove\"\n type=\"button\"\n aria-label=\"移除附件\"\n @click=${() => {\n const next = (props.attachments ?? []).filter(\n (a) => a.id !== att.id,\n );\n props.onAttachmentsChange?.(next);\n }}\n >\n ${icons.x}\n </button>\n </div>\n `,\n )}\n </div>\n `;\n}\n\nexport function renderChat(props: ChatProps) {\n const canCompose = props.connected;\n const isBusy = props.sending || props.stream !== null;\n const canAbort = Boolean(props.canAbort && props.onAbort);\n const activeSession = props.sessions?.sessions?.find(\n (row) => row.key === props.sessionKey,\n );\n const reasoningLevel = activeSession?.reasoningLevel ?? \"off\";\n const showReasoning = props.showThinking && reasoningLevel !== \"off\";\n const assistantIdentity = {\n name: props.assistantName,\n avatar: props.assistantAvatar ?? props.assistantAvatarUrl ?? null,\n };\n\n const hasAttachments = (props.attachments?.length ?? 0) > 0;\n const composePlaceholder = props.connected\n ? hasAttachments\n ? \"添加消息或粘贴更多图片...\"\n : \"消息 (↩ 发送, Shift+↩ 换行, 可粘贴图片)\"\n : \"连接网关开始对话…\";\n\n const splitRatio = props.splitRatio ?? 0.6;\n const sidebarOpen = Boolean(props.sidebarOpen && props.onCloseSidebar);\n const thread = html`\n <div\n class=\"chat-thread\"\n role=\"log\"\n aria-live=\"polite\"\n @scroll=${props.onChatScroll}\n >\n ${props.loading ? html`<div class=\"muted\">正在加载对话…</div>` : nothing}\n ${repeat(buildChatItems(props), (item) => item.key, (item) => {\n if (item.kind === \"reading-indicator\") {\n return renderReadingIndicatorGroup(assistantIdentity);\n }\n\n if (item.kind === \"stream\") {\n return renderStreamingGroup(\n item.text,\n item.startedAt,\n props.onOpenSidebar,\n assistantIdentity,\n );\n }\n\n if (item.kind === \"group\") {\n return renderMessageGroup(item, {\n onOpenSidebar: props.onOpenSidebar,\n showReasoning,\n assistantName: props.assistantName,\n assistantAvatar: assistantIdentity.avatar,\n });\n }\n\n return nothing;\n })}\n </div>\n `;\n\n return html`\n <section class=\"card chat\">\n ${props.disabledReason\n ? html`<div class=\"callout\">${props.disabledReason}</div>`\n : nothing}\n\n ${props.error\n ? html`<div class=\"callout danger\">${props.error}</div>`\n : nothing}\n\n ${renderCompactionIndicator(props.compactionStatus)}\n\n ${props.focusMode\n ? html`\n <button\n class=\"chat-focus-exit\"\n type=\"button\"\n @click=${props.onToggleFocusMode}\n aria-label=\"Exit focus mode\"\n title=\"Exit focus mode\"\n >\n ${icons.x}\n </button>\n `\n : nothing}\n\n <div\n class=\"chat-split-container ${sidebarOpen ? \"chat-split-container--open\" : \"\"}\"\n >\n <div\n class=\"chat-main\"\n style=\"flex: ${sidebarOpen ? `0 0 ${splitRatio * 100}%` : \"1 1 100%\"}\"\n >\n ${thread}\n </div>\n\n ${sidebarOpen\n ? html`\n <resizable-divider\n .splitRatio=${splitRatio}\n @resize=${(e: CustomEvent) =>\n props.onSplitRatioChange?.(e.detail.splitRatio)}\n ></resizable-divider>\n <div class=\"chat-sidebar\">\n ${renderMarkdownSidebar({\n content: props.sidebarContent ?? null,\n error: props.sidebarError ?? null,\n onClose: props.onCloseSidebar!,\n onViewRawText: () => {\n if (!props.sidebarContent || !props.onOpenSidebar) return;\n props.onOpenSidebar(`\\`\\`\\`\\n${props.sidebarContent}\\n\\`\\`\\``);\n },\n })}\n </div>\n `\n : nothing}\n </div>\n\n ${props.queue.length\n ? html`\n <div class=\"chat-queue\" role=\"status\" aria-live=\"polite\">\n <div class=\"chat-queue__title\">队列中 (${props.queue.length})</div>\n <div class=\"chat-queue__list\">\n ${props.queue.map(\n (item) => html`\n <div class=\"chat-queue__item\">\n <div class=\"chat-queue__text\">\n ${item.text ||\n (item.attachments?.length\n ? `图片 (${item.attachments.length})`\n : \"\")}\n </div>\n <button\n class=\"btn chat-queue__remove\"\n type=\"button\"\n aria-label=\"移除队列消息\"\n @click=${() => props.onQueueRemove(item.id)}\n >\n ${icons.x}\n </button>\n </div>\n `,\n )}\n </div>\n </div>\n `\n : nothing}\n\n <div class=\"chat-compose\">\n ${renderAttachmentPreview(props)}\n <div class=\"chat-compose__row\">\n <label class=\"field chat-compose__field\">\n <span>消息</span>\n <textarea\n ${ref((el) => el && adjustTextareaHeight(el as HTMLTextAreaElement))}\n .value=${props.draft}\n ?disabled=${!props.connected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n if (e.isComposing || e.keyCode === 229) return;\n if (e.shiftKey) return; // Allow Shift+Enter for line breaks\n if (!props.connected) return;\n e.preventDefault();\n if (canCompose) props.onSend();\n }}\n @input=${(e: Event) => {\n const target = e.target as HTMLTextAreaElement;\n adjustTextareaHeight(target);\n props.onDraftChange(target.value);\n }}\n @paste=${(e: ClipboardEvent) => handlePaste(e, props)}\n placeholder=${composePlaceholder}\n ></textarea>\n </label>\n <div class=\"chat-compose__actions\">\n <button\n class=\"btn\"\n ?disabled=${!props.connected || (!canAbort && props.sending)}\n @click=${canAbort ? props.onAbort : props.onNewSession}\n >\n ${canAbort ? \"停止\" : \"新会话\"}\n </button>\n <button\n class=\"btn primary\"\n ?disabled=${!props.connected}\n @click=${props.onSend}\n >\n ${isBusy ? \"排队\" : \"发送\"}<kbd class=\"btn-kbd\">↵</kbd>\n </button>\n </div>\n </div>\n </div>\n </section>\n `;\n}\n\nconst CHAT_HISTORY_RENDER_LIMIT = 200;\n\nfunction groupMessages(items: ChatItem[]): Array<ChatItem | MessageGroup> {\n const result: Array<ChatItem | MessageGroup> = [];\n let currentGroup: MessageGroup | null = null;\n\n for (const item of items) {\n if (item.kind !== \"message\") {\n if (currentGroup) {\n result.push(currentGroup);\n currentGroup = null;\n }\n result.push(item);\n continue;\n }\n\n const normalized = normalizeMessage(item.message);\n const role = normalizeRoleForGrouping(normalized.role);\n const timestamp = normalized.timestamp || Date.now();\n\n if (!currentGroup || currentGroup.role !== role) {\n if (currentGroup) result.push(currentGroup);\n currentGroup = {\n kind: \"group\",\n key: `group:${role}:${item.key}`,\n role,\n messages: [{ message: item.message, key: item.key }],\n timestamp,\n isStreaming: false,\n };\n } else {\n currentGroup.messages.push({ message: item.message, key: item.key });\n }\n }\n\n if (currentGroup) result.push(currentGroup);\n return result;\n}\n\nfunction buildChatItems(props: ChatProps): Array<ChatItem | MessageGroup> {\n const items: ChatItem[] = [];\n const history = Array.isArray(props.messages) ? props.messages : [];\n const tools = Array.isArray(props.toolMessages) ? props.toolMessages : [];\n const historyStart = Math.max(0, history.length - CHAT_HISTORY_RENDER_LIMIT);\n if (historyStart > 0) {\n items.push({\n kind: \"message\",\n key: \"chat:history:notice\",\n message: {\n role: \"system\",\n content: `显示最近 ${CHAT_HISTORY_RENDER_LIMIT} 条消息(已隐藏 ${historyStart} 条)。`,\n timestamp: Date.now(),\n },\n });\n }\n for (let i = historyStart; i < history.length; i++) {\n const msg = history[i];\n const normalized = normalizeMessage(msg);\n\n if (!props.showThinking && normalized.role.toLowerCase() === \"toolresult\") {\n continue;\n }\n\n items.push({\n kind: \"message\",\n key: messageKey(msg, i),\n message: msg,\n });\n }\n if (props.showThinking) {\n for (let i = 0; i < tools.length; i++) {\n items.push({\n kind: \"message\",\n key: messageKey(tools[i], i + history.length),\n message: tools[i],\n });\n }\n }\n\n if (props.stream !== null) {\n const key = `stream:${props.sessionKey}:${props.streamStartedAt ?? \"live\"}`;\n if (props.stream.trim().length > 0) {\n items.push({\n kind: \"stream\",\n key,\n text: props.stream,\n startedAt: props.streamStartedAt ?? Date.now(),\n });\n } else {\n items.push({ kind: \"reading-indicator\", key });\n }\n }\n\n return groupMessages(items);\n}\n\nfunction messageKey(message: unknown, index: number): string {\n const m = message as Record<string, unknown>;\n const toolCallId = typeof m.toolCallId === \"string\" ? m.toolCallId : \"\";\n if (toolCallId) return `tool:${toolCallId}`;\n const id = typeof m.id === \"string\" ? m.id : \"\";\n if (id) return `msg:${id}`;\n const messageId = typeof m.messageId === \"string\" ? m.messageId : \"\";\n if (messageId) return `msg:${messageId}`;\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : null;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n if (timestamp != null) return `msg:${role}:${timestamp}:${index}`;\n return `msg:${role}:${index}`;\n}\n","import type { ConfigUiHints } from \"../types\";\n\nexport type JsonSchema = {\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema | JsonSchema[];\n additionalProperties?: JsonSchema | boolean;\n enum?: unknown[];\n const?: unknown;\n default?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n nullable?: boolean;\n};\n\nexport function schemaType(schema: JsonSchema): string | undefined {\n if (!schema) return undefined;\n if (Array.isArray(schema.type)) {\n const filtered = schema.type.filter((t) => t !== \"null\");\n return filtered[0] ?? schema.type[0];\n }\n return schema.type;\n}\n\nexport function defaultValue(schema?: JsonSchema): unknown {\n if (!schema) return \"\";\n if (schema.default !== undefined) return schema.default;\n const type = schemaType(schema);\n switch (type) {\n case \"object\":\n return {};\n case \"array\":\n return [];\n case \"boolean\":\n return false;\n case \"number\":\n case \"integer\":\n return 0;\n case \"string\":\n return \"\";\n default:\n return \"\";\n }\n}\n\nexport function pathKey(path: Array<string | number>): string {\n return path.filter((segment) => typeof segment === \"string\").join(\".\");\n}\n\nexport function hintForPath(path: Array<string | number>, hints: ConfigUiHints) {\n const key = pathKey(path);\n const direct = hints[key];\n if (direct) return direct;\n const segments = key.split(\".\");\n for (const [hintKey, hint] of Object.entries(hints)) {\n if (!hintKey.includes(\"*\")) continue;\n const hintSegments = hintKey.split(\".\");\n if (hintSegments.length !== segments.length) continue;\n let match = true;\n for (let i = 0; i < segments.length; i += 1) {\n if (hintSegments[i] !== \"*\" && hintSegments[i] !== segments[i]) {\n match = false;\n break;\n }\n }\n if (match) return hint;\n }\n return undefined;\n}\n\n// 动态标签翻译映射\nconst LABEL_TRANSLATIONS: Record<string, string> = {\n // 通用标签\n \"Enabled\": \"已启用\",\n \"Mode\": \"模式\",\n \"Path\": \"路径\",\n \"Port\": \"端口\",\n \"Timeout Ms\": \"超时 (毫秒)\",\n \"Timeout Seconds\": \"超时 (秒)\",\n \"Max Bytes\": \"最大字节数\",\n \"Max Chars\": \"最大字符数\",\n \"Max Redirects\": \"最大重定向次数\",\n \"Max Pages\": \"最大页数\",\n \"Max Pixels\": \"最大像素\",\n \"Max Tokens\": \"最大令牌数\",\n \"Max Concurrent\": \"最大并发数\",\n \"Max Attempts\": \"最大尝试次数\",\n \"Max Body Bytes\": \"最大请求体字节数\",\n \"Max Text Length\": \"最大文本长度\",\n \"Max Attachments\": \"最大附件数\",\n \"Min Chars\": \"最小字符数\",\n \"Min Text Chars\": \"最小文本字符数\",\n \"Debounce Ms\": \"防抖 (毫秒)\",\n \"Base Url\": \"基础 URL\",\n \"Api Key\": \"API 密钥\",\n \"Token\": \"令牌\",\n \"Model\": \"模型\",\n \"Model Id\": \"模型 ID\",\n \"Provider\": \"提供商\",\n \"Language\": \"语言\",\n \"Language Code\": \"语言代码\",\n \"Lang\": \"语言\",\n \"Bind\": \"绑定\",\n \"Default\": \"默认值\",\n \"Level\": \"级别\",\n \"Label\": \"标签\",\n \"Strategy\": \"策略\",\n \"Scope\": \"范围\",\n \"Store\": \"存储\",\n \"Seed\": \"种子\",\n \"Prompt\": \"提示词\",\n \"Color\": \"颜色\",\n \"Rate\": \"速率\",\n \"Speed\": \"速度\",\n \"Pitch\": \"音调\",\n \"Volume\": \"音量\",\n \"Voice\": \"语音\",\n \"Voice Id\": \"语音 ID\",\n \"Region\": \"区域\",\n \"Domain\": \"域名\",\n \"User\": \"用户\",\n \"Proxy\": \"代理\",\n \"Root\": \"根目录\",\n \"File\": \"文件\",\n \"Factor\": \"因子\",\n \"Start\": \"开始\",\n \"End\": \"结束\",\n \"Cap\": \"上限\",\n \"Ttl\": \"存活时间\",\n \"Jitter\": \"抖动\",\n \"Image\": \"图像\",\n \"Topic\": \"主题\",\n \"Target\": \"目标\",\n \"Account\": \"账户\",\n \"Transport\": \"传输\",\n \"Driver\": \"驱动\",\n \"Network\": \"网络\",\n \"Memory\": \"内存\",\n \"Memory Swap\": \"内存交换\",\n \"Workdir\": \"工作目录\",\n \"Cpus\": \"CPU 数量\",\n \"Placeholder\": \"占位符\",\n \"Subscription\": \"订阅\",\n \"To\": \"目标\",\n \"Every\": \"间隔\",\n \"Thinking\": \"思考\",\n \"Thinking Default\": \"默认思考\",\n \"Style\": \"样式\",\n \"Prefer\": \"偏好\",\n \"Drop\": \"丢弃\",\n \"Auto\": \"自动\",\n \"Wait\": \"等待\",\n \"Session\": \"会话\",\n // 章节标题\n \"Diagnostics\": \"诊断\",\n \"Approvals\": \"审批\",\n \"Media\": \"媒体\",\n \"NodeHost\": \"节点主机\",\n \"Node Host\": \"节点主机\",\n \"Browser\": \"浏览器\",\n \"Tools\": \"工具\",\n \"Web\": \"网页\",\n // 对象标题\n \"Auth\": \"认证\",\n \"Http\": \"HTTP\",\n \"HTTP\": \"HTTP\",\n \"Endpoints\": \"端点\",\n \"Responses\": \"响应\",\n \"Files\": \"文件\",\n \"Images\": \"图像\",\n \"Pdf\": \"PDF\",\n \"PDF\": \"PDF\",\n \"Chat Completions\": \"聊天补全\",\n \"Control Ui\": \"控制台 UI\",\n \"Reload\": \"重载\",\n \"Nodes\": \"节点\",\n \"Browser Proxy\": \"浏览器代理\",\n \"Cache Trace\": \"缓存追踪\",\n \"Otel\": \"OpenTelemetry\",\n \"OpenTelemetry\": \"OpenTelemetry\",\n \"Headers\": \"请求头\",\n \"Remote\": \"远程\",\n \"Defaults\": \"默认配置\",\n \"Exec\": \"执行\",\n \"Apply Patch\": \"应用补丁\",\n \"Docker\": \"Docker\",\n \"Sandbox\": \"沙箱\",\n \"Elevated\": \"提权\",\n \"Message\": \"消息\",\n \"Cross Context\": \"跨上下文\",\n \"Marker\": \"标记\",\n \"Broadcast\": \"广播\",\n \"Links\": \"链接\",\n \"Audio\": \"音频\",\n \"Video\": \"视频\",\n \"Search\": \"搜索\",\n \"Perplexity\": \"Perplexity\",\n \"Fetch\": \"获取\",\n \"Cooldowns\": \"冷却时间\",\n \"Profiles\": \"配置\",\n \"Model Overrides\": \"模型覆盖\",\n \"Human Delay\": \"人性化延迟\",\n \"Image Model\": \"图像模型\",\n \"Memory Search\": \"记忆搜索\",\n \"Local\": \"本地\",\n \"Batch\": \"批处理\",\n \"Query\": \"查询\",\n \"Hybrid\": \"混合\",\n \"Cache\": \"缓存\",\n \"Chunking\": \"分块\",\n \"Sync\": \"同步\",\n \"Sessions\": \"会话\",\n \"Vector\": \"向量\",\n \"Compaction\": \"压缩\",\n \"Hard Clear\": \"硬清除\",\n \"Soft Trim\": \"软裁剪\",\n \"Context Pruning\": \"上下文修剪\",\n \"Prune\": \"修剪\",\n \"Subagents\": \"子代理\",\n \"Inbound\": \"入站\",\n \"Outbound\": \"出站\",\n \"Tts\": \"语音合成\",\n \"TTS\": \"语音合成\",\n \"Edge\": \"Edge\",\n \"Openai\": \"OpenAI\",\n \"OpenAI\": \"OpenAI\",\n \"Elevenlabs\": \"ElevenLabs\",\n \"ElevenLabs\": \"ElevenLabs\",\n \"Deepgram\": \"Deepgram\",\n \"Voice Settings\": \"语音设置\",\n \"Voice Aliases\": \"语音别名\",\n \"Provider Options\": \"提供商选项\",\n \"Streaming\": \"流式传输\",\n \"Block Streaming Chunk\": \"块流分块\",\n \"Block Streaming Coalesce\": \"块流合并\",\n \"Stt\": \"语音转文本\",\n \"STT\": \"语音转文本\",\n \"Transcription\": \"转录\",\n \"Dm\": \"私信\",\n \"DM\": \"私信\",\n \"Reconnect\": \"重连\",\n \"Thread\": \"线程\",\n \"Group Chat\": \"群聊\",\n \"Group\": \"群组\",\n \"Tls\": \"TLS\",\n \"TLS\": \"TLS\",\n \"Tailscale\": \"Tailscale\",\n \"Serve\": \"服务\",\n \"Tunnel\": \"隧道\",\n \"Twilio\": \"Twilio\",\n \"Telnyx\": \"Telnyx\",\n \"Plivo\": \"Plivo\",\n \"Identity Links\": \"身份链接\",\n \"Agent To Agent\": \"代理间\",\n \"Reset\": \"重置\",\n \"Reset By Channel\": \"按渠道重置\",\n \"Reset By Type\": \"按类型重置\",\n \"Queue\": \"队列\",\n \"Shell Env\": \"Shell 环境\",\n \"Env\": \"环境变量\",\n \"Vars\": \"变量\",\n \"Heartbeat\": \"心跳\",\n \"Mdns\": \"mDNS\",\n \"mDNS\": \"mDNS\",\n \"Wide Area\": \"广域\",\n \"Load\": \"加载\",\n \"Entries\": \"条目\",\n \"Installs\": \"安装\",\n \"Install\": \"安装\",\n \"Active Hours\": \"活跃时段\",\n \"Allow From\": \"允许来源\",\n \"Send Policy\": \"发送策略\",\n \"By Channel\": \"按渠道\",\n \"Debounce Ms By Channel\": \"按渠道防抖\",\n \"Assistant\": \"助手\",\n \"Memory Flush\": \"内存刷新\",\n \"Embedding\": \"嵌入\",\n \"Experimental\": \"实验性\",\n \"Internal\": \"内部\",\n \"LLM Task\": \"LLM 任务\",\n \"LLM Task Config\": \"LLM 任务配置\",\n \"Lobster\": \"Lobster\",\n \"Lobster Config\": \"Lobster 配置\",\n \"OpenProse\": \"OpenProse\",\n \"OpenProse Config\": \"OpenProse 配置\",\n \"Memory (Core)\": \"记忆 (核心)\",\n \"Memory (Core) Config\": \"记忆 (核心) 配置\",\n \"Bedrock Discovery\": \"Bedrock 发现\",\n \"Providers\": \"提供商\",\n \"Gmail\": \"Gmail\",\n \"Webchat\": \"网页聊天\",\n // 字段标签\n \"Allow Tailscale\": \"允许 Tailscale\",\n \"Allow Host Control\": \"允许主机控制\",\n \"Allow Model Id\": \"允许模型 ID\",\n \"Allow Normalization\": \"允许规范化\",\n \"Allow Provider\": \"允许提供商\",\n \"Allow Seed\": \"允许种子\",\n \"Allow Text\": \"允许文本\",\n \"Allow Unsafe External Content\": \"允许不安全的外部内容\",\n \"Allow Url\": \"允许 URL\",\n \"Allow Voice\": \"允许语音\",\n \"Allow Voice Settings\": \"允许语音设置\",\n \"Attach Only\": \"仅附加\",\n \"Auto Generate\": \"自动生成\",\n \"Auto Start\": \"自动启动\",\n \"Auto-Capture\": \"自动捕获\",\n \"Auto-Recall\": \"自动回忆\",\n \"Detect Language\": \"检测语言\",\n \"Enable Streaming\": \"启用流式传输\",\n \"Enable LLM Task\": \"启用 LLM 任务\",\n \"Enable Lobster\": \"启用 Lobster\",\n \"Enable Memory (Core)\": \"启用记忆 (核心)\",\n \"Enable No Vnc\": \"启用 NoVNC\",\n \"Enable OpenProse\": \"启用 OpenProse\",\n \"Enable qwen-portal-auth\": \"启用 qwen-portal-auth\",\n \"Skip Signature Verification\": \"跳过签名验证\",\n \"Headless\": \"无头模式\",\n \"Include Body\": \"包含请求体\",\n \"Include Reasoning\": \"包含推理\",\n \"Interrupt On Speech\": \"语音中断\",\n \"Live Reload\": \"实时重载\",\n \"No Sandbox\": \"无沙箱\",\n \"Per Session\": \"每会话\",\n \"Prefer Brew\": \"优先 Brew\",\n \"Preserve Filenames\": \"保留文件名\",\n \"Punctuate\": \"标点\",\n \"Read Only Root\": \"只读根目录\",\n \"Remove Ack After Reply\": \"回复后移除确认\",\n \"Reset On Exit\": \"退出时重置\",\n \"Save Subtitles\": \"保存字幕\",\n \"Skip Bootstrap\": \"跳过引导\",\n \"Smart Format\": \"智能格式\",\n \"Use Speaker Boost\": \"使用扬声器增强\",\n // 数组标签\n \"Agent Filter\": \"代理过滤器\",\n \"Allow\": \"允许列表\",\n \"Allow Bundled\": \"允许捆绑\",\n \"Allowed Mimes\": \"允许的 MIME 类型\",\n \"Allowed Models\": \"允许的模型\",\n \"Also Allow\": \"同时允许\",\n \"Binds\": \"绑定\",\n \"Cap Drop\": \"丢弃权限\",\n \"Command\": \"命令\",\n \"Deny\": \"拒绝列表\",\n \"Dns\": \"DNS\",\n \"DNS\": \"DNS\",\n \"Extra Dirs\": \"额外目录\",\n \"Extra Hosts\": \"额外主机\",\n \"Handlers\": \"处理器\",\n \"Inbound Allowlist\": \"入站白名单\",\n \"Mappings\": \"映射\",\n \"Mention Patterns\": \"提及模式\",\n \"Presets\": \"预设\",\n \"Provider Filter\": \"提供商过滤器\",\n \"Redact Patterns\": \"脱敏模式\",\n \"Reset Triggers\": \"重置触发器\",\n \"Rules\": \"规则\",\n \"Session Filter\": \"会话过滤器\",\n \"Targets\": \"目标\",\n \"Tmpfs\": \"临时文件系统\",\n \"Trusted Proxies\": \"可信代理\",\n // 其他常见字段\n \"Last Run At\": \"上次运行时间\",\n \"Last Run Command\": \"上次运行命令\",\n \"Last Run Commit\": \"上次运行提交\",\n \"Last Run Mode\": \"上次运行模式\",\n \"Last Run Version\": \"上次运行版本\",\n \"Console Level\": \"控制台级别\",\n \"Console Style\": \"控制台样式\",\n \"Database Path\": \"数据库路径\",\n \"Context Tokens\": \"上下文令牌数\",\n \"Default Auth Profile Id\": \"默认认证配置 ID\",\n \"Default Call Mode\": \"默认呼叫模式\",\n \"Default Context Window\": \"默认上下文窗口\",\n \"Default Max Tokens\": \"默认最大令牌数\",\n \"Default Model\": \"默认模型\",\n \"Default Profile\": \"默认配置\",\n \"Default Provider\": \"默认提供商\",\n \"Default To Number\": \"默认目标号码\",\n \"Embedding Model\": \"嵌入模型\",\n \"Executable Path\": \"可执行路径\",\n \"From Number\": \"来源号码\",\n \"Head Chars\": \"头部字符数\",\n \"Heartbeat Seconds\": \"心跳间隔 (秒)\",\n \"History Limit\": \"历史限制\",\n \"Hook Url\": \"钩子 URL\",\n \"Idle Hours\": \"空闲小时数\",\n \"Idle Minutes\": \"空闲分钟数\",\n \"Idle Ms\": \"空闲 (毫秒)\",\n \"Initial Ms\": \"初始 (毫秒)\",\n \"Interval Minutes\": \"间隔分钟数\",\n \"Keep Last Assistants\": \"保留最后助手数\",\n \"Key Path\": \"密钥路径\",\n \"Main Key\": \"主密钥\",\n \"Max Age Days\": \"最大天数\",\n \"Max Concurrent Calls\": \"最大并发呼叫数\",\n \"Max Concurrent Runs\": \"最大并发运行数\",\n \"Max Duration Seconds\": \"最大持续时间 (秒)\",\n \"Max History Share\": \"最大历史共享\",\n \"Max Ms\": \"最大 (毫秒)\",\n \"Message Prefix\": \"消息前缀\",\n \"Min Prunable Tool Chars\": \"最小可修剪工具字符数\",\n \"Notify Hangup Delay (sec)\": \"挂断通知延迟 (秒)\",\n \"Output Format\": \"输出格式\",\n \"Pids Limit\": \"进程数限制\",\n \"Poll Interval Ms\": \"轮询间隔 (毫秒)\",\n \"Prefs Path\": \"偏好路径\",\n \"Redact Sensitive\": \"脱敏敏感信息\",\n \"Refresh Interval\": \"刷新间隔\",\n \"Renew Every Minutes\": \"续订间隔 (分钟)\",\n \"Reserve Tokens Floor\": \"保留令牌下限\",\n \"Response Model\": \"响应模型\",\n \"Response Prefix\": \"响应前缀\",\n \"Response System Prompt\": \"响应系统提示词\",\n \"Response Timeout (ms)\": \"响应超时 (毫秒)\",\n \"Ring Timeout Ms\": \"响铃超时 (毫秒)\",\n \"Session Tools Visibility\": \"会话工具可见性\",\n \"Setup Command\": \"设置命令\",\n \"Silence Duration Ms\": \"静音持续 (毫秒)\",\n \"Silence Timeout Ms\": \"静音超时 (毫秒)\",\n \"Similarity Boost\": \"相似度增强\",\n \"Soft Threshold Tokens\": \"软阈值令牌数\",\n \"Soft Trim Ratio\": \"软裁剪比例\",\n \"Stability\": \"稳定性\",\n \"Summary Model\": \"摘要模型\",\n \"System Prompt\": \"系统提示词\",\n \"Tail Chars\": \"尾部字符数\",\n \"Time Format\": \"时间格式\",\n \"Timeout Minutes\": \"超时 (分钟)\",\n \"Timeout Sec\": \"超时 (秒)\",\n \"Timezone\": \"时区\",\n \"Transcript Timeout Ms\": \"转录超时 (毫秒)\",\n \"Transforms Dir\": \"转换目录\",\n \"Typing Interval Seconds\": \"输入间隔 (秒)\",\n \"Typing Mode\": \"输入模式\",\n \"User Timezone\": \"用户时区\",\n \"Vad Threshold\": \"语音活动检测阈值\",\n \"Verbose Default\": \"默认详细模式\",\n \"Workspace Access\": \"工作空间访问\",\n \"Workspace Root\": \"工作空间根目录\",\n \"Ack Max Chars\": \"确认最大字符数\",\n \"Apply Text Normalization\": \"应用文本规范化\",\n \"Archive After Minutes\": \"归档间隔 (分钟)\",\n \"At Hour\": \"在小时\",\n \"Auth Id\": \"认证 ID\",\n \"Auth Token\": \"认证令牌\",\n \"Auto Start Timeout Ms\": \"自动启动超时 (毫秒)\",\n \"Background Ms\": \"后台 (毫秒)\",\n \"Block Streaming Break\": \"块流中断\",\n \"Block Streaming Default\": \"块流默认\",\n \"Break Preference\": \"断行偏好\",\n \"Ca Path\": \"CA 路径\",\n \"Call Log Store Path\": \"呼叫日志存储路径\",\n \"Cdp Port\": \"CDP 端口\",\n \"Cdp Url\": \"CDP URL\",\n \"CDP URL\": \"CDP URL\",\n \"Cert Path\": \"证书路径\",\n \"Cleanup Ms\": \"清理 (毫秒)\",\n \"Container Prefix\": \"容器前缀\",\n \"Discord\": \"Discord\",\n \"Elevated Default\": \"提权默认值\",\n \"Hard Clear Ratio\": \"硬清除比例\",\n \"Imessage\": \"iMessage\",\n \"iMessage\": \"iMessage\",\n \"Inbound Greeting\": \"入站问候语\",\n \"Inbound Policy\": \"入站策略\",\n \"Mattermost\": \"Mattermost\",\n \"Media Max Mb\": \"媒体最大 MB\",\n \"Media Stream Path\": \"媒体流路径\",\n \"Model Cache Dir\": \"模型缓存目录\",\n \"Msteams\": \"MS Teams\",\n \"MS Teams\": \"MS Teams\",\n \"Node Manager\": \"节点管理器\",\n \"No Vnc Port\": \"NoVNC 端口\",\n \"Public Webhook URL\": \"公共 Webhook URL\",\n \"Push Token\": \"推送令牌\",\n \"Realtime STT Model\": \"实时语音转文本模型\",\n \"Seccomp Profile\": \"Seccomp 配置\",\n \"Apparmor Profile\": \"AppArmor 配置\",\n \"Signal\": \"Signal\",\n \"Slack\": \"Slack\",\n \"Stt Provider\": \"语音转文本提供商\",\n \"Tailscale Mode\": \"Tailscale 模式\",\n \"Tailscale Path\": \"Tailscale 路径\",\n \"Telegram\": \"Telegram\",\n \"TTS Provider Override\": \"语音合成提供商覆盖\",\n \"Tunnel Provider\": \"隧道提供商\",\n \"Vnc Port\": \"VNC 端口\",\n \"Webhook Bind\": \"Webhook 绑定\",\n \"Webhook Path\": \"Webhook 路径\",\n \"Webhook Port\": \"Webhook 端口\",\n \"Whatsapp\": \"WhatsApp\",\n \"WhatsApp\": \"WhatsApp\",\n // API 密钥类\n \"ElevenLabs API Key\": \"ElevenLabs API 密钥\",\n \"ElevenLabs Base URL\": \"ElevenLabs 基础 URL\",\n \"ElevenLabs Model ID\": \"ElevenLabs 模型 ID\",\n \"ElevenLabs Voice ID\": \"ElevenLabs 语音 ID\",\n \"OpenAI API Key\": \"OpenAI API 密钥\",\n \"OpenAI Realtime API Key\": \"OpenAI 实时 API 密钥\",\n \"OpenAI TTS Model\": \"OpenAI 语音合成模型\",\n \"OpenAI TTS Voice\": \"OpenAI 语音合成声音\",\n \"Telnyx API Key\": \"Telnyx API 密钥\",\n \"Telnyx Connection ID\": \"Telnyx 连接 ID\",\n \"Telnyx Public Key\": \"Telnyx 公钥\",\n \"Twilio Account SID\": \"Twilio 账户 SID\",\n \"Twilio Auth Token\": \"Twilio 认证令牌\",\n \"ngrok Auth Token\": \"ngrok 认证令牌\",\n \"ngrok Domain\": \"ngrok 域名\",\n \"Allow ngrok Free Tier (Loopback Bypass)\": \"允许 ngrok 免费版 (回环绕过)\",\n // 插件相关\n \"@openclaw/bluebubbles\": \"@openclaw/bluebubbles\",\n \"@openclaw/bluebubbles Config\": \"@openclaw/bluebubbles 配置\",\n \"@openclaw/copilot-proxy\": \"@openclaw/copilot-proxy\",\n \"@openclaw/copilot-proxy Config\": \"@openclaw/copilot-proxy 配置\",\n \"@openclaw/diagnostics-otel\": \"@openclaw/diagnostics-otel\",\n \"@openclaw/diagnostics-otel Config\": \"@openclaw/diagnostics-otel 配置\",\n \"@openclaw/discord\": \"@openclaw/discord\",\n \"@openclaw/discord Config\": \"@openclaw/discord 配置\",\n \"@openclaw/google-antigravity-auth\": \"@openclaw/google-antigravity-auth\",\n \"@openclaw/google-antigravity-auth Config\": \"@openclaw/google-antigravity-auth 配置\",\n \"@openclaw/google-gemini-cli-auth\": \"@openclaw/google-gemini-cli-auth\",\n \"@openclaw/google-gemini-cli-auth Config\": \"@openclaw/google-gemini-cli-auth 配置\",\n \"@openclaw/googlechat\": \"@openclaw/googlechat\",\n \"@openclaw/googlechat Config\": \"@openclaw/googlechat 配置\",\n \"@openclaw/imessage\": \"@openclaw/imessage\",\n \"@openclaw/imessage Config\": \"@openclaw/imessage 配置\",\n \"@openclaw/line\": \"@openclaw/line\",\n \"@openclaw/line Config\": \"@openclaw/line 配置\",\n \"@openclaw/matrix\": \"@openclaw/matrix\",\n \"@openclaw/matrix Config\": \"@openclaw/matrix 配置\",\n \"@openclaw/mattermost\": \"@openclaw/mattermost\",\n \"@openclaw/mattermost Config\": \"@openclaw/mattermost 配置\",\n \"@openclaw/memory-lancedb\": \"@openclaw/memory-lancedb\",\n \"@openclaw/memory-lancedb Config\": \"@openclaw/memory-lancedb 配置\",\n \"@openclaw/msteams\": \"@openclaw/msteams\",\n \"@openclaw/msteams Config\": \"@openclaw/msteams 配置\",\n \"@openclaw/nextcloud-talk\": \"@openclaw/nextcloud-talk\",\n \"@openclaw/nextcloud-talk Config\": \"@openclaw/nextcloud-talk 配置\",\n \"@openclaw/nostr\": \"@openclaw/nostr\",\n \"@openclaw/nostr Config\": \"@openclaw/nostr 配置\",\n \"@openclaw/signal\": \"@openclaw/signal\",\n \"@openclaw/signal Config\": \"@openclaw/signal 配置\",\n \"@openclaw/slack\": \"@openclaw/slack\",\n \"@openclaw/slack Config\": \"@openclaw/slack 配置\",\n \"@openclaw/telegram\": \"@openclaw/telegram\",\n \"@openclaw/telegram Config\": \"@openclaw/telegram 配置\",\n \"@openclaw/tlon\": \"@openclaw/tlon\",\n \"@openclaw/tlon Config\": \"@openclaw/tlon 配置\",\n \"@openclaw/twitch\": \"@openclaw/twitch\",\n \"@openclaw/twitch Config\": \"@openclaw/twitch 配置\",\n \"@openclaw/voice-call\": \"@openclaw/voice-call\",\n \"@openclaw/voice-call Config\": \"@openclaw/voice-call 配置\",\n \"@openclaw/whatsapp\": \"@openclaw/whatsapp\",\n \"@openclaw/whatsapp Config\": \"@openclaw/whatsapp 配置\",\n \"@openclaw/zalo\": \"@openclaw/zalo\",\n \"@openclaw/zalo Config\": \"@openclaw/zalo 配置\",\n \"@openclaw/zalouser\": \"@openclaw/zalouser\",\n \"@openclaw/zalouser Config\": \"@openclaw/zalouser 配置\",\n \"qwen-portal-auth Config\": \"qwen-portal-auth 配置\",\n // 启用插件\n \"Enable @openclaw/bluebubbles\": \"启用 @openclaw/bluebubbles\",\n \"Enable @openclaw/copilot-proxy\": \"启用 @openclaw/copilot-proxy\",\n \"Enable @openclaw/diagnostics-otel\": \"启用 @openclaw/diagnostics-otel\",\n \"Enable @openclaw/discord\": \"启用 @openclaw/discord\",\n \"Enable @openclaw/google-antigravity-auth\": \"启用 @openclaw/google-antigravity-auth\",\n \"Enable @openclaw/google-gemini-cli-auth\": \"启用 @openclaw/google-gemini-cli-auth\",\n \"Enable @openclaw/googlechat\": \"启用 @openclaw/googlechat\",\n \"Enable @openclaw/imessage\": \"启用 @openclaw/imessage\",\n \"Enable @openclaw/line\": \"启用 @openclaw/line\",\n \"Enable @openclaw/matrix\": \"启用 @openclaw/matrix\",\n \"Enable @openclaw/mattermost\": \"启用 @openclaw/mattermost\",\n \"Enable @openclaw/memory-lancedb\": \"启用 @openclaw/memory-lancedb\",\n \"Enable @openclaw/msteams\": \"启用 @openclaw/msteams\",\n \"Enable @openclaw/nextcloud-talk\": \"启用 @openclaw/nextcloud-talk\",\n \"Enable @openclaw/nostr\": \"启用 @openclaw/nostr\",\n \"Enable @openclaw/signal\": \"启用 @openclaw/signal\",\n \"Enable @openclaw/slack\": \"启用 @openclaw/slack\",\n \"Enable @openclaw/telegram\": \"启用 @openclaw/telegram\",\n \"Enable @openclaw/tlon\": \"启用 @openclaw/tlon\",\n \"Enable @openclaw/twitch\": \"启用 @openclaw/twitch\",\n \"Enable @openclaw/voice-call\": \"启用 @openclaw/voice-call\",\n \"Enable @openclaw/whatsapp\": \"启用 @openclaw/whatsapp\",\n \"Enable @openclaw/zalo\": \"启用 @openclaw/zalo\",\n \"Enable @openclaw/zalouser\": \"启用 @openclaw/zalouser\"\n};\n\nexport function humanize(raw: string) {\n const titleCase = raw\n .replace(/_/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/\\s+/g, \" \")\n .replace(/^./, (m) => m.toUpperCase());\n return LABEL_TRANSLATIONS[titleCase] || titleCase;\n}\n\nexport function isSensitivePath(path: Array<string | number>): boolean {\n const key = pathKey(path).toLowerCase();\n return (\n key.includes(\"token\") ||\n key.includes(\"password\") ||\n key.includes(\"secret\") ||\n key.includes(\"apikey\") ||\n key.endsWith(\"key\")\n );\n}\n","import { html, nothing, type TemplateResult } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport {\n defaultValue,\n hintForPath,\n humanize,\n isSensitivePath,\n pathKey,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\n\nconst META_KEYS = new Set([\"title\", \"description\", \"default\", \"nullable\"]);\n\nfunction isAnySchema(schema: JsonSchema): boolean {\n const keys = Object.keys(schema ?? {}).filter((key) => !META_KEYS.has(key));\n return keys.length === 0;\n}\n\nfunction jsonValue(value: unknown): string {\n if (value === undefined) return \"\";\n try {\n return JSON.stringify(value, null, 2) ?? \"\";\n } catch {\n return \"\";\n }\n}\n\n// SVG Icons as template literals\nconst icons = {\n chevronDown: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>`,\n plus: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>`,\n minus: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>`,\n trash: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"3 6 5 6 21 6\"></polyline><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></svg>`,\n edit: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"></path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"></path></svg>`,\n};\n\nexport function renderNode(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult | typeof nothing {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const type = schemaType(schema);\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const key = pathKey(path);\n\n if (unsupported.has(key)) {\n return html`<div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported schema node. Use Raw mode.</div>\n </div>`;\n }\n\n // Handle anyOf/oneOf unions\n if (schema.anyOf || schema.oneOf) {\n const variants = schema.anyOf ?? schema.oneOf ?? [];\n const nonNull = variants.filter(\n (v) => !(v.type === \"null\" || (Array.isArray(v.type) && v.type.includes(\"null\")))\n );\n\n if (nonNull.length === 1) {\n return renderNode({ ...params, schema: nonNull[0] });\n }\n\n // Check if it's a set of literal values (enum-like)\n const extractLiteral = (v: JsonSchema): unknown | undefined => {\n if (v.const !== undefined) return v.const;\n if (v.enum && v.enum.length === 1) return v.enum[0];\n return undefined;\n };\n const literals = nonNull.map(extractLiteral);\n const allLiterals = literals.every((v) => v !== undefined);\n\n if (allLiterals && literals.length > 0 && literals.length <= 5) {\n // Use segmented control for small sets\n const resolvedValue = value ?? schema.default;\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-segmented\">\n ${literals.map((lit, idx) => html`\n <button\n type=\"button\"\n class=\"cfg-segmented__btn ${lit === resolvedValue || String(lit) === String(resolvedValue) ? 'active' : ''}\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, lit)}\n >\n ${String(lit)}\n </button>\n `)}\n </div>\n </div>\n `;\n }\n\n if (allLiterals && literals.length > 5) {\n // Use dropdown for larger sets\n return renderSelect({ ...params, options: literals, value: value ?? schema.default });\n }\n\n // Handle mixed primitive types\n const primitiveTypes = new Set(\n nonNull.map((variant) => schemaType(variant)).filter(Boolean)\n );\n const normalizedTypes = new Set(\n [...primitiveTypes].map((v) => (v === \"integer\" ? \"number\" : v))\n );\n\n if ([...normalizedTypes].every((v) => [\"string\", \"number\", \"boolean\"].includes(v as string))) {\n const hasString = normalizedTypes.has(\"string\");\n const hasNumber = normalizedTypes.has(\"number\");\n const hasBoolean = normalizedTypes.has(\"boolean\");\n\n if (hasBoolean && normalizedTypes.size === 1) {\n return renderNode({\n ...params,\n schema: { ...schema, type: \"boolean\", anyOf: undefined, oneOf: undefined },\n });\n }\n\n if (hasString || hasNumber) {\n return renderTextInput({\n ...params,\n inputType: hasNumber && !hasString ? \"number\" : \"text\",\n });\n }\n }\n }\n\n // Enum - use segmented for small, dropdown for large\n if (schema.enum) {\n const options = schema.enum;\n if (options.length <= 5) {\n const resolvedValue = value ?? schema.default;\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-segmented\">\n ${options.map((opt) => html`\n <button\n type=\"button\"\n class=\"cfg-segmented__btn ${opt === resolvedValue || String(opt) === String(resolvedValue) ? 'active' : ''}\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, opt)}\n >\n ${String(opt)}\n </button>\n `)}\n </div>\n </div>\n `;\n }\n return renderSelect({ ...params, options, value: value ?? schema.default });\n }\n\n // Object type - collapsible section\n if (type === \"object\") {\n return renderObject(params);\n }\n\n // Array type\n if (type === \"array\") {\n return renderArray(params);\n }\n\n // Boolean - toggle row\n if (type === \"boolean\") {\n const displayValue = typeof value === \"boolean\" ? value : typeof schema.default === \"boolean\" ? schema.default : false;\n return html`\n <label class=\"cfg-toggle-row ${disabled ? 'disabled' : ''}\">\n <div class=\"cfg-toggle-row__content\">\n <span class=\"cfg-toggle-row__label\">${label}</span>\n ${help ? html`<span class=\"cfg-toggle-row__help\">${help}</span>` : nothing}\n </div>\n <div class=\"cfg-toggle\">\n <input\n type=\"checkbox\"\n .checked=${displayValue}\n ?disabled=${disabled}\n @change=${(e: Event) => onPatch(path, (e.target as HTMLInputElement).checked)}\n />\n <span class=\"cfg-toggle__track\"></span>\n </div>\n </label>\n `;\n }\n\n // Number/Integer\n if (type === \"number\" || type === \"integer\") {\n return renderNumberInput(params);\n }\n\n // String\n if (type === \"string\") {\n return renderTextInput({ ...params, inputType: \"text\" });\n }\n\n // Fallback\n return html`\n <div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported type: ${type}. Use Raw mode.</div>\n </div>\n `;\n}\n\nfunction renderTextInput(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n inputType: \"text\" | \"number\";\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, onPatch, inputType } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const isSensitive = hint?.sensitive ?? isSensitivePath(path);\n const placeholder =\n hint?.placeholder ??\n (isSensitive ? \"••••\" : schema.default !== undefined ? `Default: ${schema.default}` : \"\");\n const displayValue = value ?? \"\";\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-input-wrap\">\n <input\n type=${isSensitive ? \"password\" : inputType}\n class=\"cfg-input\"\n placeholder=${placeholder}\n .value=${displayValue == null ? \"\" : String(displayValue)}\n ?disabled=${disabled}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n if (inputType === \"number\") {\n if (raw.trim() === \"\") {\n onPatch(path, undefined);\n return;\n }\n const parsed = Number(raw);\n onPatch(path, Number.isNaN(parsed) ? raw : parsed);\n return;\n }\n onPatch(path, raw);\n }}\n @change=${(e: Event) => {\n if (inputType === \"number\") return;\n const raw = (e.target as HTMLInputElement).value;\n onPatch(path, raw.trim());\n }}\n />\n ${schema.default !== undefined ? html`\n <button\n type=\"button\"\n class=\"cfg-input__reset\"\n title=\"Reset to default\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, schema.default)}\n >↺</button>\n ` : nothing}\n </div>\n </div>\n `;\n}\n\nfunction renderNumberInput(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const displayValue = value ?? schema.default ?? \"\";\n const numValue = typeof displayValue === \"number\" ? displayValue : 0;\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <div class=\"cfg-number\">\n <button\n type=\"button\"\n class=\"cfg-number__btn\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, numValue - 1)}\n >−</button>\n <input\n type=\"number\"\n class=\"cfg-number__input\"\n .value=${displayValue == null ? \"\" : String(displayValue)}\n ?disabled=${disabled}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n const parsed = raw === \"\" ? undefined : Number(raw);\n onPatch(path, parsed);\n }}\n />\n <button\n type=\"button\"\n class=\"cfg-number__btn\"\n ?disabled=${disabled}\n @click=${() => onPatch(path, numValue + 1)}\n >+</button>\n </div>\n </div>\n `;\n}\n\nfunction renderSelect(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n disabled: boolean;\n showLabel?: boolean;\n options: unknown[];\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, disabled, options, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n const resolvedValue = value ?? schema.default;\n const currentIndex = options.findIndex(\n (opt) => opt === resolvedValue || String(opt) === String(resolvedValue),\n );\n const unset = \"__unset__\";\n\n return html`\n <div class=\"cfg-field\">\n ${showLabel ? html`<label class=\"cfg-field__label\">${label}</label>` : nothing}\n ${help ? html`<div class=\"cfg-field__help\">${help}</div>` : nothing}\n <select\n class=\"cfg-select\"\n ?disabled=${disabled}\n .value=${currentIndex >= 0 ? String(currentIndex) : unset}\n @change=${(e: Event) => {\n const val = (e.target as HTMLSelectElement).value;\n onPatch(path, val === unset ? undefined : options[Number(val)]);\n }}\n >\n <option value=${unset}>Select...</option>\n ${options.map((opt, idx) => html`\n <option value=${String(idx)}>${String(opt)}</option>\n `)}\n </select>\n </div>\n `;\n}\n\nfunction renderObject(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n const fallback = value ?? schema.default;\n const obj = fallback && typeof fallback === \"object\" && !Array.isArray(fallback)\n ? (fallback as Record<string, unknown>)\n : {};\n const props = schema.properties ?? {};\n const entries = Object.entries(props);\n\n // Sort by hint order\n const sorted = entries.sort((a, b) => {\n const orderA = hintForPath([...path, a[0]], hints)?.order ?? 0;\n const orderB = hintForPath([...path, b[0]], hints)?.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n const reserved = new Set(Object.keys(props));\n const additional = schema.additionalProperties;\n const allowExtra = Boolean(additional) && typeof additional === \"object\";\n\n // For top-level, don't wrap in collapsible\n if (path.length === 1) {\n return html`\n <div class=\"cfg-fields\">\n ${sorted.map(([propKey, node]) =>\n renderNode({\n schema: node,\n value: obj[propKey],\n path: [...path, propKey],\n hints,\n unsupported,\n disabled,\n onPatch,\n })\n )}\n ${allowExtra ? renderMapField({\n schema: additional as JsonSchema,\n value: obj,\n path,\n hints,\n unsupported,\n disabled,\n reservedKeys: reserved,\n onPatch,\n }) : nothing}\n </div>\n `;\n }\n\n // Nested objects get collapsible treatment\n return html`\n <details class=\"cfg-object\" open>\n <summary class=\"cfg-object__header\">\n <span class=\"cfg-object__title\">${label}</span>\n <span class=\"cfg-object__chevron\">${icons.chevronDown}</span>\n </summary>\n ${help ? html`<div class=\"cfg-object__help\">${help}</div>` : nothing}\n <div class=\"cfg-object__content\">\n ${sorted.map(([propKey, node]) =>\n renderNode({\n schema: node,\n value: obj[propKey],\n path: [...path, propKey],\n hints,\n unsupported,\n disabled,\n onPatch,\n })\n )}\n ${allowExtra ? renderMapField({\n schema: additional as JsonSchema,\n value: obj,\n path,\n hints,\n unsupported,\n disabled,\n reservedKeys: reserved,\n onPatch,\n }) : nothing}\n </div>\n </details>\n `;\n}\n\nfunction renderArray(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n showLabel?: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, onPatch } = params;\n const showLabel = params.showLabel ?? true;\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n const itemsSchema = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n if (!itemsSchema) {\n return html`\n <div class=\"cfg-field cfg-field--error\">\n <div class=\"cfg-field__label\">${label}</div>\n <div class=\"cfg-field__error\">Unsupported array schema. Use Raw mode.</div>\n </div>\n `;\n }\n\n const arr = Array.isArray(value) ? value : Array.isArray(schema.default) ? schema.default : [];\n\n return html`\n <div class=\"cfg-array\">\n <div class=\"cfg-array__header\">\n ${showLabel ? html`<span class=\"cfg-array__label\">${label}</span>` : nothing}\n <span class=\"cfg-array__count\">${arr.length} item${arr.length !== 1 ? 's' : ''}</span>\n <button\n type=\"button\"\n class=\"cfg-array__add\"\n ?disabled=${disabled}\n @click=${() => {\n const next = [...arr, defaultValue(itemsSchema)];\n onPatch(path, next);\n }}\n >\n <span class=\"cfg-array__add-icon\">${icons.plus}</span>\n Add\n </button>\n </div>\n ${help ? html`<div class=\"cfg-array__help\">${help}</div>` : nothing}\n\n ${arr.length === 0 ? html`\n <div class=\"cfg-array__empty\">\n 暂无项目。点击\"添加\"创建一个。\n </div>\n ` : html`\n <div class=\"cfg-array__items\">\n ${arr.map((item, idx) => html`\n <div class=\"cfg-array__item\">\n <div class=\"cfg-array__item-header\">\n <span class=\"cfg-array__item-index\">#${idx + 1}</span>\n <button\n type=\"button\"\n class=\"cfg-array__item-remove\"\n title=\"Remove item\"\n ?disabled=${disabled}\n @click=${() => {\n const next = [...arr];\n next.splice(idx, 1);\n onPatch(path, next);\n }}\n >\n ${icons.trash}\n </button>\n </div>\n <div class=\"cfg-array__item-content\">\n ${renderNode({\n schema: itemsSchema,\n value: item,\n path: [...path, idx],\n hints,\n unsupported,\n disabled,\n showLabel: false,\n onPatch,\n })}\n </div>\n </div>\n `)}\n </div>\n `}\n </div>\n `;\n}\n\nfunction renderMapField(params: {\n schema: JsonSchema;\n value: Record<string, unknown>;\n path: Array<string | number>;\n hints: ConfigUiHints;\n unsupported: Set<string>;\n disabled: boolean;\n reservedKeys: Set<string>;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}): TemplateResult {\n const { schema, value, path, hints, unsupported, disabled, reservedKeys, onPatch } = params;\n const anySchema = isAnySchema(schema);\n const entries = Object.entries(value ?? {}).filter(([key]) => !reservedKeys.has(key));\n\n return html`\n <div class=\"cfg-map\">\n <div class=\"cfg-map__header\">\n <span class=\"cfg-map__label\">自定义条目</span>\n <button\n type=\"button\"\n class=\"cfg-map__add\"\n ?disabled=${disabled}\n @click=${() => {\n const next = { ...(value ?? {}) };\n let index = 1;\n let key = `custom-${index}`;\n while (key in next) {\n index += 1;\n key = `custom-${index}`;\n }\n next[key] = anySchema ? {} : defaultValue(schema);\n onPatch(path, next);\n }}\n >\n <span class=\"cfg-map__add-icon\">${icons.plus}</span>\n Add Entry\n </button>\n </div>\n\n ${entries.length === 0 ? html`\n <div class=\"cfg-map__empty\">暂无自定义条目。</div>\n ` : html`\n <div class=\"cfg-map__items\">\n ${entries.map(([key, entryValue]) => {\n const valuePath = [...path, key];\n const fallback = jsonValue(entryValue);\n return html`\n <div class=\"cfg-map__item\">\n <div class=\"cfg-map__item-key\">\n <input\n type=\"text\"\n class=\"cfg-input cfg-input--sm\"\n placeholder=\"Key\"\n .value=${key}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const nextKey = (e.target as HTMLInputElement).value.trim();\n if (!nextKey || nextKey === key) return;\n const next = { ...(value ?? {}) };\n if (nextKey in next) return;\n next[nextKey] = next[key];\n delete next[key];\n onPatch(path, next);\n }}\n />\n </div>\n <div class=\"cfg-map__item-value\">\n ${anySchema\n ? html`\n <textarea\n class=\"cfg-textarea cfg-textarea--sm\"\n placeholder=\"JSON value\"\n rows=\"2\"\n .value=${fallback}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const target = e.target as HTMLTextAreaElement;\n const raw = target.value.trim();\n if (!raw) {\n onPatch(valuePath, undefined);\n return;\n }\n try {\n onPatch(valuePath, JSON.parse(raw));\n } catch {\n target.value = fallback;\n }\n }}\n ></textarea>\n `\n : renderNode({\n schema,\n value: entryValue,\n path: valuePath,\n hints,\n unsupported,\n disabled,\n showLabel: false,\n onPatch,\n })}\n </div>\n <button\n type=\"button\"\n class=\"cfg-map__item-remove\"\n title=\"Remove entry\"\n ?disabled=${disabled}\n @click=${() => {\n const next = { ...(value ?? {}) };\n delete next[key];\n onPatch(path, next);\n }}\n >\n ${icons.trash}\n </button>\n </div>\n `;\n })}\n </div>\n `}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { icons } from \"../icons\";\nimport {\n hintForPath,\n humanize,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\nimport { renderNode } from \"./config-form.node\";\n\nexport type ConfigFormProps = {\n schema: JsonSchema | null;\n uiHints: ConfigUiHints;\n value: Record<string, unknown> | null;\n disabled?: boolean;\n unsupportedPaths?: string[];\n searchQuery?: string;\n activeSection?: string | null;\n activeSubsection?: string | null;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\n// SVG Icons for section cards (Lucide-style)\nconst sectionIcons = {\n env: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path 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\"></path></svg>`,\n update: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n agents: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path 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\"></path><circle cx=\"8\" cy=\"14\" r=\"1\"></circle><circle cx=\"16\" cy=\"14\" r=\"1\"></circle></svg>`,\n auth: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>`,\n channels: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.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\"></path></svg>`,\n messages: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><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><polyline points=\"22,6 12,13 2,6\"></polyline></svg>`,\n commands: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><polyline points=\"4 17 10 11 4 5\"></polyline><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line></svg>`,\n hooks: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><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><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></svg>`,\n skills: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><polygon 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\"></polygon></svg>`,\n tools: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path 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\"></path></svg>`,\n gateway: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path 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\"></path></svg>`,\n wizard: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M15 4V2\"></path><path d=\"M15 16v-2\"></path><path d=\"M8 9h2\"></path><path d=\"M20 9h2\"></path><path d=\"M17.8 11.8 19 13\"></path><path d=\"M15 9h0\"></path><path d=\"M17.8 6.2 19 5\"></path><path d=\"m3 21 9-9\"></path><path d=\"M12.2 6.2 11 5\"></path></svg>`,\n // Additional sections\n meta: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 20h9\"></path><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"></path></svg>`,\n logging: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line><polyline points=\"10 9 9 9 8 9\"></polyline></svg>`,\n browser: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"21.17\" y1=\"8\" x2=\"12\" y2=\"8\"></line><line x1=\"3.95\" y1=\"6.06\" x2=\"8.54\" y2=\"14\"></line><line x1=\"10.88\" y1=\"21.94\" x2=\"15.46\" y2=\"14\"></line></svg>`,\n ui: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line></svg>`,\n models: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path 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\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line></svg>`,\n bindings: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line></svg>`,\n broadcast: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M4.9 19.1C1 15.2 1 8.8 4.9 4.9\"></path><path d=\"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5\"></path><circle cx=\"12\" cy=\"12\" r=\"2\"></circle><path d=\"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5\"></path><path d=\"M19.1 4.9C23 8.8 23 15.1 19.1 19\"></path></svg>`,\n audio: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M9 18V5l12-2v13\"></path><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><circle cx=\"18\" cy=\"16\" r=\"3\"></circle></svg>`,\n session: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"9\" cy=\"7\" r=\"4\"></circle><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"></path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path></svg>`,\n cron: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`,\n web: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path 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\"></path></svg>`,\n discovery: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>`,\n canvasHost: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle><polyline points=\"21 15 16 10 5 21\"></polyline></svg>`,\n talk: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line></svg>`,\n plugins: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M12 2v6\"></path><path d=\"m4.93 10.93 4.24 4.24\"></path><path d=\"M2 12h6\"></path><path d=\"m4.93 13.07 4.24-4.24\"></path><path d=\"M12 22v-6\"></path><path d=\"m19.07 13.07-4.24-4.24\"></path><path d=\"M22 12h-6\"></path><path d=\"m19.07 10.93-4.24 4.24\"></path></svg>`,\n default: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline></svg>`,\n};\n\n// Section metadata\nexport const SECTION_META: Record<string, { label: string; description: string }> = {\n env: { label: \"环境变量\", description: \"传递给网关进程的环境变量\" },\n update: { label: \"更新\", description: \"自动更新设置和发布渠道\" },\n agents: { label: \"代理\", description: \"代理配置、模型和身份\" },\n auth: { label: \"身份验证\", description: \"API 密钥和认证配置\" },\n channels: { label: \"渠道\", description: \"消息渠道 (Telegram、Discord、Slack 等)\" },\n messages: { label: \"消息\", description: \"消息处理和路由设置\" },\n commands: { label: \"命令\", description: \"自定义斜杠命令\" },\n hooks: { label: \"钩子\", description: \"Webhooks 和事件钩子\" },\n skills: { label: \"技能\", description: \"技能包和功能\" },\n tools: { label: \"工具\", description: \"工具配置 (浏览器、搜索等)\" },\n gateway: { label: \"网关\", description: \"网关服务器设置 (端口、认证、绑定)\" },\n wizard: { label: \"设置向导\", description: \"设置向导状态和历史\" },\n // Additional sections\n meta: { label: \"元数据\", description: \"网关元数据和版本信息\" },\n logging: { label: \"日志\", description: \"日志级别和输出配置\" },\n browser: { label: \"浏览器\", description: \"浏览器自动化设置\" },\n ui: { label: \"界面\", description: \"用户界面偏好\" },\n models: { label: \"模型\", description: \"AI 模型配置和提供商\" },\n bindings: { label: \"绑定\", description: \"按键绑定和快捷键\" },\n broadcast: { label: \"广播\", description: \"广播和通知设置\" },\n audio: { label: \"音频\", description: \"音频输入/输出设置\" },\n session: { label: \"会话\", description: \"会话管理和持久化\" },\n cron: { label: \"定时任务\", description: \"计划任务和自动化\" },\n web: { label: \"网页\", description: \"网页服务器和 API 设置\" },\n discovery: { label: \"发现\", description: \"服务发现和网络\" },\n canvasHost: { label: \"画布主机\", description: \"画布渲染和显示\" },\n talk: { label: \"语音\", description: \"语音和语音设置\" },\n plugins: { label: \"插件\", description: \"插件管理和扩展\" },\n};\n\nfunction getSectionIcon(key: string) {\n return sectionIcons[key as keyof typeof sectionIcons] ?? sectionIcons.default;\n}\n\nfunction matchesSearch(key: string, schema: JsonSchema, query: string): boolean {\n if (!query) return true;\n const q = query.toLowerCase();\n const meta = SECTION_META[key];\n\n // Check key name\n if (key.toLowerCase().includes(q)) return true;\n\n // Check label and description\n if (meta) {\n if (meta.label.toLowerCase().includes(q)) return true;\n if (meta.description.toLowerCase().includes(q)) return true;\n }\n\n return schemaMatches(schema, q);\n}\n\nfunction schemaMatches(schema: JsonSchema, query: string): boolean {\n if (schema.title?.toLowerCase().includes(query)) return true;\n if (schema.description?.toLowerCase().includes(query)) return true;\n if (schema.enum?.some((value) => String(value).toLowerCase().includes(query))) return true;\n\n if (schema.properties) {\n for (const [propKey, propSchema] of Object.entries(schema.properties)) {\n if (propKey.toLowerCase().includes(query)) return true;\n if (schemaMatches(propSchema, query)) return true;\n }\n }\n\n if (schema.items) {\n const items = Array.isArray(schema.items) ? schema.items : [schema.items];\n for (const item of items) {\n if (item && schemaMatches(item, query)) return true;\n }\n }\n\n if (schema.additionalProperties && typeof schema.additionalProperties === \"object\") {\n if (schemaMatches(schema.additionalProperties, query)) return true;\n }\n\n const unions = schema.anyOf ?? schema.oneOf ?? schema.allOf;\n if (unions) {\n for (const entry of unions) {\n if (entry && schemaMatches(entry, query)) return true;\n }\n }\n\n return false;\n}\n\nexport function renderConfigForm(props: ConfigFormProps) {\n if (!props.schema) {\n return html`<div class=\"muted\">Schema unavailable.</div>`;\n }\n const schema = props.schema;\n const value = props.value ?? {};\n if (schemaType(schema) !== \"object\" || !schema.properties) {\n return html`<div class=\"callout danger\">Unsupported schema. Use Raw.</div>`;\n }\n const unsupported = new Set(props.unsupportedPaths ?? []);\n const properties = schema.properties;\n const searchQuery = props.searchQuery ?? \"\";\n const activeSection = props.activeSection;\n const activeSubsection = props.activeSubsection ?? null;\n\n const entries = Object.entries(properties).sort((a, b) => {\n const orderA = hintForPath([a[0]], props.uiHints)?.order ?? 50;\n const orderB = hintForPath([b[0]], props.uiHints)?.order ?? 50;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n const filteredEntries = entries.filter(([key, node]) => {\n if (activeSection && key !== activeSection) return false;\n if (searchQuery && !matchesSearch(key, node, searchQuery)) return false;\n return true;\n });\n\n let subsectionContext:\n | { sectionKey: string; subsectionKey: string; schema: JsonSchema }\n | null = null;\n if (activeSection && activeSubsection && filteredEntries.length === 1) {\n const sectionSchema = filteredEntries[0]?.[1];\n if (\n sectionSchema &&\n schemaType(sectionSchema) === \"object\" &&\n sectionSchema.properties &&\n sectionSchema.properties[activeSubsection]\n ) {\n subsectionContext = {\n sectionKey: activeSection,\n subsectionKey: activeSubsection,\n schema: sectionSchema.properties[activeSubsection],\n };\n }\n }\n\n if (filteredEntries.length === 0) {\n return html`\n <div class=\"config-empty\">\n <div class=\"config-empty__icon\">${icons.search}</div>\n <div class=\"config-empty__text\">\n ${searchQuery\n ? `No settings match \"${searchQuery}\"`\n : \"No settings in this section\"}\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"config-form config-form--modern\">\n ${subsectionContext\n ? (() => {\n const { sectionKey, subsectionKey, schema: node } = subsectionContext;\n const hint = hintForPath([sectionKey, subsectionKey], props.uiHints);\n const label = hint?.label ?? node.title ?? humanize(subsectionKey);\n const description = hint?.help ?? node.description ?? \"\";\n const sectionValue = (value as Record<string, unknown>)[sectionKey];\n const scopedValue =\n sectionValue && typeof sectionValue === \"object\"\n ? (sectionValue as Record<string, unknown>)[subsectionKey]\n : undefined;\n const id = `config-section-${sectionKey}-${subsectionKey}`;\n return html`\n <section class=\"config-section-card\" id=${id}>\n <div class=\"config-section-card__header\">\n <span class=\"config-section-card__icon\">${getSectionIcon(sectionKey)}</span>\n <div class=\"config-section-card__titles\">\n <h3 class=\"config-section-card__title\">${label}</h3>\n ${description\n ? html`<p class=\"config-section-card__desc\">${description}</p>`\n : nothing}\n </div>\n </div>\n <div class=\"config-section-card__content\">\n ${renderNode({\n schema: node,\n value: scopedValue,\n path: [sectionKey, subsectionKey],\n hints: props.uiHints,\n unsupported,\n disabled: props.disabled ?? false,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n </section>\n `;\n })()\n : filteredEntries.map(([key, node]) => {\n const meta = SECTION_META[key] ?? {\n label: key.charAt(0).toUpperCase() + key.slice(1),\n description: node.description ?? \"\",\n };\n\n return html`\n <section class=\"config-section-card\" id=\"config-section-${key}\">\n <div class=\"config-section-card__header\">\n <span class=\"config-section-card__icon\">${getSectionIcon(key)}</span>\n <div class=\"config-section-card__titles\">\n <h3 class=\"config-section-card__title\">${meta.label}</h3>\n ${meta.description\n ? html`<p class=\"config-section-card__desc\">${meta.description}</p>`\n : nothing}\n </div>\n </div>\n <div class=\"config-section-card__content\">\n ${renderNode({\n schema: node,\n value: (value as Record<string, unknown>)[key],\n path: [key],\n hints: props.uiHints,\n unsupported,\n disabled: props.disabled ?? false,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n </section>\n `;\n })}\n </div>\n `;\n}\n","import { pathKey, schemaType, type JsonSchema } from \"./config-form.shared\";\n\nexport type ConfigSchemaAnalysis = {\n schema: JsonSchema | null;\n unsupportedPaths: string[];\n};\n\nconst META_KEYS = new Set([\"title\", \"description\", \"default\", \"nullable\"]);\n\nfunction isAnySchema(schema: JsonSchema): boolean {\n const keys = Object.keys(schema ?? {}).filter((key) => !META_KEYS.has(key));\n return keys.length === 0;\n}\n\nfunction normalizeEnum(values: unknown[]): { enumValues: unknown[]; nullable: boolean } {\n const filtered = values.filter((value) => value != null);\n const nullable = filtered.length !== values.length;\n const enumValues: unknown[] = [];\n for (const value of filtered) {\n if (!enumValues.some((existing) => Object.is(existing, value))) {\n enumValues.push(value);\n }\n }\n return { enumValues, nullable };\n}\n\nexport function analyzeConfigSchema(raw: unknown): ConfigSchemaAnalysis {\n if (!raw || typeof raw !== \"object\") {\n return { schema: null, unsupportedPaths: [\"<root>\"] };\n }\n return normalizeSchemaNode(raw as JsonSchema, []);\n}\n\nfunction normalizeSchemaNode(\n schema: JsonSchema,\n path: Array<string | number>,\n): ConfigSchemaAnalysis {\n const unsupported = new Set<string>();\n const normalized: JsonSchema = { ...schema };\n const pathLabel = pathKey(path) || \"<root>\";\n\n if (schema.anyOf || schema.oneOf || schema.allOf) {\n const union = normalizeUnion(schema, path);\n if (union) return union;\n return { schema, unsupportedPaths: [pathLabel] };\n }\n\n const nullable = Array.isArray(schema.type) && schema.type.includes(\"null\");\n const type =\n schemaType(schema) ??\n (schema.properties || schema.additionalProperties ? \"object\" : undefined);\n normalized.type = type ?? schema.type;\n normalized.nullable = nullable || schema.nullable;\n\n if (normalized.enum) {\n const { enumValues, nullable: enumNullable } = normalizeEnum(normalized.enum);\n normalized.enum = enumValues;\n if (enumNullable) normalized.nullable = true;\n if (enumValues.length === 0) unsupported.add(pathLabel);\n }\n\n if (type === \"object\") {\n const properties = schema.properties ?? {};\n const normalizedProps: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(properties)) {\n const res = normalizeSchemaNode(value, [...path, key]);\n if (res.schema) normalizedProps[key] = res.schema;\n for (const entry of res.unsupportedPaths) unsupported.add(entry);\n }\n normalized.properties = normalizedProps;\n\n if (schema.additionalProperties === true) {\n unsupported.add(pathLabel);\n } else if (schema.additionalProperties === false) {\n normalized.additionalProperties = false;\n } else if (\n schema.additionalProperties &&\n typeof schema.additionalProperties === \"object\"\n ) {\n if (!isAnySchema(schema.additionalProperties as JsonSchema)) {\n const res = normalizeSchemaNode(\n schema.additionalProperties as JsonSchema,\n [...path, \"*\"],\n );\n normalized.additionalProperties =\n res.schema ?? (schema.additionalProperties as JsonSchema);\n if (res.unsupportedPaths.length > 0) unsupported.add(pathLabel);\n }\n }\n } else if (type === \"array\") {\n const itemsSchema = Array.isArray(schema.items)\n ? schema.items[0]\n : schema.items;\n if (!itemsSchema) {\n unsupported.add(pathLabel);\n } else {\n const res = normalizeSchemaNode(itemsSchema, [...path, \"*\"]);\n normalized.items = res.schema ?? itemsSchema;\n if (res.unsupportedPaths.length > 0) unsupported.add(pathLabel);\n }\n } else if (\n type !== \"string\" &&\n type !== \"number\" &&\n type !== \"integer\" &&\n type !== \"boolean\" &&\n !normalized.enum\n ) {\n unsupported.add(pathLabel);\n }\n\n return {\n schema: normalized,\n unsupportedPaths: Array.from(unsupported),\n };\n}\n\nfunction normalizeUnion(\n schema: JsonSchema,\n path: Array<string | number>,\n): ConfigSchemaAnalysis | null {\n if (schema.allOf) return null;\n const union = schema.anyOf ?? schema.oneOf;\n if (!union) return null;\n\n const literals: unknown[] = [];\n const remaining: JsonSchema[] = [];\n let nullable = false;\n\n for (const entry of union) {\n if (!entry || typeof entry !== \"object\") return null;\n if (Array.isArray(entry.enum)) {\n const { enumValues, nullable: enumNullable } = normalizeEnum(entry.enum);\n literals.push(...enumValues);\n if (enumNullable) nullable = true;\n continue;\n }\n if (\"const\" in entry) {\n if (entry.const == null) {\n nullable = true;\n continue;\n }\n literals.push(entry.const);\n continue;\n }\n if (schemaType(entry) === \"null\") {\n nullable = true;\n continue;\n }\n remaining.push(entry);\n }\n\n if (literals.length > 0 && remaining.length === 0) {\n const unique: unknown[] = [];\n for (const value of literals) {\n if (!unique.some((existing) => Object.is(existing, value))) {\n unique.push(value);\n }\n }\n return {\n schema: {\n ...schema,\n enum: unique,\n nullable,\n anyOf: undefined,\n oneOf: undefined,\n allOf: undefined,\n },\n unsupportedPaths: [],\n };\n }\n\n if (remaining.length === 1) {\n const res = normalizeSchemaNode(remaining[0], path);\n if (res.schema) {\n res.schema.nullable = nullable || res.schema.nullable;\n }\n return res;\n }\n\n const primitiveTypes = [\"string\", \"number\", \"integer\", \"boolean\"];\n if (\n remaining.length > 0 &&\n literals.length === 0 &&\n remaining.every((entry) => entry.type && primitiveTypes.includes(String(entry.type)))\n ) {\n return {\n schema: {\n ...schema,\n nullable,\n },\n unsupportedPaths: [],\n };\n }\n\n return null;\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { analyzeConfigSchema, renderConfigForm, SECTION_META } from \"./config-form\";\nimport {\n hintForPath,\n humanize,\n schemaType,\n type JsonSchema,\n} from \"./config-form.shared\";\n\nexport type ConfigProps = {\n raw: string;\n originalRaw: string;\n valid: boolean | null;\n issues: unknown[];\n loading: boolean;\n saving: boolean;\n applying: boolean;\n updating: boolean;\n connected: boolean;\n schema: unknown | null;\n schemaLoading: boolean;\n uiHints: ConfigUiHints;\n formMode: \"form\" | \"raw\";\n formValue: Record<string, unknown> | null;\n originalValue: Record<string, unknown> | null;\n searchQuery: string;\n activeSection: string | null;\n activeSubsection: string | null;\n onRawChange: (next: string) => void;\n onFormModeChange: (mode: \"form\" | \"raw\") => void;\n onFormPatch: (path: Array<string | number>, value: unknown) => void;\n onSearchChange: (query: string) => void;\n onSectionChange: (section: string | null) => void;\n onSubsectionChange: (section: string | null) => void;\n onReload: () => void;\n onSave: () => void;\n onApply: () => void;\n onUpdate: () => void;\n};\n\n// SVG Icons for sidebar (Lucide-style)\nconst sidebarIcons = {\n all: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect></svg>`,\n env: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"3\"></circle><path 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\"></path></svg>`,\n update: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`,\n agents: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path 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\"></path><circle cx=\"8\" cy=\"14\" r=\"1\"></circle><circle cx=\"16\" cy=\"14\" r=\"1\"></circle></svg>`,\n auth: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>`,\n channels: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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></svg>`,\n messages: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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><polyline points=\"22,6 12,13 2,6\"></polyline></svg>`,\n commands: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"4 17 10 11 4 5\"></polyline><line x1=\"12\" y1=\"19\" x2=\"20\" y2=\"19\"></line></svg>`,\n hooks: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><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><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></svg>`,\n skills: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon 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\"></polygon></svg>`,\n tools: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path 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\"></path></svg>`,\n gateway: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path 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\"></path></svg>`,\n wizard: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M15 4V2\"></path><path d=\"M15 16v-2\"></path><path d=\"M8 9h2\"></path><path d=\"M20 9h2\"></path><path d=\"M17.8 11.8 19 13\"></path><path d=\"M15 9h0\"></path><path d=\"M17.8 6.2 19 5\"></path><path d=\"m3 21 9-9\"></path><path d=\"M12.2 6.2 11 5\"></path></svg>`,\n // Additional sections\n meta: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 20h9\"></path><path d=\"M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z\"></path></svg>`,\n logging: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline><line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\"></line><line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\"></line><polyline points=\"10 9 9 9 8 9\"></polyline></svg>`,\n browser: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><circle cx=\"12\" cy=\"12\" r=\"4\"></circle><line x1=\"21.17\" y1=\"8\" x2=\"12\" y2=\"8\"></line><line x1=\"3.95\" y1=\"6.06\" x2=\"8.54\" y2=\"14\"></line><line x1=\"10.88\" y1=\"21.94\" x2=\"15.46\" y2=\"14\"></line></svg>`,\n ui: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"></line><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"></line></svg>`,\n models: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path 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\"></path><polyline points=\"3.27 6.96 12 12.01 20.73 6.96\"></polyline><line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\"></line></svg>`,\n bindings: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\"></rect><line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\"></line><line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\"></line></svg>`,\n broadcast: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4.9 19.1C1 15.2 1 8.8 4.9 4.9\"></path><path d=\"M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5\"></path><circle cx=\"12\" cy=\"12\" r=\"2\"></circle><path d=\"M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5\"></path><path d=\"M19.1 4.9C23 8.8 23 15.1 19.1 19\"></path></svg>`,\n audio: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 18V5l12-2v13\"></path><circle cx=\"6\" cy=\"18\" r=\"3\"></circle><circle cx=\"18\" cy=\"16\" r=\"3\"></circle></svg>`,\n session: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"></path><circle cx=\"9\" cy=\"7\" r=\"4\"></circle><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"></path><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path></svg>`,\n cron: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`,\n web: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><path 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\"></path></svg>`,\n discovery: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>`,\n canvasHost: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"></circle><polyline points=\"21 15 16 10 5 21\"></polyline></svg>`,\n talk: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line></svg>`,\n plugins: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 2v6\"></path><path d=\"m4.93 10.93 4.24 4.24\"></path><path d=\"M2 12h6\"></path><path d=\"m4.93 13.07 4.24-4.24\"></path><path d=\"M12 22v-6\"></path><path d=\"m19.07 13.07-4.24-4.24\"></path><path d=\"M22 12h-6\"></path><path d=\"m19.07 10.93-4.24 4.24\"></path></svg>`,\n default: html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"></path><polyline points=\"14 2 14 8 20 8\"></polyline></svg>`,\n};\n\n// Section definitions\nconst SECTIONS: Array<{ key: string; label: string }> = [\n { key: \"env\", label: \"环境\" },\n { key: \"update\", label: \"更新\" },\n { key: \"agents\", label: \"代理\" },\n { key: \"auth\", label: \"身份验证\" },\n { key: \"channels\", label: \"渠道\" },\n { key: \"messages\", label: \"消息\" },\n { key: \"commands\", label: \"命令\" },\n { key: \"hooks\", label: \"钩子\" },\n { key: \"skills\", label: \"技能\" },\n { key: \"tools\", label: \"工具\" },\n { key: \"gateway\", label: \"网关\" },\n { key: \"wizard\", label: \"设置向导\" },\n { key: \"meta\", label: \"元数据\" },\n { key: \"diagnostics\", label: \"诊断\" },\n { key: \"logging\", label: \"日志\" },\n { key: \"browser\", label: \"浏览器\" },\n { key: \"ui\", label: \"界面\" },\n { key: \"models\", label: \"模型\" },\n { key: \"nodeHost\", label: \"节点主机\" },\n { key: \"bindings\", label: \"绑定\" },\n { key: \"broadcast\", label: \"广播\" },\n { key: \"audio\", label: \"音频\" },\n { key: \"media\", label: \"媒体\" },\n { key: \"approvals\", label: \"审批\" },\n { key: \"session\", label: \"会话\" },\n { key: \"cron\", label: \"定时任务\" },\n { key: \"web\", label: \"网页\" },\n { key: \"discovery\", label: \"发现\" },\n { key: \"canvasHost\", label: \"画布主机\" },\n { key: \"talk\", label: \"语音\" },\n { key: \"plugins\", label: \"插件\" },\n];\n\ntype SubsectionEntry = {\n key: string;\n label: string;\n description?: string;\n order: number;\n};\n\nconst ALL_SUBSECTION = \"__all__\";\n\nfunction getSectionIcon(key: string) {\n return sidebarIcons[key as keyof typeof sidebarIcons] ?? sidebarIcons.default;\n}\n\nfunction resolveSectionMeta(key: string, schema?: JsonSchema): {\n label: string;\n description?: string;\n} {\n const meta = SECTION_META[key];\n if (meta) return meta;\n return {\n label: schema?.title ?? humanize(key),\n description: schema?.description ?? \"\",\n };\n}\n\nfunction resolveSubsections(params: {\n key: string;\n schema: JsonSchema | undefined;\n uiHints: ConfigUiHints;\n}): SubsectionEntry[] {\n const { key, schema, uiHints } = params;\n if (!schema || schemaType(schema) !== \"object\" || !schema.properties) return [];\n const entries = Object.entries(schema.properties).map(([subKey, node]) => {\n const hint = hintForPath([key, subKey], uiHints);\n const label = hint?.label ?? node.title ?? humanize(subKey);\n const description = hint?.help ?? node.description ?? \"\";\n const order = hint?.order ?? 50;\n return { key: subKey, label, description, order };\n });\n entries.sort((a, b) => (a.order !== b.order ? a.order - b.order : a.key.localeCompare(b.key)));\n return entries;\n}\n\nfunction computeDiff(\n original: Record<string, unknown> | null,\n current: Record<string, unknown> | null\n): Array<{ path: string; from: unknown; to: unknown }> {\n if (!original || !current) return [];\n const changes: Array<{ path: string; from: unknown; to: unknown }> = [];\n\n function compare(orig: unknown, curr: unknown, path: string) {\n if (orig === curr) return;\n if (typeof orig !== typeof curr) {\n changes.push({ path, from: orig, to: curr });\n return;\n }\n if (typeof orig !== \"object\" || orig === null || curr === null) {\n if (orig !== curr) {\n changes.push({ path, from: orig, to: curr });\n }\n return;\n }\n if (Array.isArray(orig) && Array.isArray(curr)) {\n if (JSON.stringify(orig) !== JSON.stringify(curr)) {\n changes.push({ path, from: orig, to: curr });\n }\n return;\n }\n const origObj = orig as Record<string, unknown>;\n const currObj = curr as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(origObj), ...Object.keys(currObj)]);\n for (const key of allKeys) {\n compare(origObj[key], currObj[key], path ? `${path}.${key}` : key);\n }\n }\n\n compare(original, current, \"\");\n return changes;\n}\n\nfunction truncateValue(value: unknown, maxLen = 40): string {\n let str: string;\n try {\n const json = JSON.stringify(value);\n str = json ?? String(value);\n } catch {\n str = String(value);\n }\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + \"...\";\n}\n\nexport function renderConfig(props: ConfigProps) {\n const validity =\n props.valid == null ? \"unknown\" : props.valid ? \"valid\" : \"invalid\";\n const analysis = analyzeConfigSchema(props.schema);\n const formUnsafe = analysis.schema\n ? analysis.unsupportedPaths.length > 0\n : false;\n\n // Get available sections from schema\n const schemaProps = analysis.schema?.properties ?? {};\n const availableSections = SECTIONS.filter(s => s.key in schemaProps);\n\n // Add any sections in schema but not in our list\n const knownKeys = new Set(SECTIONS.map(s => s.key));\n const extraSections = Object.keys(schemaProps)\n .filter(k => !knownKeys.has(k))\n .map(k => ({ key: k, label: humanize(k) }));\n\n const allSections = [...availableSections, ...extraSections];\n\n const activeSectionSchema =\n props.activeSection && analysis.schema && schemaType(analysis.schema) === \"object\"\n ? (analysis.schema.properties?.[props.activeSection] as JsonSchema | undefined)\n : undefined;\n const activeSectionMeta = props.activeSection\n ? resolveSectionMeta(props.activeSection, activeSectionSchema)\n : null;\n const subsections = props.activeSection\n ? resolveSubsections({\n key: props.activeSection,\n schema: activeSectionSchema,\n uiHints: props.uiHints,\n })\n : [];\n const allowSubnav =\n props.formMode === \"form\" &&\n Boolean(props.activeSection) &&\n subsections.length > 0;\n const isAllSubsection = props.activeSubsection === ALL_SUBSECTION;\n const effectiveSubsection = props.searchQuery\n ? null\n : isAllSubsection\n ? null\n : props.activeSubsection ?? (subsections[0]?.key ?? null);\n\n // Compute diff for showing changes (works for both form and raw modes)\n const diff = props.formMode === \"form\"\n ? computeDiff(props.originalValue, props.formValue)\n : [];\n const hasRawChanges = props.formMode === \"raw\" && props.raw !== props.originalRaw;\n const hasChanges = props.formMode === \"form\" ? diff.length > 0 : hasRawChanges;\n\n // Save/apply buttons require actual changes to be enabled.\n // Note: formUnsafe warns about unsupported schema paths but shouldn't block saving.\n const canSaveForm =\n Boolean(props.formValue) && !props.loading && Boolean(analysis.schema);\n const canSave =\n props.connected &&\n !props.saving &&\n hasChanges &&\n (props.formMode === \"raw\" ? true : canSaveForm);\n const canApply =\n props.connected &&\n !props.applying &&\n !props.updating &&\n hasChanges &&\n (props.formMode === \"raw\" ? true : canSaveForm);\n const canUpdate = props.connected && !props.applying && !props.updating;\n\n return html`\n <div class=\"config-layout\">\n <!-- Sidebar -->\n <aside class=\"config-sidebar\">\n <div class=\"config-sidebar__header\">\n <div class=\"config-sidebar__title\">设置</div>\n <span class=\"pill pill--sm ${validity === \"valid\" ? \"pill--ok\" : validity === \"invalid\" ? \"pill--danger\" : \"\"}\">${validity}</span>\n </div>\n\n <!-- Search -->\n <div class=\"config-search\">\n <svg class=\"config-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"></circle>\n <path d=\"M21 21l-4.35-4.35\"></path>\n </svg>\n <input\n type=\"text\"\n class=\"config-search__input\"\n placeholder=\"搜索设置...\"\n .value=${props.searchQuery}\n @input=${(e: Event) => props.onSearchChange((e.target as HTMLInputElement).value)}\n />\n ${props.searchQuery ? html`\n <button\n class=\"config-search__clear\"\n @click=${() => props.onSearchChange(\"\")}\n >×</button>\n ` : nothing}\n </div>\n\n <!-- Section nav -->\n <nav class=\"config-nav\">\n <button\n class=\"config-nav__item ${props.activeSection === null ? \"active\" : \"\"}\"\n @click=${() => props.onSectionChange(null)}\n >\n <span class=\"config-nav__icon\">${sidebarIcons.all}</span>\n <span class=\"config-nav__label\">所有设置</span>\n </button>\n ${allSections.map(section => html`\n <button\n class=\"config-nav__item ${props.activeSection === section.key ? \"active\" : \"\"}\"\n @click=${() => props.onSectionChange(section.key)}\n >\n <span class=\"config-nav__icon\">${getSectionIcon(section.key)}</span>\n <span class=\"config-nav__label\">${section.label}</span>\n </button>\n `)}\n </nav>\n\n <!-- Mode toggle at bottom -->\n <div class=\"config-sidebar__footer\">\n <div class=\"config-mode-toggle\">\n <button\n class=\"config-mode-toggle__btn ${props.formMode === \"form\" ? \"active\" : \"\"}\"\n ?disabled=${props.schemaLoading || !props.schema}\n @click=${() => props.onFormModeChange(\"form\")}\n >\n 表单\n </button>\n <button\n class=\"config-mode-toggle__btn ${props.formMode === \"raw\" ? \"active\" : \"\"}\"\n @click=${() => props.onFormModeChange(\"raw\")}\n >\n 原始\n </button>\n </div>\n </div>\n </aside>\n\n <!-- Main content -->\n <main class=\"config-main\">\n <!-- Action bar -->\n <div class=\"config-actions\">\n <div class=\"config-actions__left\">\n ${hasChanges ? html`\n <span class=\"config-changes-badge\">${props.formMode === \"raw\" ? \"未保存的更改\" : `${diff.length} 项未保存更改`}</span>\n ` : html`\n <span class=\"config-status muted\">无更改</span>\n `}\n </div>\n <div class=\"config-actions__right\">\n <button class=\"btn btn--sm\" ?disabled=${props.loading} @click=${props.onReload}>\n ${props.loading ? \"加载中…\" : \"重新加载\"}\n </button>\n <button\n class=\"btn btn--sm primary\"\n ?disabled=${!canSave}\n @click=${props.onSave}\n >\n ${props.saving ? \"保存中…\" : \"保存\"}\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!canApply}\n @click=${props.onApply}\n >\n ${props.applying ? \"应用中…\" : \"应用\"}\n </button>\n <button\n class=\"btn btn--sm\"\n ?disabled=${!canUpdate}\n @click=${props.onUpdate}\n >\n ${props.updating ? \"更新中…\" : \"更新\"}\n </button>\n </div>\n </div>\n\n <!-- Diff panel (form mode only - raw mode doesn't have granular diff) -->\n ${hasChanges && props.formMode === \"form\" ? html`\n <details class=\"config-diff\">\n <summary class=\"config-diff__summary\">\n <span>查看 ${diff.length} 项待处理更改</span>\n <svg class=\"config-diff__chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </summary>\n <div class=\"config-diff__content\">\n ${diff.map(change => html`\n <div class=\"config-diff__item\">\n <div class=\"config-diff__path\">${change.path}</div>\n <div class=\"config-diff__values\">\n <span class=\"config-diff__from\">${truncateValue(change.from)}</span>\n <span class=\"config-diff__arrow\">→</span>\n <span class=\"config-diff__to\">${truncateValue(change.to)}</span>\n </div>\n </div>\n `)}\n </div>\n </details>\n ` : nothing}\n\n ${activeSectionMeta && props.formMode === \"form\"\n ? html`\n <div class=\"config-section-hero\">\n <div class=\"config-section-hero__icon\">${getSectionIcon(props.activeSection ?? \"\")}</div>\n <div class=\"config-section-hero__text\">\n <div class=\"config-section-hero__title\">${activeSectionMeta.label}</div>\n ${activeSectionMeta.description\n ? html`<div class=\"config-section-hero__desc\">${activeSectionMeta.description}</div>`\n : nothing}\n </div>\n </div>\n `\n : nothing}\n\n ${allowSubnav\n ? html`\n <div class=\"config-subnav\">\n <button\n class=\"config-subnav__item ${effectiveSubsection === null ? \"active\" : \"\"}\"\n @click=${() => props.onSubsectionChange(ALL_SUBSECTION)}\n >\n 全部\n </button>\n ${subsections.map(\n (entry) => html`\n <button\n class=\"config-subnav__item ${\n effectiveSubsection === entry.key ? \"active\" : \"\"\n }\"\n title=${entry.description || entry.label}\n @click=${() => props.onSubsectionChange(entry.key)}\n >\n ${entry.label}\n </button>\n `,\n )}\n </div>\n `\n : nothing}\n\n <!-- Form content -->\n <div class=\"config-content\">\n ${props.formMode === \"form\"\n ? html`\n ${props.schemaLoading\n ? html`<div class=\"config-loading\">\n <div class=\"config-loading__spinner\"></div>\n <span>加载架构中…</span>\n </div>`\n : renderConfigForm({\n schema: analysis.schema,\n uiHints: props.uiHints,\n value: props.formValue,\n disabled: props.loading || !props.formValue,\n unsupportedPaths: analysis.unsupportedPaths,\n onPatch: props.onFormPatch,\n searchQuery: props.searchQuery,\n activeSection: props.activeSection,\n activeSubsection: effectiveSubsection,\n })}\n ${formUnsafe\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n 表单视图无法安全编辑某些字段。\n 使用原始模式以避免丢失配置条目。\n </div>`\n : nothing}\n `\n : html`\n <label class=\"field config-raw-field\">\n <span>原始 JSON5</span>\n <textarea\n .value=${props.raw}\n @input=${(e: Event) =>\n props.onRawChange((e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>\n `}\n </div>\n\n ${props.issues.length > 0\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n <pre class=\"code-block\">${JSON.stringify(props.issues, null, 2)}</pre>\n </div>`\n : nothing}\n </main>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { ChannelAccountSnapshot } from \"../types\";\nimport type { ChannelKey, ChannelsProps } from \"./channels.types\";\n\nexport function formatDuration(ms?: number | null) {\n if (!ms && ms !== 0) return \"n/a\";\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n return `${hr}h`;\n}\n\nexport function channelEnabled(key: ChannelKey, props: ChannelsProps) {\n const snapshot = props.snapshot;\n const channels = snapshot?.channels as Record<string, unknown> | null;\n if (!snapshot || !channels) return false;\n const channelStatus = channels[key] as Record<string, unknown> | undefined;\n const configured = typeof channelStatus?.configured === \"boolean\" && channelStatus.configured;\n const running = typeof channelStatus?.running === \"boolean\" && channelStatus.running;\n const connected = typeof channelStatus?.connected === \"boolean\" && channelStatus.connected;\n const accounts = snapshot.channelAccounts?.[key] ?? [];\n const accountActive = accounts.some(\n (account) => account.configured || account.running || account.connected,\n );\n return configured || running || connected || accountActive;\n}\n\nexport function getChannelAccountCount(\n key: ChannelKey,\n channelAccounts?: Record<string, ChannelAccountSnapshot[]> | null,\n): number {\n return channelAccounts?.[key]?.length ?? 0;\n}\n\nexport function renderChannelAccountCount(\n key: ChannelKey,\n channelAccounts?: Record<string, ChannelAccountSnapshot[]> | null,\n) {\n const count = getChannelAccountCount(key, channelAccounts);\n if (count < 2) return nothing;\n return html`<div class=\"account-count\">Accounts (${count})</div>`;\n}\n","import { html } from \"lit\";\n\nimport type { ConfigUiHints } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport {\n analyzeConfigSchema,\n renderNode,\n schemaType,\n type JsonSchema,\n} from \"./config-form\";\n\ntype ChannelConfigFormProps = {\n channelId: string;\n configValue: Record<string, unknown> | null;\n schema: unknown | null;\n uiHints: ConfigUiHints;\n disabled: boolean;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\nfunction resolveSchemaNode(\n schema: JsonSchema | null,\n path: Array<string | number>,\n): JsonSchema | null {\n let current = schema;\n for (const key of path) {\n if (!current) return null;\n const type = schemaType(current);\n if (type === \"object\") {\n const properties = current.properties ?? {};\n if (typeof key === \"string\" && properties[key]) {\n current = properties[key];\n continue;\n }\n const additional = current.additionalProperties;\n if (typeof key === \"string\" && additional && typeof additional === \"object\") {\n current = additional as JsonSchema;\n continue;\n }\n return null;\n }\n if (type === \"array\") {\n if (typeof key !== \"number\") return null;\n const items = Array.isArray(current.items) ? current.items[0] : current.items;\n current = items ?? null;\n continue;\n }\n return null;\n }\n return current;\n}\n\nfunction resolveChannelValue(\n config: Record<string, unknown>,\n channelId: string,\n): Record<string, unknown> {\n const channels = (config.channels ?? {}) as Record<string, unknown>;\n const fromChannels = channels[channelId];\n const fallback = config[channelId];\n const resolved =\n (fromChannels && typeof fromChannels === \"object\"\n ? (fromChannels as Record<string, unknown>)\n : null) ??\n (fallback && typeof fallback === \"object\"\n ? (fallback as Record<string, unknown>)\n : null);\n return resolved ?? {};\n}\n\nexport function renderChannelConfigForm(props: ChannelConfigFormProps) {\n const analysis = analyzeConfigSchema(props.schema);\n const normalized = analysis.schema;\n if (!normalized) {\n return html`<div class=\"callout danger\">架构不可用。请使用原始模式。</div>`;\n }\n const node = resolveSchemaNode(normalized, [\"channels\", props.channelId]);\n if (!node) {\n return html`<div class=\"callout danger\">渠道配置架构不可用。</div>`;\n }\n const configValue = props.configValue ?? {};\n const value = resolveChannelValue(configValue, props.channelId);\n return html`\n <div class=\"config-form\">\n ${renderNode({\n schema: node,\n value,\n path: [\"channels\", props.channelId],\n hints: props.uiHints,\n unsupported: new Set(analysis.unsupportedPaths),\n disabled: props.disabled,\n showLabel: false,\n onPatch: props.onPatch,\n })}\n </div>\n `;\n}\n\nexport function renderChannelConfigSection(params: {\n channelId: string;\n props: ChannelsProps;\n}) {\n const { channelId, props } = params;\n const disabled = props.configSaving || props.configSchemaLoading;\n return html`\n <div style=\"margin-top: 16px;\">\n ${props.configSchemaLoading\n ? html`<div class=\"muted\">加载配置架构中…</div>`\n : renderChannelConfigForm({\n channelId,\n configValue: props.configForm,\n schema: props.configSchema,\n uiHints: props.configUiHints,\n disabled,\n onPatch: props.onConfigPatch,\n })}\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button\n class=\"btn primary\"\n ?disabled=${disabled || !props.configFormDirty}\n @click=${() => props.onConfigSave()}\n >\n ${props.configSaving ? \"保存中…\" : \"保存\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${disabled}\n @click=${() => props.onConfigReload()}\n >\n 重新加载\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { DiscordStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderDiscordCard(params: {\n props: ChannelsProps;\n discord?: DiscordStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, discord, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Discord</div>\n <div class=\"card-sub\">机器人状态和渠道配置。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${discord?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${discord?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${discord?.lastStartAt ? formatAgo(discord.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${discord?.lastProbeAt ? formatAgo(discord.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${discord?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${discord.lastError}\n </div>`\n : nothing}\n\n ${discord?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${discord.probe.ok ? \"成功\" : \"失败\"} ·\n ${discord.probe.status ?? \"\"} ${discord.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"discord\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { GoogleChatStatus } from \"../types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport type { ChannelsProps } from \"./channels.types\";\n\nexport function renderGoogleChatCard(params: {\n props: ChannelsProps;\n googleChat?: GoogleChatStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, googleChat, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Google Chat</div>\n <div class=\"card-sub\">Chat API Webhook 状态和渠道配置。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${googleChat ? (googleChat.configured ? \"Yes\" : \"No\") : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${googleChat ? (googleChat.running ? \"Yes\" : \"No\") : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">凭证</span>\n <span>${googleChat?.credentialSource ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">受众</span>\n <span>\n ${googleChat?.audienceType\n ? `${googleChat.audienceType}${googleChat.audience ? ` · ${googleChat.audience}` : \"\"}`\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${googleChat?.lastStartAt ? formatAgo(googleChat.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${googleChat?.lastProbeAt ? formatAgo(googleChat.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${googleChat?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${googleChat.lastError}\n </div>`\n : nothing}\n\n ${googleChat?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${googleChat.probe.ok ? \"成功\" : \"失败\"} ·\n ${googleChat.probe.status ?? \"\"} ${googleChat.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"googlechat\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { IMessageStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderIMessageCard(params: {\n props: ChannelsProps;\n imessage?: IMessageStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, imessage, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">iMessage</div>\n <div class=\"card-sub\">macOS 桥接状态和渠道配置。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${imessage?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${imessage?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${imessage?.lastStartAt ? formatAgo(imessage.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${imessage?.lastProbeAt ? formatAgo(imessage.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${imessage?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${imessage.lastError}\n </div>`\n : nothing}\n\n ${imessage?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${imessage.probe.ok ? \"成功\" : \"失败\"} ·\n ${imessage.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"imessage\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","/**\n * Nostr Profile Edit Form\n *\n * Provides UI for editing and publishing Nostr profile (kind:0).\n */\n\nimport { html, nothing, type TemplateResult } from \"lit\";\n\nimport type { NostrProfile as NostrProfileType } from \"../types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface NostrProfileFormState {\n /** Current form values */\n values: NostrProfileType;\n /** Original values for dirty detection */\n original: NostrProfileType;\n /** Whether the form is currently submitting */\n saving: boolean;\n /** Whether import is in progress */\n importing: boolean;\n /** Last error message */\n error: string | null;\n /** Last success message */\n success: string | null;\n /** Validation errors per field */\n fieldErrors: Record<string, string>;\n /** Whether to show advanced fields */\n showAdvanced: boolean;\n}\n\nexport interface NostrProfileFormCallbacks {\n /** Called when a field value changes */\n onFieldChange: (field: keyof NostrProfileType, value: string) => void;\n /** Called when save is clicked */\n onSave: () => void;\n /** Called when import is clicked */\n onImport: () => void;\n /** Called when cancel is clicked */\n onCancel: () => void;\n /** Called when toggle advanced is clicked */\n onToggleAdvanced: () => void;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction isFormDirty(state: NostrProfileFormState): boolean {\n const { values, original } = state;\n return (\n values.name !== original.name ||\n values.displayName !== original.displayName ||\n values.about !== original.about ||\n values.picture !== original.picture ||\n values.banner !== original.banner ||\n values.website !== original.website ||\n values.nip05 !== original.nip05 ||\n values.lud16 !== original.lud16\n );\n}\n\n// ============================================================================\n// Form Rendering\n// ============================================================================\n\nexport function renderNostrProfileForm(params: {\n state: NostrProfileFormState;\n callbacks: NostrProfileFormCallbacks;\n accountId: string;\n}): TemplateResult {\n const { state, callbacks, accountId } = params;\n const isDirty = isFormDirty(state);\n\n const renderField = (\n field: keyof NostrProfileType,\n label: string,\n opts: {\n type?: \"text\" | \"url\" | \"textarea\";\n placeholder?: string;\n maxLength?: number;\n help?: string;\n } = {}\n ) => {\n const { type = \"text\", placeholder, maxLength, help } = opts;\n const value = state.values[field] ?? \"\";\n const error = state.fieldErrors[field];\n\n const inputId = `nostr-profile-${field}`;\n\n if (type === \"textarea\") {\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <textarea\n id=\"${inputId}\"\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 2000}\n rows=\"3\"\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px; resize: vertical; font-family: inherit;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLTextAreaElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n ></textarea>\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n }\n\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <input\n id=\"${inputId}\"\n type=${type}\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 256}\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLInputElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n />\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n };\n\n const renderPicturePreview = () => {\n const picture = state.values.picture;\n if (!picture) return nothing;\n\n return html`\n <div style=\"margin-bottom: 12px;\">\n <img\n src=${picture}\n alt=\"Profile picture preview\"\n style=\"max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);\"\n @error=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"none\";\n }}\n @load=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"block\";\n }}\n />\n </div>\n `;\n };\n\n return html`\n <div class=\"nostr-profile-form\" style=\"padding: 16px; background: var(--bg-secondary); border-radius: 8px; margin-top: 12px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"font-weight: 600; font-size: 16px;\">Edit Profile</div>\n <div style=\"font-size: 12px; color: var(--text-muted);\">Account: ${accountId}</div>\n </div>\n\n ${state.error\n ? html`<div class=\"callout danger\" style=\"margin-bottom: 12px;\">${state.error}</div>`\n : nothing}\n\n ${state.success\n ? html`<div class=\"callout success\" style=\"margin-bottom: 12px;\">${state.success}</div>`\n : nothing}\n\n ${renderPicturePreview()}\n\n ${renderField(\"name\", \"Username\", {\n placeholder: \"satoshi\",\n maxLength: 256,\n help: \"Short username (e.g., satoshi)\",\n })}\n\n ${renderField(\"displayName\", \"Display Name\", {\n placeholder: \"Satoshi Nakamoto\",\n maxLength: 256,\n help: \"Your full display name\",\n })}\n\n ${renderField(\"about\", \"Bio\", {\n type: \"textarea\",\n placeholder: \"Tell people about yourself...\",\n maxLength: 2000,\n help: \"A brief bio or description\",\n })}\n\n ${renderField(\"picture\", \"Avatar URL\", {\n type: \"url\",\n placeholder: \"https://example.com/avatar.jpg\",\n help: \"HTTPS URL to your profile picture\",\n })}\n\n ${state.showAdvanced\n ? html`\n <div style=\"border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;\">\n <div style=\"font-weight: 500; margin-bottom: 12px; color: var(--text-muted);\">Advanced</div>\n\n ${renderField(\"banner\", \"Banner URL\", {\n type: \"url\",\n placeholder: \"https://example.com/banner.jpg\",\n help: \"HTTPS URL to a banner image\",\n })}\n\n ${renderField(\"website\", \"Website\", {\n type: \"url\",\n placeholder: \"https://example.com\",\n help: \"Your personal website\",\n })}\n\n ${renderField(\"nip05\", \"NIP-05 Identifier\", {\n placeholder: \"you@example.com\",\n help: \"Verifiable identifier (e.g., you@domain.com)\",\n })}\n\n ${renderField(\"lud16\", \"Lightning Address\", {\n placeholder: \"you@getalby.com\",\n help: \"Lightning address for tips (LUD-16)\",\n })}\n </div>\n `\n : nothing}\n\n <div style=\"display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n @click=${callbacks.onSave}\n ?disabled=${state.saving || !isDirty}\n >\n ${state.saving ? \"Saving...\" : \"Save & Publish\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onImport}\n ?disabled=${state.importing || state.saving}\n >\n ${state.importing ? \"Importing...\" : \"Import from Relays\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onToggleAdvanced}\n >\n ${state.showAdvanced ? \"Hide Advanced\" : \"Show Advanced\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onCancel}\n ?disabled=${state.saving}\n >\n Cancel\n </button>\n </div>\n\n ${isDirty\n ? html`<div style=\"font-size: 12px; color: var(--warning-color); margin-top: 8px;\">\n You have unsaved changes\n </div>`\n : nothing}\n </div>\n `;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create initial form state from existing profile\n */\nexport function createNostrProfileFormState(\n profile: NostrProfileType | undefined\n): NostrProfileFormState {\n const values: NostrProfileType = {\n name: profile?.name ?? \"\",\n displayName: profile?.displayName ?? \"\",\n about: profile?.about ?? \"\",\n picture: profile?.picture ?? \"\",\n banner: profile?.banner ?? \"\",\n website: profile?.website ?? \"\",\n nip05: profile?.nip05 ?? \"\",\n lud16: profile?.lud16 ?? \"\",\n };\n\n return {\n values,\n original: { ...values },\n saving: false,\n importing: false,\n error: null,\n success: null,\n fieldErrors: {},\n showAdvanced: Boolean(\n profile?.banner || profile?.website || profile?.nip05 || profile?.lud16\n ),\n };\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ChannelAccountSnapshot, NostrStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport {\n renderNostrProfileForm,\n type NostrProfileFormState,\n type NostrProfileFormCallbacks,\n} from \"./channels.nostr-profile-form\";\n\n/**\n * Truncate a pubkey for display (shows first and last 8 chars)\n */\nfunction truncatePubkey(pubkey: string | null | undefined): string {\n if (!pubkey) return \"n/a\";\n if (pubkey.length <= 20) return pubkey;\n return `${pubkey.slice(0, 8)}...${pubkey.slice(-8)}`;\n}\n\nexport function renderNostrCard(params: {\n props: ChannelsProps;\n nostr?: NostrStatus | null;\n nostrAccounts: ChannelAccountSnapshot[];\n accountCountLabel: unknown;\n /** Profile form state (optional - if provided, shows form) */\n profileFormState?: NostrProfileFormState | null;\n /** Profile form callbacks */\n profileFormCallbacks?: NostrProfileFormCallbacks | null;\n /** Called when Edit Profile is clicked */\n onEditProfile?: () => void;\n}) {\n const {\n props,\n nostr,\n nostrAccounts,\n accountCountLabel,\n profileFormState,\n profileFormCallbacks,\n onEditProfile,\n } = params;\n const primaryAccount = nostrAccounts[0];\n const summaryConfigured = nostr?.configured ?? primaryAccount?.configured ?? false;\n const summaryRunning = nostr?.running ?? primaryAccount?.running ?? false;\n const summaryPublicKey =\n nostr?.publicKey ??\n (primaryAccount as { publicKey?: string } | undefined)?.publicKey;\n const summaryLastStartAt = nostr?.lastStartAt ?? primaryAccount?.lastStartAt ?? null;\n const summaryLastError = nostr?.lastError ?? primaryAccount?.lastError ?? null;\n const hasMultipleAccounts = nostrAccounts.length > 1;\n const showingForm = profileFormState !== null && profileFormState !== undefined;\n\n const renderAccountCard = (account: ChannelAccountSnapshot) => {\n const publicKey = (account as { publicKey?: string }).publicKey;\n const profile = (account as { profile?: { name?: string; displayName?: string } }).profile;\n const displayName = profile?.displayName ?? profile?.name ?? account.name ?? account.accountId;\n\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">${displayName}</div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">运行中</span>\n <span>${account.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已配置</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">公钥</span>\n <span class=\"monospace\" title=\"${publicKey ?? \"\"}\">${truncatePubkey(publicKey)}</span>\n </div>\n <div>\n <span class=\"label\">最后入站</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">${account.lastError}</div>\n `\n : nothing}\n </div>\n </div>\n `;\n };\n\n const renderProfileSection = () => {\n // If showing form, render the form instead of the read-only view\n if (showingForm && profileFormCallbacks) {\n return renderNostrProfileForm({\n state: profileFormState,\n callbacks: profileFormCallbacks,\n accountId: nostrAccounts[0]?.accountId ?? \"default\",\n });\n }\n\n const profile =\n (primaryAccount as\n | {\n profile?: {\n name?: string;\n displayName?: string;\n about?: string;\n picture?: string;\n nip05?: string;\n };\n }\n | undefined)?.profile ?? nostr?.profile;\n const { name, displayName, about, picture, nip05 } = profile ?? {};\n const hasAnyProfileData = name || displayName || about || picture || nip05;\n\n return html`\n <div style=\"margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: 8px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;\">\n <div style=\"font-weight: 500;\">个人资料</div>\n ${summaryConfigured\n ? html`\n <button\n class=\"btn btn-sm\"\n @click=${onEditProfile}\n style=\"font-size: 12px; padding: 4px 8px;\"\n >\n 编辑资料\n </button>\n `\n : nothing}\n </div>\n ${hasAnyProfileData\n ? html`\n <div class=\"status-list\">\n ${picture\n ? html`\n <div style=\"margin-bottom: 8px;\">\n <img\n src=${picture}\n alt=\"Profile picture\"\n style=\"width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);\"\n @error=${(e: Event) => {\n (e.target as HTMLImageElement).style.display = \"none\";\n }}\n />\n </div>\n `\n : nothing}\n ${name ? html`<div><span class=\"label\">名称</span><span>${name}</span></div>` : nothing}\n ${displayName\n ? html`<div><span class=\"label\">显示名称</span><span>${displayName}</span></div>`\n : nothing}\n ${about\n ? html`<div><span class=\"label\">简介</span><span style=\"max-width: 300px; overflow: hidden; text-overflow: ellipsis;\">${about}</span></div>`\n : nothing}\n ${nip05 ? html`<div><span class=\"label\">NIP-05</span><span>${nip05}</span></div>` : nothing}\n </div>\n `\n : html`\n <div style=\"color: var(--text-muted); font-size: 13px;\">\n 暂无个人资料。点击\"编辑资料\"添加您的名称、简介和头像。\n </div>\n `}\n </div>\n `;\n };\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Nostr</div>\n <div class=\"card-sub\">通过 Nostr 中继进行去中心化私信 (NIP-04)。</div>\n ${accountCountLabel}\n\n ${hasMultipleAccounts\n ? html`\n <div class=\"account-card-list\">\n ${nostrAccounts.map((account) => renderAccountCard(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${summaryConfigured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${summaryRunning ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">公钥</span>\n <span class=\"monospace\" title=\"${summaryPublicKey ?? \"\"}\"\n >${truncatePubkey(summaryPublicKey)}</span\n >\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${summaryLastStartAt ? formatAgo(summaryLastStartAt) : \"n/a\"}</span>\n </div>\n </div>\n `}\n\n ${summaryLastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${summaryLastError}</div>`\n : nothing}\n\n ${renderProfileSection()}\n\n ${renderChannelConfigSection({ channelId: \"nostr\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(false)}>刷新</button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { SignalStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderSignalCard(params: {\n props: ChannelsProps;\n signal?: SignalStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, signal, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Signal</div>\n <div class=\"card-sub\">signal-cli 状态和渠道配置。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${signal?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${signal?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">基础 URL</span>\n <span>${signal?.baseUrl ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${signal?.lastStartAt ? formatAgo(signal.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${signal?.lastProbeAt ? formatAgo(signal.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${signal?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${signal.lastError}\n </div>`\n : nothing}\n\n ${signal?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${signal.probe.ok ? \"成功\" : \"失败\"} ·\n ${signal.probe.status ?? \"\"} ${signal.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"signal\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { SlackStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderSlackCard(params: {\n props: ChannelsProps;\n slack?: SlackStatus | null;\n accountCountLabel: unknown;\n}) {\n const { props, slack, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Slack</div>\n <div class=\"card-sub\">Socket 模式状态和渠道配置。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${slack?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${slack?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${slack?.lastStartAt ? formatAgo(slack.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${slack?.lastProbeAt ? formatAgo(slack.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${slack?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${slack.lastError}\n </div>`\n : nothing}\n\n ${slack?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${slack.probe.ok ? \"成功\" : \"失败\"} ·\n ${slack.probe.status ?? \"\"} ${slack.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"slack\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ChannelAccountSnapshot, TelegramStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\n\nexport function renderTelegramCard(params: {\n props: ChannelsProps;\n telegram?: TelegramStatus;\n telegramAccounts: ChannelAccountSnapshot[];\n accountCountLabel: unknown;\n}) {\n const { props, telegram, telegramAccounts, accountCountLabel } = params;\n const hasMultipleAccounts = telegramAccounts.length > 1;\n\n const renderAccountCard = (account: ChannelAccountSnapshot) => {\n const probe = account.probe as { bot?: { username?: string } } | undefined;\n const botUsername = probe?.bot?.username;\n const label = account.name || account.accountId;\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">\n ${botUsername ? `@${botUsername}` : label}\n </div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">运行中</span>\n <span>${account.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已配置</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">最后入站</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">\n ${account.lastError}\n </div>\n `\n : nothing}\n </div>\n </div>\n `;\n };\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Telegram</div>\n <div class=\"card-sub\">机器人状态和渠道配置。</div>\n ${accountCountLabel}\n\n ${hasMultipleAccounts\n ? html`\n <div class=\"account-card-list\">\n ${telegramAccounts.map((account) => renderAccountCard(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${telegram?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${telegram?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">模式</span>\n <span>${telegram?.mode ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次启动</span>\n <span>${telegram?.lastStartAt ? formatAgo(telegram.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">上次探测</span>\n <span>${telegram?.lastProbeAt ? formatAgo(telegram.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n `}\n\n ${telegram?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${telegram.lastError}\n </div>`\n : nothing}\n\n ${telegram?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n 探测 ${telegram.probe.ok ? \"成功\" : \"失败\"} ·\n ${telegram.probe.status ?? \"\"} ${telegram.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: \"telegram\", props })}\n\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 探测\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { WhatsAppStatus } from \"../types\";\nimport type { ChannelsProps } from \"./channels.types\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport { formatDuration } from \"./channels.shared\";\n\nexport function renderWhatsAppCard(params: {\n props: ChannelsProps;\n whatsapp?: WhatsAppStatus;\n accountCountLabel: unknown;\n}) {\n const { props, whatsapp, accountCountLabel } = params;\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">WhatsApp</div>\n <div class=\"card-sub\">连接 WhatsApp Web 并监控连接健康状态。</div>\n ${accountCountLabel}\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${whatsapp?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已链接</span>\n <span>${whatsapp?.linked ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${whatsapp?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已连接</span>\n <span>${whatsapp?.connected ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">最后连接</span>\n <span>\n ${whatsapp?.lastConnectedAt\n ? formatAgo(whatsapp.lastConnectedAt)\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">最后消息</span>\n <span>\n ${whatsapp?.lastMessageAt ? formatAgo(whatsapp.lastMessageAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">认证时长</span>\n <span>\n ${whatsapp?.authAgeMs != null\n ? formatDuration(whatsapp.authAgeMs)\n : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${whatsapp?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${whatsapp.lastError}\n </div>`\n : nothing}\n\n ${props.whatsappMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.whatsappMessage}\n </div>`\n : nothing}\n\n ${props.whatsappQrDataUrl\n ? html`<div class=\"qr-wrap\">\n <img src=${props.whatsappQrDataUrl} alt=\"WhatsApp QR\" />\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(false)}\n >\n ${props.whatsappBusy ? \"处理中…\" : \"显示二维码\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(true)}\n >\n 重新链接\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppWait()}\n >\n 等待扫描\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppLogout()}\n >\n 退出登录\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n 刷新\n </button>\n </div>\n\n ${renderChannelConfigSection({ channelId: \"whatsapp\", props })}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type {\n ChannelAccountSnapshot,\n ChannelUiMetaEntry,\n ChannelsStatusSnapshot,\n DiscordStatus,\n GoogleChatStatus,\n IMessageStatus,\n NostrProfile,\n NostrStatus,\n SignalStatus,\n SlackStatus,\n TelegramStatus,\n WhatsAppStatus,\n} from \"../types\";\nimport type {\n ChannelKey,\n ChannelsChannelData,\n ChannelsProps,\n} from \"./channels.types\";\nimport { channelEnabled, renderChannelAccountCount } from \"./channels.shared\";\nimport { renderChannelConfigSection } from \"./channels.config\";\nimport { renderDiscordCard } from \"./channels.discord\";\nimport { renderGoogleChatCard } from \"./channels.googlechat\";\nimport { renderIMessageCard } from \"./channels.imessage\";\nimport { renderNostrCard } from \"./channels.nostr\";\nimport { renderSignalCard } from \"./channels.signal\";\nimport { renderSlackCard } from \"./channels.slack\";\nimport { renderTelegramCard } from \"./channels.telegram\";\nimport { renderWhatsAppCard } from \"./channels.whatsapp\";\n\nexport function renderChannels(props: ChannelsProps) {\n const channels = props.snapshot?.channels as Record<string, unknown> | null;\n const whatsapp = (channels?.whatsapp ?? undefined) as\n | WhatsAppStatus\n | undefined;\n const telegram = (channels?.telegram ?? undefined) as\n | TelegramStatus\n | undefined;\n const discord = (channels?.discord ?? null) as DiscordStatus | null;\n const googlechat = (channels?.googlechat ?? null) as GoogleChatStatus | null;\n const slack = (channels?.slack ?? null) as SlackStatus | null;\n const signal = (channels?.signal ?? null) as SignalStatus | null;\n const imessage = (channels?.imessage ?? null) as IMessageStatus | null;\n const nostr = (channels?.nostr ?? null) as NostrStatus | null;\n const channelOrder = resolveChannelOrder(props.snapshot);\n const orderedChannels = channelOrder\n .map((key, index) => ({\n key,\n enabled: channelEnabled(key, props),\n order: index,\n }))\n .sort((a, b) => {\n if (a.enabled !== b.enabled) return a.enabled ? -1 : 1;\n return a.order - b.order;\n });\n\n return html`\n <section class=\"grid grid-cols-2\">\n ${orderedChannels.map((channel) =>\n renderChannel(channel.key, props, {\n whatsapp,\n telegram,\n discord,\n googlechat,\n slack,\n signal,\n imessage,\n nostr,\n channelAccounts: props.snapshot?.channelAccounts ?? null,\n }),\n )}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">渠道健康</div>\n <div class=\"card-sub\">来自网关的渠道状态快照。</div>\n </div>\n <div class=\"muted\">${props.lastSuccessAt ? formatAgo(props.lastSuccessAt) : \"n/a\"}</div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n <pre class=\"code-block\" style=\"margin-top: 12px;\">\n${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : \"暂无快照。\"}\n </pre>\n </section>\n `;\n}\n\nfunction resolveChannelOrder(snapshot: ChannelsStatusSnapshot | null): ChannelKey[] {\n if (snapshot?.channelMeta?.length) {\n return snapshot.channelMeta.map((entry) => entry.id) as ChannelKey[];\n }\n if (snapshot?.channelOrder?.length) {\n return snapshot.channelOrder;\n }\n return [\n \"whatsapp\",\n \"telegram\",\n \"discord\",\n \"googlechat\",\n \"slack\",\n \"signal\",\n \"imessage\",\n \"nostr\",\n ];\n}\n\nfunction renderChannel(\n key: ChannelKey,\n props: ChannelsProps,\n data: ChannelsChannelData,\n) {\n const accountCountLabel = renderChannelAccountCount(\n key,\n data.channelAccounts,\n );\n switch (key) {\n case \"whatsapp\":\n return renderWhatsAppCard({\n props,\n whatsapp: data.whatsapp,\n accountCountLabel,\n });\n case \"telegram\":\n return renderTelegramCard({\n props,\n telegram: data.telegram,\n telegramAccounts: data.channelAccounts?.telegram ?? [],\n accountCountLabel,\n });\n case \"discord\":\n return renderDiscordCard({\n props,\n discord: data.discord,\n accountCountLabel,\n });\n case \"googlechat\":\n return renderGoogleChatCard({\n props,\n googlechat: data.googlechat,\n accountCountLabel,\n });\n case \"slack\":\n return renderSlackCard({\n props,\n slack: data.slack,\n accountCountLabel,\n });\n case \"signal\":\n return renderSignalCard({\n props,\n signal: data.signal,\n accountCountLabel,\n });\n case \"imessage\":\n return renderIMessageCard({\n props,\n imessage: data.imessage,\n accountCountLabel,\n });\n case \"nostr\": {\n const nostrAccounts = data.channelAccounts?.nostr ?? [];\n const primaryAccount = nostrAccounts[0];\n const accountId = primaryAccount?.accountId ?? \"default\";\n const profile =\n (primaryAccount as { profile?: NostrProfile | null } | undefined)?.profile ?? null;\n const showForm =\n props.nostrProfileAccountId === accountId ? props.nostrProfileFormState : null;\n const profileFormCallbacks = showForm\n ? {\n onFieldChange: props.onNostrProfileFieldChange,\n onSave: props.onNostrProfileSave,\n onImport: props.onNostrProfileImport,\n onCancel: props.onNostrProfileCancel,\n onToggleAdvanced: props.onNostrProfileToggleAdvanced,\n }\n : null;\n return renderNostrCard({\n props,\n nostr: data.nostr,\n nostrAccounts,\n accountCountLabel,\n profileFormState: showForm,\n profileFormCallbacks,\n onEditProfile: () => props.onNostrProfileEdit(accountId, profile),\n });\n }\n default:\n return renderGenericChannelCard(key, props, data.channelAccounts ?? {});\n }\n}\n\nfunction renderGenericChannelCard(\n key: ChannelKey,\n props: ChannelsProps,\n channelAccounts: Record<string, ChannelAccountSnapshot[]>,\n) {\n const label = resolveChannelLabel(props.snapshot, key);\n const status = props.snapshot?.channels?.[key] as Record<string, unknown> | undefined;\n const configured = typeof status?.configured === \"boolean\" ? status.configured : undefined;\n const running = typeof status?.running === \"boolean\" ? status.running : undefined;\n const connected = typeof status?.connected === \"boolean\" ? status.connected : undefined;\n const lastError = typeof status?.lastError === \"string\" ? status.lastError : undefined;\n const accounts = channelAccounts[key] ?? [];\n const accountCountLabel = renderChannelAccountCount(key, channelAccounts);\n\n return html`\n <div class=\"card\">\n <div class=\"card-title\">${label}</div>\n <div class=\"card-sub\">渠道状态和配置。</div>\n ${accountCountLabel}\n\n ${accounts.length > 0\n ? html`\n <div class=\"account-card-list\">\n ${accounts.map((account) => renderGenericAccount(account))}\n </div>\n `\n : html`\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">已配置</span>\n <span>${configured == null ? \"n/a\" : configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">运行中</span>\n <span>${running == null ? \"n/a\" : running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已连接</span>\n <span>${connected == null ? \"n/a\" : connected ? \"Yes\" : \"No\"}</span>\n </div>\n </div>\n `}\n\n ${lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${lastError}\n </div>`\n : nothing}\n\n ${renderChannelConfigSection({ channelId: key, props })}\n </div>\n `;\n}\n\nfunction resolveChannelMetaMap(\n snapshot: ChannelsStatusSnapshot | null,\n): Record<string, ChannelUiMetaEntry> {\n if (!snapshot?.channelMeta?.length) return {};\n return Object.fromEntries(snapshot.channelMeta.map((entry) => [entry.id, entry]));\n}\n\nfunction resolveChannelLabel(\n snapshot: ChannelsStatusSnapshot | null,\n key: string,\n): string {\n const meta = resolveChannelMetaMap(snapshot)[key];\n return meta?.label ?? snapshot?.channelLabels?.[key] ?? key;\n}\n\nconst RECENT_ACTIVITY_THRESHOLD_MS = 10 * 60 * 1000; // 10 minutes\n\nfunction hasRecentActivity(account: ChannelAccountSnapshot): boolean {\n if (!account.lastInboundAt) return false;\n return Date.now() - account.lastInboundAt < RECENT_ACTIVITY_THRESHOLD_MS;\n}\n\nfunction deriveRunningStatus(account: ChannelAccountSnapshot): \"Yes\" | \"No\" | \"Active\" {\n if (account.running) return \"Yes\";\n // If we have recent inbound activity, the channel is effectively running\n if (hasRecentActivity(account)) return \"Active\";\n return \"No\";\n}\n\nfunction deriveConnectedStatus(account: ChannelAccountSnapshot): \"Yes\" | \"No\" | \"Active\" | \"n/a\" {\n if (account.connected === true) return \"Yes\";\n if (account.connected === false) return \"No\";\n // If connected is null/undefined but we have recent activity, show as active\n if (hasRecentActivity(account)) return \"Active\";\n return \"n/a\";\n}\n\nfunction renderGenericAccount(account: ChannelAccountSnapshot) {\n const runningStatus = deriveRunningStatus(account);\n const connectedStatus = deriveConnectedStatus(account);\n\n return html`\n <div class=\"account-card\">\n <div class=\"account-card-header\">\n <div class=\"account-card-title\">${account.name || account.accountId}</div>\n <div class=\"account-card-id\">${account.accountId}</div>\n </div>\n <div class=\"status-list account-card-status\">\n <div>\n <span class=\"label\">运行中</span>\n <span>${runningStatus}</span>\n </div>\n <div>\n <span class=\"label\">已配置</span>\n <span>${account.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">已连接</span>\n <span>${connectedStatus}</span>\n </div>\n <div>\n <span class=\"label\">最后入站</span>\n <span>${account.lastInboundAt ? formatAgo(account.lastInboundAt) : \"n/a\"}</span>\n </div>\n ${account.lastError\n ? html`\n <div class=\"account-card-error\">\n ${account.lastError}\n </div>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","import { formatAgo, formatDurationMs, formatMs } from \"./format\";\nimport type { CronJob, GatewaySessionRow, PresenceEntry } from \"./types\";\n\nexport function formatPresenceSummary(entry: PresenceEntry): string {\n const host = entry.host ?? \"unknown\";\n const ip = entry.ip ? `(${entry.ip})` : \"\";\n const mode = entry.mode ?? \"\";\n const version = entry.version ?? \"\";\n return `${host} ${ip} ${mode} ${version}`.trim();\n}\n\nexport function formatPresenceAge(entry: PresenceEntry): string {\n const ts = entry.ts ?? null;\n return ts ? formatAgo(ts) : \"n/a\";\n}\n\nexport function formatNextRun(ms?: number | null) {\n if (!ms) return \"n/a\";\n return `${formatMs(ms)} (${formatAgo(ms)})`;\n}\n\nexport function formatSessionTokens(row: GatewaySessionRow) {\n if (row.totalTokens == null) return \"n/a\";\n const total = row.totalTokens ?? 0;\n const ctx = row.contextTokens ?? 0;\n return ctx ? `${total} / ${ctx}` : String(total);\n}\n\nexport function formatEventPayload(payload: unknown): string {\n if (payload == null) return \"\";\n try {\n return JSON.stringify(payload, null, 2);\n } catch {\n return String(payload);\n }\n}\n\nexport function formatCronState(job: CronJob) {\n const state = job.state ?? {};\n const next = state.nextRunAtMs ? formatMs(state.nextRunAtMs) : \"n/a\";\n const last = state.lastRunAtMs ? formatMs(state.lastRunAtMs) : \"n/a\";\n const status = state.lastStatus ?? \"n/a\";\n return `${status} · next ${next} · last ${last}`;\n}\n\nexport function formatCronSchedule(job: CronJob) {\n const s = job.schedule;\n if (s.kind === \"at\") return `At ${formatMs(s.atMs)}`;\n if (s.kind === \"every\") return `Every ${formatDurationMs(s.everyMs)}`;\n return `Cron ${s.expr}${s.tz ? ` (${s.tz})` : \"\"}`;\n}\n\nexport function formatCronPayload(job: CronJob) {\n const p = job.payload;\n if (p.kind === \"systemEvent\") return `System: ${p.text}`;\n return `Agent: ${p.message}`;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatMs } from \"../format\";\nimport {\n formatCronPayload,\n formatCronSchedule,\n formatCronState,\n formatNextRun,\n} from \"../presenter\";\nimport type { ChannelUiMetaEntry, CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronProps = {\n loading: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n error: string | null;\n busy: boolean;\n form: CronFormState;\n channels: string[];\n channelLabels?: Record<string, string>;\n channelMeta?: ChannelUiMetaEntry[];\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob) => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n};\n\nfunction buildChannelOptions(props: CronProps): string[] {\n const options = [\"last\", ...props.channels.filter(Boolean)];\n const current = props.form.channel?.trim();\n if (current && !options.includes(current)) {\n options.push(current);\n }\n const seen = new Set<string>();\n return options.filter((value) => {\n if (seen.has(value)) return false;\n seen.add(value);\n return true;\n });\n}\n\nfunction resolveChannelLabel(props: CronProps, channel: string): string {\n if (channel === \"last\") return \"last\";\n const meta = props.channelMeta?.find((entry) => entry.id === channel);\n if (meta?.label) return meta.label;\n return props.channelLabels?.[channel] ?? channel;\n}\n\nexport function renderCron(props: CronProps) {\n const channelOptions = buildChannelOptions(props);\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">调度器</div>\n <div class=\"card-sub\">网关定时任务调度器状态。</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">已启用</div>\n <div class=\"stat-value\">\n ${props.status\n ? props.status.enabled\n ? \"Yes\"\n : \"No\"\n : \"n/a\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">任务数</div>\n <div class=\"stat-value\">${props.status?.jobs ?? \"n/a\"}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">下次唤醒</div>\n <div class=\"stat-value\">${formatNextRun(props.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"刷新中…\" : \"刷新\"}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">新建任务</div>\n <div class=\"card-sub\">创建计划唤醒或代理运行。</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>名称</span>\n <input\n .value=${props.form.name}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>描述</span>\n <input\n .value=${props.form.description}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>代理 ID</span>\n <input\n .value=${props.form.agentId}\n @input=${(e: Event) =>\n props.onFormChange({ agentId: (e.target as HTMLInputElement).value })}\n placeholder=\"default\"\n />\n </label>\n <label class=\"field checkbox\">\n <span>已启用</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n </label>\n <label class=\"field\">\n <span>计划</span>\n <select\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement).value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">每隔</option>\n <option value=\"at\">定时</option>\n <option value=\"cron\">Cron 表达式</option>\n </select>\n </label>\n </div>\n ${renderScheduleFields(props)}\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>会话</span>\n <select\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement).value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">主会话</option>\n <option value=\"isolated\">隔离会话</option>\n </select>\n </label>\n <label class=\"field\">\n <span>唤醒模式</span>\n <select\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"next-heartbeat\">下次心跳</option>\n <option value=\"now\">立即</option>\n </select>\n </label>\n <label class=\"field\">\n <span>负载</span>\n <select\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement).value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">系统事件</option>\n <option value=\"agentTurn\">代理轮次</option>\n </select>\n </label>\n </div>\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>${props.form.payloadKind === \"systemEvent\" ? \"系统文本\" : \"代理消息\"}</span>\n <textarea\n .value=${props.form.payloadText}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n ></textarea>\n </label>\n\t ${props.form.payloadKind === \"agentTurn\"\n\t ? html`\n\t <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field checkbox\">\n <span>投递</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.deliver}\n @change=${(e: Event) =>\n props.onFormChange({\n deliver: (e.target as HTMLInputElement).checked,\n })}\n />\n\t </label>\n\t <label class=\"field\">\n\t <span>渠道</span>\n\t <select\n\t .value=${props.form.channel || \"last\"}\n\t @change=${(e: Event) =>\n\t props.onFormChange({\n\t channel: (e.target as HTMLSelectElement).value as CronFormState[\"channel\"],\n\t })}\n\t >\n\t ${channelOptions.map(\n (channel) =>\n html`<option value=${channel}>\n ${resolveChannelLabel(props, channel)}\n </option>`,\n )}\n </select>\n </label>\n <label class=\"field\">\n <span>发送至</span>\n <input\n .value=${props.form.to}\n @input=${(e: Event) =>\n props.onFormChange({ to: (e.target as HTMLInputElement).value })}\n placeholder=\"+1555… or chat id\"\n />\n </label>\n <label class=\"field\">\n <span>超时(秒)</span>\n <input\n .value=${props.form.timeoutSeconds}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n ${props.form.sessionTarget === \"isolated\"\n ? html`\n <label class=\"field\">\n <span>发布到主会话前缀</span>\n <input\n .value=${props.form.postToMainPrefix}\n @input=${(e: Event) =>\n props.onFormChange({\n postToMainPrefix: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `\n : nothing}\n </div>\n `\n : nothing}\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn primary\" ?disabled=${props.busy} @click=${props.onAdd}>\n ${props.busy ? \"保存中…\" : \"添加任务\"}\n </button>\n </div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">任务列表</div>\n <div class=\"card-sub\">网关中存储的所有计划任务。</div>\n ${props.jobs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">暂无任务。</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.jobs.map((job) => renderJob(job, props))}\n </div>\n `}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">运行历史</div>\n <div class=\"card-sub\">Latest runs for ${props.runsJobId ?? \"(select a job)\"}.</div>\n ${props.runsJobId == null\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px;\">\n 选择一个任务查看运行历史。\n </div>\n `\n : props.runs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">暂无运行记录。</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.runs.map((entry) => renderRun(entry))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>运行时间</span>\n <input\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>每隔</span>\n <input\n .value=${form.everyAmount}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>单位</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">分钟</option>\n <option value=\"hours\">小时</option>\n <option value=\"days\">天</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>表达式</span>\n <input\n .value=${form.cronExpr}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>时区(可选)</span>\n <input\n .value=${form.cronTz}\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n />\n </label>\n </div>\n `;\n}\n\nfunction renderJob(job: CronJob, props: CronProps) {\n const isSelected = props.runsJobId === job.id;\n const itemClass = `list-item list-item-clickable${isSelected ? \" list-item-selected\" : \"\"}`;\n return html`\n <div class=${itemClass} @click=${() => props.onLoadRuns(job.id)}>\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n <div class=\"list-sub\">${formatCronSchedule(job)}</div>\n <div class=\"muted\">${formatCronPayload(job)}</div>\n ${job.agentId ? html`<div class=\"muted\">Agent: ${job.agentId}</div>` : nothing}\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${job.enabled ? \"enabled\" : \"disabled\"}</span>\n <span class=\"chip\">${job.sessionTarget}</span>\n <span class=\"chip\">${job.wakeMode}</span>\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatCronState(job)}</div>\n <div class=\"row\" style=\"justify-content: flex-end; margin-top: 8px;\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onToggle(job, !job.enabled);\n }}\n >\n ${job.enabled ? \"禁用\" : \"启用\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onRun(job);\n }}\n >\n 运行\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onLoadRuns(job.id);\n }}\n >\n 历史\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${(event: Event) => {\n event.stopPropagation();\n props.onRemove(job);\n }}\n >\n 删除\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderRun(entry: CronRunLogEntry) {\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.status}</div>\n <div class=\"list-sub\">${entry.summary ?? \"\"}</div>\n </div>\n <div class=\"list-meta\">\n <div>${formatMs(entry.ts)}</div>\n <div class=\"muted\">${entry.durationMs ?? 0}ms</div>\n ${entry.error ? html`<div class=\"muted\">${entry.error}</div>` : nothing}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatEventPayload } from \"../presenter\";\nimport type { EventLogEntry } from \"../app-events\";\n\nexport type DebugProps = {\n loading: boolean;\n status: Record<string, unknown> | null;\n health: Record<string, unknown> | null;\n models: unknown[];\n heartbeat: unknown;\n eventLog: EventLogEntry[];\n callMethod: string;\n callParams: string;\n callResult: string | null;\n callError: string | null;\n onCallMethodChange: (next: string) => void;\n onCallParamsChange: (next: string) => void;\n onRefresh: () => void;\n onCall: () => void;\n};\n\nexport function renderDebug(props: DebugProps) {\n const securityAudit =\n props.status && typeof props.status === \"object\"\n ? (props.status as { securityAudit?: { summary?: Record<string, number> } }).securityAudit\n : null;\n const securitySummary = securityAudit?.summary ?? null;\n const critical = securitySummary?.critical ?? 0;\n const warn = securitySummary?.warn ?? 0;\n const info = securitySummary?.info ?? 0;\n const securityTone = critical > 0 ? \"danger\" : warn > 0 ? \"warn\" : \"success\";\n const securityLabel =\n critical > 0\n ? `${critical} critical`\n : warn > 0\n ? `${warn} warnings`\n : \"No critical issues\";\n\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">快照</div>\n <div class=\"card-sub\">状态、健康和心跳数据。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"刷新中…\" : \"刷新\"}\n </button>\n </div>\n <div class=\"stack\" style=\"margin-top: 12px;\">\n <div>\n <div class=\"muted\">状态</div>\n ${securitySummary\n ? html`<div class=\"callout ${securityTone}\" style=\"margin-top: 8px;\">\n Security audit: ${securityLabel}${info > 0 ? ` · ${info} info` : \"\"}. Run\n <span class=\"mono\">openclaw security audit --deep</span> for details.\n </div>`\n : nothing}\n <pre class=\"code-block\">${JSON.stringify(props.status ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">健康</div>\n <pre class=\"code-block\">${JSON.stringify(props.health ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">最后心跳</div>\n <pre class=\"code-block\">${JSON.stringify(props.heartbeat ?? {}, null, 2)}</pre>\n </div>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">手动 RPC</div>\n <div class=\"card-sub\">使用 JSON 参数发送原始网关方法。</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>方法</span>\n <input\n .value=${props.callMethod}\n @input=${(e: Event) =>\n props.onCallMethodChange((e.target as HTMLInputElement).value)}\n placeholder=\"system-presence\"\n />\n </label>\n <label class=\"field\">\n <span>参数 (JSON)</span>\n <textarea\n .value=${props.callParams}\n @input=${(e: Event) =>\n props.onCallParamsChange((e.target as HTMLTextAreaElement).value)}\n rows=\"6\"\n ></textarea>\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn primary\" @click=${props.onCall}>调用</button>\n </div>\n ${props.callError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.callError}\n </div>`\n : nothing}\n ${props.callResult\n ? html`<pre class=\"code-block\" style=\"margin-top: 12px;\">${props.callResult}</pre>`\n : nothing}\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">模型</div>\n <div class=\"card-sub\">来自 models.list 的模型目录。</div>\n <pre class=\"code-block\" style=\"margin-top: 12px;\">${JSON.stringify(\n props.models ?? [],\n null,\n 2,\n )}</pre>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">事件日志</div>\n <div class=\"card-sub\">最新网关事件。</div>\n ${props.eventLog.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">暂无事件。</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.eventLog.map(\n (evt) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${evt.event}</div>\n <div class=\"list-sub\">${new Date(evt.ts).toLocaleTimeString()}</div>\n </div>\n <div class=\"list-meta\">\n <pre class=\"code-block\">${formatEventPayload(evt.payload)}</pre>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatPresenceAge, formatPresenceSummary } from \"../presenter\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nexport function renderInstances(props: InstancesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">已连接实例</div>\n <div class=\"card-sub\">来自网关和客户端的存在信标。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"加载中…\" : \"刷新\"}\n </button>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n ${props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing}\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.entries.length === 0\n ? html`<div class=\"muted\">暂无实例报告。</div>`\n : props.entries.map((entry) => renderEntry(entry))}\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry) {\n const lastInput =\n entry.lastInputSeconds != null\n ? `${entry.lastInputSeconds}s ago`\n : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n const roles = Array.isArray(entry.roles) ? entry.roles.filter(Boolean) : [];\n const scopes = Array.isArray(entry.scopes) ? entry.scopes.filter(Boolean) : [];\n const scopesLabel =\n scopes.length > 0\n ? scopes.length > 3\n ? `${scopes.length} scopes`\n : `scopes: ${scopes.join(\", \")}`\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.host ?? \"unknown host\"}</div>\n <div class=\"list-sub\">${formatPresenceSummary(entry)}</div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${roles.map((role) => html`<span class=\"chip\">${role}</span>`)}\n ${scopesLabel ? html`<span class=\"chip\">${scopesLabel}</span>` : nothing}\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily\n ? html`<span class=\"chip\">${entry.deviceFamily}</span>`\n : nothing}\n ${entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing}\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">最后输入 ${lastInput}</div>\n <div class=\"muted\">原因 ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { LogEntry, LogLevel } from \"../types\";\n\nconst LEVELS: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"];\n\nexport type LogsProps = {\n loading: boolean;\n error: string | null;\n file: string | null;\n entries: LogEntry[];\n filterText: string;\n levelFilters: Record<LogLevel, boolean>;\n autoFollow: boolean;\n truncated: boolean;\n onFilterTextChange: (next: string) => void;\n onLevelToggle: (level: LogLevel, enabled: boolean) => void;\n onToggleAutoFollow: (next: boolean) => void;\n onRefresh: () => void;\n onExport: (lines: string[], label: string) => void;\n onScroll: (event: Event) => void;\n};\n\nfunction formatTime(value?: string | null) {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleTimeString();\n}\n\nfunction matchesFilter(entry: LogEntry, needle: string) {\n if (!needle) return true;\n const haystack = [entry.message, entry.subsystem, entry.raw]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n}\n\nexport function renderLogs(props: LogsProps) {\n const needle = props.filterText.trim().toLowerCase();\n const levelFiltered = LEVELS.some((level) => !props.levelFilters[level]);\n const filtered = props.entries.filter((entry) => {\n if (entry.level && !props.levelFilters[entry.level]) return false;\n return matchesFilter(entry, needle);\n });\n const exportLabel = needle || levelFiltered ? \"filtered\" : \"visible\";\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">日志</div>\n <div class=\"card-sub\">网关文件日志 (JSONL)。</div>\n </div>\n <div class=\"row\" style=\"gap: 8px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"加载中…\" : \"刷新\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${filtered.length === 0}\n @click=${() => props.onExport(filtered.map((entry) => entry.raw), exportLabel)}\n >\n 导出 ${exportLabel}\n </button>\n </div>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"min-width: 220px;\">\n <span>筛选</span>\n <input\n .value=${props.filterText}\n @input=${(e: Event) =>\n props.onFilterTextChange((e.target as HTMLInputElement).value)}\n placeholder=\"搜索日志\"\n />\n </label>\n <label class=\"field checkbox\">\n <span>自动跟踪</span>\n <input\n type=\"checkbox\"\n .checked=${props.autoFollow}\n @change=${(e: Event) =>\n props.onToggleAutoFollow((e.target as HTMLInputElement).checked)}\n />\n </label>\n </div>\n\n <div class=\"chip-row\" style=\"margin-top: 12px;\">\n ${LEVELS.map(\n (level) => html`\n <label class=\"chip log-chip ${level}\">\n <input\n type=\"checkbox\"\n .checked=${props.levelFilters[level]}\n @change=${(e: Event) =>\n props.onLevelToggle(level, (e.target as HTMLInputElement).checked)}\n />\n <span>${level}</span>\n </label>\n `,\n )}\n </div>\n\n ${props.file\n ? html`<div class=\"muted\" style=\"margin-top: 10px;\">File: ${props.file}</div>`\n : nothing}\n ${props.truncated\n ? html`<div class=\"callout\" style=\"margin-top: 10px;\">\n 日志输出已截断;显示最新部分。\n </div>`\n : nothing}\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 10px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"log-stream\" style=\"margin-top: 12px;\" @scroll=${props.onScroll}>\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"padding: 12px;\">暂无日志条目。</div>`\n : filtered.map(\n (entry) => html`\n <div class=\"log-row\">\n <div class=\"log-time mono\">${formatTime(entry.time)}</div>\n <div class=\"log-level ${entry.level ?? \"\"}\">${entry.level ?? \"\"}</div>\n <div class=\"log-subsystem mono\">${entry.subsystem ?? \"\"}</div>\n <div class=\"log-message mono\">${entry.message ?? entry.raw}</div>\n </div>\n `,\n )}\n </div>\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText, formatAgo, formatList } from \"../format\";\nimport type {\n ExecApprovalsAllowlistEntry,\n ExecApprovalsFile,\n ExecApprovalsSnapshot,\n} from \"../controllers/exec-approvals\";\nimport type {\n DevicePairingList,\n DeviceTokenSummary,\n PairedDevice,\n PendingDevice,\n} from \"../controllers/devices\";\n\nexport type NodesProps = {\n loading: boolean;\n nodes: Array<Record<string, unknown>>;\n devicesLoading: boolean;\n devicesError: string | null;\n devicesList: DevicePairingList | null;\n configForm: Record<string, unknown> | null;\n configLoading: boolean;\n configSaving: boolean;\n configDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n execApprovalsLoading: boolean;\n execApprovalsSaving: boolean;\n execApprovalsDirty: boolean;\n execApprovalsSnapshot: ExecApprovalsSnapshot | null;\n execApprovalsForm: ExecApprovalsFile | null;\n execApprovalsSelectedAgent: string | null;\n execApprovalsTarget: \"gateway\" | \"node\";\n execApprovalsTargetNodeId: string | null;\n onRefresh: () => void;\n onDevicesRefresh: () => void;\n onDevice批准: (requestId: string) => void;\n onDevice拒绝: (requestId: string) => void;\n onDevice轮换: (deviceId: string, role: string, scopes?: string[]) => void;\n onDevice撤销: (deviceId: string, role: string) => void;\n onLoadConfig: () => void;\n onLoadExecApprovals: () => void;\n onBindDefault: (nodeId: string | null) => void;\n onBindAgent: (agentIndex: number, nodeId: string | null) => void;\n onSaveBindings: () => void;\n onExecApprovalsTargetChange: (kind: \"gateway\" | \"node\", nodeId: string | null) => void;\n onExecApprovalsSelectAgent: (agentId: string) => void;\n onExecApprovalsPatch: (path: Array<string | number>, value: unknown) => void;\n onExecApprovals移除: (path: Array<string | number>) => void;\n onSaveExecApprovals: () => void;\n};\n\nexport function renderNodes(props: NodesProps) {\n const bindingState = resolveBindingsState(props);\n const approvalsState = resolveExecApprovalsState(props);\n return html`\n ${renderExecApprovals(approvalsState)}\n ${renderBindings(bindingState)}\n ${renderDevices(props)}\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">节点</div>\n <div class=\"card-sub\">配对设备和实时链接。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"加载中…\" : \"刷新\"}\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.nodes.length === 0\n ? html`<div class=\"muted\">未找到节点。</div>`\n : props.nodes.map((n) => renderNode(n))}\n </div>\n </section>\n `;\n}\n\nfunction renderDevices(props: NodesProps) {\n const list = props.devicesList ?? { pending: [], paired: [] };\n const pending = Array.isArray(list.pending) ? list.pending : [];\n const paired = Array.isArray(list.paired) ? list.paired : [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">设备</div>\n <div class=\"card-sub\">配对请求 + 角色令牌。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.devicesLoading} @click=${props.onDevicesRefresh}>\n ${props.devicesLoading ? \"加载中…\" : \"刷新\"}\n </button>\n </div>\n ${props.devicesError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.devicesError}</div>`\n : nothing}\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${pending.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-bottom: 8px;\">待处理</div>\n ${pending.map((req) => renderPendingDevice(req, props))}\n `\n : nothing}\n ${paired.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 12px; margin-bottom: 8px;\">已配对</div>\n ${paired.map((device) => renderPairedDevice(device, props))}\n `\n : nothing}\n ${pending.length === 0 && paired.length === 0\n ? html`<div class=\"muted\">没有配对设备。</div>`\n : nothing}\n </div>\n </section>\n `;\n}\n\nfunction renderPendingDevice(req: PendingDevice, props: NodesProps) {\n const name = req.displayName?.trim() || req.deviceId;\n const age = typeof req.ts === \"number\" ? formatAgo(req.ts) : \"n/a\";\n const role = req.role?.trim() ? `role: ${req.role}` : \"role: -\";\n const repair = req.isRepair ? \" · repair\" : \"\";\n const ip = req.remoteIp ? ` · ${req.remoteIp}` : \"\";\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${name}</div>\n <div class=\"list-sub\">${req.deviceId}${ip}</div>\n <div class=\"muted\" style=\"margin-top: 6px;\">\n ${role} · requested ${age}${repair}\n </div>\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; gap: 8px; flex-wrap: wrap;\">\n <button class=\"btn btn--sm primary\" @click=${() => props.onDevice批准(req.requestId)}>\n 批准\n </button>\n <button class=\"btn btn--sm\" @click=${() => props.onDevice拒绝(req.requestId)}>\n 拒绝\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderPairedDevice(device: PairedDevice, props: NodesProps) {\n const name = device.displayName?.trim() || device.deviceId;\n const ip = device.remoteIp ? ` · ${device.remoteIp}` : \"\";\n const roles = `roles: ${formatList(device.roles)}`;\n const scopes = `scopes: ${formatList(device.scopes)}`;\n const tokens = Array.isArray(device.tokens) ? device.tokens : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${name}</div>\n <div class=\"list-sub\">${device.deviceId}${ip}</div>\n <div class=\"muted\" style=\"margin-top: 6px;\">${roles} · ${scopes}</div>\n ${tokens.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 6px;\">令牌:无</div>`\n : html`\n <div class=\"muted\" style=\"margin-top: 10px;\">令牌</div>\n <div style=\"display: flex; flex-direction: column; gap: 8px; margin-top: 6px;\">\n ${tokens.map((token) => renderTokenRow(device.deviceId, token, props))}\n </div>\n `}\n </div>\n </div>\n `;\n}\n\nfunction renderTokenRow(deviceId: string, token: DeviceTokenSummary, props: NodesProps) {\n const status = token.revokedAtMs ? \"revoked\" : \"active\";\n const scopes = `scopes: ${formatList(token.scopes)}`;\n const when = formatAgo(token.rotatedAtMs ?? token.createdAtMs ?? token.lastUsedAtMs ?? null);\n return html`\n <div class=\"row\" style=\"justify-content: space-between; gap: 8px;\">\n <div class=\"list-sub\">${token.role} · ${status} · ${scopes} · ${when}</div>\n <div class=\"row\" style=\"justify-content: flex-end; gap: 6px; flex-wrap: wrap;\">\n <button\n class=\"btn btn--sm\"\n @click=${() => props.onDevice轮换(deviceId, token.role, token.scopes)}\n >\n 轮换\n </button>\n ${token.revokedAtMs\n ? nothing\n : html`\n <button\n class=\"btn btn--sm danger\"\n @click=${() => props.onDevice撤销(deviceId, token.role)}\n >\n 撤销\n </button>\n `}\n </div>\n </div>\n `;\n}\n\ntype BindingAgent = {\n id: string;\n name?: string;\n index: number;\n isDefault: boolean;\n binding?: string | null;\n};\n\ntype BindingNode = {\n id: string;\n label: string;\n};\n\ntype BindingState = {\n ready: boolean;\n disabled: boolean;\n configDirty: boolean;\n configLoading: boolean;\n configSaving: boolean;\n defaultBinding?: string | null;\n agents: BindingAgent[];\n nodes: BindingNode[];\n onBindDefault: (nodeId: string | null) => void;\n onBindAgent: (agentIndex: number, nodeId: string | null) => void;\n onSave: () => void;\n onLoadConfig: () => void;\n formMode: \"form\" | \"raw\";\n};\n\ntype ExecSecurity = \"deny\" | \"allowlist\" | \"full\";\ntype ExecAsk = \"off\" | \"on-miss\" | \"always\";\n\ntype ExecApprovalsResolved默认值 = {\n security: ExecSecurity;\n ask: ExecAsk;\n askFallback: ExecSecurity;\n autoAllowSkills: boolean;\n};\n\ntype ExecApprovalsAgentOption = {\n id: string;\n name?: string;\n isDefault?: boolean;\n};\n\ntype ExecApprovalsTargetNode = {\n id: string;\n label: string;\n};\n\ntype ExecApprovalsState = {\n ready: boolean;\n disabled: boolean;\n dirty: boolean;\n loading: boolean;\n saving: boolean;\n form: ExecApprovalsFile | null;\n defaults: ExecApprovalsResolved默认值;\n selectedScope: string;\n selectedAgent: Record<string, unknown> | null;\n agents: ExecApprovalsAgentOption[];\n allowlist: ExecApprovalsAllowlistEntry[];\n target: \"gateway\" | \"node\";\n targetNodeId: string | null;\n targetNodes: ExecApprovalsTargetNode[];\n onSelectScope: (agentId: string) => void;\n onSelectTarget: (kind: \"gateway\" | \"node\", nodeId: string | null) => void;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n on移除: (path: Array<string | number>) => void;\n onLoad: () => void;\n onSave: () => void;\n};\n\nconst EXEC_APPROVALS_DEFAULT_SCOPE = \"__defaults__\";\n\nconst SECURITY_OPTIONS: Array<{ value: ExecSecurity; label: string }> = [\n { value: \"deny\", label: \"拒绝\" },\n { value: \"allowlist\", label: \"白名单\" },\n { value: \"full\", label: \"完全\" },\n];\n\nconst ASK_OPTIONS: Array<{ value: ExecAsk; label: string }> = [\n { value: \"off\", label: \"关闭\" },\n { value: \"on-miss\", label: \"未命中时\" },\n { value: \"always\", label: \"始终\" },\n];\n\nfunction resolveBindingsState(props: NodesProps): BindingState {\n const config = props.configForm;\n const nodes = resolveExecNodes(props.nodes);\n const { defaultBinding, agents } = resolveAgentBindings(config);\n const ready = Boolean(config);\n const disabled = props.configSaving || props.configFormMode === \"raw\";\n return {\n ready,\n disabled,\n configDirty: props.configDirty,\n configLoading: props.configLoading,\n configSaving: props.configSaving,\n defaultBinding,\n agents,\n nodes,\n onBindDefault: props.onBindDefault,\n onBindAgent: props.onBindAgent,\n onSave: props.onSaveBindings,\n onLoadConfig: props.onLoadConfig,\n formMode: props.configFormMode,\n };\n}\n\nfunction normalizeSecurity(value?: string): ExecSecurity {\n if (value === \"allowlist\" || value === \"full\" || value === \"deny\") return value;\n return \"deny\";\n}\n\nfunction normalizeAsk(value?: string): ExecAsk {\n if (value === \"always\" || value === \"off\" || value === \"on-miss\") return value;\n return \"on-miss\";\n}\n\nfunction resolveExecApprovals默认值(\n form: ExecApprovalsFile | null,\n): ExecApprovalsResolved默认值 {\n const defaults = form?.defaults ?? {};\n return {\n security: normalizeSecurity(defaults.security),\n ask: normalizeAsk(defaults.ask),\n askFallback: normalizeSecurity(defaults.askFallback ?? \"deny\"),\n autoAllowSkills: Boolean(defaults.autoAllowSkills ?? false),\n };\n}\n\nfunction resolveConfigAgents(config: Record<string, unknown> | null): ExecApprovalsAgentOption[] {\n const agentsNode = (config?.agents ?? {}) as Record<string, unknown>;\n const list = Array.isArray(agentsNode.list) ? agentsNode.list : [];\n const agents: ExecApprovalsAgentOption[] = [];\n list.forEach((entry) => {\n if (!entry || typeof entry !== \"object\") return;\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n if (!id) return;\n const name = typeof record.name === \"string\" ? record.name.trim() : undefined;\n const isDefault = record.default === true;\n agents.push({ id, name: name || undefined, isDefault });\n });\n return agents;\n}\n\nfunction resolveExecApprovalsAgents(\n config: Record<string, unknown> | null,\n form: ExecApprovalsFile | null,\n): ExecApprovalsAgentOption[] {\n const configAgents = resolveConfigAgents(config);\n const approvalsAgents = Object.keys(form?.agents ?? {});\n const merged = new Map<string, ExecApprovalsAgentOption>();\n configAgents.forEach((agent) => merged.set(agent.id, agent));\n approvalsAgents.forEach((id) => {\n if (merged.has(id)) return;\n merged.set(id, { id });\n });\n const agents = Array.from(merged.values());\n if (agents.length === 0) {\n agents.push({ id: \"main\", isDefault: true });\n }\n agents.sort((a, b) => {\n if (a.isDefault && !b.isDefault) return -1;\n if (!a.isDefault && b.isDefault) return 1;\n const aLabel = a.name?.trim() ? a.name : a.id;\n const bLabel = b.name?.trim() ? b.name : b.id;\n return aLabel.localeCompare(bLabel);\n });\n return agents;\n}\n\nfunction resolveExecApprovalsScope(\n selected: string | null,\n agents: ExecApprovalsAgentOption[],\n): string {\n if (selected === EXEC_APPROVALS_DEFAULT_SCOPE) return EXEC_APPROVALS_DEFAULT_SCOPE;\n if (selected && agents.some((agent) => agent.id === selected)) return selected;\n return EXEC_APPROVALS_DEFAULT_SCOPE;\n}\n\nfunction resolveExecApprovalsState(props: NodesProps): ExecApprovalsState {\n const form = props.execApprovalsForm ?? props.execApprovalsSnapshot?.file ?? null;\n const ready = Boolean(form);\n const defaults = resolveExecApprovals默认值(form);\n const agents = resolveExecApprovalsAgents(props.configForm, form);\n const targetNodes = resolveExecApprovalsNodes(props.nodes);\n const target = props.execApprovalsTarget;\n let targetNodeId =\n target === \"node\" && props.execApprovalsTargetNodeId\n ? props.execApprovalsTargetNodeId\n : null;\n if (target === \"node\" && targetNodeId && !targetNodes.some((node) => node.id === targetNodeId)) {\n targetNodeId = null;\n }\n const selectedScope = resolveExecApprovalsScope(props.execApprovalsSelectedAgent, agents);\n const selectedAgent =\n selectedScope !== EXEC_APPROVALS_DEFAULT_SCOPE\n ? ((form?.agents ?? {})[selectedScope] as Record<string, unknown> | undefined) ??\n null\n : null;\n const allowlist = Array.isArray((selectedAgent as { allowlist?: unknown })?.allowlist)\n ? ((selectedAgent as { allowlist?: ExecApprovalsAllowlistEntry[] }).allowlist ??\n [])\n : [];\n return {\n ready,\n disabled: props.execApprovalsSaving || props.execApprovalsLoading,\n dirty: props.execApprovalsDirty,\n loading: props.execApprovalsLoading,\n saving: props.execApprovalsSaving,\n form,\n defaults,\n selectedScope,\n selectedAgent,\n agents,\n allowlist,\n target,\n targetNodeId,\n targetNodes,\n onSelectScope: props.onExecApprovalsSelectAgent,\n onSelectTarget: props.onExecApprovalsTargetChange,\n onPatch: props.onExecApprovalsPatch,\n on移除: props.onExecApprovals移除,\n onLoad: props.onLoadExecApprovals,\n onSave: props.onSaveExecApprovals,\n };\n}\n\nfunction renderBindings(state: BindingState) {\n const supportsBinding = state.nodes.length > 0;\n const defaultValue = state.defaultBinding ?? \"\";\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; align-items: center;\">\n <div>\n <div class=\"card-title\">执行节点绑定</div>\n <div class=\"card-sub\">\n Pin agents to a specific node when using <span class=\"mono\">exec host=node</span>.\n </div>\n </div>\n <button\n class=\"btn\"\n ?disabled=${state.disabled || !state.configDirty}\n @click=${state.onSave}\n >\n ${state.configSaving ? \"保存中…\" : \"保存\"}\n </button>\n </div>\n\n ${state.formMode === \"raw\"\n ? html`<div class=\"callout warn\" style=\"margin-top: 12px;\">\n Switch the Config tab to <strong>Form</strong> mode to edit bindings here.\n </div>`\n : nothing}\n\n ${!state.ready\n ? html`<div class=\"row\" style=\"margin-top: 12px; gap: 12px;\">\n <div class=\"muted\">加载配置以编辑绑定。</div>\n <button class=\"btn\" ?disabled=${state.configLoading} @click=${state.onLoadConfig}>\n ${state.configLoading ? \"加载中…\" : \"加载配置\"}\n </button>\n </div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">默认绑定</div>\n <div class=\"list-sub\">当代理未覆盖节点绑定时使用。</div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>节点</span>\n <select\n ?disabled=${state.disabled || !supportsBinding}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onBindDefault(value ? value : null);\n }}\n >\n <option value=\"\" ?selected=${defaultValue === \"\"}>任意节点</option>\n ${state.nodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${defaultValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n ${!supportsBinding\n ? html`<div class=\"muted\">没有可用的 system.run 节点。</div>`\n : nothing}\n </div>\n </div>\n\n ${state.agents.length === 0\n ? html`<div class=\"muted\">未找到代理。</div>`\n : state.agents.map((agent) =>\n renderAgentBinding(agent, state),\n )}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderExecApprovals(state: ExecApprovalsState) {\n const ready = state.ready;\n const targetReady = state.target !== \"node\" || Boolean(state.targetNodeId);\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between; align-items: center;\">\n <div>\n <div class=\"card-title\">执行审批</div>\n <div class=\"card-sub\">\n Allowlist and approval policy for <span class=\"mono\">exec host=gateway/node</span>.\n </div>\n </div>\n <button\n class=\"btn\"\n ?disabled=${state.disabled || !state.dirty || !targetReady}\n @click=${state.onSave}\n >\n ${state.saving ? \"保存中…\" : \"保存\"}\n </button>\n </div>\n\n ${renderExecApprovalsTarget(state)}\n\n ${!ready\n ? html`<div class=\"row\" style=\"margin-top: 12px; gap: 12px;\">\n <div class=\"muted\">加载执行审批以编辑白名单。</div>\n <button class=\"btn\" ?disabled=${state.loading || !targetReady} @click=${state.onLoad}>\n ${state.loading ? \"加载中…\" : \"加载审批\"}\n </button>\n </div>`\n : html`\n ${renderExecApprovalsTabs(state)}\n ${renderExecApprovalsPolicy(state)}\n ${state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE\n ? nothing\n : renderExecApprovalsAllowlist(state)}\n `}\n </section>\n `;\n}\n\nfunction renderExecApprovalsTarget(state: ExecApprovalsState) {\n const hasNodes = state.targetNodes.length > 0;\n const nodeValue = state.targetNodeId ?? \"\";\n return html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">目标</div>\n <div class=\"list-sub\">\n 网关编辑本地审批;节点编辑所选节点。\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>主机</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (value === \"node\") {\n const first = state.targetNodes[0]?.id ?? null;\n state.onSelectTarget(\"node\", nodeValue || first);\n } else {\n state.onSelectTarget(\"gateway\", null);\n }\n }}\n >\n <option value=\"gateway\" ?selected=${state.target === \"gateway\"}>网关</option>\n <option value=\"node\" ?selected=${state.target === \"node\"}>节点</option>\n </select>\n </label>\n ${state.target === \"node\"\n ? html`\n <label class=\"field\">\n <span>节点</span>\n <select\n ?disabled=${state.disabled || !hasNodes}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onSelectTarget(\"node\", value ? value : null);\n }}\n >\n <option value=\"\" ?selected=${nodeValue === \"\"}>选择节点</option>\n ${state.targetNodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${nodeValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n `\n : nothing}\n </div>\n </div>\n ${state.target === \"node\" && !hasNodes\n ? html`<div class=\"muted\">尚无节点提供执行审批功能。</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction renderExecApprovalsTabs(state: ExecApprovalsState) {\n return html`\n <div class=\"row\" style=\"margin-top: 12px; gap: 8px; flex-wrap: wrap;\">\n <span class=\"label\">范围</span>\n <div class=\"row\" style=\"gap: 8px; flex-wrap: wrap;\">\n <button\n class=\"btn btn--sm ${state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE ? \"active\" : \"\"}\"\n @click=${() => state.onSelectScope(EXEC_APPROVALS_DEFAULT_SCOPE)}\n >\n 默认值\n </button>\n ${state.agents.map((agent) => {\n const label = agent.name?.trim() ? `${agent.name} (${agent.id})` : agent.id;\n return html`\n <button\n class=\"btn btn--sm ${state.selectedScope === agent.id ? \"active\" : \"\"}\"\n @click=${() => state.onSelectScope(agent.id)}\n >\n ${label}\n </button>\n `;\n })}\n </div>\n </div>\n `;\n}\n\nfunction renderExecApprovalsPolicy(state: ExecApprovalsState) {\n const is默认值 = state.selectedScope === EXEC_APPROVALS_DEFAULT_SCOPE;\n const defaults = state.defaults;\n const agent = state.selectedAgent ?? {};\n const basePath = is默认值 ? [\"defaults\"] : [\"agents\", state.selectedScope];\n const agentSecurity = typeof agent.security === \"string\" ? agent.security : undefined;\n const agentAsk = typeof agent.ask === \"string\" ? agent.ask : undefined;\n const agentAskFallback =\n typeof agent.askFallback === \"string\" ? agent.askFallback : undefined;\n const securityValue = is默认值 ? defaults.security : agentSecurity ?? \"__default__\";\n const askValue = is默认值 ? defaults.ask : agentAsk ?? \"__default__\";\n const askFallbackValue = is默认值\n ? defaults.askFallback\n : agentAskFallback ?? \"__default__\";\n const autoOverride =\n typeof agent.autoAllowSkills === \"boolean\" ? agent.autoAllowSkills : undefined;\n const autoEffective = autoOverride ?? defaults.autoAllowSkills;\n const autoIsDefault = autoOverride == null;\n\n return html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">安全</div>\n <div class=\"list-sub\">\n ${is默认值\n ? \"Default security mode.\"\n : `Default: ${defaults.security}.`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>模式</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!is默认值 && value === \"__default__\") {\n state.on移除([...basePath, \"security\"]);\n } else {\n state.onPatch([...basePath, \"security\"], value);\n }\n }}\n >\n ${!is默认值\n ? html`<option value=\"__default__\" ?selected=${securityValue === \"__default__\"}>\n 使用默认 (${defaults.security})\n </option>`\n : nothing}\n ${SECURITY_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${securityValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">询问</div>\n <div class=\"list-sub\">\n ${is默认值 ? \"Default prompt policy.\" : `Default: ${defaults.ask}.`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>模式</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!is默认值 && value === \"__default__\") {\n state.on移除([...basePath, \"ask\"]);\n } else {\n state.onPatch([...basePath, \"ask\"], value);\n }\n }}\n >\n ${!is默认值\n ? html`<option value=\"__default__\" ?selected=${askValue === \"__default__\"}>\n 使用默认 (${defaults.ask})\n </option>`\n : nothing}\n ${ASK_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${askValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">询问回退</div>\n <div class=\"list-sub\">\n ${is默认值\n ? \"Applied when the UI prompt is unavailable.\"\n : `Default: ${defaults.askFallback}.`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>回退</span>\n <select\n ?disabled=${state.disabled}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value;\n if (!is默认值 && value === \"__default__\") {\n state.on移除([...basePath, \"askFallback\"]);\n } else {\n state.onPatch([...basePath, \"askFallback\"], value);\n }\n }}\n >\n ${!is默认值\n ? html`<option value=\"__default__\" ?selected=${askFallbackValue === \"__default__\"}>\n 使用默认 (${defaults.askFallback})\n </option>`\n : nothing}\n ${SECURITY_OPTIONS.map(\n (option) =>\n html`<option\n value=${option.value}\n ?selected=${askFallbackValue === option.value}\n >\n ${option.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">自动允许技能 CLI</div>\n <div class=\"list-sub\">\n ${is默认值\n ? \"Allow skill executables listed by the Gateway.\"\n : autoIsDefault\n ? `Using default (${defaults.autoAllowSkills ? \"on\" : \"off\"}).`\n : `Override (${autoEffective ? \"on\" : \"off\"}).`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>启用</span>\n <input\n type=\"checkbox\"\n ?disabled=${state.disabled}\n .checked=${autoEffective}\n @change=${(event: Event) => {\n const target = event.target as HTMLInputElement;\n state.onPatch([...basePath, \"autoAllowSkills\"], target.checked);\n }}\n />\n </label>\n ${!is默认值 && !autoIsDefault\n ? html`<button\n class=\"btn btn--sm\"\n ?disabled=${state.disabled}\n @click=${() => state.on移除([...basePath, \"autoAllowSkills\"])}\n >\n 使用默认\n </button>`\n : nothing}\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderExecApprovalsAllowlist(state: ExecApprovalsState) {\n const allowlistPath = [\"agents\", state.selectedScope, \"allowlist\"];\n const entries = state.allowlist;\n return html`\n <div class=\"row\" style=\"margin-top: 18px; justify-content: space-between;\">\n <div>\n <div class=\"card-title\">白名单</div>\n <div class=\"card-sub\">不区分大小写的通配符模式。</div>\n </div>\n <button\n class=\"btn btn--sm\"\n ?disabled=${state.disabled}\n @click=${() => {\n const next = [...entries, { pattern: \"\" }];\n state.onPatch(allowlistPath, next);\n }}\n >\n 添加模式\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${entries.length === 0\n ? html`<div class=\"muted\">尚无白名单条目。</div>`\n : entries.map((entry, index) =>\n renderAllowlistEntry(state, entry, index),\n )}\n </div>\n `;\n}\n\nfunction renderAllowlistEntry(\n state: ExecApprovalsState,\n entry: ExecApprovalsAllowlistEntry,\n index: number,\n) {\n const lastUsed = entry.lastUsedAt ? formatAgo(entry.lastUsedAt) : \"never\";\n const lastCommand = entry.lastUsedCommand\n ? clampText(entry.lastUsedCommand, 120)\n : null;\n const lastPath = entry.lastResolvedPath\n ? clampText(entry.lastResolvedPath, 120)\n : null;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.pattern?.trim() ? entry.pattern : \"New pattern\"}</div>\n <div class=\"list-sub\">最后使用:${lastUsed}</div>\n ${lastCommand ? html`<div class=\"list-sub mono\">${lastCommand}</div>` : nothing}\n ${lastPath ? html`<div class=\"list-sub mono\">${lastPath}</div>` : nothing}\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>Pattern</span>\n <input\n type=\"text\"\n .value=${entry.pattern ?? \"\"}\n ?disabled=${state.disabled}\n @input=${(event: Event) => {\n const target = event.target as HTMLInputElement;\n state.onPatch(\n [\"agents\", state.selectedScope, \"allowlist\", index, \"pattern\"],\n target.value,\n );\n }}\n />\n </label>\n <button\n class=\"btn btn--sm danger\"\n ?disabled=${state.disabled}\n @click=${() => {\n if (state.allowlist.length <= 1) {\n state.on移除([\"agents\", state.selectedScope, \"allowlist\"]);\n return;\n }\n state.on移除([\"agents\", state.selectedScope, \"allowlist\", index]);\n }}\n >\n 移除\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderAgentBinding(agent: BindingAgent, state: BindingState) {\n const bindingValue = agent.binding ?? \"__default__\";\n const label = agent.name?.trim() ? `${agent.name} (${agent.id})` : agent.id;\n const supportsBinding = state.nodes.length > 0;\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${label}</div>\n <div class=\"list-sub\">\n ${agent.isDefault ? \"default agent\" : \"agent\"} ·\n ${bindingValue === \"__default__\"\n ? `uses default (${state.defaultBinding ?? \"any\"})`\n : `override: ${agent.binding}`}\n </div>\n </div>\n <div class=\"list-meta\">\n <label class=\"field\">\n <span>绑定</span>\n <select\n ?disabled=${state.disabled || !supportsBinding}\n @change=${(event: Event) => {\n const target = event.target as HTMLSelectElement;\n const value = target.value.trim();\n state.onBindAgent(agent.index, value === \"__default__\" ? null : value);\n }}\n >\n <option value=\"__default__\" ?selected=${bindingValue === \"__default__\"}>\n 使用默认\n </option>\n ${state.nodes.map(\n (node) =>\n html`<option\n value=${node.id}\n ?selected=${bindingValue === node.id}\n >\n ${node.label}\n </option>`,\n )}\n </select>\n </label>\n </div>\n </div>\n `;\n}\n\nfunction resolveExecNodes(nodes: Array<Record<string, unknown>>): BindingNode[] {\n const list: BindingNode[] = [];\n for (const node of nodes) {\n const commands = Array.isArray(node.commands) ? node.commands : [];\n const supports = commands.some((cmd) => String(cmd) === \"system.run\");\n if (!supports) continue;\n const nodeId = typeof node.nodeId === \"string\" ? node.nodeId.trim() : \"\";\n if (!nodeId) continue;\n const displayName =\n typeof node.displayName === \"string\" && node.displayName.trim()\n ? node.displayName.trim()\n : nodeId;\n list.push({ id: nodeId, label: displayName === nodeId ? nodeId : `${displayName} · ${nodeId}` });\n }\n list.sort((a, b) => a.label.localeCompare(b.label));\n return list;\n}\n\nfunction resolveExecApprovalsNodes(nodes: Array<Record<string, unknown>>): ExecApprovalsTargetNode[] {\n const list: ExecApprovalsTargetNode[] = [];\n for (const node of nodes) {\n const commands = Array.isArray(node.commands) ? node.commands : [];\n const supports = commands.some(\n (cmd) => String(cmd) === \"system.execApprovals.get\" || String(cmd) === \"system.execApprovals.set\",\n );\n if (!supports) continue;\n const nodeId = typeof node.nodeId === \"string\" ? node.nodeId.trim() : \"\";\n if (!nodeId) continue;\n const displayName =\n typeof node.displayName === \"string\" && node.displayName.trim()\n ? node.displayName.trim()\n : nodeId;\n list.push({ id: nodeId, label: displayName === nodeId ? nodeId : `${displayName} · ${nodeId}` });\n }\n list.sort((a, b) => a.label.localeCompare(b.label));\n return list;\n}\n\nfunction resolveAgentBindings(config: Record<string, unknown> | null): {\n defaultBinding?: string | null;\n agents: BindingAgent[];\n} {\n const fallbackAgent: BindingAgent = {\n id: \"main\",\n name: undefined,\n index: 0,\n isDefault: true,\n binding: null,\n };\n if (!config || typeof config !== \"object\") {\n return { defaultBinding: null, agents: [fallbackAgent] };\n }\n const tools = (config.tools ?? {}) as Record<string, unknown>;\n const exec = (tools.exec ?? {}) as Record<string, unknown>;\n const defaultBinding =\n typeof exec.node === \"string\" && exec.node.trim() ? exec.node.trim() : null;\n\n const agentsNode = (config.agents ?? {}) as Record<string, unknown>;\n const list = Array.isArray(agentsNode.list) ? agentsNode.list : [];\n if (list.length === 0) {\n return { defaultBinding, agents: [fallbackAgent] };\n }\n\n const agents: BindingAgent[] = [];\n list.forEach((entry, index) => {\n if (!entry || typeof entry !== \"object\") return;\n const record = entry as Record<string, unknown>;\n const id = typeof record.id === \"string\" ? record.id.trim() : \"\";\n if (!id) return;\n const name = typeof record.name === \"string\" ? record.name.trim() : undefined;\n const isDefault = record.default === true;\n const toolsEntry = (record.tools ?? {}) as Record<string, unknown>;\n const execEntry = (toolsEntry.exec ?? {}) as Record<string, unknown>;\n const binding =\n typeof execEntry.node === \"string\" && execEntry.node.trim()\n ? execEntry.node.trim()\n : null;\n agents.push({\n id,\n name: name || undefined,\n index,\n isDefault,\n binding,\n });\n });\n\n if (agents.length === 0) {\n agents.push(fallbackAgent);\n }\n\n return { defaultBinding, agents };\n}\n\nfunction renderNode(node: Record<string, unknown>) {\n const connected = Boolean(node.connected);\n const paired = Boolean(node.paired);\n const title =\n (typeof node.displayName === \"string\" && node.displayName.trim()) ||\n (typeof node.nodeId === \"string\" ? node.nodeId : \"unknown\");\n const caps = Array.isArray(node.caps) ? (node.caps as unknown[]) : [];\n const commands = Array.isArray(node.commands) ? (node.commands as unknown[]) : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${title}</div>\n <div class=\"list-sub\">\n ${typeof node.nodeId === \"string\" ? node.nodeId : \"\"}\n ${typeof node.remoteIp === \"string\" ? ` · ${node.remoteIp}` : \"\"}\n ${typeof node.version === \"string\" ? ` · ${node.version}` : \"\"}\n </div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${paired ? \"paired\" : \"unpaired\"}</span>\n <span class=\"chip ${connected ? \"chip-ok\" : \"chip-warn\"}\">\n ${connected ? \"connected\" : \"offline\"}\n </span>\n ${caps.slice(0, 12).map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n ${commands\n .slice(0, 8)\n .map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n </div>\n </div>\n </div>\n `;\n}\n","import { html } from \"lit\";\n\nimport type { GatewayHelloOk } from \"../gateway\";\nimport { formatAgo, formatDurationMs } from \"../format\";\nimport { formatNextRun } from \"../presenter\";\nimport type { UiSettings } from \"../storage\";\n\nexport type OverviewProps = {\n connected: boolean;\n hello: GatewayHelloOk | null;\n settings: UiSettings;\n password: string;\n lastError: string | null;\n presenceCount: number;\n sessionsCount: number | null;\n cronEnabled: boolean | null;\n cronNext: number | null;\n lastChannelsRefresh: number | null;\n onSettingsChange: (next: UiSettings) => void;\n onPasswordChange: (next: string) => void;\n onSessionKeyChange: (next: string) => void;\n onConnect: () => void;\n onRefresh: () => void;\n};\n\nexport function renderOverview(props: OverviewProps) {\n const snapshot = props.hello?.snapshot as\n | { uptimeMs?: number; policy?: { tickIntervalMs?: number } }\n | undefined;\n const uptime = snapshot?.uptimeMs ? formatDurationMs(snapshot.uptimeMs) : \"n/a\";\n const tick = snapshot?.policy?.tickIntervalMs\n ? `${snapshot.policy.tickIntervalMs}ms`\n : \"n/a\";\n const authHint = (() => {\n if (props.connected || !props.lastError) return null;\n const lower = props.lastError.toLowerCase();\n const authFailed = lower.includes(\"unauthorized\") || lower.includes(\"connect failed\");\n if (!authFailed) return null;\n const hasToken = Boolean(props.settings.token.trim());\n const hasPassword = Boolean(props.password.trim());\n if (!hasToken && !hasPassword) {\n return html`\n <div class=\"muted\" style=\"margin-top: 8px;\">\n 此网关需要身份验证。添加令牌或密码,然后点击连接。\n <div style=\"margin-top: 6px;\">\n <span class=\"mono\">openclaw dashboard --no-open</span> → tokenized URL<br />\n <span class=\"mono\">openclaw doctor --generate-gateway-token</span> → set token\n </div>\n <div style=\"margin-top: 6px;\">\n <a\n class=\"session-link\"\n href=\"https://docs.openclaw.ai/web/dashboard\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Control UI auth docs (opens in new tab)\"\n >Docs: Control UI auth</a\n >\n </div>\n </div>\n `;\n }\n return html`\n <div class=\"muted\" style=\"margin-top: 8px;\">\n Auth failed. Re-copy a tokenized URL with\n <span class=\"mono\">openclaw dashboard --no-open</span>, or update the token,\n then click Connect.\n <div style=\"margin-top: 6px;\">\n <a\n class=\"session-link\"\n href=\"https://docs.openclaw.ai/web/dashboard\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Control UI auth docs (opens in new tab)\"\n >Docs: Control UI auth</a\n >\n </div>\n </div>\n `;\n })();\n const insecureContextHint = (() => {\n if (props.connected || !props.lastError) return null;\n const isSecureContext = typeof window !== \"undefined\" ? window.isSecureContext : true;\n if (isSecureContext !== false) return null;\n const lower = props.lastError.toLowerCase();\n if (!lower.includes(\"secure context\") && !lower.includes(\"device identity required\")) {\n return null;\n }\n return html`\n <div class=\"muted\" style=\"margin-top: 8px;\">\n This page is HTTP, so the browser blocks device identity. Use HTTPS (Tailscale Serve) or\n open <span class=\"mono\">http://127.0.0.1:18789</span> on the gateway host.\n <div style=\"margin-top: 6px;\">\n If you must stay on HTTP, set\n <span class=\"mono\">gateway.controlUi.allowInsecureAuth: true</span> (token-only).\n </div>\n <div style=\"margin-top: 6px;\">\n <a\n class=\"session-link\"\n href=\"https://docs.openclaw.ai/gateway/tailscale\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Tailscale Serve docs (opens in new tab)\"\n >Docs: Tailscale Serve</a\n >\n <span class=\"muted\"> · </span>\n <a\n class=\"session-link\"\n href=\"https://docs.openclaw.ai/web/control-ui#insecure-http\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"Insecure HTTP docs (opens in new tab)\"\n >Docs: Insecure HTTP</a\n >\n </div>\n </div>\n `;\n })();\n\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">网关访问</div>\n <div class=\"card-sub\">控制台连接地址和身份验证方式。</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>WebSocket 地址</span>\n <input\n .value=${props.settings.gatewayUrl}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, gatewayUrl: v });\n }}\n placeholder=\"ws://100.x.y.z:18789\"\n />\n </label>\n <label class=\"field\">\n <span>网关令牌</span>\n <input\n .value=${props.settings.token}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, token: v });\n }}\n placeholder=\"OPENCLAW_GATEWAY_TOKEN\"\n />\n </label>\n <label class=\"field\">\n <span>密码(不保存)</span>\n <input\n type=\"password\"\n .value=${props.password}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onPasswordChange(v);\n }}\n placeholder=\"系统或共享密码\"\n />\n </label>\n <label class=\"field\">\n <span>默认会话密钥</span>\n <input\n .value=${props.settings.sessionKey}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSessionKeyChange(v);\n }}\n />\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn\" @click=${() => props.onConnect()}>连接</button>\n <button class=\"btn\" @click=${() => props.onRefresh()}>刷新</button>\n <span class=\"muted\">点击连接按钮以应用连接更改。</span>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">快照</div>\n <div class=\"card-sub\">最新的网关握手信息。</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">状态</div>\n <div class=\"stat-value ${props.connected ? \"ok\" : \"warn\"}\">\n ${props.connected ? \"已连接\" : \"未连接\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">运行时间</div>\n <div class=\"stat-value\">${uptime}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">刷新间隔</div>\n <div class=\"stat-value\">${tick}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">最后渠道刷新</div>\n <div class=\"stat-value\">\n ${props.lastChannelsRefresh\n ? formatAgo(props.lastChannelsRefresh)\n : \"n/a\"}\n </div>\n </div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 14px;\">\n <div>${props.lastError}</div>\n ${authHint ?? \"\"}\n ${insecureContextHint ?? \"\"}\n </div>`\n : html`<div class=\"callout\" style=\"margin-top: 14px;\">\n 使用渠道功能连接 WhatsApp、Telegram、Discord、Signal 或 iMessage。\n </div>`}\n </div>\n </section>\n\n <section class=\"grid grid-cols-3\" style=\"margin-top: 18px;\">\n <div class=\"card stat-card\">\n <div class=\"stat-label\">实例</div>\n <div class=\"stat-value\">${props.presenceCount}</div>\n <div class=\"muted\">最近 5 分钟内的存在信标。</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">会话</div>\n <div class=\"stat-value\">${props.sessionsCount ?? \"n/a\"}</div>\n <div class=\"muted\">网关跟踪的最近会话密钥。</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">定时任务</div>\n <div class=\"stat-value\">\n ${props.cronEnabled == null\n ? \"n/a\"\n : props.cronEnabled\n ? \"已启用\"\n : \"已禁用\"}\n </div>\n <div class=\"muted\">下次唤醒 ${formatNextRun(props.cronNext)}</div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">备注</div>\n <div class=\"card-sub\">远程控制设置的快速提醒。</div>\n <div class=\"note-grid\" style=\"margin-top: 14px;\">\n <div>\n <div class=\"note-title\">Tailscale 服务</div>\n <div class=\"muted\">\n 建议使用服务模式,通过 tailnet 身份验证将网关保持在本地回环。\n </div>\n </div>\n <div>\n <div class=\"note-title\">会话管理</div>\n <div class=\"muted\">使用 /new 或 sessions.patch 重置上下文。</div>\n </div>\n <div>\n <div class=\"note-title\">定时任务提醒</div>\n <div class=\"muted\">为定期运行使用隔离会话。</div>\n </div>\n </div>\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport { formatSessionTokens } from \"../presenter\";\nimport { pathForTab } from \"../navigation\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n basePath: string;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n },\n ) => void;\n on删除: (key: string) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\"] as const;\nconst BINARY_THINK_LEVELS = [\"\", \"off\", \"on\"] as const;\nconst VERBOSE_LEVELS = [\n { value: \"\", label: \"继承\" },\n { value: \"off\", label: \"关闭(显式)\" },\n { value: \"on\", label: \"开启\" },\n] as const;\nconst REASONING_LEVELS = [\"\", \"off\", \"on\", \"stream\"] as const;\n\nfunction normalizeProviderId(provider?: string | null): string {\n if (!provider) return \"\";\n const normalized = provider.trim().toLowerCase();\n if (normalized === \"z.ai\" || normalized === \"z-ai\") return \"zai\";\n return normalized;\n}\n\nfunction isBinaryThinkingProvider(provider?: string | null): boolean {\n return normalizeProviderId(provider) === \"zai\";\n}\n\nfunction resolveThinkLevelOptions(provider?: string | null): readonly string[] {\n return isBinaryThinkingProvider(provider) ? BINARY_THINK_LEVELS : THINK_LEVELS;\n}\n\nfunction resolveThinkLevelDisplay(value: string, isBinary: boolean): string {\n if (!isBinary) return value;\n if (!value || value === \"off\") return value;\n return \"on\";\n}\n\nfunction resolveThinkLevelPatchValue(value: string, isBinary: boolean): string | null {\n if (!value) return null;\n if (!isBinary) return value;\n if (value === \"on\") return \"low\";\n return value;\n}\n\nexport function renderSessions(props: SessionsProps) {\n const rows = props.result?.sessions ?? [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">会话</div>\n <div class=\"card-sub\">活动会话密钥和单会话设置覆盖。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"加载中…\" : \"刷新\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\">\n <span>活动时间(分钟)</span>\n <input\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field\">\n <span>限制</span>\n <input\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>包含全局</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>包含未知</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"muted\" style=\"margin-top: 12px;\">\n ${props.result ? `存储路径:${props.result.path}` : \"\"}\n </div>\n\n <div class=\"table\" style=\"margin-top: 16px;\">\n <div class=\"table-head\">\n <div>密钥</div>\n <div>标签</div>\n <div>类型</div>\n <div>更新时间</div>\n <div>令牌数</div>\n <div>思考</div>\n <div>详细</div>\n <div>推理</div>\n <div>操作</div>\n </div>\n ${rows.length === 0\n ? html`<div class=\"muted\">未找到会话。</div>`\n : rows.map((row) =>\n renderRow(row, props.basePath, props.onPatch, props.on删除, props.loading),\n )}\n </div>\n </section>\n `;\n}\n\nfunction renderRow(\n row: GatewaySessionRow,\n basePath: string,\n onPatch: SessionsProps[\"onPatch\"],\n on删除: SessionsProps[\"on删除\"],\n disabled: boolean,\n) {\n const updated = row.updatedAt ? formatAgo(row.updatedAt) : \"n/a\";\n const rawThinking = row.thinkingLevel ?? \"\";\n const isBinaryThinking = isBinaryThinkingProvider(row.modelProvider);\n const thinking = resolveThinkLevelDisplay(rawThinking, isBinaryThinking);\n const thinkLevels = resolveThinkLevelOptions(row.modelProvider);\n const verbose = row.verboseLevel ?? \"\";\n const reasoning = row.reasoningLevel ?? \"\";\n const displayName = row.displayName ?? row.key;\n const canLink = row.kind !== \"global\";\n const chatUrl = canLink\n ? `${pathForTab(\"chat\", basePath)}?session=${encodeURIComponent(row.key)}`\n : null;\n\n return html`\n <div class=\"table-row\">\n <div class=\"mono\">${canLink\n ? html`<a href=${chatUrl} class=\"session-link\">${displayName}</a>`\n : displayName}</div>\n <div>\n <input\n .value=${row.label ?? \"\"}\n ?disabled=${disabled}\n placeholder=\"(可选)\"\n @change=${(e: Event) => {\n const value = (e.target as HTMLInputElement).value.trim();\n onPatch(row.key, { label: value || null });\n }}\n />\n </div>\n <div>${row.kind}</div>\n <div>${updated}</div>\n <div>${formatSessionTokens(row)}</div>\n <div>\n <select\n .value=${thinking}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, {\n thinkingLevel: resolveThinkLevelPatchValue(value, isBinaryThinking),\n });\n }}\n >\n ${thinkLevels.map((level) =>\n html`<option value=${level}>${level || \"继承\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${verbose}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${VERBOSE_LEVELS.map(\n (level) => html`<option value=${level.value}>${level.label}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${reasoning}\n ?disabled=${disabled}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { reasoningLevel: value || null });\n }}\n >\n ${REASONING_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"继承\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <button class=\"btn danger\" ?disabled=${disabled} @click=${() => on删除(row.key)}>\n 删除\n </button>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { AppViewState } from \"../app-view-state\";\n\nfunction formatRemaining(ms: number): string {\n const remaining = Math.max(0, ms);\n const totalSeconds = Math.floor(remaining / 1000);\n if (totalSeconds < 60) return `${totalSeconds}s`;\n const minutes = Math.floor(totalSeconds / 60);\n if (minutes < 60) return `${minutes}m`;\n const hours = Math.floor(minutes / 60);\n return `${hours}h`;\n}\n\nfunction renderMetaRow(label: string, value?: string | null) {\n if (!value) return nothing;\n return html`<div class=\"exec-approval-meta-row\"><span>${label}</span><span>${value}</span></div>`;\n}\n\nexport function renderExecApprovalPrompt(state: AppViewState) {\n const active = state.execApprovalQueue[0];\n if (!active) return nothing;\n const request = active.request;\n const remainingMs = active.expiresAtMs - Date.now();\n const remaining = remainingMs > 0 ? `expires in ${formatRemaining(remainingMs)}` : \"expired\";\n const queueCount = state.execApprovalQueue.length;\n return html`\n <div class=\"exec-approval-overlay\" role=\"dialog\" aria-live=\"polite\">\n <div class=\"exec-approval-card\">\n <div class=\"exec-approval-header\">\n <div>\n <div class=\"exec-approval-title\">Exec approval needed</div>\n <div class=\"exec-approval-sub\">${remaining}</div>\n </div>\n ${queueCount > 1\n ? html`<div class=\"exec-approval-queue\">${queueCount} pending</div>`\n : nothing}\n </div>\n <div class=\"exec-approval-command mono\">${request.command}</div>\n <div class=\"exec-approval-meta\">\n ${renderMetaRow(\"Host\", request.host)}\n ${renderMetaRow(\"Agent\", request.agentId)}\n ${renderMetaRow(\"Session\", request.sessionKey)}\n ${renderMetaRow(\"CWD\", request.cwd)}\n ${renderMetaRow(\"Resolved\", request.resolvedPath)}\n ${renderMetaRow(\"Security\", request.security)}\n ${renderMetaRow(\"Ask\", request.ask)}\n </div>\n ${state.execApprovalError\n ? html`<div class=\"exec-approval-error\">${state.execApprovalError}</div>`\n : nothing}\n <div class=\"exec-approval-actions\">\n <button\n class=\"btn primary\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"allow-once\")}\n >\n Allow once\n </button>\n <button\n class=\"btn\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"allow-always\")}\n >\n Always allow\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${state.execApprovalBusy}\n @click=${() => state.handleExecApprovalDecision(\"deny\")}\n >\n Deny\n </button>\n </div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { AppViewState } from \"../app-view-state\";\n\nexport function renderGatewayUrlConfirmation(state: AppViewState) {\n const { pendingGatewayUrl } = state;\n if (!pendingGatewayUrl) return nothing;\n\n return html`\n <div class=\"exec-approval-overlay\" role=\"dialog\" aria-modal=\"true\" aria-live=\"polite\">\n <div class=\"exec-approval-card\">\n <div class=\"exec-approval-header\">\n <div>\n <div class=\"exec-approval-title\">Change Gateway URL</div>\n <div class=\"exec-approval-sub\">This will reconnect to a different gateway server</div>\n </div>\n </div>\n <div class=\"exec-approval-command mono\">${pendingGatewayUrl}</div>\n <div class=\"callout danger\" style=\"margin-top: 12px;\">\n Only confirm if you trust this URL. Malicious URLs can compromise your system.\n </div>\n <div class=\"exec-approval-actions\">\n <button\n class=\"btn primary\"\n @click=${() => state.handleGatewayUrlConfirm()}\n >\n Confirm\n </button>\n <button\n class=\"btn\"\n @click=${() => state.handleGatewayUrlCancel()}\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText } from \"../format\";\nimport type { SkillStatusEntry, SkillStatusReport } from \"../types\";\nimport type { SkillMessageMap } from \"../controllers/skills\";\n\nexport type SkillsProps = {\n loading: boolean;\n report: SkillStatusReport | null;\n error: string | null;\n filter: string;\n edits: Record<string, string>;\n busyKey: string | null;\n messages: SkillMessageMap;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (skillKey: string, enabled: boolean) => void;\n onEdit: (skillKey: string, value: string) => void;\n onSaveKey: (skillKey: string) => void;\n onInstall: (skillKey: string, name: string, installId: string) => void;\n};\n\nexport function renderSkills(props: SkillsProps) {\n const skills = props.report?.skills ?? [];\n const filter = props.filter.trim().toLowerCase();\n const filtered = filter\n ? skills.filter((skill) =>\n [skill.name, skill.description, skill.source]\n .join(\" \")\n .toLowerCase()\n .includes(filter),\n )\n : skills;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">技能</div>\n <div class=\"card-sub\">内置、托管和工作区技能。</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"加载中…\" : \"刷新\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>筛选</span>\n <input\n .value=${props.filter}\n @input=${(e: Event) =>\n props.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"搜索技能\"\n />\n </label>\n <div class=\"muted\">显示 ${filtered.length} 项</div>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 16px;\">未找到技能。</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${filtered.map((skill) => renderSkill(skill, props))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderSkill(skill: SkillStatusEntry, props: SkillsProps) {\n const busy = props.busyKey === skill.skillKey;\n const apiKey = props.edits[skill.skillKey] ?? \"\";\n const message = props.messages[skill.skillKey] ?? null;\n const canInstall =\n skill.install.length > 0 && skill.missing.bins.length > 0;\n const missing = [\n ...skill.missing.bins.map((b) => `bin:${b}`),\n ...skill.missing.env.map((e) => `env:${e}`),\n ...skill.missing.config.map((c) => `config:${c}`),\n ...skill.missing.os.map((o) => `os:${o}`),\n ];\n const reasons: string[] = [];\n if (skill.disabled) reasons.push(\"已禁用\");\n if (skill.blockedByAllowlist) reasons.push(\"被白名单阻止\");\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n ${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}\n </div>\n <div class=\"list-sub\">${clampText(skill.description, 140)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${skill.source}</span>\n <span class=\"chip ${skill.eligible ? \"chip-ok\" : \"chip-warn\"}\">\n ${skill.eligible ? \"可用\" : \"已阻止\"}\n </span>\n ${skill.disabled ? html`<span class=\"chip chip-warn\">已禁用</span>` : nothing}\n </div>\n ${missing.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n 缺少:${missing.join(\", \")}\n </div>\n `\n : nothing}\n ${reasons.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n 原因:${reasons.join(\", \")}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; flex-wrap: wrap;\">\n <button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onToggle(skill.skillKey, skill.disabled)}\n >\n ${skill.disabled ? \"启用\" : \"禁用\"}\n </button>\n ${canInstall\n ? html`<button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() =>\n props.onInstall(skill.skillKey, skill.name, skill.install[0].id)}\n >\n ${busy ? \"安装中…\" : skill.install[0].label}\n </button>`\n : nothing}\n </div>\n ${message\n ? html`<div\n class=\"muted\"\n style=\"margin-top: 8px; color: ${\n message.kind === \"error\"\n ? \"var(--danger-color, #d14343)\"\n : \"var(--success-color, #0a7f5a)\"\n };\"\n >\n ${message.message}\n </div>`\n : nothing}\n ${skill.primaryEnv\n ? html`\n <div class=\"field\" style=\"margin-top: 10px;\">\n <span>API 密钥</span>\n <input\n type=\"password\"\n .value=${apiKey}\n @input=${(e: Event) =>\n props.onEdit(skill.skillKey, (e.target as HTMLInputElement).value)}\n />\n </div>\n <button\n class=\"btn primary\"\n style=\"margin-top: 8px;\"\n ?disabled=${busy}\n @click=${() => props.onSaveKey(skill.skillKey)}\n >\n 保存密钥\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","import { html } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\n\nimport type { AppViewState } from \"./app-view-state\";\nimport { iconForTab, pathForTab, titleForTab, type Tab } from \"./navigation\";\nimport { icons } from \"./icons\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport { refreshChat } from \"./app-chat\";\nimport { syncUrlWithSessionKey } from \"./app-settings\";\nimport type { SessionsListResult } from \"./types\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\n\nexport function renderTab(state: AppViewState, tab: Tab) {\n const href = pathForTab(tab, state.basePath);\n return html`\n <a\n href=${href}\n class=\"nav-item ${state.tab === tab ? \"active\" : \"\"}\"\n @click=${(event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n event.preventDefault();\n state.setTab(tab);\n }}\n title=${titleForTab(tab)}\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons[iconForTab(tab)]}</span>\n <span class=\"nav-item__text\">${titleForTab(tab)}</span>\n </a>\n `;\n}\n\nexport function renderChatControls(state: AppViewState) {\n const mainSessionKey = resolveMainSessionKey(state.hello, state.sessionsResult);\n const sessionOptions = resolveSessionOptions(\n state.sessionKey,\n state.sessionsResult,\n mainSessionKey,\n );\n const disableThinkingToggle = state.onboarding;\n const disableFocusToggle = state.onboarding;\n const showThinking = state.onboarding ? false : state.settings.chatShowThinking;\n const focusActive = state.onboarding ? true : state.settings.chatFocusMode;\n // Refresh icon\n const refreshIcon = html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"></path><path d=\"M21 3v5h-5\"></path></svg>`;\n const focusIcon = html`<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7V4h3\"></path><path d=\"M20 7V4h-3\"></path><path d=\"M4 17v3h3\"></path><path d=\"M20 17v3h-3\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>`;\n return html`\n <div class=\"chat-controls\">\n <label class=\"field chat-controls__session\">\n <select\n .value=${state.sessionKey}\n ?disabled=${!state.connected}\n @change=${(e: Event) => {\n const next = (e.target as HTMLSelectElement).value;\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.chatRunId = null;\n state.resetToolStream();\n state.resetChatScroll();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n syncUrlWithSessionKey(state, next, true);\n void loadChatHistory(state);\n }}\n >\n ${repeat(\n sessionOptions,\n (entry) => entry.key,\n (entry) =>\n html`<option value=${entry.key}>\n ${entry.displayName ?? entry.key}\n </option>`,\n )}\n </select>\n </label>\n <button\n class=\"btn btn--sm btn--icon\"\n ?disabled=${state.chatLoading || !state.connected}\n @click=${() => {\n state.resetToolStream();\n void refreshChat(state as unknown as Parameters<typeof refreshChat>[0]);\n }}\n title=\"刷新对话数据\"\n >\n ${refreshIcon}\n </button>\n <span class=\"chat-controls__separator\">|</span>\n <button\n class=\"btn btn--sm btn--icon ${showThinking ? \"active\" : \"\"}\"\n ?disabled=${disableThinkingToggle}\n @click=${() => {\n if (disableThinkingToggle) return;\n state.applySettings({\n ...state.settings,\n chatShowThinking: !state.settings.chatShowThinking,\n });\n }}\n aria-pressed=${showThinking}\n title=${disableThinkingToggle\n ? \"初始化期间禁用\"\n : \"切换助手思考/工作输出\"}\n >\n ${icons.brain}\n </button>\n <button\n class=\"btn btn--sm btn--icon ${focusActive ? \"active\" : \"\"}\"\n ?disabled=${disableFocusToggle}\n @click=${() => {\n if (disableFocusToggle) return;\n state.applySettings({\n ...state.settings,\n chatFocusMode: !state.settings.chatFocusMode,\n });\n }}\n aria-pressed=${focusActive}\n title=${disableFocusToggle\n ? \"初始化期间禁用\"\n : \"切换专注模式(隐藏侧栏和页头)\"}\n >\n ${focusIcon}\n </button>\n </div>\n `;\n}\n\ntype SessionDefaultsSnapshot = {\n mainSessionKey?: string;\n mainKey?: string;\n};\n\nfunction resolveMainSessionKey(\n hello: AppViewState[\"hello\"],\n sessions: SessionsListResult | null,\n): string | null {\n const snapshot = hello?.snapshot as { sessionDefaults?: SessionDefaultsSnapshot } | undefined;\n const mainSessionKey = snapshot?.sessionDefaults?.mainSessionKey?.trim();\n if (mainSessionKey) return mainSessionKey;\n const mainKey = snapshot?.sessionDefaults?.mainKey?.trim();\n if (mainKey) return mainKey;\n if (sessions?.sessions?.some((row) => row.key === \"main\")) return \"main\";\n return null;\n}\n\nfunction resolveSessionOptions(\n sessionKey: string,\n sessions: SessionsListResult | null,\n mainSessionKey?: string | null,\n) {\n const seen = new Set<string>();\n const options: Array<{ key: string; displayName?: string }> = [];\n\n const resolvedMain =\n mainSessionKey && sessions?.sessions?.find((s) => s.key === mainSessionKey);\n const resolvedCurrent = sessions?.sessions?.find((s) => s.key === sessionKey);\n\n // Add main session key first\n if (mainSessionKey) {\n seen.add(mainSessionKey);\n options.push({ key: mainSessionKey, displayName: resolvedMain?.displayName });\n }\n\n // Add current session key next\n if (!seen.has(sessionKey)) {\n seen.add(sessionKey);\n options.push({ key: sessionKey, displayName: resolvedCurrent?.displayName });\n }\n\n // Add sessions from the result\n if (sessions?.sessions) {\n for (const s of sessions.sessions) {\n if (!seen.has(s.key)) {\n seen.add(s.key);\n options.push({ key: s.key, displayName: s.displayName });\n }\n }\n }\n\n return options;\n}\n\nconst THEME_ORDER: ThemeMode[] = [\"system\", \"light\", \"dark\"];\n\nexport function renderThemeToggle(state: AppViewState) {\n const index = Math.max(0, THEME_ORDER.indexOf(state.theme));\n const applyTheme = (next: ThemeMode) => (event: MouseEvent) => {\n const element = event.currentTarget as HTMLElement;\n const context: ThemeTransitionContext = { element };\n if (event.clientX || event.clientY) {\n context.pointerClientX = event.clientX;\n context.pointerClientY = event.clientY;\n }\n state.setTheme(next, context);\n };\n\n return html`\n <div class=\"theme-toggle\" style=\"--theme-index: ${index};\">\n <div class=\"theme-toggle__track\" role=\"group\" aria-label=\"主题\">\n <span class=\"theme-toggle__indicator\"></span>\n <button\n class=\"theme-toggle__button ${state.theme === \"system\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"system\")}\n aria-pressed=${state.theme === \"system\"}\n aria-label=\"系统主题\"\n title=\"系统\"\n >\n ${renderMonitorIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"light\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"light\")}\n aria-pressed=${state.theme === \"light\"}\n aria-label=\"浅色主题\"\n title=\"浅色\"\n >\n ${renderSunIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"dark\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"dark\")}\n aria-pressed=${state.theme === \"dark\"}\n aria-label=\"深色主题\"\n title=\"深色\"\n >\n ${renderMoonIcon()}\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderSunIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\n <path d=\"M12 2v2\"></path>\n <path d=\"M12 20v2\"></path>\n <path d=\"m4.93 4.93 1.41 1.41\"></path>\n <path d=\"m17.66 17.66 1.41 1.41\"></path>\n <path d=\"M2 12h2\"></path>\n <path d=\"M20 12h2\"></path>\n <path d=\"m6.34 17.66-1.41 1.41\"></path>\n <path d=\"m19.07 4.93-1.41 1.41\"></path>\n </svg>\n `;\n}\n\nfunction renderMoonIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n 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\"\n ></path>\n </svg>\n `;\n}\n\nfunction renderMonitorIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"></rect>\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"></line>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"></line>\n </svg>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport type { AppViewState } from \"./app-view-state\";\nimport { parseAgentSessionKey } from \"../../../src/routing/session-key.js\";\nimport {\n TAB_GROUPS,\n iconForTab,\n pathForTab,\n subtitleForTab,\n titleForTab,\n type Tab,\n} from \"./navigation\";\nimport { icons } from \"./icons\";\nimport type { UiSettings } from \"./storage\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport type { ChatQueueItem, CronFormState } from \"./ui-types\";\nimport { refreshChatAvatar } from \"./app-chat\";\nimport { renderChat } from \"./views/chat\";\nimport { renderConfig } from \"./views/config\";\nimport { renderChannels } from \"./views/channels\";\nimport { renderCron } from \"./views/cron\";\nimport { renderDebug } from \"./views/debug\";\nimport { renderInstances } from \"./views/instances\";\nimport { renderLogs } from \"./views/logs\";\nimport { renderNodes } from \"./views/nodes\";\nimport { renderOverview } from \"./views/overview\";\nimport { renderSessions } from \"./views/sessions\";\nimport { renderExecApprovalPrompt } from \"./views/exec-approval\";\nimport { renderGatewayUrlConfirmation } from \"./views/gateway-url-confirmation\";\nimport {\n approveDevicePairing,\n loadDevices,\n rejectDevicePairing,\n revokeDeviceToken,\n rotateDeviceToken,\n} from \"./controllers/devices\";\nimport { renderSkills } from \"./views/skills\";\nimport { renderChatControls, renderTab, renderThemeToggle } from \"./app-render.helpers\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { deleteSession, loadSessions, patchSession } from \"./controllers/sessions\";\nimport {\n installSkill,\n loadSkills,\n saveSkillApiKey,\n updateSkillEdit,\n updateSkillEnabled,\n type SkillMessage,\n} from \"./controllers/skills\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport {\n applyConfig,\n loadConfig,\n runUpdate,\n saveConfig,\n updateConfigFormValue,\n removeConfigFormValue,\n} from \"./controllers/config\";\nimport {\n loadExecApprovals,\n removeExecApprovalsFormValue,\n saveExecApprovals,\n updateExecApprovalsFormValue,\n} from \"./controllers/exec-approvals\";\nimport { loadCronRuns, toggleCronJob, runCronJob, removeCronJob, addCronJob } from \"./controllers/cron\";\nimport { loadDebug, callDebugMethod } from \"./controllers/debug\";\nimport { loadLogs } from \"./controllers/logs\";\n\nconst AVATAR_DATA_RE = /^data:/i;\nconst AVATAR_HTTP_RE = /^https?:\\/\\//i;\n\nfunction resolveAssistantAvatarUrl(state: AppViewState): string | undefined {\n const list = state.agentsList?.agents ?? [];\n const parsed = parseAgentSessionKey(state.sessionKey);\n const agentId =\n parsed?.agentId ??\n state.agentsList?.defaultId ??\n \"main\";\n const agent = list.find((entry) => entry.id === agentId);\n const identity = agent?.identity;\n const candidate = identity?.avatarUrl ?? identity?.avatar;\n if (!candidate) return undefined;\n if (AVATAR_DATA_RE.test(candidate) || AVATAR_HTTP_RE.test(candidate)) return candidate;\n return identity?.avatarUrl;\n}\n\nexport function renderApp(state: AppViewState) {\n const presenceCount = state.presenceEntries.length;\n const sessionsCount = state.sessionsResult?.count ?? null;\n const cronNext = state.cronStatus?.nextWakeAtMs ?? null;\n const chatDisabledReason = state.connected ? null : \"已断开网关连接。\";\n const isChat = state.tab === \"chat\";\n const chatFocus = isChat && (state.settings.chatFocusMode || state.onboarding);\n const showThinking = state.onboarding ? false : state.settings.chatShowThinking;\n const assistantAvatarUrl = resolveAssistantAvatarUrl(state);\n const chatAvatarUrl = state.chatAvatarUrl ?? assistantAvatarUrl ?? null;\n\n return html`\n <div class=\"shell ${isChat ? \"shell--chat\" : \"\"} ${chatFocus ? \"shell--chat-focus\" : \"\"} ${state.settings.navCollapsed ? \"shell--nav-collapsed\" : \"\"} ${state.onboarding ? \"shell--onboarding\" : \"\"}\">\n <header class=\"topbar\">\n <div class=\"topbar-left\">\n <button\n class=\"nav-collapse-toggle\"\n @click=${() =>\n state.applySettings({\n ...state.settings,\n navCollapsed: !state.settings.navCollapsed,\n })}\n title=\"${state.settings.navCollapsed ? \"展开侧栏\" : \"收起侧栏\"}\"\n aria-label=\"${state.settings.navCollapsed ? \"展开侧栏\" : \"收起侧栏\"}\"\n >\n <span class=\"nav-collapse-toggle__icon\">${icons.menu}</span>\n </button>\n <a class=\"brand\" href=\"https://openclaw.qt.cool\" target=\"_blank\" rel=\"noreferrer\" title=\"访问 OpenClaw 汉化官网\" style=\"text-decoration: none; color: inherit;\">\n <div class=\"brand-logo\">\n <img src=\"https://mintcdn.com/clawdhub/4rYvG-uuZrMK_URE/assets/pixel-lobster.svg?fit=max&auto=format&n=4rYvG-uuZrMK_URE&q=85&s=da2032e9eac3b5d9bfe7eb96ca6a8a26\" alt=\"OpenClaw\" />\n </div>\n <div class=\"brand-text\">\n <div class=\"brand-title\">OPENCLAW 中文版</div>\n <div class=\"brand-sub\">网关控制台 · 点击访问官网</div>\n </div>\n </a>\n </div>\n <div class=\"topbar-status\">\n <div class=\"pill\">\n <span class=\"statusDot ${state.connected ? \"ok\" : \"\"}\"></span>\n <span>健康状态</span>\n <span class=\"mono\">${state.connected ? \"正常\" : \"离线\"}</span>\n </div>\n ${renderThemeToggle(state)}\n </div>\n </header>\n <aside class=\"nav ${state.settings.navCollapsed ? \"nav--collapsed\" : \"\"}\">\n ${TAB_GROUPS.map((group) => {\n const isGroupCollapsed = state.settings.navGroupsCollapsed[group.label] ?? false;\n const hasActiveTab = group.tabs.some((tab) => tab === state.tab);\n return html`\n <div class=\"nav-group ${isGroupCollapsed && !hasActiveTab ? \"nav-group--collapsed\" : \"\"}\">\n <button\n class=\"nav-label\"\n @click=${() => {\n const next = { ...state.settings.navGroupsCollapsed };\n next[group.label] = !isGroupCollapsed;\n state.applySettings({\n ...state.settings,\n navGroupsCollapsed: next,\n });\n }}\n aria-expanded=${!isGroupCollapsed}\n >\n <span class=\"nav-label__text\">${group.label}</span>\n <span class=\"nav-label__chevron\">${isGroupCollapsed ? \"+\" : \"−\"}</span>\n </button>\n <div class=\"nav-group__items\">\n ${group.tabs.map((tab) => renderTab(state, tab))}\n </div>\n </div>\n `;\n })}\n <div class=\"nav-group nav-group--links\">\n <div class=\"nav-label nav-label--static\">\n <span class=\"nav-label__text\">资源</span>\n </div>\n <div class=\"nav-group__items\">\n <a\n class=\"nav-item nav-item--external\"\n href=\"https://docs.openclaw.ai\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"文档(新标签页打开)\"\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons.book}</span>\n <span class=\"nav-item__text\">文档</span>\n </a>\n </div>\n <a\n class=\"nav-item nav-item--external\"\n href=\"https://openclaw.qt.cool\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"汉化官网(新标签页打开)\"\n style=\"color: #ef4444;\"\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons.globe}</span>\n <span class=\"nav-item__text\">🇨🇳 汉化官网</span>\n </a>\n <a\n class=\"nav-item nav-item--external\"\n href=\"https://github.com/1186258278/OpenClawChineseTranslation\"\n target=\"_blank\"\n rel=\"noreferrer\"\n title=\"GitHub 仓库(新标签页打开)\"\n >\n <span class=\"nav-item__icon\" aria-hidden=\"true\">${icons.link}</span>\n <span class=\"nav-item__text\">GitHub</span>\n </a>\n </div>\n </aside>\n <main class=\"content ${isChat ? \"content--chat\" : \"\"}\">\n <section class=\"content-header\">\n <div>\n <div class=\"page-title\">${titleForTab(state.tab)}</div>\n <div class=\"page-sub\">${subtitleForTab(state.tab)}</div>\n </div>\n <div class=\"page-meta\">\n ${state.lastError\n ? html`<div class=\"pill danger\">${state.lastError}</div>`\n : nothing}\n ${isChat ? renderChatControls(state) : nothing}\n </div>\n </section>\n\n ${state.tab === \"overview\"\n ? renderOverview({\n connected: state.connected,\n hello: state.hello,\n settings: state.settings,\n password: state.password,\n lastError: state.lastError,\n presenceCount,\n sessionsCount,\n cronEnabled: state.cronStatus?.enabled ?? null,\n cronNext,\n lastChannelsRefresh: state.channelsLastSuccess,\n onSettingsChange: (next) => state.applySettings(next),\n onPasswordChange: (next) => (state.password = next),\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.resetToolStream();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n },\n onConnect: () => state.connect(),\n onRefresh: () => state.loadOverview(),\n })\n : nothing}\n\n ${state.tab === \"channels\"\n ? renderChannels({\n connected: state.connected,\n loading: state.channelsLoading,\n snapshot: state.channelsSnapshot,\n lastError: state.channelsError,\n lastSuccessAt: state.channelsLastSuccess,\n whatsappMessage: state.whatsappLoginMessage,\n whatsappQrDataUrl: state.whatsappLoginQrDataUrl,\n whatsappConnected: state.whatsappLoginConnected,\n whatsappBusy: state.whatsappBusy,\n configSchema: state.configSchema,\n configSchemaLoading: state.configSchemaLoading,\n configForm: state.configForm,\n configUiHints: state.configUiHints,\n configSaving: state.configSaving,\n configFormDirty: state.configFormDirty,\n nostrProfileFormState: state.nostrProfileFormState,\n nostrProfileAccountId: state.nostrProfileAccountId,\n onRefresh: (probe) => loadChannels(state, probe),\n onWhatsAppStart: (force) => state.handleWhatsAppStart(force),\n onWhatsAppWait: () => state.handleWhatsAppWait(),\n onWhatsAppLogout: () => state.handleWhatsAppLogout(),\n onConfigPatch: (path, value) => updateConfigFormValue(state, path, value),\n onConfigSave: () => state.handleChannelConfigSave(),\n onConfigReload: () => state.handleChannelConfigReload(),\n onNostrProfileEdit: (accountId, profile) =>\n state.handleNostrProfileEdit(accountId, profile),\n onNostrProfileCancel: () => state.handleNostrProfileCancel(),\n onNostrProfileFieldChange: (field, value) =>\n state.handleNostrProfileFieldChange(field, value),\n onNostrProfileSave: () => state.handleNostrProfileSave(),\n onNostrProfileImport: () => state.handleNostrProfileImport(),\n onNostrProfileToggleAdvanced: () => state.handleNostrProfileToggleAdvanced(),\n })\n : nothing}\n\n ${state.tab === \"instances\"\n ? renderInstances({\n loading: state.presenceLoading,\n entries: state.presenceEntries,\n lastError: state.presenceError,\n statusMessage: state.presenceStatus,\n onRefresh: () => loadPresence(state),\n })\n : nothing}\n\n ${state.tab === \"sessions\"\n ? renderSessions({\n loading: state.sessionsLoading,\n result: state.sessionsResult,\n error: state.sessionsError,\n activeMinutes: state.sessionsFilterActive,\n limit: state.sessionsFilterLimit,\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n basePath: state.basePath,\n onFiltersChange: (next) => {\n state.sessionsFilterActive = next.activeMinutes;\n state.sessionsFilterLimit = next.limit;\n state.sessionsIncludeGlobal = next.includeGlobal;\n state.sessionsIncludeUnknown = next.includeUnknown;\n\t },\n\t onRefresh: () => loadSessions(state),\n\t onPatch: (key, patch) => patchSession(state, key, patch),\n\t onDelete: (key) => deleteSession(state, key),\n\t })\n\t : nothing}\n\n ${state.tab === \"cron\"\n ? renderCron({\n loading: state.cronLoading,\n status: state.cronStatus,\n jobs: state.cronJobs,\n error: state.cronError,\n busy: state.cronBusy,\n form: state.cronForm,\n channels: state.channelsSnapshot?.channelMeta?.length\n ? state.channelsSnapshot.channelMeta.map((entry) => entry.id)\n : state.channelsSnapshot?.channelOrder ?? [],\n channelLabels: state.channelsSnapshot?.channelLabels ?? {},\n channelMeta: state.channelsSnapshot?.channelMeta ?? [],\n runsJobId: state.cronRunsJobId,\n runs: state.cronRuns,\n onFormChange: (patch) => (state.cronForm = { ...state.cronForm, ...patch }),\n onRefresh: () => state.loadCron(),\n onAdd: () => addCronJob(state),\n onToggle: (job, enabled) => toggleCronJob(state, job, enabled),\n onRun: (job) => runCronJob(state, job),\n onRemove: (job) => removeCronJob(state, job),\n onLoadRuns: (jobId) => loadCronRuns(state, jobId),\n })\n : nothing}\n\n ${state.tab === \"skills\"\n ? renderSkills({\n loading: state.skillsLoading,\n report: state.skillsReport,\n error: state.skillsError,\n filter: state.skillsFilter,\n edits: state.skillEdits,\n messages: state.skillMessages,\n busyKey: state.skillsBusyKey,\n onFilterChange: (next) => (state.skillsFilter = next),\n onRefresh: () => loadSkills(state, { clearMessages: true }),\n onToggle: (key, enabled) => updateSkillEnabled(state, key, enabled),\n onEdit: (key, value) => updateSkillEdit(state, key, value),\n onSaveKey: (key) => saveSkillApiKey(state, key),\n onInstall: (skillKey, name, installId) =>\n installSkill(state, skillKey, name, installId),\n })\n : nothing}\n\n ${state.tab === \"nodes\"\n ? renderNodes({\n loading: state.nodesLoading,\n nodes: state.nodes,\n devicesLoading: state.devicesLoading,\n devicesError: state.devicesError,\n devicesList: state.devicesList,\n configForm: state.configForm ?? (state.configSnapshot?.config as Record<string, unknown> | null),\n configLoading: state.configLoading,\n configSaving: state.configSaving,\n configDirty: state.configFormDirty,\n configFormMode: state.configFormMode,\n execApprovalsLoading: state.execApprovalsLoading,\n execApprovalsSaving: state.execApprovalsSaving,\n execApprovalsDirty: state.execApprovalsDirty,\n execApprovalsSnapshot: state.execApprovalsSnapshot,\n execApprovalsForm: state.execApprovalsForm,\n execApprovalsSelectedAgent: state.execApprovalsSelectedAgent,\n execApprovalsTarget: state.execApprovalsTarget,\n execApprovalsTargetNodeId: state.execApprovalsTargetNodeId,\n onRefresh: () => loadNodes(state),\n onDevicesRefresh: () => loadDevices(state),\n onDeviceApprove: (requestId) => approveDevicePairing(state, requestId),\n onDeviceReject: (requestId) => rejectDevicePairing(state, requestId),\n onDeviceRotate: (deviceId, role, scopes) =>\n rotateDeviceToken(state, { deviceId, role, scopes }),\n onDeviceRevoke: (deviceId, role) =>\n revokeDeviceToken(state, { deviceId, role }),\n onLoadConfig: () => loadConfig(state),\n onLoadExecApprovals: () => {\n const target =\n state.execApprovalsTarget === \"node\" && state.execApprovalsTargetNodeId\n ? { kind: \"node\" as const, nodeId: state.execApprovalsTargetNodeId }\n : { kind: \"gateway\" as const };\n return loadExecApprovals(state, target);\n },\n onBindDefault: (nodeId) => {\n if (nodeId) {\n updateConfigFormValue(state, [\"tools\", \"exec\", \"node\"], nodeId);\n } else {\n removeConfigFormValue(state, [\"tools\", \"exec\", \"node\"]);\n }\n },\n onBindAgent: (agentIndex, nodeId) => {\n const basePath = [\"agents\", \"list\", agentIndex, \"tools\", \"exec\", \"node\"];\n if (nodeId) {\n updateConfigFormValue(state, basePath, nodeId);\n } else {\n removeConfigFormValue(state, basePath);\n }\n },\n onSaveBindings: () => saveConfig(state),\n onExecApprovalsTargetChange: (kind, nodeId) => {\n state.execApprovalsTarget = kind;\n state.execApprovalsTargetNodeId = nodeId;\n state.execApprovalsSnapshot = null;\n state.execApprovalsForm = null;\n state.execApprovalsDirty = false;\n state.execApprovalsSelectedAgent = null;\n },\n onExecApprovalsSelectAgent: (agentId) => {\n state.execApprovalsSelectedAgent = agentId;\n },\n onExecApprovalsPatch: (path, value) =>\n updateExecApprovalsFormValue(state, path, value),\n onExecApprovalsRemove: (path) =>\n removeExecApprovalsFormValue(state, path),\n onSaveExecApprovals: () => {\n const target =\n state.execApprovalsTarget === \"node\" && state.execApprovalsTargetNodeId\n ? { kind: \"node\" as const, nodeId: state.execApprovalsTargetNodeId }\n : { kind: \"gateway\" as const };\n return saveExecApprovals(state, target);\n },\n })\n : nothing}\n\n ${state.tab === \"chat\"\n ? renderChat({\n sessionKey: state.sessionKey,\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatAttachments = [];\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.chatRunId = null;\n state.chatQueue = [];\n state.resetToolStream();\n state.resetChatScroll();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n void loadChatHistory(state);\n void refreshChatAvatar(state);\n },\n thinkingLevel: state.chatThinkingLevel,\n showThinking,\n loading: state.chatLoading,\n sending: state.chatSending,\n compactionStatus: state.compactionStatus,\n assistantAvatarUrl: chatAvatarUrl,\n messages: state.chatMessages,\n toolMessages: state.chatToolMessages,\n stream: state.chatStream,\n streamStartedAt: state.chatStreamStartedAt,\n draft: state.chatMessage,\n queue: state.chatQueue,\n connected: state.connected,\n canSend: state.connected,\n disabledReason: chatDisabledReason,\n error: state.lastError,\n sessions: state.sessionsResult,\n focusMode: chatFocus,\n onRefresh: () => {\n state.resetToolStream();\n return Promise.all([loadChatHistory(state), refreshChatAvatar(state)]);\n },\n onToggleFocusMode: () => {\n if (state.onboarding) return;\n state.applySettings({\n ...state.settings,\n chatFocusMode: !state.settings.chatFocusMode,\n });\n },\n onChatScroll: (event) => state.handleChatScroll(event),\n onDraftChange: (next) => (state.chatMessage = next),\n attachments: state.chatAttachments,\n onAttachmentsChange: (next) => (state.chatAttachments = next),\n onSend: () => state.handleSendChat(),\n canAbort: Boolean(state.chatRunId),\n onAbort: () => void state.handleAbortChat(),\n onQueueRemove: (id) => state.removeQueuedMessage(id),\n onNewSession: () =>\n state.handleSendChat(\"/new\", { restoreDraft: true }),\n // Sidebar props for tool output viewing\n sidebarOpen: state.sidebarOpen,\n sidebarContent: state.sidebarContent,\n sidebarError: state.sidebarError,\n splitRatio: state.splitRatio,\n onOpenSidebar: (content: string) => state.handleOpenSidebar(content),\n onCloseSidebar: () => state.handleCloseSidebar(),\n onSplitRatioChange: (ratio: number) => state.handleSplitRatioChange(ratio),\n assistantName: state.assistantName,\n assistantAvatar: state.assistantAvatar,\n })\n : nothing}\n\n ${state.tab === \"config\"\n ? renderConfig({\n raw: state.configRaw,\n originalRaw: state.configRawOriginal,\n valid: state.configValid,\n issues: state.configIssues,\n loading: state.configLoading,\n saving: state.configSaving,\n applying: state.configApplying,\n updating: state.updateRunning,\n connected: state.connected,\n schema: state.configSchema,\n schemaLoading: state.configSchemaLoading,\n uiHints: state.configUiHints,\n formMode: state.configFormMode,\n formValue: state.configForm,\n originalValue: state.configFormOriginal,\n searchQuery: state.configSearchQuery,\n activeSection: state.configActiveSection,\n activeSubsection: state.configActiveSubsection,\n onRawChange: (next) => {\n state.configRaw = next;\n },\n onFormModeChange: (mode) => (state.configFormMode = mode),\n onFormPatch: (path, value) => updateConfigFormValue(state, path, value),\n onSearchChange: (query) => (state.configSearchQuery = query),\n onSectionChange: (section) => {\n state.configActiveSection = section;\n state.configActiveSubsection = null;\n },\n onSubsectionChange: (section) => (state.configActiveSubsection = section),\n onReload: () => loadConfig(state),\n onSave: () => saveConfig(state),\n onApply: () => applyConfig(state),\n onUpdate: () => runUpdate(state),\n })\n : nothing}\n\n ${state.tab === \"debug\"\n ? renderDebug({\n loading: state.debugLoading,\n status: state.debugStatus,\n health: state.debugHealth,\n models: state.debugModels,\n heartbeat: state.debugHeartbeat,\n eventLog: state.eventLog,\n callMethod: state.debugCallMethod,\n callParams: state.debugCallParams,\n callResult: state.debugCallResult,\n callError: state.debugCallError,\n onCallMethodChange: (next) => (state.debugCallMethod = next),\n onCallParamsChange: (next) => (state.debugCallParams = next),\n onRefresh: () => loadDebug(state),\n onCall: () => callDebugMethod(state),\n })\n : nothing}\n\n ${state.tab === \"logs\"\n ? renderLogs({\n loading: state.logsLoading,\n error: state.logsError,\n file: state.logsFile,\n entries: state.logsEntries,\n filterText: state.logsFilterText,\n levelFilters: state.logsLevelFilters,\n autoFollow: state.logsAutoFollow,\n truncated: state.logsTruncated,\n onFilterTextChange: (next) => (state.logsFilterText = next),\n onLevelToggle: (level, enabled) => {\n state.logsLevelFilters = { ...state.logsLevelFilters, [level]: enabled };\n },\n onToggleAutoFollow: (next) => (state.logsAutoFollow = next),\n onRefresh: () => loadLogs(state, { reset: true }),\n onExport: (lines, label) => state.exportLogs(lines, label),\n onScroll: (event) => state.handleLogsScroll(event),\n })\n : nothing}\n </main>\n ${renderExecApprovalPrompt(state)}\n ${renderGatewayUrlConfirmation(state)}\n </div>\n `;\n}\n","import type { LogLevel } from \"./types\";\nimport type { CronFormState } from \"./ui-types\";\n\nexport const DEFAULT_LOG_LEVEL_FILTERS: Record<LogLevel, boolean> = {\n trace: true,\n debug: true,\n info: true,\n warn: true,\n error: true,\n fatal: true,\n};\n\nexport const DEFAULT_CRON_FORM: CronFormState = {\n name: \"\",\n description: \"\",\n agentId: \"\",\n enabled: true,\n scheduleKind: \"every\",\n scheduleAt: \"\",\n everyAmount: \"30\",\n everyUnit: \"minutes\",\n cronExpr: \"0 7 * * *\",\n cronTz: \"\",\n sessionTarget: \"main\",\n wakeMode: \"next-heartbeat\",\n payloadKind: \"systemEvent\",\n payloadText: \"\",\n deliver: false,\n channel: \"last\",\n to: \"\",\n timeoutSeconds: \"\",\n postToMainPrefix: \"\",\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { AgentsListResult } from \"../types\";\n\nexport type AgentsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n agentsLoading: boolean;\n agentsError: string | null;\n agentsList: AgentsListResult | null;\n};\n\nexport async function loadAgents(state: AgentsState) {\n if (!state.client || !state.connected) return;\n if (state.agentsLoading) return;\n state.agentsLoading = true;\n state.agentsError = null;\n try {\n const res = (await state.client.request(\"agents.list\", {})) as AgentsListResult | undefined;\n if (res) state.agentsList = res;\n } catch (err) {\n state.agentsError = String(err);\n } finally {\n state.agentsLoading = false;\n }\n}\n","export const GATEWAY_CLIENT_IDS = {\n WEBCHAT_UI: \"webchat-ui\",\n CONTROL_UI: \"openclaw-control-ui\",\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n GATEWAY_CLIENT: \"gateway-client\",\n MACOS_APP: \"openclaw-macos\",\n IOS_APP: \"openclaw-ios\",\n ANDROID_APP: \"openclaw-android\",\n NODE_HOST: \"node-host\",\n TEST: \"test\",\n FINGERPRINT: \"fingerprint\",\n PROBE: \"openclaw-probe\",\n} as const;\n\nexport type GatewayClientId = (typeof GATEWAY_CLIENT_IDS)[keyof typeof GATEWAY_CLIENT_IDS];\n\n// Back-compat naming (internal): these values are IDs, not display names.\nexport const GATEWAY_CLIENT_NAMES = GATEWAY_CLIENT_IDS;\nexport type GatewayClientName = GatewayClientId;\n\nexport const GATEWAY_CLIENT_MODES = {\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n UI: \"ui\",\n BACKEND: \"backend\",\n NODE: \"node\",\n PROBE: \"probe\",\n TEST: \"test\",\n} as const;\n\nexport type GatewayClientMode = (typeof GATEWAY_CLIENT_MODES)[keyof typeof GATEWAY_CLIENT_MODES];\n\nexport type GatewayClientInfo = {\n id: GatewayClientId;\n displayName?: string;\n version: string;\n platform: string;\n deviceFamily?: string;\n modelIdentifier?: string;\n mode: GatewayClientMode;\n instanceId?: string;\n};\n\nconst GATEWAY_CLIENT_ID_SET = new Set<GatewayClientId>(Object.values(GATEWAY_CLIENT_IDS));\nconst GATEWAY_CLIENT_MODE_SET = new Set<GatewayClientMode>(Object.values(GATEWAY_CLIENT_MODES));\n\nexport function normalizeGatewayClientId(raw?: string | null): GatewayClientId | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_ID_SET.has(normalized as GatewayClientId)\n ? (normalized as GatewayClientId)\n : undefined;\n}\n\nexport function normalizeGatewayClientName(raw?: string | null): GatewayClientName | undefined {\n return normalizeGatewayClientId(raw);\n}\n\nexport function normalizeGatewayClientMode(raw?: string | null): GatewayClientMode | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_MODE_SET.has(normalized as GatewayClientMode)\n ? (normalized as GatewayClientMode)\n : undefined;\n}\n","export type DeviceAuthPayloadParams = {\n deviceId: string;\n clientId: string;\n clientMode: string;\n role: string;\n scopes: string[];\n signedAtMs: number;\n token?: string | null;\n nonce?: string | null;\n version?: \"v1\" | \"v2\";\n};\n\nexport function buildDeviceAuthPayload(params: DeviceAuthPayloadParams): string {\n const version = params.version ?? (params.nonce ? \"v2\" : \"v1\");\n const scopes = params.scopes.join(\",\");\n const token = params.token ?? \"\";\n const base = [\n version,\n params.deviceId,\n params.clientId,\n params.clientMode,\n params.role,\n scopes,\n String(params.signedAtMs),\n token,\n ];\n if (version === \"v2\") {\n base.push(params.nonce ?? \"\");\n }\n return base.join(\"|\");\n}\n","import { generateUUID } from \"./uuid\";\nimport {\n GATEWAY_CLIENT_MODES,\n GATEWAY_CLIENT_NAMES,\n type GatewayClientMode,\n type GatewayClientName,\n} from \"../../../src/gateway/protocol/client-info.js\";\nimport { buildDeviceAuthPayload } from \"../../../src/gateway/device-auth.js\";\nimport { loadOrCreateDeviceIdentity, signDevicePayload } from \"./device-identity\";\nimport { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from \"./device-auth\";\n\nexport type GatewayEventFrame = {\n type: \"event\";\n event: string;\n payload?: unknown;\n seq?: number;\n stateVersion?: { presence: number; health: number };\n};\n\nexport type GatewayResponseFrame = {\n type: \"res\";\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; details?: unknown };\n};\n\nexport type GatewayHelloOk = {\n type: \"hello-ok\";\n protocol: number;\n features?: { methods?: string[]; events?: string[] };\n snapshot?: unknown;\n auth?: {\n deviceToken?: string;\n role?: string;\n scopes?: string[];\n issuedAtMs?: number;\n };\n policy?: { tickIntervalMs?: number };\n};\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n};\n\nexport type GatewayBrowserClientOptions = {\n url: string;\n token?: string;\n password?: string;\n clientName?: GatewayClientName;\n clientVersion?: string;\n platform?: string;\n mode?: GatewayClientMode;\n instanceId?: string;\n onHello?: (hello: GatewayHelloOk) => void;\n onEvent?: (evt: GatewayEventFrame) => void;\n onClose?: (info: { code: number; reason: string }) => void;\n onGap?: (info: { expected: number; received: number }) => void;\n};\n\n// 4008 = application-defined code (browser rejects 1008 \"Policy Violation\")\nconst CONNECT_FAILED_CLOSE_CODE = 4008;\n\nexport class GatewayBrowserClient {\n private ws: WebSocket | null = null;\n private pending = new Map<string, Pending>();\n private closed = false;\n private lastSeq: number | null = null;\n private connectNonce: string | null = null;\n private connectSent = false;\n private connectTimer: number | null = null;\n private backoffMs = 800;\n\n constructor(private opts: GatewayBrowserClientOptions) {}\n\n start() {\n this.closed = false;\n this.connect();\n }\n\n stop() {\n this.closed = true;\n this.ws?.close();\n this.ws = null;\n this.flushPending(new Error(\"gateway client stopped\"));\n }\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private connect() {\n if (this.closed) return;\n this.ws = new WebSocket(this.opts.url);\n this.ws.onopen = () => this.queueConnect();\n this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? \"\"));\n this.ws.onclose = (ev) => {\n const reason = String(ev.reason ?? \"\");\n this.ws = null;\n this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));\n this.opts.onClose?.({ code: ev.code, reason });\n this.scheduleReconnect();\n };\n this.ws.onerror = () => {\n // ignored; close handler will fire\n };\n }\n\n private scheduleReconnect() {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);\n window.setTimeout(() => this.connect(), delay);\n }\n\n private flushPending(err: Error) {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n private async sendConnect() {\n if (this.connectSent) return;\n this.connectSent = true;\n if (this.connectTimer !== null) {\n window.clearTimeout(this.connectTimer);\n this.connectTimer = null;\n }\n\n // crypto.subtle is only available in secure contexts (HTTPS, localhost).\n // Over plain HTTP, we skip device identity and fall back to token-only auth.\n // Gateways may reject this unless gateway.controlUi.allowInsecureAuth is enabled.\n const isSecureContext = typeof crypto !== \"undefined\" && !!crypto.subtle;\n\n const scopes = [\"operator.admin\", \"operator.approvals\", \"operator.pairing\"];\n const role = \"operator\";\n let deviceIdentity: Awaited<ReturnType<typeof loadOrCreateDeviceIdentity>> | null = null;\n let canFallbackToShared = false;\n let authToken = this.opts.token;\n\n if (isSecureContext) {\n deviceIdentity = await loadOrCreateDeviceIdentity();\n const storedToken = loadDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role,\n })?.token;\n authToken = storedToken ?? this.opts.token;\n canFallbackToShared = Boolean(storedToken && this.opts.token);\n }\n const auth =\n authToken || this.opts.password\n ? {\n token: authToken,\n password: this.opts.password,\n }\n : undefined;\n\n let device:\n | {\n id: string;\n publicKey: string;\n signature: string;\n signedAt: number;\n nonce: string | undefined;\n }\n | undefined;\n\n if (isSecureContext && deviceIdentity) {\n const signedAtMs = Date.now();\n const nonce = this.connectNonce ?? undefined;\n const payload = buildDeviceAuthPayload({\n deviceId: deviceIdentity.deviceId,\n clientId: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n role,\n scopes,\n signedAtMs,\n token: authToken ?? null,\n nonce,\n });\n const signature = await signDevicePayload(deviceIdentity.privateKey, payload);\n device = {\n id: deviceIdentity.deviceId,\n publicKey: deviceIdentity.publicKey,\n signature,\n signedAt: signedAtMs,\n nonce,\n };\n }\n const params = {\n minProtocol: 3,\n maxProtocol: 3,\n client: {\n id: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n version: this.opts.clientVersion ?? \"dev\",\n platform: this.opts.platform ?? navigator.platform ?? \"web\",\n mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n instanceId: this.opts.instanceId,\n },\n role,\n scopes,\n device,\n caps: [],\n auth,\n userAgent: navigator.userAgent,\n locale: navigator.language,\n };\n\n void this.request<GatewayHelloOk>(\"connect\", params)\n .then((hello) => {\n if (hello?.auth?.deviceToken && deviceIdentity) {\n storeDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role: hello.auth.role ?? role,\n token: hello.auth.deviceToken,\n scopes: hello.auth.scopes ?? [],\n });\n }\n this.backoffMs = 800;\n this.opts.onHello?.(hello);\n })\n .catch(() => {\n if (canFallbackToShared && deviceIdentity) {\n clearDeviceAuthToken({ deviceId: deviceIdentity.deviceId, role });\n }\n this.ws?.close(CONNECT_FAILED_CLOSE_CODE, \"connect failed\");\n });\n }\n\n private handleMessage(raw: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n\n const frame = parsed as { type?: unknown };\n if (frame.type === \"event\") {\n const evt = parsed as GatewayEventFrame;\n if (evt.event === \"connect.challenge\") {\n const payload = evt.payload as { nonce?: unknown } | undefined;\n const nonce = payload && typeof payload.nonce === \"string\" ? payload.nonce : null;\n if (nonce) {\n this.connectNonce = nonce;\n void this.sendConnect();\n }\n return;\n }\n const seq = typeof evt.seq === \"number\" ? evt.seq : null;\n if (seq !== null) {\n if (this.lastSeq !== null && seq > this.lastSeq + 1) {\n this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });\n }\n this.lastSeq = seq;\n }\n try {\n this.opts.onEvent?.(evt);\n } catch (err) {\n console.error(\"[gateway] event handler error:\", err);\n }\n return;\n }\n\n if (frame.type === \"res\") {\n const res = parsed as GatewayResponseFrame;\n const pending = this.pending.get(res.id);\n if (!pending) return;\n this.pending.delete(res.id);\n if (res.ok) pending.resolve(res.payload);\n else pending.reject(new Error(res.error?.message ?? \"request failed\"));\n return;\n }\n }\n\n request<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"gateway not connected\"));\n }\n const id = generateUUID();\n const frame = { type: \"req\", id, method, params };\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.ws.send(JSON.stringify(frame));\n return p;\n }\n\n private queueConnect() {\n this.connectNonce = null;\n this.connectSent = false;\n if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);\n this.connectTimer = window.setTimeout(() => {\n void this.sendConnect();\n }, 750);\n }\n}\n","export type ExecApprovalRequestPayload = {\n command: string;\n cwd?: string | null;\n host?: string | null;\n security?: string | null;\n ask?: string | null;\n agentId?: string | null;\n resolvedPath?: string | null;\n sessionKey?: string | null;\n};\n\nexport type ExecApprovalRequest = {\n id: string;\n request: ExecApprovalRequestPayload;\n createdAtMs: number;\n expiresAtMs: number;\n};\n\nexport type ExecApprovalResolved = {\n id: string;\n decision?: string | null;\n resolvedBy?: string | null;\n ts?: number | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function parseExecApprovalRequested(payload: unknown): ExecApprovalRequest | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n const request = payload.request;\n if (!id || !isRecord(request)) return null;\n const command = typeof request.command === \"string\" ? request.command.trim() : \"\";\n if (!command) return null;\n const createdAtMs = typeof payload.createdAtMs === \"number\" ? payload.createdAtMs : 0;\n const expiresAtMs = typeof payload.expiresAtMs === \"number\" ? payload.expiresAtMs : 0;\n if (!createdAtMs || !expiresAtMs) return null;\n return {\n id,\n request: {\n command,\n cwd: typeof request.cwd === \"string\" ? request.cwd : null,\n host: typeof request.host === \"string\" ? request.host : null,\n security: typeof request.security === \"string\" ? request.security : null,\n ask: typeof request.ask === \"string\" ? request.ask : null,\n agentId: typeof request.agentId === \"string\" ? request.agentId : null,\n resolvedPath: typeof request.resolvedPath === \"string\" ? request.resolvedPath : null,\n sessionKey: typeof request.sessionKey === \"string\" ? request.sessionKey : null,\n },\n createdAtMs,\n expiresAtMs,\n };\n}\n\nexport function parseExecApprovalResolved(payload: unknown): ExecApprovalResolved | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n if (!id) return null;\n return {\n id,\n decision: typeof payload.decision === \"string\" ? payload.decision : null,\n resolvedBy: typeof payload.resolvedBy === \"string\" ? payload.resolvedBy : null,\n ts: typeof payload.ts === \"number\" ? payload.ts : null,\n };\n}\n\nexport function pruneExecApprovalQueue(queue: ExecApprovalRequest[]): ExecApprovalRequest[] {\n const now = Date.now();\n return queue.filter((entry) => entry.expiresAtMs > now);\n}\n\nexport function addExecApproval(\n queue: ExecApprovalRequest[],\n entry: ExecApprovalRequest,\n): ExecApprovalRequest[] {\n const next = pruneExecApprovalQueue(queue).filter((item) => item.id !== entry.id);\n next.push(entry);\n return next;\n}\n\nexport function removeExecApproval(queue: ExecApprovalRequest[], id: string): ExecApprovalRequest[] {\n return pruneExecApprovalQueue(queue).filter((entry) => entry.id !== id);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport {\n normalizeAssistantIdentity,\n type AssistantIdentity,\n} from \"../assistant-identity\";\n\nexport type AssistantIdentityState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n};\n\nexport async function loadAssistantIdentity(\n state: AssistantIdentityState,\n opts?: { sessionKey?: string },\n) {\n if (!state.client || !state.connected) return;\n const sessionKey = opts?.sessionKey?.trim() || state.sessionKey.trim();\n const params = sessionKey ? { sessionKey } : {};\n try {\n const res = (await state.client.request(\"agent.identity.get\", params)) as\n | Partial<AssistantIdentity>\n | undefined;\n if (!res) return;\n const normalized = normalizeAssistantIdentity(res);\n state.assistantName = normalized.name;\n state.assistantAvatar = normalized.avatar;\n state.assistantAgentId = normalized.agentId ?? null;\n } catch {\n // Ignore errors; keep last known identity.\n }\n}\n","import { loadChatHistory } from \"./controllers/chat\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadAgents } from \"./controllers/agents\";\nimport type { GatewayEventFrame, GatewayHelloOk } from \"./gateway\";\nimport { GatewayBrowserClient } from \"./gateway\";\nimport type { EventLogEntry } from \"./app-events\";\nimport type { AgentsListResult, PresenceEntry, HealthSnapshot, StatusSummary } from \"./types\";\nimport type { Tab } from \"./navigation\";\nimport type { UiSettings } from \"./storage\";\nimport { handleAgentEvent, resetToolStream, type AgentEventPayload } from \"./app-tool-stream\";\nimport { flushChatQueueForEvent } from \"./app-chat\";\nimport {\n applySettings,\n loadCron,\n refreshActiveTab,\n setLastActiveSessionKey,\n} from \"./app-settings\";\nimport { handleChatEvent, type ChatEventPayload } from \"./controllers/chat\";\nimport {\n addExecApproval,\n parseExecApprovalRequested,\n parseExecApprovalResolved,\n removeExecApproval,\n} from \"./controllers/exec-approval\";\nimport type { OpenClawApp } from \"./app\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport { loadAssistantIdentity } from \"./controllers/assistant-identity\";\nimport { loadSessions } from \"./controllers/sessions\";\n\ntype GatewayHost = {\n settings: UiSettings;\n password: string;\n client: GatewayBrowserClient | null;\n connected: boolean;\n hello: GatewayHelloOk | null;\n lastError: string | null;\n onboarding?: boolean;\n eventLogBuffer: EventLogEntry[];\n eventLog: EventLogEntry[];\n tab: Tab;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: StatusSummary | null;\n agentsLoading: boolean;\n agentsList: AgentsListResult | null;\n agentsError: string | null;\n debugHealth: HealthSnapshot | null;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n sessionKey: string;\n chatRunId: string | null;\n refreshSessionsAfterChat: boolean;\n execApprovalQueue: ExecApprovalRequest[];\n execApprovalError: string | null;\n};\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n mainKey?: string;\n mainSessionKey?: string;\n scope?: string;\n};\n\nfunction normalizeSessionKeyForDefaults(\n value: string | undefined,\n defaults: SessionDefaultsSnapshot,\n): string {\n const raw = (value ?? \"\").trim();\n const mainSessionKey = defaults.mainSessionKey?.trim();\n if (!mainSessionKey) return raw;\n if (!raw) return mainSessionKey;\n const mainKey = defaults.mainKey?.trim() || \"main\";\n const defaultAgentId = defaults.defaultAgentId?.trim();\n const isAlias =\n raw === \"main\" ||\n raw === mainKey ||\n (defaultAgentId &&\n (raw === `agent:${defaultAgentId}:main` ||\n raw === `agent:${defaultAgentId}:${mainKey}`));\n return isAlias ? mainSessionKey : raw;\n}\n\nfunction applySessionDefaults(host: GatewayHost, defaults?: SessionDefaultsSnapshot) {\n if (!defaults?.mainSessionKey) return;\n const resolvedSessionKey = normalizeSessionKeyForDefaults(host.sessionKey, defaults);\n const resolvedSettingsSessionKey = normalizeSessionKeyForDefaults(\n host.settings.sessionKey,\n defaults,\n );\n const resolvedLastActiveSessionKey = normalizeSessionKeyForDefaults(\n host.settings.lastActiveSessionKey,\n defaults,\n );\n const nextSessionKey = resolvedSessionKey || resolvedSettingsSessionKey || host.sessionKey;\n const nextSettings = {\n ...host.settings,\n sessionKey: resolvedSettingsSessionKey || nextSessionKey,\n lastActiveSessionKey: resolvedLastActiveSessionKey || nextSessionKey,\n };\n const shouldUpdateSettings =\n nextSettings.sessionKey !== host.settings.sessionKey ||\n nextSettings.lastActiveSessionKey !== host.settings.lastActiveSessionKey;\n if (nextSessionKey !== host.sessionKey) {\n host.sessionKey = nextSessionKey;\n }\n if (shouldUpdateSettings) {\n applySettings(host as unknown as Parameters<typeof applySettings>[0], nextSettings);\n }\n}\n\nexport function connectGateway(host: GatewayHost) {\n host.lastError = null;\n host.hello = null;\n host.connected = false;\n host.execApprovalQueue = [];\n host.execApprovalError = null;\n\n host.client?.stop();\n host.client = new GatewayBrowserClient({\n url: host.settings.gatewayUrl,\n token: host.settings.token.trim() ? host.settings.token : undefined,\n password: host.password.trim() ? host.password : undefined,\n clientName: \"openclaw-control-ui\",\n mode: \"webchat\",\n onHello: (hello) => {\n host.connected = true;\n host.lastError = null;\n host.hello = hello;\n applySnapshot(host, hello);\n // Reset orphaned chat run state from before disconnect.\n // Any in-flight run's final event was lost during the disconnect window.\n host.chatRunId = null;\n (host as unknown as { chatStream: string | null }).chatStream = null;\n (host as unknown as { chatStreamStartedAt: number | null }).chatStreamStartedAt = null;\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n void loadAssistantIdentity(host as unknown as OpenClawApp);\n void loadAgents(host as unknown as OpenClawApp);\n void loadNodes(host as unknown as OpenClawApp, { quiet: true });\n void loadDevices(host as unknown as OpenClawApp, { quiet: true });\n void refreshActiveTab(host as unknown as Parameters<typeof refreshActiveTab>[0]);\n },\n onClose: ({ code, reason }) => {\n host.connected = false;\n // Code 1012 = Service Restart (expected during config saves, don't show as error)\n if (code !== 1012) {\n host.lastError = `disconnected (${code}): ${reason || \"no reason\"}`;\n }\n },\n onEvent: (evt) => handleGatewayEvent(host, evt),\n onGap: ({ expected, received }) => {\n host.lastError = `event gap detected (expected seq ${expected}, got ${received}); refresh recommended`;\n },\n });\n host.client.start();\n}\n\nexport function handleGatewayEvent(host: GatewayHost, evt: GatewayEventFrame) {\n try {\n handleGatewayEventUnsafe(host, evt);\n } catch (err) {\n console.error(\"[gateway] handleGatewayEvent error:\", evt.event, err);\n }\n}\n\nfunction handleGatewayEventUnsafe(host: GatewayHost, evt: GatewayEventFrame) {\n host.eventLogBuffer = [\n { ts: Date.now(), event: evt.event, payload: evt.payload },\n ...host.eventLogBuffer,\n ].slice(0, 250);\n if (host.tab === \"debug\") {\n host.eventLog = host.eventLogBuffer;\n }\n\n if (evt.event === \"agent\") {\n if (host.onboarding) return;\n handleAgentEvent(\n host as unknown as Parameters<typeof handleAgentEvent>[0],\n evt.payload as AgentEventPayload | undefined,\n );\n return;\n }\n\n if (evt.event === \"chat\") {\n const payload = evt.payload as ChatEventPayload | undefined;\n if (payload?.sessionKey) {\n setLastActiveSessionKey(\n host as unknown as Parameters<typeof setLastActiveSessionKey>[0],\n payload.sessionKey,\n );\n }\n const state = handleChatEvent(host as unknown as OpenClawApp, payload);\n if (state === \"final\" || state === \"error\" || state === \"aborted\") {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n void flushChatQueueForEvent(\n host as unknown as Parameters<typeof flushChatQueueForEvent>[0],\n );\n if (host.refreshSessionsAfterChat) {\n host.refreshSessionsAfterChat = false;\n if (state === \"final\") {\n void loadSessions(host as unknown as OpenClawApp, { activeMinutes: 0 });\n }\n }\n }\n if (state === \"final\") void loadChatHistory(host as unknown as OpenClawApp);\n return;\n }\n\n if (evt.event === \"presence\") {\n const payload = evt.payload as { presence?: PresenceEntry[] } | undefined;\n if (payload?.presence && Array.isArray(payload.presence)) {\n host.presenceEntries = payload.presence;\n host.presenceError = null;\n host.presenceStatus = null;\n }\n return;\n }\n\n if (evt.event === \"cron\" && host.tab === \"cron\") {\n void loadCron(host as unknown as Parameters<typeof loadCron>[0]);\n }\n\n if (evt.event === \"device.pair.requested\" || evt.event === \"device.pair.resolved\") {\n void loadDevices(host as unknown as OpenClawApp, { quiet: true });\n }\n\n if (evt.event === \"exec.approval.requested\") {\n const entry = parseExecApprovalRequested(evt.payload);\n if (entry) {\n host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry);\n host.execApprovalError = null;\n const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500);\n window.setTimeout(() => {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id);\n }, delay);\n }\n return;\n }\n\n if (evt.event === \"exec.approval.resolved\") {\n const resolved = parseExecApprovalResolved(evt.payload);\n if (resolved) {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id);\n }\n }\n}\n\nexport function applySnapshot(host: GatewayHost, hello: GatewayHelloOk) {\n const snapshot = hello.snapshot as\n | {\n presence?: PresenceEntry[];\n health?: HealthSnapshot;\n sessionDefaults?: SessionDefaultsSnapshot;\n }\n | undefined;\n if (snapshot?.presence && Array.isArray(snapshot.presence)) {\n host.presenceEntries = snapshot.presence;\n }\n if (snapshot?.health) {\n host.debugHealth = snapshot.health;\n }\n if (snapshot?.sessionDefaults) {\n applySessionDefaults(host, snapshot.sessionDefaults);\n }\n}\n","import type { Tab } from \"./navigation\";\nimport { connectGateway } from \"./app-gateway\";\nimport {\n applySettingsFromUrl,\n attachThemeListener,\n detachThemeListener,\n inferBasePath,\n syncTabWithLocation,\n syncThemeWithSettings,\n} from \"./app-settings\";\nimport { observeTopbar, scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport {\n startLogsPolling,\n startNodesPolling,\n stopLogsPolling,\n stopNodesPolling,\n startDebugPolling,\n stopDebugPolling,\n} from \"./app-polling\";\n\ntype LifecycleHost = {\n basePath: string;\n tab: Tab;\n chatHasAutoScrolled: boolean;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatToolMessages: unknown[];\n chatStream: string;\n logsAutoFollow: boolean;\n logsAtBottom: boolean;\n logsEntries: unknown[];\n popStateHandler: () => void;\n topbarObserver: ResizeObserver | null;\n};\n\nexport function handleConnected(host: LifecycleHost) {\n host.basePath = inferBasePath();\n applySettingsFromUrl(\n host as unknown as Parameters<typeof applySettingsFromUrl>[0],\n );\n syncTabWithLocation(\n host as unknown as Parameters<typeof syncTabWithLocation>[0],\n true,\n );\n syncThemeWithSettings(\n host as unknown as Parameters<typeof syncThemeWithSettings>[0],\n );\n attachThemeListener(\n host as unknown as Parameters<typeof attachThemeListener>[0],\n );\n window.addEventListener(\"popstate\", host.popStateHandler);\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n startNodesPolling(host as unknown as Parameters<typeof startNodesPolling>[0]);\n if (host.tab === \"logs\") {\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n }\n if (host.tab === \"debug\") {\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n }\n}\n\nexport function handleFirstUpdated(host: LifecycleHost) {\n observeTopbar(host as unknown as Parameters<typeof observeTopbar>[0]);\n}\n\nexport function handleDisconnected(host: LifecycleHost) {\n window.removeEventListener(\"popstate\", host.popStateHandler);\n stopNodesPolling(host as unknown as Parameters<typeof stopNodesPolling>[0]);\n stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n detachThemeListener(\n host as unknown as Parameters<typeof detachThemeListener>[0],\n );\n host.topbarObserver?.disconnect();\n host.topbarObserver = null;\n}\n\nexport function handleUpdated(\n host: LifecycleHost,\n changed: Map<PropertyKey, unknown>,\n) {\n if (\n host.tab === \"chat\" &&\n (changed.has(\"chatMessages\") ||\n changed.has(\"chatToolMessages\") ||\n changed.has(\"chatStream\") ||\n changed.has(\"chatLoading\") ||\n changed.has(\"tab\"))\n ) {\n const forcedByTab = changed.has(\"tab\");\n const forcedByLoad =\n changed.has(\"chatLoading\") &&\n changed.get(\"chatLoading\") === true &&\n host.chatLoading === false;\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n forcedByTab || forcedByLoad || !host.chatHasAutoScrolled,\n );\n }\n if (\n host.tab === \"logs\" &&\n (changed.has(\"logsEntries\") || changed.has(\"logsAutoFollow\") || changed.has(\"tab\"))\n ) {\n if (host.logsAutoFollow && host.logsAtBottom) {\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n changed.has(\"tab\") || changed.has(\"logsAutoFollow\"),\n );\n }\n }\n}\n","import {\n loadChannels,\n logoutWhatsApp,\n startWhatsAppLogin,\n waitWhatsAppLogin,\n} from \"./controllers/channels\";\nimport { loadConfig, saveConfig } from \"./controllers/config\";\nimport type { OpenClawApp } from \"./app\";\nimport type { NostrProfile } from \"./types\";\nimport { createNostrProfileFormState } from \"./views/channels.nostr-profile-form\";\n\nexport async function handleWhatsAppStart(host: OpenClawApp, force: boolean) {\n await startWhatsAppLogin(host, force);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppWait(host: OpenClawApp) {\n await waitWhatsAppLogin(host);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppLogout(host: OpenClawApp) {\n await logoutWhatsApp(host);\n await loadChannels(host, true);\n}\n\nexport async function handleChannelConfigSave(host: OpenClawApp) {\n await saveConfig(host);\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nexport async function handleChannelConfigReload(host: OpenClawApp) {\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nfunction parseValidationErrors(details: unknown): Record<string, string> {\n if (!Array.isArray(details)) return {};\n const errors: Record<string, string> = {};\n for (const entry of details) {\n if (typeof entry !== \"string\") continue;\n const [rawField, ...rest] = entry.split(\":\");\n if (!rawField || rest.length === 0) continue;\n const field = rawField.trim();\n const message = rest.join(\":\").trim();\n if (field && message) errors[field] = message;\n }\n return errors;\n}\n\nfunction resolveNostrAccountId(host: OpenClawApp): string {\n const accounts = host.channelsSnapshot?.channelAccounts?.nostr ?? [];\n return accounts[0]?.accountId ?? host.nostrProfileAccountId ?? \"default\";\n}\n\nfunction buildNostrProfileUrl(accountId: string, suffix = \"\"): string {\n return `/api/channels/nostr/${encodeURIComponent(accountId)}/profile${suffix}`;\n}\n\nexport function handleNostrProfileEdit(\n host: OpenClawApp,\n accountId: string,\n profile: NostrProfile | null,\n) {\n host.nostrProfileAccountId = accountId;\n host.nostrProfileFormState = createNostrProfileFormState(profile ?? undefined);\n}\n\nexport function handleNostrProfileCancel(host: OpenClawApp) {\n host.nostrProfileFormState = null;\n host.nostrProfileAccountId = null;\n}\n\nexport function handleNostrProfileFieldChange(\n host: OpenClawApp,\n field: keyof NostrProfile,\n value: string,\n) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n values: {\n ...state.values,\n [field]: value,\n },\n fieldErrors: {\n ...state.fieldErrors,\n [field]: \"\",\n },\n };\n}\n\nexport function handleNostrProfileToggleAdvanced(host: OpenClawApp) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n showAdvanced: !state.showAdvanced,\n };\n}\n\nexport async function handleNostrProfileSave(host: OpenClawApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.saving) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n saving: true,\n error: null,\n success: null,\n fieldErrors: {},\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId), {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(state.values),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; details?: unknown; persisted?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile update failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: errorMessage,\n success: null,\n fieldErrors: parseValidationErrors(data?.details),\n };\n return;\n }\n\n if (!data.persisted) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: \"Profile publish failed on all relays.\",\n success: null,\n };\n return;\n }\n\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: null,\n success: \"Profile published to relays.\",\n fieldErrors: {},\n original: { ...state.values },\n };\n await loadChannels(host, true);\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: `Profile update failed: ${String(err)}`,\n success: null,\n };\n }\n}\n\nexport async function handleNostrProfileImport(host: OpenClawApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.importing) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n importing: true,\n error: null,\n success: null,\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId, \"/import\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ autoMerge: true }),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; imported?: NostrProfile; merged?: NostrProfile; saved?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile import failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: errorMessage,\n success: null,\n };\n return;\n }\n\n const merged = data.merged ?? data.imported ?? null;\n const nextValues = merged ? { ...state.values, ...merged } : state.values;\n const showAdvanced = Boolean(\n nextValues.banner || nextValues.website || nextValues.nip05 || nextValues.lud16,\n );\n\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n values: nextValues,\n error: null,\n success: data.saved\n ? \"Profile imported from relays. Review and publish.\"\n : \"Profile imported. Review and publish.\",\n showAdvanced,\n };\n\n if (data.saved) {\n await loadChannels(host, true);\n }\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: `Profile import failed: ${String(err)}`,\n success: null,\n };\n }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport { resolveInjectedAssistantIdentity } from \"./assistant-identity\";\nimport { loadSettings, type UiSettings } from \"./storage\";\nimport { renderApp } from \"./app-render\";\nimport type { Tab } from \"./navigation\";\nimport type { ResolvedTheme, ThemeMode } from \"./theme\";\nimport type {\n AgentsListResult,\n ConfigSnapshot,\n ConfigUiHints,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n NostrProfile,\n} from \"./types\";\nimport { type ChatAttachment, type ChatQueueItem, type CronFormState } from \"./ui-types\";\nimport type { EventLogEntry } from \"./app-events\";\nimport { DEFAULT_CRON_FORM, DEFAULT_LOG_LEVEL_FILTERS } from \"./app-defaults\";\nimport type {\n ExecApprovalsFile,\n ExecApprovalsSnapshot,\n} from \"./controllers/exec-approvals\";\nimport type { DevicePairingList } from \"./controllers/devices\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport {\n resetToolStream as resetToolStreamInternal,\n type ToolStreamEntry,\n} from \"./app-tool-stream\";\nimport {\n exportLogs as exportLogsInternal,\n handleChatScroll as handleChatScrollInternal,\n handleLogsScroll as handleLogsScrollInternal,\n resetChatScroll as resetChatScrollInternal,\n} from \"./app-scroll\";\nimport { connectGateway as connectGatewayInternal } from \"./app-gateway\";\nimport {\n handleConnected,\n handleDisconnected,\n handleFirstUpdated,\n handleUpdated,\n} from \"./app-lifecycle\";\nimport {\n applySettings as applySettingsInternal,\n loadCron as loadCronInternal,\n loadOverview as loadOverviewInternal,\n setTab as setTabInternal,\n setTheme as setThemeInternal,\n onPopState as onPopStateInternal,\n} from \"./app-settings\";\nimport {\n handleAbortChat as handleAbortChatInternal,\n handleSendChat as handleSendChatInternal,\n removeQueuedMessage as removeQueuedMessageInternal,\n} from \"./app-chat\";\nimport {\n handleChannelConfigReload as handleChannelConfigReloadInternal,\n handleChannelConfigSave as handleChannelConfigSaveInternal,\n handleNostrProfileCancel as handleNostrProfileCancelInternal,\n handleNostrProfileEdit as handleNostrProfileEditInternal,\n handleNostrProfileFieldChange as handleNostrProfileFieldChangeInternal,\n handleNostrProfileImport as handleNostrProfileImportInternal,\n handleNostrProfileSave as handleNostrProfileSaveInternal,\n handleNostrProfileToggleAdvanced as handleNostrProfileToggleAdvancedInternal,\n handleWhatsAppLogout as handleWhatsAppLogoutInternal,\n handleWhatsAppStart as handleWhatsAppStartInternal,\n handleWhatsAppWait as handleWhatsAppWaitInternal,\n} from \"./app-channels\";\nimport type { NostrProfileFormState } from \"./views/channels.nostr-profile-form\";\nimport { loadAssistantIdentity as loadAssistantIdentityInternal } from \"./controllers/assistant-identity\";\n\ndeclare global {\n interface Window {\n __OPENCLAW_CONTROL_UI_BASE_PATH__?: string;\n }\n}\n\nconst injectedAssistantIdentity = resolveInjectedAssistantIdentity();\n\nfunction resolveOnboardingMode(): boolean {\n if (!window.location.search) return false;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(\"onboarding\");\n if (!raw) return false;\n const normalized = raw.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\n@customElement(\"openclaw-app\")\nexport class OpenClawApp extends LitElement {\n @state() settings: UiSettings = loadSettings();\n @state() password = \"\";\n @state() tab: Tab = \"chat\";\n @state() onboarding = resolveOnboardingMode();\n @state() connected = false;\n @state() theme: ThemeMode = this.settings.theme ?? \"system\";\n @state() themeResolved: ResolvedTheme = \"dark\";\n @state() hello: GatewayHelloOk | null = null;\n @state() lastError: string | null = null;\n @state() eventLog: EventLogEntry[] = [];\n private eventLogBuffer: EventLogEntry[] = [];\n private toolStreamSyncTimer: number | null = null;\n private sidebarCloseTimer: number | null = null;\n\n @state() assistantName = injectedAssistantIdentity.name;\n @state() assistantAvatar = injectedAssistantIdentity.avatar;\n @state() assistantAgentId = injectedAssistantIdentity.agentId ?? null;\n\n @state() sessionKey = this.settings.sessionKey;\n @state() chatLoading = false;\n @state() chatSending = false;\n @state() chatMessage = \"\";\n @state() chatMessages: unknown[] = [];\n @state() chatToolMessages: unknown[] = [];\n @state() chatStream: string | null = null;\n @state() chatStreamStartedAt: number | null = null;\n @state() chatRunId: string | null = null;\n @state() compactionStatus: import(\"./app-tool-stream\").CompactionStatus | null = null;\n @state() chatAvatarUrl: string | null = null;\n @state() chatThinkingLevel: string | null = null;\n @state() chatQueue: ChatQueueItem[] = [];\n @state() chatAttachments: ChatAttachment[] = [];\n // Sidebar state for tool output viewing\n @state() sidebarOpen = false;\n @state() sidebarContent: string | null = null;\n @state() sidebarError: string | null = null;\n @state() splitRatio = this.settings.splitRatio;\n\n @state() nodesLoading = false;\n @state() nodes: Array<Record<string, unknown>> = [];\n @state() devicesLoading = false;\n @state() devicesError: string | null = null;\n @state() devicesList: DevicePairingList | null = null;\n @state() execApprovalsLoading = false;\n @state() execApprovalsSaving = false;\n @state() execApprovalsDirty = false;\n @state() execApprovalsSnapshot: ExecApprovalsSnapshot | null = null;\n @state() execApprovalsForm: ExecApprovalsFile | null = null;\n @state() execApprovalsSelectedAgent: string | null = null;\n @state() execApprovalsTarget: \"gateway\" | \"node\" = \"gateway\";\n @state() execApprovalsTargetNodeId: string | null = null;\n @state() execApprovalQueue: ExecApprovalRequest[] = [];\n @state() execApprovalBusy = false;\n @state() execApprovalError: string | null = null;\n @state() pendingGatewayUrl: string | null = null;\n\n @state() configLoading = false;\n @state() configRaw = \"{\\n}\\n\";\n @state() configRawOriginal = \"\";\n @state() configValid: boolean | null = null;\n @state() configIssues: unknown[] = [];\n @state() configSaving = false;\n @state() configApplying = false;\n @state() updateRunning = false;\n @state() applySessionKey = this.settings.lastActiveSessionKey;\n @state() configSnapshot: ConfigSnapshot | null = null;\n @state() configSchema: unknown | null = null;\n @state() configSchemaVersion: string | null = null;\n @state() configSchemaLoading = false;\n @state() configUiHints: ConfigUiHints = {};\n @state() configForm: Record<string, unknown> | null = null;\n @state() configFormOriginal: Record<string, unknown> | null = null;\n @state() configFormDirty = false;\n @state() configFormMode: \"form\" | \"raw\" = \"form\";\n @state() configSearchQuery = \"\";\n @state() configActiveSection: string | null = null;\n @state() configActiveSubsection: string | null = null;\n\n @state() channelsLoading = false;\n @state() channelsSnapshot: ChannelsStatusSnapshot | null = null;\n @state() channelsError: string | null = null;\n @state() channelsLastSuccess: number | null = null;\n @state() whatsappLoginMessage: string | null = null;\n @state() whatsappLoginQrDataUrl: string | null = null;\n @state() whatsappLoginConnected: boolean | null = null;\n @state() whatsappBusy = false;\n @state() nostrProfileFormState: NostrProfileFormState | null = null;\n @state() nostrProfileAccountId: string | null = null;\n\n @state() presenceLoading = false;\n @state() presenceEntries: PresenceEntry[] = [];\n @state() presenceError: string | null = null;\n @state() presenceStatus: string | null = null;\n\n @state() agentsLoading = false;\n @state() agentsList: AgentsListResult | null = null;\n @state() agentsError: string | null = null;\n\n @state() sessionsLoading = false;\n @state() sessionsResult: SessionsListResult | null = null;\n @state() sessionsError: string | null = null;\n @state() sessionsFilterActive = \"\";\n @state() sessionsFilterLimit = \"120\";\n @state() sessionsIncludeGlobal = true;\n @state() sessionsIncludeUnknown = false;\n\n @state() cronLoading = false;\n @state() cronJobs: CronJob[] = [];\n @state() cronStatus: CronStatus | null = null;\n @state() cronError: string | null = null;\n @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };\n @state() cronRunsJobId: string | null = null;\n @state() cronRuns: CronRunLogEntry[] = [];\n @state() cronBusy = false;\n\n @state() skillsLoading = false;\n @state() skillsReport: SkillStatusReport | null = null;\n @state() skillsError: string | null = null;\n @state() skillsFilter = \"\";\n @state() skillEdits: Record<string, string> = {};\n @state() skillsBusyKey: string | null = null;\n @state() skillMessages: Record<string, SkillMessage> = {};\n\n @state() debugLoading = false;\n @state() debugStatus: StatusSummary | null = null;\n @state() debugHealth: HealthSnapshot | null = null;\n @state() debugModels: unknown[] = [];\n @state() debugHeartbeat: unknown | null = null;\n @state() debugCallMethod = \"\";\n @state() debugCallParams = \"{}\";\n @state() debugCallResult: string | null = null;\n @state() debugCallError: string | null = null;\n\n @state() logsLoading = false;\n @state() logsError: string | null = null;\n @state() logsFile: string | null = null;\n @state() logsEntries: LogEntry[] = [];\n @state() logsFilterText = \"\";\n @state() logsLevelFilters: Record<LogLevel, boolean> = {\n ...DEFAULT_LOG_LEVEL_FILTERS,\n };\n @state() logsAutoFollow = true;\n @state() logsTruncated = false;\n @state() logsCursor: number | null = null;\n @state() logsLastFetchAt: number | null = null;\n @state() logsLimit = 500;\n @state() logsMaxBytes = 250_000;\n @state() logsAtBottom = true;\n\n client: GatewayBrowserClient | null = null;\n private chatScrollFrame: number | null = null;\n private chatScrollTimeout: number | null = null;\n private chatHasAutoScrolled = false;\n private chatUserNearBottom = true;\n private nodesPollInterval: number | null = null;\n private logsPollInterval: number | null = null;\n private debugPollInterval: number | null = null;\n private logsScrollFrame: number | null = null;\n private toolStreamById = new Map<string, ToolStreamEntry>();\n private toolStreamOrder: string[] = [];\n refreshSessionsAfterChat = false;\n basePath = \"\";\n private popStateHandler = () =>\n onPopStateInternal(\n this as unknown as Parameters<typeof onPopStateInternal>[0],\n );\n private themeMedia: MediaQueryList | null = null;\n private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;\n private topbarObserver: ResizeObserver | null = null;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n handleConnected(this as unknown as Parameters<typeof handleConnected>[0]);\n }\n\n protected firstUpdated() {\n handleFirstUpdated(this as unknown as Parameters<typeof handleFirstUpdated>[0]);\n }\n\n disconnectedCallback() {\n handleDisconnected(this as unknown as Parameters<typeof handleDisconnected>[0]);\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<PropertyKey, unknown>) {\n handleUpdated(\n this as unknown as Parameters<typeof handleUpdated>[0],\n changed,\n );\n }\n\n connect() {\n connectGatewayInternal(\n this as unknown as Parameters<typeof connectGatewayInternal>[0],\n );\n }\n\n handleChatScroll(event: Event) {\n handleChatScrollInternal(\n this as unknown as Parameters<typeof handleChatScrollInternal>[0],\n event,\n );\n }\n\n handleLogsScroll(event: Event) {\n handleLogsScrollInternal(\n this as unknown as Parameters<typeof handleLogsScrollInternal>[0],\n event,\n );\n }\n\n exportLogs(lines: string[], label: string) {\n exportLogsInternal(lines, label);\n }\n\n resetToolStream() {\n resetToolStreamInternal(\n this as unknown as Parameters<typeof resetToolStreamInternal>[0],\n );\n }\n\n resetChatScroll() {\n resetChatScrollInternal(\n this as unknown as Parameters<typeof resetChatScrollInternal>[0],\n );\n }\n\n async loadAssistantIdentity() {\n await loadAssistantIdentityInternal(this);\n }\n\n applySettings(next: UiSettings) {\n applySettingsInternal(\n this as unknown as Parameters<typeof applySettingsInternal>[0],\n next,\n );\n }\n\n setTab(next: Tab) {\n setTabInternal(this as unknown as Parameters<typeof setTabInternal>[0], next);\n }\n\n setTheme(next: ThemeMode, context?: Parameters<typeof setThemeInternal>[2]) {\n setThemeInternal(\n this as unknown as Parameters<typeof setThemeInternal>[0],\n next,\n context,\n );\n }\n\n async loadOverview() {\n await loadOverviewInternal(\n this as unknown as Parameters<typeof loadOverviewInternal>[0],\n );\n }\n\n async loadCron() {\n await loadCronInternal(\n this as unknown as Parameters<typeof loadCronInternal>[0],\n );\n }\n\n async handleAbortChat() {\n await handleAbortChatInternal(\n this as unknown as Parameters<typeof handleAbortChatInternal>[0],\n );\n }\n\n removeQueuedMessage(id: string) {\n removeQueuedMessageInternal(\n this as unknown as Parameters<typeof removeQueuedMessageInternal>[0],\n id,\n );\n }\n\n async handleSendChat(\n messageOverride?: string,\n opts?: Parameters<typeof handleSendChatInternal>[2],\n ) {\n await handleSendChatInternal(\n this as unknown as Parameters<typeof handleSendChatInternal>[0],\n messageOverride,\n opts,\n );\n }\n\n async handleWhatsAppStart(force: boolean) {\n await handleWhatsAppStartInternal(this, force);\n }\n\n async handleWhatsAppWait() {\n await handleWhatsAppWaitInternal(this);\n }\n\n async handleWhatsAppLogout() {\n await handleWhatsAppLogoutInternal(this);\n }\n\n async handleChannelConfigSave() {\n await handleChannelConfigSaveInternal(this);\n }\n\n async handleChannelConfigReload() {\n await handleChannelConfigReloadInternal(this);\n }\n\n handleNostrProfileEdit(accountId: string, profile: NostrProfile | null) {\n handleNostrProfileEditInternal(this, accountId, profile);\n }\n\n handleNostrProfileCancel() {\n handleNostrProfileCancelInternal(this);\n }\n\n handleNostrProfileFieldChange(field: keyof NostrProfile, value: string) {\n handleNostrProfileFieldChangeInternal(this, field, value);\n }\n\n async handleNostrProfileSave() {\n await handleNostrProfileSaveInternal(this);\n }\n\n async handleNostrProfileImport() {\n await handleNostrProfileImportInternal(this);\n }\n\n handleNostrProfileToggleAdvanced() {\n handleNostrProfileToggleAdvancedInternal(this);\n }\n\n async handleExecApprovalDecision(decision: \"allow-once\" | \"allow-always\" | \"deny\") {\n const active = this.execApprovalQueue[0];\n if (!active || !this.client || this.execApprovalBusy) return;\n this.execApprovalBusy = true;\n this.execApprovalError = null;\n try {\n await this.client.request(\"exec.approval.resolve\", {\n id: active.id,\n decision,\n });\n this.execApprovalQueue = this.execApprovalQueue.filter((entry) => entry.id !== active.id);\n } catch (err) {\n this.execApprovalError = `Exec approval failed: ${String(err)}`;\n } finally {\n this.execApprovalBusy = false;\n }\n }\n\n handleGatewayUrlConfirm() {\n const nextGatewayUrl = this.pendingGatewayUrl;\n if (!nextGatewayUrl) return;\n this.pendingGatewayUrl = null;\n applySettingsInternal(\n this as unknown as Parameters<typeof applySettingsInternal>[0],\n { ...this.settings, gatewayUrl: nextGatewayUrl },\n );\n this.connect();\n }\n\n handleGatewayUrlCancel() {\n this.pendingGatewayUrl = null;\n }\n\n // Sidebar handlers for tool output viewing\n handleOpenSidebar(content: string) {\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n this.sidebarCloseTimer = null;\n }\n this.sidebarContent = content;\n this.sidebarError = null;\n this.sidebarOpen = true;\n }\n\n handleCloseSidebar() {\n this.sidebarOpen = false;\n // Clear content after transition\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n }\n this.sidebarCloseTimer = window.setTimeout(() => {\n if (this.sidebarOpen) return;\n this.sidebarContent = null;\n this.sidebarError = null;\n this.sidebarCloseTimer = null;\n }, 200);\n }\n\n handleSplitRatioChange(ratio: number) {\n const newRatio = Math.max(0.4, Math.min(0.7, ratio));\n this.splitRatio = newRatio;\n this.applySettings({ ...this.settings, splitRatio: newRatio });\n }\n\n render() {\n return renderApp(this);\n }\n}\n"],"names":["t","e","s","o","n$5","r","n","i","S","c","h","a","l","p","d","u","f","b","y$2","y","v","_","m","g","$","x","E","A","C","P","V","N","S$1","I","L","z","H","M","R","k","Z","I$2","Z$1","j","B","D","MAX_ASSISTANT_NAME","MAX_ASSISTANT_AVATAR","DEFAULT_ASSISTANT_NAME","coerceIdentityValue","value","maxLength","trimmed","normalizeAssistantIdentity","input","name","avatar","resolveInjectedAssistantIdentity","KEY","loadSettings","defaults","raw","parsed","saveSettings","next","parseAgentSessionKey","sessionKey","parts","agentId","rest","TAB_GROUPS","TAB_PATHS","PATH_TO_TAB","tab","path","normalizeBasePath","basePath","base","normalizePath","normalized","pathForTab","tabFromPath","pathname","inferBasePathFromPathname","segments","candidate","prefix","iconForTab","titleForTab","subtitleForTab","icons","html","QUICK_TAG_RE","FINAL_TAG_RE","THINKING_TAG_RE","findCodeRegions","text","regions","fencedRe","match","start","inlineRe","end","isInsideCode","pos","applyTrim","mode","stripReasoningTagsFromText","options","cleaned","finalMatches","preCodeRegions","codeRegions","result","lastIndex","inThinking","idx","isClose","formatMs","ms","formatAgo","diff","sec","min","hr","formatDurationMs","formatList","values","clampText","max","truncateText","toNumber","fallback","stripThinkingTags","ENVELOPE_PREFIX","ENVELOPE_CHANNELS","textCache","thinkingCache","looksLikeEnvelopeHeader","header","label","stripEnvelope","extractText","message","role","content","item","joined","extractTextCached","obj","extractThinking","rawText","extractRawText","extracted","extractThinkingCached","formatReasoningMarkdown","lines","line","warnedWeakCrypto","uuidFromBytes","bytes","hex","weakRandomBytes","now","warnWeakCryptoOnce","generateUUID","cryptoLike","loadChatHistory","state","res","err","dataUrlToBase64","dataUrl","sendChatMessage","attachments","msg","hasAttachments","contentBlocks","att","runId","apiAttachments","error","abortChatRun","handleChatEvent","payload","current","loadSessions","overrides","includeGlobal","includeUnknown","activeMinutes","limit","params","patchSession","key","patch","deleteSession","TOOL_STREAM_LIMIT","TOOL_STREAM_THROTTLE_MS","TOOL_OUTPUT_CHAR_LIMIT","extractToolOutputText","record","entry","part","formatToolOutput","contentText","truncated","buildToolStreamMessage","trimToolStream","host","overflow","removed","id","syncToolStreamMessages","flushToolStreamSync","scheduleToolStreamSync","force","resetToolStream","COMPACTION_TOAST_DURATION_MS","handleCompactionEvent","data","phase","handleAgentEvent","toolCallId","args","output","scheduleChatScroll","pickScrollTarget","container","overflowY","target","distanceFromBottom","retryDelay","latest","latestDistanceFromBottom","scheduleLogsScroll","handleChatScroll","event","handleLogsScroll","resetChatScroll","exportLogs","blob","url","anchor","stamp","observeTopbar","topbar","update","height","cloneConfigObject","serializeConfigForm","form","setPathValue","nextKey","lastKey","removePathValue","loadConfig","applyConfigSnapshot","loadConfigSchema","applyConfigSchema","snapshot","rawFromSnapshot","saveConfig","baseHash","applyConfig","runUpdate","updateConfigFormValue","removeConfigFormValue","loadCronStatus","loadCronJobs","buildCronSchedule","amount","unit","expr","buildCronPayload","timeoutSeconds","addCronJob","schedule","job","toggleCronJob","enabled","runCronJob","loadCronRuns","removeCronJob","jobId","loadChannels","probe","startWhatsAppLogin","waitWhatsAppLogin","logoutWhatsApp","loadDebug","status","health","models","heartbeat","modelPayload","callDebugMethod","LOG_BUFFER_LIMIT","LEVELS","parseMaybeJsonString","normalizeLevel","lowered","parseLogLine","meta","time","level","contextCandidate","contextObj","subsystem","loadLogs","opts","entries","shouldReset","ed25519_CURVE","Gx","Gy","_a","_d","L2","captureTrace","isBig","isStr","isBytes","abytes","length","title","len","needsLen","ofLen","got","u8n","u8fr","buf","padh","pad","bytesToHex","_ch","ch","hexToBytes","hl","al","array","ai","hi","n1","n2","cr","subtle","concatBytes","arrs","sum","randomBytes","big","assertRange","modN","invert","num","md","q","callHash","fn","hashes","apoint","Point","B256","X","Y","T","zip215","normed","lastByte","bytesToNumLE","y2","isValid","uvRatio","isXOdd","isLastByteOdd","X2","Y2","Z2","Z4","aX2","left","right","XY","ZT","other","X1","Y1","Z1","X1Z2","X2Z1","Y1Z2","Y2Z1","x1y1","G","F","X3","Y3","T3","Z3","T1","T2","safe","wNAF","scalar","iz","numTo32bLE","pow2","power","pow_2_252_3","b2","b4","b5","b10","b20","b40","b80","b160","b240","b250","RM1","v3","v7","pow","vx2","root1","root2","useRoot1","useRoot2","noRoot","modL_LE","hash","sha512a","sha512s","hash2extK","hashed","head","point","pointBytes","getExtendedPublicKeyAsync","secretKey","getExtendedPublicKey","getPublicKeyAsync","hashFinishA","_sign","rBytes","signAsync","randomSecretKey","seed","utils","W","scalarBits","pwindows","pwindowSize","precompute","points","w","Gpows","ctneg","cnd","comp","pow_2_w","maxNum","mask","shiftBy","wbits","off","offF","offP","isEven","isNeg","STORAGE_KEY","base64UrlEncode","binary","byte","base64UrlDecode","padded","out","fingerprintPublicKey","publicKey","generateIdentity","privateKey","loadOrCreateDeviceIdentity","derivedId","updated","identity","stored","signDevicePayload","privateKeyBase64Url","sig","normalizeRole","normalizeScopes","scopes","scope","readStore","writeStore","store","loadDeviceAuthToken","storeDeviceAuthToken","existing","clearDeviceAuthToken","loadDevices","approveDevicePairing","requestId","rejectDevicePairing","rotateDeviceToken","revokeDeviceToken","loadNodes","resolveExecApprovalsRpc","nodeId","resolveExecApprovalsSaveRpc","loadExecApprovals","rpc","applyExecApprovalsSnapshot","saveExecApprovals","file","updateExecApprovalsFormValue","removeExecApprovalsFormValue","loadPresence","setSkillMessage","getErrorMessage","loadSkills","updateSkillEdit","skillKey","updateSkillEnabled","saveSkillApiKey","apiKey","installSkill","installId","getSystemTheme","resolveTheme","clamp01","hasReducedMotionPreference","cleanupThemeTransition","root","startThemeTransition","nextTheme","applyTheme","context","currentTheme","documentReference","document_","prefersReducedMotion","xPercent","yPercent","rect","transition","startNodesPolling","stopNodesPolling","startLogsPolling","stopLogsPolling","startDebugPolling","stopDebugPolling","applySettings","applyResolvedTheme","setLastActiveSessionKey","applySettingsFromUrl","tokenRaw","passwordRaw","sessionRaw","gatewayUrlRaw","shouldCleanUrl","token","password","session","gatewayUrl","setTab","refreshActiveTab","syncUrlWithTab","setTheme","loadOverview","loadChannelsTab","loadCron","refreshChat","inferBasePath","configured","syncThemeWithSettings","resolved","attachThemeListener","detachThemeListener","syncTabWithLocation","replace","setTabFromRoute","onPopState","targetPath","currentPath","syncUrlWithSessionKey","isChatBusy","isChatStopCommand","isChatResetCommand","handleAbortChat","enqueueChatMessage","sendChatMessageNow","ok","flushChatQueue","removeQueuedMessage","handleSendChat","messageOverride","previousDraft","attachmentsToSend","refreshSessions","refreshChatAvatar","flushChatQueueForEvent","resolveAgentIdForSession","buildAvatarMetaUrl","encoded","avatarUrl","normalizeMessage","hasToolId","contentRaw","contentItems","hasToolContent","hasToolName","timestamp","normalizeRoleForGrouping","lower","isToolResultMessage","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","transformCaseFunc","element","lcElement","cleanArray","index","clone","object","newObject","property","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","_isBasicCustomElement","parentNode","childNodes","childCount","childClone","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","tag","entryPoint","hookFunction","purify","me","xe","be","Re","Te","re","se","Oe","Q","we","ye","Pe","Se","ie","$e","U","te","_e","Le","Me","ze","oe","Ae","K","ae","Ce","le","Ie","Ee","Be","ue","qe","ve","pe","De","He","Ze","Ge","Ne","Qe","Fe","je","ce","he","Ue","ne","Ke","We","Xe","ke","J","de","ge","Je","O","ee","fe","marked","allowedTags","allowedAttrs","hooksInstalled","MARKDOWN_CHAR_LIMIT","MARKDOWN_PARSE_LIMIT","MARKDOWN_CACHE_LIMIT","MARKDOWN_CACHE_MAX_CHARS","markdownCache","getCachedMarkdown","cached","setCachedMarkdown","oldest","installHooks","toSanitizedMarkdownHtml","markdown","escapeHtml","sanitized","rendered","COPIED_FOR_MS","ERROR_FOR_MS","COPY_LABEL","COPIED_LABEL","ERROR_LABEL","copyTextToClipboard","setButtonLabel","button","createCopyButton","idleLabel","btn","copied","renderCopyAsMarkdownButton","TOOL_DISPLAY_CONFIG","rawConfig","FALLBACK","TOOL_MAP","normalizeToolName","defaultTitle","normalizeVerb","coerceDisplayValue","firstLine","preview","lookupValueByPath","segment","resolveDetailFromKeys","keys","display","resolveReadDetail","offset","resolveWriteDetail","resolveActionSpec","spec","action","resolveToolDisplay","icon","actionRaw","actionSpec","verb","detail","detailKeys","shortenHomeInString","formatToolDetail","TOOL_INLINE_THRESHOLD","PREVIEW_MAX_LINES","PREVIEW_MAX_CHARS","formatToolOutputForSidebar","getTruncatedPreview","allLines","extractToolCards","normalizeContent","cards","kind","coerceArgs","extractToolText","card","renderToolCardSidebar","onOpenSidebar","hasText","canClick","handleClick","info","isShort","showCollapsed","showInline","isEmpty","nothing","extractImages","images","block","source","mediaType","imageUrl","renderReadingIndicatorGroup","assistant","renderAvatar","renderStreamingGroup","startedAt","renderGroupedMessage","renderMessageGroup","group","normalizedRole","assistantName","who","roleClass","assistantAvatar","initial","className","isAvatarUrl","renderMessageImages","img","isToolResult","toolCards","hasToolCards","hasImages","extractedText","extractedThinking","markdownBase","reasoningMarkdown","canCopyMarkdown","bubbleClasses","unsafeHTML","renderMarkdownSidebar","props","ResizableDivider","LitElement","containerWidth","deltaRatio","newRatio","css","__decorateClass","customElement","adjustTextareaHeight","el","renderCompactionIndicator","generateAttachmentId","handlePaste","items","imageItems","reader","newAttachment","renderAttachmentPreview","renderChat","canCompose","isBusy","canAbort","reasoningLevel","row","showReasoning","assistantIdentity","composePlaceholder","splitRatio","sidebarOpen","thread","repeat","buildChatItems","ref","CHAT_HISTORY_RENDER_LIMIT","groupMessages","currentGroup","history","tools","historyStart","messageKey","messageId","schemaType","schema","defaultValue","pathKey","hintForPath","hints","direct","hintKey","hint","hintSegments","LABEL_TRANSLATIONS","humanize","titleCase","isSensitivePath","META_KEYS","isAnySchema","jsonValue","renderNode","unsupported","disabled","onPatch","showLabel","type","help","nonNull","extractLiteral","literals","allLiterals","resolvedValue","lit","renderSelect","primitiveTypes","variant","normalizedTypes","hasString","hasNumber","renderTextInput","opt","renderObject","renderArray","displayValue","renderNumberInput","inputType","isSensitive","placeholder","numValue","currentIndex","unset","val","sorted","orderA","orderB","reserved","additional","allowExtra","propKey","renderMapField","itemsSchema","arr","reservedKeys","anySchema","entryValue","valuePath","sectionIcons","SECTION_META","getSectionIcon","matchesSearch","query","schemaMatches","propSchema","unions","renderConfigForm","properties","searchQuery","activeSection","activeSubsection","filteredEntries","subsectionContext","sectionSchema","sectionKey","subsectionKey","description","sectionValue","scopedValue","normalizeEnum","filtered","nullable","enumValues","analyzeConfigSchema","normalizeSchemaNode","pathLabel","union","normalizeUnion","enumNullable","normalizedProps","remaining","unique","sidebarIcons","SECTIONS","ALL_SUBSECTION","resolveSectionMeta","resolveSubsections","uiHints","subKey","order","computeDiff","original","changes","compare","orig","curr","origObj","currObj","allKeys","truncateValue","maxLen","str","renderConfig","validity","analysis","formUnsafe","schemaProps","availableSections","knownKeys","extraSections","allSections","activeSectionSchema","activeSectionMeta","subsections","allowSubnav","isAllSubsection","effectiveSubsection","hasRawChanges","hasChanges","canSaveForm","canSave","canApply","canUpdate","section","change","formatDuration","channelEnabled","channels","channelStatus","running","connected","accountActive","account","getChannelAccountCount","channelAccounts","renderChannelAccountCount","count","resolveSchemaNode","resolveChannelValue","config","channelId","fromChannels","renderChannelConfigForm","configValue","renderChannelConfigSection","renderDiscordCard","discord","accountCountLabel","renderGoogleChatCard","googleChat","renderIMessageCard","imessage","isFormDirty","renderNostrProfileForm","callbacks","accountId","isDirty","renderField","field","inputId","renderPicturePreview","picture","createNostrProfileFormState","profile","truncatePubkey","pubkey","renderNostrCard","nostr","nostrAccounts","profileFormState","profileFormCallbacks","onEditProfile","primaryAccount","summaryConfigured","summaryRunning","summaryPublicKey","summaryLastStartAt","summaryLastError","hasMultipleAccounts","showingForm","renderAccountCard","displayName","renderProfileSection","about","nip05","hasAnyProfileData","renderSignalCard","signal","renderSlackCard","slack","renderTelegramCard","telegram","telegramAccounts","botUsername","renderWhatsAppCard","whatsapp","renderChannels","orderedChannels","resolveChannelOrder","channel","renderChannel","showForm","renderGenericChannelCard","resolveChannelLabel","lastError","accounts","renderGenericAccount","resolveChannelMetaMap","RECENT_ACTIVITY_THRESHOLD_MS","hasRecentActivity","deriveRunningStatus","deriveConnectedStatus","runningStatus","connectedStatus","formatPresenceSummary","ip","version","formatPresenceAge","ts","formatNextRun","formatSessionTokens","total","ctx","formatEventPayload","formatCronState","last","formatCronSchedule","formatCronPayload","buildChannelOptions","seen","renderCron","channelOptions","renderScheduleFields","renderJob","renderRun","itemClass","renderDebug","securitySummary","critical","warn","securityTone","securityLabel","evt","renderInstances","renderEntry","lastInput","roles","scopesLabel","formatTime","date","matchesFilter","needle","renderLogs","levelFiltered","exportLabel","renderNodes","bindingState","resolveBindingsState","approvalsState","resolveExecApprovalsState","renderExecApprovals","renderBindings","renderDevices","list","pending","paired","req","renderPendingDevice","device","renderPairedDevice","age","repair","tokens","renderTokenRow","deviceId","when","EXEC_APPROVALS_DEFAULT_SCOPE","SECURITY_OPTIONS","ASK_OPTIONS","nodes","resolveExecNodes","defaultBinding","agents","resolveAgentBindings","ready","normalizeSecurity","normalizeAsk","resolveExecApprovals默认值","resolveConfigAgents","agentsNode","isDefault","resolveExecApprovalsAgents","configAgents","approvalsAgents","merged","agent","aLabel","bLabel","resolveExecApprovalsScope","selected","targetNodes","resolveExecApprovalsNodes","targetNodeId","selectedScope","selectedAgent","allowlist","supportsBinding","renderAgentBinding","targetReady","renderExecApprovalsTarget","renderExecApprovalsTabs","renderExecApprovalsPolicy","renderExecApprovalsAllowlist","hasNodes","nodeValue","first","is默认值","agentSecurity","agentAsk","agentAskFallback","securityValue","askValue","askFallbackValue","autoOverride","autoEffective","autoIsDefault","option","allowlistPath","renderAllowlistEntry","lastUsed","lastCommand","lastPath","bindingValue","cmd","fallbackAgent","exec","execEntry","binding","caps","commands","renderOverview","uptime","tick","authHint","hasToken","hasPassword","insecureContextHint","THINK_LEVELS","BINARY_THINK_LEVELS","VERBOSE_LEVELS","REASONING_LEVELS","normalizeProviderId","provider","isBinaryThinkingProvider","resolveThinkLevelOptions","resolveThinkLevelDisplay","isBinary","resolveThinkLevelPatchValue","renderSessions","rows","renderRow","on删除","rawThinking","isBinaryThinking","thinking","thinkLevels","verbose","reasoning","canLink","chatUrl","formatRemaining","totalSeconds","minutes","renderMetaRow","renderExecApprovalPrompt","active","request","remainingMs","queueCount","renderGatewayUrlConfirmation","pendingGatewayUrl","renderSkills","skills","filter","skill","renderSkill","busy","canInstall","missing","reasons","renderTab","href","renderChatControls","mainSessionKey","resolveMainSessionKey","sessionOptions","resolveSessionOptions","disableThinkingToggle","disableFocusToggle","showThinking","focusActive","refreshIcon","focusIcon","hello","sessions","mainKey","resolvedMain","resolvedCurrent","THEME_ORDER","renderThemeToggle","renderMonitorIcon","renderSunIcon","renderMoonIcon","AVATAR_DATA_RE","AVATAR_HTTP_RE","resolveAssistantAvatarUrl","renderApp","presenceCount","sessionsCount","cronNext","chatDisabledReason","isChat","chatFocus","assistantAvatarUrl","chatAvatarUrl","isGroupCollapsed","hasActiveTab","agentIndex","ratio","DEFAULT_LOG_LEVEL_FILTERS","DEFAULT_CRON_FORM","loadAgents","GATEWAY_CLIENT_IDS","GATEWAY_CLIENT_NAMES","GATEWAY_CLIENT_MODES","buildDeviceAuthPayload","CONNECT_FAILED_CLOSE_CODE","GatewayBrowserClient","ev","reason","delay","isSecureContext","deviceIdentity","canFallbackToShared","authToken","storedToken","auth","signedAtMs","nonce","signature","frame","seq","method","resolve","reject","isRecord","parseExecApprovalRequested","command","createdAtMs","expiresAtMs","parseExecApprovalResolved","pruneExecApprovalQueue","queue","addExecApproval","removeExecApproval","loadAssistantIdentity","normalizeSessionKeyForDefaults","defaultAgentId","applySessionDefaults","resolvedSessionKey","resolvedSettingsSessionKey","resolvedLastActiveSessionKey","nextSessionKey","nextSettings","shouldUpdateSettings","connectGateway","applySnapshot","code","handleGatewayEvent","expected","received","handleGatewayEventUnsafe","handleConnected","handleFirstUpdated","handleDisconnected","handleUpdated","changed","forcedByTab","forcedByLoad","handleWhatsAppStart","handleWhatsAppWait","handleWhatsAppLogout","handleChannelConfigSave","handleChannelConfigReload","parseValidationErrors","details","errors","rawField","resolveNostrAccountId","buildNostrProfileUrl","handleNostrProfileEdit","handleNostrProfileCancel","handleNostrProfileFieldChange","handleNostrProfileToggleAdvanced","handleNostrProfileSave","response","errorMessage","handleNostrProfileImport","nextValues","showAdvanced","injectedAssistantIdentity","resolveOnboardingMode","OpenClawApp","onPopStateInternal","connectGatewayInternal","handleChatScrollInternal","handleLogsScrollInternal","exportLogsInternal","resetToolStreamInternal","resetChatScrollInternal","loadAssistantIdentityInternal","applySettingsInternal","setTabInternal","setThemeInternal","loadOverviewInternal","loadCronInternal","handleAbortChatInternal","removeQueuedMessageInternal","handleSendChatInternal","handleWhatsAppStartInternal","handleWhatsAppWaitInternal","handleWhatsAppLogoutInternal","handleChannelConfigSaveInternal","handleChannelConfigReloadInternal","handleNostrProfileEditInternal","handleNostrProfileCancelInternal","handleNostrProfileFieldChangeInternal","handleNostrProfileSaveInternal","handleNostrProfileImportInternal","handleNostrProfileToggleAdvancedInternal","decision","nextGatewayUrl"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,26,39,40,41,42,43,45,46,47]}