openclaw-botonline 0.1.4

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 (2524) hide show
  1. package/CHANGELOG.md +1273 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +136 -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 +197 -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 +173 -0
  33. package/dist/agents/auth-profiles/constants.js +21 -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 +236 -0
  37. package/dist/agents/auth-profiles/oauth.js +199 -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 +331 -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 +191 -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 +58 -0
  57. package/dist/agents/chutes-oauth.js +133 -0
  58. package/dist/agents/claude-cli-runner.js +3 -0
  59. package/dist/agents/clawdbot-tools.js +124 -0
  60. package/dist/agents/cli-backends.js +126 -0
  61. package/dist/agents/cli-credentials.js +410 -0
  62. package/dist/agents/cli-runner/helpers.js +409 -0
  63. package/dist/agents/cli-runner.js +265 -0
  64. package/dist/agents/cli-session.js +27 -0
  65. package/dist/agents/compaction.js +226 -0
  66. package/dist/agents/context-window-guard.js +37 -0
  67. package/dist/agents/context.js +34 -0
  68. package/dist/agents/date-time.js +158 -0
  69. package/dist/agents/defaults.js +6 -0
  70. package/dist/agents/docs-path.js +20 -0
  71. package/dist/agents/failover-error.js +164 -0
  72. package/dist/agents/identity-avatar.js +82 -0
  73. package/dist/agents/identity-file.js +80 -0
  74. package/dist/agents/identity.js +61 -0
  75. package/dist/agents/lanes.js +2 -0
  76. package/dist/agents/live-auth-keys.js +70 -0
  77. package/dist/agents/live-model-filter.js +70 -0
  78. package/dist/agents/memory-search.js +184 -0
  79. package/dist/agents/minimax-vlm.js +81 -0
  80. package/dist/agents/model-auth.js +285 -0
  81. package/dist/agents/model-catalog.js +95 -0
  82. package/dist/agents/model-compat.js +32 -0
  83. package/dist/agents/model-fallback.js +246 -0
  84. package/dist/agents/model-scan.js +350 -0
  85. package/dist/agents/model-selection.js +284 -0
  86. package/dist/agents/models-config.js +111 -0
  87. package/dist/agents/models-config.providers.js +630 -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 +436 -0
  92. package/dist/agents/pi-embedded-helpers/google.js +36 -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 +406 -0
  104. package/dist/agents/pi-embedded-runner/extensions.js +59 -0
  105. package/dist/agents/pi-embedded-runner/extra-params.js +70 -0
  106. package/dist/agents/pi-embedded-runner/google.js +304 -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 +72 -0
  111. package/dist/agents/pi-embedded-runner/run/attempt.js +749 -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 +535 -0
  117. package/dist/agents/pi-embedded-runner/runs.js +107 -0
  118. package/dist/agents/pi-embedded-runner/sandbox-info.js +25 -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.js +223 -0
  138. package/dist/agents/pi-extensions/context-pruning/extension.js +32 -0
  139. package/dist/agents/pi-extensions/context-pruning/pruner.js +263 -0
  140. package/dist/agents/pi-extensions/context-pruning/runtime.js +21 -0
  141. package/dist/agents/pi-extensions/context-pruning/settings.js +71 -0
  142. package/dist/agents/pi-extensions/context-pruning/tools.js +44 -0
  143. package/dist/agents/pi-extensions/context-pruning.js +9 -0
  144. package/dist/agents/pi-settings.js +19 -0
  145. package/dist/agents/pi-tool-definition-adapter.js +74 -0
  146. package/dist/agents/pi-tools.abort.js +41 -0
  147. package/dist/agents/pi-tools.js +289 -0
  148. package/dist/agents/pi-tools.policy.js +212 -0
  149. package/dist/agents/pi-tools.read.js +227 -0
  150. package/dist/agents/pi-tools.schema.js +147 -0
  151. package/dist/agents/pi-tools.types.js +1 -0
  152. package/dist/agents/pty-dsr.js +13 -0
  153. package/dist/agents/pty-keys.js +235 -0
  154. package/dist/agents/sandbox/browser-bridges.js +1 -0
  155. package/dist/agents/sandbox/browser.js +178 -0
  156. package/dist/agents/sandbox/config-hash.js +45 -0
  157. package/dist/agents/sandbox/config.js +126 -0
  158. package/dist/agents/sandbox/constants.js +45 -0
  159. package/dist/agents/sandbox/context.js +117 -0
  160. package/dist/agents/sandbox/docker.js +272 -0
  161. package/dist/agents/sandbox/manage.js +91 -0
  162. package/dist/agents/sandbox/prune.js +87 -0
  163. package/dist/agents/sandbox/registry.js +71 -0
  164. package/dist/agents/sandbox/runtime-status.js +90 -0
  165. package/dist/agents/sandbox/shared.js +38 -0
  166. package/dist/agents/sandbox/tool-policy.js +106 -0
  167. package/dist/agents/sandbox/types.docker.js +1 -0
  168. package/dist/agents/sandbox/types.js +1 -0
  169. package/dist/agents/sandbox/workspace.js +39 -0
  170. package/dist/agents/sandbox-paths.js +68 -0
  171. package/dist/agents/sandbox.js +7 -0
  172. package/dist/agents/schema/clean-for-gemini.js +295 -0
  173. package/dist/agents/schema/typebox.js +22 -0
  174. package/dist/agents/session-slug.js +134 -0
  175. package/dist/agents/session-tool-result-guard-wrapper.js +34 -0
  176. package/dist/agents/session-tool-result-guard.js +99 -0
  177. package/dist/agents/session-transcript-repair.js +174 -0
  178. package/dist/agents/session-write-lock.js +102 -0
  179. package/dist/agents/shell-utils.js +99 -0
  180. package/dist/agents/skills/bundled-dir.js +30 -0
  181. package/dist/agents/skills/config.js +141 -0
  182. package/dist/agents/skills/env-overrides.js +67 -0
  183. package/dist/agents/skills/frontmatter.js +119 -0
  184. package/dist/agents/skills/plugin-skills.js +55 -0
  185. package/dist/agents/skills/refresh.js +135 -0
  186. package/dist/agents/skills/serialize.js +13 -0
  187. package/dist/agents/skills/types.js +1 -0
  188. package/dist/agents/skills/workspace.js +272 -0
  189. package/dist/agents/skills-install.js +390 -0
  190. package/dist/agents/skills-status.js +183 -0
  191. package/dist/agents/skills.js +13 -0
  192. package/dist/agents/subagent-announce-queue.js +129 -0
  193. package/dist/agents/subagent-announce.js +394 -0
  194. package/dist/agents/subagent-registry.js +343 -0
  195. package/dist/agents/subagent-registry.store.js +73 -0
  196. package/dist/agents/synthetic-models.js +182 -0
  197. package/dist/agents/system-prompt-params.js +70 -0
  198. package/dist/agents/system-prompt-report.js +113 -0
  199. package/dist/agents/system-prompt.js +474 -0
  200. package/dist/agents/test-helpers/fast-coding-tools.js +18 -0
  201. package/dist/agents/test-helpers/fast-core-tools.js +24 -0
  202. package/dist/agents/timeout.js +24 -0
  203. package/dist/agents/tool-call-id.js +164 -0
  204. package/dist/agents/tool-display.js +209 -0
  205. package/dist/agents/tool-display.json +308 -0
  206. package/dist/agents/tool-images.js +166 -0
  207. package/dist/agents/tool-policy.js +193 -0
  208. package/dist/agents/tool-summaries.js +10 -0
  209. package/dist/agents/tools/agent-step.js +44 -0
  210. package/dist/agents/tools/agents-list-tool.js +66 -0
  211. package/dist/agents/tools/browser-tool.js +656 -0
  212. package/dist/agents/tools/browser-tool.schema.js +106 -0
  213. package/dist/agents/tools/canvas-tool.js +158 -0
  214. package/dist/agents/tools/common.js +146 -0
  215. package/dist/agents/tools/cron-tool.js +261 -0
  216. package/dist/agents/tools/discord-actions-guild.js +453 -0
  217. package/dist/agents/tools/discord-actions-messaging.js +383 -0
  218. package/dist/agents/tools/discord-actions-moderation.js +92 -0
  219. package/dist/agents/tools/discord-actions.js +61 -0
  220. package/dist/agents/tools/gateway-tool.js +214 -0
  221. package/dist/agents/tools/gateway.js +30 -0
  222. package/dist/agents/tools/image-tool.helpers.js +55 -0
  223. package/dist/agents/tools/image-tool.js +372 -0
  224. package/dist/agents/tools/memory-tool.js +103 -0
  225. package/dist/agents/tools/message-tool.js +319 -0
  226. package/dist/agents/tools/nodes-tool.js +403 -0
  227. package/dist/agents/tools/nodes-utils.js +92 -0
  228. package/dist/agents/tools/session-status-tool.js +357 -0
  229. package/dist/agents/tools/sessions-announce-target.js +43 -0
  230. package/dist/agents/tools/sessions-helpers.js +261 -0
  231. package/dist/agents/tools/sessions-history-tool.js +118 -0
  232. package/dist/agents/tools/sessions-list-tool.js +161 -0
  233. package/dist/agents/tools/sessions-send-helpers.js +116 -0
  234. package/dist/agents/tools/sessions-send-tool.a2a.js +119 -0
  235. package/dist/agents/tools/sessions-send-tool.js +345 -0
  236. package/dist/agents/tools/sessions-spawn-tool.js +232 -0
  237. package/dist/agents/tools/slack-actions.js +243 -0
  238. package/dist/agents/tools/telegram-actions.js +162 -0
  239. package/dist/agents/tools/tts-tool.js +71 -0
  240. package/dist/agents/tools/web-fetch-utils.js +104 -0
  241. package/dist/agents/tools/web-fetch.js +477 -0
  242. package/dist/agents/tools/web-search.js +374 -0
  243. package/dist/agents/tools/web-shared.js +62 -0
  244. package/dist/agents/tools/web-tools.js +2 -0
  245. package/dist/agents/tools/whatsapp-actions.js +32 -0
  246. package/dist/agents/transcript-policy.js +83 -0
  247. package/dist/agents/usage.js +48 -0
  248. package/dist/agents/venice-models.js +342 -0
  249. package/dist/agents/workspace.js +250 -0
  250. package/dist/auto-reply/chunk.js +358 -0
  251. package/dist/auto-reply/command-auth.js +132 -0
  252. package/dist/auto-reply/command-detection.js +56 -0
  253. package/dist/auto-reply/commands-args.js +85 -0
  254. package/dist/auto-reply/commands-help.js +91 -0
  255. package/dist/auto-reply/commands-i18n.js +265 -0
  256. package/dist/auto-reply/commands-registry.data.js +509 -0
  257. package/dist/auto-reply/commands-registry.js +351 -0
  258. package/dist/auto-reply/commands-registry.types.js +1 -0
  259. package/dist/auto-reply/dispatch.js +40 -0
  260. package/dist/auto-reply/envelope.js +173 -0
  261. package/dist/auto-reply/group-activation.js +22 -0
  262. package/dist/auto-reply/heartbeat.js +120 -0
  263. package/dist/auto-reply/inbound-debounce.js +74 -0
  264. package/dist/auto-reply/media-note.js +72 -0
  265. package/dist/auto-reply/model.js +28 -0
  266. package/dist/auto-reply/reply/abort.js +150 -0
  267. package/dist/auto-reply/reply/agent-runner-execution.js +462 -0
  268. package/dist/auto-reply/reply/agent-runner-helpers.js +65 -0
  269. package/dist/auto-reply/reply/agent-runner-memory.js +156 -0
  270. package/dist/auto-reply/reply/agent-runner-payloads.js +85 -0
  271. package/dist/auto-reply/reply/agent-runner-utils.js +101 -0
  272. package/dist/auto-reply/reply/agent-runner.js +379 -0
  273. package/dist/auto-reply/reply/audio-tags.js +1 -0
  274. package/dist/auto-reply/reply/bash-command.js +336 -0
  275. package/dist/auto-reply/reply/block-reply-coalescer.js +101 -0
  276. package/dist/auto-reply/reply/block-reply-pipeline.js +179 -0
  277. package/dist/auto-reply/reply/block-streaming.js +91 -0
  278. package/dist/auto-reply/reply/body.js +37 -0
  279. package/dist/auto-reply/reply/commands-allowlist.js +570 -0
  280. package/dist/auto-reply/reply/commands-approve.js +88 -0
  281. package/dist/auto-reply/reply/commands-bash.js +25 -0
  282. package/dist/auto-reply/reply/commands-compact.js +106 -0
  283. package/dist/auto-reply/reply/commands-config.js +239 -0
  284. package/dist/auto-reply/reply/commands-context-report.js +294 -0
  285. package/dist/auto-reply/reply/commands-context.js +29 -0
  286. package/dist/auto-reply/reply/commands-core.js +101 -0
  287. package/dist/auto-reply/reply/commands-info.js +112 -0
  288. package/dist/auto-reply/reply/commands-models.js +201 -0
  289. package/dist/auto-reply/reply/commands-plugin.js +35 -0
  290. package/dist/auto-reply/reply/commands-session.js +311 -0
  291. package/dist/auto-reply/reply/commands-status.js +178 -0
  292. package/dist/auto-reply/reply/commands-subagents.js +357 -0
  293. package/dist/auto-reply/reply/commands-tts.js +228 -0
  294. package/dist/auto-reply/reply/commands-types.js +1 -0
  295. package/dist/auto-reply/reply/commands.js +3 -0
  296. package/dist/auto-reply/reply/config-commands.js +58 -0
  297. package/dist/auto-reply/reply/config-value.js +35 -0
  298. package/dist/auto-reply/reply/debug-commands.js +58 -0
  299. package/dist/auto-reply/reply/directive-handling.auth.js +191 -0
  300. package/dist/auto-reply/reply/directive-handling.fast-lane.js +60 -0
  301. package/dist/auto-reply/reply/directive-handling.impl.js +380 -0
  302. package/dist/auto-reply/reply/directive-handling.js +5 -0
  303. package/dist/auto-reply/reply/directive-handling.model-picker.js +64 -0
  304. package/dist/auto-reply/reply/directive-handling.model.js +279 -0
  305. package/dist/auto-reply/reply/directive-handling.parse.js +84 -0
  306. package/dist/auto-reply/reply/directive-handling.persist.js +181 -0
  307. package/dist/auto-reply/reply/directive-handling.queue-validation.js +48 -0
  308. package/dist/auto-reply/reply/directive-handling.shared.js +43 -0
  309. package/dist/auto-reply/reply/directives.js +114 -0
  310. package/dist/auto-reply/reply/dispatch-from-config.js +289 -0
  311. package/dist/auto-reply/reply/exec/directive.js +183 -0
  312. package/dist/auto-reply/reply/exec.js +1 -0
  313. package/dist/auto-reply/reply/followup-runner.js +222 -0
  314. package/dist/auto-reply/reply/get-reply-directives-apply.js +201 -0
  315. package/dist/auto-reply/reply/get-reply-directives-utils.js +45 -0
  316. package/dist/auto-reply/reply/get-reply-directives.js +343 -0
  317. package/dist/auto-reply/reply/get-reply-inline-actions.js +257 -0
  318. package/dist/auto-reply/reply/get-reply-run.js +282 -0
  319. package/dist/auto-reply/reply/get-reply.js +234 -0
  320. package/dist/auto-reply/reply/groups.js +102 -0
  321. package/dist/auto-reply/reply/history.js +87 -0
  322. package/dist/auto-reply/reply/inbound-context.js +51 -0
  323. package/dist/auto-reply/reply/inbound-dedupe.js +39 -0
  324. package/dist/auto-reply/reply/inbound-sender-meta.js +45 -0
  325. package/dist/auto-reply/reply/inbound-text.js +3 -0
  326. package/dist/auto-reply/reply/line-directives.js +294 -0
  327. package/dist/auto-reply/reply/memory-flush.js +66 -0
  328. package/dist/auto-reply/reply/mentions.js +122 -0
  329. package/dist/auto-reply/reply/model-selection.js +398 -0
  330. package/dist/auto-reply/reply/normalize-reply.js +54 -0
  331. package/dist/auto-reply/reply/provider-dispatcher.js +19 -0
  332. package/dist/auto-reply/reply/queue/cleanup.js +19 -0
  333. package/dist/auto-reply/reply/queue/directive.js +155 -0
  334. package/dist/auto-reply/reply/queue/drain.js +111 -0
  335. package/dist/auto-reply/reply/queue/enqueue.js +43 -0
  336. package/dist/auto-reply/reply/queue/normalize.js +30 -0
  337. package/dist/auto-reply/reply/queue/settings.js +52 -0
  338. package/dist/auto-reply/reply/queue/state.js +53 -0
  339. package/dist/auto-reply/reply/queue/types.js +1 -0
  340. package/dist/auto-reply/reply/queue.js +6 -0
  341. package/dist/auto-reply/reply/reply-directives.js +30 -0
  342. package/dist/auto-reply/reply/reply-dispatcher.js +100 -0
  343. package/dist/auto-reply/reply/reply-elevated.js +166 -0
  344. package/dist/auto-reply/reply/reply-inline.js +28 -0
  345. package/dist/auto-reply/reply/reply-payloads.js +83 -0
  346. package/dist/auto-reply/reply/reply-reference.js +35 -0
  347. package/dist/auto-reply/reply/reply-tags.js +13 -0
  348. package/dist/auto-reply/reply/reply-threading.js +41 -0
  349. package/dist/auto-reply/reply/response-prefix-template.js +76 -0
  350. package/dist/auto-reply/reply/route-reply.js +108 -0
  351. package/dist/auto-reply/reply/session-reset-model.js +133 -0
  352. package/dist/auto-reply/reply/session-updates.js +228 -0
  353. package/dist/auto-reply/reply/session-usage.js +79 -0
  354. package/dist/auto-reply/reply/session.js +303 -0
  355. package/dist/auto-reply/reply/stage-sandbox-media.js +146 -0
  356. package/dist/auto-reply/reply/streaming-directives.js +92 -0
  357. package/dist/auto-reply/reply/subagents-utils.js +52 -0
  358. package/dist/auto-reply/reply/test-ctx.js +15 -0
  359. package/dist/auto-reply/reply/typing-mode.js +91 -0
  360. package/dist/auto-reply/reply/typing.js +132 -0
  361. package/dist/auto-reply/reply.js +5 -0
  362. package/dist/auto-reply/send-policy.js +30 -0
  363. package/dist/auto-reply/skill-commands.js +97 -0
  364. package/dist/auto-reply/status.js +399 -0
  365. package/dist/auto-reply/templating.js +39 -0
  366. package/dist/auto-reply/thinking.js +154 -0
  367. package/dist/auto-reply/tokens.js +15 -0
  368. package/dist/auto-reply/tool-meta.js +112 -0
  369. package/dist/auto-reply/types.js +1 -0
  370. package/dist/browser/bridge-server.js +47 -0
  371. package/dist/browser/cdp.helpers.js +136 -0
  372. package/dist/browser/cdp.js +293 -0
  373. package/dist/browser/chrome.executables.js +509 -0
  374. package/dist/browser/chrome.js +253 -0
  375. package/dist/browser/chrome.profile-decoration.js +144 -0
  376. package/dist/browser/client-actions-core.js +94 -0
  377. package/dist/browser/client-actions-observe.js +94 -0
  378. package/dist/browser/client-actions-state.js +163 -0
  379. package/dist/browser/client-actions-types.js +1 -0
  380. package/dist/browser/client-actions.js +4 -0
  381. package/dist/browser/client-fetch.js +78 -0
  382. package/dist/browser/client.js +139 -0
  383. package/dist/browser/config.js +193 -0
  384. package/dist/browser/constants.js +8 -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 +453 -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 +174 -0
  410. package/dist/browser/routes/index.js +8 -0
  411. package/dist/browser/routes/tabs.js +120 -0
  412. package/dist/browser/routes/utils.js +57 -0
  413. package/dist/browser/screenshot.js +39 -0
  414. package/dist/browser/server-context.js +533 -0
  415. package/dist/browser/server-context.types.js +1 -0
  416. package/dist/browser/server.js +92 -0
  417. package/dist/browser/target-id.js +16 -0
  418. package/dist/browser/trash.js +21 -0
  419. package/dist/build-info.json +5 -0
  420. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  421. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  422. package/dist/canvas-host/a2ui/index.html +307 -0
  423. package/dist/canvas-host/a2ui.js +196 -0
  424. package/dist/canvas-host/server.js +380 -0
  425. package/dist/channel-web.js +8 -0
  426. package/dist/channels/ack-reactions.js +56 -0
  427. package/dist/channels/allowlist-match.js +3 -0
  428. package/dist/channels/allowlists/resolve-utils.js +37 -0
  429. package/dist/channels/channel-config.js +131 -0
  430. package/dist/channels/chat-type.js +12 -0
  431. package/dist/channels/command-gating.js +24 -0
  432. package/dist/channels/conversation-label.js +48 -0
  433. package/dist/channels/dock.js +355 -0
  434. package/dist/channels/location.js +44 -0
  435. package/dist/channels/logging.js +13 -0
  436. package/dist/channels/mention-gating.js +26 -0
  437. package/dist/channels/plugins/actions/discord/handle-action.guild-admin.js +328 -0
  438. package/dist/channels/plugins/actions/discord/handle-action.js +165 -0
  439. package/dist/channels/plugins/actions/discord.js +93 -0
  440. package/dist/channels/plugins/actions/signal.js +115 -0
  441. package/dist/channels/plugins/actions/telegram.js +95 -0
  442. package/dist/channels/plugins/agent-tools/whatsapp-login.js +63 -0
  443. package/dist/channels/plugins/allowlist-match.js +1 -0
  444. package/dist/channels/plugins/bluebubbles-actions.js +16 -0
  445. package/dist/channels/plugins/catalog.js +216 -0
  446. package/dist/channels/plugins/channel-config.js +1 -0
  447. package/dist/channels/plugins/config-helpers.js +87 -0
  448. package/dist/channels/plugins/config-schema.js +8 -0
  449. package/dist/channels/plugins/config-writes.js +21 -0
  450. package/dist/channels/plugins/directory-config.js +185 -0
  451. package/dist/channels/plugins/group-mentions.js +267 -0
  452. package/dist/channels/plugins/helpers.js +12 -0
  453. package/dist/channels/plugins/index.js +51 -0
  454. package/dist/channels/plugins/load.js +22 -0
  455. package/dist/channels/plugins/media-limits.js +15 -0
  456. package/dist/channels/plugins/message-action-names.js +50 -0
  457. package/dist/channels/plugins/message-actions.js +35 -0
  458. package/dist/channels/plugins/normalize/discord.js +18 -0
  459. package/dist/channels/plugins/normalize/feishu.js +3 -0
  460. package/dist/channels/plugins/normalize/imessage.js +36 -0
  461. package/dist/channels/plugins/normalize/signal.js +52 -0
  462. package/dist/channels/plugins/normalize/slack.js +19 -0
  463. package/dist/channels/plugins/normalize/telegram.js +31 -0
  464. package/dist/channels/plugins/normalize/whatsapp.js +17 -0
  465. package/dist/channels/plugins/onboarding/channel-access.js +68 -0
  466. package/dist/channels/plugins/onboarding/discord.js +413 -0
  467. package/dist/channels/plugins/onboarding/helpers.js +33 -0
  468. package/dist/channels/plugins/onboarding/imessage.js +231 -0
  469. package/dist/channels/plugins/onboarding/signal.js +262 -0
  470. package/dist/channels/plugins/onboarding/slack.js +470 -0
  471. package/dist/channels/plugins/onboarding/telegram.js +281 -0
  472. package/dist/channels/plugins/onboarding/whatsapp.js +286 -0
  473. package/dist/channels/plugins/onboarding-types.js +1 -0
  474. package/dist/channels/plugins/outbound/discord.js +29 -0
  475. package/dist/channels/plugins/outbound/feishu.js +23 -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 +91 -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 +164 -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/text-commands.js +95 -0
  504. package/dist/channels/typing.js +17 -0
  505. package/dist/channels/web/index.js +2 -0
  506. package/dist/cli/acp-cli.js +61 -0
  507. package/dist/cli/argv.js +119 -0
  508. package/dist/cli/banner.js +94 -0
  509. package/dist/cli/browser-cli-actions-input/register.element.js +200 -0
  510. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +128 -0
  511. package/dist/cli/browser-cli-actions-input/register.form-wait-eval.js +108 -0
  512. package/dist/cli/browser-cli-actions-input/register.js +10 -0
  513. package/dist/cli/browser-cli-actions-input/register.navigation.js +63 -0
  514. package/dist/cli/browser-cli-actions-input/shared.js +50 -0
  515. package/dist/cli/browser-cli-actions-input.js +1 -0
  516. package/dist/cli/browser-cli-actions-observe.js +82 -0
  517. package/dist/cli/browser-cli-debug.js +148 -0
  518. package/dist/cli/browser-cli-examples.js +33 -0
  519. package/dist/cli/browser-cli-extension.js +98 -0
  520. package/dist/cli/browser-cli-inspect.js +130 -0
  521. package/dist/cli/browser-cli-manage.js +351 -0
  522. package/dist/cli/browser-cli-serve.js +91 -0
  523. package/dist/cli/browser-cli-shared.js +1 -0
  524. package/dist/cli/browser-cli-state.cookies-storage.js +166 -0
  525. package/dist/cli/browser-cli-state.js +261 -0
  526. package/dist/cli/browser-cli.js +38 -0
  527. package/dist/cli/channel-auth.js +49 -0
  528. package/dist/cli/channel-options.js +29 -0
  529. package/dist/cli/channels-cli.js +238 -0
  530. package/dist/cli/cli-utils.js +34 -0
  531. package/dist/cli/command-format.js +14 -0
  532. package/dist/cli/command-options.js +6 -0
  533. package/dist/cli/config-cli.js +295 -0
  534. package/dist/cli/cron-cli/register.cron-add.js +188 -0
  535. package/dist/cli/cron-cli/register.cron-edit.js +160 -0
  536. package/dist/cli/cron-cli/register.cron-simple.js +98 -0
  537. package/dist/cli/cron-cli/register.js +16 -0
  538. package/dist/cli/cron-cli/shared.js +178 -0
  539. package/dist/cli/cron-cli.js +1 -0
  540. package/dist/cli/daemon-cli/install.js +112 -0
  541. package/dist/cli/daemon-cli/lifecycle.js +283 -0
  542. package/dist/cli/daemon-cli/probe.js +28 -0
  543. package/dist/cli/daemon-cli/register.js +69 -0
  544. package/dist/cli/daemon-cli/response.js +20 -0
  545. package/dist/cli/daemon-cli/runners.js +3 -0
  546. package/dist/cli/daemon-cli/shared.js +162 -0
  547. package/dist/cli/daemon-cli/status.gather.js +170 -0
  548. package/dist/cli/daemon-cli/status.js +19 -0
  549. package/dist/cli/daemon-cli/status.print.js +241 -0
  550. package/dist/cli/daemon-cli/types.js +1 -0
  551. package/dist/cli/daemon-cli.js +2 -0
  552. package/dist/cli/deps.js +28 -0
  553. package/dist/cli/devices-cli.js +181 -0
  554. package/dist/cli/directory-cli.js +227 -0
  555. package/dist/cli/dns-cli.js +199 -0
  556. package/dist/cli/docs-cli.js +17 -0
  557. package/dist/cli/exec-approvals-cli.js +378 -0
  558. package/dist/cli/gateway-cli/call.js +25 -0
  559. package/dist/cli/gateway-cli/dev.js +99 -0
  560. package/dist/cli/gateway-cli/discover.js +88 -0
  561. package/dist/cli/gateway-cli/register.js +255 -0
  562. package/dist/cli/gateway-cli/run-loop.js +87 -0
  563. package/dist/cli/gateway-cli/run.js +265 -0
  564. package/dist/cli/gateway-cli/shared.js +101 -0
  565. package/dist/cli/gateway-cli.js +1 -0
  566. package/dist/cli/gateway-rpc.js +27 -0
  567. package/dist/cli/help-format.js +16 -0
  568. package/dist/cli/hooks-cli.js +709 -0
  569. package/dist/cli/logs-cli.js +222 -0
  570. package/dist/cli/memory-cli.js +527 -0
  571. package/dist/cli/models-cli.js +319 -0
  572. package/dist/cli/node-cli/daemon.js +484 -0
  573. package/dist/cli/node-cli/register.js +81 -0
  574. package/dist/cli/node-cli.js +1 -0
  575. package/dist/cli/nodes-camera.js +50 -0
  576. package/dist/cli/nodes-canvas.js +24 -0
  577. package/dist/cli/nodes-cli/a2ui-jsonl.js +81 -0
  578. package/dist/cli/nodes-cli/cli-utils.js +27 -0
  579. package/dist/cli/nodes-cli/format.js +35 -0
  580. package/dist/cli/nodes-cli/register.camera.js +193 -0
  581. package/dist/cli/nodes-cli/register.canvas.js +215 -0
  582. package/dist/cli/nodes-cli/register.invoke.js +303 -0
  583. package/dist/cli/nodes-cli/register.js +24 -0
  584. package/dist/cli/nodes-cli/register.location.js +64 -0
  585. package/dist/cli/nodes-cli/register.notify.js +51 -0
  586. package/dist/cli/nodes-cli/register.pairing.js +99 -0
  587. package/dist/cli/nodes-cli/register.screen.js +66 -0
  588. package/dist/cli/nodes-cli/register.status.js +328 -0
  589. package/dist/cli/nodes-cli/rpc.js +88 -0
  590. package/dist/cli/nodes-cli/types.js +1 -0
  591. package/dist/cli/nodes-cli.js +1 -0
  592. package/dist/cli/nodes-run.js +19 -0
  593. package/dist/cli/nodes-screen.js +35 -0
  594. package/dist/cli/outbound-send-deps.js +11 -0
  595. package/dist/cli/pairing-cli.js +115 -0
  596. package/dist/cli/parse-duration.js +28 -0
  597. package/dist/cli/parse-timeout.js +18 -0
  598. package/dist/cli/plugin-registry.js +24 -0
  599. package/dist/cli/plugins-cli.js +469 -0
  600. package/dist/cli/ports.js +101 -0
  601. package/dist/cli/profile-utils.js +17 -0
  602. package/dist/cli/profile.js +86 -0
  603. package/dist/cli/program/build-program.js +14 -0
  604. package/dist/cli/program/command-registry.js +148 -0
  605. package/dist/cli/program/config-guard.js +67 -0
  606. package/dist/cli/program/context.js +11 -0
  607. package/dist/cli/program/help.js +71 -0
  608. package/dist/cli/program/helpers.js +26 -0
  609. package/dist/cli/program/message/helpers.js +46 -0
  610. package/dist/cli/program/message/register.broadcast.js +11 -0
  611. package/dist/cli/program/message/register.discord-admin.js +119 -0
  612. package/dist/cli/program/message/register.emoji-sticker.js +43 -0
  613. package/dist/cli/program/message/register.permissions-search.js +22 -0
  614. package/dist/cli/program/message/register.pins.js +23 -0
  615. package/dist/cli/program/message/register.poll.js +13 -0
  616. package/dist/cli/program/message/register.reactions.js +21 -0
  617. package/dist/cli/program/message/register.read-edit-delete.js +30 -0
  618. package/dist/cli/program/message/register.send.js +17 -0
  619. package/dist/cli/program/message/register.thread.js +32 -0
  620. package/dist/cli/program/preaction.js +46 -0
  621. package/dist/cli/program/register.agent.js +162 -0
  622. package/dist/cli/program/register.configure.js +32 -0
  623. package/dist/cli/program/register.maintenance.js +91 -0
  624. package/dist/cli/program/register.message.js +54 -0
  625. package/dist/cli/program/register.onboard.js +124 -0
  626. package/dist/cli/program/register.setup.js +41 -0
  627. package/dist/cli/program/register.status-health-sessions.js +109 -0
  628. package/dist/cli/program/register.subclis.js +279 -0
  629. package/dist/cli/program.js +2 -0
  630. package/dist/cli/progress.js +165 -0
  631. package/dist/cli/prompt.js +17 -0
  632. package/dist/cli/route.js +29 -0
  633. package/dist/cli/run-main.js +101 -0
  634. package/dist/cli/sandbox-cli.js +109 -0
  635. package/dist/cli/security-cli.js +113 -0
  636. package/dist/cli/skills-cli.js +341 -0
  637. package/dist/cli/system-cli.js +98 -0
  638. package/dist/cli/tagline.js +208 -0
  639. package/dist/cli/tui-cli.js +44 -0
  640. package/dist/cli/update-cli.js +997 -0
  641. package/dist/cli/wait.js +8 -0
  642. package/dist/cli/webhooks-cli.js +140 -0
  643. package/dist/commands/agent/delivery.js +140 -0
  644. package/dist/commands/agent/run-context.js +27 -0
  645. package/dist/commands/agent/session-store.js +43 -0
  646. package/dist/commands/agent/session.js +74 -0
  647. package/dist/commands/agent/types.js +1 -0
  648. package/dist/commands/agent-via-gateway.js +119 -0
  649. package/dist/commands/agent.js +438 -0
  650. package/dist/commands/agents.bindings.js +126 -0
  651. package/dist/commands/agents.command-shared.js +18 -0
  652. package/dist/commands/agents.commands.add.js +294 -0
  653. package/dist/commands/agents.commands.delete.js +75 -0
  654. package/dist/commands/agents.commands.identity.js +168 -0
  655. package/dist/commands/agents.commands.list.js +98 -0
  656. package/dist/commands/agents.config.js +145 -0
  657. package/dist/commands/agents.js +6 -0
  658. package/dist/commands/agents.providers.js +140 -0
  659. package/dist/commands/auth-choice-options.js +259 -0
  660. package/dist/commands/auth-choice-prompt.js +36 -0
  661. package/dist/commands/auth-choice.api-key.js +34 -0
  662. package/dist/commands/auth-choice.apply.anthropic.js +180 -0
  663. package/dist/commands/auth-choice.apply.api-providers.js +641 -0
  664. package/dist/commands/auth-choice.apply.copilot-proxy.js +10 -0
  665. package/dist/commands/auth-choice.apply.github-copilot.js +47 -0
  666. package/dist/commands/auth-choice.apply.google-antigravity.js +10 -0
  667. package/dist/commands/auth-choice.apply.google-gemini-cli.js +10 -0
  668. package/dist/commands/auth-choice.apply.js +34 -0
  669. package/dist/commands/auth-choice.apply.minimax.js +90 -0
  670. package/dist/commands/auth-choice.apply.oauth.js +78 -0
  671. package/dist/commands/auth-choice.apply.openai.js +149 -0
  672. package/dist/commands/auth-choice.apply.plugin-provider.js +140 -0
  673. package/dist/commands/auth-choice.apply.qwen-portal.js +10 -0
  674. package/dist/commands/auth-choice.apply.volcengine.js +160 -0
  675. package/dist/commands/auth-choice.apply.xiaomi.js +149 -0
  676. package/dist/commands/auth-choice.default-model.js +12 -0
  677. package/dist/commands/auth-choice.js +3 -0
  678. package/dist/commands/auth-choice.model-check.js +61 -0
  679. package/dist/commands/auth-choice.preferred-provider.js +37 -0
  680. package/dist/commands/auth-token.js +32 -0
  681. package/dist/commands/channels/add-mutators.js +49 -0
  682. package/dist/commands/channels/add.js +210 -0
  683. package/dist/commands/channels/capabilities.js +439 -0
  684. package/dist/commands/channels/list.js +145 -0
  685. package/dist/commands/channels/logs.js +85 -0
  686. package/dist/commands/channels/remove.js +114 -0
  687. package/dist/commands/channels/resolve.js +107 -0
  688. package/dist/commands/channels/shared.js +41 -0
  689. package/dist/commands/channels/status.js +238 -0
  690. package/dist/commands/channels.js +7 -0
  691. package/dist/commands/chutes-oauth.js +144 -0
  692. package/dist/commands/cleanup-utils.js +74 -0
  693. package/dist/commands/configure.channels.js +52 -0
  694. package/dist/commands/configure.commands.js +8 -0
  695. package/dist/commands/configure.daemon.js +101 -0
  696. package/dist/commands/configure.gateway-auth.js +73 -0
  697. package/dist/commands/configure.gateway.js +168 -0
  698. package/dist/commands/configure.js +4 -0
  699. package/dist/commands/configure.shared.js +49 -0
  700. package/dist/commands/configure.wizard.js +464 -0
  701. package/dist/commands/daemon-install-helpers.js +51 -0
  702. package/dist/commands/daemon-runtime.js +11 -0
  703. package/dist/commands/dashboard.js +47 -0
  704. package/dist/commands/docs.js +148 -0
  705. package/dist/commands/doctor-auth.js +117 -0
  706. package/dist/commands/doctor-config-flow.js +188 -0
  707. package/dist/commands/doctor-format.js +85 -0
  708. package/dist/commands/doctor-gateway-daemon-flow.js +201 -0
  709. package/dist/commands/doctor-gateway-health.js +43 -0
  710. package/dist/commands/doctor-gateway-services.js +209 -0
  711. package/dist/commands/doctor-install.js +27 -0
  712. package/dist/commands/doctor-legacy-config.js +42 -0
  713. package/dist/commands/doctor-platform-notes.js +66 -0
  714. package/dist/commands/doctor-prompter.js +64 -0
  715. package/dist/commands/doctor-sandbox.js +207 -0
  716. package/dist/commands/doctor-security.js +141 -0
  717. package/dist/commands/doctor-state-integrity.js +332 -0
  718. package/dist/commands/doctor-state-migrations.js +1 -0
  719. package/dist/commands/doctor-ui.js +119 -0
  720. package/dist/commands/doctor-update.js +65 -0
  721. package/dist/commands/doctor-workspace-status.js +56 -0
  722. package/dist/commands/doctor-workspace.js +69 -0
  723. package/dist/commands/doctor.js +251 -0
  724. package/dist/commands/feishu.js +125 -0
  725. package/dist/commands/gateway-status/helpers.js +200 -0
  726. package/dist/commands/gateway-status.js +300 -0
  727. package/dist/commands/google-gemini-model-default.js +33 -0
  728. package/dist/commands/health-format.js +37 -0
  729. package/dist/commands/health.js +595 -0
  730. package/dist/commands/message-format.js +345 -0
  731. package/dist/commands/message.js +45 -0
  732. package/dist/commands/model-picker.js +436 -0
  733. package/dist/commands/models/aliases.js +92 -0
  734. package/dist/commands/models/auth-order.js +95 -0
  735. package/dist/commands/models/auth.js +333 -0
  736. package/dist/commands/models/fallbacks.js +126 -0
  737. package/dist/commands/models/image-fallbacks.js +126 -0
  738. package/dist/commands/models/list.auth-overview.js +93 -0
  739. package/dist/commands/models/list.configured.js +80 -0
  740. package/dist/commands/models/list.format.js +41 -0
  741. package/dist/commands/models/list.js +2 -0
  742. package/dist/commands/models/list.list-command.js +99 -0
  743. package/dist/commands/models/list.probe.js +348 -0
  744. package/dist/commands/models/list.registry.js +81 -0
  745. package/dist/commands/models/list.status-command.js +421 -0
  746. package/dist/commands/models/list.table.js +58 -0
  747. package/dist/commands/models/list.types.js +1 -0
  748. package/dist/commands/models/scan.js +293 -0
  749. package/dist/commands/models/set-image.js +28 -0
  750. package/dist/commands/models/set.js +28 -0
  751. package/dist/commands/models/shared.js +80 -0
  752. package/dist/commands/models.js +10 -0
  753. package/dist/commands/node-daemon-install-helpers.js +35 -0
  754. package/dist/commands/node-daemon-runtime.js +6 -0
  755. package/dist/commands/oauth-env.js +16 -0
  756. package/dist/commands/oauth-flow.js +33 -0
  757. package/dist/commands/onboard-auth.config-core.js +746 -0
  758. package/dist/commands/onboard-auth.config-minimax.js +176 -0
  759. package/dist/commands/onboard-auth.config-opencode.js +40 -0
  760. package/dist/commands/onboard-auth.credentials.js +205 -0
  761. package/dist/commands/onboard-auth.js +10 -0
  762. package/dist/commands/onboard-auth.models.js +174 -0
  763. package/dist/commands/onboard-channels.js +536 -0
  764. package/dist/commands/onboard-helpers.js +364 -0
  765. package/dist/commands/onboard-hooks.js +59 -0
  766. package/dist/commands/onboard-interactive.js +17 -0
  767. package/dist/commands/onboard-non-interactive/api-keys.js +45 -0
  768. package/dist/commands/onboard-non-interactive/local/auth-choice.js +350 -0
  769. package/dist/commands/onboard-non-interactive/local/daemon-install.js +45 -0
  770. package/dist/commands/onboard-non-interactive/local/gateway-config.js +83 -0
  771. package/dist/commands/onboard-non-interactive/local/output.js +14 -0
  772. package/dist/commands/onboard-non-interactive/local/skills-config.js +21 -0
  773. package/dist/commands/onboard-non-interactive/local/workspace.js +7 -0
  774. package/dist/commands/onboard-non-interactive/local.js +105 -0
  775. package/dist/commands/onboard-non-interactive/remote.js +41 -0
  776. package/dist/commands/onboard-non-interactive.js +25 -0
  777. package/dist/commands/onboard-remote.js +121 -0
  778. package/dist/commands/onboard-skills.js +146 -0
  779. package/dist/commands/onboard-types.js +1 -0
  780. package/dist/commands/onboard.js +41 -0
  781. package/dist/commands/onboarding/__tests__/test-utils.js +20 -0
  782. package/dist/commands/onboarding/plugin-install.js +178 -0
  783. package/dist/commands/onboarding/registry.js +13 -0
  784. package/dist/commands/onboarding/types.js +1 -0
  785. package/dist/commands/openai-codex-model-default.js +44 -0
  786. package/dist/commands/opencode-zen-model-default.js +35 -0
  787. package/dist/commands/reset.js +134 -0
  788. package/dist/commands/sandbox-display.js +82 -0
  789. package/dist/commands/sandbox-explain.js +226 -0
  790. package/dist/commands/sandbox-formatters.js +31 -0
  791. package/dist/commands/sandbox.js +119 -0
  792. package/dist/commands/sessions.js +211 -0
  793. package/dist/commands/setup.js +60 -0
  794. package/dist/commands/signal-install.js +132 -0
  795. package/dist/commands/status-all/agents.js +62 -0
  796. package/dist/commands/status-all/channels.js +354 -0
  797. package/dist/commands/status-all/diagnosis.js +156 -0
  798. package/dist/commands/status-all/format.js +41 -0
  799. package/dist/commands/status-all/gateway.js +158 -0
  800. package/dist/commands/status-all/report-lines.js +135 -0
  801. package/dist/commands/status-all.js +409 -0
  802. package/dist/commands/status.agent-local.js +68 -0
  803. package/dist/commands/status.command.js +476 -0
  804. package/dist/commands/status.daemon.js +30 -0
  805. package/dist/commands/status.format.js +52 -0
  806. package/dist/commands/status.gateway-probe.js +35 -0
  807. package/dist/commands/status.js +2 -0
  808. package/dist/commands/status.link-channel.js +39 -0
  809. package/dist/commands/status.scan.js +140 -0
  810. package/dist/commands/status.summary.js +172 -0
  811. package/dist/commands/status.types.js +1 -0
  812. package/dist/commands/status.update.js +112 -0
  813. package/dist/commands/systemd-linger.js +77 -0
  814. package/dist/commands/uninstall.js +161 -0
  815. package/dist/config/agent-dirs.js +79 -0
  816. package/dist/config/agent-limits.js +16 -0
  817. package/dist/config/cache-utils.js +22 -0
  818. package/dist/config/channel-capabilities.js +42 -0
  819. package/dist/config/commands.js +38 -0
  820. package/dist/config/config-paths.js +75 -0
  821. package/dist/config/config.js +7 -0
  822. package/dist/config/defaults.js +350 -0
  823. package/dist/config/env-substitution.js +117 -0
  824. package/dist/config/env-vars.js +21 -0
  825. package/dist/config/group-policy.js +54 -0
  826. package/dist/config/includes.js +183 -0
  827. package/dist/config/io.js +488 -0
  828. package/dist/config/legacy-migrate.js +13 -0
  829. package/dist/config/legacy.js +34 -0
  830. package/dist/config/legacy.migrations.js +8 -0
  831. package/dist/config/legacy.migrations.part-1.js +308 -0
  832. package/dist/config/legacy.migrations.part-2.js +343 -0
  833. package/dist/config/legacy.migrations.part-3.js +161 -0
  834. package/dist/config/legacy.rules.js +116 -0
  835. package/dist/config/legacy.shared.js +76 -0
  836. package/dist/config/logging.js +10 -0
  837. package/dist/config/markdown-tables.js +36 -0
  838. package/dist/config/merge-config.js +22 -0
  839. package/dist/config/merge-patch.js +22 -0
  840. package/dist/config/normalize-paths.js +54 -0
  841. package/dist/config/paths.js +90 -0
  842. package/dist/config/plugin-auto-enable.js +339 -0
  843. package/dist/config/port-defaults.js +30 -0
  844. package/dist/config/runtime-overrides.js +50 -0
  845. package/dist/config/schema.js +789 -0
  846. package/dist/config/sessions/group.js +83 -0
  847. package/dist/config/sessions/main-session.js +43 -0
  848. package/dist/config/sessions/metadata.js +114 -0
  849. package/dist/config/sessions/paths.js +46 -0
  850. package/dist/config/sessions/reset.js +103 -0
  851. package/dist/config/sessions/session-key.js +34 -0
  852. package/dist/config/sessions/store.js +346 -0
  853. package/dist/config/sessions/transcript.js +113 -0
  854. package/dist/config/sessions/types.js +11 -0
  855. package/dist/config/sessions.js +9 -0
  856. package/dist/config/talk.js +31 -0
  857. package/dist/config/telegram-custom-commands.js +70 -0
  858. package/dist/config/types.agent-defaults.js +1 -0
  859. package/dist/config/types.agents.js +1 -0
  860. package/dist/config/types.approvals.js +1 -0
  861. package/dist/config/types.auth.js +1 -0
  862. package/dist/config/types.base.js +1 -0
  863. package/dist/config/types.browser.js +1 -0
  864. package/dist/config/types.channels.js +1 -0
  865. package/dist/config/types.clawdbot.js +1 -0
  866. package/dist/config/types.cron.js +1 -0
  867. package/dist/config/types.discord.js +1 -0
  868. package/dist/config/types.feishu.js +1 -0
  869. package/dist/config/types.gateway.js +1 -0
  870. package/dist/config/types.googlechat.js +1 -0
  871. package/dist/config/types.hooks.js +1 -0
  872. package/dist/config/types.imessage.js +1 -0
  873. package/dist/config/types.js +29 -0
  874. package/dist/config/types.messages.js +1 -0
  875. package/dist/config/types.models.js +1 -0
  876. package/dist/config/types.msteams.js +1 -0
  877. package/dist/config/types.node-host.js +1 -0
  878. package/dist/config/types.plugins.js +1 -0
  879. package/dist/config/types.queue.js +1 -0
  880. package/dist/config/types.sandbox.js +1 -0
  881. package/dist/config/types.signal.js +1 -0
  882. package/dist/config/types.skills.js +1 -0
  883. package/dist/config/types.slack.js +1 -0
  884. package/dist/config/types.telegram.js +1 -0
  885. package/dist/config/types.tools.js +1 -0
  886. package/dist/config/types.tts.js +1 -0
  887. package/dist/config/types.whatsapp.js +1 -0
  888. package/dist/config/validation.js +297 -0
  889. package/dist/config/version.js +41 -0
  890. package/dist/config/zod-schema.agent-defaults.js +156 -0
  891. package/dist/config/zod-schema.agent-runtime.js +487 -0
  892. package/dist/config/zod-schema.agents.js +46 -0
  893. package/dist/config/zod-schema.approvals.js +25 -0
  894. package/dist/config/zod-schema.channels.js +9 -0
  895. package/dist/config/zod-schema.core.js +452 -0
  896. package/dist/config/zod-schema.hooks.js +124 -0
  897. package/dist/config/zod-schema.js +539 -0
  898. package/dist/config/zod-schema.providers-core.js +687 -0
  899. package/dist/config/zod-schema.providers-whatsapp.js +123 -0
  900. package/dist/config/zod-schema.providers.js +29 -0
  901. package/dist/config/zod-schema.session.js +100 -0
  902. package/dist/control-ui/assets/index-CNUQGStP.js +3199 -0
  903. package/dist/control-ui/assets/index-CNUQGStP.js.map +1 -0
  904. package/dist/control-ui/assets/index-DQGMwqCf.css +1 -0
  905. package/dist/control-ui/favicon.ico +0 -0
  906. package/dist/control-ui/index.html +15 -0
  907. package/dist/cron/isolated-agent/delivery-target.js +59 -0
  908. package/dist/cron/isolated-agent/helpers.js +49 -0
  909. package/dist/cron/isolated-agent/run.js +374 -0
  910. package/dist/cron/isolated-agent/session.js +27 -0
  911. package/dist/cron/isolated-agent.js +1 -0
  912. package/dist/cron/normalize.js +111 -0
  913. package/dist/cron/parse.js +24 -0
  914. package/dist/cron/payload-migration.js +29 -0
  915. package/dist/cron/run-log.js +70 -0
  916. package/dist/cron/schedule.js +24 -0
  917. package/dist/cron/service/jobs.js +174 -0
  918. package/dist/cron/service/locked.js +12 -0
  919. package/dist/cron/service/normalize.js +55 -0
  920. package/dist/cron/service/ops.js +118 -0
  921. package/dist/cron/service/state.js +10 -0
  922. package/dist/cron/service/store.js +57 -0
  923. package/dist/cron/service/timer.js +217 -0
  924. package/dist/cron/service.js +35 -0
  925. package/dist/cron/store.js +43 -0
  926. package/dist/cron/types.js +1 -0
  927. package/dist/daemon/constants.js +74 -0
  928. package/dist/daemon/diagnostics.js +38 -0
  929. package/dist/daemon/inspect.js +313 -0
  930. package/dist/daemon/launchd-plist.js +68 -0
  931. package/dist/daemon/launchd.js +316 -0
  932. package/dist/daemon/legacy.js +44 -0
  933. package/dist/daemon/node-service.js +53 -0
  934. package/dist/daemon/paths.js +35 -0
  935. package/dist/daemon/program-args.js +220 -0
  936. package/dist/daemon/runtime-parse.js +17 -0
  937. package/dist/daemon/runtime-paths.js +109 -0
  938. package/dist/daemon/schtasks.js +303 -0
  939. package/dist/daemon/service-audit.js +270 -0
  940. package/dist/daemon/service-env.js +128 -0
  941. package/dist/daemon/service-runtime.js +1 -0
  942. package/dist/daemon/service.js +90 -0
  943. package/dist/daemon/systemd-hints.js +24 -0
  944. package/dist/daemon/systemd-linger.js +59 -0
  945. package/dist/daemon/systemd-unit.js +108 -0
  946. package/dist/daemon/systemd.js +318 -0
  947. package/dist/discord/accounts.js +52 -0
  948. package/dist/discord/api.js +93 -0
  949. package/dist/discord/audit.js +94 -0
  950. package/dist/discord/chunk.js +200 -0
  951. package/dist/discord/directory-live.js +76 -0
  952. package/dist/discord/gateway-logging.js +48 -0
  953. package/dist/discord/index.js +2 -0
  954. package/dist/discord/monitor/allow-list.js +230 -0
  955. package/dist/discord/monitor/exec-approvals.js +406 -0
  956. package/dist/discord/monitor/format.js +27 -0
  957. package/dist/discord/monitor/listeners.js +240 -0
  958. package/dist/discord/monitor/message-handler.js +101 -0
  959. package/dist/discord/monitor/message-handler.preflight.js +438 -0
  960. package/dist/discord/monitor/message-handler.preflight.types.js +1 -0
  961. package/dist/discord/monitor/message-handler.process.js +344 -0
  962. package/dist/discord/monitor/message-utils.js +189 -0
  963. package/dist/discord/monitor/native-command.js +705 -0
  964. package/dist/discord/monitor/presence-cache.js +38 -0
  965. package/dist/discord/monitor/provider.js +551 -0
  966. package/dist/discord/monitor/reply-context.js +29 -0
  967. package/dist/discord/monitor/reply-delivery.js +57 -0
  968. package/dist/discord/monitor/system-events.js +53 -0
  969. package/dist/discord/monitor/threading.js +201 -0
  970. package/dist/discord/monitor/typing.js +8 -0
  971. package/dist/discord/monitor.gateway.js +54 -0
  972. package/dist/discord/monitor.js +7 -0
  973. package/dist/discord/probe.js +124 -0
  974. package/dist/discord/resolve-channels.js +239 -0
  975. package/dist/discord/resolve-users.js +114 -0
  976. package/dist/discord/send.channels.js +74 -0
  977. package/dist/discord/send.emojis-stickers.js +48 -0
  978. package/dist/discord/send.guild.js +79 -0
  979. package/dist/discord/send.js +7 -0
  980. package/dist/discord/send.messages.js +91 -0
  981. package/dist/discord/send.outbound.js +87 -0
  982. package/dist/discord/send.permissions.js +116 -0
  983. package/dist/discord/send.reactions.js +71 -0
  984. package/dist/discord/send.shared.js +249 -0
  985. package/dist/discord/send.types.js +16 -0
  986. package/dist/discord/targets.js +43 -0
  987. package/dist/discord/token.js +29 -0
  988. package/dist/entry.js +127 -0
  989. package/dist/feishu/access.js +64 -0
  990. package/dist/feishu/accounts.js +53 -0
  991. package/dist/feishu/bot.js +48 -0
  992. package/dist/feishu/client.js +115 -0
  993. package/dist/feishu/config.js +53 -0
  994. package/dist/feishu/docs.js +347 -0
  995. package/dist/feishu/download.js +175 -0
  996. package/dist/feishu/format.js +183 -0
  997. package/dist/feishu/index.js +8 -0
  998. package/dist/feishu/message.js +572 -0
  999. package/dist/feishu/monitor.js +145 -0
  1000. package/dist/feishu/pairing-store.js +79 -0
  1001. package/dist/feishu/probe.js +70 -0
  1002. package/dist/feishu/reactions.js +85 -0
  1003. package/dist/feishu/send.js +257 -0
  1004. package/dist/feishu/streaming-card.js +290 -0
  1005. package/dist/feishu/types.js +1 -0
  1006. package/dist/feishu/typing.js +59 -0
  1007. package/dist/gateway/assistant-identity.js +64 -0
  1008. package/dist/gateway/auth.js +200 -0
  1009. package/dist/gateway/boot.js +72 -0
  1010. package/dist/gateway/call.js +182 -0
  1011. package/dist/gateway/chat-abort.js +55 -0
  1012. package/dist/gateway/chat-attachments.js +133 -0
  1013. package/dist/gateway/chat-sanitize.js +103 -0
  1014. package/dist/gateway/client.js +339 -0
  1015. package/dist/gateway/config-reload.js +295 -0
  1016. package/dist/gateway/control-ui-shared.js +48 -0
  1017. package/dist/gateway/control-ui.js +258 -0
  1018. package/dist/gateway/device-auth.js +19 -0
  1019. package/dist/gateway/exec-approval-manager.js +40 -0
  1020. package/dist/gateway/hooks-mapping.js +287 -0
  1021. package/dist/gateway/hooks.js +169 -0
  1022. package/dist/gateway/http-common.js +43 -0
  1023. package/dist/gateway/http-utils.js +51 -0
  1024. package/dist/gateway/live-image-probe.js +156 -0
  1025. package/dist/gateway/net.js +176 -0
  1026. package/dist/gateway/node-command-policy.js +106 -0
  1027. package/dist/gateway/node-registry.js +142 -0
  1028. package/dist/gateway/open-responses.schema.js +285 -0
  1029. package/dist/gateway/openai-http.js +327 -0
  1030. package/dist/gateway/openresponses-http.js +693 -0
  1031. package/dist/gateway/probe.js +87 -0
  1032. package/dist/gateway/protocol/client-info.js +46 -0
  1033. package/dist/gateway/protocol/index.js +109 -0
  1034. package/dist/gateway/protocol/schema/agent.js +73 -0
  1035. package/dist/gateway/protocol/schema/agents-models-skills.js +47 -0
  1036. package/dist/gateway/protocol/schema/channels.js +74 -0
  1037. package/dist/gateway/protocol/schema/config.js +44 -0
  1038. package/dist/gateway/protocol/schema/cron.js +159 -0
  1039. package/dist/gateway/protocol/schema/devices.js +36 -0
  1040. package/dist/gateway/protocol/schema/error-codes.js +14 -0
  1041. package/dist/gateway/protocol/schema/exec-approvals.js +66 -0
  1042. package/dist/gateway/protocol/schema/frames.js +101 -0
  1043. package/dist/gateway/protocol/schema/logs-chat.js +53 -0
  1044. package/dist/gateway/protocol/schema/nodes.js +54 -0
  1045. package/dist/gateway/protocol/schema/primitives.js +10 -0
  1046. package/dist/gateway/protocol/schema/protocol-schemas.js +117 -0
  1047. package/dist/gateway/protocol/schema/sessions.js +69 -0
  1048. package/dist/gateway/protocol/schema/snapshot.js +40 -0
  1049. package/dist/gateway/protocol/schema/types.js +1 -0
  1050. package/dist/gateway/protocol/schema/wizard.js +76 -0
  1051. package/dist/gateway/protocol/schema.js +16 -0
  1052. package/dist/gateway/server/__tests__/test-utils.js +24 -0
  1053. package/dist/gateway/server/close-reason.js +10 -0
  1054. package/dist/gateway/server/health-state.js +69 -0
  1055. package/dist/gateway/server/hooks.js +85 -0
  1056. package/dist/gateway/server/http-listen.js +26 -0
  1057. package/dist/gateway/server/plugins-http.js +45 -0
  1058. package/dist/gateway/server/tls.js +4 -0
  1059. package/dist/gateway/server/ws-connection/message-handler.js +767 -0
  1060. package/dist/gateway/server/ws-connection.js +191 -0
  1061. package/dist/gateway/server/ws-types.js +1 -0
  1062. package/dist/gateway/server-broadcast.js +73 -0
  1063. package/dist/gateway/server-browser.js +11 -0
  1064. package/dist/gateway/server-channels.js +242 -0
  1065. package/dist/gateway/server-chat.js +195 -0
  1066. package/dist/gateway/server-close.js +99 -0
  1067. package/dist/gateway/server-constants.js +29 -0
  1068. package/dist/gateway/server-cron.js +84 -0
  1069. package/dist/gateway/server-discovery-runtime.js +69 -0
  1070. package/dist/gateway/server-discovery.js +62 -0
  1071. package/dist/gateway/server-http.js +273 -0
  1072. package/dist/gateway/server-lanes.js +7 -0
  1073. package/dist/gateway/server-maintenance.js +68 -0
  1074. package/dist/gateway/server-methods/agent-job.js +104 -0
  1075. package/dist/gateway/server-methods/agent.js +360 -0
  1076. package/dist/gateway/server-methods/agents.js +14 -0
  1077. package/dist/gateway/server-methods/channels.js +218 -0
  1078. package/dist/gateway/server-methods/chat.js +520 -0
  1079. package/dist/gateway/server-methods/config.js +269 -0
  1080. package/dist/gateway/server-methods/connect.js +6 -0
  1081. package/dist/gateway/server-methods/cron.js +109 -0
  1082. package/dist/gateway/server-methods/devices.js +95 -0
  1083. package/dist/gateway/server-methods/exec-approval.js +78 -0
  1084. package/dist/gateway/server-methods/exec-approvals.js +141 -0
  1085. package/dist/gateway/server-methods/health.js +29 -0
  1086. package/dist/gateway/server-methods/logs.js +143 -0
  1087. package/dist/gateway/server-methods/models.js +16 -0
  1088. package/dist/gateway/server-methods/nodes.helpers.js +32 -0
  1089. package/dist/gateway/server-methods/nodes.js +426 -0
  1090. package/dist/gateway/server-methods/send.js +280 -0
  1091. package/dist/gateway/server-methods/sessions.js +322 -0
  1092. package/dist/gateway/server-methods/skills.js +143 -0
  1093. package/dist/gateway/server-methods/system.js +122 -0
  1094. package/dist/gateway/server-methods/talk.js +20 -0
  1095. package/dist/gateway/server-methods/tts.js +132 -0
  1096. package/dist/gateway/server-methods/types.js +1 -0
  1097. package/dist/gateway/server-methods/update.js +96 -0
  1098. package/dist/gateway/server-methods/usage.js +63 -0
  1099. package/dist/gateway/server-methods/voicewake.js +30 -0
  1100. package/dist/gateway/server-methods/web.js +73 -0
  1101. package/dist/gateway/server-methods/wizard.js +100 -0
  1102. package/dist/gateway/server-methods-list.js +107 -0
  1103. package/dist/gateway/server-methods.js +192 -0
  1104. package/dist/gateway/server-mobile-nodes.js +10 -0
  1105. package/dist/gateway/server-model-catalog.js +11 -0
  1106. package/dist/gateway/server-node-events-types.js +1 -0
  1107. package/dist/gateway/server-node-events.js +206 -0
  1108. package/dist/gateway/server-node-subscriptions.js +93 -0
  1109. package/dist/gateway/server-plugins.js +36 -0
  1110. package/dist/gateway/server-reload-handlers.js +112 -0
  1111. package/dist/gateway/server-restart-sentinel.js +84 -0
  1112. package/dist/gateway/server-runtime-config.js +66 -0
  1113. package/dist/gateway/server-runtime-state.js +113 -0
  1114. package/dist/gateway/server-session-key.js +20 -0
  1115. package/dist/gateway/server-shared.js +1 -0
  1116. package/dist/gateway/server-startup-log.js +27 -0
  1117. package/dist/gateway/server-startup.js +119 -0
  1118. package/dist/gateway/server-tailscale.js +41 -0
  1119. package/dist/gateway/server-utils.js +35 -0
  1120. package/dist/gateway/server-wizard-sessions.js +19 -0
  1121. package/dist/gateway/server-ws-runtime.js +20 -0
  1122. package/dist/gateway/server.impl.js +442 -0
  1123. package/dist/gateway/server.js +2 -0
  1124. package/dist/gateway/session-utils.fs.js +343 -0
  1125. package/dist/gateway/session-utils.js +534 -0
  1126. package/dist/gateway/session-utils.types.js +1 -0
  1127. package/dist/gateway/sessions-patch.js +298 -0
  1128. package/dist/gateway/sessions-resolve.js +103 -0
  1129. package/dist/gateway/test-helpers.e2e.js +101 -0
  1130. package/dist/gateway/test-helpers.mocks.js +502 -0
  1131. package/dist/gateway/test-helpers.openai-mock.js +163 -0
  1132. package/dist/gateway/test-helpers.server.js +366 -0
  1133. package/dist/gateway/tools-invoke-http.js +178 -0
  1134. package/dist/gateway/ws-log.js +336 -0
  1135. package/dist/gateway/ws-logging.js +8 -0
  1136. package/dist/globals.js +41 -0
  1137. package/dist/hooks/bundled/boot-md/HOOK.md +19 -0
  1138. package/dist/hooks/bundled/boot-md/handler.js +14 -0
  1139. package/dist/hooks/bundled/command-logger/HOOK.md +122 -0
  1140. package/dist/hooks/bundled/command-logger/handler.js +55 -0
  1141. package/dist/hooks/bundled/session-memory/HOOK.md +86 -0
  1142. package/dist/hooks/bundled/session-memory/handler.js +140 -0
  1143. package/dist/hooks/bundled/soul-evil/HOOK.md +71 -0
  1144. package/dist/hooks/bundled/soul-evil/handler.js +36 -0
  1145. package/dist/hooks/bundled-dir.js +42 -0
  1146. package/dist/hooks/config.js +122 -0
  1147. package/dist/hooks/frontmatter.js +105 -0
  1148. package/dist/hooks/gmail-ops.js +243 -0
  1149. package/dist/hooks/gmail-setup-utils.js +310 -0
  1150. package/dist/hooks/gmail-watcher.js +191 -0
  1151. package/dist/hooks/gmail.js +179 -0
  1152. package/dist/hooks/hooks-status.js +135 -0
  1153. package/dist/hooks/hooks.js +2 -0
  1154. package/dist/hooks/install.js +327 -0
  1155. package/dist/hooks/installs.js +24 -0
  1156. package/dist/hooks/internal-hooks.js +121 -0
  1157. package/dist/hooks/llm-slug-generator.js +70 -0
  1158. package/dist/hooks/loader.js +110 -0
  1159. package/dist/hooks/plugin-hooks.js +91 -0
  1160. package/dist/hooks/soul-evil.js +186 -0
  1161. package/dist/hooks/types.js +1 -0
  1162. package/dist/hooks/workspace.js +206 -0
  1163. package/dist/imessage/accounts.js +61 -0
  1164. package/dist/imessage/client.js +174 -0
  1165. package/dist/imessage/index.js +3 -0
  1166. package/dist/imessage/monitor/deliver.js +45 -0
  1167. package/dist/imessage/monitor/monitor-provider.js +592 -0
  1168. package/dist/imessage/monitor/runtime.js +12 -0
  1169. package/dist/imessage/monitor/types.js +1 -0
  1170. package/dist/imessage/monitor.js +1 -0
  1171. package/dist/imessage/probe.js +68 -0
  1172. package/dist/imessage/send.js +101 -0
  1173. package/dist/imessage/targets.js +172 -0
  1174. package/dist/index.js +49 -0
  1175. package/dist/infra/agent-events.js +54 -0
  1176. package/dist/infra/archive.js +97 -0
  1177. package/dist/infra/backoff.js +19 -0
  1178. package/dist/infra/binaries.js +9 -0
  1179. package/dist/infra/bonjour-ciao.js +10 -0
  1180. package/dist/infra/bonjour-discovery.js +445 -0
  1181. package/dist/infra/bonjour-errors.js +7 -0
  1182. package/dist/infra/bonjour.js +209 -0
  1183. package/dist/infra/brew.js +55 -0
  1184. package/dist/infra/canvas-host-url.js +52 -0
  1185. package/dist/infra/channel-activity.js +32 -0
  1186. package/dist/infra/channel-summary.js +183 -0
  1187. package/dist/infra/channels-status-issues.js +15 -0
  1188. package/dist/infra/clawdbot-root.js +62 -0
  1189. package/dist/infra/clipboard.js +24 -0
  1190. package/dist/infra/control-ui-assets.js +103 -0
  1191. package/dist/infra/dedupe.js +47 -0
  1192. package/dist/infra/device-auth-store.js +97 -0
  1193. package/dist/infra/device-identity.js +149 -0
  1194. package/dist/infra/device-pairing.js +401 -0
  1195. package/dist/infra/diagnostic-events.js +28 -0
  1196. package/dist/infra/diagnostic-flags.js +66 -0
  1197. package/dist/infra/dotenv.js +15 -0
  1198. package/dist/infra/env-file.js +43 -0
  1199. package/dist/infra/env.js +34 -0
  1200. package/dist/infra/errors.js +35 -0
  1201. package/dist/infra/exec-approval-forwarder.js +212 -0
  1202. package/dist/infra/exec-approvals.js +1040 -0
  1203. package/dist/infra/exec-host.js +75 -0
  1204. package/dist/infra/exec-safety.js +31 -0
  1205. package/dist/infra/fetch.js +58 -0
  1206. package/dist/infra/format-duration.js +20 -0
  1207. package/dist/infra/gateway-lock.js +202 -0
  1208. package/dist/infra/git-commit.js +106 -0
  1209. package/dist/infra/heartbeat-events.js +34 -0
  1210. package/dist/infra/heartbeat-runner.js +746 -0
  1211. package/dist/infra/heartbeat-visibility.js +31 -0
  1212. package/dist/infra/heartbeat-wake.js +61 -0
  1213. package/dist/infra/is-main.js +33 -0
  1214. package/dist/infra/json-file.js +21 -0
  1215. package/dist/infra/machine-name.js +43 -0
  1216. package/dist/infra/net/ssrf.js +199 -0
  1217. package/dist/infra/node-pairing.js +228 -0
  1218. package/dist/infra/node-shell.js +9 -0
  1219. package/dist/infra/os-summary.js +23 -0
  1220. package/dist/infra/outbound/agent-delivery.js +86 -0
  1221. package/dist/infra/outbound/channel-adapters.js +16 -0
  1222. package/dist/infra/outbound/channel-selection.js +62 -0
  1223. package/dist/infra/outbound/channel-target.js +28 -0
  1224. package/dist/infra/outbound/deliver.js +253 -0
  1225. package/dist/infra/outbound/directory-cache.js +44 -0
  1226. package/dist/infra/outbound/envelope.js +20 -0
  1227. package/dist/infra/outbound/format.js +66 -0
  1228. package/dist/infra/outbound/message-action-runner.js +766 -0
  1229. package/dist/infra/outbound/message-action-spec.js +82 -0
  1230. package/dist/infra/outbound/message.js +189 -0
  1231. package/dist/infra/outbound/outbound-policy.js +122 -0
  1232. package/dist/infra/outbound/outbound-send-service.js +123 -0
  1233. package/dist/infra/outbound/outbound-session.js +797 -0
  1234. package/dist/infra/outbound/payloads.js +78 -0
  1235. package/dist/infra/outbound/target-errors.js +23 -0
  1236. package/dist/infra/outbound/target-normalization.js +27 -0
  1237. package/dist/infra/outbound/target-resolver.js +351 -0
  1238. package/dist/infra/outbound/targets.js +213 -0
  1239. package/dist/infra/path-env.js +93 -0
  1240. package/dist/infra/ports-format.js +53 -0
  1241. package/dist/infra/ports-inspect.js +240 -0
  1242. package/dist/infra/ports-lsof.js +33 -0
  1243. package/dist/infra/ports-types.js +1 -0
  1244. package/dist/infra/ports.js +75 -0
  1245. package/dist/infra/provider-usage.auth.js +190 -0
  1246. package/dist/infra/provider-usage.fetch.antigravity.js +212 -0
  1247. package/dist/infra/provider-usage.fetch.claude.js +129 -0
  1248. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  1249. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  1250. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  1251. package/dist/infra/provider-usage.fetch.js +7 -0
  1252. package/dist/infra/provider-usage.fetch.minimax.js +332 -0
  1253. package/dist/infra/provider-usage.fetch.shared.js +10 -0
  1254. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  1255. package/dist/infra/provider-usage.format.js +96 -0
  1256. package/dist/infra/provider-usage.js +3 -0
  1257. package/dist/infra/provider-usage.load.js +59 -0
  1258. package/dist/infra/provider-usage.shared.js +51 -0
  1259. package/dist/infra/provider-usage.types.js +1 -0
  1260. package/dist/infra/restart-sentinel.js +65 -0
  1261. package/dist/infra/restart.js +171 -0
  1262. package/dist/infra/retry-policy.js +68 -0
  1263. package/dist/infra/retry.js +85 -0
  1264. package/dist/infra/runtime-guard.js +60 -0
  1265. package/dist/infra/session-cost-usage.js +190 -0
  1266. package/dist/infra/shell-env.js +125 -0
  1267. package/dist/infra/skills-remote.js +282 -0
  1268. package/dist/infra/ssh-config.js +83 -0
  1269. package/dist/infra/ssh-tunnel.js +166 -0
  1270. package/dist/infra/state-migrations.fs.js +49 -0
  1271. package/dist/infra/state-migrations.js +498 -0
  1272. package/dist/infra/system-events.js +75 -0
  1273. package/dist/infra/system-presence.js +231 -0
  1274. package/dist/infra/tailnet.js +46 -0
  1275. package/dist/infra/tailscale.js +368 -0
  1276. package/dist/infra/tls/fingerprint.js +5 -0
  1277. package/dist/infra/tls/gateway.js +119 -0
  1278. package/dist/infra/transport-ready.js +38 -0
  1279. package/dist/infra/unhandled-rejections.js +67 -0
  1280. package/dist/infra/update-channels.js +57 -0
  1281. package/dist/infra/update-check.js +293 -0
  1282. package/dist/infra/update-global.js +85 -0
  1283. package/dist/infra/update-runner.js +557 -0
  1284. package/dist/infra/update-startup.js +86 -0
  1285. package/dist/infra/voicewake.js +74 -0
  1286. package/dist/infra/warnings.js +25 -0
  1287. package/dist/infra/widearea-dns.js +131 -0
  1288. package/dist/infra/ws.js +13 -0
  1289. package/dist/infra/wsl.js +25 -0
  1290. package/dist/line/accounts.js +130 -0
  1291. package/dist/line/auto-reply-delivery.js +102 -0
  1292. package/dist/line/bot-access.js +38 -0
  1293. package/dist/line/bot-handlers.js +258 -0
  1294. package/dist/line/bot-message-context.js +374 -0
  1295. package/dist/line/bot.js +48 -0
  1296. package/dist/line/config-schema.js +47 -0
  1297. package/dist/line/download.js +95 -0
  1298. package/dist/line/flex-templates.js +1264 -0
  1299. package/dist/line/http-registry.js +27 -0
  1300. package/dist/line/index.js +19 -0
  1301. package/dist/line/markdown-to-line.js +346 -0
  1302. package/dist/line/monitor.js +270 -0
  1303. package/dist/line/probe.js +37 -0
  1304. package/dist/line/reply-chunks.js +53 -0
  1305. package/dist/line/rich-menu.js +320 -0
  1306. package/dist/line/send.js +451 -0
  1307. package/dist/line/template-messages.js +258 -0
  1308. package/dist/line/types.js +1 -0
  1309. package/dist/line/webhook.js +75 -0
  1310. package/dist/link-understanding/apply.js +22 -0
  1311. package/dist/link-understanding/defaults.js +2 -0
  1312. package/dist/link-understanding/detect.js +49 -0
  1313. package/dist/link-understanding/format.js +10 -0
  1314. package/dist/link-understanding/index.js +4 -0
  1315. package/dist/link-understanding/runner.js +99 -0
  1316. package/dist/logger.js +53 -0
  1317. package/dist/logging/config.js +19 -0
  1318. package/dist/logging/console.js +237 -0
  1319. package/dist/logging/diagnostic.js +236 -0
  1320. package/dist/logging/levels.js +26 -0
  1321. package/dist/logging/logger.js +185 -0
  1322. package/dist/logging/parse-log-line.js +52 -0
  1323. package/dist/logging/redact.js +115 -0
  1324. package/dist/logging/state.js +12 -0
  1325. package/dist/logging/subsystem.js +234 -0
  1326. package/dist/logging.js +5 -0
  1327. package/dist/macos/gateway-daemon.js +178 -0
  1328. package/dist/macos/relay-smoke.js +29 -0
  1329. package/dist/macos/relay.js +60 -0
  1330. package/dist/markdown/code-spans.js +67 -0
  1331. package/dist/markdown/fences.js +57 -0
  1332. package/dist/markdown/frontmatter.js +124 -0
  1333. package/dist/markdown/ir.js +687 -0
  1334. package/dist/markdown/render.js +130 -0
  1335. package/dist/markdown/tables.js +35 -0
  1336. package/dist/media/audio-tags.js +14 -0
  1337. package/dist/media/audio.js +15 -0
  1338. package/dist/media/constants.js +33 -0
  1339. package/dist/media/fetch.js +151 -0
  1340. package/dist/media/host.js +43 -0
  1341. package/dist/media/image-ops.js +385 -0
  1342. package/dist/media/input-files.js +276 -0
  1343. package/dist/media/local-roots.js +16 -0
  1344. package/dist/media/mime.js +147 -0
  1345. package/dist/media/parse.js +175 -0
  1346. package/dist/media/server.js +64 -0
  1347. package/dist/media/store.js +199 -0
  1348. package/dist/media-understanding/apply.js +78 -0
  1349. package/dist/media-understanding/attachments.js +320 -0
  1350. package/dist/media-understanding/concurrency.js +26 -0
  1351. package/dist/media-understanding/defaults.js +30 -0
  1352. package/dist/media-understanding/errors.js +11 -0
  1353. package/dist/media-understanding/format.js +56 -0
  1354. package/dist/media-understanding/index.js +3 -0
  1355. package/dist/media-understanding/providers/anthropic/index.js +6 -0
  1356. package/dist/media-understanding/providers/deepgram/audio.js +47 -0
  1357. package/dist/media-understanding/providers/deepgram/index.js +6 -0
  1358. package/dist/media-understanding/providers/google/audio.js +64 -0
  1359. package/dist/media-understanding/providers/google/index.js +10 -0
  1360. package/dist/media-understanding/providers/google/video.js +64 -0
  1361. package/dist/media-understanding/providers/groq/index.js +10 -0
  1362. package/dist/media-understanding/providers/image.js +59 -0
  1363. package/dist/media-understanding/providers/index.js +45 -0
  1364. package/dist/media-understanding/providers/minimax/index.js +6 -0
  1365. package/dist/media-understanding/providers/openai/audio.js +46 -0
  1366. package/dist/media-understanding/providers/openai/index.js +8 -0
  1367. package/dist/media-understanding/providers/shared.js +29 -0
  1368. package/dist/media-understanding/resolve.js +113 -0
  1369. package/dist/media-understanding/runner.js +976 -0
  1370. package/dist/media-understanding/scope.js +41 -0
  1371. package/dist/media-understanding/types.js +1 -0
  1372. package/dist/media-understanding/video.js +8 -0
  1373. package/dist/memory/batch-gemini.js +320 -0
  1374. package/dist/memory/batch-openai.js +290 -0
  1375. package/dist/memory/embeddings-gemini.js +129 -0
  1376. package/dist/memory/embeddings-openai.js +65 -0
  1377. package/dist/memory/embeddings.js +181 -0
  1378. package/dist/memory/headers-fingerprint.js +16 -0
  1379. package/dist/memory/hybrid.js +61 -0
  1380. package/dist/memory/index.js +1 -0
  1381. package/dist/memory/internal.js +189 -0
  1382. package/dist/memory/manager-cache-key.js +45 -0
  1383. package/dist/memory/manager-search.js +95 -0
  1384. package/dist/memory/manager.js +1815 -0
  1385. package/dist/memory/memory-schema.js +76 -0
  1386. package/dist/memory/node-llama.js +3 -0
  1387. package/dist/memory/openai-batch.js +2 -0
  1388. package/dist/memory/provider-key.js +23 -0
  1389. package/dist/memory/search-manager.js +11 -0
  1390. package/dist/memory/session-files.js +98 -0
  1391. package/dist/memory/sqlite-vec.js +19 -0
  1392. package/dist/memory/sqlite.js +7 -0
  1393. package/dist/memory/status-format.js +23 -0
  1394. package/dist/memory/sync-memory-files.js +69 -0
  1395. package/dist/memory/sync-session-files.js +95 -0
  1396. package/dist/node-host/config.js +53 -0
  1397. package/dist/node-host/runner.js +951 -0
  1398. package/dist/pairing/pairing-labels.js +4 -0
  1399. package/dist/pairing/pairing-messages.js +14 -0
  1400. package/dist/pairing/pairing-store.js +357 -0
  1401. package/dist/plugin-sdk/index.js +89 -0
  1402. package/dist/plugins/bundled-dir.js +35 -0
  1403. package/dist/plugins/cli.js +49 -0
  1404. package/dist/plugins/commands.js +228 -0
  1405. package/dist/plugins/config-schema.js +23 -0
  1406. package/dist/plugins/config-state.js +101 -0
  1407. package/dist/plugins/discovery.js +274 -0
  1408. package/dist/plugins/enable.js +36 -0
  1409. package/dist/plugins/hook-runner-global.js +57 -0
  1410. package/dist/plugins/hooks.js +283 -0
  1411. package/dist/plugins/http-path.js +10 -0
  1412. package/dist/plugins/http-registry.js +31 -0
  1413. package/dist/plugins/install.js +323 -0
  1414. package/dist/plugins/installs.js +21 -0
  1415. package/dist/plugins/loader.js +375 -0
  1416. package/dist/plugins/manifest-registry.js +136 -0
  1417. package/dist/plugins/manifest.js +73 -0
  1418. package/dist/plugins/providers.js +16 -0
  1419. package/dist/plugins/registry.js +312 -0
  1420. package/dist/plugins/runtime/index.js +290 -0
  1421. package/dist/plugins/runtime/native-deps.js +16 -0
  1422. package/dist/plugins/runtime/types.js +1 -0
  1423. package/dist/plugins/runtime.js +42 -0
  1424. package/dist/plugins/schema-validator.js +28 -0
  1425. package/dist/plugins/services.js +55 -0
  1426. package/dist/plugins/slots.js +68 -0
  1427. package/dist/plugins/status.js +27 -0
  1428. package/dist/plugins/tools.js +98 -0
  1429. package/dist/plugins/types.js +1 -0
  1430. package/dist/plugins/update.js +324 -0
  1431. package/dist/polls.js +41 -0
  1432. package/dist/process/child-process-bridge.js +34 -0
  1433. package/dist/process/command-queue.js +104 -0
  1434. package/dist/process/exec.js +98 -0
  1435. package/dist/process/lanes.js +1 -0
  1436. package/dist/process/spawn-utils.js +95 -0
  1437. package/dist/providers/github-copilot-auth.js +124 -0
  1438. package/dist/providers/github-copilot-models.js +228 -0
  1439. package/dist/providers/github-copilot-token.js +95 -0
  1440. package/dist/providers/qwen-portal-oauth.js +38 -0
  1441. package/dist/routing/bindings.js +87 -0
  1442. package/dist/routing/resolve-route.js +140 -0
  1443. package/dist/routing/session-key.js +169 -0
  1444. package/dist/runtime.js +15 -0
  1445. package/dist/security/audit-extra.js +783 -0
  1446. package/dist/security/audit-fs.js +55 -0
  1447. package/dist/security/audit.js +740 -0
  1448. package/dist/security/external-content.js +143 -0
  1449. package/dist/security/fix.js +317 -0
  1450. package/dist/sessions/level-overrides.js +24 -0
  1451. package/dist/sessions/model-overrides.js +57 -0
  1452. package/dist/sessions/send-policy.js +69 -0
  1453. package/dist/sessions/session-key-utils.js +51 -0
  1454. package/dist/sessions/session-label.js +16 -0
  1455. package/dist/sessions/transcript-events.js +16 -0
  1456. package/dist/shared/text/reasoning-tags.js +48 -0
  1457. package/dist/signal/accounts.js +59 -0
  1458. package/dist/signal/client.js +141 -0
  1459. package/dist/signal/daemon.js +69 -0
  1460. package/dist/signal/format.js +165 -0
  1461. package/dist/signal/identity.js +95 -0
  1462. package/dist/signal/index.js +5 -0
  1463. package/dist/signal/monitor/event-handler.js +492 -0
  1464. package/dist/signal/monitor/event-handler.types.js +1 -0
  1465. package/dist/signal/monitor.js +269 -0
  1466. package/dist/signal/probe.js +46 -0
  1467. package/dist/signal/reaction-level.js +53 -0
  1468. package/dist/signal/send-reactions.js +155 -0
  1469. package/dist/signal/send.js +192 -0
  1470. package/dist/signal/sse-reconnect.js +56 -0
  1471. package/dist/slack/accounts.js +84 -0
  1472. package/dist/slack/actions.js +156 -0
  1473. package/dist/slack/channel-migration.js +53 -0
  1474. package/dist/slack/client.js +17 -0
  1475. package/dist/slack/directory-live.js +122 -0
  1476. package/dist/slack/format.js +111 -0
  1477. package/dist/slack/http/index.js +1 -0
  1478. package/dist/slack/http/registry.js +27 -0
  1479. package/dist/slack/index.js +6 -0
  1480. package/dist/slack/monitor/allow-list.js +58 -0
  1481. package/dist/slack/monitor/auth.js +17 -0
  1482. package/dist/slack/monitor/channel-config.js +79 -0
  1483. package/dist/slack/monitor/commands.js +17 -0
  1484. package/dist/slack/monitor/context.js +242 -0
  1485. package/dist/slack/monitor/events/channels.js +116 -0
  1486. package/dist/slack/monitor/events/members.js +74 -0
  1487. package/dist/slack/monitor/events/messages.js +111 -0
  1488. package/dist/slack/monitor/events/pins.js +76 -0
  1489. package/dist/slack/monitor/events/reactions.js +54 -0
  1490. package/dist/slack/monitor/events.js +15 -0
  1491. package/dist/slack/monitor/media.js +93 -0
  1492. package/dist/slack/monitor/message-handler/dispatch.js +170 -0
  1493. package/dist/slack/monitor/message-handler/prepare.js +477 -0
  1494. package/dist/slack/monitor/message-handler/types.js +1 -0
  1495. package/dist/slack/monitor/message-handler.js +87 -0
  1496. package/dist/slack/monitor/policy.js +10 -0
  1497. package/dist/slack/monitor/provider.js +324 -0
  1498. package/dist/slack/monitor/replies.js +107 -0
  1499. package/dist/slack/monitor/slash.js +504 -0
  1500. package/dist/slack/monitor/thread-resolution.js +102 -0
  1501. package/dist/slack/monitor/types.js +1 -0
  1502. package/dist/slack/monitor.js +4 -0
  1503. package/dist/slack/monitor.test-helpers.js +119 -0
  1504. package/dist/slack/probe.js +47 -0
  1505. package/dist/slack/resolve-channels.js +88 -0
  1506. package/dist/slack/resolve-users.js +133 -0
  1507. package/dist/slack/scopes.js +87 -0
  1508. package/dist/slack/send.js +132 -0
  1509. package/dist/slack/targets.js +48 -0
  1510. package/dist/slack/threading-tool-context.js +18 -0
  1511. package/dist/slack/threading.js +26 -0
  1512. package/dist/slack/token.js +10 -0
  1513. package/dist/slack/types.js +1 -0
  1514. package/dist/telegram/accounts.js +98 -0
  1515. package/dist/telegram/allowed-updates.js +8 -0
  1516. package/dist/telegram/api-logging.js +26 -0
  1517. package/dist/telegram/audit.js +116 -0
  1518. package/dist/telegram/bot/delivery.js +312 -0
  1519. package/dist/telegram/bot/helpers.js +303 -0
  1520. package/dist/telegram/bot/types.js +1 -0
  1521. package/dist/telegram/bot-access.js +59 -0
  1522. package/dist/telegram/bot-handlers.js +516 -0
  1523. package/dist/telegram/bot-message-context.js +435 -0
  1524. package/dist/telegram/bot-message-dispatch.js +183 -0
  1525. package/dist/telegram/bot-message.js +41 -0
  1526. package/dist/telegram/bot-native-commands.js +402 -0
  1527. package/dist/telegram/bot-updates.js +25 -0
  1528. package/dist/telegram/bot.js +383 -0
  1529. package/dist/telegram/caption.js +11 -0
  1530. package/dist/telegram/download.js +63 -0
  1531. package/dist/telegram/draft-chunking.js +22 -0
  1532. package/dist/telegram/draft-stream.js +101 -0
  1533. package/dist/telegram/fetch.js +11 -0
  1534. package/dist/telegram/format.js +66 -0
  1535. package/dist/telegram/group-migration.js +53 -0
  1536. package/dist/telegram/index.js +4 -0
  1537. package/dist/telegram/inline-buttons.js +55 -0
  1538. package/dist/telegram/monitor.js +142 -0
  1539. package/dist/telegram/pairing-store.js +77 -0
  1540. package/dist/telegram/probe.js +70 -0
  1541. package/dist/telegram/proxy.js +10 -0
  1542. package/dist/telegram/reaction-level.js +46 -0
  1543. package/dist/telegram/send.js +382 -0
  1544. package/dist/telegram/sent-message-cache.js +53 -0
  1545. package/dist/telegram/targets.js +46 -0
  1546. package/dist/telegram/token.js +70 -0
  1547. package/dist/telegram/update-offset-store.js +60 -0
  1548. package/dist/telegram/voice.js +23 -0
  1549. package/dist/telegram/webhook-set.js +21 -0
  1550. package/dist/telegram/webhook.js +90 -0
  1551. package/dist/terminal/ansi.js +11 -0
  1552. package/dist/terminal/links.js +17 -0
  1553. package/dist/terminal/note.js +79 -0
  1554. package/dist/terminal/palette.js +12 -0
  1555. package/dist/terminal/progress-line.js +18 -0
  1556. package/dist/terminal/prompt-style.js +4 -0
  1557. package/dist/terminal/stream-writer.js +49 -0
  1558. package/dist/terminal/table.js +327 -0
  1559. package/dist/terminal/theme.js +22 -0
  1560. package/dist/tts/tts.js +1179 -0
  1561. package/dist/tui/commands.js +134 -0
  1562. package/dist/tui/components/assistant-message.js +16 -0
  1563. package/dist/tui/components/chat-log.js +86 -0
  1564. package/dist/tui/components/custom-editor.js +61 -0
  1565. package/dist/tui/components/filterable-select-list.js +102 -0
  1566. package/dist/tui/components/fuzzy-filter.js +113 -0
  1567. package/dist/tui/components/searchable-select-list.js +231 -0
  1568. package/dist/tui/components/selectors.js +16 -0
  1569. package/dist/tui/components/tool-execution.js +109 -0
  1570. package/dist/tui/components/user-message.js +17 -0
  1571. package/dist/tui/gateway-chat.js +146 -0
  1572. package/dist/tui/theme/syntax-theme.js +49 -0
  1573. package/dist/tui/theme/theme.js +119 -0
  1574. package/dist/tui/tui-command-handlers.js +418 -0
  1575. package/dist/tui/tui-event-handlers.js +160 -0
  1576. package/dist/tui/tui-formatters.js +158 -0
  1577. package/dist/tui/tui-local-shell.js +99 -0
  1578. package/dist/tui/tui-overlays.js +13 -0
  1579. package/dist/tui/tui-session-actions.js +205 -0
  1580. package/dist/tui/tui-status-summary.js +74 -0
  1581. package/dist/tui/tui-stream-assembler.js +54 -0
  1582. package/dist/tui/tui-types.js +1 -0
  1583. package/dist/tui/tui-waiting.js +34 -0
  1584. package/dist/tui/tui.js +551 -0
  1585. package/dist/utils/account-id.js +6 -0
  1586. package/dist/utils/boolean.js +22 -0
  1587. package/dist/utils/delivery-context.js +84 -0
  1588. package/dist/utils/directive-tags.js +54 -0
  1589. package/dist/utils/message-channel.js +84 -0
  1590. package/dist/utils/provider-utils.js +28 -0
  1591. package/dist/utils/queue-helpers.js +95 -0
  1592. package/dist/utils/time-format.js +19 -0
  1593. package/dist/utils/usage-format.js +46 -0
  1594. package/dist/utils.js +247 -0
  1595. package/dist/version.js +18 -0
  1596. package/dist/web/accounts.js +122 -0
  1597. package/dist/web/active-listener.js +37 -0
  1598. package/dist/web/auth-store.js +168 -0
  1599. package/dist/web/auto-reply/constants.js +1 -0
  1600. package/dist/web/auto-reply/deliver-reply.js +140 -0
  1601. package/dist/web/auto-reply/heartbeat-runner.js +264 -0
  1602. package/dist/web/auto-reply/loggers.js +5 -0
  1603. package/dist/web/auto-reply/mentions.js +79 -0
  1604. package/dist/web/auto-reply/monitor/ack-reaction.js +47 -0
  1605. package/dist/web/auto-reply/monitor/broadcast.js +64 -0
  1606. package/dist/web/auto-reply/monitor/commands.js +21 -0
  1607. package/dist/web/auto-reply/monitor/echo.js +36 -0
  1608. package/dist/web/auto-reply/monitor/group-activation.js +37 -0
  1609. package/dist/web/auto-reply/monitor/group-gating.js +98 -0
  1610. package/dist/web/auto-reply/monitor/group-members.js +53 -0
  1611. package/dist/web/auto-reply/monitor/last-route.js +38 -0
  1612. package/dist/web/auto-reply/monitor/message-line.js +35 -0
  1613. package/dist/web/auto-reply/monitor/on-message.js +128 -0
  1614. package/dist/web/auto-reply/monitor/peer.js +10 -0
  1615. package/dist/web/auto-reply/monitor/process-message.js +316 -0
  1616. package/dist/web/auto-reply/monitor.js +355 -0
  1617. package/dist/web/auto-reply/session-snapshot.js +40 -0
  1618. package/dist/web/auto-reply/types.js +1 -0
  1619. package/dist/web/auto-reply/util.js +47 -0
  1620. package/dist/web/auto-reply.impl.js +5 -0
  1621. package/dist/web/auto-reply.js +1 -0
  1622. package/dist/web/inbound/access-control.js +147 -0
  1623. package/dist/web/inbound/dedupe.js +13 -0
  1624. package/dist/web/inbound/extract.js +254 -0
  1625. package/dist/web/inbound/media.js +35 -0
  1626. package/dist/web/inbound/monitor.js +332 -0
  1627. package/dist/web/inbound/send-api.js +90 -0
  1628. package/dist/web/inbound/types.js +1 -0
  1629. package/dist/web/inbound.js +3 -0
  1630. package/dist/web/login-qr.js +227 -0
  1631. package/dist/web/login.js +68 -0
  1632. package/dist/web/media.js +252 -0
  1633. package/dist/web/outbound.js +132 -0
  1634. package/dist/web/qr-image.js +95 -0
  1635. package/dist/web/reconnect.js +36 -0
  1636. package/dist/web/session.js +224 -0
  1637. package/dist/web/vcard.js +63 -0
  1638. package/dist/whatsapp/normalize.js +66 -0
  1639. package/dist/wizard/clack-prompter.js +72 -0
  1640. package/dist/wizard/onboarding.finalize.js +351 -0
  1641. package/dist/wizard/onboarding.gateway-config.js +198 -0
  1642. package/dist/wizard/onboarding.js +375 -0
  1643. package/dist/wizard/onboarding.types.js +1 -0
  1644. package/dist/wizard/prompts.js +6 -0
  1645. package/dist/wizard/session.js +201 -0
  1646. package/docs/CNAME +1 -0
  1647. package/docs/_config.yml +53 -0
  1648. package/docs/_layouts/default.html +144 -0
  1649. package/docs/assets/markdown.css +179 -0
  1650. package/docs/assets/pixel-lobster.svg +60 -0
  1651. package/docs/assets/showcase/agents-ui.jpg +0 -0
  1652. package/docs/assets/showcase/bambu-cli.png +0 -0
  1653. package/docs/assets/showcase/codexmonitor.png +0 -0
  1654. package/docs/assets/showcase/gohome-grafana.png +0 -0
  1655. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  1656. package/docs/assets/showcase/oura-health.png +0 -0
  1657. package/docs/assets/showcase/padel-cli.svg +11 -0
  1658. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  1659. package/docs/assets/showcase/papla-tts.jpg +0 -0
  1660. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  1661. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  1662. package/docs/assets/showcase/roborock-status.svg +13 -0
  1663. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  1664. package/docs/assets/showcase/snag.png +0 -0
  1665. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  1666. package/docs/assets/showcase/wienerlinien.png +0 -0
  1667. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  1668. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  1669. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  1670. package/docs/assets/terminal.css +470 -0
  1671. package/docs/assets/theme.js +55 -0
  1672. package/docs/automation/auth-monitoring.md +41 -0
  1673. package/docs/automation/cron-jobs.md +286 -0
  1674. package/docs/automation/cron-vs-heartbeat.md +274 -0
  1675. package/docs/automation/gmail-pubsub.md +252 -0
  1676. package/docs/automation/poll.md +63 -0
  1677. package/docs/automation/webhook.md +155 -0
  1678. package/docs/bedrock.md +172 -0
  1679. package/docs/brave-search.md +40 -0
  1680. package/docs/broadcast-groups.md +407 -0
  1681. package/docs/channels/bluebubbles.md +232 -0
  1682. package/docs/channels/discord.md +399 -0
  1683. package/docs/channels/feishu.md +661 -0
  1684. package/docs/channels/googlechat.md +220 -0
  1685. package/docs/channels/grammy.md +27 -0
  1686. package/docs/channels/imessage.md +261 -0
  1687. package/docs/channels/index.md +43 -0
  1688. package/docs/channels/line.md +183 -0
  1689. package/docs/channels/location.md +48 -0
  1690. package/docs/channels/matrix.md +230 -0
  1691. package/docs/channels/mattermost.md +123 -0
  1692. package/docs/channels/msteams.md +703 -0
  1693. package/docs/channels/nextcloud-talk.md +120 -0
  1694. package/docs/channels/nostr.md +235 -0
  1695. package/docs/channels/signal.md +179 -0
  1696. package/docs/channels/slack.md +507 -0
  1697. package/docs/channels/telegram.md +351 -0
  1698. package/docs/channels/tlon.md +133 -0
  1699. package/docs/channels/troubleshooting.md +25 -0
  1700. package/docs/channels/whatsapp.md +362 -0
  1701. package/docs/channels/zalo.md +167 -0
  1702. package/docs/channels/zalouser.md +123 -0
  1703. package/docs/cli/acp.md +166 -0
  1704. package/docs/cli/agent.md +22 -0
  1705. package/docs/cli/agents.md +71 -0
  1706. package/docs/cli/approvals.md +48 -0
  1707. package/docs/cli/browser.md +106 -0
  1708. package/docs/cli/channels.md +75 -0
  1709. package/docs/cli/config.md +49 -0
  1710. package/docs/cli/configure.md +30 -0
  1711. package/docs/cli/cron.md +29 -0
  1712. package/docs/cli/dashboard.md +16 -0
  1713. package/docs/cli/devices.md +66 -0
  1714. package/docs/cli/directory.md +60 -0
  1715. package/docs/cli/dns.md +22 -0
  1716. package/docs/cli/docs.md +15 -0
  1717. package/docs/cli/doctor.md +38 -0
  1718. package/docs/cli/gateway.md +187 -0
  1719. package/docs/cli/health.md +19 -0
  1720. package/docs/cli/hooks.md +290 -0
  1721. package/docs/cli/index.md +924 -0
  1722. package/docs/cli/logs.md +23 -0
  1723. package/docs/cli/memory.md +41 -0
  1724. package/docs/cli/message.md +228 -0
  1725. package/docs/cli/models.md +68 -0
  1726. package/docs/cli/node.md +108 -0
  1727. package/docs/cli/nodes.md +68 -0
  1728. package/docs/cli/onboard.md +25 -0
  1729. package/docs/cli/pairing.md +20 -0
  1730. package/docs/cli/plugins.md +60 -0
  1731. package/docs/cli/reset.md +17 -0
  1732. package/docs/cli/sandbox.md +150 -0
  1733. package/docs/cli/security.md +24 -0
  1734. package/docs/cli/sessions.md +16 -0
  1735. package/docs/cli/setup.md +28 -0
  1736. package/docs/cli/skills.md +25 -0
  1737. package/docs/cli/status.md +24 -0
  1738. package/docs/cli/system.md +55 -0
  1739. package/docs/cli/tui.md +22 -0
  1740. package/docs/cli/uninstall.md +17 -0
  1741. package/docs/cli/update.md +96 -0
  1742. package/docs/cli/voicecall.md +33 -0
  1743. package/docs/cli/webhooks.md +23 -0
  1744. package/docs/concepts/agent-loop.md +126 -0
  1745. package/docs/concepts/agent-workspace.md +231 -0
  1746. package/docs/concepts/agent.md +117 -0
  1747. package/docs/concepts/architecture.md +122 -0
  1748. package/docs/concepts/channel-routing.md +114 -0
  1749. package/docs/concepts/compaction.md +49 -0
  1750. package/docs/concepts/context.md +151 -0
  1751. package/docs/concepts/group-messages.md +78 -0
  1752. package/docs/concepts/groups.md +308 -0
  1753. package/docs/concepts/markdown-formatting.md +132 -0
  1754. package/docs/concepts/memory.md +362 -0
  1755. package/docs/concepts/messages.md +143 -0
  1756. package/docs/concepts/model-failover.md +139 -0
  1757. package/docs/concepts/model-providers.md +318 -0
  1758. package/docs/concepts/models.md +202 -0
  1759. package/docs/concepts/multi-agent.md +354 -0
  1760. package/docs/concepts/oauth.md +162 -0
  1761. package/docs/concepts/presence.md +98 -0
  1762. package/docs/concepts/queue.md +77 -0
  1763. package/docs/concepts/retry.md +60 -0
  1764. package/docs/concepts/session-pruning.md +104 -0
  1765. package/docs/concepts/session-tool.md +171 -0
  1766. package/docs/concepts/session.md +150 -0
  1767. package/docs/concepts/sessions.md +8 -0
  1768. package/docs/concepts/streaming.md +123 -0
  1769. package/docs/concepts/system-prompt.md +110 -0
  1770. package/docs/concepts/timezone.md +89 -0
  1771. package/docs/concepts/typebox.md +281 -0
  1772. package/docs/concepts/typing-indicators.md +59 -0
  1773. package/docs/concepts/usage-tracking.md +30 -0
  1774. package/docs/date-time.md +127 -0
  1775. package/docs/debug/node-issue.md +72 -0
  1776. package/docs/debugging.md +161 -0
  1777. package/docs/diagnostics/flags.md +89 -0
  1778. package/docs/docs.json +1135 -0
  1779. package/docs/environment.md +78 -0
  1780. package/docs/experiments/onboarding-config-protocol.md +34 -0
  1781. package/docs/experiments/plans/cron-add-hardening.md +57 -0
  1782. package/docs/experiments/plans/group-policy-hardening.md +38 -0
  1783. package/docs/experiments/plans/openresponses-gateway.md +122 -0
  1784. package/docs/experiments/proposals/model-config.md +32 -0
  1785. package/docs/experiments/research/memory.md +210 -0
  1786. package/docs/gateway/authentication.md +167 -0
  1787. package/docs/gateway/background-process.md +82 -0
  1788. package/docs/gateway/bonjour.md +162 -0
  1789. package/docs/gateway/bridge-protocol.md +85 -0
  1790. package/docs/gateway/cli-backends.md +221 -0
  1791. package/docs/gateway/configuration-examples.md +572 -0
  1792. package/docs/gateway/configuration.md +3256 -0
  1793. package/docs/gateway/discovery.md +110 -0
  1794. package/docs/gateway/doctor.md +252 -0
  1795. package/docs/gateway/gateway-lock.md +28 -0
  1796. package/docs/gateway/health.md +29 -0
  1797. package/docs/gateway/heartbeat.md +297 -0
  1798. package/docs/gateway/index.md +284 -0
  1799. package/docs/gateway/local-models.md +146 -0
  1800. package/docs/gateway/logging.md +112 -0
  1801. package/docs/gateway/multiple-gateways.md +107 -0
  1802. package/docs/gateway/openai-http-api.md +112 -0
  1803. package/docs/gateway/openresponses-http-api.md +298 -0
  1804. package/docs/gateway/pairing-required-troubleshooting.md +243 -0
  1805. package/docs/gateway/pairing.md +92 -0
  1806. package/docs/gateway/protocol.md +215 -0
  1807. package/docs/gateway/remote-gateway-readme.md +153 -0
  1808. package/docs/gateway/remote.md +122 -0
  1809. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +117 -0
  1810. package/docs/gateway/sandboxing.md +174 -0
  1811. package/docs/gateway/security.md +724 -0
  1812. package/docs/gateway/tailscale.md +143 -0
  1813. package/docs/gateway/token-mismatch-troubleshooting.md +66 -0
  1814. package/docs/gateway/tools-invoke-http-api.md +79 -0
  1815. package/docs/gateway/troubleshooting.md +966 -0
  1816. package/docs/guides/custom-ai-providers.md +513 -0
  1817. package/docs/guides/ssl-deployment.md +294 -0
  1818. package/docs/help/faq.md +2735 -0
  1819. package/docs/help/index.md +20 -0
  1820. package/docs/help/troubleshooting.md +97 -0
  1821. package/docs/hooks/soul-evil.md +68 -0
  1822. package/docs/hooks.md +896 -0
  1823. package/docs/images/feishu-step2-create-app.png +0 -0
  1824. package/docs/images/feishu-step3-credentials.png +0 -0
  1825. package/docs/images/feishu-step4-permissions.png +0 -0
  1826. package/docs/images/feishu-step5-bot-capability.png +0 -0
  1827. package/docs/images/feishu-step6-event-subscription.png +0 -0
  1828. package/docs/images/groups-flow.svg +52 -0
  1829. package/docs/images/main-view.png +0 -0
  1830. package/docs/images/mobile-ui-screenshot.png +0 -0
  1831. package/docs/images/telegram-botfather-newbot.png +0 -0
  1832. package/docs/images/telegram-botfather-start.png +0 -0
  1833. package/docs/images/telegram-botfather-token.png +0 -0
  1834. package/docs/images/telegram-search-botfather.png +0 -0
  1835. package/docs/index.md +240 -0
  1836. package/docs/install/ansible.md +205 -0
  1837. package/docs/install/bun.md +58 -0
  1838. package/docs/install/development-channels.md +74 -0
  1839. package/docs/install/docker-hub-setup.md +153 -0
  1840. package/docs/install/docker-quick.md +414 -0
  1841. package/docs/install/docker.md +870 -0
  1842. package/docs/install/index.md +180 -0
  1843. package/docs/install/installer.md +120 -0
  1844. package/docs/install/nix.md +93 -0
  1845. package/docs/install/node.md +77 -0
  1846. package/docs/install/uninstall.md +137 -0
  1847. package/docs/install/updating.md +301 -0
  1848. package/docs/logging.md +343 -0
  1849. package/docs/multi-agent-sandbox-tools.md +374 -0
  1850. package/docs/network.md +51 -0
  1851. package/docs/nodes/audio.md +109 -0
  1852. package/docs/nodes/camera.md +152 -0
  1853. package/docs/nodes/images.md +61 -0
  1854. package/docs/nodes/index.md +305 -0
  1855. package/docs/nodes/location-command.md +95 -0
  1856. package/docs/nodes/media-understanding.md +313 -0
  1857. package/docs/nodes/talk.md +79 -0
  1858. package/docs/nodes/voicewake.md +61 -0
  1859. package/docs/npm-publish-guide.md +146 -0
  1860. package/docs/npm-ssh-config.md +180 -0
  1861. package/docs/perplexity.md +79 -0
  1862. package/docs/platforms/android.md +141 -0
  1863. package/docs/platforms/digitalocean.md +251 -0
  1864. package/docs/platforms/exe-dev.md +187 -0
  1865. package/docs/platforms/fly.md +465 -0
  1866. package/docs/platforms/gcp.md +498 -0
  1867. package/docs/platforms/hetzner.md +325 -0
  1868. package/docs/platforms/index.md +50 -0
  1869. package/docs/platforms/ios.md +104 -0
  1870. package/docs/platforms/linux.md +89 -0
  1871. package/docs/platforms/mac/bundled-gateway.md +67 -0
  1872. package/docs/platforms/mac/canvas.md +121 -0
  1873. package/docs/platforms/mac/child-process.md +67 -0
  1874. package/docs/platforms/mac/dev-setup.md +91 -0
  1875. package/docs/platforms/mac/health.md +28 -0
  1876. package/docs/platforms/mac/icon.md +26 -0
  1877. package/docs/platforms/mac/logging.md +51 -0
  1878. package/docs/platforms/mac/menu-bar.md +70 -0
  1879. package/docs/platforms/mac/peekaboo.md +62 -0
  1880. package/docs/platforms/mac/permissions.md +40 -0
  1881. package/docs/platforms/mac/release.md +77 -0
  1882. package/docs/platforms/mac/remote.md +71 -0
  1883. package/docs/platforms/mac/signing.md +43 -0
  1884. package/docs/platforms/mac/skills.md +27 -0
  1885. package/docs/platforms/mac/voice-overlay.md +52 -0
  1886. package/docs/platforms/mac/voicewake.md +56 -0
  1887. package/docs/platforms/mac/webchat.md +39 -0
  1888. package/docs/platforms/mac/xpc.md +51 -0
  1889. package/docs/platforms/macos-vm.md +275 -0
  1890. package/docs/platforms/macos.md +195 -0
  1891. package/docs/platforms/raspberry-pi.md +354 -0
  1892. package/docs/platforms/windows.md +153 -0
  1893. package/docs/plugin.md +638 -0
  1894. package/docs/plugins/agent-tools.md +96 -0
  1895. package/docs/plugins/manifest.md +67 -0
  1896. package/docs/plugins/voice-call.md +238 -0
  1897. package/docs/plugins/zalouser.md +75 -0
  1898. package/docs/prose.md +131 -0
  1899. package/docs/providers/anthropic.md +127 -0
  1900. package/docs/providers/claude-max-api-proxy.md +145 -0
  1901. package/docs/providers/deepgram.md +88 -0
  1902. package/docs/providers/github-copilot.md +63 -0
  1903. package/docs/providers/glm.md +31 -0
  1904. package/docs/providers/index.md +58 -0
  1905. package/docs/providers/minimax.md +201 -0
  1906. package/docs/providers/models.md +48 -0
  1907. package/docs/providers/moonshot.md +154 -0
  1908. package/docs/providers/ollama.md +219 -0
  1909. package/docs/providers/openai.md +64 -0
  1910. package/docs/providers/opencode.md +34 -0
  1911. package/docs/providers/openrouter.md +36 -0
  1912. package/docs/providers/qwen.md +51 -0
  1913. package/docs/providers/synthetic.md +97 -0
  1914. package/docs/providers/venice.md +264 -0
  1915. package/docs/providers/vercel-ai-gateway.md +48 -0
  1916. package/docs/providers/volcengine.md +114 -0
  1917. package/docs/providers/zai.md +34 -0
  1918. package/docs/railway.mdx +96 -0
  1919. package/docs/refactor/clawnet.md +360 -0
  1920. package/docs/refactor/exec-host.md +265 -0
  1921. package/docs/refactor/outbound-session-mirroring.md +75 -0
  1922. package/docs/refactor/plugin-sdk.md +187 -0
  1923. package/docs/refactor/strict-config.md +81 -0
  1924. package/docs/reference/AGENTS.default.md +113 -0
  1925. package/docs/reference/RELEASING.md +107 -0
  1926. package/docs/reference/api-usage-costs.md +116 -0
  1927. package/docs/reference/device-models.md +46 -0
  1928. package/docs/reference/rpc.md +35 -0
  1929. package/docs/reference/session-management-compaction.md +273 -0
  1930. package/docs/reference/templates/AGENTS.dev.md +78 -0
  1931. package/docs/reference/templates/AGENTS.md +196 -0
  1932. package/docs/reference/templates/BOOT.md +9 -0
  1933. package/docs/reference/templates/BOOTSTRAP.md +55 -0
  1934. package/docs/reference/templates/HEARTBEAT.md +9 -0
  1935. package/docs/reference/templates/IDENTITY.dev.md +40 -0
  1936. package/docs/reference/templates/IDENTITY.md +27 -0
  1937. package/docs/reference/templates/SOUL.dev.md +74 -0
  1938. package/docs/reference/templates/SOUL.md +41 -0
  1939. package/docs/reference/templates/TOOLS.dev.md +21 -0
  1940. package/docs/reference/templates/TOOLS.md +41 -0
  1941. package/docs/reference/templates/USER.dev.md +17 -0
  1942. package/docs/reference/templates/USER.md +22 -0
  1943. package/docs/reference/test.md +46 -0
  1944. package/docs/reference/transcript-hygiene.md +95 -0
  1945. package/docs/render.mdx +158 -0
  1946. package/docs/scripts.md +31 -0
  1947. package/docs/start/clawd.md +227 -0
  1948. package/docs/start/getting-started.md +196 -0
  1949. package/docs/start/hubs.md +182 -0
  1950. package/docs/start/lore.md +130 -0
  1951. package/docs/start/onboarding.md +94 -0
  1952. package/docs/start/pairing.md +80 -0
  1953. package/docs/start/setup.md +128 -0
  1954. package/docs/start/showcase.md +416 -0
  1955. package/docs/start/wizard.md +312 -0
  1956. package/docs/testing.md +349 -0
  1957. package/docs/token-use.md +110 -0
  1958. package/docs/tools/agent-send.md +51 -0
  1959. package/docs/tools/apply-patch.md +49 -0
  1960. package/docs/tools/browser-linux-troubleshooting.md +159 -0
  1961. package/docs/tools/browser-login.md +83 -0
  1962. package/docs/tools/browser.md +353 -0
  1963. package/docs/tools/chrome-extension.md +150 -0
  1964. package/docs/tools/clawdhub.md +201 -0
  1965. package/docs/tools/creating-skills.md +41 -0
  1966. package/docs/tools/elevated.md +48 -0
  1967. package/docs/tools/exec-approvals.md +223 -0
  1968. package/docs/tools/exec.md +156 -0
  1969. package/docs/tools/firecrawl.md +58 -0
  1970. package/docs/tools/index.md +445 -0
  1971. package/docs/tools/llm-task.md +114 -0
  1972. package/docs/tools/lobster.md +326 -0
  1973. package/docs/tools/reactions.md +20 -0
  1974. package/docs/tools/skills-config.md +75 -0
  1975. package/docs/tools/skills.md +259 -0
  1976. package/docs/tools/slash-commands.md +188 -0
  1977. package/docs/tools/subagents.md +137 -0
  1978. package/docs/tools/thinking.md +62 -0
  1979. package/docs/tools/web.md +257 -0
  1980. package/docs/tts.md +389 -0
  1981. package/docs/tui.md +134 -0
  1982. package/docs/vps.md +38 -0
  1983. package/docs/web/control-ui.md +163 -0
  1984. package/docs/web/dashboard.md +38 -0
  1985. package/docs/web/index.md +110 -0
  1986. package/docs/web/webchat.md +41 -0
  1987. package/docs/whatsapp-clawd.jpg +0 -0
  1988. package/extensions/bluebubbles/index.ts +20 -0
  1989. package/extensions/bluebubbles/openclaw.plugin.json +11 -0
  1990. package/extensions/bluebubbles/package.json +33 -0
  1991. package/extensions/bluebubbles/src/accounts.ts +80 -0
  1992. package/extensions/bluebubbles/src/actions.test.ts +651 -0
  1993. package/extensions/bluebubbles/src/actions.ts +403 -0
  1994. package/extensions/bluebubbles/src/attachments.test.ts +346 -0
  1995. package/extensions/bluebubbles/src/attachments.ts +282 -0
  1996. package/extensions/bluebubbles/src/channel.ts +399 -0
  1997. package/extensions/bluebubbles/src/chat.test.ts +462 -0
  1998. package/extensions/bluebubbles/src/chat.ts +354 -0
  1999. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  2000. package/extensions/bluebubbles/src/media-send.ts +168 -0
  2001. package/extensions/bluebubbles/src/monitor.test.ts +2270 -0
  2002. package/extensions/bluebubbles/src/monitor.ts +2291 -0
  2003. package/extensions/bluebubbles/src/onboarding.ts +340 -0
  2004. package/extensions/bluebubbles/src/probe.ts +127 -0
  2005. package/extensions/bluebubbles/src/reactions.test.ts +393 -0
  2006. package/extensions/bluebubbles/src/reactions.ts +183 -0
  2007. package/extensions/bluebubbles/src/runtime.ts +14 -0
  2008. package/extensions/bluebubbles/src/send.test.ts +809 -0
  2009. package/extensions/bluebubbles/src/send.ts +418 -0
  2010. package/extensions/bluebubbles/src/targets.test.ts +184 -0
  2011. package/extensions/bluebubbles/src/targets.ts +323 -0
  2012. package/extensions/bluebubbles/src/types.ts +127 -0
  2013. package/extensions/copilot-proxy/README.md +24 -0
  2014. package/extensions/copilot-proxy/index.ts +142 -0
  2015. package/extensions/copilot-proxy/openclaw.plugin.json +11 -0
  2016. package/extensions/copilot-proxy/package.json +11 -0
  2017. package/extensions/diagnostics-otel/index.ts +16 -0
  2018. package/extensions/diagnostics-otel/openclaw.plugin.json +8 -0
  2019. package/extensions/diagnostics-otel/package.json +24 -0
  2020. package/extensions/diagnostics-otel/src/service.test.ts +220 -0
  2021. package/extensions/diagnostics-otel/src/service.ts +566 -0
  2022. package/extensions/discord/index.ts +18 -0
  2023. package/extensions/discord/openclaw.plugin.json +11 -0
  2024. package/extensions/discord/package.json +11 -0
  2025. package/extensions/discord/src/channel.ts +422 -0
  2026. package/extensions/discord/src/runtime.ts +14 -0
  2027. package/extensions/feishu/PUBLISHING.md +142 -0
  2028. package/extensions/feishu/PUBLISH_CHECKLIST.md +46 -0
  2029. package/extensions/feishu/README.md +86 -0
  2030. package/extensions/feishu/dist/index.d.ts +37 -0
  2031. package/extensions/feishu/dist/index.d.ts.map +1 -0
  2032. package/extensions/feishu/dist/index.js +16 -0
  2033. package/extensions/feishu/dist/index.js.map +1 -0
  2034. package/extensions/feishu/dist/src/channel.d.ts +3 -0
  2035. package/extensions/feishu/dist/src/channel.d.ts.map +1 -0
  2036. package/extensions/feishu/dist/src/channel.js +116 -0
  2037. package/extensions/feishu/dist/src/channel.js.map +1 -0
  2038. package/extensions/feishu/dist/src/config-schema.d.ts +7 -0
  2039. package/extensions/feishu/dist/src/config-schema.d.ts.map +1 -0
  2040. package/extensions/feishu/dist/src/config-schema.js +7 -0
  2041. package/extensions/feishu/dist/src/config-schema.js.map +1 -0
  2042. package/extensions/feishu/dist/src/onboarding.d.ts +3 -0
  2043. package/extensions/feishu/dist/src/onboarding.d.ts.map +1 -0
  2044. package/extensions/feishu/dist/src/onboarding.js +121 -0
  2045. package/extensions/feishu/dist/src/onboarding.js.map +1 -0
  2046. package/extensions/feishu/dist/src/runtime.d.ts +4 -0
  2047. package/extensions/feishu/dist/src/runtime.d.ts.map +1 -0
  2048. package/extensions/feishu/dist/src/runtime.js +11 -0
  2049. package/extensions/feishu/dist/src/runtime.js.map +1 -0
  2050. package/extensions/feishu/openclaw.plugin.json +11 -0
  2051. package/extensions/feishu/package.json +79 -0
  2052. package/extensions/google-antigravity-auth/README.md +24 -0
  2053. package/extensions/google-antigravity-auth/index.ts +437 -0
  2054. package/extensions/google-antigravity-auth/openclaw.plugin.json +11 -0
  2055. package/extensions/google-antigravity-auth/package.json +11 -0
  2056. package/extensions/google-gemini-cli-auth/README.md +35 -0
  2057. package/extensions/google-gemini-cli-auth/index.ts +91 -0
  2058. package/extensions/google-gemini-cli-auth/oauth.test.ts +228 -0
  2059. package/extensions/google-gemini-cli-auth/oauth.ts +580 -0
  2060. package/extensions/google-gemini-cli-auth/openclaw.plugin.json +11 -0
  2061. package/extensions/google-gemini-cli-auth/package.json +11 -0
  2062. package/extensions/googlechat/index.ts +20 -0
  2063. package/extensions/googlechat/openclaw.plugin.json +11 -0
  2064. package/extensions/googlechat/package.json +39 -0
  2065. package/extensions/googlechat/src/accounts.ts +133 -0
  2066. package/extensions/googlechat/src/actions.ts +162 -0
  2067. package/extensions/googlechat/src/api.test.ts +62 -0
  2068. package/extensions/googlechat/src/api.ts +259 -0
  2069. package/extensions/googlechat/src/auth.ts +113 -0
  2070. package/extensions/googlechat/src/channel.ts +580 -0
  2071. package/extensions/googlechat/src/monitor.test.ts +27 -0
  2072. package/extensions/googlechat/src/monitor.ts +900 -0
  2073. package/extensions/googlechat/src/onboarding.ts +278 -0
  2074. package/extensions/googlechat/src/runtime.ts +14 -0
  2075. package/extensions/googlechat/src/targets.test.ts +35 -0
  2076. package/extensions/googlechat/src/targets.ts +55 -0
  2077. package/extensions/googlechat/src/types.config.ts +3 -0
  2078. package/extensions/googlechat/src/types.ts +73 -0
  2079. package/extensions/imessage/index.ts +18 -0
  2080. package/extensions/imessage/openclaw.plugin.json +11 -0
  2081. package/extensions/imessage/package.json +11 -0
  2082. package/extensions/imessage/src/channel.ts +294 -0
  2083. package/extensions/imessage/src/runtime.ts +14 -0
  2084. package/extensions/line/index.ts +20 -0
  2085. package/extensions/line/openclaw.plugin.json +11 -0
  2086. package/extensions/line/package.json +32 -0
  2087. package/extensions/line/src/card-command.ts +338 -0
  2088. package/extensions/line/src/channel.logout.test.ts +96 -0
  2089. package/extensions/line/src/channel.sendPayload.test.ts +308 -0
  2090. package/extensions/line/src/channel.ts +781 -0
  2091. package/extensions/line/src/runtime.ts +14 -0
  2092. package/extensions/llm-task/README.md +97 -0
  2093. package/extensions/llm-task/index.ts +7 -0
  2094. package/extensions/llm-task/openclaw.plugin.json +21 -0
  2095. package/extensions/llm-task/package.json +11 -0
  2096. package/extensions/llm-task/src/llm-task-tool.test.ts +117 -0
  2097. package/extensions/llm-task/src/llm-task-tool.ts +218 -0
  2098. package/extensions/lobster/README.md +80 -0
  2099. package/extensions/lobster/SKILL.md +90 -0
  2100. package/extensions/lobster/index.ts +13 -0
  2101. package/extensions/lobster/openclaw.plugin.json +10 -0
  2102. package/extensions/lobster/package.json +11 -0
  2103. package/extensions/lobster/src/lobster-tool.test.ts +123 -0
  2104. package/extensions/lobster/src/lobster-tool.ts +222 -0
  2105. package/extensions/matrix/CHANGELOG.md +84 -0
  2106. package/extensions/matrix/index.ts +18 -0
  2107. package/extensions/matrix/openclaw.plugin.json +11 -0
  2108. package/extensions/matrix/package.json +36 -0
  2109. package/extensions/matrix/src/actions.ts +185 -0
  2110. package/extensions/matrix/src/channel.directory.test.ts +56 -0
  2111. package/extensions/matrix/src/channel.ts +417 -0
  2112. package/extensions/matrix/src/config-schema.ts +62 -0
  2113. package/extensions/matrix/src/directory-live.ts +175 -0
  2114. package/extensions/matrix/src/group-mentions.ts +61 -0
  2115. package/extensions/matrix/src/matrix/accounts.test.ts +83 -0
  2116. package/extensions/matrix/src/matrix/accounts.ts +63 -0
  2117. package/extensions/matrix/src/matrix/actions/client.ts +53 -0
  2118. package/extensions/matrix/src/matrix/actions/messages.ts +120 -0
  2119. package/extensions/matrix/src/matrix/actions/pins.ts +70 -0
  2120. package/extensions/matrix/src/matrix/actions/reactions.ts +84 -0
  2121. package/extensions/matrix/src/matrix/actions/room.ts +88 -0
  2122. package/extensions/matrix/src/matrix/actions/summary.ts +77 -0
  2123. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  2124. package/extensions/matrix/src/matrix/actions.ts +15 -0
  2125. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  2126. package/extensions/matrix/src/matrix/client/config.ts +165 -0
  2127. package/extensions/matrix/src/matrix/client/create-client.ts +127 -0
  2128. package/extensions/matrix/src/matrix/client/logging.ts +35 -0
  2129. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  2130. package/extensions/matrix/src/matrix/client/shared.ts +169 -0
  2131. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  2132. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  2133. package/extensions/matrix/src/matrix/client.test.ts +57 -0
  2134. package/extensions/matrix/src/matrix/client.ts +9 -0
  2135. package/extensions/matrix/src/matrix/credentials.ts +103 -0
  2136. package/extensions/matrix/src/matrix/deps.ts +57 -0
  2137. package/extensions/matrix/src/matrix/format.test.ts +34 -0
  2138. package/extensions/matrix/src/matrix/format.ts +22 -0
  2139. package/extensions/matrix/src/matrix/index.ts +11 -0
  2140. package/extensions/matrix/src/matrix/monitor/allowlist.ts +58 -0
  2141. package/extensions/matrix/src/matrix/monitor/auto-join.ts +68 -0
  2142. package/extensions/matrix/src/matrix/monitor/direct.ts +105 -0
  2143. package/extensions/matrix/src/matrix/monitor/events.ts +103 -0
  2144. package/extensions/matrix/src/matrix/monitor/handler.ts +645 -0
  2145. package/extensions/matrix/src/matrix/monitor/index.ts +279 -0
  2146. package/extensions/matrix/src/matrix/monitor/location.ts +83 -0
  2147. package/extensions/matrix/src/matrix/monitor/media.test.ts +103 -0
  2148. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  2149. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  2150. package/extensions/matrix/src/matrix/monitor/replies.ts +96 -0
  2151. package/extensions/matrix/src/matrix/monitor/room-info.ts +58 -0
  2152. package/extensions/matrix/src/matrix/monitor/rooms.ts +43 -0
  2153. package/extensions/matrix/src/matrix/monitor/threads.ts +64 -0
  2154. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  2155. package/extensions/matrix/src/matrix/poll-types.test.ts +22 -0
  2156. package/extensions/matrix/src/matrix/poll-types.ts +157 -0
  2157. package/extensions/matrix/src/matrix/probe.ts +70 -0
  2158. package/extensions/matrix/src/matrix/send/client.ts +63 -0
  2159. package/extensions/matrix/src/matrix/send/formatting.ts +92 -0
  2160. package/extensions/matrix/src/matrix/send/media.ts +220 -0
  2161. package/extensions/matrix/src/matrix/send/targets.test.ts +102 -0
  2162. package/extensions/matrix/src/matrix/send/targets.ts +144 -0
  2163. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  2164. package/extensions/matrix/src/matrix/send.test.ts +172 -0
  2165. package/extensions/matrix/src/matrix/send.ts +255 -0
  2166. package/extensions/matrix/src/onboarding.ts +432 -0
  2167. package/extensions/matrix/src/outbound.ts +53 -0
  2168. package/extensions/matrix/src/resolve-targets.ts +89 -0
  2169. package/extensions/matrix/src/runtime.ts +14 -0
  2170. package/extensions/matrix/src/tool-actions.ts +160 -0
  2171. package/extensions/matrix/src/types.ts +95 -0
  2172. package/extensions/mattermost/index.ts +18 -0
  2173. package/extensions/mattermost/openclaw.plugin.json +11 -0
  2174. package/extensions/mattermost/package.json +25 -0
  2175. package/extensions/mattermost/src/channel.test.ts +43 -0
  2176. package/extensions/mattermost/src/channel.ts +339 -0
  2177. package/extensions/mattermost/src/config-schema.ts +56 -0
  2178. package/extensions/mattermost/src/group-mentions.ts +14 -0
  2179. package/extensions/mattermost/src/mattermost/accounts.ts +115 -0
  2180. package/extensions/mattermost/src/mattermost/client.ts +208 -0
  2181. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  2182. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +150 -0
  2183. package/extensions/mattermost/src/mattermost/monitor.ts +921 -0
  2184. package/extensions/mattermost/src/mattermost/probe.ts +70 -0
  2185. package/extensions/mattermost/src/mattermost/send.ts +217 -0
  2186. package/extensions/mattermost/src/normalize.ts +38 -0
  2187. package/extensions/mattermost/src/onboarding-helpers.ts +42 -0
  2188. package/extensions/mattermost/src/onboarding.ts +187 -0
  2189. package/extensions/mattermost/src/runtime.ts +14 -0
  2190. package/extensions/mattermost/src/types.ts +50 -0
  2191. package/extensions/memory-core/index.ts +36 -0
  2192. package/extensions/memory-core/openclaw.plugin.json +9 -0
  2193. package/extensions/memory-core/package.json +14 -0
  2194. package/extensions/memory-lancedb/config.ts +114 -0
  2195. package/extensions/memory-lancedb/index.test.ts +284 -0
  2196. package/extensions/memory-lancedb/index.ts +590 -0
  2197. package/extensions/memory-lancedb/openclaw.plugin.json +67 -0
  2198. package/extensions/memory-lancedb/package.json +16 -0
  2199. package/extensions/minimax-portal-auth/README.md +33 -0
  2200. package/extensions/minimax-portal-auth/index.ts +152 -0
  2201. package/extensions/minimax-portal-auth/oauth.ts +252 -0
  2202. package/extensions/minimax-portal-auth/openclaw.plugin.json +11 -0
  2203. package/extensions/minimax-portal-auth/package.json +11 -0
  2204. package/extensions/msteams/CHANGELOG.md +81 -0
  2205. package/extensions/msteams/index.ts +18 -0
  2206. package/extensions/msteams/openclaw.plugin.json +11 -0
  2207. package/extensions/msteams/package.json +36 -0
  2208. package/extensions/msteams/src/attachments/download.ts +206 -0
  2209. package/extensions/msteams/src/attachments/graph.ts +319 -0
  2210. package/extensions/msteams/src/attachments/html.ts +76 -0
  2211. package/extensions/msteams/src/attachments/payload.ts +22 -0
  2212. package/extensions/msteams/src/attachments/shared.ts +235 -0
  2213. package/extensions/msteams/src/attachments/types.ts +37 -0
  2214. package/extensions/msteams/src/attachments.test.ts +424 -0
  2215. package/extensions/msteams/src/attachments.ts +18 -0
  2216. package/extensions/msteams/src/channel.directory.test.ts +46 -0
  2217. package/extensions/msteams/src/channel.ts +436 -0
  2218. package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
  2219. package/extensions/msteams/src/conversation-store-fs.ts +155 -0
  2220. package/extensions/msteams/src/conversation-store-memory.ts +45 -0
  2221. package/extensions/msteams/src/conversation-store.ts +41 -0
  2222. package/extensions/msteams/src/directory-live.ts +179 -0
  2223. package/extensions/msteams/src/errors.test.ts +46 -0
  2224. package/extensions/msteams/src/errors.ts +158 -0
  2225. package/extensions/msteams/src/file-consent-helpers.test.ts +234 -0
  2226. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  2227. package/extensions/msteams/src/file-consent.ts +122 -0
  2228. package/extensions/msteams/src/graph-chat.ts +52 -0
  2229. package/extensions/msteams/src/graph-upload.ts +445 -0
  2230. package/extensions/msteams/src/inbound.test.ts +67 -0
  2231. package/extensions/msteams/src/inbound.ts +38 -0
  2232. package/extensions/msteams/src/index.ts +4 -0
  2233. package/extensions/msteams/src/media-helpers.test.ts +186 -0
  2234. package/extensions/msteams/src/media-helpers.ts +77 -0
  2235. package/extensions/msteams/src/messenger.test.ts +245 -0
  2236. package/extensions/msteams/src/messenger.ts +460 -0
  2237. package/extensions/msteams/src/monitor-handler/inbound-media.ts +123 -0
  2238. package/extensions/msteams/src/monitor-handler/message-handler.ts +629 -0
  2239. package/extensions/msteams/src/monitor-handler.ts +166 -0
  2240. package/extensions/msteams/src/monitor-types.ts +5 -0
  2241. package/extensions/msteams/src/monitor.ts +290 -0
  2242. package/extensions/msteams/src/onboarding.ts +432 -0
  2243. package/extensions/msteams/src/outbound.ts +47 -0
  2244. package/extensions/msteams/src/pending-uploads.ts +87 -0
  2245. package/extensions/msteams/src/policy.test.ts +210 -0
  2246. package/extensions/msteams/src/policy.ts +202 -0
  2247. package/extensions/msteams/src/polls-store-memory.ts +30 -0
  2248. package/extensions/msteams/src/polls-store.test.ts +40 -0
  2249. package/extensions/msteams/src/polls.test.ts +72 -0
  2250. package/extensions/msteams/src/polls.ts +299 -0
  2251. package/extensions/msteams/src/probe.test.ts +57 -0
  2252. package/extensions/msteams/src/probe.ts +99 -0
  2253. package/extensions/msteams/src/reply-dispatcher.ts +128 -0
  2254. package/extensions/msteams/src/resolve-allowlist.ts +277 -0
  2255. package/extensions/msteams/src/runtime.ts +14 -0
  2256. package/extensions/msteams/src/sdk-types.ts +19 -0
  2257. package/extensions/msteams/src/sdk.ts +33 -0
  2258. package/extensions/msteams/src/send-context.ts +156 -0
  2259. package/extensions/msteams/src/send.ts +489 -0
  2260. package/extensions/msteams/src/sent-message-cache.test.ts +16 -0
  2261. package/extensions/msteams/src/sent-message-cache.ts +41 -0
  2262. package/extensions/msteams/src/storage.ts +22 -0
  2263. package/extensions/msteams/src/store-fs.ts +80 -0
  2264. package/extensions/msteams/src/token.ts +19 -0
  2265. package/extensions/nextcloud-talk/index.ts +18 -0
  2266. package/extensions/nextcloud-talk/openclaw.plugin.json +11 -0
  2267. package/extensions/nextcloud-talk/package.json +30 -0
  2268. package/extensions/nextcloud-talk/src/accounts.ts +154 -0
  2269. package/extensions/nextcloud-talk/src/channel.ts +404 -0
  2270. package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
  2271. package/extensions/nextcloud-talk/src/format.ts +79 -0
  2272. package/extensions/nextcloud-talk/src/inbound.ts +336 -0
  2273. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  2274. package/extensions/nextcloud-talk/src/normalize.ts +31 -0
  2275. package/extensions/nextcloud-talk/src/onboarding.ts +341 -0
  2276. package/extensions/nextcloud-talk/src/policy.ts +175 -0
  2277. package/extensions/nextcloud-talk/src/room-info.ts +111 -0
  2278. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  2279. package/extensions/nextcloud-talk/src/send.ts +206 -0
  2280. package/extensions/nextcloud-talk/src/signature.ts +67 -0
  2281. package/extensions/nextcloud-talk/src/types.ts +179 -0
  2282. package/extensions/nostr/CHANGELOG.md +76 -0
  2283. package/extensions/nostr/README.md +136 -0
  2284. package/extensions/nostr/index.ts +69 -0
  2285. package/extensions/nostr/openclaw.plugin.json +11 -0
  2286. package/extensions/nostr/package.json +31 -0
  2287. package/extensions/nostr/src/channel.test.ts +141 -0
  2288. package/extensions/nostr/src/channel.ts +342 -0
  2289. package/extensions/nostr/src/config-schema.ts +90 -0
  2290. package/extensions/nostr/src/metrics.ts +464 -0
  2291. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +544 -0
  2292. package/extensions/nostr/src/nostr-bus.integration.test.ts +452 -0
  2293. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  2294. package/extensions/nostr/src/nostr-bus.ts +741 -0
  2295. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  2296. package/extensions/nostr/src/nostr-profile-http.ts +500 -0
  2297. package/extensions/nostr/src/nostr-profile-import.test.ts +120 -0
  2298. package/extensions/nostr/src/nostr-profile-import.ts +259 -0
  2299. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +479 -0
  2300. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  2301. package/extensions/nostr/src/nostr-profile.ts +242 -0
  2302. package/extensions/nostr/src/nostr-state-store.test.ts +128 -0
  2303. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  2304. package/extensions/nostr/src/runtime.ts +14 -0
  2305. package/extensions/nostr/src/seen-tracker.ts +271 -0
  2306. package/extensions/nostr/src/types.test.ts +161 -0
  2307. package/extensions/nostr/src/types.ts +99 -0
  2308. package/extensions/open-prose/README.md +25 -0
  2309. package/extensions/open-prose/index.ts +5 -0
  2310. package/extensions/open-prose/openclaw.plugin.json +11 -0
  2311. package/extensions/open-prose/package.json +11 -0
  2312. package/extensions/qwen-portal-auth/README.md +24 -0
  2313. package/extensions/qwen-portal-auth/index.ts +127 -0
  2314. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  2315. package/extensions/qwen-portal-auth/openclaw.plugin.json +11 -0
  2316. package/extensions/signal/index.ts +18 -0
  2317. package/extensions/signal/openclaw.plugin.json +11 -0
  2318. package/extensions/signal/package.json +11 -0
  2319. package/extensions/signal/src/channel.ts +312 -0
  2320. package/extensions/signal/src/runtime.ts +14 -0
  2321. package/extensions/slack/index.ts +18 -0
  2322. package/extensions/slack/openclaw.plugin.json +11 -0
  2323. package/extensions/slack/package.json +11 -0
  2324. package/extensions/slack/src/channel.ts +577 -0
  2325. package/extensions/slack/src/runtime.ts +14 -0
  2326. package/extensions/telegram/index.ts +18 -0
  2327. package/extensions/telegram/openclaw.plugin.json +11 -0
  2328. package/extensions/telegram/package.json +11 -0
  2329. package/extensions/telegram/src/channel.ts +478 -0
  2330. package/extensions/telegram/src/runtime.ts +14 -0
  2331. package/extensions/tlon/README.md +5 -0
  2332. package/extensions/tlon/index.ts +18 -0
  2333. package/extensions/tlon/openclaw.plugin.json +11 -0
  2334. package/extensions/tlon/package.json +30 -0
  2335. package/extensions/tlon/src/channel.ts +379 -0
  2336. package/extensions/tlon/src/config-schema.test.ts +32 -0
  2337. package/extensions/tlon/src/config-schema.ts +43 -0
  2338. package/extensions/tlon/src/monitor/discovery.ts +71 -0
  2339. package/extensions/tlon/src/monitor/history.ts +87 -0
  2340. package/extensions/tlon/src/monitor/index.ts +501 -0
  2341. package/extensions/tlon/src/monitor/processed-messages.test.ts +24 -0
  2342. package/extensions/tlon/src/monitor/processed-messages.ts +38 -0
  2343. package/extensions/tlon/src/monitor/utils.ts +83 -0
  2344. package/extensions/tlon/src/onboarding.ts +213 -0
  2345. package/extensions/tlon/src/runtime.ts +14 -0
  2346. package/extensions/tlon/src/targets.ts +79 -0
  2347. package/extensions/tlon/src/types.ts +85 -0
  2348. package/extensions/tlon/src/urbit/auth.ts +18 -0
  2349. package/extensions/tlon/src/urbit/http-api.ts +36 -0
  2350. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  2351. package/extensions/tlon/src/urbit/send.ts +127 -0
  2352. package/extensions/tlon/src/urbit/sse-client.test.ts +41 -0
  2353. package/extensions/tlon/src/urbit/sse-client.ts +367 -0
  2354. package/extensions/voice-call/CHANGELOG.md +97 -0
  2355. package/extensions/voice-call/README.md +134 -0
  2356. package/extensions/voice-call/index.ts +497 -0
  2357. package/extensions/voice-call/openclaw.plugin.json +601 -0
  2358. package/extensions/voice-call/package.json +16 -0
  2359. package/extensions/voice-call/src/cli.ts +300 -0
  2360. package/extensions/voice-call/src/config.test.ts +204 -0
  2361. package/extensions/voice-call/src/config.ts +493 -0
  2362. package/extensions/voice-call/src/core-bridge.ts +196 -0
  2363. package/extensions/voice-call/src/manager/context.ts +21 -0
  2364. package/extensions/voice-call/src/manager/events.ts +177 -0
  2365. package/extensions/voice-call/src/manager/lookup.ts +33 -0
  2366. package/extensions/voice-call/src/manager/outbound.ts +248 -0
  2367. package/extensions/voice-call/src/manager/state.ts +50 -0
  2368. package/extensions/voice-call/src/manager/store.ts +88 -0
  2369. package/extensions/voice-call/src/manager/timers.ts +86 -0
  2370. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  2371. package/extensions/voice-call/src/manager.test.ts +108 -0
  2372. package/extensions/voice-call/src/manager.ts +876 -0
  2373. package/extensions/voice-call/src/media-stream.test.ts +97 -0
  2374. package/extensions/voice-call/src/media-stream.ts +393 -0
  2375. package/extensions/voice-call/src/providers/base.ts +67 -0
  2376. package/extensions/voice-call/src/providers/index.ts +10 -0
  2377. package/extensions/voice-call/src/providers/mock.ts +168 -0
  2378. package/extensions/voice-call/src/providers/plivo.test.ts +28 -0
  2379. package/extensions/voice-call/src/providers/plivo.ts +504 -0
  2380. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  2381. package/extensions/voice-call/src/providers/telnyx.ts +364 -0
  2382. package/extensions/voice-call/src/providers/tts-openai.ts +264 -0
  2383. package/extensions/voice-call/src/providers/twilio/api.ts +45 -0
  2384. package/extensions/voice-call/src/providers/twilio/webhook.ts +29 -0
  2385. package/extensions/voice-call/src/providers/twilio.test.ts +64 -0
  2386. package/extensions/voice-call/src/providers/twilio.ts +595 -0
  2387. package/extensions/voice-call/src/response-generator.ts +171 -0
  2388. package/extensions/voice-call/src/runtime.ts +205 -0
  2389. package/extensions/voice-call/src/telephony-audio.ts +88 -0
  2390. package/extensions/voice-call/src/telephony-tts.ts +95 -0
  2391. package/extensions/voice-call/src/tunnel.ts +331 -0
  2392. package/extensions/voice-call/src/types.ts +272 -0
  2393. package/extensions/voice-call/src/utils.ts +12 -0
  2394. package/extensions/voice-call/src/voice-mapping.ts +65 -0
  2395. package/extensions/voice-call/src/webhook-security.test.ts +233 -0
  2396. package/extensions/voice-call/src/webhook-security.ts +446 -0
  2397. package/extensions/voice-call/src/webhook.ts +490 -0
  2398. package/extensions/whatsapp/index.ts +18 -0
  2399. package/extensions/whatsapp/openclaw.plugin.json +11 -0
  2400. package/extensions/whatsapp/package.json +11 -0
  2401. package/extensions/whatsapp/src/channel.ts +500 -0
  2402. package/extensions/whatsapp/src/runtime.ts +14 -0
  2403. package/extensions/zalo/CHANGELOG.md +80 -0
  2404. package/extensions/zalo/README.md +50 -0
  2405. package/extensions/zalo/index.ts +20 -0
  2406. package/extensions/zalo/openclaw.plugin.json +11 -0
  2407. package/extensions/zalo/package.json +33 -0
  2408. package/extensions/zalo/src/accounts.ts +71 -0
  2409. package/extensions/zalo/src/actions.ts +62 -0
  2410. package/extensions/zalo/src/api.ts +206 -0
  2411. package/extensions/zalo/src/channel.directory.test.ts +35 -0
  2412. package/extensions/zalo/src/channel.ts +394 -0
  2413. package/extensions/zalo/src/config-schema.ts +24 -0
  2414. package/extensions/zalo/src/monitor.ts +760 -0
  2415. package/extensions/zalo/src/monitor.webhook.test.ts +70 -0
  2416. package/extensions/zalo/src/onboarding.ts +405 -0
  2417. package/extensions/zalo/src/probe.ts +46 -0
  2418. package/extensions/zalo/src/proxy.ts +18 -0
  2419. package/extensions/zalo/src/runtime.ts +14 -0
  2420. package/extensions/zalo/src/send.ts +117 -0
  2421. package/extensions/zalo/src/status-issues.ts +50 -0
  2422. package/extensions/zalo/src/token.ts +55 -0
  2423. package/extensions/zalo/src/types.ts +42 -0
  2424. package/extensions/zalouser/CHANGELOG.md +63 -0
  2425. package/extensions/zalouser/README.md +221 -0
  2426. package/extensions/zalouser/index.ts +32 -0
  2427. package/extensions/zalouser/openclaw.plugin.json +11 -0
  2428. package/extensions/zalouser/package.json +33 -0
  2429. package/extensions/zalouser/src/accounts.ts +117 -0
  2430. package/extensions/zalouser/src/channel.test.ts +17 -0
  2431. package/extensions/zalouser/src/channel.ts +641 -0
  2432. package/extensions/zalouser/src/config-schema.ts +27 -0
  2433. package/extensions/zalouser/src/monitor.ts +574 -0
  2434. package/extensions/zalouser/src/onboarding.ts +488 -0
  2435. package/extensions/zalouser/src/probe.ts +28 -0
  2436. package/extensions/zalouser/src/runtime.ts +14 -0
  2437. package/extensions/zalouser/src/send.ts +150 -0
  2438. package/extensions/zalouser/src/status-issues.test.ts +58 -0
  2439. package/extensions/zalouser/src/status-issues.ts +81 -0
  2440. package/extensions/zalouser/src/tool.ts +156 -0
  2441. package/extensions/zalouser/src/types.ts +102 -0
  2442. package/extensions/zalouser/src/zca.ts +208 -0
  2443. package/git-hooks/pre-commit +4 -0
  2444. package/package.json +304 -0
  2445. package/patches/.gitkeep +0 -0
  2446. package/patches/@mariozechner__pi-ai.patch +30 -0
  2447. package/scripts/format-staged.js +148 -0
  2448. package/scripts/postinstall.js +326 -0
  2449. package/scripts/setup-git-hooks.js +96 -0
  2450. package/skills/1password/SKILL.md +53 -0
  2451. package/skills/1password/references/cli-examples.md +29 -0
  2452. package/skills/1password/references/get-started.md +17 -0
  2453. package/skills/apple-notes/SKILL.md +50 -0
  2454. package/skills/apple-reminders/SKILL.md +67 -0
  2455. package/skills/bear-notes/SKILL.md +79 -0
  2456. package/skills/bird/SKILL.md +197 -0
  2457. package/skills/blogwatcher/SKILL.md +46 -0
  2458. package/skills/blucli/SKILL.md +27 -0
  2459. package/skills/bluebubbles/SKILL.md +39 -0
  2460. package/skills/camsnap/SKILL.md +25 -0
  2461. package/skills/canvas/SKILL.md +189 -0
  2462. package/skills/clawdhub/SKILL.md +53 -0
  2463. package/skills/coding-agent/SKILL.md +278 -0
  2464. package/skills/discord/SKILL.md +475 -0
  2465. package/skills/eightctl/SKILL.md +29 -0
  2466. package/skills/food-order/SKILL.md +41 -0
  2467. package/skills/gemini/SKILL.md +23 -0
  2468. package/skills/gifgrep/SKILL.md +47 -0
  2469. package/skills/github/SKILL.md +48 -0
  2470. package/skills/gog/SKILL.md +92 -0
  2471. package/skills/goplaces/SKILL.md +30 -0
  2472. package/skills/himalaya/SKILL.md +217 -0
  2473. package/skills/himalaya/references/configuration.md +174 -0
  2474. package/skills/himalaya/references/message-composition.md +182 -0
  2475. package/skills/imsg/SKILL.md +25 -0
  2476. package/skills/local-places/SERVER_README.md +101 -0
  2477. package/skills/local-places/SKILL.md +91 -0
  2478. package/skills/local-places/pyproject.toml +27 -0
  2479. package/skills/local-places/src/local_places/__init__.py +2 -0
  2480. package/skills/local-places/src/local_places/google_places.py +314 -0
  2481. package/skills/local-places/src/local_places/main.py +65 -0
  2482. package/skills/local-places/src/local_places/schemas.py +107 -0
  2483. package/skills/mcporter/SKILL.md +38 -0
  2484. package/skills/model-usage/SKILL.md +45 -0
  2485. package/skills/model-usage/references/codexbar-cli.md +28 -0
  2486. package/skills/model-usage/scripts/model_usage.py +310 -0
  2487. package/skills/nano-banana-pro/SKILL.md +30 -0
  2488. package/skills/nano-banana-pro/scripts/generate_image.py +169 -0
  2489. package/skills/nano-pdf/SKILL.md +20 -0
  2490. package/skills/notion/SKILL.md +156 -0
  2491. package/skills/obsidian/SKILL.md +55 -0
  2492. package/skills/openai-image-gen/SKILL.md +71 -0
  2493. package/skills/openai-image-gen/scripts/gen.py +240 -0
  2494. package/skills/openai-whisper/SKILL.md +19 -0
  2495. package/skills/openai-whisper-api/SKILL.md +43 -0
  2496. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  2497. package/skills/openhue/SKILL.md +30 -0
  2498. package/skills/oracle/SKILL.md +105 -0
  2499. package/skills/ordercli/SKILL.md +47 -0
  2500. package/skills/peekaboo/SKILL.md +153 -0
  2501. package/skills/sag/SKILL.md +62 -0
  2502. package/skills/session-logs/SKILL.md +105 -0
  2503. package/skills/sherpa-onnx-tts/SKILL.md +49 -0
  2504. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  2505. package/skills/skill-creator/SKILL.md +371 -0
  2506. package/skills/skill-creator/license.txt +202 -0
  2507. package/skills/skill-creator/scripts/init_skill.py +378 -0
  2508. package/skills/skill-creator/scripts/package_skill.py +111 -0
  2509. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  2510. package/skills/slack/SKILL.md +144 -0
  2511. package/skills/songsee/SKILL.md +29 -0
  2512. package/skills/sonoscli/SKILL.md +26 -0
  2513. package/skills/spotify-player/SKILL.md +34 -0
  2514. package/skills/summarize/SKILL.md +67 -0
  2515. package/skills/things-mac/SKILL.md +62 -0
  2516. package/skills/tmux/SKILL.md +121 -0
  2517. package/skills/tmux/scripts/find-sessions.sh +112 -0
  2518. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  2519. package/skills/trello/SKILL.md +84 -0
  2520. package/skills/video-frames/SKILL.md +29 -0
  2521. package/skills/video-frames/scripts/frame.sh +81 -0
  2522. package/skills/voice-call/SKILL.md +35 -0
  2523. package/skills/wacli/SKILL.md +42 -0
  2524. package/skills/weather/SKILL.md +49 -0
@@ -0,0 +1,3199 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const a of i)if(a.type==="childList")for(const r of a.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(i){const a={};return i.integrity&&(a.integrity=i.integrity),i.referrerPolicy&&(a.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?a.credentials="include":i.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(i){if(i.ep)return;i.ep=!0;const a=n(i);fetch(i.href,a)}})();const qt=globalThis,Ts=qt.ShadowRoot&&(qt.ShadyCSS===void 0||qt.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Es=Symbol(),Pi=new WeakMap;let qa=class{constructor(t,n,s){if(this._$cssResult$=!0,s!==Es)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=n}get styleSheet(){let t=this.o;const n=this.t;if(Ts&&t===void 0){const s=n!==void 0&&n.length===1;s&&(t=Pi.get(n)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&Pi.set(n,t))}return t}toString(){return this.cssText}};const Oo=e=>new qa(typeof e=="string"?e:e+"",void 0,Es),Do=(e,...t)=>{const n=e.length===1?e[0]:t.reduce((s,i,a)=>s+(r=>{if(r._$cssResult$===!0)return r.cssText;if(typeof r=="number")return r;throw Error("Value passed to 'css' function must be a 'css' function result: "+r+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[a+1],e[0]);return new qa(n,e,Es)},Bo=(e,t)=>{if(Ts)e.adoptedStyleSheets=t.map(n=>n instanceof CSSStyleSheet?n:n.styleSheet);else for(const n of t){const s=document.createElement("style"),i=qt.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=n.cssText,e.appendChild(s)}},Ni=Ts?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let n="";for(const s of t.cssRules)n+=s.cssText;return Oo(n)})(e):e;const{is:Fo,defineProperty:Uo,getOwnPropertyDescriptor:Ko,getOwnPropertyNames:Ho,getOwnPropertySymbols:zo,getPrototypeOf:jo}=Object,nn=globalThis,Oi=nn.trustedTypes,qo=Oi?Oi.emptyScript:"",Vo=nn.reactiveElementPolyfillSupport,yt=(e,t)=>e,Gt={toAttribute(e,t){switch(t){case Boolean:e=e?qo:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=e!==null;break;case Number:n=e===null?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch{n=null}}return n}},Cs=(e,t)=>!Fo(e,t),Di={attribute:!0,type:String,converter:Gt,reflect:!1,useDefault:!1,hasChanged:Cs};Symbol.metadata??=Symbol("metadata"),nn.litPropertyMetadata??=new WeakMap;let Qe=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,n=Di){if(n.state&&(n.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((n=Object.create(n)).wrapped=!0),this.elementProperties.set(t,n),!n.noAccessor){const s=Symbol(),i=this.getPropertyDescriptor(t,s,n);i!==void 0&&Uo(this.prototype,t,i)}}static getPropertyDescriptor(t,n,s){const{get:i,set:a}=Ko(this.prototype,t)??{get(){return this[n]},set(r){this[n]=r}};return{get:i,set(r){const l=i?.call(this);a?.call(this,r),this.requestUpdate(t,l,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??Di}static _$Ei(){if(this.hasOwnProperty(yt("elementProperties")))return;const t=jo(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(yt("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(yt("properties"))){const n=this.properties,s=[...Ho(n),...zo(n)];for(const i of s)this.createProperty(i,n[i])}const t=this[Symbol.metadata];if(t!==null){const n=litPropertyMetadata.get(t);if(n!==void 0)for(const[s,i]of n)this.elementProperties.set(s,i)}this._$Eh=new Map;for(const[n,s]of this.elementProperties){const i=this._$Eu(n,s);i!==void 0&&this._$Eh.set(i,n)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const n=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const i of s)n.unshift(Ni(i))}else t!==void 0&&n.push(Ni(t));return n}static _$Eu(t,n){const s=n.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,n=this.constructor.elementProperties;for(const s of n.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Bo(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,n,s){this._$AK(t,s)}_$ET(t,n){const s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){const a=(s.converter?.toAttribute!==void 0?s.converter:Gt).toAttribute(n,s.type);this._$Em=t,a==null?this.removeAttribute(i):this.setAttribute(i,a),this._$Em=null}}_$AK(t,n){const s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){const a=s.getPropertyOptions(i),r=typeof a.converter=="function"?{fromAttribute:a.converter}:a.converter?.fromAttribute!==void 0?a.converter:Gt;this._$Em=i;const l=r.fromAttribute(n,a.type);this[i]=l??this._$Ej?.get(i)??l,this._$Em=null}}requestUpdate(t,n,s,i=!1,a){if(t!==void 0){const r=this.constructor;if(i===!1&&(a=this[t]),s??=r.getPropertyOptions(t),!((s.hasChanged??Cs)(a,n)||s.useDefault&&s.reflect&&a===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,s))))return;this.C(t,n,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,n,{useDefault:s,reflect:i,wrapped:a},r){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??n??this[t]),a!==!0||r!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(n=void 0),this._$AL.set(t,n)),i===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(n){Promise.reject(n)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[i,a]of this._$Ep)this[i]=a;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[i,a]of s){const{wrapped:r}=a,l=this[i];r!==!0||this._$AL.has(i)||l===void 0||this.C(i,void 0,a,l)}}let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(n)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(n)}willUpdate(t){}_$AE(t){this._$EO?.forEach(n=>n.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(n=>this._$ET(n,this[n])),this._$EM()}updated(t){}firstUpdated(t){}};Qe.elementStyles=[],Qe.shadowRootOptions={mode:"open"},Qe[yt("elementProperties")]=new Map,Qe[yt("finalized")]=new Map,Vo?.({ReactiveElement:Qe}),(nn.reactiveElementVersions??=[]).push("2.1.2");const Is=globalThis,Bi=e=>e,Qt=Is.trustedTypes,Fi=Qt?Qt.createPolicy("lit-html",{createHTML:e=>e}):void 0,Va="$lit$",xe=`lit$${Math.random().toFixed(9).slice(2)}$`,Wa="?"+xe,Wo=`<${Wa}>`,Ne=document,wt=()=>Ne.createComment(""),xt=e=>e===null||typeof e!="object"&&typeof e!="function",Ms=Array.isArray,Go=e=>Ms(e)||typeof e?.[Symbol.iterator]=="function",On=`[
2
+ \f\r]`,ot=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Ui=/-->/g,Ki=/>/g,Ce=RegExp(`>|${On}(?:([^\\s"'>=/]+)(${On}*=${On}*(?:[^
3
+ \f\r"'\`<>=]|("|')|))|$)`,"g"),Hi=/'/g,zi=/"/g,Ga=/^(?:script|style|textarea|title)$/i,Qo=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),o=Qo(1),ke=Symbol.for("lit-noChange"),v=Symbol.for("lit-nothing"),ji=new WeakMap,Re=Ne.createTreeWalker(Ne,129);function Qa(e,t){if(!Ms(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return Fi!==void 0?Fi.createHTML(t):t}const Yo=(e,t)=>{const n=e.length-1,s=[];let i,a=t===2?"<svg>":t===3?"<math>":"",r=ot;for(let l=0;l<n;l++){const c=e[l];let p,d,u=-1,h=0;for(;h<c.length&&(r.lastIndex=h,d=r.exec(c),d!==null);)h=r.lastIndex,r===ot?d[1]==="!--"?r=Ui:d[1]!==void 0?r=Ki:d[2]!==void 0?(Ga.test(d[2])&&(i=RegExp("</"+d[2],"g")),r=Ce):d[3]!==void 0&&(r=Ce):r===Ce?d[0]===">"?(r=i??ot,u=-1):d[1]===void 0?u=-2:(u=r.lastIndex-d[2].length,p=d[1],r=d[3]===void 0?Ce:d[3]==='"'?zi:Hi):r===zi||r===Hi?r=Ce:r===Ui||r===Ki?r=ot:(r=Ce,i=void 0);const g=r===Ce&&e[l+1].startsWith("/>")?" ":"";a+=r===ot?c+Wo:u>=0?(s.push(p),c.slice(0,u)+Va+c.slice(u)+xe+g):c+xe+(u===-2?l:g)}return[Qa(e,a+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};let ts=class Ya{constructor({strings:t,_$litType$:n},s){let i;this.parts=[];let a=0,r=0;const l=t.length-1,c=this.parts,[p,d]=Yo(t,n);if(this.el=Ya.createElement(p,s),Re.currentNode=this.el.content,n===2||n===3){const u=this.el.content.firstChild;u.replaceWith(...u.childNodes)}for(;(i=Re.nextNode())!==null&&c.length<l;){if(i.nodeType===1){if(i.hasAttributes())for(const u of i.getAttributeNames())if(u.endsWith(Va)){const h=d[r++],g=i.getAttribute(u).split(xe),$=/([.?@])?(.*)/.exec(h);c.push({type:1,index:a,name:$[2],strings:g,ctor:$[1]==="."?Xo:$[1]==="?"?Jo:$[1]==="@"?el:an}),i.removeAttribute(u)}else u.startsWith(xe)&&(c.push({type:6,index:a}),i.removeAttribute(u));if(Ga.test(i.tagName)){const u=i.textContent.split(xe),h=u.length-1;if(h>0){i.textContent=Qt?Qt.emptyScript:"";for(let g=0;g<h;g++)i.append(u[g],wt()),Re.nextNode(),c.push({type:2,index:++a});i.append(u[h],wt())}}}else if(i.nodeType===8)if(i.data===Wa)c.push({type:2,index:a});else{let u=-1;for(;(u=i.data.indexOf(xe,u+1))!==-1;)c.push({type:7,index:a}),u+=xe.length-1}a++}}static createElement(t,n){const s=Ne.createElement("template");return s.innerHTML=t,s}};function Xe(e,t,n=e,s){if(t===ke)return t;let i=s!==void 0?n._$Co?.[s]:n._$Cl;const a=xt(t)?void 0:t._$litDirective$;return i?.constructor!==a&&(i?._$AO?.(!1),a===void 0?i=void 0:(i=new a(e),i._$AT(e,n,s)),s!==void 0?(n._$Co??=[])[s]=i:n._$Cl=i),i!==void 0&&(t=Xe(e,i._$AS(e,t.values),i,s)),t}class Zo{constructor(t,n){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=n}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:n},parts:s}=this._$AD,i=(t?.creationScope??Ne).importNode(n,!0);Re.currentNode=i;let a=Re.nextNode(),r=0,l=0,c=s[0];for(;c!==void 0;){if(r===c.index){let p;c.type===2?p=new sn(a,a.nextSibling,this,t):c.type===1?p=new c.ctor(a,c.name,c.strings,this,t):c.type===6&&(p=new tl(a,this,t)),this._$AV.push(p),c=s[++l]}r!==c?.index&&(a=Re.nextNode(),r++)}return Re.currentNode=Ne,i}p(t){let n=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,n),n+=s.strings.length-2):s._$AI(t[n])),n++}}let sn=class Za{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,n,s,i){this.type=2,this._$AH=v,this._$AN=void 0,this._$AA=t,this._$AB=n,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const n=this._$AM;return n!==void 0&&t?.nodeType===11&&(t=n.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,n=this){t=Xe(this,t,n),xt(t)?t===v||t==null||t===""?(this._$AH!==v&&this._$AR(),this._$AH=v):t!==this._$AH&&t!==ke&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):Go(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!==v&&xt(this._$AH)?this._$AA.nextSibling.data=t:this.T(Ne.createTextNode(t)),this._$AH=t}$(t){const{values:n,_$litType$:s}=t,i=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=ts.createElement(Qa(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(n);else{const a=new Zo(i,this),r=a.u(this.options);a.p(n),this.T(r),this._$AH=a}}_$AC(t){let n=ji.get(t.strings);return n===void 0&&ji.set(t.strings,n=new ts(t)),n}k(t){Ms(this._$AH)||(this._$AH=[],this._$AR());const n=this._$AH;let s,i=0;for(const a of t)i===n.length?n.push(s=new Za(this.O(wt()),this.O(wt()),this,this.options)):s=n[i],s._$AI(a),i++;i<n.length&&(this._$AR(s&&s._$AB.nextSibling,i),n.length=i)}_$AR(t=this._$AA.nextSibling,n){for(this._$AP?.(!1,!0,n);t!==this._$AB;){const s=Bi(t).nextSibling;Bi(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}};class an{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,n,s,i,a){this.type=1,this._$AH=v,this._$AN=void 0,this.element=t,this.name=n,this._$AM=i,this.options=a,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=v}_$AI(t,n=this,s,i){const a=this.strings;let r=!1;if(a===void 0)t=Xe(this,t,n,0),r=!xt(t)||t!==this._$AH&&t!==ke,r&&(this._$AH=t);else{const l=t;let c,p;for(t=a[0],c=0;c<a.length-1;c++)p=Xe(this,l[s+c],n,c),p===ke&&(p=this._$AH[c]),r||=!xt(p)||p!==this._$AH[c],p===v?t=v:t!==v&&(t+=(p??"")+a[c+1]),this._$AH[c]=p}r&&!i&&this.j(t)}j(t){t===v?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}let Xo=class extends an{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===v?void 0:t}},Jo=class extends an{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==v)}},el=class extends an{constructor(t,n,s,i,a){super(t,n,s,i,a),this.type=5}_$AI(t,n=this){if((t=Xe(this,t,n,0)??v)===ke)return;const s=this._$AH,i=t===v&&s!==v||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,a=t!==v&&(s===v||i);i&&this.element.removeEventListener(this.name,this,s),a&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},tl=class{constructor(t,n,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=n,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){Xe(this,t)}};const nl={I:sn},sl=Is.litHtmlPolyfillSupport;sl?.(ts,sn),(Is.litHtmlVersions??=[]).push("3.3.2");const il=(e,t,n)=>{const s=n?.renderBefore??t;let i=s._$litPart$;if(i===void 0){const a=n?.renderBefore??null;s._$litPart$=i=new sn(t.insertBefore(wt(),a),a,void 0,n??{})}return i._$AI(e),i};const Ls=globalThis;let Ze=class extends Qe{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const n=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=il(n,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return ke}};Ze._$litElement$=!0,Ze.finalized=!0,Ls.litElementHydrateSupport?.({LitElement:Ze});const al=Ls.litElementPolyfillSupport;al?.({LitElement:Ze});(Ls.litElementVersions??=[]).push("4.2.2");const Xa=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const rl={attribute:!0,type:String,converter:Gt,reflect:!1,hasChanged:Cs},ol=(e=rl,t,n)=>{const{kind:s,metadata:i}=n;let a=globalThis.litPropertyMetadata.get(i);if(a===void 0&&globalThis.litPropertyMetadata.set(i,a=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),a.set(n.name,e),s==="accessor"){const{name:r}=n;return{set(l){const c=t.get.call(this);t.set.call(this,l),this.requestUpdate(r,c,e,!0,l)},init(l){return l!==void 0&&this.C(r,void 0,e,l),l}}}if(s==="setter"){const{name:r}=n;return function(l){const c=this[r];t.call(this,l),this.requestUpdate(r,c,e,!0,l)}}throw Error("Unsupported decorator location: "+s)};function rn(e){return(t,n)=>typeof n=="object"?ol(e,t,n):((s,i,a)=>{const r=i.hasOwnProperty(a);return i.constructor.createProperty(a,s),r?Object.getOwnPropertyDescriptor(i,a):void 0})(e,t,n)}function b(e){return rn({...e,state:!0,attribute:!1})}const ll=50,cl=200,dl="Assistant";function qi(e,t){if(typeof e!="string")return;const n=e.trim();if(n)return n.length<=t?n:n.slice(0,t)}function ns(e){const t=qi(e?.name,ll)??dl,n=qi(e?.avatar??void 0,cl)??null;return{agentId:typeof e?.agentId=="string"&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}function ul(){return ns(typeof window>"u"?{}:{name:window.__CLAWDBOT_ASSISTANT_NAME__,avatar:window.__CLAWDBOT_ASSISTANT_AVATAR__})}const Ja="clawdbot.control.settings.v1";function pl(){const t={gatewayUrl:`${location.protocol==="https:"?"wss":"ws"}://${location.host}`,token:"",sessionKey:"main",lastActiveSessionKey:"main",theme:"system",chatFocusMode:!1,chatShowThinking:!0,splitRatio:.6,navCollapsed:!1,navGroupsCollapsed:{}};try{const n=localStorage.getItem(Ja);if(!n)return t;const s=JSON.parse(n);return{gatewayUrl:typeof s.gatewayUrl=="string"&&s.gatewayUrl.trim()?s.gatewayUrl.trim():t.gatewayUrl,token:typeof s.token=="string"?s.token:t.token,sessionKey:typeof s.sessionKey=="string"&&s.sessionKey.trim()?s.sessionKey.trim():t.sessionKey,lastActiveSessionKey:typeof s.lastActiveSessionKey=="string"&&s.lastActiveSessionKey.trim()?s.lastActiveSessionKey.trim():typeof s.sessionKey=="string"&&s.sessionKey.trim()||t.lastActiveSessionKey,theme:s.theme==="light"||s.theme==="dark"||s.theme==="system"?s.theme:t.theme,chatFocusMode:typeof s.chatFocusMode=="boolean"?s.chatFocusMode:t.chatFocusMode,chatShowThinking:typeof s.chatShowThinking=="boolean"?s.chatShowThinking:t.chatShowThinking,splitRatio:typeof s.splitRatio=="number"&&s.splitRatio>=.4&&s.splitRatio<=.7?s.splitRatio:t.splitRatio,navCollapsed:typeof s.navCollapsed=="boolean"?s.navCollapsed:t.navCollapsed,navGroupsCollapsed:typeof s.navGroupsCollapsed=="object"&&s.navGroupsCollapsed!==null?s.navGroupsCollapsed:t.navGroupsCollapsed}}catch{return t}}function fl(e){localStorage.setItem(Ja,JSON.stringify(e))}function er(e){const t=(e??"").trim();if(!t)return null;const n=t.split(":").filter(Boolean);if(n.length<3||n[0]!=="agent")return null;const s=n[1]?.trim(),i=n.slice(2).join(":");return!s||!i?null:{agentId:s,rest:i}}const hl=[{label:"聊天",tabs:["chat"]},{label:"控制",tabs:["overview","channels","instances","sessions","cron"]},{label:"代理",tabs:["skills","nodes"]},{label:"设置",tabs:["config","debug","logs"]}],tr={overview:"/overview",channels:"/channels",instances:"/instances",sessions:"/sessions",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",config:"/config",debug:"/debug",logs:"/logs"},nr=new Map(Object.entries(tr).map(([e,t])=>[t,e]));function on(e){if(!e)return"";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t==="/"?"":(t.endsWith("/")&&(t=t.slice(0,-1)),t)}function At(e){if(!e)return"/";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t}function Rs(e,t=""){const n=on(t),s=tr[e];return n?`${n}${s}`:s}function sr(e,t=""){const n=on(t);let s=e||"/";n&&(s===n?s="/":s.startsWith(`${n}/`)&&(s=s.slice(n.length)));let i=At(s).toLowerCase();return i.endsWith("/index.html")&&(i="/"),i==="/"?"chat":nr.get(i)??null}function gl(e){let t=At(e);if(t.endsWith("/index.html")&&(t=At(t.slice(0,-11))),t==="/")return"";const n=t.split("/").filter(Boolean);if(n.length===0)return"";for(let s=0;s<n.length;s++){const i=`/${n.slice(s).join("/")}`.toLowerCase();if(nr.has(i)){const a=n.slice(0,s);return a.length?`/${a.join("/")}`:""}}return`/${n.join("/")}`}function vl(e){switch(e){case"chat":return"messageSquare";case"overview":return"barChart";case"channels":return"link";case"instances":return"radio";case"sessions":return"fileText";case"cron":return"loader";case"skills":return"zap";case"nodes":return"monitor";case"config":return"settings";case"debug":return"bug";case"logs":return"scrollText";default:return"folder"}}function ss(e){switch(e){case"overview":return"概览";case"channels":return"通道";case"instances":return"实例";case"sessions":return"会话";case"cron":return"定时任务";case"skills":return"技能";case"nodes":return"节点";case"chat":return"聊天";case"config":return"配置";case"debug":return"调试";case"logs":return"日志";default:return"控制"}}function ml(e){switch(e){case"overview":return"网关状态、入口点和快速健康读取。";case"channels":return"管理通道和设置。";case"instances":return"来自已连接客户端和节点的存在信标。";case"sessions":return"检查活跃会话并调整每个会话的默认值。";case"cron":return"安排唤醒和定期代理运行。";case"skills":return"管理技能可用性和API密钥注入。";case"nodes":return"配对设备、功能和命令暴露。";case"chat":return"直接网关聊天会话,用于快速干预。";case"config":return"安全编辑 ~/.clawdbot/clawdbot.json。";case"debug":return"网关快照、事件和手动RPC调用。";case"logs":return"网关文件日志的实时跟踪。";default:return""}}const W={messageSquare:o`<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>`,barChart:o`<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>`,link:o`<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>`,radio:o`<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>`,fileText:o`<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>`,zap:o`<svg viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>`,monitor:o`<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>`,settings:o`<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>`,bug:o`<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>`,scrollText:o`<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>`,folder:o`<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>`,menu:o`<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>`,x:o`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,check:o`<svg viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>`,copy:o`<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>`,search:o`<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`,brain:o`<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>`,book:o`<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>`,loader:o`<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>`,wrench:o`<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>`,fileCode:o`<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>`,edit:o`<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>`,penLine:o`<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>`,paperclip:o`<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>`,globe:o`<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>`,image:o`<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>`,smartphone:o`<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>`,plug:o`<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>`,circle:o`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/></svg>`,puzzle:o`<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>`},yl=/<\s*\/?\s*(?:think(?:ing)?|thought|antthinking|final)\b/i,Dt=/<\s*\/?\s*final\b[^>]*>/gi,Vi=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^>]*>/gi;function bl(e,t){return e.trimStart()}function $l(e,t){if(!e||!yl.test(e))return e;let n=e;Dt.test(n)?(Dt.lastIndex=0,n=n.replace(Dt,"")):Dt.lastIndex=0,Vi.lastIndex=0;let s="",i=0,a=!1;for(const r of n.matchAll(Vi)){const l=r.index??0,c=r[1]==="/";a?c&&(a=!1):(s+=n.slice(i,l),c||(a=!0)),i=l+r[0].length}return s+=n.slice(i),bl(s)}function kt(e){return!e&&e!==0?"n/a":new Date(e).toLocaleString()}function O(e){if(!e&&e!==0)return"n/a";const t=Date.now()-e;if(t<0)return"just now";const n=Math.round(t/1e3);if(n<60)return`${n}s ago`;const s=Math.round(n/60);if(s<60)return`${s}m ago`;const i=Math.round(s/60);return i<48?`${i}h ago`:`${Math.round(i/24)}d ago`}function ir(e){if(!e&&e!==0)return"n/a";if(e<1e3)return`${e}ms`;const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const s=Math.round(n/60);return s<48?`${s}h`:`${Math.round(s/24)}d`}function is(e){return!e||e.length===0?"none":e.filter(t=>!!(t&&t.trim())).join(", ")}function as(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function ar(e,t){return e.length<=t?{text:e,truncated:!1,total:e.length}:{text:e.slice(0,Math.max(0,t)),truncated:!0,total:e.length}}function Yt(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function Dn(e){return $l(e)}const wl=/^\[([^\]]+)\]\s*/,xl=["WebChat","WhatsApp","Telegram","Signal","Slack","Discord","iMessage","Teams","Matrix","Zalo","Zalo Personal","BlueBubbles"],Bn=new WeakMap,Fn=new WeakMap;function Al(e){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(e)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(e)?!0:xl.some(t=>e.startsWith(`${t} `))}function Un(e){const t=e.match(wl);if(!t)return e;const n=t[1]??"";return Al(n)?e.slice(t[0].length):e}function rs(e){const t=e,n=typeof t.role=="string"?t.role:"",s=t.content;if(typeof s=="string")return n==="assistant"?Dn(s):Un(s);if(Array.isArray(s)){const i=s.map(a=>{const r=a;return r.type==="text"&&typeof r.text=="string"?r.text:null}).filter(a=>typeof a=="string");if(i.length>0){const a=i.join(`
4
+ `);return n==="assistant"?Dn(a):Un(a)}}return typeof t.text=="string"?n==="assistant"?Dn(t.text):Un(t.text):null}function rr(e){if(!e||typeof e!="object")return rs(e);const t=e;if(Bn.has(t))return Bn.get(t)??null;const n=rs(e);return Bn.set(t,n),n}function Wi(e){const n=e.content,s=[];if(Array.isArray(n))for(const l of n){const c=l;if(c.type==="thinking"&&typeof c.thinking=="string"){const p=c.thinking.trim();p&&s.push(p)}}if(s.length>0)return s.join(`
5
+ `);const i=Sl(e);if(!i)return null;const r=[...i.matchAll(/<\s*think(?:ing)?\s*>([\s\S]*?)<\s*\/\s*think(?:ing)?\s*>/gi)].map(l=>(l[1]??"").trim()).filter(Boolean);return r.length>0?r.join(`
6
+ `):null}function kl(e){if(!e||typeof e!="object")return Wi(e);const t=e;if(Fn.has(t))return Fn.get(t)??null;const n=Wi(e);return Fn.set(t,n),n}function Sl(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const s=n.map(i=>{const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>typeof i=="string");if(s.length>0)return s.join(`
7
+ `)}return typeof t.text=="string"?t.text:null}function _l(e){const t=e.trim();if(!t)return"";const n=t.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>`_${s}_`);return n.length?["_Reasoning:_",...n].join(`
8
+ `):""}function Gi(e){e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function Tl(){const e=new Uint8Array(16),t=Date.now();for(let n=0;n<e.length;n++)e[n]=Math.floor(Math.random()*256);return e[0]^=t&255,e[1]^=t>>>8&255,e[2]^=t>>>16&255,e[3]^=t>>>24&255,e}function Ps(e=globalThis.crypto){if(e&&typeof e.randomUUID=="function")return e.randomUUID();if(e&&typeof e.getRandomValues=="function"){const t=new Uint8Array(16);return e.getRandomValues(t),Gi(t)}return Gi(Tl())}async function Je(e){if(!(!e.client||!e.connected)){e.chatLoading=!0,e.lastError=null;try{const t=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:200});e.chatMessages=Array.isArray(t.messages)?t.messages:[],e.chatThinkingLevel=t.thinkingLevel??null}catch(t){e.lastError=String(t)}finally{e.chatLoading=!1}}}function El(e){const t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}async function Cl(e,t,n){if(!e.client||!e.connected)return!1;const s=t.trim(),i=n&&n.length>0;if(!s&&!i)return!1;const a=Date.now(),r=[];if(s&&r.push({type:"text",text:s}),i)for(const p of n)r.push({type:"image",source:{type:"base64",media_type:p.mimeType,data:p.dataUrl}});e.chatMessages=[...e.chatMessages,{role:"user",content:r,timestamp:a}],e.chatSending=!0,e.lastError=null;const l=Ps();e.chatRunId=l,e.chatStream="",e.chatStreamStartedAt=a;const c=i?n.map(p=>{const d=El(p.dataUrl);return d?{type:"image",mimeType:d.mimeType,content:d.content}:null}).filter(p=>p!==null):void 0;try{return await e.client.request("chat.send",{sessionKey:e.sessionKey,message:s,deliver:!1,idempotencyKey:l,attachments:c}),!0}catch(p){const d=String(p);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.lastError=d,e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:"Error: "+d}],timestamp:Date.now()}],!1}finally{e.chatSending=!1}}async function Il(e){if(!e.client||!e.connected)return!1;const t=e.chatRunId;try{return await e.client.request("chat.abort",t?{sessionKey:e.sessionKey,runId:t}:{sessionKey:e.sessionKey}),!0}catch(n){return e.lastError=String(n),!1}}function Ml(e,t){if(!t||t.sessionKey!==e.sessionKey)return null;if(t.runId&&e.chatRunId&&t.runId!==e.chatRunId)return t.state==="final"?"final":null;if(t.state==="delta"){const n=rs(t.message);if(typeof n=="string"){const s=e.chatStream??"";(!s||n.length>=s.length)&&(e.chatStream=n)}}else t.state==="final"||t.state==="aborted"?(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null):t.state==="error"&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.lastError=t.errorMessage??"chat error");return t.state}async function st(e){if(!(!e.client||!e.connected)&&!e.sessionsLoading){e.sessionsLoading=!0,e.sessionsError=null;try{const t={includeGlobal:e.sessionsIncludeGlobal,includeUnknown:e.sessionsIncludeUnknown},n=Yt(e.sessionsFilterActive,0),s=Yt(e.sessionsFilterLimit,0);n>0&&(t.activeMinutes=n),s>0&&(t.limit=s);const i=await e.client.request("sessions.list",t);i&&(e.sessionsResult=i)}catch(t){e.sessionsError=String(t)}finally{e.sessionsLoading=!1}}}async function Ll(e,t,n){if(!e.client||!e.connected)return;const s={key:t};"label"in n&&(s.label=n.label),"thinkingLevel"in n&&(s.thinkingLevel=n.thinkingLevel),"verboseLevel"in n&&(s.verboseLevel=n.verboseLevel),"reasoningLevel"in n&&(s.reasoningLevel=n.reasoningLevel);try{await e.client.request("sessions.patch",s),await st(e)}catch(i){e.sessionsError=String(i)}}async function Rl(e,t){if(!(!e.client||!e.connected||e.sessionsLoading||!window.confirm(`Delete session "${t}"?
9
+
10
+ Deletes the session entry and archives its transcript.`))){e.sessionsLoading=!0,e.sessionsError=null;try{await e.client.request("sessions.delete",{key:t,deleteTranscript:!0}),await st(e)}catch(s){e.sessionsError=String(s)}finally{e.sessionsLoading=!1}}}const Qi=50,Pl=80,Nl=12e4;function Ol(e){if(!e||typeof e!="object")return null;const t=e;if(typeof t.text=="string")return t.text;const n=t.content;if(!Array.isArray(n))return null;const s=n.map(i=>{if(!i||typeof i!="object")return null;const a=i;return a.type==="text"&&typeof a.text=="string"?a.text:null}).filter(i=>!!i);return s.length===0?null:s.join(`
11
+ `)}function Yi(e){if(e==null)return null;if(typeof e=="number"||typeof e=="boolean")return String(e);const t=Ol(e);let n;if(typeof e=="string")n=e;else if(t)n=t;else try{n=JSON.stringify(e,null,2)}catch{n=String(e)}const s=ar(n,Nl);return s.truncated?`${s.text}
12
+
13
+ … truncated (${s.total} chars, showing first ${s.text.length}).`:s.text}function Dl(e){const t=[];return t.push({type:"toolcall",name:e.name,arguments:e.args??{}}),e.output&&t.push({type:"toolresult",name:e.name,text:e.output}),{role:"assistant",toolCallId:e.toolCallId,runId:e.runId,content:t,timestamp:e.startedAt}}function Bl(e){if(e.toolStreamOrder.length<=Qi)return;const t=e.toolStreamOrder.length-Qi,n=e.toolStreamOrder.splice(0,t);for(const s of n)e.toolStreamById.delete(s)}function Fl(e){e.chatToolMessages=e.toolStreamOrder.map(t=>e.toolStreamById.get(t)?.message).filter(t=>!!t)}function os(e){e.toolStreamSyncTimer!=null&&(clearTimeout(e.toolStreamSyncTimer),e.toolStreamSyncTimer=null),Fl(e)}function Ul(e,t=!1){if(t){os(e);return}e.toolStreamSyncTimer==null&&(e.toolStreamSyncTimer=window.setTimeout(()=>os(e),Pl))}function Ns(e){e.toolStreamById.clear(),e.toolStreamOrder=[],e.chatToolMessages=[],os(e)}const Kl=5e3;function Hl(e,t){const n=t.data??{},s=typeof n.phase=="string"?n.phase:"";e.compactionClearTimer!=null&&(window.clearTimeout(e.compactionClearTimer),e.compactionClearTimer=null),s==="start"?e.compactionStatus={active:!0,startedAt:Date.now(),completedAt:null}:s==="end"&&(e.compactionStatus={active:!1,startedAt:e.compactionStatus?.startedAt??null,completedAt:Date.now()},e.compactionClearTimer=window.setTimeout(()=>{e.compactionStatus=null,e.compactionClearTimer=null},Kl))}function zl(e,t){if(!t)return;if(t.stream==="compaction"){Hl(e,t);return}if(t.stream!=="tool")return;const n=typeof t.sessionKey=="string"?t.sessionKey:void 0;if(n&&n!==e.sessionKey||!n&&e.chatRunId&&t.runId!==e.chatRunId||e.chatRunId&&t.runId!==e.chatRunId||!e.chatRunId)return;const s=t.data??{},i=typeof s.toolCallId=="string"?s.toolCallId:"";if(!i)return;const a=typeof s.name=="string"?s.name:"tool",r=typeof s.phase=="string"?s.phase:"",l=r==="start"?s.args:void 0,c=r==="update"?Yi(s.partialResult):r==="result"?Yi(s.result):void 0,p=Date.now();let d=e.toolStreamById.get(i);d?(d.name=a,l!==void 0&&(d.args=l),c!==void 0&&(d.output=c),d.updatedAt=p):(d={toolCallId:i,runId:t.runId,sessionKey:n,name:a,args:l,output:c,startedAt:typeof t.ts=="number"?t.ts:p,updatedAt:p,message:{}},e.toolStreamById.set(i,d),e.toolStreamOrder.push(i)),d.message=Dl(d),Bl(e),Ul(e,r==="result")}function ln(e,t=!1){e.chatScrollFrame&&cancelAnimationFrame(e.chatScrollFrame),e.chatScrollTimeout!=null&&(clearTimeout(e.chatScrollTimeout),e.chatScrollTimeout=null);const n=()=>{const s=e.querySelector(".chat-thread");if(s){const i=getComputedStyle(s).overflowY;if(i==="auto"||i==="scroll"||s.scrollHeight-s.clientHeight>1)return s}return document.scrollingElement??document.documentElement};e.updateComplete.then(()=>{e.chatScrollFrame=requestAnimationFrame(()=>{e.chatScrollFrame=null;const s=n();if(!s)return;const i=s.scrollHeight-s.scrollTop-s.clientHeight;if(!(t||e.chatUserNearBottom||i<200))return;t&&(e.chatHasAutoScrolled=!0),s.scrollTop=s.scrollHeight,e.chatUserNearBottom=!0;const r=t?150:120;e.chatScrollTimeout=window.setTimeout(()=>{e.chatScrollTimeout=null;const l=n();if(!l)return;const c=l.scrollHeight-l.scrollTop-l.clientHeight;(t||e.chatUserNearBottom||c<200)&&(l.scrollTop=l.scrollHeight,e.chatUserNearBottom=!0)},r)})})}function or(e,t=!1){e.logsScrollFrame&&cancelAnimationFrame(e.logsScrollFrame),e.updateComplete.then(()=>{e.logsScrollFrame=requestAnimationFrame(()=>{e.logsScrollFrame=null;const n=e.querySelector(".log-stream");if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;(t||s<80)&&(n.scrollTop=n.scrollHeight)})})}function jl(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.chatUserNearBottom=s<200}function ql(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.logsAtBottom=s<80}function Vl(e){e.chatHasAutoScrolled=!1,e.chatUserNearBottom=!0}function Wl(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
14
+ `)}
15
+ `],{type:"text/plain"}),s=URL.createObjectURL(n),i=document.createElement("a"),a=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");i.href=s,i.download=`clawdbot-logs-${t}-${a}.log`,i.click(),URL.revokeObjectURL(s)}function Gl(e){if(typeof ResizeObserver>"u")return;const t=e.querySelector(".topbar");if(!t)return;const n=()=>{const{height:s}=t.getBoundingClientRect();e.style.setProperty("--topbar-height",`${s}px`)};n(),e.topbarObserver=new ResizeObserver(()=>n()),e.topbarObserver.observe(t)}function Oe(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function et(e){return`${JSON.stringify(e,null,2).trimEnd()}
16
+ `}function lr(e,t,n){if(t.length===0)return;let s=e;for(let a=0;a<t.length-1;a+=1){const r=t[a],l=t[a+1];if(typeof r=="number"){if(!Array.isArray(s))return;s[r]==null&&(s[r]=typeof l=="number"?[]:{}),s=s[r]}else{if(typeof s!="object"||s==null)return;const c=s;c[r]==null&&(c[r]=typeof l=="number"?[]:{}),s=c[r]}}const i=t[t.length-1];if(typeof i=="number"){Array.isArray(s)&&(s[i]=n);return}typeof s=="object"&&s!=null&&(s[i]=n)}function cr(e,t){if(t.length===0)return;let n=e;for(let i=0;i<t.length-1;i+=1){const a=t[i];if(typeof a=="number"){if(!Array.isArray(n))return;n=n[a]}else{if(typeof n!="object"||n==null)return;n=n[a]}if(n==null)return}const s=t[t.length-1];if(typeof s=="number"){Array.isArray(n)&&n.splice(s,1);return}typeof n=="object"&&n!=null&&delete n[s]}async function ye(e){if(!(!e.client||!e.connected)){e.configLoading=!0,e.lastError=null;try{const t=await e.client.request("config.get",{});Yl(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function dr(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});Ql(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function Ql(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function Yl(e,t){e.configSnapshot=t;const n=typeof t.raw=="string"?t.raw:t.config&&typeof t.config=="object"?et(t.config):e.configRaw;!e.configFormDirty||e.configFormMode==="raw"?e.configRaw=n:e.configForm?e.configRaw=et(e.configForm):e.configRaw=n,e.configValid=typeof t.valid=="boolean"?t.valid:null,e.configIssues=Array.isArray(t.issues)?t.issues:[],e.configFormDirty||(e.configForm=Oe(t.config??{}),e.configFormOriginal=Oe(t.config??{}),e.configRawOriginal=n)}async function ls(e){if(!(!e.client||!e.connected)){e.configSaving=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?et(e.configForm):e.configRaw,n=e.configSnapshot?.hash;if(!n){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.set",{raw:t,baseHash:n}),e.configFormDirty=!1,await ye(e)}catch(t){e.lastError=String(t)}finally{e.configSaving=!1}}}async function Zl(e){if(!(!e.client||!e.connected)){e.configApplying=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?et(e.configForm):e.configRaw,n=e.configSnapshot?.hash;if(!n){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.apply",{raw:t,baseHash:n,sessionKey:e.applySessionKey}),e.configFormDirty=!1,await ye(e)}catch(t){e.lastError=String(t)}finally{e.configApplying=!1}}}async function Xl(e){if(!(!e.client||!e.connected)){e.updateRunning=!0,e.lastError=null;try{await e.client.request("update.run",{sessionKey:e.applySessionKey})}catch(t){e.lastError=String(t)}finally{e.updateRunning=!1}}}function Bt(e,t,n){const s=Oe(e.configForm??e.configSnapshot?.config??{});lr(s,t,n),e.configForm=s,e.configFormDirty=!0,e.configFormMode==="form"&&(e.configRaw=et(s))}function Zi(e,t){const n=Oe(e.configForm??e.configSnapshot?.config??{});cr(n,t),e.configForm=n,e.configFormDirty=!0,e.configFormMode==="form"&&(e.configRaw=et(n))}async function Tt(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("cron.status",{});e.cronStatus=t}catch(t){e.cronError=String(t)}}async function cn(e){if(!(!e.client||!e.connected)&&!e.cronLoading){e.cronLoading=!0,e.cronError=null;try{const t=await e.client.request("cron.list",{includeDisabled:!0});e.cronJobs=Array.isArray(t.jobs)?t.jobs:[]}catch(t){e.cronError=String(t)}finally{e.cronLoading=!1}}}function Jl(e){if(e.scheduleKind==="at"){const n=Date.parse(e.scheduleAt);if(!Number.isFinite(n))throw new Error("Invalid run time.");return{kind:"at",atMs:n}}if(e.scheduleKind==="every"){const n=Yt(e.everyAmount,0);if(n<=0)throw new Error("Invalid interval amount.");const s=e.everyUnit;return{kind:"every",everyMs:n*(s==="minutes"?6e4:s==="hours"?36e5:864e5)}}const t=e.cronExpr.trim();if(!t)throw new Error("Cron expression required.");return{kind:"cron",expr:t,tz:e.cronTz.trim()||void 0}}function ec(e){if(e.payloadKind==="systemEvent"){const i=e.payloadText.trim();if(!i)throw new Error("System event text required.");return{kind:"systemEvent",text:i}}const t=e.payloadText.trim();if(!t)throw new Error("Agent message required.");const n={kind:"agentTurn",message:t};e.deliver&&(n.deliver=!0),e.channel&&(n.channel=e.channel),e.to.trim()&&(n.to=e.to.trim());const s=Yt(e.timeoutSeconds,0);return s>0&&(n.timeoutSeconds=s),n}async function tc(e){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const t=Jl(e.cronForm),n=ec(e.cronForm),s=e.cronForm.agentId.trim(),i={name:e.cronForm.name.trim(),description:e.cronForm.description.trim()||void 0,agentId:s||void 0,enabled:e.cronForm.enabled,schedule:t,sessionTarget:e.cronForm.sessionTarget,wakeMode:e.cronForm.wakeMode,payload:n,isolation:e.cronForm.postToMainPrefix.trim()&&e.cronForm.sessionTarget==="isolated"?{postToMainPrefix:e.cronForm.postToMainPrefix.trim()}:void 0};if(!i.name)throw new Error("Name required.");await e.client.request("cron.add",i),e.cronForm={...e.cronForm,name:"",description:"",payloadText:""},await cn(e),await Tt(e)}catch(t){e.cronError=String(t)}finally{e.cronBusy=!1}}}async function nc(e,t,n){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.update",{id:t.id,patch:{enabled:n}}),await cn(e),await Tt(e)}catch(s){e.cronError=String(s)}finally{e.cronBusy=!1}}}async function sc(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.run",{id:t.id,mode:"force"}),await ur(e,t.id)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function ic(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.remove",{id:t.id}),e.cronRunsJobId===t.id&&(e.cronRunsJobId=null,e.cronRuns=[]),await cn(e),await Tt(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function ur(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("cron.runs",{id:t,limit:50});e.cronRunsJobId=t,e.cronRuns=Array.isArray(n.entries)?n.entries:[]}catch(n){e.cronError=String(n)}}async function re(e,t){if(!(!e.client||!e.connected)&&!e.channelsLoading){e.channelsLoading=!0,e.channelsError=null;try{const n=await e.client.request("channels.status",{probe:t,timeoutMs:8e3});e.channelsSnapshot=n,e.channelsLastSuccess=Date.now()}catch(n){e.channelsError=String(n)}finally{e.channelsLoading=!1}}}async function ac(e,t){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const n=await e.client.request("web.login.start",{force:t,timeoutMs:3e4});e.whatsappLoginMessage=n.message??null,e.whatsappLoginQrDataUrl=n.qrDataUrl??null,e.whatsappLoginConnected=null}catch(n){e.whatsappLoginMessage=String(n),e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function rc(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const t=await e.client.request("web.login.wait",{timeoutMs:12e4});e.whatsappLoginMessage=t.message??null,e.whatsappLoginConnected=t.connected??null,t.connected&&(e.whatsappLoginQrDataUrl=null)}catch(t){e.whatsappLoginMessage=String(t),e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function oc(e){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{await e.client.request("channels.logout",{channel:"whatsapp"}),e.whatsappLoginMessage="Logged out.",e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}catch(t){e.whatsappLoginMessage=String(t)}finally{e.whatsappBusy=!1}}}async function dn(e){if(!(!e.client||!e.connected)&&!e.debugLoading){e.debugLoading=!0;try{const[t,n,s,i]=await Promise.all([e.client.request("status",{}),e.client.request("health",{}),e.client.request("models.list",{}),e.client.request("last-heartbeat",{})]);e.debugStatus=t,e.debugHealth=n;const a=s;e.debugModels=Array.isArray(a?.models)?a?.models:[],e.debugHeartbeat=i}catch(t){e.debugCallError=String(t)}finally{e.debugLoading=!1}}}async function lc(e){if(!(!e.client||!e.connected)){e.debugCallError=null,e.debugCallResult=null;try{const t=e.debugCallParams.trim()?JSON.parse(e.debugCallParams):{},n=await e.client.request(e.debugCallMethod.trim(),t);e.debugCallResult=JSON.stringify(n,null,2)}catch(t){e.debugCallError=String(t)}}}const cc=2e3,dc=new Set(["trace","debug","info","warn","error","fatal"]);function uc(e){if(typeof e!="string")return null;const t=e.trim();if(!t.startsWith("{")||!t.endsWith("}"))return null;try{const n=JSON.parse(t);return!n||typeof n!="object"?null:n}catch{return null}}function pc(e){if(typeof e!="string")return null;const t=e.toLowerCase();return dc.has(t)?t:null}function fc(e){if(!e.trim())return{raw:e,message:e};try{const t=JSON.parse(e),n=t&&typeof t._meta=="object"&&t._meta!==null?t._meta:null,s=typeof t.time=="string"?t.time:typeof n?.date=="string"?n?.date:null,i=pc(n?.logLevelName??n?.level),a=typeof t[0]=="string"?t[0]:typeof n?.name=="string"?n?.name:null,r=uc(a);let l=null;r&&(typeof r.subsystem=="string"?l=r.subsystem:typeof r.module=="string"&&(l=r.module)),!l&&a&&a.length<120&&(l=a);let c=null;return typeof t[1]=="string"?c=t[1]:!r&&typeof t[0]=="string"?c=t[0]:typeof t.message=="string"&&(c=t.message),{raw:e,time:s,level:i,subsystem:l,message:c??e,meta:n??void 0}}catch{return{raw:e,message:e}}}async function Os(e,t){if(!(!e.client||!e.connected)&&!(e.logsLoading&&!t?.quiet)){t?.quiet||(e.logsLoading=!0),e.logsError=null;try{const s=await e.client.request("logs.tail",{cursor:t?.reset?void 0:e.logsCursor??void 0,limit:e.logsLimit,maxBytes:e.logsMaxBytes}),a=(Array.isArray(s.lines)?s.lines.filter(l=>typeof l=="string"):[]).map(fc),r=!!(t?.reset||s.reset||e.logsCursor==null);e.logsEntries=r?a:[...e.logsEntries,...a].slice(-cc),typeof s.cursor=="number"&&(e.logsCursor=s.cursor),typeof s.file=="string"&&(e.logsFile=s.file),e.logsTruncated=!!s.truncated,e.logsLastFetchAt=Date.now()}catch(n){e.logsError=String(n)}finally{t?.quiet||(e.logsLoading=!1)}}}const pr={p:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,n:0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,h:8n,a:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,d:0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,Gx:0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,Gy:0x6666666666666666666666666666666666666666666666666666666666666658n},{p:V,n:Vt,Gx:Xi,Gy:Ji,a:Kn,d:Hn,h:hc}=pr,De=32,Ds=64,gc=(...e)=>{"captureStackTrace"in Error&&typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(...e)},H=(e="")=>{const t=new Error(e);throw gc(t,H),t},vc=e=>typeof e=="bigint",mc=e=>typeof e=="string",yc=e=>e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array",Se=(e,t,n="")=>{const s=yc(e),i=e?.length,a=t!==void 0;if(!s||a&&i!==t){const r=n&&`"${n}" `,l=a?` of length ${t}`:"",c=s?`length=${i}`:`type=${typeof e}`;H(r+"expected Uint8Array"+l+", got "+c)}return e},un=e=>new Uint8Array(e),fr=e=>Uint8Array.from(e),hr=(e,t)=>e.toString(16).padStart(t,"0"),gr=e=>Array.from(Se(e)).map(t=>hr(t,2)).join(""),ve={_0:48,_9:57,A:65,F:70,a:97,f:102},ea=e=>{if(e>=ve._0&&e<=ve._9)return e-ve._0;if(e>=ve.A&&e<=ve.F)return e-(ve.A-10);if(e>=ve.a&&e<=ve.f)return e-(ve.a-10)},vr=e=>{const t="hex invalid";if(!mc(e))return H(t);const n=e.length,s=n/2;if(n%2)return H(t);const i=un(s);for(let a=0,r=0;a<s;a++,r+=2){const l=ea(e.charCodeAt(r)),c=ea(e.charCodeAt(r+1));if(l===void 0||c===void 0)return H(t);i[a]=l*16+c}return i},mr=()=>globalThis?.crypto,bc=()=>mr()?.subtle??H("crypto.subtle must be defined, consider polyfill"),St=(...e)=>{const t=un(e.reduce((s,i)=>s+Se(i).length,0));let n=0;return e.forEach(s=>{t.set(s,n),n+=s.length}),t},$c=(e=De)=>mr().getRandomValues(un(e)),Zt=BigInt,Le=(e,t,n,s="bad number: out of range")=>vc(e)&&t<=e&&e<n?e:H(s),k=(e,t=V)=>{const n=e%t;return n>=0n?n:t+n},yr=e=>k(e,Vt),wc=(e,t)=>{(e===0n||t<=0n)&&H("no inverse n="+e+" mod="+t);let n=k(e,t),s=t,i=0n,a=1n;for(;n!==0n;){const r=s/n,l=s%n,c=i-a*r;s=n,n=l,i=a,a=c}return s===1n?k(i,t):H("no inverse")},xc=e=>{const t=xr[e];return typeof t!="function"&&H("hashes."+e+" not set"),t},zn=e=>e instanceof ee?e:H("Point expected"),cs=2n**256n;class ee{static BASE;static ZERO;X;Y;Z;T;constructor(t,n,s,i){const a=cs;this.X=Le(t,0n,a),this.Y=Le(n,0n,a),this.Z=Le(s,1n,a),this.T=Le(i,0n,a),Object.freeze(this)}static CURVE(){return pr}static fromAffine(t){return new ee(t.x,t.y,1n,k(t.x*t.y))}static fromBytes(t,n=!1){const s=Hn,i=fr(Se(t,De)),a=t[31];i[31]=a&-129;const r=$r(i);Le(r,0n,n?cs:V);const c=k(r*r),p=k(c-1n),d=k(s*c+1n);let{isValid:u,value:h}=kc(p,d);u||H("bad point: y not sqrt");const g=(h&1n)===1n,$=(a&128)!==0;return!n&&h===0n&&$&&H("bad point: x==0, isLastByteOdd"),$!==g&&(h=k(-h)),new ee(h,r,1n,k(h*r))}static fromHex(t,n){return ee.fromBytes(vr(t),n)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}assertValidity(){const t=Kn,n=Hn,s=this;if(s.is0())return H("bad point: ZERO");const{X:i,Y:a,Z:r,T:l}=s,c=k(i*i),p=k(a*a),d=k(r*r),u=k(d*d),h=k(c*t),g=k(d*k(h+p)),$=k(u+k(n*k(c*p)));if(g!==$)return H("bad point: equation left != right (1)");const w=k(i*a),A=k(r*l);return w!==A?H("bad point: equation left != right (2)"):this}equals(t){const{X:n,Y:s,Z:i}=this,{X:a,Y:r,Z:l}=zn(t),c=k(n*l),p=k(a*i),d=k(s*l),u=k(r*i);return c===p&&d===u}is0(){return this.equals(Ye)}negate(){return new ee(k(-this.X),this.Y,this.Z,k(-this.T))}double(){const{X:t,Y:n,Z:s}=this,i=Kn,a=k(t*t),r=k(n*n),l=k(2n*k(s*s)),c=k(i*a),p=t+n,d=k(k(p*p)-a-r),u=c+r,h=u-l,g=c-r,$=k(d*h),w=k(u*g),A=k(d*g),_=k(h*u);return new ee($,w,_,A)}add(t){const{X:n,Y:s,Z:i,T:a}=this,{X:r,Y:l,Z:c,T:p}=zn(t),d=Kn,u=Hn,h=k(n*r),g=k(s*l),$=k(a*u*p),w=k(i*c),A=k((n+s)*(r+l)-h-g),_=k(w-$),M=k(w+$),P=k(g-d*h),I=k(A*_),E=k(M*P),C=k(A*P),pe=k(_*M);return new ee(I,E,pe,C)}subtract(t){return this.add(zn(t).negate())}multiply(t,n=!0){if(!n&&(t===0n||this.is0()))return Ye;if(Le(t,1n,Vt),t===1n)return this;if(this.equals(Be))return Nc(t).p;let s=Ye,i=Be;for(let a=this;t>0n;a=a.double(),t>>=1n)t&1n?s=s.add(a):n&&(i=i.add(a));return s}multiplyUnsafe(t){return this.multiply(t,!1)}toAffine(){const{X:t,Y:n,Z:s}=this;if(this.equals(Ye))return{x:0n,y:1n};const i=wc(s,V);k(s*i)!==1n&&H("invalid inverse");const a=k(t*i),r=k(n*i);return{x:a,y:r}}toBytes(){const{x:t,y:n}=this.assertValidity().toAffine(),s=br(n);return s[31]|=t&1n?128:0,s}toHex(){return gr(this.toBytes())}clearCofactor(){return this.multiply(Zt(hc),!1)}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){let t=this.multiply(Vt/2n,!1).double();return Vt%2n&&(t=t.add(this)),t.is0()}}const Be=new ee(Xi,Ji,1n,k(Xi*Ji)),Ye=new ee(0n,1n,1n,0n);ee.BASE=Be;ee.ZERO=Ye;const br=e=>vr(hr(Le(e,0n,cs),Ds)).reverse(),$r=e=>Zt("0x"+gr(fr(Se(e)).reverse())),ce=(e,t)=>{let n=e;for(;t-- >0n;)n*=n,n%=V;return n},Ac=e=>{const n=e*e%V*e%V,s=ce(n,2n)*n%V,i=ce(s,1n)*e%V,a=ce(i,5n)*i%V,r=ce(a,10n)*a%V,l=ce(r,20n)*r%V,c=ce(l,40n)*l%V,p=ce(c,80n)*c%V,d=ce(p,80n)*c%V,u=ce(d,10n)*a%V;return{pow_p_5_8:ce(u,2n)*e%V,b2:n}},ta=0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n,kc=(e,t)=>{const n=k(t*t*t),s=k(n*n*t),i=Ac(e*s).pow_p_5_8;let a=k(e*n*i);const r=k(t*a*a),l=a,c=k(a*ta),p=r===e,d=r===k(-e),u=r===k(-e*ta);return p&&(a=l),(d||u)&&(a=c),(k(a)&1n)===1n&&(a=k(-a)),{isValid:p||d,value:a}},ds=e=>yr($r(e)),Bs=(...e)=>xr.sha512Async(St(...e)),Sc=(...e)=>xc("sha512")(St(...e)),wr=e=>{const t=e.slice(0,De);t[0]&=248,t[31]&=127,t[31]|=64;const n=e.slice(De,Ds),s=ds(t),i=Be.multiply(s),a=i.toBytes();return{head:t,prefix:n,scalar:s,point:i,pointBytes:a}},Fs=e=>Bs(Se(e,De)).then(wr),_c=e=>wr(Sc(Se(e,De))),Tc=e=>Fs(e).then(t=>t.pointBytes),Ec=e=>Bs(e.hashable).then(e.finish),Cc=(e,t,n)=>{const{pointBytes:s,scalar:i}=e,a=ds(t),r=Be.multiply(a).toBytes();return{hashable:St(r,s,n),finish:p=>{const d=yr(a+ds(p)*i);return Se(St(r,br(d)),Ds)}}},Ic=async(e,t)=>{const n=Se(e),s=await Fs(t),i=await Bs(s.prefix,n);return Ec(Cc(s,i,n))},xr={sha512Async:async e=>{const t=bc(),n=St(e);return un(await t.digest("SHA-512",n.buffer))},sha512:void 0},Mc=(e=$c(De))=>e,Lc={getExtendedPublicKeyAsync:Fs,getExtendedPublicKey:_c,randomSecretKey:Mc},Xt=8,Rc=256,Ar=Math.ceil(Rc/Xt)+1,us=2**(Xt-1),Pc=()=>{const e=[];let t=Be,n=t;for(let s=0;s<Ar;s++){n=t,e.push(n);for(let i=1;i<us;i++)n=n.add(t),e.push(n);t=n.double()}return e};let na;const sa=(e,t)=>{const n=t.negate();return e?n:t},Nc=e=>{const t=na||(na=Pc());let n=Ye,s=Be;const i=2**Xt,a=i,r=Zt(i-1),l=Zt(Xt);for(let c=0;c<Ar;c++){let p=Number(e&r);e>>=l,p>us&&(p-=a,e+=1n);const d=c*us,u=d,h=d+Math.abs(p)-1,g=c%2!==0,$=p<0;p===0?s=s.add(sa(g,t[u])):n=n.add(sa($,t[h]))}return e!==0n&&H("invalid wnaf"),{p:n,f:s}},jn="clawdbot-device-identity-v1";function ps(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/g,"")}function kr(e){const t=e.replaceAll("-","+").replaceAll("_","/"),n=t+"=".repeat((4-t.length%4)%4),s=atob(n),i=new Uint8Array(s.length);for(let a=0;a<s.length;a+=1)i[a]=s.charCodeAt(a);return i}function Oc(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Sr(e){const t=await crypto.subtle.digest("SHA-256",e);return Oc(new Uint8Array(t))}async function Dc(){const e=Lc.randomSecretKey(),t=await Tc(e);return{deviceId:await Sr(t),publicKey:ps(t),privateKey:ps(e)}}async function Us(){try{const n=localStorage.getItem(jn);if(n){const s=JSON.parse(n);if(s?.version===1&&typeof s.deviceId=="string"&&typeof s.publicKey=="string"&&typeof s.privateKey=="string"){const i=await Sr(kr(s.publicKey));if(i!==s.deviceId){const a={...s,deviceId:i};return localStorage.setItem(jn,JSON.stringify(a)),{deviceId:i,publicKey:s.publicKey,privateKey:s.privateKey}}return{deviceId:s.deviceId,publicKey:s.publicKey,privateKey:s.privateKey}}}}catch{}const e=await Dc(),t={version:1,deviceId:e.deviceId,publicKey:e.publicKey,privateKey:e.privateKey,createdAtMs:Date.now()};return localStorage.setItem(jn,JSON.stringify(t)),e}async function Bc(e,t){const n=kr(e),s=new TextEncoder().encode(t),i=await Ic(s,n);return ps(i)}const _r="clawdbot.device.auth.v1";function Ks(e){return e.trim()}function Fc(e){if(!Array.isArray(e))return[];const t=new Set;for(const n of e){const s=n.trim();s&&t.add(s)}return[...t].sort()}function Hs(){try{const e=window.localStorage.getItem(_r);if(!e)return null;const t=JSON.parse(e);return!t||t.version!==1||!t.deviceId||typeof t.deviceId!="string"||!t.tokens||typeof t.tokens!="object"?null:t}catch{return null}}function Tr(e){try{window.localStorage.setItem(_r,JSON.stringify(e))}catch{}}function Uc(e){const t=Hs();if(!t||t.deviceId!==e.deviceId)return null;const n=Ks(e.role),s=t.tokens[n];return!s||typeof s.token!="string"?null:s}function Er(e){const t=Ks(e.role),n={version:1,deviceId:e.deviceId,tokens:{}},s=Hs();s&&s.deviceId===e.deviceId&&(n.tokens={...s.tokens});const i={token:e.token,role:t,scopes:Fc(e.scopes),updatedAtMs:Date.now()};return n.tokens[t]=i,Tr(n),i}function Cr(e){const t=Hs();if(!t||t.deviceId!==e.deviceId)return;const n=Ks(e.role);if(!t.tokens[n])return;const s={...t,tokens:{...t.tokens}};delete s.tokens[n],Tr(s)}async function _e(e,t){if(!(!e.client||!e.connected)&&!e.devicesLoading){e.devicesLoading=!0,t?.quiet||(e.devicesError=null);try{const n=await e.client.request("device.pair.list",{});e.devicesList={pending:Array.isArray(n?.pending)?n.pending:[],paired:Array.isArray(n?.paired)?n.paired:[]}}catch(n){t?.quiet||(e.devicesError=String(n))}finally{e.devicesLoading=!1}}}async function Kc(e,t){if(!(!e.client||!e.connected))try{await e.client.request("device.pair.approve",{requestId:t}),await _e(e)}catch(n){e.devicesError=String(n)}}async function Hc(e,t){if(!(!e.client||!e.connected||!window.confirm("Reject this device pairing request?")))try{await e.client.request("device.pair.reject",{requestId:t}),await _e(e)}catch(s){e.devicesError=String(s)}}async function zc(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("device.token.rotate",t);if(n?.token){const s=await Us(),i=n.role??t.role;(n.deviceId===s.deviceId||t.deviceId===s.deviceId)&&Er({deviceId:s.deviceId,role:i,token:n.token,scopes:n.scopes??t.scopes??[]}),window.prompt("New device token (copy and store securely):",n.token)}await _e(e)}catch(n){e.devicesError=String(n)}}async function jc(e,t){if(!(!e.client||!e.connected||!window.confirm(`Revoke token for ${t.deviceId} (${t.role})?`)))try{await e.client.request("device.token.revoke",t);const s=await Us();t.deviceId===s.deviceId&&Cr({deviceId:s.deviceId,role:t.role}),await _e(e)}catch(s){e.devicesError=String(s)}}async function pn(e,t){if(!(!e.client||!e.connected)&&!e.nodesLoading){e.nodesLoading=!0,t?.quiet||(e.lastError=null);try{const n=await e.client.request("node.list",{});e.nodes=Array.isArray(n.nodes)?n.nodes:[]}catch(n){t?.quiet||(e.lastError=String(n))}finally{e.nodesLoading=!1}}}function qc(e){if(!e||e.kind==="gateway")return{method:"exec.approvals.get",params:{}};const t=e.nodeId.trim();return t?{method:"exec.approvals.node.get",params:{nodeId:t}}:null}function Vc(e,t){if(!e||e.kind==="gateway")return{method:"exec.approvals.set",params:t};const n=e.nodeId.trim();return n?{method:"exec.approvals.node.set",params:{...t,nodeId:n}}:null}async function zs(e,t){if(!(!e.client||!e.connected)&&!e.execApprovalsLoading){e.execApprovalsLoading=!0,e.lastError=null;try{const n=qc(t);if(!n){e.lastError="Select a node before loading exec approvals.";return}const s=await e.client.request(n.method,n.params);Wc(e,s)}catch(n){e.lastError=String(n)}finally{e.execApprovalsLoading=!1}}}function Wc(e,t){e.execApprovalsSnapshot=t,e.execApprovalsDirty||(e.execApprovalsForm=Oe(t.file??{}))}async function Gc(e,t){if(!(!e.client||!e.connected)){e.execApprovalsSaving=!0,e.lastError=null;try{const n=e.execApprovalsSnapshot?.hash;if(!n){e.lastError="Exec approvals hash missing; reload and retry.";return}const s=e.execApprovalsForm??e.execApprovalsSnapshot?.file??{},i=Vc(t,{file:s,baseHash:n});if(!i){e.lastError="Select a node before saving exec approvals.";return}await e.client.request(i.method,i.params),e.execApprovalsDirty=!1,await zs(e,t)}catch(n){e.lastError=String(n)}finally{e.execApprovalsSaving=!1}}}function Qc(e,t,n){const s=Oe(e.execApprovalsForm??e.execApprovalsSnapshot?.file??{});lr(s,t,n),e.execApprovalsForm=s,e.execApprovalsDirty=!0}function Yc(e,t){const n=Oe(e.execApprovalsForm??e.execApprovalsSnapshot?.file??{});cr(n,t),e.execApprovalsForm=n,e.execApprovalsDirty=!0}async function js(e){if(!(!e.client||!e.connected)&&!e.presenceLoading){e.presenceLoading=!0,e.presenceError=null,e.presenceStatus=null;try{const t=await e.client.request("system-presence",{});Array.isArray(t)?(e.presenceEntries=t,e.presenceStatus=t.length===0?"No instances yet.":null):(e.presenceEntries=[],e.presenceStatus="No presence payload.")}catch(t){e.presenceError=String(t)}finally{e.presenceLoading=!1}}}function tt(e,t,n){if(!t.trim())return;const s={...e.skillMessages};n?s[t]=n:delete s[t],e.skillMessages=s}function fn(e){return e instanceof Error?e.message:String(e)}async function Et(e,t){if(t?.clearMessages&&Object.keys(e.skillMessages).length>0&&(e.skillMessages={}),!(!e.client||!e.connected)&&!e.skillsLoading){e.skillsLoading=!0,e.skillsError=null;try{const n=await e.client.request("skills.status",{});n&&(e.skillsReport=n)}catch(n){e.skillsError=fn(n)}finally{e.skillsLoading=!1}}}function Zc(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function Xc(e,t,n){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{await e.client.request("skills.update",{skillKey:t,enabled:n}),await Et(e),tt(e,t,{kind:"success",message:n?"Skill enabled":"Skill disabled"})}catch(s){const i=fn(s);e.skillsError=i,tt(e,t,{kind:"error",message:i})}finally{e.skillsBusyKey=null}}}async function Jc(e,t){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const n=e.skillEdits[t]??"";await e.client.request("skills.update",{skillKey:t,apiKey:n}),await Et(e),tt(e,t,{kind:"success",message:"API key saved"})}catch(n){const s=fn(n);e.skillsError=s,tt(e,t,{kind:"error",message:s})}finally{e.skillsBusyKey=null}}}async function ed(e,t,n,s){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const i=await e.client.request("skills.install",{name:n,installId:s,timeoutMs:12e4});await Et(e),tt(e,t,{kind:"success",message:i?.message??"Installed"})}catch(i){const a=fn(i);e.skillsError=a,tt(e,t,{kind:"error",message:a})}finally{e.skillsBusyKey=null}}}function td(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function qs(e){return e==="system"?td():e}const Ft=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,nd=()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches??!1,Ut=e=>{e.classList.remove("theme-transition"),e.style.removeProperty("--theme-switch-x"),e.style.removeProperty("--theme-switch-y")},sd=({nextTheme:e,applyTheme:t,context:n,currentTheme:s})=>{if(s===e)return;const i=globalThis.document??null;if(!i){t();return}const a=i.documentElement,r=i,l=nd();if(!!r.startViewTransition&&!l){let p=.5,d=.5;if(n?.pointerClientX!==void 0&&n?.pointerClientY!==void 0&&typeof window<"u")p=Ft(n.pointerClientX/window.innerWidth),d=Ft(n.pointerClientY/window.innerHeight);else if(n?.element){const u=n.element.getBoundingClientRect();u.width>0&&u.height>0&&typeof window<"u"&&(p=Ft((u.left+u.width/2)/window.innerWidth),d=Ft((u.top+u.height/2)/window.innerHeight))}a.style.setProperty("--theme-switch-x",`${p*100}%`),a.style.setProperty("--theme-switch-y",`${d*100}%`),a.classList.add("theme-transition");try{const u=r.startViewTransition?.(()=>{t()});u?.finished?u.finished.finally(()=>Ut(a)):Ut(a)}catch{Ut(a),t()}return}t(),Ut(a)};function id(e){e.nodesPollInterval==null&&(e.nodesPollInterval=window.setInterval(()=>{pn(e,{quiet:!0})},5e3))}function ad(e){e.nodesPollInterval!=null&&(clearInterval(e.nodesPollInterval),e.nodesPollInterval=null)}function Vs(e){e.logsPollInterval==null&&(e.logsPollInterval=window.setInterval(()=>{e.tab==="logs"&&Os(e,{quiet:!0})},2e3))}function Ws(e){e.logsPollInterval!=null&&(clearInterval(e.logsPollInterval),e.logsPollInterval=null)}function Gs(e){e.debugPollInterval==null&&(e.debugPollInterval=window.setInterval(()=>{e.tab==="debug"&&dn(e)},3e3))}function Qs(e){e.debugPollInterval!=null&&(clearInterval(e.debugPollInterval),e.debugPollInterval=null)}function Fe(e,t){const n={...t,lastActiveSessionKey:t.lastActiveSessionKey?.trim()||t.sessionKey.trim()||"main"};e.settings=n,fl(n),t.theme!==e.theme&&(e.theme=t.theme,hn(e,qs(t.theme))),e.applySessionKey=e.settings.lastActiveSessionKey}function Ir(e,t){const n=t.trim();n&&e.settings.lastActiveSessionKey!==n&&Fe(e,{...e.settings,lastActiveSessionKey:n})}function rd(e){if(!window.location.search)return;const t=new URLSearchParams(window.location.search),n=t.get("token"),s=t.get("password"),i=t.get("session"),a=t.get("gatewayUrl");let r=!1;if(n!=null){const c=n.trim();c&&c!==e.settings.token&&Fe(e,{...e.settings,token:c}),t.delete("token"),r=!0}if(s!=null){const c=s.trim();c&&(e.password=c),t.delete("password"),r=!0}if(i!=null){const c=i.trim();c&&(e.sessionKey=c,Fe(e,{...e.settings,sessionKey:c,lastActiveSessionKey:c}))}if(a!=null){const c=a.trim();c&&c!==e.settings.gatewayUrl&&(e.pendingGatewayUrl=c),t.delete("gatewayUrl"),r=!0}if(!r)return;const l=new URL(window.location.href);l.search=t.toString(),window.history.replaceState({},"",l.toString())}function od(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?Vs(e):Ws(e),t==="debug"?Gs(e):Qs(e),Ys(e),Lr(e,t,!1)}function ld(e,t,n){sd({nextTheme:t,applyTheme:()=>{e.theme=t,Fe(e,{...e.settings,theme:t}),hn(e,qs(t))},context:n,currentTheme:e.theme})}async function Ys(e){e.tab==="overview"&&await Rr(e),e.tab==="channels"&&await vd(e),e.tab==="instances"&&await js(e),e.tab==="sessions"&&await st(e),e.tab==="cron"&&await Zs(e),e.tab==="skills"&&await Et(e),e.tab==="nodes"&&(await pn(e),await _e(e),await ye(e),await zs(e)),e.tab==="chat"&&(await wd(e),ln(e,!e.chatHasAutoScrolled)),e.tab==="config"&&(await dr(e),await ye(e)),e.tab==="debug"&&(await dn(e),e.eventLog=e.eventLogBuffer),e.tab==="logs"&&(e.logsAtBottom=!0,await Os(e,{reset:!0}),or(e,!0))}function cd(){if(typeof window>"u")return"";const e=window.__CLAWDBOT_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?on(e):gl(window.location.pathname)}function dd(e){e.theme=e.settings.theme??"system",hn(e,qs(e.theme))}function hn(e,t){if(e.themeResolved=t,typeof document>"u")return;const n=document.documentElement;n.dataset.theme=t,n.style.colorScheme=t}function ud(e){if(typeof window>"u"||typeof window.matchMedia!="function")return;if(e.themeMedia=window.matchMedia("(prefers-color-scheme: dark)"),e.themeMediaHandler=n=>{e.theme==="system"&&hn(e,n.matches?"dark":"light")},typeof e.themeMedia.addEventListener=="function"){e.themeMedia.addEventListener("change",e.themeMediaHandler);return}e.themeMedia.addListener(e.themeMediaHandler)}function pd(e){if(!e.themeMedia||!e.themeMediaHandler)return;if(typeof e.themeMedia.removeEventListener=="function"){e.themeMedia.removeEventListener("change",e.themeMediaHandler);return}e.themeMedia.removeListener(e.themeMediaHandler),e.themeMedia=null,e.themeMediaHandler=null}function fd(e,t){if(typeof window>"u")return;const n=sr(window.location.pathname,e.basePath)??"chat";Mr(e,n),Lr(e,n,t)}function hd(e){if(typeof window>"u")return;const t=sr(window.location.pathname,e.basePath);if(!t)return;const s=new URL(window.location.href).searchParams.get("session")?.trim();s&&(e.sessionKey=s,Fe(e,{...e.settings,sessionKey:s,lastActiveSessionKey:s})),Mr(e,t)}function Mr(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?Vs(e):Ws(e),t==="debug"?Gs(e):Qs(e),e.connected&&Ys(e)}function Lr(e,t,n){if(typeof window>"u")return;const s=At(Rs(t,e.basePath)),i=At(window.location.pathname),a=new URL(window.location.href);t==="chat"&&e.sessionKey?a.searchParams.set("session",e.sessionKey):a.searchParams.delete("session"),i!==s&&(a.pathname=s),n?window.history.replaceState({},"",a.toString()):window.history.pushState({},"",a.toString())}function gd(e,t,n){if(typeof window>"u")return;const s=new URL(window.location.href);s.searchParams.set("session",t),window.history.replaceState({},"",s.toString())}async function Rr(e){await Promise.all([re(e,!1),js(e),st(e),Tt(e),dn(e)])}async function vd(e){await Promise.all([re(e,!0),dr(e),ye(e)])}async function Zs(e){await Promise.all([re(e,!1),Tt(e),cn(e)])}function Pr(e){return e.chatSending||!!e.chatRunId}function md(e){const t=e.trim();if(!t)return!1;const n=t.toLowerCase();return n==="/stop"?!0:n==="stop"||n==="esc"||n==="abort"||n==="wait"||n==="exit"}async function Nr(e){e.connected&&(e.chatMessage="",await Il(e))}function yd(e,t,n){const s=t.trim(),i=!!(n&&n.length>0);!s&&!i||(e.chatQueue=[...e.chatQueue,{id:Ps(),text:s,createdAt:Date.now(),attachments:i?n?.map(a=>({...a})):void 0}])}async function Or(e,t,n){Ns(e);const s=await Cl(e,t,n?.attachments);return!s&&n?.previousDraft!=null&&(e.chatMessage=n.previousDraft),!s&&n?.previousAttachments&&(e.chatAttachments=n.previousAttachments),s&&Ir(e,e.sessionKey),s&&n?.restoreDraft&&n.previousDraft?.trim()&&(e.chatMessage=n.previousDraft),s&&n?.restoreAttachments&&n.previousAttachments?.length&&(e.chatAttachments=n.previousAttachments),ln(e),s&&!e.chatRunId&&Dr(e),s}async function Dr(e){if(!e.connected||Pr(e))return;const[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n,await Or(e,t.text,{attachments:t.attachments})||(e.chatQueue=[t,...e.chatQueue])}function bd(e,t){e.chatQueue=e.chatQueue.filter(n=>n.id!==t)}async function $d(e,t,n){if(!e.connected)return;const s=e.chatMessage,i=(t??e.chatMessage).trim(),a=e.chatAttachments??[],r=t==null?a:[],l=r.length>0;if(!(!i&&!l)){if(md(i)){await Nr(e);return}if(t==null&&(e.chatMessage="",e.chatAttachments=[]),Pr(e)){yd(e,i,r);return}await Or(e,i,{previousDraft:t==null?s:void 0,restoreDraft:!!(t&&n?.restoreDraft),attachments:l?r:void 0,previousAttachments:t==null?a:void 0,restoreAttachments:!!(t&&n?.restoreDraft)})}}async function wd(e){await Promise.all([Je(e),st(e),fs(e)]),ln(e,!0)}const xd=Dr;function Ad(e){const t=er(e.sessionKey);return t?.agentId?t.agentId:e.hello?.snapshot?.sessionDefaults?.defaultAgentId?.trim()||"main"}function kd(e,t){const n=on(e),s=encodeURIComponent(t);return n?`${n}/avatar/${s}?meta=1`:`/avatar/${s}?meta=1`}async function fs(e){if(!e.connected){e.chatAvatarUrl=null;return}const t=Ad(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;const n=kd(e.basePath,t);try{const s=await fetch(n,{method:"GET"});if(!s.ok){e.chatAvatarUrl=null;return}const i=await s.json(),a=typeof i.avatarUrl=="string"?i.avatarUrl.trim():"";e.chatAvatarUrl=a||null}catch{e.chatAvatarUrl=null}}const Br={CHILD:2},Fr=e=>(...t)=>({_$litDirective$:e,values:t});let Ur=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,n,s){this._$Ct=t,this._$AM=n,this._$Ci=s}_$AS(t,n){return this.update(t,n)}update(t,n){return this.render(...n)}};const{I:Sd}=nl,ia=e=>e,aa=()=>document.createComment(""),lt=(e,t,n)=>{const s=e._$AA.parentNode,i=t===void 0?e._$AB:t._$AA;if(n===void 0){const a=s.insertBefore(aa(),i),r=s.insertBefore(aa(),i);n=new Sd(a,r,e,e.options)}else{const a=n._$AB.nextSibling,r=n._$AM,l=r!==e;if(l){let c;n._$AQ?.(e),n._$AM=e,n._$AP!==void 0&&(c=e._$AU)!==r._$AU&&n._$AP(c)}if(a!==i||l){let c=n._$AA;for(;c!==a;){const p=ia(c).nextSibling;ia(s).insertBefore(c,i),c=p}}}return n},Ie=(e,t,n=e)=>(e._$AI(t,n),e),_d={},Td=(e,t=_d)=>e._$AH=t,Ed=e=>e._$AH,qn=e=>{e._$AR(),e._$AA.remove()};const ra=(e,t,n)=>{const s=new Map;for(let i=t;i<=n;i++)s.set(e[i],i);return s},Kr=Fr(class extends Ur{constructor(e){if(super(e),e.type!==Br.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,n){let s;n===void 0?n=t:t!==void 0&&(s=t);const i=[],a=[];let r=0;for(const l of e)i[r]=s?s(l,r):r,a[r]=n(l,r),r++;return{values:a,keys:i}}render(e,t,n){return this.dt(e,t,n).values}update(e,[t,n,s]){const i=Ed(e),{values:a,keys:r}=this.dt(t,n,s);if(!Array.isArray(i))return this.ut=r,a;const l=this.ut??=[],c=[];let p,d,u=0,h=i.length-1,g=0,$=a.length-1;for(;u<=h&&g<=$;)if(i[u]===null)u++;else if(i[h]===null)h--;else if(l[u]===r[g])c[g]=Ie(i[u],a[g]),u++,g++;else if(l[h]===r[$])c[$]=Ie(i[h],a[$]),h--,$--;else if(l[u]===r[$])c[$]=Ie(i[u],a[$]),lt(e,c[$+1],i[u]),u++,$--;else if(l[h]===r[g])c[g]=Ie(i[h],a[g]),lt(e,i[u],i[h]),h--,g++;else if(p===void 0&&(p=ra(r,g,$),d=ra(l,u,h)),p.has(l[u]))if(p.has(l[h])){const w=d.get(r[g]),A=w!==void 0?i[w]:null;if(A===null){const _=lt(e,i[u]);Ie(_,a[g]),c[g]=_}else c[g]=Ie(A,a[g]),lt(e,i[u],A),i[w]=null;g++}else qn(i[h]),h--;else qn(i[u]),u++;for(;g<=$;){const w=lt(e,c[$+1]);Ie(w,a[g]),c[g++]=w}for(;u<=h;){const w=i[u++];w!==null&&qn(w)}return this.ut=r,Td(e,c),ke}});function Hr(e){const t=e;let n=typeof t.role=="string"?t.role:"unknown";const s=typeof t.toolCallId=="string"||typeof t.tool_call_id=="string",i=t.content,a=Array.isArray(i)?i:null,r=Array.isArray(a)&&a.some(u=>{const g=String(u.type??"").toLowerCase();return g==="toolresult"||g==="tool_result"}),l=typeof t.toolName=="string"||typeof t.tool_name=="string";(s||r||l)&&(n="toolResult");let c=[];typeof t.content=="string"?c=[{type:"text",text:t.content}]:Array.isArray(t.content)?c=t.content.map(u=>({type:u.type||"text",text:u.text,name:u.name,args:u.args||u.arguments})):typeof t.text=="string"&&(c=[{type:"text",text:t.text}]);const p=typeof t.timestamp=="number"?t.timestamp:Date.now(),d=typeof t.id=="string"?t.id:void 0;return{role:n,content:c,timestamp:p,id:d}}function Xs(e){const t=e.toLowerCase();return e==="user"||e==="User"?e:e==="assistant"?"assistant":e==="system"?"system":t==="toolresult"||t==="tool_result"||t==="tool"||t==="function"?"tool":e}function zr(e){const t=e,n=typeof t.role=="string"?t.role.toLowerCase():"";return n==="toolresult"||n==="tool_result"}class hs extends Ur{constructor(t){if(super(t),this.it=v,t.type!==Br.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===v||t==null)return this._t=void 0,this.it=t;if(t===ke)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const n=[t];return n.raw=n,this._t={_$litType$:this.constructor.resultType,strings:n,values:[]}}}hs.directiveName="unsafeHTML",hs.resultType=1;const gs=Fr(hs);const{entries:jr,setPrototypeOf:oa,isFrozen:Cd,getPrototypeOf:Id,getOwnPropertyDescriptor:Md}=Object;let{freeze:Z,seal:ne,create:vs}=Object,{apply:ms,construct:ys}=typeof Reflect<"u"&&Reflect;Z||(Z=function(t){return t});ne||(ne=function(t){return t});ms||(ms=function(t,n){for(var s=arguments.length,i=new Array(s>2?s-2:0),a=2;a<s;a++)i[a-2]=arguments[a];return t.apply(n,i)});ys||(ys=function(t){for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return new t(...s)});const Kt=X(Array.prototype.forEach),Ld=X(Array.prototype.lastIndexOf),la=X(Array.prototype.pop),ct=X(Array.prototype.push),Rd=X(Array.prototype.splice),Wt=X(String.prototype.toLowerCase),Vn=X(String.prototype.toString),Wn=X(String.prototype.match),dt=X(String.prototype.replace),Pd=X(String.prototype.indexOf),Nd=X(String.prototype.trim),se=X(Object.prototype.hasOwnProperty),Q=X(RegExp.prototype.test),ut=Od(TypeError);function X(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return ms(e,t,s)}}function Od(e){return function(){for(var t=arguments.length,n=new Array(t),s=0;s<t;s++)n[s]=arguments[s];return ys(e,n)}}function L(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Wt;oa&&oa(e,null);let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){const a=n(i);a!==i&&(Cd(t)||(t[s]=a),i=a)}e[i]=!0}return e}function Dd(e){for(let t=0;t<e.length;t++)se(e,t)||(e[t]=null);return e}function de(e){const t=vs(null);for(const[n,s]of jr(e))se(e,n)&&(Array.isArray(s)?t[n]=Dd(s):s&&typeof s=="object"&&s.constructor===Object?t[n]=de(s):t[n]=s);return t}function pt(e,t){for(;e!==null;){const s=Md(e,t);if(s){if(s.get)return X(s.get);if(typeof s.value=="function")return X(s.value)}e=Id(e)}function n(){return null}return n}const ca=Z(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Gn=Z(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),Qn=Z(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Bd=Z(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),Yn=Z(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Fd=Z(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),da=Z(["#text"]),ua=Z(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),Zn=Z(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),pa=Z(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),Ht=Z(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Ud=ne(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Kd=ne(/<%[\w\W]*|[\w\W]*%>/gm),Hd=ne(/\$\{[\w\W]*/gm),zd=ne(/^data-[\-\w.\u00B7-\uFFFF]+$/),jd=ne(/^aria-[\-\w]+$/),qr=ne(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),qd=ne(/^(?:\w+script|data):/i),Vd=ne(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Vr=ne(/^html$/i),Wd=ne(/^[a-z][.\w]*(-[.\w]+)+$/i);var fa=Object.freeze({__proto__:null,ARIA_ATTR:jd,ATTR_WHITESPACE:Vd,CUSTOM_ELEMENT:Wd,DATA_ATTR:zd,DOCTYPE_NAME:Vr,ERB_EXPR:Kd,IS_ALLOWED_URI:qr,IS_SCRIPT_OR_DATA:qd,MUSTACHE_EXPR:Ud,TMPLIT_EXPR:Hd});const ft={element:1,text:3,progressingInstruction:7,comment:8,document:9},Gd=function(){return typeof window>"u"?null:window},Qd=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null;const i="data-tt-policy-suffix";n&&n.hasAttribute(i)&&(s=n.getAttribute(i));const a="dompurify"+(s?"#"+s:"");try{return t.createPolicy(a,{createHTML(r){return r},createScriptURL(r){return r}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},ha=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Wr(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Gd();const t=T=>Wr(T);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==ft.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const s=n,i=s.currentScript,{DocumentFragment:a,HTMLTemplateElement:r,Node:l,Element:c,NodeFilter:p,NamedNodeMap:d=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:u,DOMParser:h,trustedTypes:g}=e,$=c.prototype,w=pt($,"cloneNode"),A=pt($,"remove"),_=pt($,"nextSibling"),M=pt($,"childNodes"),P=pt($,"parentNode");if(typeof r=="function"){const T=n.createElement("template");T.content&&T.content.ownerDocument&&(n=T.content.ownerDocument)}let I,E="";const{implementation:C,createNodeIterator:pe,createDocumentFragment:bn,getElementsByTagName:$n}=n,{importNode:Ao}=s;let G=ha();t.isSupported=typeof jr=="function"&&typeof P=="function"&&C&&C.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:wn,ERB_EXPR:xn,TMPLIT_EXPR:An,DATA_ATTR:ko,ARIA_ATTR:So,IS_SCRIPT_OR_DATA:_o,ATTR_WHITESPACE:di,CUSTOM_ELEMENT:To}=fa;let{IS_ALLOWED_URI:ui}=fa,K=null;const pi=L({},[...ca,...Gn,...Qn,...Yn,...da]);let z=null;const fi=L({},[...ua,...Zn,...pa,...Ht]);let B=Object.seal(vs(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),it=null,kn=null;const He=Object.seal(vs(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let hi=!0,Sn=!0,gi=!1,vi=!0,ze=!1,It=!0,Te=!1,_n=!1,Tn=!1,je=!1,Mt=!1,Lt=!1,mi=!0,yi=!1;const Eo="user-content-";let En=!0,at=!1,qe={},oe=null;const Cn=L({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let bi=null;const $i=L({},["audio","video","img","source","image","track"]);let In=null;const wi=L({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Rt="http://www.w3.org/1998/Math/MathML",Pt="http://www.w3.org/2000/svg",fe="http://www.w3.org/1999/xhtml";let Ve=fe,Mn=!1,Ln=null;const Co=L({},[Rt,Pt,fe],Vn);let Nt=L({},["mi","mo","mn","ms","mtext"]),Ot=L({},["annotation-xml"]);const Io=L({},["title","style","font","a","script"]);let rt=null;const Mo=["application/xhtml+xml","text/html"],Lo="text/html";let U=null,We=null;const Ro=n.createElement("form"),xi=function(f){return f instanceof RegExp||f instanceof Function},Rn=function(){let f=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(We&&We===f)){if((!f||typeof f!="object")&&(f={}),f=de(f),rt=Mo.indexOf(f.PARSER_MEDIA_TYPE)===-1?Lo:f.PARSER_MEDIA_TYPE,U=rt==="application/xhtml+xml"?Vn:Wt,K=se(f,"ALLOWED_TAGS")?L({},f.ALLOWED_TAGS,U):pi,z=se(f,"ALLOWED_ATTR")?L({},f.ALLOWED_ATTR,U):fi,Ln=se(f,"ALLOWED_NAMESPACES")?L({},f.ALLOWED_NAMESPACES,Vn):Co,In=se(f,"ADD_URI_SAFE_ATTR")?L(de(wi),f.ADD_URI_SAFE_ATTR,U):wi,bi=se(f,"ADD_DATA_URI_TAGS")?L(de($i),f.ADD_DATA_URI_TAGS,U):$i,oe=se(f,"FORBID_CONTENTS")?L({},f.FORBID_CONTENTS,U):Cn,it=se(f,"FORBID_TAGS")?L({},f.FORBID_TAGS,U):de({}),kn=se(f,"FORBID_ATTR")?L({},f.FORBID_ATTR,U):de({}),qe=se(f,"USE_PROFILES")?f.USE_PROFILES:!1,hi=f.ALLOW_ARIA_ATTR!==!1,Sn=f.ALLOW_DATA_ATTR!==!1,gi=f.ALLOW_UNKNOWN_PROTOCOLS||!1,vi=f.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ze=f.SAFE_FOR_TEMPLATES||!1,It=f.SAFE_FOR_XML!==!1,Te=f.WHOLE_DOCUMENT||!1,je=f.RETURN_DOM||!1,Mt=f.RETURN_DOM_FRAGMENT||!1,Lt=f.RETURN_TRUSTED_TYPE||!1,Tn=f.FORCE_BODY||!1,mi=f.SANITIZE_DOM!==!1,yi=f.SANITIZE_NAMED_PROPS||!1,En=f.KEEP_CONTENT!==!1,at=f.IN_PLACE||!1,ui=f.ALLOWED_URI_REGEXP||qr,Ve=f.NAMESPACE||fe,Nt=f.MATHML_TEXT_INTEGRATION_POINTS||Nt,Ot=f.HTML_INTEGRATION_POINTS||Ot,B=f.CUSTOM_ELEMENT_HANDLING||{},f.CUSTOM_ELEMENT_HANDLING&&xi(f.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(B.tagNameCheck=f.CUSTOM_ELEMENT_HANDLING.tagNameCheck),f.CUSTOM_ELEMENT_HANDLING&&xi(f.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(B.attributeNameCheck=f.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),f.CUSTOM_ELEMENT_HANDLING&&typeof f.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(B.allowCustomizedBuiltInElements=f.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ze&&(Sn=!1),Mt&&(je=!0),qe&&(K=L({},da),z=[],qe.html===!0&&(L(K,ca),L(z,ua)),qe.svg===!0&&(L(K,Gn),L(z,Zn),L(z,Ht)),qe.svgFilters===!0&&(L(K,Qn),L(z,Zn),L(z,Ht)),qe.mathMl===!0&&(L(K,Yn),L(z,pa),L(z,Ht))),f.ADD_TAGS&&(typeof f.ADD_TAGS=="function"?He.tagCheck=f.ADD_TAGS:(K===pi&&(K=de(K)),L(K,f.ADD_TAGS,U))),f.ADD_ATTR&&(typeof f.ADD_ATTR=="function"?He.attributeCheck=f.ADD_ATTR:(z===fi&&(z=de(z)),L(z,f.ADD_ATTR,U))),f.ADD_URI_SAFE_ATTR&&L(In,f.ADD_URI_SAFE_ATTR,U),f.FORBID_CONTENTS&&(oe===Cn&&(oe=de(oe)),L(oe,f.FORBID_CONTENTS,U)),f.ADD_FORBID_CONTENTS&&(oe===Cn&&(oe=de(oe)),L(oe,f.ADD_FORBID_CONTENTS,U)),En&&(K["#text"]=!0),Te&&L(K,["html","head","body"]),K.table&&(L(K,["tbody"]),delete it.tbody),f.TRUSTED_TYPES_POLICY){if(typeof f.TRUSTED_TYPES_POLICY.createHTML!="function")throw ut('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof f.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw ut('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');I=f.TRUSTED_TYPES_POLICY,E=I.createHTML("")}else I===void 0&&(I=Qd(g,i)),I!==null&&typeof E=="string"&&(E=I.createHTML(""));Z&&Z(f),We=f}},Ai=L({},[...Gn,...Qn,...Bd]),ki=L({},[...Yn,...Fd]),Po=function(f){let x=P(f);(!x||!x.tagName)&&(x={namespaceURI:Ve,tagName:"template"});const S=Wt(f.tagName),D=Wt(x.tagName);return Ln[f.namespaceURI]?f.namespaceURI===Pt?x.namespaceURI===fe?S==="svg":x.namespaceURI===Rt?S==="svg"&&(D==="annotation-xml"||Nt[D]):!!Ai[S]:f.namespaceURI===Rt?x.namespaceURI===fe?S==="math":x.namespaceURI===Pt?S==="math"&&Ot[D]:!!ki[S]:f.namespaceURI===fe?x.namespaceURI===Pt&&!Ot[D]||x.namespaceURI===Rt&&!Nt[D]?!1:!ki[S]&&(Io[S]||!Ai[S]):!!(rt==="application/xhtml+xml"&&Ln[f.namespaceURI]):!1},le=function(f){ct(t.removed,{element:f});try{P(f).removeChild(f)}catch{A(f)}},Ee=function(f,x){try{ct(t.removed,{attribute:x.getAttributeNode(f),from:x})}catch{ct(t.removed,{attribute:null,from:x})}if(x.removeAttribute(f),f==="is")if(je||Mt)try{le(x)}catch{}else try{x.setAttribute(f,"")}catch{}},Si=function(f){let x=null,S=null;if(Tn)f="<remove></remove>"+f;else{const F=Wn(f,/^[\r\n\t ]+/);S=F&&F[0]}rt==="application/xhtml+xml"&&Ve===fe&&(f='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+f+"</body></html>");const D=I?I.createHTML(f):f;if(Ve===fe)try{x=new h().parseFromString(D,rt)}catch{}if(!x||!x.documentElement){x=C.createDocument(Ve,"template",null);try{x.documentElement.innerHTML=Mn?E:D}catch{}}const q=x.body||x.documentElement;return f&&S&&q.insertBefore(n.createTextNode(S),q.childNodes[0]||null),Ve===fe?$n.call(x,Te?"html":"body")[0]:Te?x.documentElement:q},_i=function(f){return pe.call(f.ownerDocument||f,f,p.SHOW_ELEMENT|p.SHOW_COMMENT|p.SHOW_TEXT|p.SHOW_PROCESSING_INSTRUCTION|p.SHOW_CDATA_SECTION,null)},Pn=function(f){return f instanceof u&&(typeof f.nodeName!="string"||typeof f.textContent!="string"||typeof f.removeChild!="function"||!(f.attributes instanceof d)||typeof f.removeAttribute!="function"||typeof f.setAttribute!="function"||typeof f.namespaceURI!="string"||typeof f.insertBefore!="function"||typeof f.hasChildNodes!="function")},Ti=function(f){return typeof l=="function"&&f instanceof l};function he(T,f,x){Kt(T,S=>{S.call(t,f,x,We)})}const Ei=function(f){let x=null;if(he(G.beforeSanitizeElements,f,null),Pn(f))return le(f),!0;const S=U(f.nodeName);if(he(G.uponSanitizeElement,f,{tagName:S,allowedTags:K}),It&&f.hasChildNodes()&&!Ti(f.firstElementChild)&&Q(/<[/\w!]/g,f.innerHTML)&&Q(/<[/\w!]/g,f.textContent)||f.nodeType===ft.progressingInstruction||It&&f.nodeType===ft.comment&&Q(/<[/\w]/g,f.data))return le(f),!0;if(!(He.tagCheck instanceof Function&&He.tagCheck(S))&&(!K[S]||it[S])){if(!it[S]&&Ii(S)&&(B.tagNameCheck instanceof RegExp&&Q(B.tagNameCheck,S)||B.tagNameCheck instanceof Function&&B.tagNameCheck(S)))return!1;if(En&&!oe[S]){const D=P(f)||f.parentNode,q=M(f)||f.childNodes;if(q&&D){const F=q.length;for(let J=F-1;J>=0;--J){const ge=w(q[J],!0);ge.__removalCount=(f.__removalCount||0)+1,D.insertBefore(ge,_(f))}}}return le(f),!0}return f instanceof c&&!Po(f)||(S==="noscript"||S==="noembed"||S==="noframes")&&Q(/<\/no(script|embed|frames)/i,f.innerHTML)?(le(f),!0):(ze&&f.nodeType===ft.text&&(x=f.textContent,Kt([wn,xn,An],D=>{x=dt(x,D," ")}),f.textContent!==x&&(ct(t.removed,{element:f.cloneNode()}),f.textContent=x)),he(G.afterSanitizeElements,f,null),!1)},Ci=function(f,x,S){if(mi&&(x==="id"||x==="name")&&(S in n||S in Ro))return!1;if(!(Sn&&!kn[x]&&Q(ko,x))){if(!(hi&&Q(So,x))){if(!(He.attributeCheck instanceof Function&&He.attributeCheck(x,f))){if(!z[x]||kn[x]){if(!(Ii(f)&&(B.tagNameCheck instanceof RegExp&&Q(B.tagNameCheck,f)||B.tagNameCheck instanceof Function&&B.tagNameCheck(f))&&(B.attributeNameCheck instanceof RegExp&&Q(B.attributeNameCheck,x)||B.attributeNameCheck instanceof Function&&B.attributeNameCheck(x,f))||x==="is"&&B.allowCustomizedBuiltInElements&&(B.tagNameCheck instanceof RegExp&&Q(B.tagNameCheck,S)||B.tagNameCheck instanceof Function&&B.tagNameCheck(S))))return!1}else if(!In[x]){if(!Q(ui,dt(S,di,""))){if(!((x==="src"||x==="xlink:href"||x==="href")&&f!=="script"&&Pd(S,"data:")===0&&bi[f])){if(!(gi&&!Q(_o,dt(S,di,"")))){if(S)return!1}}}}}}}return!0},Ii=function(f){return f!=="annotation-xml"&&Wn(f,To)},Mi=function(f){he(G.beforeSanitizeAttributes,f,null);const{attributes:x}=f;if(!x||Pn(f))return;const S={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:z,forceKeepAttr:void 0};let D=x.length;for(;D--;){const q=x[D],{name:F,namespaceURI:J,value:ge}=q,Ge=U(F),Nn=ge;let j=F==="value"?Nn:Nd(Nn);if(S.attrName=Ge,S.attrValue=j,S.keepAttr=!0,S.forceKeepAttr=void 0,he(G.uponSanitizeAttribute,f,S),j=S.attrValue,yi&&(Ge==="id"||Ge==="name")&&(Ee(F,f),j=Eo+j),It&&Q(/((--!?|])>)|<\/(style|title|textarea)/i,j)){Ee(F,f);continue}if(Ge==="attributename"&&Wn(j,"href")){Ee(F,f);continue}if(S.forceKeepAttr)continue;if(!S.keepAttr){Ee(F,f);continue}if(!vi&&Q(/\/>/i,j)){Ee(F,f);continue}ze&&Kt([wn,xn,An],Ri=>{j=dt(j,Ri," ")});const Li=U(f.nodeName);if(!Ci(Li,Ge,j)){Ee(F,f);continue}if(I&&typeof g=="object"&&typeof g.getAttributeType=="function"&&!J)switch(g.getAttributeType(Li,Ge)){case"TrustedHTML":{j=I.createHTML(j);break}case"TrustedScriptURL":{j=I.createScriptURL(j);break}}if(j!==Nn)try{J?f.setAttributeNS(J,F,j):f.setAttribute(F,j),Pn(f)?le(f):la(t.removed)}catch{Ee(F,f)}}he(G.afterSanitizeAttributes,f,null)},No=function T(f){let x=null;const S=_i(f);for(he(G.beforeSanitizeShadowDOM,f,null);x=S.nextNode();)he(G.uponSanitizeShadowNode,x,null),Ei(x),Mi(x),x.content instanceof a&&T(x.content);he(G.afterSanitizeShadowDOM,f,null)};return t.sanitize=function(T){let f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},x=null,S=null,D=null,q=null;if(Mn=!T,Mn&&(T="<!-->"),typeof T!="string"&&!Ti(T))if(typeof T.toString=="function"){if(T=T.toString(),typeof T!="string")throw ut("dirty is not a string, aborting")}else throw ut("toString is not a function");if(!t.isSupported)return T;if(_n||Rn(f),t.removed=[],typeof T=="string"&&(at=!1),at){if(T.nodeName){const ge=U(T.nodeName);if(!K[ge]||it[ge])throw ut("root node is forbidden and cannot be sanitized in-place")}}else if(T instanceof l)x=Si("<!---->"),S=x.ownerDocument.importNode(T,!0),S.nodeType===ft.element&&S.nodeName==="BODY"||S.nodeName==="HTML"?x=S:x.appendChild(S);else{if(!je&&!ze&&!Te&&T.indexOf("<")===-1)return I&&Lt?I.createHTML(T):T;if(x=Si(T),!x)return je?null:Lt?E:""}x&&Tn&&le(x.firstChild);const F=_i(at?T:x);for(;D=F.nextNode();)Ei(D),Mi(D),D.content instanceof a&&No(D.content);if(at)return T;if(je){if(Mt)for(q=bn.call(x.ownerDocument);x.firstChild;)q.appendChild(x.firstChild);else q=x;return(z.shadowroot||z.shadowrootmode)&&(q=Ao.call(s,q,!0)),q}let J=Te?x.outerHTML:x.innerHTML;return Te&&K["!doctype"]&&x.ownerDocument&&x.ownerDocument.doctype&&x.ownerDocument.doctype.name&&Q(Vr,x.ownerDocument.doctype.name)&&(J="<!DOCTYPE "+x.ownerDocument.doctype.name+`>
17
+ `+J),ze&&Kt([wn,xn,An],ge=>{J=dt(J,ge," ")}),I&&Lt?I.createHTML(J):J},t.setConfig=function(){let T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Rn(T),_n=!0},t.clearConfig=function(){We=null,_n=!1},t.isValidAttribute=function(T,f,x){We||Rn({});const S=U(T),D=U(f);return Ci(S,D,x)},t.addHook=function(T,f){typeof f=="function"&&ct(G[T],f)},t.removeHook=function(T,f){if(f!==void 0){const x=Ld(G[T],f);return x===-1?void 0:Rd(G[T],x,1)[0]}return la(G[T])},t.removeHooks=function(T){G[T]=[]},t.removeAllHooks=function(){G=ha()},t}var bs=Wr();function Js(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Ke=Js();function Gr(e){Ke=e}var bt={exec:()=>null};function R(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(i,a)=>{let r=typeof a=="string"?a:a.source;return r=r.replace(Y.caret,"$1"),n=n.replace(i,r),s},getRegex:()=>new RegExp(n,t)};return s}var Yd=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),Y={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},Zd=/^(?:[ \t]*(?:\n|$))+/,Xd=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Jd=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Ct=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,eu=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ei=/(?:[*+-]|\d{1,9}[.)])/,Qr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Yr=R(Qr).replace(/bull/g,ei).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(),tu=R(Qr).replace(/bull/g,ei).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(),ti=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,nu=/^[^\n]+/,ni=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,su=R(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",ni).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),iu=R(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ei).getRegex(),gn="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",si=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,au=R("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",si).replace("tag",gn).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Zr=R(ti).replace("hr",Ct).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",gn).getRegex(),ru=R(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Zr).getRegex(),ii={blockquote:ru,code:Xd,def:su,fences:Jd,heading:eu,hr:Ct,html:au,lheading:Yr,list:iu,newline:Zd,paragraph:Zr,table:bt,text:nu},ga=R("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Ct).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",gn).getRegex(),ou={...ii,lheading:tu,table:ga,paragraph:R(ti).replace("hr",Ct).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ga).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",gn).getRegex()},lu={...ii,html:R(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",si).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:bt,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:R(ti).replace("hr",Ct).replace("heading",` *#{1,6} *[^
18
+ ]`).replace("lheading",Yr).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},cu=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,du=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Xr=/^( {2,}|\\)\n(?!\s*$)/,uu=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,vn=/[\p{P}\p{S}]/u,ai=/[\s\p{P}\p{S}]/u,Jr=/[^\s\p{P}\p{S}]/u,pu=R(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,ai).getRegex(),eo=/(?!~)[\p{P}\p{S}]/u,fu=/(?!~)[\s\p{P}\p{S}]/u,hu=/(?:[^\s\p{P}\p{S}]|~)/u,gu=R(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Yd?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),to=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,vu=R(to,"u").replace(/punct/g,vn).getRegex(),mu=R(to,"u").replace(/punct/g,eo).getRegex(),no="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",yu=R(no,"gu").replace(/notPunctSpace/g,Jr).replace(/punctSpace/g,ai).replace(/punct/g,vn).getRegex(),bu=R(no,"gu").replace(/notPunctSpace/g,hu).replace(/punctSpace/g,fu).replace(/punct/g,eo).getRegex(),$u=R("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Jr).replace(/punctSpace/g,ai).replace(/punct/g,vn).getRegex(),wu=R(/\\(punct)/,"gu").replace(/punct/g,vn).getRegex(),xu=R(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Au=R(si).replace("(?:-->|$)","-->").getRegex(),ku=R("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Au).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Jt=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Su=R(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Jt).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),so=R(/^!?\[(label)\]\[(ref)\]/).replace("label",Jt).replace("ref",ni).getRegex(),io=R(/^!?\[(ref)\](?:\[\])?/).replace("ref",ni).getRegex(),_u=R("reflink|nolink(?!\\()","g").replace("reflink",so).replace("nolink",io).getRegex(),va=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ri={_backpedal:bt,anyPunctuation:wu,autolink:xu,blockSkip:gu,br:Xr,code:du,del:bt,emStrongLDelim:vu,emStrongRDelimAst:yu,emStrongRDelimUnd:$u,escape:cu,link:Su,nolink:io,punctuation:pu,reflink:so,reflinkSearch:_u,tag:ku,text:uu,url:bt},Tu={...ri,link:R(/^!?\[(label)\]\((.*?)\)/).replace("label",Jt).getRegex(),reflink:R(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Jt).getRegex()},$s={...ri,emStrongRDelimAst:bu,emStrongLDelim:mu,url:R(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",va).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:R(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",va).getRegex()},Eu={...$s,br:R(Xr).replace("{2,}","*").getRegex(),text:R($s.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},zt={normal:ii,gfm:ou,pedantic:lu},ht={normal:ri,gfm:$s,breaks:Eu,pedantic:Tu},Cu={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ma=e=>Cu[e];function me(e,t){if(t){if(Y.escapeTest.test(e))return e.replace(Y.escapeReplace,ma)}else if(Y.escapeTestNoEncode.test(e))return e.replace(Y.escapeReplaceNoEncode,ma);return e}function ya(e){try{e=encodeURI(e).replace(Y.percentDecode,"%")}catch{return null}return e}function ba(e,t){let n=e.replace(Y.findPipe,(a,r,l)=>{let c=!1,p=r;for(;--p>=0&&l[p]==="\\";)c=!c;return c?"|":" |"}),s=n.split(Y.splitPipe),i=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;i<s.length;i++)s[i]=s[i].trim().replace(Y.slashPipe,"|");return s}function gt(e,t,n){let s=e.length;if(s===0)return"";let i=0;for(;i<s&&e.charAt(s-i-1)===t;)i++;return e.slice(0,s-i)}function Iu(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])n++;else if(e[s]===t[1]&&(n--,n<0))return s;return n>0?-2:-1}function $a(e,t,n,s,i){let a=t.href,r=t.title||null,l=e[1].replace(i.other.outputLinkReplace,"$1");s.state.inLink=!0;let c={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:a,title:r,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,c}function Mu(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let i=s[1];return t.split(`
19
+ `).map(a=>{let r=a.match(n.other.beginningSpace);if(r===null)return a;let[l]=r;return l.length>=i.length?a.slice(i.length):a}).join(`
20
+ `)}var en=class{options;rules;lexer;constructor(e){this.options=e||Ke}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:gt(n,`
21
+ `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Mu(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=gt(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:gt(t[0],`
22
+ `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=gt(t[0],`
23
+ `).split(`
24
+ `),s="",i="",a=[];for(;n.length>0;){let r=!1,l=[],c;for(c=0;c<n.length;c++)if(this.rules.other.blockquoteStart.test(n[c]))l.push(n[c]),r=!0;else if(!r)l.push(n[c]);else break;n=n.slice(c);let p=l.join(`
25
+ `),d=p.replace(this.rules.other.blockquoteSetextReplace,`
26
+ $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
27
+ ${p}`:p,i=i?`${i}
28
+ ${d}`:d;let u=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(d,a,!0),this.lexer.state.top=u,n.length===0)break;let h=a.at(-1);if(h?.type==="code")break;if(h?.type==="blockquote"){let g=h,$=g.raw+`
29
+ `+n.join(`
30
+ `),w=this.blockquote($);a[a.length-1]=w,s=s.substring(0,s.length-g.raw.length)+w.raw,i=i.substring(0,i.length-g.text.length)+w.text;break}else if(h?.type==="list"){let g=h,$=g.raw+`
31
+ `+n.join(`
32
+ `),w=this.list($);a[a.length-1]=w,s=s.substring(0,s.length-h.raw.length)+w.raw,i=i.substring(0,i.length-g.raw.length)+w.raw,n=$.substring(a.at(-1).raw.length).split(`
33
+ `);continue}}return{type:"blockquote",raw:s,tokens:a,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,i={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let a=this.rules.other.listItemRegex(n),r=!1;for(;e;){let c=!1,p="",d="";if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let u=t[2].split(`
34
+ `,1)[0].replace(this.rules.other.listReplaceTabs,w=>" ".repeat(3*w.length)),h=e.split(`
35
+ `,1)[0],g=!u.trim(),$=0;if(this.options.pedantic?($=2,d=u.trimStart()):g?$=t[1].length+1:($=t[2].search(this.rules.other.nonSpaceChar),$=$>4?1:$,d=u.slice($),$+=t[1].length),g&&this.rules.other.blankLine.test(h)&&(p+=h+`
36
+ `,e=e.substring(h.length+1),c=!0),!c){let w=this.rules.other.nextBulletRegex($),A=this.rules.other.hrRegex($),_=this.rules.other.fencesBeginRegex($),M=this.rules.other.headingBeginRegex($),P=this.rules.other.htmlBeginRegex($);for(;e;){let I=e.split(`
37
+ `,1)[0],E;if(h=I,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting," "),E=h):E=h.replace(this.rules.other.tabCharGlobal," "),_.test(h)||M.test(h)||P.test(h)||w.test(h)||A.test(h))break;if(E.search(this.rules.other.nonSpaceChar)>=$||!h.trim())d+=`
38
+ `+E.slice($);else{if(g||u.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||_.test(u)||M.test(u)||A.test(u))break;d+=`
39
+ `+h}!g&&!h.trim()&&(g=!0),p+=I+`
40
+ `,e=e.substring(I.length+1),u=E.slice($)}}i.loose||(r?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(r=!0)),i.items.push({type:"list_item",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(d),loose:!1,text:d,tokens:[]}),i.raw+=p}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let c of i.items){if(this.lexer.state.top=!1,c.tokens=this.lexer.blockTokens(c.text,[]),c.task){if(c.text=c.text.replace(this.rules.other.listReplaceTask,""),c.tokens[0]?.type==="text"||c.tokens[0]?.type==="paragraph"){c.tokens[0].raw=c.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),c.tokens[0].text=c.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,"");break}}let p=this.rules.other.listTaskCheckbox.exec(c.raw);if(p){let d={type:"checkbox",raw:p[0]+" ",checked:p[0]!=="[ ]"};c.checked=d.checked,i.loose?c.tokens[0]&&["paragraph","text"].includes(c.tokens[0].type)&&"tokens"in c.tokens[0]&&c.tokens[0].tokens?(c.tokens[0].raw=d.raw+c.tokens[0].raw,c.tokens[0].text=d.raw+c.tokens[0].text,c.tokens[0].tokens.unshift(d)):c.tokens.unshift({type:"paragraph",raw:d.raw,text:d.raw,tokens:[d]}):c.tokens.unshift(d)}}if(!i.loose){let p=c.tokens.filter(u=>u.type==="space"),d=p.length>0&&p.some(u=>this.rules.other.anyLine.test(u.raw));i.loose=d}}if(i.loose)for(let c of i.items){c.loose=!0;for(let p of c.tokens)p.type==="text"&&(p.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:s,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=ba(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
41
+ `):[],a={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(let r of s)this.rules.other.tableAlignRight.test(r)?a.align.push("right"):this.rules.other.tableAlignCenter.test(r)?a.align.push("center"):this.rules.other.tableAlignLeft.test(r)?a.align.push("left"):a.align.push(null);for(let r=0;r<n.length;r++)a.header.push({text:n[r],tokens:this.lexer.inline(n[r]),header:!0,align:a.align[r]});for(let r of i)a.rows.push(ba(r,a.header.length).map((l,c)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:a.align[c]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
42
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let a=gt(n.slice(0,-1),"\\");if((n.length-a.length)%2===0)return}else{let a=Iu(t[2],"()");if(a===-2)return;if(a>-1){let r=(t[0].indexOf("!")===0?5:4)+t[1].length+a;t[2]=t[2].substring(0,a),t[0]=t[0].substring(0,r).trim(),t[3]=""}}let s=t[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(s);a&&(s=a[1],i=a[3])}else i=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),$a(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[s.toLowerCase()];if(!i){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return $a(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let i=[...s[0]].length-1,a,r,l=i,c=0,p=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(p.lastIndex=0,t=t.slice(-1*e.length+i);(s=p.exec(t))!=null;){if(a=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!a)continue;if(r=[...a].length,s[3]||s[4]){l+=r;continue}else if((s[5]||s[6])&&i%3&&!((i+r)%3)){c+=r;continue}if(l-=r,l>0)continue;r=Math.min(r,r+l+c);let d=[...s[0]][0].length,u=e.slice(0,i+s.index+d+r);if(Math.min(i,r)%2){let g=u.slice(1,-1);return{type:"em",raw:u,text:g,tokens:this.lexer.inlineTokens(g)}}let h=u.slice(2,-2);return{type:"strong",raw:u,text:h,tokens:this.lexer.inlineTokens(h)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},ie=class ws{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Ke,this.options.tokenizer=this.options.tokenizer||new en,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:Y,block:zt.normal,inline:ht.normal};this.options.pedantic?(n.block=zt.pedantic,n.inline=ht.pedantic):this.options.gfm&&(n.block=zt.gfm,this.options.breaks?n.inline=ht.breaks:n.inline=ht.gfm),this.tokenizer.rules=n}static get rules(){return{block:zt,inline:ht}}static lex(t,n){return new ws(n).lex(t)}static lexInline(t,n){return new ws(n).inlineTokens(t)}lex(t){t=t.replace(Y.carriageReturn,`
43
+ `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],s=!1){for(this.options.pedantic&&(t=t.replace(Y.tabCharGlobal," ").replace(Y.spaceLine,""));t;){let i;if(this.options.extensions?.block?.some(r=>(i=r.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let r=n.at(-1);i.raw.length===1&&r!==void 0?r.raw+=`
44
+ `:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=(r.raw.endsWith(`
45
+ `)?"":`
46
+ `)+i.raw,r.text+=`
47
+ `+i.text,this.inlineQueue.at(-1).src=r.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=(r.raw.endsWith(`
48
+ `)?"":`
49
+ `)+i.raw,r.text+=`
50
+ `+i.raw,this.inlineQueue.at(-1).src=r.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let a=t;if(this.options.extensions?.startBlock){let r=1/0,l=t.slice(1),c;this.options.extensions.startBlock.forEach(p=>{c=p.call({lexer:this},l),typeof c=="number"&&c>=0&&(r=Math.min(r,c))}),r<1/0&&r>=0&&(a=t.substring(0,r+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let r=n.at(-1);s&&r?.type==="paragraph"?(r.raw+=(r.raw.endsWith(`
51
+ `)?"":`
52
+ `)+i.raw,r.text+=`
53
+ `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):n.push(i),s=a.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="text"?(r.raw+=(r.raw.endsWith(`
54
+ `)?"":`
55
+ `)+i.raw,r.text+=`
56
+ `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):n.push(i);continue}if(t){let r="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(r);break}else throw new Error(r)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let s=t,i=null;if(this.tokens.links){let c=Object.keys(this.tokens.links);if(c.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)c.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,i.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let a;for(;(i=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)a=i[2]?i[2].length:0,s=s.slice(0,i.index+a)+"["+"a".repeat(i[0].length-a-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let r=!1,l="";for(;t;){r||(l=""),r=!1;let c;if(this.options.extensions?.inline?.some(d=>(c=d.call({lexer:this},t,n))?(t=t.substring(c.raw.length),n.push(c),!0):!1))continue;if(c=this.tokenizer.escape(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.tag(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.link(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(c.raw.length);let d=n.at(-1);c.type==="text"&&d?.type==="text"?(d.raw+=c.raw,d.text+=c.text):n.push(c);continue}if(c=this.tokenizer.emStrong(t,s,l)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.codespan(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.br(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.del(t)){t=t.substring(c.raw.length),n.push(c);continue}if(c=this.tokenizer.autolink(t)){t=t.substring(c.raw.length),n.push(c);continue}if(!this.state.inLink&&(c=this.tokenizer.url(t))){t=t.substring(c.raw.length),n.push(c);continue}let p=t;if(this.options.extensions?.startInline){let d=1/0,u=t.slice(1),h;this.options.extensions.startInline.forEach(g=>{h=g.call({lexer:this},u),typeof h=="number"&&h>=0&&(d=Math.min(d,h))}),d<1/0&&d>=0&&(p=t.substring(0,d+1))}if(c=this.tokenizer.inlineText(p)){t=t.substring(c.raw.length),c.raw.slice(-1)!=="_"&&(l=c.raw.slice(-1)),r=!0;let d=n.at(-1);d?.type==="text"?(d.raw+=c.raw,d.text+=c.text):n.push(c);continue}if(t){let d="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(d);break}else throw new Error(d)}}return n}},tn=class{options;parser;constructor(e){this.options=e||Ke}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(Y.notSpaceStart)?.[0],i=e.replace(Y.endingNewline,"")+`
57
+ `;return s?'<pre><code class="language-'+me(s)+'">'+(n?i:me(i,!0))+`</code></pre>
58
+ `:"<pre><code>"+(n?i:me(i,!0))+`</code></pre>
59
+ `}blockquote({tokens:e}){return`<blockquote>
60
+ ${this.parser.parse(e)}</blockquote>
61
+ `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
62
+ `}hr(e){return`<hr>
63
+ `}list(e){let t=e.ordered,n=e.start,s="";for(let r=0;r<e.items.length;r++){let l=e.items[r];s+=this.listitem(l)}let i=t?"ol":"ul",a=t&&n!==1?' start="'+n+'"':"";return"<"+i+a+`>
64
+ `+s+"</"+i+`>
65
+ `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
66
+ `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
67
+ `}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let s="";for(let i=0;i<e.rows.length;i++){let a=e.rows[i];n="";for(let r=0;r<a.length;r++)n+=this.tablecell(a[r]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
68
+ <thead>
69
+ `+t+`</thead>
70
+ `+s+`</table>
71
+ `}tablerow({text:e}){return`<tr>
72
+ ${e}</tr>
73
+ `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
74
+ `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${me(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),i=ya(e);if(i===null)return s;e=i;let a='<a href="'+e+'"';return t&&(a+=' title="'+me(t)+'"'),a+=">"+s+"</a>",a}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let i=ya(e);if(i===null)return me(n);e=i;let a=`<img src="${e}" alt="${n}"`;return t&&(a+=` title="${me(t)}"`),a+=">",a}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:me(e.text)}},oi=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},ae=class xs{options;renderer;textRenderer;constructor(t){this.options=t||Ke,this.options.renderer=this.options.renderer||new tn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new oi}static parse(t,n){return new xs(n).parse(t)}static parseInline(t,n){return new xs(n).parseInline(t)}parse(t){let n="";for(let s=0;s<t.length;s++){let i=t[s];if(this.options.extensions?.renderers?.[i.type]){let r=i,l=this.options.extensions.renderers[r.type].call({parser:this},r);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(r.type)){n+=l||"";continue}}let a=i;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let r='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return n}parseInline(t,n=this.renderer){let s="";for(let i=0;i<t.length;i++){let a=t[i];if(this.options.extensions?.renderers?.[a.type]){let l=this.options.extensions.renderers[a.type].call({parser:this},a);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(a.type)){s+=l||"";continue}}let r=a;switch(r.type){case"escape":{s+=n.text(r);break}case"html":{s+=n.html(r);break}case"link":{s+=n.link(r);break}case"image":{s+=n.image(r);break}case"checkbox":{s+=n.checkbox(r);break}case"strong":{s+=n.strong(r);break}case"em":{s+=n.em(r);break}case"codespan":{s+=n.codespan(r);break}case"br":{s+=n.br(r);break}case"del":{s+=n.del(r);break}case"text":{s+=n.text(r);break}default:{let l='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},vt=class{options;block;constructor(e){this.options=e||Ke}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?ie.lex:ie.lexInline}provideParser(){return this.block?ae.parse:ae.parseInline}},Lu=class{defaults=Js();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=ae;Renderer=tn;TextRenderer=oi;Lexer=ie;Tokenizer=en;Hooks=vt;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case"table":{let i=s;for(let a of i.header)n=n.concat(this.walkTokens(a.tokens,t));for(let a of i.rows)for(let r of a)n=n.concat(this.walkTokens(r.tokens,t));break}case"list":{let i=s;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=s;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(a=>{let r=i[a].flat(1/0);n=n.concat(this.walkTokens(r,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=t.renderers[i.name];a?t.renderers[i.name]=function(...r){let l=i.renderer.apply(this,r);return l===!1&&(l=a.apply(this,r)),l}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=t[i.level];a?a.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),s.extensions=t),n.renderer){let i=this.defaults.renderer||new tn(this.defaults);for(let a in n.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let r=a,l=n.renderer[r],c=i[r];i[r]=(...p)=>{let d=l.apply(i,p);return d===!1&&(d=c.apply(i,p)),d||""}}s.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new en(this.defaults);for(let a in n.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let r=a,l=n.tokenizer[r],c=i[r];i[r]=(...p)=>{let d=l.apply(i,p);return d===!1&&(d=c.apply(i,p)),d}}s.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new vt;for(let a in n.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let r=a,l=n.hooks[r],c=i[r];vt.passThroughHooks.has(a)?i[r]=p=>{if(this.defaults.async&&vt.passThroughHooksRespectAsync.has(a))return(async()=>{let u=await l.call(i,p);return c.call(i,u)})();let d=l.call(i,p);return c.call(i,d)}:i[r]=(...p)=>{if(this.defaults.async)return(async()=>{let u=await l.apply(i,p);return u===!1&&(u=await c.apply(i,p)),u})();let d=l.apply(i,p);return d===!1&&(d=c.apply(i,p)),d}}s.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,a=n.walkTokens;s.walkTokens=function(r){let l=[];return l.push(a.call(this,r)),i&&(l=l.concat(i.call(this,r))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ie.lex(e,t??this.defaults)}parser(e,t){return ae.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},i={...this.defaults,...s},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&s.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let r=i.hooks?await i.hooks.preprocess(t):t,l=await(i.hooks?await i.hooks.provideLexer():e?ie.lex:ie.lexInline)(r,i),c=i.hooks?await i.hooks.processAllTokens(l):l;i.walkTokens&&await Promise.all(this.walkTokens(c,i.walkTokens));let p=await(i.hooks?await i.hooks.provideParser():e?ae.parse:ae.parseInline)(c,i);return i.hooks?await i.hooks.postprocess(p):p})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let r=(i.hooks?i.hooks.provideLexer():e?ie.lex:ie.lexInline)(t,i);i.hooks&&(r=i.hooks.processAllTokens(r)),i.walkTokens&&this.walkTokens(r,i.walkTokens);let l=(i.hooks?i.hooks.provideParser():e?ae.parse:ae.parseInline)(r,i);return i.hooks&&(l=i.hooks.postprocess(l)),l}catch(r){return a(r)}}}onError(e,t){return n=>{if(n.message+=`
75
+ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+me(n.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Ue=new Lu;function N(e,t){return Ue.parse(e,t)}N.options=N.setOptions=function(e){return Ue.setOptions(e),N.defaults=Ue.defaults,Gr(N.defaults),N};N.getDefaults=Js;N.defaults=Ke;N.use=function(...e){return Ue.use(...e),N.defaults=Ue.defaults,Gr(N.defaults),N};N.walkTokens=function(e,t){return Ue.walkTokens(e,t)};N.parseInline=Ue.parseInline;N.Parser=ae;N.parser=ae.parse;N.Renderer=tn;N.TextRenderer=oi;N.Lexer=ie;N.lexer=ie.lex;N.Tokenizer=en;N.Hooks=vt;N.parse=N;N.options;N.setOptions;N.use;N.walkTokens;N.parseInline;ae.parse;ie.lex;N.setOptions({gfm:!0,breaks:!0,mangle:!1});const wa=["a","b","blockquote","br","code","del","em","h1","h2","h3","h4","hr","i","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],xa=["class","href","rel","target","title","start"];let Aa=!1;const Ru=14e4,Pu=4e4,Nu=200,Xn=5e4,Pe=new Map;function Ou(e){const t=Pe.get(e);return t===void 0?null:(Pe.delete(e),Pe.set(e,t),t)}function ka(e,t){if(Pe.set(e,t),Pe.size<=Nu)return;const n=Pe.keys().next().value;n&&Pe.delete(n)}function Du(){Aa||(Aa=!0,bs.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function As(e){const t=e.trim();if(!t)return"";if(Du(),t.length<=Xn){const r=Ou(t);if(r!==null)return r}const n=ar(t,Ru),s=n.truncated?`
76
+
77
+ … truncated (${n.total} chars, showing first ${n.text.length}).`:"";if(n.text.length>Pu){const l=`<pre class="code-block">${Bu(`${n.text}${s}`)}</pre>`,c=bs.sanitize(l,{ALLOWED_TAGS:wa,ALLOWED_ATTR:xa});return t.length<=Xn&&ka(t,c),c}const i=N.parse(`${n.text}${s}`),a=bs.sanitize(i,{ALLOWED_TAGS:wa,ALLOWED_ATTR:xa});return t.length<=Xn&&ka(t,a),a}function Bu(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Fu=1500,Uu=2e3,ao="Copy as markdown",Ku="Copied",Hu="Copy failed";async function zu(e){if(!e)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{return!1}}function jt(e,t){e.title=t,e.setAttribute("aria-label",t)}function ju(e){const t=e.label??ao;return o`
78
+ <button
79
+ class="chat-copy-btn"
80
+ type="button"
81
+ title=${t}
82
+ aria-label=${t}
83
+ @click=${async n=>{const s=n.currentTarget;if(s?.querySelector(".chat-copy-btn__icon"),!s||s.dataset.copying==="1")return;s.dataset.copying="1",s.setAttribute("aria-busy","true"),s.disabled=!0;const i=await zu(e.text());if(s.isConnected){if(delete s.dataset.copying,s.removeAttribute("aria-busy"),s.disabled=!1,!i){s.dataset.error="1",jt(s,Hu),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.error,jt(s,t))},Uu);return}s.dataset.copied="1",jt(s,Ku),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.copied,jt(s,t))},Fu)}}}
84
+ >
85
+ <span class="chat-copy-btn__icon" aria-hidden="true">
86
+ <span class="chat-copy-btn__icon-copy">${W.copy}</span>
87
+ <span class="chat-copy-btn__icon-check">${W.check}</span>
88
+ </span>
89
+ </button>
90
+ `}function qu(e){return ju({text:()=>e,label:ao})}const Vu={icon:"puzzle",detailKeys:["command","path","url","targetUrl","targetId","ref","element","node","nodeId","id","requestId","to","channelId","guildId","userId","name","query","pattern","messageId"]},Wu={bash:{icon:"wrench",title:"Bash",detailKeys:["command"]},process:{icon:"wrench",title:"Process",detailKeys:["sessionId"]},read:{icon:"fileText",title:"Read",detailKeys:["path"]},write:{icon:"edit",title:"Write",detailKeys:["path"]},edit:{icon:"penLine",title:"Edit",detailKeys:["path"]},attach:{icon:"paperclip",title:"Attach",detailKeys:["path","url","fileName"]},browser:{icon:"globe",title:"Browser",actions:{status:{label:"status"},start:{label:"start"},stop:{label:"stop"},tabs:{label:"tabs"},open:{label:"open",detailKeys:["targetUrl"]},focus:{label:"focus",detailKeys:["targetId"]},close:{label:"close",detailKeys:["targetId"]},snapshot:{label:"snapshot",detailKeys:["targetUrl","targetId","ref","element","format"]},screenshot:{label:"screenshot",detailKeys:["targetUrl","targetId","ref","element"]},navigate:{label:"navigate",detailKeys:["targetUrl","targetId"]},console:{label:"console",detailKeys:["level","targetId"]},pdf:{label:"pdf",detailKeys:["targetId"]},upload:{label:"upload",detailKeys:["paths","ref","inputRef","element","targetId"]},dialog:{label:"dialog",detailKeys:["accept","promptText","targetId"]},act:{label:"act",detailKeys:["request.kind","request.ref","request.selector","request.text","request.value"]}}},canvas:{icon:"image",title:"Canvas",actions:{present:{label:"present",detailKeys:["target","node","nodeId"]},hide:{label:"hide",detailKeys:["node","nodeId"]},navigate:{label:"navigate",detailKeys:["url","node","nodeId"]},eval:{label:"eval",detailKeys:["javaScript","node","nodeId"]},snapshot:{label:"snapshot",detailKeys:["format","node","nodeId"]},a2ui_push:{label:"A2UI push",detailKeys:["jsonlPath","node","nodeId"]},a2ui_reset:{label:"A2UI reset",detailKeys:["node","nodeId"]}}},nodes:{icon:"smartphone",title:"Nodes",actions:{status:{label:"status"},describe:{label:"describe",detailKeys:["node","nodeId"]},pending:{label:"pending"},approve:{label:"approve",detailKeys:["requestId"]},reject:{label:"reject",detailKeys:["requestId"]},notify:{label:"notify",detailKeys:["node","nodeId","title","body"]},camera_snap:{label:"camera snap",detailKeys:["node","nodeId","facing","deviceId"]},camera_list:{label:"camera list",detailKeys:["node","nodeId"]},camera_clip:{label:"camera clip",detailKeys:["node","nodeId","facing","duration","durationMs"]},screen_record:{label:"screen record",detailKeys:["node","nodeId","duration","durationMs","fps","screenIndex"]}}},cron:{icon:"loader",title:"Cron",actions:{status:{label:"status"},list:{label:"list"},add:{label:"add",detailKeys:["job.name","job.id","job.schedule","job.cron"]},update:{label:"update",detailKeys:["id"]},remove:{label:"remove",detailKeys:["id"]},run:{label:"run",detailKeys:["id"]},runs:{label:"runs",detailKeys:["id"]},wake:{label:"wake",detailKeys:["text","mode"]}}},gateway:{icon:"plug",title:"Gateway",actions:{restart:{label:"restart",detailKeys:["reason","delayMs"]},"config.get":{label:"config get"},"config.schema":{label:"config schema"},"config.apply":{label:"config apply",detailKeys:["restartDelayMs"]},"update.run":{label:"update run",detailKeys:["restartDelayMs"]}}},whatsapp_login:{icon:"circle",title:"WhatsApp Login",actions:{start:{label:"start"},wait:{label:"wait"}}},discord:{icon:"messageSquare",title:"Discord",actions:{react:{label:"反应",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"反应列表",detailKeys:["channelId","messageId"]},sticker:{label:"贴纸",detailKeys:["to","stickerIds"]},poll:{label:"投票",detailKeys:["question","to"]},permissions:{label:"权限",detailKeys:["channelId"]},readMessages:{label:"读取消息",detailKeys:["channelId","limit"]},sendMessage:{label:"发送",detailKeys:["to","content"]},editMessage:{label:"编辑",detailKeys:["channelId","messageId"]},deleteMessage:{label:"删除",detailKeys:["channelId","messageId"]},threadCreate:{label:"创建话题",detailKeys:["channelId","name"]},threadList:{label:"话题列表",detailKeys:["guildId","channelId"]},threadReply:{label:"话题回复",detailKeys:["channelId","content"]},pinMessage:{label:"置顶",detailKeys:["channelId","messageId"]},unpinMessage:{label:"取消置顶",detailKeys:["channelId","messageId"]},listPins:{label:"置顶列表",detailKeys:["channelId"]},searchMessages:{label:"搜索",detailKeys:["guildId","content"]},memberInfo:{label:"成员",detailKeys:["guildId","userId"]},roleInfo:{label:"角色",detailKeys:["guildId"]},emojiList:{label:"表情列表",detailKeys:["guildId"]},roleAdd:{label:"添加角色",detailKeys:["guildId","userId","roleId"]},roleRemove:{label:"移除角色",detailKeys:["guildId","userId","roleId"]},channelInfo:{label:"频道",detailKeys:["channelId"]},channelList:{label:"频道列表",detailKeys:["guildId"]},voiceStatus:{label:"语音",detailKeys:["guildId","userId"]},eventList:{label:"事件",detailKeys:["guildId"]},eventCreate:{label:"创建事件",detailKeys:["guildId","name"]},timeout:{label:"超时",detailKeys:["guildId","userId"]},kick:{label:"踢出",detailKeys:["guildId","userId"]},ban:{label:"封禁",detailKeys:["guildId","userId"]}}},slack:{icon:"messageSquare",title:"Slack",actions:{react:{label:"反应",detailKeys:["channelId","messageId","emoji"]},reactions:{label:"反应列表",detailKeys:["channelId","messageId"]},sendMessage:{label:"发送",detailKeys:["to","content"]},editMessage:{label:"编辑",detailKeys:["channelId","messageId"]},deleteMessage:{label:"删除",detailKeys:["channelId","messageId"]},readMessages:{label:"读取消息",detailKeys:["channelId","limit"]},pinMessage:{label:"置顶",detailKeys:["channelId","messageId"]},unpinMessage:{label:"取消置顶",detailKeys:["channelId","messageId"]},listPins:{label:"置顶列表",detailKeys:["channelId"]},memberInfo:{label:"成员",detailKeys:["userId"]},emojiList:{label:"表情列表"}}}},Gu={fallback:Vu,tools:Wu},ro=Gu,Sa=ro.fallback??{icon:"puzzle"},Qu=ro.tools??{};function Yu(e){return(e??"tool").trim()}function Zu(e){const t=e.replace(/_/g," ").trim();return t?t.split(/\s+/).map(n=>n.length<=2&&n.toUpperCase()===n?n:`${n.at(0)?.toUpperCase()??""}${n.slice(1)}`).join(" "):"Tool"}function Xu(e){const t=e?.trim();if(t)return t.replace(/_/g," ")}function oo(e){if(e!=null){if(typeof e=="string"){const t=e.trim();if(!t)return;const n=t.split(/\r?\n/)[0]?.trim()??"";return n?n.length>160?`${n.slice(0,157)}…`:n:void 0}if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e)){const t=e.map(s=>oo(s)).filter(s=>!!s);if(t.length===0)return;const n=t.slice(0,3).join(", ");return t.length>3?`${n}…`:n}}}function Ju(e,t){if(!e||typeof e!="object")return;let n=e;for(const s of t.split(".")){if(!s||!n||typeof n!="object")return;n=n[s]}return n}function ep(e,t){for(const n of t){const s=Ju(e,n),i=oo(s);if(i)return i}}function tp(e){if(!e||typeof e!="object")return;const t=e,n=typeof t.path=="string"?t.path:void 0;if(!n)return;const s=typeof t.offset=="number"?t.offset:void 0,i=typeof t.limit=="number"?t.limit:void 0;return s!==void 0&&i!==void 0?`${n}:${s}-${s+i}`:n}function np(e){if(!e||typeof e!="object")return;const t=e;return typeof t.path=="string"?t.path:void 0}function sp(e,t){if(!(!e||!t))return e.actions?.[t]??void 0}function ip(e){const t=Yu(e.name),n=t.toLowerCase(),s=Qu[n],i=s?.icon??Sa.icon??"puzzle",a=s?.title??Zu(t),r=s?.label??t,l=e.args&&typeof e.args=="object"?e.args.action:void 0,c=typeof l=="string"?l.trim():void 0,p=sp(s,c),d=Xu(p?.label??c);let u;n==="read"&&(u=tp(e.args)),!u&&(n==="write"||n==="edit"||n==="attach")&&(u=np(e.args));const h=p?.detailKeys??s?.detailKeys??Sa.detailKeys??[];return!u&&h.length>0&&(u=ep(e.args,h)),!u&&e.meta&&(u=e.meta),u&&(u=rp(u)),{name:t,icon:i,title:a,label:r,verb:d,detail:u}}function ap(e){const t=[];if(e.verb&&t.push(e.verb),e.detail&&t.push(e.detail),t.length!==0)return t.join(" · ")}function rp(e){return e&&e.replace(/\/Users\/[^/]+/g,"~").replace(/\/home\/[^/]+/g,"~")}const op=80,lp=2,_a=100;function cp(e){const t=e.trim();if(t.startsWith("{")||t.startsWith("["))try{const n=JSON.parse(t);return"```json\n"+JSON.stringify(n,null,2)+"\n```"}catch{}return e}function dp(e){const t=e.split(`
91
+ `),n=t.slice(0,lp),s=n.join(`
92
+ `);return s.length>_a?s.slice(0,_a)+"…":n.length<t.length?s+"…":s}function up(e){const t=e,n=pp(t.content),s=[];for(const i of n){const a=String(i.type??"").toLowerCase();(["toolcall","tool_call","tooluse","tool_use"].includes(a)||typeof i.name=="string"&&i.arguments!=null)&&s.push({kind:"call",name:i.name??"tool",args:fp(i.arguments??i.args)})}for(const i of n){const a=String(i.type??"").toLowerCase();if(a!=="toolresult"&&a!=="tool_result")continue;const r=hp(i),l=typeof i.name=="string"?i.name:"tool";s.push({kind:"result",name:l,text:r})}if(zr(e)&&!s.some(i=>i.kind==="result")){const i=typeof t.toolName=="string"&&t.toolName||typeof t.tool_name=="string"&&t.tool_name||"tool",a=rr(e)??void 0;s.push({kind:"result",name:i,text:a})}return s}function Ta(e,t){const n=ip({name:e.name,args:e.args}),s=ap(n),i=!!e.text?.trim(),a=!!t,r=a?()=>{if(i){t(cp(e.text));return}const u=`## ${n.label}
93
+
94
+ ${s?`**Command:** \`${s}\`
95
+
96
+ `:""}*No output — tool completed successfully.*`;t(u)}:void 0,l=i&&(e.text?.length??0)<=op,c=i&&!l,p=i&&l,d=!i;return o`
97
+ <div
98
+ class="chat-tool-card ${a?"chat-tool-card--clickable":""}"
99
+ @click=${r}
100
+ role=${a?"button":v}
101
+ tabindex=${a?"0":v}
102
+ @keydown=${a?u=>{u.key!=="Enter"&&u.key!==" "||(u.preventDefault(),r?.())}:v}
103
+ >
104
+ <div class="chat-tool-card__header">
105
+ <div class="chat-tool-card__title">
106
+ <span class="chat-tool-card__icon">${W[n.icon]}</span>
107
+ <span>${n.label}</span>
108
+ </div>
109
+ ${a?o`<span class="chat-tool-card__action">${i?"View":""} ${W.check}</span>`:v}
110
+ ${d&&!a?o`<span class="chat-tool-card__status">${W.check}</span>`:v}
111
+ </div>
112
+ ${s?o`<div class="chat-tool-card__detail">${s}</div>`:v}
113
+ ${d?o`<div class="chat-tool-card__status-text muted">Completed</div>`:v}
114
+ ${c?o`<div class="chat-tool-card__preview mono">${dp(e.text)}</div>`:v}
115
+ ${p?o`<div class="chat-tool-card__inline mono">${e.text}</div>`:v}
116
+ </div>
117
+ `}function pp(e){return Array.isArray(e)?e.filter(Boolean):[]}function fp(e){if(typeof e!="string")return e;const t=e.trim();if(!t||!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(t)}catch{return e}}function hp(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function gp(e){const n=e.content,s=[];if(Array.isArray(n))for(const i of n){if(typeof i!="object"||i===null)continue;const a=i;if(a.type==="image"){const r=a.source;if(r?.type==="base64"&&typeof r.data=="string"){const l=r.data,c=r.media_type||"image/png",p=l.startsWith("data:")?l:`data:${c};base64,${l}`;s.push({url:p})}else typeof a.url=="string"&&s.push({url:a.url})}else if(a.type==="image_url"){const r=a.image_url;typeof r?.url=="string"&&s.push({url:r.url})}}return s}function vp(e){return o`
118
+ <div class="chat-group assistant">
119
+ ${li("assistant",e)}
120
+ <div class="chat-group-messages">
121
+ <div class="chat-bubble chat-reading-indicator" aria-hidden="true">
122
+ <span class="chat-reading-indicator__dots">
123
+ <span></span><span></span><span></span>
124
+ </span>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ `}function mp(e,t,n,s){const i=new Date(t).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"}),a=s?.name??"Assistant";return o`
129
+ <div class="chat-group assistant">
130
+ ${li("assistant",s)}
131
+ <div class="chat-group-messages">
132
+ ${lo({role:"assistant",content:[{type:"text",text:e}],timestamp:t},{isStreaming:!0,showReasoning:!1},n)}
133
+ <div class="chat-group-footer">
134
+ <span class="chat-sender-name">${a}</span>
135
+ <span class="chat-group-timestamp">${i}</span>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ `}function yp(e,t){const n=Xs(e.role),s=t.assistantName??"Assistant",i=n==="user"?"You":n==="assistant"?s:n,a=n==="user"?"user":n==="assistant"?"assistant":"other",r=new Date(e.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"});return o`
140
+ <div class="chat-group ${a}">
141
+ ${li(e.role,{name:s,avatar:t.assistantAvatar??null})}
142
+ <div class="chat-group-messages">
143
+ ${e.messages.map((l,c)=>lo(l.message,{isStreaming:e.isStreaming&&c===e.messages.length-1,showReasoning:t.showReasoning},t.onOpenSidebar))}
144
+ <div class="chat-group-footer">
145
+ <span class="chat-sender-name">${i}</span>
146
+ <span class="chat-group-timestamp">${r}</span>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ `}function li(e,t){const n=Xs(e),s=t?.name?.trim()||"Assistant",i=t?.avatar?.trim()||"",a=n==="user"?"U":n==="assistant"?s.charAt(0).toUpperCase()||"A":n==="tool"?"⚙":"?",r=n==="user"?"user":n==="assistant"?"assistant":n==="tool"?"tool":"other";return i&&n==="assistant"?bp(i)?o`<img
151
+ class="chat-avatar ${r}"
152
+ src="${i}"
153
+ alt="${s}"
154
+ />`:o`<div class="chat-avatar ${r}">${i}</div>`:o`<div class="chat-avatar ${r}">${a}</div>`}function bp(e){return/^https?:\/\//i.test(e)||/^data:image\//i.test(e)||/^\//.test(e)}function $p(e){return e.length===0?v:o`
155
+ <div class="chat-message-images">
156
+ ${e.map(t=>o`
157
+ <img
158
+ src=${t.url}
159
+ alt=${t.alt??"Attached image"}
160
+ class="chat-message-image"
161
+ @click=${()=>window.open(t.url,"_blank")}
162
+ />
163
+ `)}
164
+ </div>
165
+ `}function lo(e,t,n){const s=e,i=typeof s.role=="string"?s.role:"unknown",a=zr(e)||i.toLowerCase()==="toolresult"||i.toLowerCase()==="tool_result"||typeof s.toolCallId=="string"||typeof s.tool_call_id=="string",r=up(e),l=r.length>0,c=gp(e),p=c.length>0,d=rr(e),u=t.showReasoning&&i==="assistant"?kl(e):null,h=d?.trim()?d:null,g=u?_l(u):null,$=h,w=i==="assistant"&&!!$?.trim(),A=["chat-bubble",w?"has-copy":"",t.isStreaming?"streaming":"","fade-in"].filter(Boolean).join(" ");return!$&&l&&a?o`${r.map(_=>Ta(_,n))}`:!$&&!l&&!p?v:o`
166
+ <div class="${A}">
167
+ ${w?qu($):v}
168
+ ${$p(c)}
169
+ ${g?o`<div class="chat-thinking">${gs(As(g))}</div>`:v}
170
+ ${$?o`<div class="chat-text">${gs(As($))}</div>`:v}
171
+ ${r.map(_=>Ta(_,n))}
172
+ </div>
173
+ `}function wp(e){return o`
174
+ <div class="sidebar-panel">
175
+ <div class="sidebar-header">
176
+ <div class="sidebar-title">Tool Output</div>
177
+ <button @click=${e.onClose} class="btn" title="Close sidebar">
178
+ ${W.x}
179
+ </button>
180
+ </div>
181
+ <div class="sidebar-content">
182
+ ${e.error?o`
183
+ <div class="callout danger">${e.error}</div>
184
+ <button @click=${e.onViewRawText} class="btn" style="margin-top: 12px;">
185
+ View Raw Text
186
+ </button>
187
+ `:e.content?o`<div class="sidebar-markdown">${gs(As(e.content))}</div>`:o`<div class="muted">No content available</div>`}
188
+ </div>
189
+ </div>
190
+ `}var xp=Object.defineProperty,Ap=Object.getOwnPropertyDescriptor,mn=(e,t,n,s)=>{for(var i=s>1?void 0:s?Ap(t,n):t,a=e.length-1,r;a>=0;a--)(r=e[a])&&(i=(s?r(t,n,i):r(i))||i);return s&&i&&xp(t,n,i),i};let nt=class extends Ze{constructor(){super(...arguments),this.splitRatio=.6,this.minRatio=.4,this.maxRatio=.7,this.isDragging=!1,this.startX=0,this.startRatio=0,this.handleMouseDown=e=>{this.isDragging=!0,this.startX=e.clientX,this.startRatio=this.splitRatio,this.classList.add("dragging"),document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp),e.preventDefault()},this.handleMouseMove=e=>{if(!this.isDragging)return;const t=this.parentElement;if(!t)return;const n=t.getBoundingClientRect().width,i=(e.clientX-this.startX)/n;let a=this.startRatio+i;a=Math.max(this.minRatio,Math.min(this.maxRatio,a)),this.dispatchEvent(new CustomEvent("resize",{detail:{splitRatio:a},bubbles:!0,composed:!0}))},this.handleMouseUp=()=>{this.isDragging=!1,this.classList.remove("dragging"),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}}render(){return o``}connectedCallback(){super.connectedCallback(),this.addEventListener("mousedown",this.handleMouseDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("mousedown",this.handleMouseDown),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}};nt.styles=Do`
191
+ :host {
192
+ width: 4px;
193
+ cursor: col-resize;
194
+ background: var(--border, #333);
195
+ transition: background 150ms ease-out;
196
+ flex-shrink: 0;
197
+ position: relative;
198
+ }
199
+
200
+ :host::before {
201
+ content: "";
202
+ position: absolute;
203
+ top: 0;
204
+ left: -4px;
205
+ right: -4px;
206
+ bottom: 0;
207
+ }
208
+
209
+ :host(:hover) {
210
+ background: var(--accent, #007bff);
211
+ }
212
+
213
+ :host(.dragging) {
214
+ background: var(--accent, #007bff);
215
+ }
216
+ `;mn([rn({type:Number})],nt.prototype,"splitRatio",2);mn([rn({type:Number})],nt.prototype,"minRatio",2);mn([rn({type:Number})],nt.prototype,"maxRatio",2);nt=mn([Xa("resizable-divider")],nt);const kp=5e3;function Sp(e){return e?e.active?o`
217
+ <div class="callout info compaction-indicator compaction-indicator--active">
218
+ ${W.loader} 正在压缩上下文...
219
+ </div>
220
+ `:e.completedAt&&Date.now()-e.completedAt<kp?o`
221
+ <div class="callout success compaction-indicator compaction-indicator--complete">
222
+ ${W.check} 上下文已压缩
223
+ </div>
224
+ `:v:v}function _p(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function Tp(e,t){const n=e.clipboardData?.items;if(!n||!t.onAttachmentsChange)return;const s=[];for(let i=0;i<n.length;i++){const a=n[i];a.type.startsWith("image/")&&s.push(a)}if(s.length!==0){e.preventDefault();for(const i of s){const a=i.getAsFile();if(!a)continue;const r=new FileReader;r.onload=()=>{const l=r.result,c={id:_p(),dataUrl:l,mimeType:a.type},p=t.attachments??[];t.onAttachmentsChange?.([...p,c])},r.readAsDataURL(a)}}}function Ep(e){const t=e.attachments??[];return t.length===0?v:o`
225
+ <div class="chat-attachments">
226
+ ${t.map(n=>o`
227
+ <div class="chat-attachment">
228
+ <img
229
+ src=${n.dataUrl}
230
+ alt="附件预览"
231
+ class="chat-attachment__img"
232
+ />
233
+ <button
234
+ class="chat-attachment__remove"
235
+ type="button"
236
+ aria-label="移除附件"
237
+ @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
238
+ >
239
+ ${W.x}
240
+ </button>
241
+ </div>
242
+ `)}
243
+ </div>
244
+ `}function Cp(e){const t=e.connected,n=e.sending||e.stream!==null,s=!!(e.canAbort&&e.onAbort),a=e.sessions?.sessions?.find(g=>g.key===e.sessionKey)?.reasoningLevel??"off",r=e.showThinking&&a!=="off",l={name:e.assistantName,avatar:e.assistantAvatar??e.assistantAvatarUrl??null},c=(e.attachments?.length??0)>0,p=e.connected?c?"添加消息或粘贴更多图片...":"消息(回车发送,Shift+回车换行,可粘贴图片)":"连接到网关以开始聊天…",d=e.splitRatio??.6,u=!!(e.sidebarOpen&&e.onCloseSidebar),h=o`
245
+ <div
246
+ class="chat-thread"
247
+ role="log"
248
+ aria-live="polite"
249
+ @scroll=${e.onChatScroll}
250
+ >
251
+ ${e.loading?o`<div class="muted">正在加载聊天…</div>`:v}
252
+ ${Kr(Mp(e),g=>g.key,g=>g.kind==="reading-indicator"?vp(l):g.kind==="stream"?mp(g.text,g.startedAt,e.onOpenSidebar,l):g.kind==="group"?yp(g,{onOpenSidebar:e.onOpenSidebar,showReasoning:r,assistantName:e.assistantName,assistantAvatar:l.avatar}):v)}
253
+ </div>
254
+ `;return o`
255
+ <section class="card chat">
256
+ ${e.disabledReason?o`<div class="callout">${e.disabledReason}</div>`:v}
257
+
258
+ ${e.error?o`<div class="callout danger">${e.error}</div>`:v}
259
+
260
+ ${Sp(e.compactionStatus)}
261
+
262
+ ${e.focusMode?o`
263
+ <button
264
+ class="chat-focus-exit"
265
+ type="button"
266
+ @click=${e.onToggleFocusMode}
267
+ aria-label="退出专注模式"
268
+ title="退出专注模式"
269
+ >
270
+ ${W.x}
271
+ </button>
272
+ `:v}
273
+
274
+ <div
275
+ class="chat-split-container ${u?"chat-split-container--open":""}"
276
+ >
277
+ <div
278
+ class="chat-main"
279
+ style="flex: ${u?`0 0 ${d*100}%`:"1 1 100%"}"
280
+ >
281
+ ${h}
282
+ </div>
283
+
284
+ ${u?o`
285
+ <resizable-divider
286
+ .splitRatio=${d}
287
+ @resize=${g=>e.onSplitRatioChange?.(g.detail.splitRatio)}
288
+ ></resizable-divider>
289
+ <div class="chat-sidebar">
290
+ ${wp({content:e.sidebarContent??null,error:e.sidebarError??null,onClose:e.onCloseSidebar,onViewRawText:()=>{!e.sidebarContent||!e.onOpenSidebar||e.onOpenSidebar(`\`\`\`
291
+ ${e.sidebarContent}
292
+ \`\`\``)}})}
293
+ </div>
294
+ `:v}
295
+ </div>
296
+
297
+ ${e.queue.length?o`
298
+ <div class="chat-queue" role="status" aria-live="polite">
299
+ <div class="chat-queue__title">队列(${e.queue.length})</div>
300
+ <div class="chat-queue__list">
301
+ ${e.queue.map(g=>o`
302
+ <div class="chat-queue__item">
303
+ <div class="chat-queue__text">
304
+ ${g.text||(g.attachments?.length?`图片(${g.attachments.length})`:"")}
305
+ </div>
306
+ <button
307
+ class="btn chat-queue__remove"
308
+ type="button"
309
+ aria-label="移除队列消息"
310
+ @click=${()=>e.onQueueRemove(g.id)}
311
+ >
312
+ ${W.x}
313
+ </button>
314
+ </div>
315
+ `)}
316
+ </div>
317
+ </div>
318
+ `:v}
319
+
320
+ <div class="chat-compose">
321
+ ${Ep(e)}
322
+ <div class="chat-compose__row">
323
+ <label class="field chat-compose__field">
324
+ <span>消息</span>
325
+ <textarea
326
+ .value=${e.draft}
327
+ ?disabled=${!e.connected}
328
+ @keydown=${g=>{g.key==="Enter"&&(g.isComposing||g.keyCode===229||g.shiftKey||e.connected&&(g.preventDefault(),t&&e.onSend()))}}
329
+ @input=${g=>e.onDraftChange(g.target.value)}
330
+ @paste=${g=>Tp(g,e)}
331
+ placeholder=${p}
332
+ ></textarea>
333
+ </label>
334
+ <div class="chat-compose__actions">
335
+ <button
336
+ class="btn"
337
+ ?disabled=${!e.connected||!s&&e.sending}
338
+ @click=${s?e.onAbort:e.onNewSession}
339
+ >
340
+ ${s?"停止":"新会话"}
341
+ </button>
342
+ <button
343
+ class="btn primary"
344
+ ?disabled=${!e.connected}
345
+ @click=${e.onSend}
346
+ >
347
+ ${n?"队列":"发送"}<kbd class="btn-kbd">↵</kbd>
348
+ </button>
349
+ </div>
350
+ </div>
351
+ </div>
352
+ </section>
353
+ `}const Ea=200;function Ip(e){const t=[];let n=null;for(const s of e){if(s.kind!=="message"){n&&(t.push(n),n=null),t.push(s);continue}const i=Hr(s.message),a=Xs(i.role),r=i.timestamp||Date.now();!n||n.role!==a?(n&&t.push(n),n={kind:"group",key:`group:${a}:${s.key}`,role:a,messages:[{message:s.message,key:s.key}],timestamp:r,isStreaming:!1}):n.messages.push({message:s.message,key:s.key})}return n&&t.push(n),t}function Mp(e){const t=[],n=Array.isArray(e.messages)?e.messages:[],s=Array.isArray(e.toolMessages)?e.toolMessages:[],i=Math.max(0,n.length-Ea);i>0&&t.push({kind:"message",key:"chat:history:notice",message:{role:"system",content:`显示最后 ${Ea} 条消息(隐藏 ${i} 条)。`,timestamp:Date.now()}});for(let a=i;a<n.length;a++){const r=n[a],l=Hr(r);!e.showThinking&&l.role.toLowerCase()==="toolresult"||t.push({kind:"message",key:Ca(r,a),message:r})}if(e.showThinking)for(let a=0;a<s.length;a++)t.push({kind:"message",key:Ca(s[a],a+n.length),message:s[a]});if(e.stream!==null){const a=`stream:${e.sessionKey}:${e.streamStartedAt??"live"}`;e.stream.trim().length>0?t.push({kind:"stream",key:a,text:e.stream,startedAt:e.streamStartedAt??Date.now()}):t.push({kind:"reading-indicator",key:a})}return Ip(t)}function Ca(e,t){const n=e,s=typeof n.toolCallId=="string"?n.toolCallId:"";if(s)return`tool:${s}`;const i=typeof n.id=="string"?n.id:"";if(i)return`msg:${i}`;const a=typeof n.messageId=="string"?n.messageId:"";if(a)return`msg:${a}`;const r=typeof n.timestamp=="number"?n.timestamp:null,l=typeof n.role=="string"?n.role:"unknown";return r!=null?`msg:${l}:${r}:${t}`:`msg:${l}:${t}`}function ue(e){if(e)return Array.isArray(e.type)?e.type.filter(n=>n!=="null")[0]??e.type[0]:e.type}function co(e){if(!e)return"";if(e.default!==void 0)return e.default;switch(ue(e)){case"object":return{};case"array":return[];case"boolean":return!1;case"number":case"integer":return 0;case"string":return"";default:return""}}function yn(e){return e.filter(t=>typeof t=="string").join(".")}function te(e,t){const n=yn(e),s=t[n];if(s)return s;const i=n.split(".");for(const[a,r]of Object.entries(t)){if(!a.includes("*"))continue;const l=a.split(".");if(l.length!==i.length)continue;let c=!0;for(let p=0;p<i.length;p+=1)if(l[p]!=="*"&&l[p]!==i[p]){c=!1;break}if(c)return r}}function $e(e){return e.replace(/_/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/\s+/g," ").replace(/^./,t=>t.toUpperCase())}function Lp(e){const t=yn(e).toLowerCase();return t.includes("token")||t.includes("password")||t.includes("secret")||t.includes("apikey")||t.endsWith("key")}const Rp=new Set(["title","description","default","nullable"]);function Pp(e){return Object.keys(e??{}).filter(n=>!Rp.has(n)).length===0}function Np(e){if(e===void 0)return"";try{return JSON.stringify(e,null,2)??""}catch{return""}}const _t={chevronDown:o`<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>`,plus:o`<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>`,minus:o`<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>`,trash:o`<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>`,edit:o`<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>`};function be(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:r,onPatch:l}=e,c=e.showLabel??!0,p=ue(t),d=te(s,i),u=d?.label??t.title??$e(String(s.at(-1))),h=d?.help??t.description,g=yn(s);if(a.has(g))return o`<div class="cfg-field cfg-field--error">
354
+ <div class="cfg-field__label">${u}</div>
355
+ <div class="cfg-field__error">不支持的模式节点。请使用原始模式。</div>
356
+ </div>`;if(t.anyOf||t.oneOf){const w=(t.anyOf??t.oneOf??[]).filter(E=>!(E.type==="null"||Array.isArray(E.type)&&E.type.includes("null")));if(w.length===1)return be({...e,schema:w[0]});const A=E=>{if(E.const!==void 0)return E.const;if(E.enum&&E.enum.length===1)return E.enum[0]},_=w.map(A),M=_.every(E=>E!==void 0);if(M&&_.length>0&&_.length<=5){const E=n??t.default;return o`
357
+ <div class="cfg-field">
358
+ ${c?o`<label class="cfg-field__label">${u}</label>`:v}
359
+ ${h?o`<div class="cfg-field__help">${h}</div>`:v}
360
+ <div class="cfg-segmented">
361
+ ${_.map((C,pe)=>o`
362
+ <button
363
+ type="button"
364
+ class="cfg-segmented__btn ${C===E||String(C)===String(E)?"active":""}"
365
+ ?disabled=${r}
366
+ @click=${()=>l(s,C)}
367
+ >
368
+ ${String(C)}
369
+ </button>
370
+ `)}
371
+ </div>
372
+ </div>
373
+ `}if(M&&_.length>5)return Ma({...e,options:_,value:n??t.default});const P=new Set(w.map(E=>ue(E)).filter(Boolean)),I=new Set([...P].map(E=>E==="integer"?"number":E));if([...I].every(E=>["string","number","boolean"].includes(E))){const E=I.has("string"),C=I.has("number");if(I.has("boolean")&&I.size===1)return be({...e,schema:{...t,type:"boolean",anyOf:void 0,oneOf:void 0}});if(E||C)return Ia({...e,inputType:C&&!E?"number":"text"})}}if(t.enum){const $=t.enum;if($.length<=5){const w=n??t.default;return o`
374
+ <div class="cfg-field">
375
+ ${c?o`<label class="cfg-field__label">${u}</label>`:v}
376
+ ${h?o`<div class="cfg-field__help">${h}</div>`:v}
377
+ <div class="cfg-segmented">
378
+ ${$.map(A=>o`
379
+ <button
380
+ type="button"
381
+ class="cfg-segmented__btn ${A===w||String(A)===String(w)?"active":""}"
382
+ ?disabled=${r}
383
+ @click=${()=>l(s,A)}
384
+ >
385
+ ${String(A)}
386
+ </button>
387
+ `)}
388
+ </div>
389
+ </div>
390
+ `}return Ma({...e,options:$,value:n??t.default})}if(p==="object")return Dp(e);if(p==="array")return Bp(e);if(p==="boolean"){const $=typeof n=="boolean"?n:typeof t.default=="boolean"?t.default:!1;return o`
391
+ <label class="cfg-toggle-row ${r?"disabled":""}">
392
+ <div class="cfg-toggle-row__content">
393
+ <span class="cfg-toggle-row__label">${u}</span>
394
+ ${h?o`<span class="cfg-toggle-row__help">${h}</span>`:v}
395
+ </div>
396
+ <div class="cfg-toggle">
397
+ <input
398
+ type="checkbox"
399
+ .checked=${$}
400
+ ?disabled=${r}
401
+ @change=${w=>l(s,w.target.checked)}
402
+ />
403
+ <span class="cfg-toggle__track"></span>
404
+ </div>
405
+ </label>
406
+ `}return p==="number"||p==="integer"?Op(e):p==="string"?Ia({...e,inputType:"text"}):o`
407
+ <div class="cfg-field cfg-field--error">
408
+ <div class="cfg-field__label">${u}</div>
409
+ <div class="cfg-field__error">不支持的类型: ${p}。请使用原始模式。</div>
410
+ </div>
411
+ `}function Ia(e){const{schema:t,value:n,path:s,hints:i,disabled:a,onPatch:r,inputType:l}=e,c=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??$e(String(s.at(-1))),u=p?.help??t.description,h=p?.sensitive??Lp(s),g=p?.placeholder??(h?"••••":t.default!==void 0?`Default: ${t.default}`:""),$=n??"";return o`
412
+ <div class="cfg-field">
413
+ ${c?o`<label class="cfg-field__label">${d}</label>`:v}
414
+ ${u?o`<div class="cfg-field__help">${u}</div>`:v}
415
+ <div class="cfg-input-wrap">
416
+ <input
417
+ type=${h?"password":l}
418
+ class="cfg-input"
419
+ placeholder=${g}
420
+ .value=${$==null?"":String($)}
421
+ ?disabled=${a}
422
+ @input=${w=>{const A=w.target.value;if(l==="number"){if(A.trim()===""){r(s,void 0);return}const _=Number(A);r(s,Number.isNaN(_)?A:_);return}r(s,A)}}
423
+ />
424
+ ${t.default!==void 0?o`
425
+ <button
426
+ type="button"
427
+ class="cfg-input__reset"
428
+ title="Reset to default"
429
+ ?disabled=${a}
430
+ @click=${()=>r(s,t.default)}
431
+ >↺</button>
432
+ `:v}
433
+ </div>
434
+ </div>
435
+ `}function Op(e){const{schema:t,value:n,path:s,hints:i,disabled:a,onPatch:r}=e,l=e.showLabel??!0,c=te(s,i),p=c?.label??t.title??$e(String(s.at(-1))),d=c?.help??t.description,u=n??t.default??"",h=typeof u=="number"?u:0;return o`
436
+ <div class="cfg-field">
437
+ ${l?o`<label class="cfg-field__label">${p}</label>`:v}
438
+ ${d?o`<div class="cfg-field__help">${d}</div>`:v}
439
+ <div class="cfg-number">
440
+ <button
441
+ type="button"
442
+ class="cfg-number__btn"
443
+ ?disabled=${a}
444
+ @click=${()=>r(s,h-1)}
445
+ >−</button>
446
+ <input
447
+ type="number"
448
+ class="cfg-number__input"
449
+ .value=${u==null?"":String(u)}
450
+ ?disabled=${a}
451
+ @input=${g=>{const $=g.target.value,w=$===""?void 0:Number($);r(s,w)}}
452
+ />
453
+ <button
454
+ type="button"
455
+ class="cfg-number__btn"
456
+ ?disabled=${a}
457
+ @click=${()=>r(s,h+1)}
458
+ >+</button>
459
+ </div>
460
+ </div>
461
+ `}function Ma(e){const{schema:t,value:n,path:s,hints:i,disabled:a,options:r,onPatch:l}=e,c=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??$e(String(s.at(-1))),u=p?.help??t.description,h=n??t.default,g=r.findIndex(w=>w===h||String(w)===String(h)),$="__unset__";return o`
462
+ <div class="cfg-field">
463
+ ${c?o`<label class="cfg-field__label">${d}</label>`:v}
464
+ ${u?o`<div class="cfg-field__help">${u}</div>`:v}
465
+ <select
466
+ class="cfg-select"
467
+ ?disabled=${a}
468
+ .value=${g>=0?String(g):$}
469
+ @change=${w=>{const A=w.target.value;l(s,A===$?void 0:r[Number(A)])}}
470
+ >
471
+ <option value=${$}>Select...</option>
472
+ ${r.map((w,A)=>o`
473
+ <option value=${String(A)}>${String(w)}</option>
474
+ `)}
475
+ </select>
476
+ </div>
477
+ `}function Dp(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:r,onPatch:l}=e;e.showLabel;const c=te(s,i),p=c?.label??t.title??$e(String(s.at(-1))),d=c?.help??t.description,u=n??t.default,h=u&&typeof u=="object"&&!Array.isArray(u)?u:{},g=t.properties??{},w=Object.entries(g).sort((P,I)=>{const E=te([...s,P[0]],i)?.order??0,C=te([...s,I[0]],i)?.order??0;return E!==C?E-C:P[0].localeCompare(I[0])}),A=new Set(Object.keys(g)),_=t.additionalProperties,M=!!_&&typeof _=="object";return s.length===1?o`
478
+ <div class="cfg-fields">
479
+ ${w.map(([P,I])=>be({schema:I,value:h[P],path:[...s,P],hints:i,unsupported:a,disabled:r,onPatch:l}))}
480
+ ${M?La({schema:_,value:h,path:s,hints:i,unsupported:a,disabled:r,reservedKeys:A,onPatch:l}):v}
481
+ </div>
482
+ `:o`
483
+ <details class="cfg-object" open>
484
+ <summary class="cfg-object__header">
485
+ <span class="cfg-object__title">${p}</span>
486
+ <span class="cfg-object__chevron">${_t.chevronDown}</span>
487
+ </summary>
488
+ ${d?o`<div class="cfg-object__help">${d}</div>`:v}
489
+ <div class="cfg-object__content">
490
+ ${w.map(([P,I])=>be({schema:I,value:h[P],path:[...s,P],hints:i,unsupported:a,disabled:r,onPatch:l}))}
491
+ ${M?La({schema:_,value:h,path:s,hints:i,unsupported:a,disabled:r,reservedKeys:A,onPatch:l}):v}
492
+ </div>
493
+ </details>
494
+ `}function Bp(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:r,onPatch:l}=e,c=e.showLabel??!0,p=te(s,i),d=p?.label??t.title??$e(String(s.at(-1))),u=p?.help??t.description,h=Array.isArray(t.items)?t.items[0]:t.items;if(!h)return o`
495
+ <div class="cfg-field cfg-field--error">
496
+ <div class="cfg-field__label">${d}</div>
497
+ <div class="cfg-field__error">不支持的数组模式。请使用原始模式。</div>
498
+ </div>
499
+ `;const g=Array.isArray(n)?n:Array.isArray(t.default)?t.default:[];return o`
500
+ <div class="cfg-array">
501
+ <div class="cfg-array__header">
502
+ ${c?o`<span class="cfg-array__label">${d}</span>`:v}
503
+ <span class="cfg-array__count">${g.length} item${g.length!==1?"s":""}</span>
504
+ <button
505
+ type="button"
506
+ class="cfg-array__add"
507
+ ?disabled=${r}
508
+ @click=${()=>{const $=[...g,co(h)];l(s,$)}}
509
+ >
510
+ <span class="cfg-array__add-icon">${_t.plus}</span>
511
+ Add
512
+ </button>
513
+ </div>
514
+ ${u?o`<div class="cfg-array__help">${u}</div>`:v}
515
+
516
+ ${g.length===0?o`
517
+ <div class="cfg-array__empty">
518
+ No items yet. Click "Add" to create one.
519
+ </div>
520
+ `:o`
521
+ <div class="cfg-array__items">
522
+ ${g.map(($,w)=>o`
523
+ <div class="cfg-array__item">
524
+ <div class="cfg-array__item-header">
525
+ <span class="cfg-array__item-index">#${w+1}</span>
526
+ <button
527
+ type="button"
528
+ class="cfg-array__item-remove"
529
+ title="Remove item"
530
+ ?disabled=${r}
531
+ @click=${()=>{const A=[...g];A.splice(w,1),l(s,A)}}
532
+ >
533
+ ${_t.trash}
534
+ </button>
535
+ </div>
536
+ <div class="cfg-array__item-content">
537
+ ${be({schema:h,value:$,path:[...s,w],hints:i,unsupported:a,disabled:r,showLabel:!1,onPatch:l})}
538
+ </div>
539
+ </div>
540
+ `)}
541
+ </div>
542
+ `}
543
+ </div>
544
+ `}function La(e){const{schema:t,value:n,path:s,hints:i,unsupported:a,disabled:r,reservedKeys:l,onPatch:c}=e,p=Pp(t),d=Object.entries(n??{}).filter(([u])=>!l.has(u));return o`
545
+ <div class="cfg-map">
546
+ <div class="cfg-map__header">
547
+ <span class="cfg-map__label">Custom entries</span>
548
+ <button
549
+ type="button"
550
+ class="cfg-map__add"
551
+ ?disabled=${r}
552
+ @click=${()=>{const u={...n??{}};let h=1,g=`custom-${h}`;for(;g in u;)h+=1,g=`custom-${h}`;u[g]=p?{}:co(t),c(s,u)}}
553
+ >
554
+ <span class="cfg-map__add-icon">${_t.plus}</span>
555
+ Add Entry
556
+ </button>
557
+ </div>
558
+
559
+ ${d.length===0?o`
560
+ <div class="cfg-map__empty">No custom entries.</div>
561
+ `:o`
562
+ <div class="cfg-map__items">
563
+ ${d.map(([u,h])=>{const g=[...s,u],$=Np(h);return o`
564
+ <div class="cfg-map__item">
565
+ <div class="cfg-map__item-key">
566
+ <input
567
+ type="text"
568
+ class="cfg-input cfg-input--sm"
569
+ placeholder="Key"
570
+ .value=${u}
571
+ ?disabled=${r}
572
+ @change=${w=>{const A=w.target.value.trim();if(!A||A===u)return;const _={...n??{}};A in _||(_[A]=_[u],delete _[u],c(s,_))}}
573
+ />
574
+ </div>
575
+ <div class="cfg-map__item-value">
576
+ ${p?o`
577
+ <textarea
578
+ class="cfg-textarea cfg-textarea--sm"
579
+ placeholder="JSON value"
580
+ rows="2"
581
+ .value=${$}
582
+ ?disabled=${r}
583
+ @change=${w=>{const A=w.target,_=A.value.trim();if(!_){c(g,void 0);return}try{c(g,JSON.parse(_))}catch{A.value=$}}}
584
+ ></textarea>
585
+ `:be({schema:t,value:h,path:g,hints:i,unsupported:a,disabled:r,showLabel:!1,onPatch:c})}
586
+ </div>
587
+ <button
588
+ type="button"
589
+ class="cfg-map__item-remove"
590
+ title="Remove entry"
591
+ ?disabled=${r}
592
+ @click=${()=>{const w={...n??{}};delete w[u],c(s,w)}}
593
+ >
594
+ ${_t.trash}
595
+ </button>
596
+ </div>
597
+ `})}
598
+ </div>
599
+ `}
600
+ </div>
601
+ `}const Ra={env:o`<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>`,update:o`<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>`,agents:o`<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>`,auth:o`<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>`,channels:o`<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>`,messages:o`<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>`,commands:o`<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>`,hooks:o`<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>`,skills:o`<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>`,tools:o`<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>`,gateway:o`<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>`,wizard:o`<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>`,meta:o`<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>`,logging:o`<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>`,browser:o`<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>`,ui:o`<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>`,models:o`<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>`,bindings:o`<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>`,broadcast:o`<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>`,audio:o`<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>`,session:o`<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>`,cron:o`<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>`,web:o`<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>`,discovery:o`<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>`,canvasHost:o`<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>`,talk:o`<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>`,plugins:o`<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>`,default:o`<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>`},ci={env:{label:"环境变量",description:"传递给网关进程的环境变量"},update:{label:"更新",description:"自动更新设置和发布渠道"},agents:{label:"代理",description:"代理配置、模型和身份"},auth:{label:"身份验证",description:"API密钥和身份验证配置文件"},channels:{label:"通道",description:"消息通道(Telegram、Discord、Slack等)"},messages:{label:"消息",description:"消息处理和路由设置"},commands:{label:"命令",description:"自定义斜杠命令"},hooks:{label:"钩子",description:"Webhooks和事件钩子"},skills:{label:"技能",description:"技能包和能力"},tools:{label:"工具",description:"工具配置(浏览器、搜索等)"},gateway:{label:"网关",description:"网关服务器设置(端口、身份验证、绑定)"},wizard:{label:"设置向导",description:"设置向导状态和历史记录"},diagnostics:{label:"诊断",description:"诊断设置"},meta:{label:"元数据",description:"网关元数据和版本信息"},logging:{label:"日志",description:"日志级别和输出配置"},browser:{label:"浏览器",description:"浏览器自动化设置"},ui:{label:"用户界面",description:"用户界面偏好设置"},models:{label:"模型",description:"AI模型配置和提供商"},bindings:{label:"绑定",description:"键绑定和快捷键"},broadcast:{label:"广播",description:"广播和通知设置"},audio:{label:"音频",description:"音频输入/输出设置"},session:{label:"会话",description:"会话管理和持久化"},cron:{label:"定时任务",description:"计划任务和自动化"},web:{label:"Web",description:"Web服务器和API设置"},discovery:{label:"发现",description:"服务发现和网络"},canvasHost:{label:"Canvas主机",description:"Canvas渲染和显示"},talk:{label:"语音",description:"语音和语音设置"},plugins:{label:"插件",description:"插件管理和扩展"}};function Pa(e){return Ra[e]??Ra.default}function Fp(e,t,n){if(!n)return!0;const s=n.toLowerCase(),i=ci[e];return e.toLowerCase().includes(s)||i&&(i.label.toLowerCase().includes(s)||i.description.toLowerCase().includes(s))?!0:mt(t,s)}function mt(e,t){if(e.title?.toLowerCase().includes(t)||e.description?.toLowerCase().includes(t)||e.enum?.some(s=>String(s).toLowerCase().includes(t)))return!0;if(e.properties){for(const[s,i]of Object.entries(e.properties))if(s.toLowerCase().includes(t)||mt(i,t))return!0}if(e.items){const s=Array.isArray(e.items)?e.items:[e.items];for(const i of s)if(i&&mt(i,t))return!0}if(e.additionalProperties&&typeof e.additionalProperties=="object"&&mt(e.additionalProperties,t))return!0;const n=e.anyOf??e.oneOf??e.allOf;if(n){for(const s of n)if(s&&mt(s,t))return!0}return!1}function Up(e){if(!e.schema)return o`<div class="muted">模式不可用。</div>`;const t=e.schema,n=e.value??{};if(ue(t)!=="object"||!t.properties)return o`<div class="callout danger">不支持的模式。使用原始模式。</div>`;const s=new Set(e.unsupportedPaths??[]),i=t.properties,a=e.searchQuery??"",r=e.activeSection,l=e.activeSubsection??null,p=Object.entries(i).sort((u,h)=>{const g=te([u[0]],e.uiHints)?.order??50,$=te([h[0]],e.uiHints)?.order??50;return g!==$?g-$:u[0].localeCompare(h[0])}).filter(([u,h])=>!(r&&u!==r||a&&!Fp(u,h,a)));let d=null;if(r&&l&&p.length===1){const u=p[0]?.[1];u&&ue(u)==="object"&&u.properties&&u.properties[l]&&(d={sectionKey:r,subsectionKey:l,schema:u.properties[l]})}return p.length===0?o`
602
+ <div class="config-empty">
603
+ <div class="config-empty__icon">${W.search}</div>
604
+ <div class="config-empty__text">
605
+ ${a?`没有匹配"${a}"的设置`:"此部分中没有设置"}
606
+ </div>
607
+ </div>
608
+ `:o`
609
+ <div class="config-form config-form--modern">
610
+ ${d?(()=>{const{sectionKey:u,subsectionKey:h,schema:g}=d,$=te([u,h],e.uiHints),w=$?.label??g.title??$e(h),A=$?.help??g.description??"",_=n[u],M=_&&typeof _=="object"?_[h]:void 0,P=`config-section-${u}-${h}`;return o`
611
+ <section class="config-section-card" id=${P}>
612
+ <div class="config-section-card__header">
613
+ <span class="config-section-card__icon">${Pa(u)}</span>
614
+ <div class="config-section-card__titles">
615
+ <h3 class="config-section-card__title">${w}</h3>
616
+ ${A?o`<p class="config-section-card__desc">${A}</p>`:v}
617
+ </div>
618
+ </div>
619
+ <div class="config-section-card__content">
620
+ ${be({schema:g,value:M,path:[u,h],hints:e.uiHints,unsupported:s,disabled:e.disabled??!1,showLabel:!1,onPatch:e.onPatch})}
621
+ </div>
622
+ </section>
623
+ `})():p.map(([u,h])=>{const g=ci[u]??{label:u.charAt(0).toUpperCase()+u.slice(1),description:h.description??""};return o`
624
+ <section class="config-section-card" id="config-section-${u}">
625
+ <div class="config-section-card__header">
626
+ <span class="config-section-card__icon">${Pa(u)}</span>
627
+ <div class="config-section-card__titles">
628
+ <h3 class="config-section-card__title">${g.label}</h3>
629
+ ${g.description?o`<p class="config-section-card__desc">${g.description}</p>`:v}
630
+ </div>
631
+ </div>
632
+ <div class="config-section-card__content">
633
+ ${be({schema:h,value:n[u],path:[u],hints:e.uiHints,unsupported:s,disabled:e.disabled??!1,showLabel:!1,onPatch:e.onPatch})}
634
+ </div>
635
+ </section>
636
+ `})}
637
+ </div>
638
+ `}const Kp=new Set(["title","description","default","nullable"]);function Hp(e){return Object.keys(e??{}).filter(n=>!Kp.has(n)).length===0}function uo(e){const t=e.filter(i=>i!=null),n=t.length!==e.length,s=[];for(const i of t)s.some(a=>Object.is(a,i))||s.push(i);return{enumValues:s,nullable:n}}function po(e){return!e||typeof e!="object"?{schema:null,unsupportedPaths:["<root>"]}:$t(e,[])}function $t(e,t){const n=new Set,s={...e},i=yn(t)||"<root>";if(e.anyOf||e.oneOf||e.allOf){const l=zp(e,t);return l||{schema:e,unsupportedPaths:[i]}}const a=Array.isArray(e.type)&&e.type.includes("null"),r=ue(e)??(e.properties||e.additionalProperties?"object":void 0);if(s.type=r??e.type,s.nullable=a||e.nullable,s.enum){const{enumValues:l,nullable:c}=uo(s.enum);s.enum=l,c&&(s.nullable=!0),l.length===0&&n.add(i)}if(r==="object"){const l=e.properties??{},c={};for(const[p,d]of Object.entries(l)){const u=$t(d,[...t,p]);u.schema&&(c[p]=u.schema);for(const h of u.unsupportedPaths)n.add(h)}if(s.properties=c,e.additionalProperties===!0)n.add(i);else if(e.additionalProperties===!1)s.additionalProperties=!1;else if(e.additionalProperties&&typeof e.additionalProperties=="object"&&!Hp(e.additionalProperties)){const p=$t(e.additionalProperties,[...t,"*"]);s.additionalProperties=p.schema??e.additionalProperties,p.unsupportedPaths.length>0&&n.add(i)}}else if(r==="array"){const l=Array.isArray(e.items)?e.items[0]:e.items;if(!l)n.add(i);else{const c=$t(l,[...t,"*"]);s.items=c.schema??l,c.unsupportedPaths.length>0&&n.add(i)}}else r!=="string"&&r!=="number"&&r!=="integer"&&r!=="boolean"&&!s.enum&&n.add(i);return{schema:s,unsupportedPaths:Array.from(n)}}function zp(e,t){if(e.allOf)return null;const n=e.anyOf??e.oneOf;if(!n)return null;const s=[],i=[];let a=!1;for(const l of n){if(!l||typeof l!="object")return null;if(Array.isArray(l.enum)){const{enumValues:c,nullable:p}=uo(l.enum);s.push(...c),p&&(a=!0);continue}if("const"in l){if(l.const==null){a=!0;continue}s.push(l.const);continue}if(ue(l)==="null"){a=!0;continue}i.push(l)}if(s.length>0&&i.length===0){const l=[];for(const c of s)l.some(p=>Object.is(p,c))||l.push(c);return{schema:{...e,enum:l,nullable:a,anyOf:void 0,oneOf:void 0,allOf:void 0},unsupportedPaths:[]}}if(i.length===1){const l=$t(i[0],t);return l.schema&&(l.schema.nullable=a||l.schema.nullable),l}const r=["string","number","integer","boolean"];return i.length>0&&s.length===0&&i.every(l=>l.type&&r.includes(String(l.type)))?{schema:{...e,nullable:a},unsupportedPaths:[]}:null}const ks={all:o`<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>`,env:o`<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>`,update:o`<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>`,agents:o`<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>`,auth:o`<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>`,channels:o`<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>`,messages:o`<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>`,commands:o`<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>`,hooks:o`<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>`,skills:o`<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>`,tools:o`<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>`,gateway:o`<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>`,wizard:o`<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>`,meta:o`<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>`,logging:o`<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>`,browser:o`<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>`,ui:o`<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>`,models:o`<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>`,bindings:o`<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>`,broadcast:o`<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>`,audio:o`<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>`,session:o`<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>`,cron:o`<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>`,web:o`<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>`,discovery:o`<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>`,canvasHost:o`<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>`,talk:o`<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>`,plugins:o`<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>`,default:o`<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>`},Na=[{key:"env",label:"环境"},{key:"update",label:"更新"},{key:"agents",label:"代理"},{key:"auth",label:"身份验证"},{key:"channels",label:"通道"},{key:"messages",label:"消息"},{key:"commands",label:"命令"},{key:"hooks",label:"钩子"},{key:"skills",label:"技能"},{key:"tools",label:"工具"},{key:"gateway",label:"网关"},{key:"wizard",label:"设置向导"}],Oa="__all__";function Da(e){return ks[e]??ks.default}function jp(e,t){const n=ci[e];return n||{label:t?.title??$e(e),description:t?.description??""}}function qp(e){const{key:t,schema:n,uiHints:s}=e;if(!n||ue(n)!=="object"||!n.properties)return[];const i=Object.entries(n.properties).map(([a,r])=>{const l=te([t,a],s),c=l?.label??r.title??$e(a),p=l?.help??r.description??"",d=l?.order??50;return{key:a,label:c,description:p,order:d}});return i.sort((a,r)=>a.order!==r.order?a.order-r.order:a.key.localeCompare(r.key)),i}function Vp(e,t){if(!e||!t)return[];const n=[];function s(i,a,r){if(i===a)return;if(typeof i!=typeof a){n.push({path:r,from:i,to:a});return}if(typeof i!="object"||i===null||a===null){i!==a&&n.push({path:r,from:i,to:a});return}if(Array.isArray(i)&&Array.isArray(a)){JSON.stringify(i)!==JSON.stringify(a)&&n.push({path:r,from:i,to:a});return}const l=i,c=a,p=new Set([...Object.keys(l),...Object.keys(c)]);for(const d of p)s(l[d],c[d],r?`${r}.${d}`:d)}return s(e,t,""),n}function Ba(e,t=40){let n;try{n=JSON.stringify(e)??String(e)}catch{n=String(e)}return n.length<=t?n:n.slice(0,t-3)+"..."}function Wp(e){const t=e.valid==null?"unknown":e.valid?"valid":"invalid",n=po(e.schema),s=n.schema?n.unsupportedPaths.length>0:!1,i=n.schema?.properties??{},a=Na.filter(C=>C.key in i),r=new Set(Na.map(C=>C.key)),l=Object.keys(i).filter(C=>!r.has(C)).map(C=>({key:C,label:C.charAt(0).toUpperCase()+C.slice(1)})),c=[...a,...l],p=e.activeSection&&n.schema&&ue(n.schema)==="object"?n.schema.properties?.[e.activeSection]:void 0,d=e.activeSection?jp(e.activeSection,p):null,u=e.activeSection?qp({key:e.activeSection,schema:p,uiHints:e.uiHints}):[],h=e.formMode==="form"&&!!e.activeSection&&u.length>0,g=e.activeSubsection===Oa,$=e.searchQuery||g?null:e.activeSubsection??u[0]?.key??null,w=e.formMode==="form"?Vp(e.originalValue,e.formValue):[],A=e.formMode==="raw"&&e.raw!==e.originalRaw,_=e.formMode==="form"?w.length>0:A,M=!!e.formValue&&!e.loading&&!!n.schema,P=e.connected&&!e.saving&&_&&(e.formMode==="raw"?!0:M),I=e.connected&&!e.applying&&!e.updating&&_&&(e.formMode==="raw"?!0:M),E=e.connected&&!e.applying&&!e.updating;return o`
639
+ <div class="config-layout">
640
+ <!-- Sidebar -->
641
+ <aside class="config-sidebar">
642
+ <div class="config-sidebar__header">
643
+ <div class="config-sidebar__title">设置</div>
644
+ <span class="pill pill--sm ${t==="valid"?"pill--ok":t==="invalid"?"pill--danger":""}">${t}</span>
645
+ </div>
646
+
647
+ <!-- Search -->
648
+ <div class="config-search">
649
+ <svg class="config-search__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
650
+ <circle cx="11" cy="11" r="8"></circle>
651
+ <path d="M21 21l-4.35-4.35"></path>
652
+ </svg>
653
+ <input
654
+ type="text"
655
+ class="config-search__input"
656
+ placeholder="搜索设置..."
657
+ .value=${e.searchQuery}
658
+ @input=${C=>e.onSearchChange(C.target.value)}
659
+ />
660
+ ${e.searchQuery?o`
661
+ <button
662
+ class="config-search__clear"
663
+ @click=${()=>e.onSearchChange("")}
664
+ >×</button>
665
+ `:v}
666
+ </div>
667
+
668
+ <!-- Section nav -->
669
+ <nav class="config-nav">
670
+ <button
671
+ class="config-nav__item ${e.activeSection===null?"active":""}"
672
+ @click=${()=>e.onSectionChange(null)}
673
+ >
674
+ <span class="config-nav__icon">${ks.all}</span>
675
+ <span class="config-nav__label">所有设置</span>
676
+ </button>
677
+ ${c.map(C=>o`
678
+ <button
679
+ class="config-nav__item ${e.activeSection===C.key?"active":""}"
680
+ @click=${()=>e.onSectionChange(C.key)}
681
+ >
682
+ <span class="config-nav__icon">${Da(C.key)}</span>
683
+ <span class="config-nav__label">${C.label}</span>
684
+ </button>
685
+ `)}
686
+ </nav>
687
+
688
+ <!-- Mode toggle at bottom -->
689
+ <div class="config-sidebar__footer">
690
+ <div class="config-mode-toggle">
691
+ <button
692
+ class="config-mode-toggle__btn ${e.formMode==="form"?"active":""}"
693
+ ?disabled=${e.schemaLoading||!e.schema}
694
+ @click=${()=>e.onFormModeChange("form")}
695
+ >
696
+ 表单
697
+ </button>
698
+ <button
699
+ class="config-mode-toggle__btn ${e.formMode==="raw"?"active":""}"
700
+ @click=${()=>e.onFormModeChange("raw")}
701
+ >
702
+ 原始
703
+ </button>
704
+ </div>
705
+ </div>
706
+ </aside>
707
+
708
+ <!-- Main content -->
709
+ <main class="config-main">
710
+ <!-- Action bar -->
711
+ <div class="config-actions">
712
+ <div class="config-actions__left">
713
+ ${_?o`
714
+ <span class="config-changes-badge">${e.formMode==="raw"?"未保存的更改":`${w.length} 个未保存的更改`}</span>
715
+ `:o`
716
+ <span class="config-status muted">无更改</span>
717
+ `}
718
+ </div>
719
+ <div class="config-actions__right">
720
+ <button class="btn btn--sm" ?disabled=${e.loading} @click=${e.onReload}>
721
+ ${e.loading?"加载中…":"重新加载"}
722
+ </button>
723
+ <button
724
+ class="btn btn--sm primary"
725
+ ?disabled=${!P}
726
+ @click=${e.onSave}
727
+ >
728
+ ${e.saving?"保存中…":"保存"}
729
+ </button>
730
+ <button
731
+ class="btn btn--sm"
732
+ ?disabled=${!I}
733
+ @click=${e.onApply}
734
+ >
735
+ ${e.applying?"应用中…":"应用"}
736
+ </button>
737
+ <button
738
+ class="btn btn--sm"
739
+ ?disabled=${!E}
740
+ @click=${e.onUpdate}
741
+ >
742
+ ${e.updating?"更新中…":"更新"}
743
+ </button>
744
+ </div>
745
+ </div>
746
+
747
+ <!-- Diff panel (form mode only - raw mode doesn't have granular diff) -->
748
+ ${_&&e.formMode==="form"?o`
749
+ <details class="config-diff">
750
+ <summary class="config-diff__summary">
751
+ <span>查看 ${w.length} 个待处理的更改</span>
752
+ <svg class="config-diff__chevron" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
753
+ <polyline points="6 9 12 15 18 9"></polyline>
754
+ </svg>
755
+ </summary>
756
+ <div class="config-diff__content">
757
+ ${w.map(C=>o`
758
+ <div class="config-diff__item">
759
+ <div class="config-diff__path">${C.path}</div>
760
+ <div class="config-diff__values">
761
+ <span class="config-diff__from">${Ba(C.from)}</span>
762
+ <span class="config-diff__arrow">→</span>
763
+ <span class="config-diff__to">${Ba(C.to)}</span>
764
+ </div>
765
+ </div>
766
+ `)}
767
+ </div>
768
+ </details>
769
+ `:v}
770
+
771
+ ${d&&e.formMode==="form"?o`
772
+ <div class="config-section-hero">
773
+ <div class="config-section-hero__icon">${Da(e.activeSection??"")}</div>
774
+ <div class="config-section-hero__text">
775
+ <div class="config-section-hero__title">${d.label}</div>
776
+ ${d.description?o`<div class="config-section-hero__desc">${d.description}</div>`:v}
777
+ </div>
778
+ </div>
779
+ `:v}
780
+
781
+ ${h?o`
782
+ <div class="config-subnav">
783
+ <button
784
+ class="config-subnav__item ${$===null?"active":""}"
785
+ @click=${()=>e.onSubsectionChange(Oa)}
786
+ >
787
+ 全部
788
+ </button>
789
+ ${u.map(C=>o`
790
+ <button
791
+ class="config-subnav__item ${$===C.key?"active":""}"
792
+ title=${C.description||C.label}
793
+ @click=${()=>e.onSubsectionChange(C.key)}
794
+ >
795
+ ${C.label}
796
+ </button>
797
+ `)}
798
+ </div>
799
+ `:v}
800
+
801
+ <!-- Form content -->
802
+ <div class="config-content">
803
+ ${e.formMode==="form"?o`
804
+ ${e.schemaLoading?o`<div class="config-loading">
805
+ <div class="config-loading__spinner"></div>
806
+ <span>正在加载模式…</span>
807
+ </div>`:Up({schema:n.schema,uiHints:e.uiHints,value:e.formValue,disabled:e.loading||!e.formValue,unsupportedPaths:n.unsupportedPaths,onPatch:e.onFormPatch,searchQuery:e.searchQuery,activeSection:e.activeSection,activeSubsection:$})}
808
+ ${s?o`<div class="callout danger" style="margin-top: 12px;">
809
+ 表单视图无法安全编辑某些字段。
810
+ 使用原始模式以避免丢失配置项。
811
+ </div>`:v}
812
+ `:o`
813
+ <label class="field config-raw-field">
814
+ <span>原始JSON5</span>
815
+ <textarea
816
+ .value=${e.raw}
817
+ @input=${C=>e.onRawChange(C.target.value)}
818
+ ></textarea>
819
+ </label>
820
+ `}
821
+ </div>
822
+
823
+ ${e.issues.length>0?o`<div class="callout danger" style="margin-top: 12px;">
824
+ <pre class="code-block">${JSON.stringify(e.issues,null,2)}</pre>
825
+ </div>`:v}
826
+ </main>
827
+ </div>
828
+ `}function Gp(e){if(!e&&e!==0)return"n/a";const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);return n<60?`${n}m`:`${Math.round(n/60)}h`}function Qp(e,t){const n=t.snapshot,s=n?.channels;if(!n||!s)return!1;const i=s[e],a=typeof i?.configured=="boolean"&&i.configured,r=typeof i?.running=="boolean"&&i.running,l=typeof i?.connected=="boolean"&&i.connected,p=(n.channelAccounts?.[e]??[]).some(d=>d.configured||d.running||d.connected);return a||r||l||p}function Yp(e,t){return t?.[e]?.length??0}function fo(e,t){const n=Yp(e,t);return n<2?v:o`<div class="account-count">账户 (${n})</div>`}function Zp(e,t){let n=e;for(const s of t){if(!n)return null;const i=ue(n);if(i==="object"){const a=n.properties??{};if(typeof s=="string"&&a[s]){n=a[s];continue}const r=n.additionalProperties;if(typeof s=="string"&&r&&typeof r=="object"){n=r;continue}return null}if(i==="array"){if(typeof s!="number")return null;n=(Array.isArray(n.items)?n.items[0]:n.items)??null;continue}return null}return n}function Xp(e,t){const s=(e.channels??{})[t],i=e[t];return(s&&typeof s=="object"?s:null)??(i&&typeof i=="object"?i:null)??{}}function Jp(e){const t=po(e.schema),n=t.schema;if(!n)return o`<div class="callout danger">模式不可用。请使用原始模式。</div>`;const s=Zp(n,["channels",e.channelId]);if(!s)return o`<div class="callout danger">通道配置模式不可用。</div>`;const i=e.configValue??{},a=Xp(i,e.channelId);return o`
829
+ <div class="config-form">
830
+ ${be({schema:s,value:a,path:["channels",e.channelId],hints:e.uiHints,unsupported:new Set(t.unsupportedPaths),disabled:e.disabled,showLabel:!1,onPatch:e.onPatch})}
831
+ </div>
832
+ `}function we(e){const{channelId:t,props:n}=e,s=n.configSaving||n.configSchemaLoading;return o`
833
+ <div style="margin-top: 16px;">
834
+ ${n.configSchemaLoading?o`<div class="muted">正在加载配置模式…</div>`:Jp({channelId:t,configValue:n.configForm,schema:n.configSchema,uiHints:n.configUiHints,disabled:s,onPatch:n.onConfigPatch})}
835
+ <div class="row" style="margin-top: 12px;">
836
+ <button
837
+ class="btn primary"
838
+ ?disabled=${s||!n.configFormDirty}
839
+ @click=${()=>n.onConfigSave()}
840
+ >
841
+ ${n.configSaving?"保存中…":"保存"}
842
+ </button>
843
+ <button
844
+ class="btn"
845
+ ?disabled=${s}
846
+ @click=${()=>n.onConfigReload()}
847
+ >
848
+ 重新加载
849
+ </button>
850
+ </div>
851
+ </div>
852
+ `}function ef(e){const{props:t,discord:n,accountCountLabel:s}=e;return o`
853
+ <div class="card">
854
+ <div class="card-title">Discord</div>
855
+ <div class="card-sub">机器人状态和频道配置。</div>
856
+ ${s}
857
+
858
+ <div class="status-list" style="margin-top: 16px;">
859
+ <div>
860
+ <span class="label">已配置</span>
861
+ <span>${n?.configured?"是":"否"}</span>
862
+ </div>
863
+ <div>
864
+ <span class="label">运行中</span>
865
+ <span>${n?.running?"是":"否"}</span>
866
+ </div>
867
+ <div>
868
+ <span class="label">最后启动</span>
869
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
870
+ </div>
871
+ <div>
872
+ <span class="label">最后探测</span>
873
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
874
+ </div>
875
+ </div>
876
+
877
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
878
+ ${n.lastError}
879
+ </div>`:v}
880
+
881
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
882
+ 探测 ${n.probe.ok?"成功":"失败"} ·
883
+ ${n.probe.status??""} ${n.probe.error??""}
884
+ </div>`:v}
885
+
886
+ ${we({channelId:"discord",props:t})}
887
+
888
+ <div class="row" style="margin-top: 12px;">
889
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
890
+ 探测
891
+ </button>
892
+ </div>
893
+ </div>
894
+ `}function tf(e){const{props:t,googleChat:n,accountCountLabel:s}=e;return o`
895
+ <div class="card">
896
+ <div class="card-title">Google Chat</div>
897
+ <div class="card-sub">Chat API webhook 状态和频道配置。</div>
898
+ ${s}
899
+
900
+ <div class="status-list" style="margin-top: 16px;">
901
+ <div>
902
+ <span class="label">已配置</span>
903
+ <span>${n?n.configured?"是":"否":"无"}</span>
904
+ </div>
905
+ <div>
906
+ <span class="label">运行中</span>
907
+ <span>${n?n.running?"是":"否":"无"}</span>
908
+ </div>
909
+ <div>
910
+ <span class="label">凭证</span>
911
+ <span>${n?.credentialSource??"无"}</span>
912
+ </div>
913
+ <div>
914
+ <span class="label">受众</span>
915
+ <span>
916
+ ${n?.audienceType?`${n.audienceType}${n.audience?` · ${n.audience}`:""}`:"无"}
917
+ </span>
918
+ </div>
919
+ <div>
920
+ <span class="label">最后启动</span>
921
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
922
+ </div>
923
+ <div>
924
+ <span class="label">最后探测</span>
925
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
926
+ </div>
927
+ </div>
928
+
929
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
930
+ ${n.lastError}
931
+ </div>`:v}
932
+
933
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
934
+ 探测 ${n.probe.ok?"成功":"失败"} ·
935
+ ${n.probe.status??""} ${n.probe.error??""}
936
+ </div>`:v}
937
+
938
+ ${we({channelId:"googlechat",props:t})}
939
+
940
+ <div class="row" style="margin-top: 12px;">
941
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
942
+ 探测
943
+ </button>
944
+ </div>
945
+ </div>
946
+ `}function nf(e){const{props:t,imessage:n,accountCountLabel:s}=e;return o`
947
+ <div class="card">
948
+ <div class="card-title">iMessage</div>
949
+ <div class="card-sub">macOS 桥接状态和频道配置。</div>
950
+ ${s}
951
+
952
+ <div class="status-list" style="margin-top: 16px;">
953
+ <div>
954
+ <span class="label">已配置</span>
955
+ <span>${n?.configured?"是":"否"}</span>
956
+ </div>
957
+ <div>
958
+ <span class="label">运行中</span>
959
+ <span>${n?.running?"是":"否"}</span>
960
+ </div>
961
+ <div>
962
+ <span class="label">最后启动</span>
963
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
964
+ </div>
965
+ <div>
966
+ <span class="label">最后探测</span>
967
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
968
+ </div>
969
+ </div>
970
+
971
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
972
+ ${n.lastError}
973
+ </div>`:v}
974
+
975
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
976
+ 探测 ${n.probe.ok?"成功":"失败"} ·
977
+ ${n.probe.error??""}
978
+ </div>`:v}
979
+
980
+ ${we({channelId:"imessage",props:t})}
981
+
982
+ <div class="row" style="margin-top: 12px;">
983
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
984
+ 探测
985
+ </button>
986
+ </div>
987
+ </div>
988
+ `}function sf(e){const{values:t,original:n}=e;return t.name!==n.name||t.displayName!==n.displayName||t.about!==n.about||t.picture!==n.picture||t.banner!==n.banner||t.website!==n.website||t.nip05!==n.nip05||t.lud16!==n.lud16}function af(e){const{state:t,callbacks:n,accountId:s}=e,i=sf(t),a=(l,c,p={})=>{const{type:d="text",placeholder:u,maxLength:h,help:g}=p,$=t.values[l]??"",w=t.fieldErrors[l],A=`nostr-profile-${l}`;return d==="textarea"?o`
989
+ <div class="form-field" style="margin-bottom: 12px;">
990
+ <label for="${A}" style="display: block; margin-bottom: 4px; font-weight: 500;">
991
+ ${c}
992
+ </label>
993
+ <textarea
994
+ id="${A}"
995
+ .value=${$}
996
+ placeholder=${u??""}
997
+ maxlength=${h??2e3}
998
+ rows="3"
999
+ style="width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px; resize: vertical; font-family: inherit;"
1000
+ @input=${_=>{const M=_.target;n.onFieldChange(l,M.value)}}
1001
+ ?disabled=${t.saving}
1002
+ ></textarea>
1003
+ ${g?o`<div style="font-size: 12px; color: var(--text-muted); margin-top: 2px;">${g}</div>`:v}
1004
+ ${w?o`<div style="font-size: 12px; color: var(--danger-color); margin-top: 2px;">${w}</div>`:v}
1005
+ </div>
1006
+ `:o`
1007
+ <div class="form-field" style="margin-bottom: 12px;">
1008
+ <label for="${A}" style="display: block; margin-bottom: 4px; font-weight: 500;">
1009
+ ${c}
1010
+ </label>
1011
+ <input
1012
+ id="${A}"
1013
+ type=${d}
1014
+ .value=${$}
1015
+ placeholder=${u??""}
1016
+ maxlength=${h??256}
1017
+ style="width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px;"
1018
+ @input=${_=>{const M=_.target;n.onFieldChange(l,M.value)}}
1019
+ ?disabled=${t.saving}
1020
+ />
1021
+ ${g?o`<div style="font-size: 12px; color: var(--text-muted); margin-top: 2px;">${g}</div>`:v}
1022
+ ${w?o`<div style="font-size: 12px; color: var(--danger-color); margin-top: 2px;">${w}</div>`:v}
1023
+ </div>
1024
+ `},r=()=>{const l=t.values.picture;return l?o`
1025
+ <div style="margin-bottom: 12px;">
1026
+ <img
1027
+ src=${l}
1028
+ alt="Profile picture preview"
1029
+ style="max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
1030
+ @error=${c=>{const p=c.target;p.style.display="none"}}
1031
+ @load=${c=>{const p=c.target;p.style.display="block"}}
1032
+ />
1033
+ </div>
1034
+ `:v};return o`
1035
+ <div class="nostr-profile-form" style="padding: 16px; background: var(--bg-secondary); border-radius: 8px; margin-top: 12px;">
1036
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;">
1037
+ <div style="font-weight: 600; font-size: 16px;">编辑资料</div>
1038
+ <div style="font-size: 12px; color: var(--text-muted);">账户: ${s}</div>
1039
+ </div>
1040
+
1041
+ ${t.error?o`<div class="callout danger" style="margin-bottom: 12px;">${t.error}</div>`:v}
1042
+
1043
+ ${t.success?o`<div class="callout success" style="margin-bottom: 12px;">${t.success}</div>`:v}
1044
+
1045
+ ${r()}
1046
+
1047
+ ${a("name","用户名",{placeholder:"satoshi",maxLength:256,help:"短用户名(例如:satoshi)"})}
1048
+
1049
+ ${a("displayName","显示名称",{placeholder:"Satoshi Nakamoto",maxLength:256,help:"您的完整显示名称"})}
1050
+
1051
+ ${a("about","简介",{type:"textarea",placeholder:"向别人介绍自己...",maxLength:2e3,help:"简短的个人简介或描述"})}
1052
+
1053
+ ${a("picture","头像URL",{type:"url",placeholder:"https://example.com/avatar.jpg",help:"您头像图片的HTTPS URL"})}
1054
+
1055
+ ${t.showAdvanced?o`
1056
+ <div style="border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;">
1057
+ <div style="font-weight: 500; margin-bottom: 12px; color: var(--text-muted);">高级选项</div>
1058
+
1059
+ ${a("banner","横幅URL",{type:"url",placeholder:"https://example.com/banner.jpg",help:"横幅图片的HTTPS URL"})}
1060
+
1061
+ ${a("website","网站",{type:"url",placeholder:"https://example.com",help:"您的个人网站"})}
1062
+
1063
+ ${a("nip05","NIP-05 标识",{placeholder:"you@example.com",help:"可验证的标识符(例如:you@domain.com)"})}
1064
+
1065
+ ${a("lud16","闪电网络地址",{placeholder:"you@getalby.com",help:"用于打赏的闪电网络地址(LUD-16)"})}
1066
+ </div>
1067
+ `:v}
1068
+
1069
+ <div style="display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap;">
1070
+ <button
1071
+ class="btn primary"
1072
+ @click=${n.onSave}
1073
+ ?disabled=${t.saving||!i}
1074
+ >
1075
+ ${t.saving?"保存中...":"保存并发布"}
1076
+ </button>
1077
+
1078
+ <button
1079
+ class="btn"
1080
+ @click=${n.onImport}
1081
+ ?disabled=${t.importing||t.saving}
1082
+ >
1083
+ ${t.importing?"导入中...":"从转发器导入"}
1084
+ </button>
1085
+
1086
+ <button
1087
+ class="btn"
1088
+ @click=${n.onToggleAdvanced}
1089
+ >
1090
+ ${t.showAdvanced?"隐藏高级选项":"显示高级选项"}
1091
+ </button>
1092
+
1093
+ <button
1094
+ class="btn"
1095
+ @click=${n.onCancel}
1096
+ ?disabled=${t.saving}
1097
+ >
1098
+ 取消
1099
+ </button>
1100
+ </div>
1101
+
1102
+ ${i?o`<div style="font-size: 12px; color: var(--warning-color); margin-top: 8px;">
1103
+ 您有未保存的更改
1104
+ </div>`:v}
1105
+ </div>
1106
+ `}function rf(e){const t={name:e?.name??"",displayName:e?.displayName??"",about:e?.about??"",picture:e?.picture??"",banner:e?.banner??"",website:e?.website??"",nip05:e?.nip05??"",lud16:e?.lud16??""};return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}function Fa(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:"无"}function of(e){const{props:t,nostr:n,nostrAccounts:s,accountCountLabel:i,profileFormState:a,profileFormCallbacks:r,onEditProfile:l}=e,c=s[0],p=n?.configured??c?.configured??!1,d=n?.running??c?.running??!1,u=n?.publicKey??c?.publicKey,h=n?.lastStartAt??c?.lastStartAt??null,g=n?.lastError??c?.lastError??null,$=s.length>1,w=a!=null,A=M=>{const P=M.publicKey,I=M.profile,E=I?.displayName??I?.name??M.name??M.accountId;return o`
1107
+ <div class="account-card">
1108
+ <div class="account-card-header">
1109
+ <div class="account-card-title">${E}</div>
1110
+ <div class="account-card-id">${M.accountId}</div>
1111
+ </div>
1112
+ <div class="status-list account-card-status">
1113
+ <div>
1114
+ <span class="label">运行中</span>
1115
+ <span>${M.running?"是":"否"}</span>
1116
+ </div>
1117
+ <div>
1118
+ <span class="label">已配置</span>
1119
+ <span>${M.configured?"是":"否"}</span>
1120
+ </div>
1121
+ <div>
1122
+ <span class="label">公钥</span>
1123
+ <span class="monospace" title="${P??""}">${Fa(P)}</span>
1124
+ </div>
1125
+ <div>
1126
+ <span class="label">最后入站</span>
1127
+ <span>${M.lastInboundAt?O(M.lastInboundAt):"无"}</span>
1128
+ </div>
1129
+ ${M.lastError?o`
1130
+ <div class="account-card-error">${M.lastError}</div>
1131
+ `:v}
1132
+ </div>
1133
+ </div>
1134
+ `},_=()=>{if(w&&r)return af({state:a,callbacks:r,accountId:s[0]?.accountId??"default"});const M=c?.profile??n?.profile,{name:P,displayName:I,about:E,picture:C,nip05:pe}=M??{},bn=P||I||E||C||pe;return o`
1135
+ <div style="margin-top: 16px; padding: 12px; background: var(--bg-secondary); border-radius: 8px;">
1136
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
1137
+ <div style="font-weight: 500;">资料</div>
1138
+ ${p?o`
1139
+ <button
1140
+ class="btn btn-sm"
1141
+ @click=${l}
1142
+ style="font-size: 12px; padding: 4px 8px;"
1143
+ >
1144
+ 编辑资料
1145
+ </button>
1146
+ `:v}
1147
+ </div>
1148
+ ${bn?o`
1149
+ <div class="status-list">
1150
+ ${C?o`
1151
+ <div style="margin-bottom: 8px;">
1152
+ <img
1153
+ src=${C}
1154
+ alt="Profile picture"
1155
+ style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);"
1156
+ @error=${$n=>{$n.target.style.display="none"}}
1157
+ />
1158
+ </div>
1159
+ `:v}
1160
+ ${P?o`<div><span class="label">姓名</span><span>${P}</span></div>`:v}
1161
+ ${I?o`<div><span class="label">显示名称</span><span>${I}</span></div>`:v}
1162
+ ${E?o`<div><span class="label">关于</span><span style="max-width: 300px; overflow: hidden; text-overflow: ellipsis;">${E}</span></div>`:v}
1163
+ ${pe?o`<div><span class="label">NIP-05</span><span>${pe}</span></div>`:v}
1164
+ </div>
1165
+ `:o`
1166
+ <div style="color: var(--text-muted); font-size: 13px;">
1167
+ 未设置资料。点击"编辑资料"来添加您的姓名、简介和头像。
1168
+ </div>
1169
+ `}
1170
+ </div>
1171
+ `};return o`
1172
+ <div class="card">
1173
+ <div class="card-title">Nostr</div>
1174
+ <div class="card-sub">通过 Nostr 中继(NIP-04)的去中心化私信。</div>
1175
+ ${i}
1176
+
1177
+ ${$?o`
1178
+ <div class="account-card-list">
1179
+ ${s.map(M=>A(M))}
1180
+ </div>
1181
+ `:o`
1182
+ <div class="status-list" style="margin-top: 16px;">
1183
+ <div>
1184
+ <span class="label">已配置</span>
1185
+ <span>${p?"是":"否"}</span>
1186
+ </div>
1187
+ <div>
1188
+ <span class="label">运行中</span>
1189
+ <span>${d?"是":"否"}</span>
1190
+ </div>
1191
+ <div>
1192
+ <span class="label">公钥</span>
1193
+ <span class="monospace" title="${u??""}"
1194
+ >${Fa(u)}</span
1195
+ >
1196
+ </div>
1197
+ <div>
1198
+ <span class="label">最后启动</span>
1199
+ <span>${h?O(h):"无"}</span>
1200
+ </div>
1201
+ </div>
1202
+ `}
1203
+
1204
+ ${g?o`<div class="callout danger" style="margin-top: 12px;">${g}</div>`:v}
1205
+
1206
+ ${_()}
1207
+
1208
+ ${we({channelId:"nostr",props:t})}
1209
+
1210
+ <div class="row" style="margin-top: 12px;">
1211
+ <button class="btn" @click=${()=>t.onRefresh(!1)}>刷新</button>
1212
+ </div>
1213
+ </div>
1214
+ `}function lf(e){const{props:t,signal:n,accountCountLabel:s}=e;return o`
1215
+ <div class="card">
1216
+ <div class="card-title">Signal</div>
1217
+ <div class="card-sub">signal-cli 状态和频道配置。</div>
1218
+ ${s}
1219
+
1220
+ <div class="status-list" style="margin-top: 16px;">
1221
+ <div>
1222
+ <span class="label">已配置</span>
1223
+ <span>${n?.configured?"是":"否"}</span>
1224
+ </div>
1225
+ <div>
1226
+ <span class="label">运行中</span>
1227
+ <span>${n?.running?"是":"否"}</span>
1228
+ </div>
1229
+ <div>
1230
+ <span class="label">基础URL</span>
1231
+ <span>${n?.baseUrl??"无"}</span>
1232
+ </div>
1233
+ <div>
1234
+ <span class="label">最后启动</span>
1235
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
1236
+ </div>
1237
+ <div>
1238
+ <span class="label">最后探测</span>
1239
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
1240
+ </div>
1241
+ </div>
1242
+
1243
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1244
+ ${n.lastError}
1245
+ </div>`:v}
1246
+
1247
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
1248
+ 探测 ${n.probe.ok?"成功":"失败"} ·
1249
+ ${n.probe.status??""} ${n.probe.error??""}
1250
+ </div>`:v}
1251
+
1252
+ ${we({channelId:"signal",props:t})}
1253
+
1254
+ <div class="row" style="margin-top: 12px;">
1255
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
1256
+ 探测
1257
+ </button>
1258
+ </div>
1259
+ </div>
1260
+ `}function cf(e){const{props:t,slack:n,accountCountLabel:s}=e;return o`
1261
+ <div class="card">
1262
+ <div class="card-title">Slack</div>
1263
+ <div class="card-sub">套接字模式状态和频道配置。</div>
1264
+ ${s}
1265
+
1266
+ <div class="status-list" style="margin-top: 16px;">
1267
+ <div>
1268
+ <span class="label">已配置</span>
1269
+ <span>${n?.configured?"是":"否"}</span>
1270
+ </div>
1271
+ <div>
1272
+ <span class="label">运行中</span>
1273
+ <span>${n?.running?"是":"否"}</span>
1274
+ </div>
1275
+ <div>
1276
+ <span class="label">最后启动</span>
1277
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
1278
+ </div>
1279
+ <div>
1280
+ <span class="label">最后探测</span>
1281
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
1282
+ </div>
1283
+ </div>
1284
+
1285
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1286
+ ${n.lastError}
1287
+ </div>`:v}
1288
+
1289
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
1290
+ 探测 ${n.probe.ok?"成功":"失败"} ·
1291
+ ${n.probe.status??""} ${n.probe.error??""}
1292
+ </div>`:v}
1293
+
1294
+ ${we({channelId:"slack",props:t})}
1295
+
1296
+ <div class="row" style="margin-top: 12px;">
1297
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
1298
+ 探测
1299
+ </button>
1300
+ </div>
1301
+ </div>
1302
+ `}function df(e){const{props:t,telegram:n,telegramAccounts:s,accountCountLabel:i}=e,a=s.length>1,r=l=>{const p=l.probe?.bot?.username,d=l.name||l.accountId;return o`
1303
+ <div class="account-card">
1304
+ <div class="account-card-header">
1305
+ <div class="account-card-title">
1306
+ ${p?`@${p}`:d}
1307
+ </div>
1308
+ <div class="account-card-id">${l.accountId}</div>
1309
+ </div>
1310
+ <div class="status-list account-card-status">
1311
+ <div>
1312
+ <span class="label">运行中</span>
1313
+ <span>${l.running?"是":"否"}</span>
1314
+ </div>
1315
+ <div>
1316
+ <span class="label">已配置</span>
1317
+ <span>${l.configured?"是":"否"}</span>
1318
+ </div>
1319
+ <div>
1320
+ <span class="label">最后入站</span>
1321
+ <span>${l.lastInboundAt?O(l.lastInboundAt):"无"}</span>
1322
+ </div>
1323
+ ${l.lastError?o`
1324
+ <div class="account-card-error">
1325
+ ${l.lastError}
1326
+ </div>
1327
+ `:v}
1328
+ </div>
1329
+ </div>
1330
+ `};return o`
1331
+ <div class="card">
1332
+ <div class="card-title">Telegram</div>
1333
+ <div class="card-sub">机器人状态和频道配置。</div>
1334
+ ${i}
1335
+
1336
+ ${a?o`
1337
+ <div class="account-card-list">
1338
+ ${s.map(l=>r(l))}
1339
+ </div>
1340
+ `:o`
1341
+ <div class="status-list" style="margin-top: 16px;">
1342
+ <div>
1343
+ <span class="label">已配置</span>
1344
+ <span>${n?.configured?"是":"否"}</span>
1345
+ </div>
1346
+ <div>
1347
+ <span class="label">运行中</span>
1348
+ <span>${n?.running?"是":"否"}</span>
1349
+ </div>
1350
+ <div>
1351
+ <span class="label">模式</span>
1352
+ <span>${n?.mode??"无"}</span>
1353
+ </div>
1354
+ <div>
1355
+ <span class="label">最后启动</span>
1356
+ <span>${n?.lastStartAt?O(n.lastStartAt):"无"}</span>
1357
+ </div>
1358
+ <div>
1359
+ <span class="label">最后探测</span>
1360
+ <span>${n?.lastProbeAt?O(n.lastProbeAt):"无"}</span>
1361
+ </div>
1362
+ </div>
1363
+ `}
1364
+
1365
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1366
+ ${n.lastError}
1367
+ </div>`:v}
1368
+
1369
+ ${n?.probe?o`<div class="callout" style="margin-top: 12px;">
1370
+ 探测 ${n.probe.ok?"成功":"失败"} ·
1371
+ ${n.probe.status??""} ${n.probe.error??""}
1372
+ </div>`:v}
1373
+
1374
+ ${we({channelId:"telegram",props:t})}
1375
+
1376
+ <div class="row" style="margin-top: 12px;">
1377
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
1378
+ 探测
1379
+ </button>
1380
+ </div>
1381
+ </div>
1382
+ `}function uf(e){const{props:t,whatsapp:n,accountCountLabel:s}=e;return o`
1383
+ <div class="card">
1384
+ <div class="card-title">WhatsApp</div>
1385
+ <div class="card-sub">链接 WhatsApp Web 并监控连接健康状况。</div>
1386
+ ${s}
1387
+
1388
+ <div class="status-list" style="margin-top: 16px;">
1389
+ <div>
1390
+ <span class="label">已配置</span>
1391
+ <span>${n?.configured?"是":"否"}</span>
1392
+ </div>
1393
+ <div>
1394
+ <span class="label">已链接</span>
1395
+ <span>${n?.linked?"是":"否"}</span>
1396
+ </div>
1397
+ <div>
1398
+ <span class="label">运行中</span>
1399
+ <span>${n?.running?"是":"否"}</span>
1400
+ </div>
1401
+ <div>
1402
+ <span class="label">已连接</span>
1403
+ <span>${n?.connected?"是":"否"}</span>
1404
+ </div>
1405
+ <div>
1406
+ <span class="label">最后连接</span>
1407
+ <span>
1408
+ ${n?.lastConnectedAt?O(n.lastConnectedAt):"无"}
1409
+ </span>
1410
+ </div>
1411
+ <div>
1412
+ <span class="label">最后消息</span>
1413
+ <span>
1414
+ ${n?.lastMessageAt?O(n.lastMessageAt):"无"}
1415
+ </span>
1416
+ </div>
1417
+ <div>
1418
+ <span class="label">认证时长</span>
1419
+ <span>
1420
+ ${n?.authAgeMs!=null?Gp(n.authAgeMs):"无"}
1421
+ </span>
1422
+ </div>
1423
+ </div>
1424
+
1425
+ ${n?.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1426
+ ${n.lastError}
1427
+ </div>`:v}
1428
+
1429
+ ${t.whatsappMessage?o`<div class="callout" style="margin-top: 12px;">
1430
+ ${t.whatsappMessage}
1431
+ </div>`:v}
1432
+
1433
+ ${t.whatsappQrDataUrl?o`<div class="qr-wrap">
1434
+ <img src=${t.whatsappQrDataUrl} alt="WhatsApp QR" />
1435
+ </div>`:v}
1436
+
1437
+ <div class="row" style="margin-top: 14px; flex-wrap: wrap;">
1438
+ <button
1439
+ class="btn primary"
1440
+ ?disabled=${t.whatsappBusy}
1441
+ @click=${()=>t.onWhatsAppStart(!1)}
1442
+ >
1443
+ ${t.whatsappBusy?"工作中…":"显示二维码"}
1444
+ </button>
1445
+ <button
1446
+ class="btn"
1447
+ ?disabled=${t.whatsappBusy}
1448
+ @click=${()=>t.onWhatsAppStart(!0)}
1449
+ >
1450
+ 重新链接
1451
+ </button>
1452
+ <button
1453
+ class="btn"
1454
+ ?disabled=${t.whatsappBusy}
1455
+ @click=${()=>t.onWhatsAppWait()}
1456
+ >
1457
+ 等待扫描
1458
+ </button>
1459
+ <button
1460
+ class="btn danger"
1461
+ ?disabled=${t.whatsappBusy}
1462
+ @click=${()=>t.onWhatsAppLogout()}
1463
+ >
1464
+ 登出
1465
+ </button>
1466
+ <button class="btn" @click=${()=>t.onRefresh(!0)}>
1467
+ 刷新
1468
+ </button>
1469
+ </div>
1470
+
1471
+ ${we({channelId:"whatsapp",props:t})}
1472
+ </div>
1473
+ `}function pf(e){const t=e.snapshot?.channels,n=t?.whatsapp??void 0,s=t?.telegram??void 0,i=t?.discord??null,a=t?.googlechat??null,r=t?.slack??null,l=t?.signal??null,c=t?.imessage??null,p=t?.nostr??null,u=ff(e.snapshot).map((h,g)=>({key:h,enabled:Qp(h,e),order:g})).sort((h,g)=>h.enabled!==g.enabled?h.enabled?-1:1:h.order-g.order);return o`
1474
+ <section class="grid grid-cols-2">
1475
+ ${u.map(h=>hf(h.key,e,{whatsapp:n,telegram:s,discord:i,googlechat:a,slack:r,signal:l,imessage:c,nostr:p,channelAccounts:e.snapshot?.channelAccounts??null}))}
1476
+ </section>
1477
+
1478
+ <section class="card" style="margin-top: 18px;">
1479
+ <div class="row" style="justify-content: space-between;">
1480
+ <div>
1481
+ <div class="card-title">通道健康状况</div>
1482
+ <div class="card-sub">来自网关的通道状态快照。</div>
1483
+ </div>
1484
+ <div class="muted">${e.lastSuccessAt?O(e.lastSuccessAt):"无"}</div>
1485
+ </div>
1486
+ ${e.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1487
+ ${e.lastError}
1488
+ </div>`:v}
1489
+ <pre class="code-block" style="margin-top: 12px;">
1490
+ ${e.snapshot?JSON.stringify(e.snapshot,null,2):"暂无快照。"}
1491
+ </pre>
1492
+ </section>
1493
+ `}function ff(e){return e?.channelMeta?.length?e.channelMeta.map(t=>t.id):e?.channelOrder?.length?e.channelOrder:["whatsapp","telegram","discord","googlechat","slack","signal","imessage","nostr"]}function hf(e,t,n){const s=fo(e,n.channelAccounts);switch(e){case"whatsapp":return uf({props:t,whatsapp:n.whatsapp,accountCountLabel:s});case"telegram":return df({props:t,telegram:n.telegram,telegramAccounts:n.channelAccounts?.telegram??[],accountCountLabel:s});case"discord":return ef({props:t,discord:n.discord,accountCountLabel:s});case"googlechat":return tf({props:t,googleChat:n.googlechat,accountCountLabel:s});case"slack":return cf({props:t,slack:n.slack,accountCountLabel:s});case"signal":return lf({props:t,signal:n.signal,accountCountLabel:s});case"imessage":return nf({props:t,imessage:n.imessage,accountCountLabel:s});case"nostr":{const i=n.channelAccounts?.nostr??[],a=i[0],r=a?.accountId??"default",l=a?.profile??null,c=t.nostrProfileAccountId===r?t.nostrProfileFormState:null,p=c?{onFieldChange:t.onNostrProfileFieldChange,onSave:t.onNostrProfileSave,onImport:t.onNostrProfileImport,onCancel:t.onNostrProfileCancel,onToggleAdvanced:t.onNostrProfileToggleAdvanced}:null;return of({props:t,nostr:n.nostr,nostrAccounts:i,accountCountLabel:s,profileFormState:c,profileFormCallbacks:p,onEditProfile:()=>t.onNostrProfileEdit(r,l)})}default:return gf(e,t,n.channelAccounts??{})}}function gf(e,t,n){const s=mf(t.snapshot,e),i=t.snapshot?.channels?.[e],a=typeof i?.configured=="boolean"?i.configured:void 0,r=typeof i?.running=="boolean"?i.running:void 0,l=typeof i?.connected=="boolean"?i.connected:void 0,c=typeof i?.lastError=="string"?i.lastError:void 0,p=n[e]??[],d=fo(e,n);return o`
1494
+ <div class="card">
1495
+ <div class="card-title">${s}</div>
1496
+ <div class="card-sub">通道状态和配置。</div>
1497
+ ${d}
1498
+
1499
+ ${p.length>0?o`
1500
+ <div class="account-card-list">
1501
+ ${p.map(u=>wf(u))}
1502
+ </div>
1503
+ `:o`
1504
+ <div class="status-list" style="margin-top: 16px;">
1505
+ <div>
1506
+ <span class="label">已配置</span>
1507
+ <span>${a==null?"无":a?"是":"否"}</span>
1508
+ </div>
1509
+ <div>
1510
+ <span class="label">运行中</span>
1511
+ <span>${r==null?"无":r?"是":"否"}</span>
1512
+ </div>
1513
+ <div>
1514
+ <span class="label">已连接</span>
1515
+ <span>${l==null?"无":l?"是":"否"}</span>
1516
+ </div>
1517
+ </div>
1518
+ `}
1519
+
1520
+ ${c?o`<div class="callout danger" style="margin-top: 12px;">
1521
+ ${c}
1522
+ </div>`:v}
1523
+
1524
+ ${we({channelId:e,props:t})}
1525
+ </div>
1526
+ `}function vf(e){return e?.channelMeta?.length?Object.fromEntries(e.channelMeta.map(t=>[t.id,t])):{}}function mf(e,t){return vf(e)[t]?.label??e?.channelLabels?.[t]??t}const yf=600*1e3;function ho(e){return e.lastInboundAt?Date.now()-e.lastInboundAt<yf:!1}function bf(e){return e.running?"是":ho(e)?"活跃":"否"}function $f(e){return e.connected===!0?"是":e.connected===!1?"否":ho(e)?"活跃":"无"}function wf(e){const t=bf(e),n=$f(e);return o`
1527
+ <div class="account-card">
1528
+ <div class="account-card-header">
1529
+ <div class="account-card-title">${e.name||e.accountId}</div>
1530
+ <div class="account-card-id">${e.accountId}</div>
1531
+ </div>
1532
+ <div class="status-list account-card-status">
1533
+ <div>
1534
+ <span class="label">运行中</span>
1535
+ <span>${t}</span>
1536
+ </div>
1537
+ <div>
1538
+ <span class="label">已配置</span>
1539
+ <span>${e.configured?"是":"否"}</span>
1540
+ </div>
1541
+ <div>
1542
+ <span class="label">已连接</span>
1543
+ <span>${n}</span>
1544
+ </div>
1545
+ <div>
1546
+ <span class="label">最后入站</span>
1547
+ <span>${e.lastInboundAt?O(e.lastInboundAt):"无"}</span>
1548
+ </div>
1549
+ ${e.lastError?o`
1550
+ <div class="account-card-error">
1551
+ ${e.lastError}
1552
+ </div>
1553
+ `:v}
1554
+ </div>
1555
+ </div>
1556
+ `}function xf(e){const t=e.host??"unknown",n=e.ip?`(${e.ip})`:"",s=e.mode??"",i=e.version??"";return`${t} ${n} ${s} ${i}`.trim()}function Af(e){const t=e.ts??null;return t?O(t):"n/a"}function go(e){return e?`${kt(e)} (${O(e)})`:"n/a"}function kf(e){if(e.totalTokens==null)return"n/a";const t=e.totalTokens??0,n=e.contextTokens??0;return n?`${t} / ${n}`:String(t)}function Sf(e){if(e==null)return"";try{return JSON.stringify(e,null,2)}catch{return String(e)}}function _f(e){const t=e.state??{},n=t.nextRunAtMs?kt(t.nextRunAtMs):"n/a",s=t.lastRunAtMs?kt(t.lastRunAtMs):"n/a";return`${t.lastStatus??"n/a"} · next ${n} · last ${s}`}function Tf(e){const t=e.schedule;return t.kind==="at"?`At ${kt(t.atMs)}`:t.kind==="every"?`Every ${ir(t.everyMs)}`:`Cron ${t.expr}${t.tz?` (${t.tz})`:""}`}function Ef(e){const t=e.payload;return t.kind==="systemEvent"?`System: ${t.text}`:`Agent: ${t.message}`}function Cf(e){const t=["last",...e.channels.filter(Boolean)],n=e.form.channel?.trim();n&&!t.includes(n)&&t.push(n);const s=new Set;return t.filter(i=>s.has(i)?!1:(s.add(i),!0))}function If(e,t){if(t==="last")return"last";const n=e.channelMeta?.find(s=>s.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function Mf(e){const t=Cf(e);return o`
1557
+ <section class="grid grid-cols-2">
1558
+ <div class="card">
1559
+ <div class="card-title">调度器</div>
1560
+ <div class="card-sub">网关拥有的定时任务调度器状态。</div>
1561
+ <div class="stat-grid" style="margin-top: 16px;">
1562
+ <div class="stat">
1563
+ <div class="stat-label">已启用</div>
1564
+ <div class="stat-value">
1565
+ ${e.status?e.status.enabled?"是":"否":"无"}
1566
+ </div>
1567
+ </div>
1568
+ <div class="stat">
1569
+ <div class="stat-label">任务</div>
1570
+ <div class="stat-value">${e.status?.jobs??"无"}</div>
1571
+ </div>
1572
+ <div class="stat">
1573
+ <div class="stat-label">下次唤醒</div>
1574
+ <div class="stat-value">${go(e.status?.nextWakeAtMs??null)}</div>
1575
+ </div>
1576
+ </div>
1577
+ <div class="row" style="margin-top: 12px;">
1578
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
1579
+ ${e.loading?"刷新中…":"刷新"}
1580
+ </button>
1581
+ ${e.error?o`<span class="muted">${e.error}</span>`:v}
1582
+ </div>
1583
+ </div>
1584
+
1585
+ <div class="card">
1586
+ <div class="card-title">新建任务</div>
1587
+ <div class="card-sub">创建一个定时唤醒或代理运行。</div>
1588
+ <div class="form-grid" style="margin-top: 16px;">
1589
+ <label class="field">
1590
+ <span>名称</span>
1591
+ <input
1592
+ .value=${e.form.name}
1593
+ @input=${n=>e.onFormChange({name:n.target.value})}
1594
+ />
1595
+ </label>
1596
+ <label class="field">
1597
+ <span>描述</span>
1598
+ <input
1599
+ .value=${e.form.description}
1600
+ @input=${n=>e.onFormChange({description:n.target.value})}
1601
+ />
1602
+ </label>
1603
+ <label class="field">
1604
+ <span>代理ID</span>
1605
+ <input
1606
+ .value=${e.form.agentId}
1607
+ @input=${n=>e.onFormChange({agentId:n.target.value})}
1608
+ placeholder="默认"
1609
+ />
1610
+ </label>
1611
+ <label class="field checkbox">
1612
+ <span>已启用</span>
1613
+ <input
1614
+ type="checkbox"
1615
+ .checked=${e.form.enabled}
1616
+ @change=${n=>e.onFormChange({enabled:n.target.checked})}
1617
+ />
1618
+ </label>
1619
+ <label class="field">
1620
+ <span>计划</span>
1621
+ <select
1622
+ .value=${e.form.scheduleKind}
1623
+ @change=${n=>e.onFormChange({scheduleKind:n.target.value})}
1624
+ >
1625
+ <option value="every">每隔</option>
1626
+ <option value="at">在</option>
1627
+ <option value="cron">Cron</option>
1628
+ </select>
1629
+ </label>
1630
+ </div>
1631
+ ${Lf(e)}
1632
+ <div class="form-grid" style="margin-top: 12px;">
1633
+ <label class="field">
1634
+ <span>会话</span>
1635
+ <select
1636
+ .value=${e.form.sessionTarget}
1637
+ @change=${n=>e.onFormChange({sessionTarget:n.target.value})}
1638
+ >
1639
+ <option value="main">主会话</option>
1640
+ <option value="isolated">隔离</option>
1641
+ </select>
1642
+ </label>
1643
+ <label class="field">
1644
+ <span>唤醒模式</span>
1645
+ <select
1646
+ .value=${e.form.wakeMode}
1647
+ @change=${n=>e.onFormChange({wakeMode:n.target.value})}
1648
+ >
1649
+ <option value="next-heartbeat">下次心跳</option>
1650
+ <option value="now">立即</option>
1651
+ </select>
1652
+ </label>
1653
+ <label class="field">
1654
+ <span>负载</span>
1655
+ <select
1656
+ .value=${e.form.payloadKind}
1657
+ @change=${n=>e.onFormChange({payloadKind:n.target.value})}
1658
+ >
1659
+ <option value="systemEvent">系统事件</option>
1660
+ <option value="agentTurn">代理回合</option>
1661
+ </select>
1662
+ </label>
1663
+ </div>
1664
+ <label class="field" style="margin-top: 12px;">
1665
+ <span>${e.form.payloadKind==="systemEvent"?"系统文本":"代理消息"}</span>
1666
+ <textarea
1667
+ .value=${e.form.payloadText}
1668
+ @input=${n=>e.onFormChange({payloadText:n.target.value})}
1669
+ rows="4"
1670
+ ></textarea>
1671
+ </label>
1672
+ ${e.form.payloadKind==="agentTurn"?o`
1673
+ <div class="form-grid" style="margin-top: 12px;">
1674
+ <label class="field checkbox">
1675
+ <span>传送</span>
1676
+ <input
1677
+ type="checkbox"
1678
+ .checked=${e.form.deliver}
1679
+ @change=${n=>e.onFormChange({deliver:n.target.checked})}
1680
+ />
1681
+ </label>
1682
+ <label class="field">
1683
+ <span>频道</span>
1684
+ <select
1685
+ .value=${e.form.channel||"last"}
1686
+ @change=${n=>e.onFormChange({channel:n.target.value})}
1687
+ >
1688
+ ${t.map(n=>o`<option value=${n}>
1689
+ ${If(e,n)}
1690
+ </option>`)}
1691
+ </select>
1692
+ </label>
1693
+ <label class="field">
1694
+ <span>发送至</span>
1695
+ <input
1696
+ .value=${e.form.to}
1697
+ @input=${n=>e.onFormChange({to:n.target.value})}
1698
+ placeholder="+1555… 或聊天ID"
1699
+ />
1700
+ </label>
1701
+ <label class="field">
1702
+ <span>超时时间(秒)</span>
1703
+ <input
1704
+ .value=${e.form.timeoutSeconds}
1705
+ @input=${n=>e.onFormChange({timeoutSeconds:n.target.value})}
1706
+ />
1707
+ </label>
1708
+ ${e.form.sessionTarget==="isolated"?o`
1709
+ <label class="field">
1710
+ <span>发布到主前缀</span>
1711
+ <input
1712
+ .value=${e.form.postToMainPrefix}
1713
+ @input=${n=>e.onFormChange({postToMainPrefix:n.target.value})}
1714
+ />
1715
+ </label>
1716
+ `:v}
1717
+ </div>
1718
+ `:v}
1719
+ <div class="row" style="margin-top: 14px;">
1720
+ <button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
1721
+ ${e.busy?"保存中…":"添加任务"}
1722
+ </button>
1723
+ </div>
1724
+ </div>
1725
+ </section>
1726
+
1727
+ <section class="card" style="margin-top: 18px;">
1728
+ <div class="card-title">任务</div>
1729
+ <div class="card-sub">存储在网关中的所有定时任务。</div>
1730
+ ${e.jobs.length===0?o`<div class="muted" style="margin-top: 12px;">暂无任务。</div>`:o`
1731
+ <div class="list" style="margin-top: 12px;">
1732
+ ${e.jobs.map(n=>Rf(n,e))}
1733
+ </div>
1734
+ `}
1735
+ </section>
1736
+
1737
+ <section class="card" style="margin-top: 18px;">
1738
+ <div class="card-title">运行历史</div>
1739
+ <div class="card-sub">${e.runsJobId??"(选择一个任务)"}的最新运行记录。</div>
1740
+ ${e.runsJobId==null?o`
1741
+ <div class="muted" style="margin-top: 12px;">
1742
+ 选择一个任务以查看运行历史。
1743
+ </div>
1744
+ `:e.runs.length===0?o`<div class="muted" style="margin-top: 12px;">暂无运行记录。</div>`:o`
1745
+ <div class="list" style="margin-top: 12px;">
1746
+ ${e.runs.map(n=>Pf(n))}
1747
+ </div>
1748
+ `}
1749
+ </section>
1750
+ `}function Lf(e){const t=e.form;return t.scheduleKind==="at"?o`
1751
+ <label class="field" style="margin-top: 12px;">
1752
+ <span>运行于</span>
1753
+ <input
1754
+ type="datetime-local"
1755
+ .value=${t.scheduleAt}
1756
+ @input=${n=>e.onFormChange({scheduleAt:n.target.value})}
1757
+ />
1758
+ </label>
1759
+ `:t.scheduleKind==="every"?o`
1760
+ <div class="form-grid" style="margin-top: 12px;">
1761
+ <label class="field">
1762
+ <span>每隔</span>
1763
+ <input
1764
+ .value=${t.everyAmount}
1765
+ @input=${n=>e.onFormChange({everyAmount:n.target.value})}
1766
+ />
1767
+ </label>
1768
+ <label class="field">
1769
+ <span>单位</span>
1770
+ <select
1771
+ .value=${t.everyUnit}
1772
+ @change=${n=>e.onFormChange({everyUnit:n.target.value})}
1773
+ >
1774
+ <option value="minutes">分钟</option>
1775
+ <option value="hours">小时</option>
1776
+ <option value="days">天</option>
1777
+ </select>
1778
+ </label>
1779
+ </div>
1780
+ `:o`
1781
+ <div class="form-grid" style="margin-top: 12px;">
1782
+ <label class="field">
1783
+ <span>表达式</span>
1784
+ <input
1785
+ .value=${t.cronExpr}
1786
+ @input=${n=>e.onFormChange({cronExpr:n.target.value})}
1787
+ />
1788
+ </label>
1789
+ <label class="field">
1790
+ <span>时区(可选)</span>
1791
+ <input
1792
+ .value=${t.cronTz}
1793
+ @input=${n=>e.onFormChange({cronTz:n.target.value})}
1794
+ />
1795
+ </label>
1796
+ </div>
1797
+ `}function Rf(e,t){const s=`list-item list-item-clickable${t.runsJobId===e.id?" list-item-selected":""}`;return o`
1798
+ <div class=${s} @click=${()=>t.onLoadRuns(e.id)}>
1799
+ <div class="list-main">
1800
+ <div class="list-title">${e.name}</div>
1801
+ <div class="list-sub">${Tf(e)}</div>
1802
+ <div class="muted">${Ef(e)}</div>
1803
+ ${e.agentId?o`<div class="muted">Agent: ${e.agentId}</div>`:v}
1804
+ <div class="chip-row" style="margin-top: 6px;">
1805
+ <span class="chip">${e.enabled?"已启用":"已禁用"}</span>
1806
+ <span class="chip">${e.sessionTarget}</span>
1807
+ <span class="chip">${e.wakeMode}</span>
1808
+ </div>
1809
+ </div>
1810
+ <div class="list-meta">
1811
+ <div>${_f(e)}</div>
1812
+ <div class="row" style="justify-content: flex-end; margin-top: 8px;">
1813
+ <button
1814
+ class="btn"
1815
+ ?disabled=${t.busy}
1816
+ @click=${i=>{i.stopPropagation(),t.onToggle(e,!e.enabled)}}
1817
+ >
1818
+ ${e.enabled?"禁用":"启用"}
1819
+ </button>
1820
+ <button
1821
+ class="btn"
1822
+ ?disabled=${t.busy}
1823
+ @click=${i=>{i.stopPropagation(),t.onRun(e)}}
1824
+ >
1825
+ 运行
1826
+ </button>
1827
+ <button
1828
+ class="btn"
1829
+ ?disabled=${t.busy}
1830
+ @click=${i=>{i.stopPropagation(),t.onLoadRuns(e.id)}}
1831
+ >
1832
+ 运行
1833
+ </button>
1834
+ <button
1835
+ class="btn danger"
1836
+ ?disabled=${t.busy}
1837
+ @click=${i=>{i.stopPropagation(),t.onRemove(e)}}
1838
+ >
1839
+ 删除
1840
+ </button>
1841
+ </div>
1842
+ </div>
1843
+ </div>
1844
+ `}function Pf(e){return o`
1845
+ <div class="list-item">
1846
+ <div class="list-main">
1847
+ <div class="list-title">${e.status}</div>
1848
+ <div class="list-sub">${e.summary??""}</div>
1849
+ </div>
1850
+ <div class="list-meta">
1851
+ <div>${kt(e.ts)}</div>
1852
+ <div class="muted">${e.durationMs??0}ms</div>
1853
+ ${e.error?o`<div class="muted">${e.error}</div>`:v}
1854
+ </div>
1855
+ </div>
1856
+ `}function Nf(e){return o`
1857
+ <section class="grid grid-cols-2">
1858
+ <div class="card">
1859
+ <div class="row" style="justify-content: space-between;">
1860
+ <div>
1861
+ <div class="card-title">快照</div>
1862
+ <div class="card-sub">状态、健康状况和心跳数据。</div>
1863
+ </div>
1864
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
1865
+ ${e.loading?"刷新中…":"刷新"}
1866
+ </button>
1867
+ </div>
1868
+ <div class="stack" style="margin-top: 12px;">
1869
+ <div>
1870
+ <div class="muted">状态</div>
1871
+ <pre class="code-block">${JSON.stringify(e.status??{},null,2)}</pre>
1872
+ </div>
1873
+ <div>
1874
+ <div class="muted">健康状况</div>
1875
+ <pre class="code-block">${JSON.stringify(e.health??{},null,2)}</pre>
1876
+ </div>
1877
+ <div>
1878
+ <div class="muted">最后心跳</div>
1879
+ <pre class="code-block">${JSON.stringify(e.heartbeat??{},null,2)}</pre>
1880
+ </div>
1881
+ </div>
1882
+ </div>
1883
+
1884
+ <div class="card">
1885
+ <div class="card-title">手动RPC</div>
1886
+ <div class="card-sub">使用JSON参数发送原始网关方法。</div>
1887
+ <div class="form-grid" style="margin-top: 16px;">
1888
+ <label class="field">
1889
+ <span>方法</span>
1890
+ <input
1891
+ .value=${e.callMethod}
1892
+ @input=${t=>e.onCallMethodChange(t.target.value)}
1893
+ placeholder="系统状态"
1894
+ />
1895
+ </label>
1896
+ <label class="field">
1897
+ <span>参数(JSON)</span>
1898
+ <textarea
1899
+ .value=${e.callParams}
1900
+ @input=${t=>e.onCallParamsChange(t.target.value)}
1901
+ rows="6"
1902
+ ></textarea>
1903
+ </label>
1904
+ </div>
1905
+ <div class="row" style="margin-top: 12px;">
1906
+ <button class="btn primary" @click=${e.onCall}>调用</button>
1907
+ </div>
1908
+ ${e.callError?o`<div class="callout danger" style="margin-top: 12px;">
1909
+ ${e.callError}
1910
+ </div>`:v}
1911
+ ${e.callResult?o`<pre class="code-block" style="margin-top: 12px;">${e.callResult}</pre>`:v}
1912
+ </div>
1913
+ </section>
1914
+
1915
+ <section class="card" style="margin-top: 18px;">
1916
+ <div class="card-title">模型</div>
1917
+ <div class="card-sub">来自models.list的目录。</div>
1918
+ <pre class="code-block" style="margin-top: 12px;">${JSON.stringify(e.models??[],null,2)}</pre>
1919
+ </section>
1920
+
1921
+ <section class="card" style="margin-top: 18px;">
1922
+ <div class="card-title">事件日志</div>
1923
+ <div class="card-sub">最新的网关事件。</div>
1924
+ ${e.eventLog.length===0?o`<div class="muted" style="margin-top: 12px;">暂无事件。</div>`:o`
1925
+ <div class="list" style="margin-top: 12px;">
1926
+ ${e.eventLog.map(t=>o`
1927
+ <div class="list-item">
1928
+ <div class="list-main">
1929
+ <div class="list-title">${t.event}</div>
1930
+ <div class="list-sub">${new Date(t.ts).toLocaleTimeString()}</div>
1931
+ </div>
1932
+ <div class="list-meta">
1933
+ <pre class="code-block">${Sf(t.payload)}</pre>
1934
+ </div>
1935
+ </div>
1936
+ `)}
1937
+ </div>
1938
+ `}
1939
+ </section>
1940
+ `}function Of(e){return o`
1941
+ <section class="card">
1942
+ <div class="row" style="justify-content: space-between;">
1943
+ <div>
1944
+ <div class="card-title">已连接实例</div>
1945
+ <div class="card-sub">来自网关和客户端的存在信标。</div>
1946
+ </div>
1947
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
1948
+ ${e.loading?"加载中…":"刷新"}
1949
+ </button>
1950
+ </div>
1951
+ ${e.lastError?o`<div class="callout danger" style="margin-top: 12px;">
1952
+ ${e.lastError}
1953
+ </div>`:v}
1954
+ ${e.statusMessage?o`<div class="callout" style="margin-top: 12px;">
1955
+ ${e.statusMessage}
1956
+ </div>`:v}
1957
+ <div class="list" style="margin-top: 16px;">
1958
+ ${e.entries.length===0?o`<div class="muted">暂未报告任何实例。</div>`:e.entries.map(t=>Df(t))}
1959
+ </div>
1960
+ </section>
1961
+ `}function Df(e){const t=e.lastInputSeconds!=null?`${e.lastInputSeconds}秒前`:"无",n=e.mode??"未知",s=Array.isArray(e.roles)?e.roles.filter(Boolean):[],i=Array.isArray(e.scopes)?e.scopes.filter(Boolean):[],a=i.length>0?i.length>3?`${i.length} 作用域`:`作用域: ${i.join(", ")}`:null;return o`
1962
+ <div class="list-item">
1963
+ <div class="list-main">
1964
+ <div class="list-title">${e.host??"未知主机"}</div>
1965
+ <div class="list-sub">${xf(e)}</div>
1966
+ <div class="chip-row">
1967
+ <span class="chip">${n}</span>
1968
+ ${s.map(r=>o`<span class="chip">${r}</span>`)}
1969
+ ${a?o`<span class="chip">${a}</span>`:v}
1970
+ ${e.platform?o`<span class="chip">${e.platform}</span>`:v}
1971
+ ${e.deviceFamily?o`<span class="chip">${e.deviceFamily}</span>`:v}
1972
+ ${e.modelIdentifier?o`<span class="chip">${e.modelIdentifier}</span>`:v}
1973
+ ${e.version?o`<span class="chip">${e.version}</span>`:v}
1974
+ </div>
1975
+ </div>
1976
+ <div class="list-meta">
1977
+ <div>${Af(e)}</div>
1978
+ <div class="muted">上次输入 ${t}</div>
1979
+ <div class="muted">原因 ${e.reason??""}</div>
1980
+ </div>
1981
+ </div>
1982
+ `}const Ua=["trace","debug","info","warn","error","fatal"];function Bf(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function Ff(e,t){return t?[e.message,e.subsystem,e.raw].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function Uf(e){const t=e.filterText.trim().toLowerCase(),n=Ua.some(a=>!e.levelFilters[a]),s=e.entries.filter(a=>a.level&&!e.levelFilters[a.level]?!1:Ff(a,t)),i=t||n?"filtered":"visible";return o`
1983
+ <section class="card">
1984
+ <div class="row" style="justify-content: space-between;">
1985
+ <div>
1986
+ <div class="card-title">日志</div>
1987
+ <div class="card-sub">网关文件日志(JSONL)。</div>
1988
+ </div>
1989
+ <div class="row" style="gap: 8px;">
1990
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
1991
+ ${e.loading?"加载中…":"刷新"}
1992
+ </button>
1993
+ <button
1994
+ class="btn"
1995
+ ?disabled=${s.length===0}
1996
+ @click=${()=>e.onExport(s.map(a=>a.raw),i)}
1997
+ >
1998
+ 导出 ${i}
1999
+ </button>
2000
+ </div>
2001
+ </div>
2002
+
2003
+ <div class="filters" style="margin-top: 14px;">
2004
+ <label class="field" style="min-width: 220px;">
2005
+ <span>过滤器</span>
2006
+ <input
2007
+ .value=${e.filterText}
2008
+ @input=${a=>e.onFilterTextChange(a.target.value)}
2009
+ placeholder="搜索日志"
2010
+ />
2011
+ </label>
2012
+ <label class="field checkbox">
2013
+ <span>自动跟随</span>
2014
+ <input
2015
+ type="checkbox"
2016
+ .checked=${e.autoFollow}
2017
+ @change=${a=>e.onToggleAutoFollow(a.target.checked)}
2018
+ />
2019
+ </label>
2020
+ </div>
2021
+
2022
+ <div class="chip-row" style="margin-top: 12px;">
2023
+ ${Ua.map(a=>o`
2024
+ <label class="chip log-chip ${a}">
2025
+ <input
2026
+ type="checkbox"
2027
+ .checked=${e.levelFilters[a]}
2028
+ @change=${r=>e.onLevelToggle(a,r.target.checked)}
2029
+ />
2030
+ <span>${a}</span>
2031
+ </label>
2032
+ `)}
2033
+ </div>
2034
+
2035
+ ${e.file?o`<div class="muted" style="margin-top: 10px;">文件: ${e.file}</div>`:v}
2036
+ ${e.truncated?o`<div class="callout" style="margin-top: 10px;">
2037
+ 日志输出已截断;显示最新部分。
2038
+ </div>`:v}
2039
+ ${e.error?o`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:v}
2040
+
2041
+ <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2042
+ ${s.length===0?o`<div class="muted" style="padding: 12px;">无日志条目。</div>`:s.map(a=>o`
2043
+ <div class="log-row">
2044
+ <div class="log-time mono">${Bf(a.time)}</div>
2045
+ <div class="log-level ${a.level??""}">${a.level??""}</div>
2046
+ <div class="log-subsystem mono">${a.subsystem??""}</div>
2047
+ <div class="log-message mono">${a.message??a.raw}</div>
2048
+ </div>
2049
+ `)}
2050
+ </div>
2051
+ </section>
2052
+ `}function Kf(e){const t=Wf(e),n=Jf(e);return o`
2053
+ ${th(n)}
2054
+ ${eh(t)}
2055
+ ${Hf(e)}
2056
+ <section class="card">
2057
+ <div class="row" style="justify-content: space-between;">
2058
+ <div>
2059
+ <div class="card-title">节点</div>
2060
+ <div class="card-sub">配对设备和实时链接。</div>
2061
+ </div>
2062
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2063
+ ${e.loading?"加载中…":"刷新"}
2064
+ </button>
2065
+ </div>
2066
+ <div class="list" style="margin-top: 16px;">
2067
+ ${e.nodes.length===0?o`<div class="muted">未找到节点。</div>`:e.nodes.map(s=>uh(s))}
2068
+ </div>
2069
+ </section>
2070
+ `}function Hf(e){const t=e.devicesList??{pending:[],paired:[]},n=Array.isArray(t.pending)?t.pending:[],s=Array.isArray(t.paired)?t.paired:[];return o`
2071
+ <section class="card">
2072
+ <div class="row" style="justify-content: space-between;">
2073
+ <div>
2074
+ <div class="card-title">设备</div>
2075
+ <div class="card-sub">配对请求 + 角色令牌。</div>
2076
+ </div>
2077
+ <button class="btn" ?disabled=${e.devicesLoading} @click=${e.onDevicesRefresh}>
2078
+ ${e.devicesLoading?"加载中…":"刷新"}
2079
+ </button>
2080
+ </div>
2081
+ ${e.devicesError?o`<div class="callout danger" style="margin-top: 12px;">${e.devicesError}</div>`:v}
2082
+ <div class="list" style="margin-top: 16px;">
2083
+ ${n.length>0?o`
2084
+ <div class="muted" style="margin-bottom: 8px;">待处理</div>
2085
+ ${n.map(i=>zf(i,e))}
2086
+ `:v}
2087
+ ${s.length>0?o`
2088
+ <div class="muted" style="margin-top: 12px; margin-bottom: 8px;">已配对</div>
2089
+ ${s.map(i=>jf(i,e))}
2090
+ `:v}
2091
+ ${n.length===0&&s.length===0?o`<div class="muted">无配对设备。</div>`:v}
2092
+ </div>
2093
+ </section>
2094
+ `}function zf(e,t){const n=e.displayName?.trim()||e.deviceId,s=typeof e.ts=="number"?O(e.ts):"无",i=e.role?.trim()?`role: ${e.role}`:"角色: -",a=e.isRepair?" · repair":"",r=e.remoteIp?` · ${e.remoteIp}`:"";return o`
2095
+ <div class="list-item">
2096
+ <div class="list-main">
2097
+ <div class="list-title">${n}</div>
2098
+ <div class="list-sub">${e.deviceId}${r}</div>
2099
+ <div class="muted" style="margin-top: 6px;">
2100
+ ${i} · requested ${s}${a}
2101
+ </div>
2102
+ </div>
2103
+ <div class="list-meta">
2104
+ <div class="row" style="justify-content: flex-end; gap: 8px; flex-wrap: wrap;">
2105
+ <button class="btn btn--sm primary" @click=${()=>t.onDeviceApprove(e.requestId)}>
2106
+ 批准
2107
+ </button>
2108
+ <button class="btn btn--sm" @click=${()=>t.onDeviceReject(e.requestId)}>
2109
+ 拒绝
2110
+ </button>
2111
+ </div>
2112
+ </div>
2113
+ </div>
2114
+ `}function jf(e,t){const n=e.displayName?.trim()||e.deviceId,s=e.remoteIp?` · ${e.remoteIp}`:"",i=`角色: ${is(e.roles)}`,a=`范围: ${is(e.scopes)}`,r=Array.isArray(e.tokens)?e.tokens:[];return o`
2115
+ <div class="list-item">
2116
+ <div class="list-main">
2117
+ <div class="list-title">${n}</div>
2118
+ <div class="list-sub">${e.deviceId}${s}</div>
2119
+ <div class="muted" style="margin-top: 6px;">${i} · ${a}</div>
2120
+ ${r.length===0?o`<div class="muted" style="margin-top: 6px;">令牌: 无</div>`:o`
2121
+ <div class="muted" style="margin-top: 10px;">令牌</div>
2122
+ <div style="display: flex; flex-direction: column; gap: 8px; margin-top: 6px;">
2123
+ ${r.map(l=>qf(e.deviceId,l,t))}
2124
+ </div>
2125
+ `}
2126
+ </div>
2127
+ </div>
2128
+ `}function qf(e,t,n){const s=t.revokedAtMs?"revoked":"active",i=`范围: ${is(t.scopes)}`,a=O(t.rotatedAtMs??t.createdAtMs??t.lastUsedAtMs??null);return o`
2129
+ <div class="row" style="justify-content: space-between; gap: 8px;">
2130
+ <div class="list-sub">${t.role} · ${s} · ${i} · ${a}</div>
2131
+ <div class="row" style="justify-content: flex-end; gap: 6px; flex-wrap: wrap;">
2132
+ <button
2133
+ class="btn btn--sm"
2134
+ @click=${()=>n.onDeviceRotate(e,t.role,t.scopes)}
2135
+ >
2136
+ 更新
2137
+ </button>
2138
+ ${t.revokedAtMs?v:o`
2139
+ <button
2140
+ class="btn btn--sm danger"
2141
+ @click=${()=>n.onDeviceRevoke(e,t.role)}>
2142
+ >
2143
+ 撤销
2144
+ </button>
2145
+ `}
2146
+ </div>
2147
+ </div>
2148
+ `}const Ae="__defaults__",Ka=[{value:"deny",label:"拒绝"},{value:"allowlist",label:"白名单"},{value:"full",label:"全部"}],Vf=[{value:"off",label:"关闭"},{value:"on-miss",label:"未命中时"},{value:"always",label:"始终"}];function Wf(e){const t=e.configForm,n=lh(e.nodes),{defaultBinding:s,agents:i}=dh(t),a=!!t,r=e.configSaving||e.configFormMode==="raw";return{ready:a,disabled:r,configDirty:e.configDirty,configLoading:e.configLoading,configSaving:e.configSaving,defaultBinding:s,agents:i,nodes:n,onBindDefault:e.onBindDefault,onBindAgent:e.onBindAgent,onSave:e.onSaveBindings,onLoadConfig:e.onLoadConfig,formMode:e.configFormMode}}function Ha(e){return e==="allowlist"||e==="full"||e==="deny"?e:"deny"}function Gf(e){return e==="always"||e==="off"||e==="on-miss"?e:"on-miss"}function Qf(e){const t=e?.defaults??{};return{security:Ha(t.security),ask:Gf(t.ask),askFallback:Ha(t.askFallback??"deny"),autoAllowSkills:!!(t.autoAllowSkills??!1)}}function Yf(e){const t=e?.agents??{},n=Array.isArray(t.list)?t.list:[],s=[];return n.forEach(i=>{if(!i||typeof i!="object")return;const a=i,r=typeof a.id=="string"?a.id.trim():"";if(!r)return;const l=typeof a.name=="string"?a.name.trim():void 0,c=a.default===!0;s.push({id:r,name:l||void 0,isDefault:c})}),s}function Zf(e,t){const n=Yf(e),s=Object.keys(t?.agents??{}),i=new Map;n.forEach(r=>i.set(r.id,r)),s.forEach(r=>{i.has(r)||i.set(r,{id:r})});const a=Array.from(i.values());return a.length===0&&a.push({id:"main",isDefault:!0}),a.sort((r,l)=>{if(r.isDefault&&!l.isDefault)return-1;if(!r.isDefault&&l.isDefault)return 1;const c=r.name?.trim()?r.name:r.id,p=l.name?.trim()?l.name:l.id;return c.localeCompare(p)}),a}function Xf(e,t){return e===Ae?Ae:e&&t.some(n=>n.id===e)?e:Ae}function Jf(e){const t=e.execApprovalsForm??e.execApprovalsSnapshot?.file??null,n=!!t,s=Qf(t),i=Zf(e.configForm,t),a=ch(e.nodes),r=e.execApprovalsTarget;let l=r==="node"&&e.execApprovalsTargetNodeId?e.execApprovalsTargetNodeId:null;r==="node"&&l&&!a.some(u=>u.id===l)&&(l=null);const c=Xf(e.execApprovalsSelectedAgent,i),p=c!==Ae?(t?.agents??{})[c]??null:null,d=Array.isArray(p?.allowlist)?p.allowlist??[]:[];return{ready:n,disabled:e.execApprovalsSaving||e.execApprovalsLoading,dirty:e.execApprovalsDirty,loading:e.execApprovalsLoading,saving:e.execApprovalsSaving,form:t,defaults:s,selectedScope:c,selectedAgent:p,agents:i,allowlist:d,target:r,targetNodeId:l,targetNodes:a,onSelectScope:e.onExecApprovalsSelectAgent,onSelectTarget:e.onExecApprovalsTargetChange,onPatch:e.onExecApprovalsPatch,onRemove:e.onExecApprovalsRemove,onLoad:e.onLoadExecApprovals,onSave:e.onSaveExecApprovals}}function eh(e){const t=e.nodes.length>0,n=e.defaultBinding??"";return o`
2149
+ <section class="card">
2150
+ <div class="row" style="justify-content: space-between; align-items: center;">
2151
+ <div>
2152
+ <div class="card-title">执行节点绑定</div>
2153
+ <div class="card-sub">
2154
+ 使用<span class="mono">exec host=node</span>时将代理固定到特定节点。
2155
+ </div>
2156
+ </div>
2157
+ <button
2158
+ class="btn"
2159
+ ?disabled=${e.disabled||!e.configDirty}
2160
+ @click=${e.onSave}
2161
+ >
2162
+ ${e.configSaving?"保存中…":"保存"}
2163
+ </button>
2164
+ </div>
2165
+
2166
+ ${e.formMode==="raw"?o`<div class="callout warn" style="margin-top: 12px;">
2167
+ 将配置选项卡切换到<strong>表单</strong>模式以在此处编辑绑定。
2168
+ </div>`:v}
2169
+
2170
+ ${e.ready?o`
2171
+ <div class="list" style="margin-top: 16px;">
2172
+ <div class="list-item">
2173
+ <div class="list-main">
2174
+ <div class="list-title">默认绑定</div>
2175
+ <div class="list-sub">当代理不覆盖节点绑定时使用。</div>
2176
+ </div>
2177
+ <div class="list-meta">
2178
+ <label class="field">
2179
+ <span>节点</span>
2180
+ <select
2181
+ ?disabled=${e.disabled||!t}
2182
+ @change=${s=>{const a=s.target.value.trim();e.onBindDefault(a||null)}}
2183
+ >
2184
+ <option value="" ?selected=${n===""}>任何节点</option>
2185
+ ${e.nodes.map(s=>o`<option
2186
+ value=${s.id}
2187
+ ?selected=${n===s.id}
2188
+ >
2189
+ ${s.label}
2190
+ </option>`)}
2191
+ </select>
2192
+ </label>
2193
+ ${t?v:o`<div class="muted">没有可用system.run的节点。</div>`}
2194
+ </div>
2195
+ </div>
2196
+
2197
+ ${e.agents.length===0?o`<div class="muted">未找到代理。</div>`:e.agents.map(s=>oh(s,e))}
2198
+ </div>
2199
+ `:o`<div class="row" style="margin-top: 12px; gap: 12px;">
2200
+ <div class="muted">加载配置以编辑绑定。</div>
2201
+ <button class="btn" ?disabled=${e.configLoading} @click=${e.onLoadConfig}>
2202
+ ${e.configLoading?"加载中…":"加载配置"}
2203
+ </button>
2204
+ </div>`}
2205
+ </section>
2206
+ `}function th(e){const t=e.ready,n=e.target!=="node"||!!e.targetNodeId;return o`
2207
+ <section class="card">
2208
+ <div class="row" style="justify-content: space-between; align-items: center;">
2209
+ <div>
2210
+ <div class="card-title">执行审批</div>
2211
+ <div class="card-sub">
2212
+ <span class="mono">exec host=gateway/node</span>的白名单和审批策略。
2213
+ </div>
2214
+ </div>
2215
+ <button
2216
+ class="btn"
2217
+ ?disabled=${e.disabled||!e.dirty||!n}
2218
+ @click=${e.onSave}
2219
+ >
2220
+ ${e.saving?"保存中…":"保存"}
2221
+ </button>
2222
+ </div>
2223
+
2224
+ ${nh(e)}
2225
+
2226
+ ${t?o`
2227
+ ${sh(e)}
2228
+ ${ih(e)}
2229
+ ${e.selectedScope===Ae?v:ah(e)}
2230
+ `:o`<div class="row" style="margin-top: 12px; gap: 12px;">
2231
+ <div class="muted">加载执行审批以编辑白名单。</div>
2232
+ <button class="btn" ?disabled=${e.loading||!n} @click=${e.onLoad}>
2233
+ ${e.loading?"加载中…":"加载审批"}
2234
+ </button>
2235
+ </div>`}
2236
+ </section>
2237
+ `}function nh(e){const t=e.targetNodes.length>0,n=e.targetNodeId??"";return o`
2238
+ <div class="list" style="margin-top: 12px;">
2239
+ <div class="list-item">
2240
+ <div class="list-main">
2241
+ <div class="list-title">目标</div>
2242
+ <div class="list-sub">
2243
+ 网关编辑本地审批;节点编辑选定的节点。
2244
+ </div>
2245
+ </div>
2246
+ <div class="list-meta">
2247
+ <label class="field">
2248
+ <span>主机</span>
2249
+ <select
2250
+ ?disabled=${e.disabled}
2251
+ @change=${s=>{if(s.target.value==="node"){const r=e.targetNodes[0]?.id??null;e.onSelectTarget("node",n||r)}else e.onSelectTarget("gateway",null)}}
2252
+ >
2253
+ <option value="gateway" ?selected=${e.target==="gateway"}>网关</option>
2254
+ <option value="node" ?selected=${e.target==="node"}>节点</option>
2255
+ </select>
2256
+ </label>
2257
+ ${e.target==="node"?o`
2258
+ <label class="field">
2259
+ <span>节点</span>
2260
+ <select
2261
+ ?disabled=${e.disabled||!t}
2262
+ @change=${s=>{const a=s.target.value.trim();e.onSelectTarget("node",a||null)}}
2263
+ >
2264
+ <option value="" ?selected=${n===""}>选择节点</option>
2265
+ ${e.targetNodes.map(s=>o`<option
2266
+ value=${s.id}
2267
+ ?selected=${n===s.id}
2268
+ >
2269
+ ${s.label}
2270
+ </option>`)}
2271
+ </select>
2272
+ </label>
2273
+ `:v}
2274
+ </div>
2275
+ </div>
2276
+ ${e.target==="node"&&!t?o`<div class="muted">尚无节点发布执行审批广告。</div>`:v}
2277
+ </div>
2278
+ `}function sh(e){return o`
2279
+ <div class="row" style="margin-top: 12px; gap: 8px; flex-wrap: wrap;">
2280
+ <span class="label">范围</span>
2281
+ <div class="row" style="gap: 8px; flex-wrap: wrap;">
2282
+ <button
2283
+ class="btn btn--sm ${e.selectedScope===Ae?"active":""}"
2284
+ @click=${()=>e.onSelectScope(Ae)}
2285
+ >
2286
+ 默认值
2287
+ </button>
2288
+ ${e.agents.map(t=>{const n=t.name?.trim()?`${t.name} (${t.id})`:t.id;return o`
2289
+ <button
2290
+ class="btn btn--sm ${e.selectedScope===t.id?"active":""}"
2291
+ @click=${()=>e.onSelectScope(t.id)}
2292
+ >
2293
+ ${n}
2294
+ </button>
2295
+ `})}
2296
+ </div>
2297
+ </div>
2298
+ `}function ih(e){const t=e.selectedScope===Ae,n=e.defaults,s=e.selectedAgent??{},i=t?["defaults"]:["agents",e.selectedScope],a=typeof s.security=="string"?s.security:void 0,r=typeof s.ask=="string"?s.ask:void 0,l=typeof s.askFallback=="string"?s.askFallback:void 0,c=t?n.security:a??"__default__",p=t?n.ask:r??"__default__",d=t?n.askFallback:l??"__default__",u=typeof s.autoAllowSkills=="boolean"?s.autoAllowSkills:void 0,h=u??n.autoAllowSkills,g=u==null;return o`
2299
+ <div class="list" style="margin-top: 16px;">
2300
+ <div class="list-item">
2301
+ <div class="list-main">
2302
+ <div class="list-title">安全</div>
2303
+ <div class="list-sub">
2304
+ ${t?"默认安全模式。":`默认值: ${n.security}.`}
2305
+ </div>
2306
+ </div>
2307
+ <div class="list-meta">
2308
+ <label class="field">
2309
+ <span>模式</span>
2310
+ <select
2311
+ ?disabled=${e.disabled}
2312
+ @change=${$=>{const A=$.target.value;!t&&A==="__default__"?e.onRemove([...i,"security"]):e.onPatch([...i,"security"],A)}}
2313
+ >
2314
+ ${t?v:o`<option value="__default__" ?selected=${c==="__default__"}>
2315
+ 使用默认值 (${n.security})
2316
+ </option>`}
2317
+ ${Ka.map($=>o`<option
2318
+ value=${$.value}
2319
+ ?selected=${c===$.value}
2320
+ >
2321
+ ${$.label}
2322
+ </option>`)}
2323
+ </select>
2324
+ </label>
2325
+ </div>
2326
+ </div>
2327
+
2328
+ <div class="list-item">
2329
+ <div class="list-main">
2330
+ <div class="list-title">询问</div>
2331
+ <div class="list-sub">
2332
+ ${t?"默认提示策略。":`默认值: ${n.ask}.`}
2333
+ </div>
2334
+ </div>
2335
+ <div class="list-meta">
2336
+ <label class="field">
2337
+ <span>模式</span>
2338
+ <select
2339
+ ?disabled=${e.disabled}
2340
+ @change=${$=>{const A=$.target.value;!t&&A==="__default__"?e.onRemove([...i,"ask"]):e.onPatch([...i,"ask"],A)}}
2341
+ >
2342
+ ${t?v:o`<option value="__default__" ?selected=${p==="__default__"}>
2343
+ 使用默认值 (${n.ask})
2344
+ </option>`}
2345
+ ${Vf.map($=>o`<option
2346
+ value=${$.value}
2347
+ ?selected=${p===$.value}
2348
+ >
2349
+ ${$.label}
2350
+ </option>`)}
2351
+ </select>
2352
+ </label>
2353
+ </div>
2354
+ </div>
2355
+
2356
+ <div class="list-item">
2357
+ <div class="list-main">
2358
+ <div class="list-title">询问回退</div>
2359
+ <div class="list-sub">
2360
+ ${t?"当UI提示不可用时应用。":`默认值: ${n.askFallback}.`}
2361
+ </div>
2362
+ </div>
2363
+ <div class="list-meta">
2364
+ <label class="field">
2365
+ <span>回退</span>
2366
+ <select
2367
+ ?disabled=${e.disabled}
2368
+ @change=${$=>{const A=$.target.value;!t&&A==="__default__"?e.onRemove([...i,"askFallback"]):e.onPatch([...i,"askFallback"],A)}}
2369
+ >
2370
+ ${t?v:o`<option value="__default__" ?selected=${d==="__default__"}>
2371
+ 使用默认值 (${n.askFallback})
2372
+ </option>`}
2373
+ ${Ka.map($=>o`<option
2374
+ value=${$.value}
2375
+ ?selected=${d===$.value}
2376
+ >
2377
+ ${$.label}
2378
+ </option>`)}
2379
+ </select>
2380
+ </label>
2381
+ </div>
2382
+ </div>
2383
+
2384
+ <div class="list-item">
2385
+ <div class="list-main">
2386
+ <div class="list-title">自动允许技能CLI</div>
2387
+ <div class="list-sub">
2388
+ ${t?"允许网关列出的技能可执行文件。":g?`使用默认值 (${n.autoAllowSkills?"开":"关"}).`:`覆盖 (${h?"开":"关"}).`}
2389
+ </div>
2390
+ </div>
2391
+ <div class="list-meta">
2392
+ <label class="field">
2393
+ <span>启用</span>
2394
+ <input
2395
+ type="checkbox"
2396
+ ?disabled=${e.disabled}
2397
+ .checked=${h}
2398
+ @change=${$=>{const w=$.target;e.onPatch([...i,"autoAllowSkills"],w.checked)}}
2399
+ />
2400
+ </label>
2401
+ ${!t&&!g?o`<button
2402
+ class="btn btn--sm"
2403
+ ?disabled=${e.disabled}
2404
+ @click=${()=>e.onRemove([...i,"autoAllowSkills"])}
2405
+ >
2406
+ 使用默认值
2407
+ </button>`:v}
2408
+ </div>
2409
+ </div>
2410
+ </div>
2411
+ `}function ah(e){const t=["agents",e.selectedScope,"allowlist"],n=e.allowlist;return o`
2412
+ <div class="row" style="margin-top: 18px; justify-content: space-between;">
2413
+ <div>
2414
+ <div class="card-title">白名单</div>
2415
+ <div class="card-sub">不区分大小写的通配符模式。</div>
2416
+ </div>
2417
+ <button
2418
+ class="btn btn--sm"
2419
+ ?disabled=${e.disabled}
2420
+ @click=${()=>{const s=[...n,{pattern:""}];e.onPatch(t,s)}}
2421
+ >
2422
+ 添加模式
2423
+ </button>
2424
+ </div>
2425
+ <div class="list" style="margin-top: 12px;">
2426
+ ${n.length===0?o`<div class="muted">尚无白名单条目。</div>`:n.map((s,i)=>rh(e,s,i))}
2427
+ </div>
2428
+ `}function rh(e,t,n){const s=t.lastUsedAt?O(t.lastUsedAt):"从未",i=t.lastUsedCommand?as(t.lastUsedCommand,120):null,a=t.lastResolvedPath?as(t.lastResolvedPath,120):null;return o`
2429
+ <div class="list-item">
2430
+ <div class="list-main">
2431
+ <div class="list-title">${t.pattern?.trim()?t.pattern:"新模式"}</div>
2432
+ <div class="list-sub">最后使用: ${s}</div>
2433
+ ${i?o`<div class="list-sub mono">${i}</div>`:v}
2434
+ ${a?o`<div class="list-sub mono">${a}</div>`:v}
2435
+ </div>
2436
+ <div class="list-meta">
2437
+ <label class="field">
2438
+ <span>模式</span>
2439
+ <input
2440
+ type="text"
2441
+ .value=${t.pattern??""}
2442
+ ?disabled=${e.disabled}
2443
+ @input=${r=>{const l=r.target;e.onPatch(["agents",e.selectedScope,"allowlist",n,"pattern"],l.value)}}
2444
+ />
2445
+ </label>
2446
+ <button
2447
+ class="btn btn--sm danger"
2448
+ ?disabled=${e.disabled}
2449
+ @click=${()=>{if(e.allowlist.length<=1){e.onRemove(["agents",e.selectedScope,"allowlist"]);return}e.onRemove(["agents",e.selectedScope,"allowlist",n])}}
2450
+ >
2451
+ 移除
2452
+ </button>
2453
+ </div>
2454
+ </div>
2455
+ `}function oh(e,t){const n=e.binding??"__default__",s=e.name?.trim()?`${e.name} (${e.id})`:e.id,i=t.nodes.length>0;return o`
2456
+ <div class="list-item">
2457
+ <div class="list-main">
2458
+ <div class="list-title">${s}</div>
2459
+ <div class="list-sub">
2460
+ ${e.isDefault?"默认代理":"代理"} ·
2461
+ ${n==="__default__"?`使用默认值 (${t.defaultBinding??"任意"})`:`覆盖: ${e.binding}`}
2462
+ </div>
2463
+ </div>
2464
+ <div class="list-meta">
2465
+ <label class="field">
2466
+ <span>绑定</span>
2467
+ <select
2468
+ ?disabled=${t.disabled||!i}
2469
+ @change=${a=>{const l=a.target.value.trim();t.onBindAgent(e.index,l==="__default__"?null:l)}}
2470
+ >
2471
+ <option value="__default__" ?selected=${n==="__default__"}>
2472
+ 使用默认值
2473
+ </option>
2474
+ ${t.nodes.map(a=>o`<option
2475
+ value=${a.id}
2476
+ ?selected=${n===a.id}
2477
+ >
2478
+ ${a.label}
2479
+ </option>`)}
2480
+ </select>
2481
+ </label>
2482
+ </div>
2483
+ </div>
2484
+ `}function lh(e){const t=[];for(const n of e){if(!(Array.isArray(n.commands)?n.commands:[]).some(l=>String(l)==="system.run"))continue;const a=typeof n.nodeId=="string"?n.nodeId.trim():"";if(!a)continue;const r=typeof n.displayName=="string"&&n.displayName.trim()?n.displayName.trim():a;t.push({id:a,label:r===a?a:`${r} · ${a}`})}return t.sort((n,s)=>n.label.localeCompare(s.label)),t}function ch(e){const t=[];for(const n of e){if(!(Array.isArray(n.commands)?n.commands:[]).some(l=>String(l)==="system.execApprovals.get"||String(l)==="system.execApprovals.set"))continue;const a=typeof n.nodeId=="string"?n.nodeId.trim():"";if(!a)continue;const r=typeof n.displayName=="string"&&n.displayName.trim()?n.displayName.trim():a;t.push({id:a,label:r===a?a:`${r} · ${a}`})}return t.sort((n,s)=>n.label.localeCompare(s.label)),t}function dh(e){const t={id:"main",name:void 0,index:0,isDefault:!0,binding:null};if(!e||typeof e!="object")return{defaultBinding:null,agents:[t]};const s=(e.tools??{}).exec??{},i=typeof s.node=="string"&&s.node.trim()?s.node.trim():null,a=e.agents??{},r=Array.isArray(a.list)?a.list:[];if(r.length===0)return{defaultBinding:i,agents:[t]};const l=[];return r.forEach((c,p)=>{if(!c||typeof c!="object")return;const d=c,u=typeof d.id=="string"?d.id.trim():"";if(!u)return;const h=typeof d.name=="string"?d.name.trim():void 0,g=d.default===!0,w=(d.tools??{}).exec??{},A=typeof w.node=="string"&&w.node.trim()?w.node.trim():null;l.push({id:u,name:h||void 0,index:p,isDefault:g,binding:A})}),l.length===0&&l.push(t),{defaultBinding:i,agents:l}}function uh(e){const t=!!e.connected,n=!!e.paired,s=typeof e.displayName=="string"&&e.displayName.trim()||(typeof e.nodeId=="string"?e.nodeId:"未知"),i=Array.isArray(e.caps)?e.caps:[],a=Array.isArray(e.commands)?e.commands:[];return o`
2485
+ <div class="list-item">
2486
+ <div class="list-main">
2487
+ <div class="list-title">${s}</div>
2488
+ <div class="list-sub">
2489
+ ${typeof e.nodeId=="string"?e.nodeId:""}
2490
+ ${typeof e.remoteIp=="string"?` · ${e.remoteIp}`:""}
2491
+ ${typeof e.version=="string"?` · ${e.version}`:""}
2492
+ </div>
2493
+ <div class="chip-row" style="margin-top: 6px;">
2494
+ <span class="chip">${n?"已配对":"未配对"}</span>
2495
+ <span class="chip ${t?"chip-ok":"chip-warn"}">
2496
+ ${t?"已连接":"离线"}
2497
+ </span>
2498
+ ${i.slice(0,12).map(r=>o`<span class="chip">${String(r)}</span>`)}
2499
+ ${a.slice(0,8).map(r=>o`<span class="chip">${String(r)}</span>`)}
2500
+ </div>
2501
+ </div>
2502
+ </div>
2503
+ `}function ph(e){const t=e.hello?.snapshot,n=t?.uptimeMs?ir(t.uptimeMs):"n/a",s=t?.policy?.tickIntervalMs?`${t.policy.tickIntervalMs}ms`:"n/a",i=(()=>{if(e.connected||!e.lastError)return null;const r=e.lastError.toLowerCase();if(!(r.includes("unauthorized")||r.includes("connect failed")))return null;const c=!!e.settings.token.trim(),p=!!e.password.trim();return!c&&!p?o`
2504
+ <div class="muted" style="margin-top: 8px;">
2505
+ 此网关需要身份验证。添加令牌或密码,然后点击连接。
2506
+ <div style="margin-top: 6px;">
2507
+ <span class="mono">clawdbot dashboard --no-open</span> → 生成带令牌的URL<br />
2508
+ <span class="mono">clawdbot doctor --generate-gateway-token</span> → 设置令牌
2509
+ </div>
2510
+ <div style="margin-top: 6px;">
2511
+ <a
2512
+ class="session-link"
2513
+ href="https://docs.clawd.bot/web/dashboard"
2514
+ target="_blank"
2515
+ rel="noreferrer"
2516
+ title="控制界面身份验证文档(在新标签页中打开)"
2517
+ >文档:控制界面身份验证</a
2518
+ >
2519
+ </div>
2520
+ </div>
2521
+ `:o`
2522
+ <div class="muted" style="margin-top: 8px;">
2523
+ 身份验证失败。重新复制带令牌的URL,使用
2524
+ <span class="mono">clawdbot dashboard --no-open</span>,或更新令牌,
2525
+ 然后点击连接。
2526
+ <div style="margin-top: 6px;">
2527
+ <a
2528
+ class="session-link"
2529
+ href="https://docs.clawd.bot/web/dashboard"
2530
+ target="_blank"
2531
+ rel="noreferrer"
2532
+ title="控制界面身份验证文档(在新标签页中打开)"
2533
+ >文档:控制界面身份验证</a
2534
+ >
2535
+ </div>
2536
+ </div>
2537
+ `})(),a=(()=>{if(e.connected||!e.lastError||(typeof window<"u"?window.isSecureContext:!0)!==!1)return null;const l=e.lastError.toLowerCase();return!l.includes("secure context")&&!l.includes("device identity required")?null:o`
2538
+ <div class="muted" style="margin-top: 8px;">
2539
+ 此页面使用HTTP协议,因此浏览器会阻止设备身份验证。请使用HTTPS(Tailscale Serve)或
2540
+ 在网关主机上打开 <span class="mono">http://127.0.0.1:18789</span>。
2541
+ <div style="margin-top: 6px;">
2542
+ 如果必须使用HTTP,请设置
2543
+ <span class="mono">gateway.controlUi.allowInsecureAuth: true</span>(仅限令牌)。
2544
+ </div>
2545
+ <div style="margin-top: 6px;">
2546
+ <a
2547
+ class="session-link"
2548
+ href="https://docs.clawd.bot/gateway/tailscale"
2549
+ target="_blank"
2550
+ rel="noreferrer"
2551
+ title="Tailscale Serve 文档(在新标签页中打开)"
2552
+ >文档:Tailscale Serve</a
2553
+ >
2554
+ <span class="muted"> · </span>
2555
+ <a
2556
+ class="session-link"
2557
+ href="https://docs.clawd.bot/web/control-ui#insecure-http"
2558
+ target="_blank"
2559
+ rel="noreferrer"
2560
+ title="非安全HTTP文档(在新标签页中打开)"
2561
+ >文档:非安全HTTP</a
2562
+ >
2563
+ </div>
2564
+ </div>
2565
+ `})();return o`
2566
+ <section class="grid grid-cols-2">
2567
+ <div class="card">
2568
+ <div class="card-title">网关访问</div>
2569
+ <div class="card-sub">仪表板连接位置以及身份验证方式。</div>
2570
+ <div class="form-grid" style="margin-top: 16px;">
2571
+ <label class="field">
2572
+ <span>WebSocket URL</span>
2573
+ <input
2574
+ .value=${e.settings.gatewayUrl}
2575
+ @input=${r=>{const l=r.target.value;e.onSettingsChange({...e.settings,gatewayUrl:l})}}
2576
+ placeholder="ws://100.x.y.z:18789"
2577
+ />
2578
+ </label>
2579
+ <label class="field">
2580
+ <span>网关令牌</span>
2581
+ <input
2582
+ .value=${e.settings.token}
2583
+ @input=${r=>{const l=r.target.value;e.onSettingsChange({...e.settings,token:l})}}
2584
+ placeholder="CLAWDBOT_GATEWAY_TOKEN"
2585
+ />
2586
+ </label>
2587
+ <label class="field">
2588
+ <span>密码(不存储)</span>
2589
+ <input
2590
+ type="password"
2591
+ .value=${e.password}
2592
+ @input=${r=>{const l=r.target.value;e.onPasswordChange(l)}}
2593
+ placeholder="系统或共享密码"
2594
+ />
2595
+ </label>
2596
+ <label class="field">
2597
+ <span>默认会话密钥</span>
2598
+ <input
2599
+ .value=${e.settings.sessionKey}
2600
+ @input=${r=>{const l=r.target.value;e.onSessionKeyChange(l)}}
2601
+ />
2602
+ </label>
2603
+ </div>
2604
+ <div class="row" style="margin-top: 14px;">
2605
+ <button class="btn" @click=${()=>e.onConnect()}>连接</button>
2606
+ <button class="btn" @click=${()=>e.onRefresh()}>刷新</button>
2607
+ <span class="muted">点击连接以应用连接更改。</span>
2608
+ </div>
2609
+ </div>
2610
+
2611
+ <div class="card">
2612
+ <div class="card-title">快照</div>
2613
+ <div class="card-sub">最新网关握手信息。</div>
2614
+ <div class="stat-grid" style="margin-top: 16px;">
2615
+ <div class="stat">
2616
+ <div class="stat-label">状态</div>
2617
+ <div class="stat-value ${e.connected?"ok":"warn"}">
2618
+ ${e.connected?"已连接":"已断开"}
2619
+ </div>
2620
+ </div>
2621
+ <div class="stat">
2622
+ <div class="stat-label">运行时间</div>
2623
+ <div class="stat-value">${n}</div>
2624
+ </div>
2625
+ <div class="stat">
2626
+ <div class="stat-label">心跳间隔</div>
2627
+ <div class="stat-value">${s}</div>
2628
+ </div>
2629
+ <div class="stat">
2630
+ <div class="stat-label">上次通道刷新</div>
2631
+ <div class="stat-value">
2632
+ ${e.lastChannelsRefresh?O(e.lastChannelsRefresh):"无"}
2633
+ </div>
2634
+ </div>
2635
+ </div>
2636
+ ${e.lastError?o`<div class="callout danger" style="margin-top: 14px;">
2637
+ <div>${e.lastError}</div>
2638
+ ${i??""}
2639
+ ${a??""}
2640
+ </div>`:o`<div class="callout" style="margin-top: 14px;">
2641
+ 使用通道链接 WhatsApp、Telegram、Discord、Signal 或 iMessage。
2642
+ </div>`}
2643
+ </div>
2644
+ </section>
2645
+
2646
+ <section class="grid grid-cols-3" style="margin-top: 18px;">
2647
+ <div class="card stat-card">
2648
+ <div class="stat-label">实例</div>
2649
+ <div class="stat-value">${e.presenceCount}</div>
2650
+ <div class="muted">过去5分钟内的存在信标。</div>
2651
+ </div>
2652
+ <div class="card stat-card">
2653
+ <div class="stat-label">会话</div>
2654
+ <div class="stat-value">${e.sessionsCount??"n/a"}</div>
2655
+ <div class="muted">网关跟踪的最近会话密钥。</div>
2656
+ </div>
2657
+ <div class="card stat-card">
2658
+ <div class="stat-label">定时任务</div>
2659
+ <div class="stat-value">
2660
+ ${e.cronEnabled==null?"无":e.cronEnabled?"启用":"禁用"}
2661
+ </div>
2662
+ <div class="muted">下次唤醒 ${go(e.cronNext)}</div>
2663
+ </div>
2664
+ </section>
2665
+
2666
+ <section class="card" style="margin-top: 18px;">
2667
+ <div class="card-title">注意事项</div>
2668
+ <div class="card-sub">远程控制设置的快速提醒。</div>
2669
+ <div class="note-grid" style="margin-top: 14px;">
2670
+ <div>
2671
+ <div class="note-title">Tailscale服务</div>
2672
+ <div class="muted">
2673
+ 优先使用服务模式,在回环接口上保持网关并使用尾网认证。
2674
+ </div>
2675
+ </div>
2676
+ <div>
2677
+ <div class="note-title">会话管理</div>
2678
+ <div class="muted">使用 /new 或 sessions.patch 来重置上下文。</div>
2679
+ </div>
2680
+ <div>
2681
+ <div class="note-title">定时任务提醒</div>
2682
+ <div class="muted">对重复运行使用隔离会话。</div>
2683
+ </div>
2684
+ </div>
2685
+ </section>
2686
+ `}const fh=["","off","minimal","low","medium","high"],hh=["","off","on"],gh=[{value:"",label:"inherit"},{value:"off",label:"off (explicit)"},{value:"on",label:"on"}],vh=["","off","on","stream"];function mh(e){if(!e)return"";const t=e.trim().toLowerCase();return t==="z.ai"||t==="z-ai"?"zai":t}function vo(e){return mh(e)==="zai"}function yh(e){return vo(e)?hh:fh}function bh(e,t){return!t||!e||e==="off"?e:"on"}function $h(e,t){return e?t&&e==="on"?"low":e:null}function wh(e){const t=e.result?.sessions??[];return o`
2687
+ <section class="card">
2688
+ <div class="row" style="justify-content: space-between;">
2689
+ <div>
2690
+ <div class="card-title">会话</div>
2691
+ <div class="card-sub">活跃会话密钥和每会话覆盖设置。</div>
2692
+ </div>
2693
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2694
+ ${e.loading?"加载中…":"刷新"}
2695
+ </button>
2696
+ </div>
2697
+
2698
+ <div class="filters" style="margin-top: 14px;">
2699
+ <label class="field">
2700
+ <span>活跃于(分钟内)</span>
2701
+ <input
2702
+ .value=${e.activeMinutes}
2703
+ @input=${n=>e.onFiltersChange({activeMinutes:n.target.value,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
2704
+ />
2705
+ </label>
2706
+ <label class="field">
2707
+ <span>限制</span>
2708
+ <input
2709
+ .value=${e.limit}
2710
+ @input=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:n.target.value,includeGlobal:e.includeGlobal,includeUnknown:e.includeUnknown})}
2711
+ />
2712
+ </label>
2713
+ <label class="field checkbox">
2714
+ <span>包含全局</span>
2715
+ <input
2716
+ type="checkbox"
2717
+ .checked=${e.includeGlobal}
2718
+ @change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:n.target.checked,includeUnknown:e.includeUnknown})}
2719
+ />
2720
+ </label>
2721
+ <label class="field checkbox">
2722
+ <span>包含未知</span>
2723
+ <input
2724
+ type="checkbox"
2725
+ .checked=${e.includeUnknown}
2726
+ @change=${n=>e.onFiltersChange({activeMinutes:e.activeMinutes,limit:e.limit,includeGlobal:e.includeGlobal,includeUnknown:n.target.checked})}
2727
+ />
2728
+ </label>
2729
+ </div>
2730
+
2731
+ ${e.error?o`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:v}
2732
+
2733
+ <div class="muted" style="margin-top: 12px;">
2734
+ ${e.result?`存储: ${e.result.path}`:""}
2735
+ </div>
2736
+
2737
+ <div class="table" style="margin-top: 16px;">
2738
+ <div class="table-head">
2739
+ <div>密钥</div>
2740
+ <div>标签</div>
2741
+ <div>类型</div>
2742
+ <div>更新时间</div>
2743
+ <div>令牌</div>
2744
+ <div>思考</div>
2745
+ <div>详细</div>
2746
+ <div>推理</div>
2747
+ <div>操作</div>
2748
+ </div>
2749
+ ${t.length===0?o`<div class="muted">未找到会话。</div>`:t.map(n=>xh(n,e.basePath,e.onPatch,e.onDelete,e.loading))}
2750
+ </div>
2751
+ </section>
2752
+ `}function xh(e,t,n,s,i){const a=e.updatedAt?O(e.updatedAt):"无",r=e.thinkingLevel??"",l=vo(e.modelProvider),c=bh(r,l),p=yh(e.modelProvider),d=e.verboseLevel??"",u=e.reasoningLevel??"",h=e.displayName??e.key,g=e.kind!=="global",$=g?`${Rs("chat",t)}?session=${encodeURIComponent(e.key)}`:null;return o`
2753
+ <div class="table-row">
2754
+ <div class="mono">${g?o`<a href=${$} class="session-link">${h}</a>`:h}</div>
2755
+ <div>
2756
+ <input
2757
+ .value=${e.label??""}
2758
+ ?disabled=${i}
2759
+ placeholder="(可选)"
2760
+ @change=${w=>{const A=w.target.value.trim();n(e.key,{label:A||null})}}
2761
+ />
2762
+ </div>
2763
+ <div>${e.kind}</div>
2764
+ <div>${a}</div>
2765
+ <div>${kf(e)}</div>
2766
+ <div>
2767
+ <select
2768
+ .value=${c}
2769
+ ?disabled=${i}
2770
+ @change=${w=>{const A=w.target.value;n(e.key,{thinkingLevel:$h(A,l)})}}
2771
+ >
2772
+ ${p.map(w=>o`<option value=${w}>${w||"继承"}</option>`)}
2773
+ </select>
2774
+ </div>
2775
+ <div>
2776
+ <select
2777
+ .value=${d}
2778
+ ?disabled=${i}
2779
+ @change=${w=>{const A=w.target.value;n(e.key,{verboseLevel:A||null})}}
2780
+ >
2781
+ ${gh.map(w=>o`<option value=${w.value}>${w.label}</option>`)}
2782
+ </select>
2783
+ </div>
2784
+ <div>
2785
+ <select
2786
+ .value=${u}
2787
+ ?disabled=${i}
2788
+ @change=${w=>{const A=w.target.value;n(e.key,{reasoningLevel:A||null})}}
2789
+ >
2790
+ ${vh.map(w=>o`<option value=${w}>${w||"继承"}</option>`)}
2791
+ </select>
2792
+ </div>
2793
+ <div>
2794
+ <button class="btn danger" ?disabled=${i} @click=${()=>s(e.key)}>
2795
+ 删除
2796
+ </button>
2797
+ </div>
2798
+ </div>
2799
+ `}function Ah(e){const t=Math.max(0,e),n=Math.floor(t/1e3);if(n<60)return`${n}s`;const s=Math.floor(n/60);return s<60?`${s}m`:`${Math.floor(s/60)}h`}function Me(e,t){return t?o`<div class="exec-approval-meta-row"><span>${e}</span><span>${t}</span></div>`:v}function kh(e){const t=e.execApprovalQueue[0];if(!t)return v;const n=t.request,s=t.expiresAtMs-Date.now(),i=s>0?`expires in ${Ah(s)}`:"expired",a=e.execApprovalQueue.length;return o`
2800
+ <div class="exec-approval-overlay" role="dialog" aria-live="polite">
2801
+ <div class="exec-approval-card">
2802
+ <div class="exec-approval-header">
2803
+ <div>
2804
+ <div class="exec-approval-title">Exec approval needed</div>
2805
+ <div class="exec-approval-sub">${i}</div>
2806
+ </div>
2807
+ ${a>1?o`<div class="exec-approval-queue">${a} pending</div>`:v}
2808
+ </div>
2809
+ <div class="exec-approval-command mono">${n.command}</div>
2810
+ <div class="exec-approval-meta">
2811
+ ${Me("Host",n.host)}
2812
+ ${Me("Agent",n.agentId)}
2813
+ ${Me("Session",n.sessionKey)}
2814
+ ${Me("CWD",n.cwd)}
2815
+ ${Me("Resolved",n.resolvedPath)}
2816
+ ${Me("Security",n.security)}
2817
+ ${Me("Ask",n.ask)}
2818
+ </div>
2819
+ ${e.execApprovalError?o`<div class="exec-approval-error">${e.execApprovalError}</div>`:v}
2820
+ <div class="exec-approval-actions">
2821
+ <button
2822
+ class="btn primary"
2823
+ ?disabled=${e.execApprovalBusy}
2824
+ @click=${()=>e.handleExecApprovalDecision("allow-once")}
2825
+ >
2826
+ Allow once
2827
+ </button>
2828
+ <button
2829
+ class="btn"
2830
+ ?disabled=${e.execApprovalBusy}
2831
+ @click=${()=>e.handleExecApprovalDecision("allow-always")}
2832
+ >
2833
+ Always allow
2834
+ </button>
2835
+ <button
2836
+ class="btn danger"
2837
+ ?disabled=${e.execApprovalBusy}
2838
+ @click=${()=>e.handleExecApprovalDecision("deny")}
2839
+ >
2840
+ Deny
2841
+ </button>
2842
+ </div>
2843
+ </div>
2844
+ </div>
2845
+ `}function Sh(e){const t=e.pendingGatewayUrl;if(!t)return v;const n=e.settings.gatewayUrl||window.location.origin;return o`
2846
+ <div class="exec-approval-overlay" role="dialog" aria-live="polite" aria-modal="true">
2847
+ <div class="exec-approval-card">
2848
+ <div class="exec-approval-header">
2849
+ <div>
2850
+ <div class="exec-approval-title">⚠️ 网关地址变更请求</div>
2851
+ <div class="exec-approval-sub">请仔细核实此请求</div>
2852
+ </div>
2853
+ </div>
2854
+ <div class="exec-approval-meta">
2855
+ <div class="exec-approval-meta-row">
2856
+ <span>当前地址</span>
2857
+ <span class="mono">${n}</span>
2858
+ </div>
2859
+ <div class="exec-approval-meta-row">
2860
+ <span>请求地址</span>
2861
+ <span class="mono" style="color: var(--warning)">${t}</span>
2862
+ </div>
2863
+ </div>
2864
+ <div style="margin: 1rem 0; padding: 0.75rem; background: var(--danger-bg, rgba(239, 68, 68, 0.1)); border-radius: 0.5rem; font-size: 0.875rem;">
2865
+ <strong>安全警告:</strong>此请求来自 URL 参数。如果您不确定来源,请拒绝此请求。
2866
+ 连接到恶意网关可能导致您的认证信息泄露。
2867
+ </div>
2868
+ <div class="exec-approval-actions">
2869
+ <button
2870
+ class="btn danger"
2871
+ @click=${()=>e.rejectPendingGatewayUrl()}
2872
+ >
2873
+ 拒绝
2874
+ </button>
2875
+ <button
2876
+ class="btn primary"
2877
+ @click=${()=>e.acceptPendingGatewayUrl()}
2878
+ >
2879
+ 确认连接
2880
+ </button>
2881
+ </div>
2882
+ </div>
2883
+ </div>
2884
+ `}function _h(e){return{"clawdbot-bundled":"内置","clawdbot-workspace":"工作区","clawdbot-managed":"已管理","clawdbot-extra":"额外"}[e]??e}function Th(e){const t=e.report?.skills??[],n=e.filter.trim().toLowerCase(),s=n?t.filter(i=>[i.name,i.description,i.source].join(" ").toLowerCase().includes(n)):t;return o`
2885
+ <section class="card">
2886
+ <div class="row" style="justify-content: space-between;">
2887
+ <div>
2888
+ <div class="card-title">技能</div>
2889
+ <div class="card-sub">捆绑、管理和工作区技能。</div>
2890
+ </div>
2891
+ <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2892
+ ${e.loading?"加载中…":"刷新"}
2893
+ </button>
2894
+ </div>
2895
+
2896
+ <div class="filters" style="margin-top: 14px;">
2897
+ <label class="field" style="flex: 1;">
2898
+ <span>过滤器</span>
2899
+ <input
2900
+ .value=${e.filter}
2901
+ @input=${i=>e.onFilterChange(i.target.value)}
2902
+ placeholder="搜索技能"
2903
+ />
2904
+ </label>
2905
+ <div class="muted">显示${s.length}项</div>
2906
+ </div>
2907
+
2908
+ ${e.error?o`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:v}
2909
+
2910
+ ${s.length===0?o`<div class="muted" style="margin-top: 16px;">未找到技能。</div>`:o`
2911
+ <div class="list" style="margin-top: 16px;">
2912
+ ${s.map(i=>Eh(i,e))}
2913
+ </div>
2914
+ `}
2915
+ </section>
2916
+ `}function Eh(e,t){const n=t.busyKey===e.skillKey,s=t.edits[e.skillKey]??"",i=t.messages[e.skillKey]??null,a=e.install.length>0&&e.missing.bins.length>0,r=[...e.missing.bins.map(p=>`bin:${p}`),...e.missing.env.map(p=>`env:${p}`),...e.missing.config.map(p=>`config:${p}`),...e.missing.os.map(p=>`os:${p}`)],l=r.length>0?r.join(", "):"",c=[];return e.disabled&&c.push("已禁用"),e.blockedByAllowlist&&c.push("被白名单阻止"),o`
2917
+ <div class="list-item">
2918
+ <div class="list-main">
2919
+ <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
2920
+ <div class="list-title">
2921
+ ${e.emoji?`${e.emoji} `:""}${e.name}
2922
+ </div>
2923
+ <div class="chip-row">
2924
+ <span class="chip">${_h(e.source)}</span>
2925
+ <span class="chip ${e.eligible?"chip-ok":"chip-warn"}>
2926
+ ${e.eligible?"符合条件":"被阻止"}
2927
+ </span>
2928
+ ${e.disabled?o`<span class="chip chip-warn">已禁用</span>`:v}
2929
+ </div>
2930
+ </div>
2931
+ <div class="list-sub" style="margin-top: 4px;">${as(e.description,140)}</div>
2932
+ ${r.length>0?o`
2933
+ <div class="muted" style="margin-top: 6px; font-size: 11px;">
2934
+ 缺少: ${l}
2935
+ </div>
2936
+ `:v}
2937
+ ${c.length>0?o`
2938
+ <div class="muted" style="margin-top: 6px; font-size: 11px;">
2939
+ 原因: ${c.join(", ")}
2940
+ </div>
2941
+ `:v}
2942
+ </div>
2943
+ <div class="list-meta">
2944
+ <div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
2945
+ <button
2946
+ class="btn"
2947
+ ?disabled=${n}
2948
+ @click=${()=>t.onToggle(e.skillKey,e.disabled)}
2949
+ >
2950
+ ${e.disabled?"启用":"禁用"}
2951
+ </button>
2952
+ ${a?o`<button
2953
+ class="btn"
2954
+ ?disabled=${n}
2955
+ @click=${()=>t.onInstall(e.skillKey,e.name,e.install[0].id)}
2956
+ >
2957
+ ${n?"安装中…":e.install[0].label}
2958
+ </button>`:v}
2959
+ </div>
2960
+ ${i?o`<div
2961
+ class="muted"
2962
+ style="margin-top: 8px; color: ${i.kind==="error"?"var(--danger-color, #d14343)":"var(--success-color, #0a7f5a)"};"
2963
+ >
2964
+ ${i.message}
2965
+ </div>`:v}
2966
+ ${e.primaryEnv?o`
2967
+ <div class="field" style="margin-top: 10px;">
2968
+ <span>API密钥</span>
2969
+ <input
2970
+ type="password"
2971
+ .value=${s}
2972
+ @input=${p=>t.onEdit(e.skillKey,p.target.value)}
2973
+ />
2974
+ </div>
2975
+ <button
2976
+ class="btn primary"
2977
+ style="margin-top: 8px;"
2978
+ ?disabled=${n}
2979
+ @click=${()=>t.onSaveKey(e.skillKey)}
2980
+ >
2981
+ 保存密钥
2982
+ </button>
2983
+ `:v}
2984
+ </div>
2985
+ </div>
2986
+ `}function Ch(e,t){const n=Rs(t,e.basePath);return o`
2987
+ <a
2988
+ href=${n}
2989
+ class="nav-item ${e.tab===t?"active":""}"
2990
+ @click=${s=>{s.defaultPrevented||s.button!==0||s.metaKey||s.ctrlKey||s.shiftKey||s.altKey||(s.preventDefault(),e.setTab(t))}}
2991
+ title=${ss(t)}
2992
+ >
2993
+ <span class="nav-item__icon" aria-hidden="true">${W[vl(t)]}</span>
2994
+ <span class="nav-item__text">${ss(t)}</span>
2995
+ </a>
2996
+ `}function Ih(e){const t=Mh(e.sessionKey,e.sessionsResult),n=e.onboarding,s=e.onboarding,i=e.onboarding?!1:e.settings.chatShowThinking,a=e.onboarding?!0:e.settings.chatFocusMode,r=o`<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>`,l=o`<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>`;return o`
2997
+ <div class="chat-controls">
2998
+ <label class="field chat-controls__session">
2999
+ <select
3000
+ .value=${e.sessionKey}
3001
+ ?disabled=${!e.connected}
3002
+ @change=${c=>{const p=c.target.value;e.sessionKey=p,e.chatMessage="",e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:p,lastActiveSessionKey:p}),e.loadAssistantIdentity(),gd(e,p),Je(e)}}
3003
+ >
3004
+ ${Kr(t,c=>c.key,c=>o`<option value=${c.key}>
3005
+ ${c.displayName??c.key}
3006
+ </option>`)}
3007
+ </select>
3008
+ </label>
3009
+ <button
3010
+ class="btn btn--sm btn--icon"
3011
+ ?disabled=${e.chatLoading||!e.connected}
3012
+ @click=${()=>{e.resetToolStream(),Je(e)}}
3013
+ title="刷新聊天记录"
3014
+ >
3015
+ ${r}
3016
+ </button>
3017
+ <span class="chat-controls__separator">|</span>
3018
+ <button
3019
+ class="btn btn--sm btn--icon ${i?"active":""}"
3020
+ ?disabled=${n}
3021
+ @click=${()=>{n||e.applySettings({...e.settings,chatShowThinking:!e.settings.chatShowThinking})}}
3022
+ aria-pressed=${i}
3023
+ title=${n?"在引导期间禁用":"切换助手思考/工作输出"}
3024
+ >
3025
+ ${W.brain}
3026
+ </button>
3027
+ <button
3028
+ class="btn btn--sm btn--icon ${a?"active":""}"
3029
+ ?disabled=${s}
3030
+ @click=${()=>{s||e.applySettings({...e.settings,chatFocusMode:!e.settings.chatFocusMode})}}
3031
+ aria-pressed=${a}
3032
+ title=${s?"在引导期间禁用":"切换焦点模式(隐藏侧边栏和页面头部)"}
3033
+ >
3034
+ ${l}
3035
+ </button>
3036
+ </div>
3037
+ `}function Mh(e,t){const n=new Set,s=[],i=t?.sessions?.find(a=>a.key===e);if(n.add(e),s.push({key:e,displayName:i?.displayName}),t?.sessions)for(const a of t.sessions)n.has(a.key)||(n.add(a.key),s.push({key:a.key,displayName:a.displayName}));return s}const Lh=["system","light","dark"];function Rh(e){const t=Math.max(0,Lh.indexOf(e.theme)),n=s=>i=>{const r={element:i.currentTarget};(i.clientX||i.clientY)&&(r.pointerClientX=i.clientX,r.pointerClientY=i.clientY),e.setTheme(s,r)};return o`
3038
+ <div class="theme-toggle" style="--theme-index: ${t};">
3039
+ <div class="theme-toggle__track" role="group" aria-label="主题">
3040
+ <span class="theme-toggle__indicator"></span>
3041
+ <button
3042
+ class="theme-toggle__button ${e.theme==="system"?"active":""}"
3043
+ @click=${n("system")}
3044
+ aria-pressed=${e.theme==="system"}
3045
+ aria-label="系统主题"
3046
+ title="系统"
3047
+ >
3048
+ ${Oh()}
3049
+ </button>
3050
+ <button
3051
+ class="theme-toggle__button ${e.theme==="light"?"active":""}"
3052
+ @click=${n("light")}
3053
+ aria-pressed=${e.theme==="light"}
3054
+ aria-label="浅色主题"
3055
+ title="浅色"
3056
+ >
3057
+ ${Ph()}
3058
+ </button>
3059
+ <button
3060
+ class="theme-toggle__button ${e.theme==="dark"?"active":""}"
3061
+ @click=${n("dark")}
3062
+ aria-pressed=${e.theme==="dark"}
3063
+ aria-label="深色主题"
3064
+ title="深色"
3065
+ >
3066
+ ${Nh()}
3067
+ </button>
3068
+ </div>
3069
+ </div>
3070
+ `}function Ph(){return o`
3071
+ <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3072
+ <circle cx="12" cy="12" r="4"></circle>
3073
+ <path d="M12 2v2"></path>
3074
+ <path d="M12 20v2"></path>
3075
+ <path d="m4.93 4.93 1.41 1.41"></path>
3076
+ <path d="m17.66 17.66 1.41 1.41"></path>
3077
+ <path d="M2 12h2"></path>
3078
+ <path d="M20 12h2"></path>
3079
+ <path d="m6.34 17.66-1.41 1.41"></path>
3080
+ <path d="m19.07 4.93-1.41 1.41"></path>
3081
+ </svg>
3082
+ `}function Nh(){return o`
3083
+ <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3084
+ <path
3085
+ 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"
3086
+ ></path>
3087
+ </svg>
3088
+ `}function Oh(){return o`
3089
+ <svg class="theme-icon" viewBox="0 0 24 24" aria-hidden="true">
3090
+ <rect width="20" height="14" x="2" y="3" rx="2"></rect>
3091
+ <line x1="8" x2="16" y1="21" y2="21"></line>
3092
+ <line x1="12" x2="12" y1="17" y2="21"></line>
3093
+ </svg>
3094
+ `}const Dh=/^data:/i,Bh=/^https?:\/\//i;function Fh(e){const t=e.agentsList?.agents??[],s=er(e.sessionKey)?.agentId??e.agentsList?.defaultId??"main",a=t.find(l=>l.id===s)?.identity,r=a?.avatarUrl??a?.avatar;if(r)return Dh.test(r)||Bh.test(r)?r:a?.avatarUrl}function Uh(e){const t=e.presenceEntries.length,n=e.sessionsResult?.count??null,s=e.cronStatus?.nextWakeAtMs??null,i=e.connected?null:"与网关断开连接。",a=e.tab==="chat",r=a&&(e.settings.chatFocusMode||e.onboarding),l=e.onboarding?!1:e.settings.chatShowThinking,c=Fh(e),p=e.chatAvatarUrl??c??null;return o`
3095
+ <div class="shell ${a?"shell--chat":""} ${r?"shell--chat-focus":""} ${e.settings.navCollapsed?"shell--nav-collapsed":""} ${e.onboarding?"shell--onboarding":""}">
3096
+ <header class="topbar">
3097
+ <div class="topbar-left">
3098
+ <button
3099
+ class="nav-collapse-toggle"
3100
+ @click=${()=>e.applySettings({...e.settings,navCollapsed:!e.settings.navCollapsed})}
3101
+ title="${e.settings.navCollapsed?"展开侧边栏":"折叠侧边栏"}"
3102
+ aria-label="${e.settings.navCollapsed?"展开侧边栏":"折叠侧边栏"}"
3103
+ >
3104
+ <span class="nav-collapse-toggle__icon">${W.menu}</span>
3105
+ </button>
3106
+ <div class="brand">
3107
+ <div class="brand-logo">
3108
+ <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="Clawdbot" />
3109
+ </div>
3110
+ <div class="brand-text">
3111
+ <div class="brand-title">CLAWDBOT</div>
3112
+ <div class="brand-sub">网关控制台</div>
3113
+ </div>
3114
+ </div>
3115
+ </div>
3116
+ <div class="topbar-status">
3117
+ <div class="pill">
3118
+ <span class="statusDot ${e.connected?"ok":""}"></span>
3119
+ <span>健康状态</span>
3120
+ <span class="mono">${e.connected?"正常":"离线"}</span>
3121
+ </div>
3122
+ ${Rh(e)}
3123
+ </div>
3124
+ </header>
3125
+ <aside class="nav ${e.settings.navCollapsed?"nav--collapsed":""}">
3126
+ ${hl.map(d=>{const u=e.settings.navGroupsCollapsed[d.label]??!1,h=d.tabs.some(g=>g===e.tab);return o`
3127
+ <div class="nav-group ${u&&!h?"nav-group--collapsed":""}">
3128
+ <button
3129
+ class="nav-label"
3130
+ @click=${()=>{const g={...e.settings.navGroupsCollapsed};g[d.label]=!u,e.applySettings({...e.settings,navGroupsCollapsed:g})}}
3131
+ aria-expanded=${!u}
3132
+ >
3133
+ <span class="nav-label__text">${d.label}</span>
3134
+ <span class="nav-label__chevron">${u?"+":"−"}</span>
3135
+ </button>
3136
+ <div class="nav-group__items">
3137
+ ${d.tabs.map(g=>Ch(e,g))}
3138
+ </div>
3139
+ </div>
3140
+ `})}
3141
+ <div class="nav-group nav-group--links">
3142
+ <div class="nav-label nav-label--static">
3143
+ <span class="nav-label__text">资源</span>
3144
+ </div>
3145
+ <div class="nav-group__items">
3146
+ <a
3147
+ class="nav-item nav-item--external"
3148
+ href="https://docs.clawd.bot"
3149
+ target="_blank"
3150
+ rel="noreferrer"
3151
+ title="文档(在新标签页中打开)"
3152
+ >
3153
+ <span class="nav-item__icon" aria-hidden="true">${W.book}</span>
3154
+ <span class="nav-item__text">文档</span>
3155
+ </a>
3156
+ </div>
3157
+ </div>
3158
+ </aside>
3159
+ <main class="content ${a?"content--chat":""}">
3160
+ <section class="content-header">
3161
+ <div>
3162
+ <div class="page-title">${ss(e.tab)}</div>
3163
+ <div class="page-sub">${ml(e.tab)}</div>
3164
+ </div>
3165
+ <div class="page-meta">
3166
+ ${e.lastError?o`<div class="pill danger">${e.lastError}</div>`:v}
3167
+ ${a?Ih(e):v}
3168
+ </div>
3169
+ </section>
3170
+
3171
+ ${e.tab==="overview"?ph({connected:e.connected,hello:e.hello,settings:e.settings,password:e.password,lastError:e.lastError,presenceCount:t,sessionsCount:n,cronEnabled:e.cronStatus?.enabled??null,cronNext:s,lastChannelsRefresh:e.channelsLastSuccess,onSettingsChange:d=>e.applySettings(d),onPasswordChange:d=>e.password=d,onSessionKeyChange:d=>{e.sessionKey=d,e.chatMessage="",e.resetToolStream(),e.applySettings({...e.settings,sessionKey:d,lastActiveSessionKey:d}),e.loadAssistantIdentity()},onConnect:()=>e.connect(),onRefresh:()=>e.loadOverview()}):v}
3172
+
3173
+ ${e.tab==="channels"?pf({connected:e.connected,loading:e.channelsLoading,snapshot:e.channelsSnapshot,lastError:e.channelsError,lastSuccessAt:e.channelsLastSuccess,whatsappMessage:e.whatsappLoginMessage,whatsappQrDataUrl:e.whatsappLoginQrDataUrl,whatsappConnected:e.whatsappLoginConnected,whatsappBusy:e.whatsappBusy,configSchema:e.configSchema,configSchemaLoading:e.configSchemaLoading,configForm:e.configForm,configUiHints:e.configUiHints,configSaving:e.configSaving,configFormDirty:e.configFormDirty,nostrProfileFormState:e.nostrProfileFormState,nostrProfileAccountId:e.nostrProfileAccountId,onRefresh:d=>re(e,d),onWhatsAppStart:d=>e.handleWhatsAppStart(d),onWhatsAppWait:()=>e.handleWhatsAppWait(),onWhatsAppLogout:()=>e.handleWhatsAppLogout(),onConfigPatch:(d,u)=>Bt(e,d,u),onConfigSave:()=>e.handleChannelConfigSave(),onConfigReload:()=>e.handleChannelConfigReload(),onNostrProfileEdit:(d,u)=>e.handleNostrProfileEdit(d,u),onNostrProfileCancel:()=>e.handleNostrProfileCancel(),onNostrProfileFieldChange:(d,u)=>e.handleNostrProfileFieldChange(d,u),onNostrProfileSave:()=>e.handleNostrProfileSave(),onNostrProfileImport:()=>e.handleNostrProfileImport(),onNostrProfileToggleAdvanced:()=>e.handleNostrProfileToggleAdvanced()}):v}
3174
+
3175
+ ${e.tab==="instances"?Of({loading:e.presenceLoading,entries:e.presenceEntries,lastError:e.presenceError,statusMessage:e.presenceStatus,onRefresh:()=>js(e)}):v}
3176
+
3177
+ ${e.tab==="sessions"?wh({loading:e.sessionsLoading,result:e.sessionsResult,error:e.sessionsError,activeMinutes:e.sessionsFilterActive,limit:e.sessionsFilterLimit,includeGlobal:e.sessionsIncludeGlobal,includeUnknown:e.sessionsIncludeUnknown,basePath:e.basePath,onFiltersChange:d=>{e.sessionsFilterActive=d.activeMinutes,e.sessionsFilterLimit=d.limit,e.sessionsIncludeGlobal=d.includeGlobal,e.sessionsIncludeUnknown=d.includeUnknown},onRefresh:()=>st(e),onPatch:(d,u)=>Ll(e,d,u),onDelete:d=>Rl(e,d)}):v}
3178
+
3179
+ ${e.tab==="cron"?Mf({loading:e.cronLoading,status:e.cronStatus,jobs:e.cronJobs,error:e.cronError,busy:e.cronBusy,form:e.cronForm,channels:e.channelsSnapshot?.channelMeta?.length?e.channelsSnapshot.channelMeta.map(d=>d.id):e.channelsSnapshot?.channelOrder??[],channelLabels:e.channelsSnapshot?.channelLabels??{},channelMeta:e.channelsSnapshot?.channelMeta??[],runsJobId:e.cronRunsJobId,runs:e.cronRuns,onFormChange:d=>e.cronForm={...e.cronForm,...d},onRefresh:()=>e.loadCron(),onAdd:()=>tc(e),onToggle:(d,u)=>nc(e,d,u),onRun:d=>sc(e,d),onRemove:d=>ic(e,d),onLoadRuns:d=>ur(e,d)}):v}
3180
+
3181
+ ${e.tab==="skills"?Th({loading:e.skillsLoading,report:e.skillsReport,error:e.skillsError,filter:e.skillsFilter,edits:e.skillEdits,messages:e.skillMessages,busyKey:e.skillsBusyKey,onFilterChange:d=>e.skillsFilter=d,onRefresh:()=>Et(e,{clearMessages:!0}),onToggle:(d,u)=>Xc(e,d,u),onEdit:(d,u)=>Zc(e,d,u),onSaveKey:d=>Jc(e,d),onInstall:(d,u,h)=>ed(e,d,u,h)}):v}
3182
+
3183
+ ${e.tab==="nodes"?Kf({loading:e.nodesLoading,nodes:e.nodes,devicesLoading:e.devicesLoading,devicesError:e.devicesError,devicesList:e.devicesList,configForm:e.configForm??e.configSnapshot?.config,configLoading:e.configLoading,configSaving:e.configSaving,configDirty:e.configFormDirty,configFormMode:e.configFormMode,execApprovalsLoading:e.execApprovalsLoading,execApprovalsSaving:e.execApprovalsSaving,execApprovalsDirty:e.execApprovalsDirty,execApprovalsSnapshot:e.execApprovalsSnapshot,execApprovalsForm:e.execApprovalsForm,execApprovalsSelectedAgent:e.execApprovalsSelectedAgent,execApprovalsTarget:e.execApprovalsTarget,execApprovalsTargetNodeId:e.execApprovalsTargetNodeId,onRefresh:()=>pn(e),onDevicesRefresh:()=>_e(e),onDeviceApprove:d=>Kc(e,d),onDeviceReject:d=>Hc(e,d),onDeviceRotate:(d,u,h)=>zc(e,{deviceId:d,role:u,scopes:h}),onDeviceRevoke:(d,u)=>jc(e,{deviceId:d,role:u}),onLoadConfig:()=>ye(e),onLoadExecApprovals:()=>{const d=e.execApprovalsTarget==="node"&&e.execApprovalsTargetNodeId?{kind:"node",nodeId:e.execApprovalsTargetNodeId}:{kind:"gateway"};return zs(e,d)},onBindDefault:d=>{d?Bt(e,["tools","exec","node"],d):Zi(e,["tools","exec","node"])},onBindAgent:(d,u)=>{const h=["agents","list",d,"tools","exec","node"];u?Bt(e,h,u):Zi(e,h)},onSaveBindings:()=>ls(e),onExecApprovalsTargetChange:(d,u)=>{e.execApprovalsTarget=d,e.execApprovalsTargetNodeId=u,e.execApprovalsSnapshot=null,e.execApprovalsForm=null,e.execApprovalsDirty=!1,e.execApprovalsSelectedAgent=null},onExecApprovalsSelectAgent:d=>{e.execApprovalsSelectedAgent=d},onExecApprovalsPatch:(d,u)=>Qc(e,d,u),onExecApprovalsRemove:d=>Yc(e,d),onSaveExecApprovals:()=>{const d=e.execApprovalsTarget==="node"&&e.execApprovalsTargetNodeId?{kind:"node",nodeId:e.execApprovalsTargetNodeId}:{kind:"gateway"};return Gc(e,d)}}):v}
3184
+
3185
+ ${e.tab==="chat"?Cp({sessionKey:e.sessionKey,onSessionKeyChange:d=>{e.sessionKey=d,e.chatMessage="",e.chatAttachments=[],e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.chatQueue=[],e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:d,lastActiveSessionKey:d}),e.loadAssistantIdentity(),Je(e),fs(e)},thinkingLevel:e.chatThinkingLevel,showThinking:l,loading:e.chatLoading,sending:e.chatSending,compactionStatus:e.compactionStatus,assistantAvatarUrl:p,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,draft:e.chatMessage,queue:e.chatQueue,connected:e.connected,canSend:e.connected,disabledReason:i,error:e.lastError,sessions:e.sessionsResult,focusMode:r,onRefresh:()=>(e.resetToolStream(),Promise.all([Je(e),fs(e)])),onToggleFocusMode:()=>{e.onboarding||e.applySettings({...e.settings,chatFocusMode:!e.settings.chatFocusMode})},onChatScroll:d=>e.handleChatScroll(d),onDraftChange:d=>e.chatMessage=d,attachments:e.chatAttachments,onAttachmentsChange:d=>e.chatAttachments=d,onSend:()=>e.handleSendChat(),canAbort:!!e.chatRunId,onAbort:()=>{e.handleAbortChat()},onQueueRemove:d=>e.removeQueuedMessage(d),onNewSession:()=>e.handleSendChat("/new",{restoreDraft:!0}),sidebarOpen:e.sidebarOpen,sidebarContent:e.sidebarContent,sidebarError:e.sidebarError,splitRatio:e.splitRatio,onOpenSidebar:d=>e.handleOpenSidebar(d),onCloseSidebar:()=>e.handleCloseSidebar(),onSplitRatioChange:d=>e.handleSplitRatioChange(d),assistantName:e.assistantName,assistantAvatar:e.assistantAvatar}):v}
3186
+
3187
+ ${e.tab==="config"?Wp({raw:e.configRaw,originalRaw:e.configRawOriginal,valid:e.configValid,issues:e.configIssues,loading:e.configLoading,saving:e.configSaving,applying:e.configApplying,updating:e.updateRunning,connected:e.connected,schema:e.configSchema,schemaLoading:e.configSchemaLoading,uiHints:e.configUiHints,formMode:e.configFormMode,formValue:e.configForm,originalValue:e.configFormOriginal,searchQuery:e.configSearchQuery,activeSection:e.configActiveSection,activeSubsection:e.configActiveSubsection,onRawChange:d=>{e.configRaw=d},onFormModeChange:d=>e.configFormMode=d,onFormPatch:(d,u)=>Bt(e,d,u),onSearchChange:d=>e.configSearchQuery=d,onSectionChange:d=>{e.configActiveSection=d,e.configActiveSubsection=null},onSubsectionChange:d=>e.configActiveSubsection=d,onReload:()=>ye(e),onSave:()=>ls(e),onApply:()=>Zl(e),onUpdate:()=>Xl(e)}):v}
3188
+
3189
+ ${e.tab==="debug"?Nf({loading:e.debugLoading,status:e.debugStatus,health:e.debugHealth,models:e.debugModels,heartbeat:e.debugHeartbeat,eventLog:e.eventLog,callMethod:e.debugCallMethod,callParams:e.debugCallParams,callResult:e.debugCallResult,callError:e.debugCallError,onCallMethodChange:d=>e.debugCallMethod=d,onCallParamsChange:d=>e.debugCallParams=d,onRefresh:()=>dn(e),onCall:()=>lc(e)}):v}
3190
+
3191
+ ${e.tab==="logs"?Uf({loading:e.logsLoading,error:e.logsError,file:e.logsFile,entries:e.logsEntries,filterText:e.logsFilterText,levelFilters:e.logsLevelFilters,autoFollow:e.logsAutoFollow,truncated:e.logsTruncated,onFilterTextChange:d=>e.logsFilterText=d,onLevelToggle:(d,u)=>{e.logsLevelFilters={...e.logsLevelFilters,[d]:u}},onToggleAutoFollow:d=>e.logsAutoFollow=d,onRefresh:()=>Os(e,{reset:!0}),onExport:(d,u)=>e.exportLogs(d,u),onScroll:d=>e.handleLogsScroll(d)}):v}
3192
+ </main>
3193
+ ${kh(e)}
3194
+ ${Sh(e)}
3195
+ </div>
3196
+ `}const Kh={trace:!0,debug:!0,info:!0,warn:!0,error:!0,fatal:!0},Hh={name:"",description:"",agentId:"",enabled:!0,scheduleKind:"every",scheduleAt:"",everyAmount:"30",everyUnit:"minutes",cronExpr:"0 7 * * *",cronTz:"",sessionTarget:"main",wakeMode:"next-heartbeat",payloadKind:"systemEvent",payloadText:"",deliver:!1,channel:"last",to:"",timeoutSeconds:"",postToMainPrefix:""};async function zh(e){if(!(!e.client||!e.connected)&&!e.agentsLoading){e.agentsLoading=!0,e.agentsError=null;try{const t=await e.client.request("agents.list",{});t&&(e.agentsList=t)}catch(t){e.agentsError=String(t)}finally{e.agentsLoading=!1}}}const mo={WEBCHAT_UI:"webchat-ui",CONTROL_UI:"clawdbot-control-ui",WEBCHAT:"webchat",CLI:"cli",GATEWAY_CLIENT:"gateway-client",MACOS_APP:"clawdbot-macos",IOS_APP:"clawdbot-ios",ANDROID_APP:"clawdbot-android",NODE_HOST:"node-host",TEST:"test",FINGERPRINT:"fingerprint",PROBE:"clawdbot-probe"},za=mo,Ss={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",NODE:"node",PROBE:"probe",TEST:"test"};new Set(Object.values(mo));new Set(Object.values(Ss));function jh(e){const t=e.version??(e.nonce?"v2":"v1"),n=e.scopes.join(","),s=e.token??"",i=[t,e.deviceId,e.clientId,e.clientMode,e.role,n,String(e.signedAtMs),s];return t==="v2"&&i.push(e.nonce??""),i.join("|")}const qh=4008;class Vh{constructor(t){this.opts=t,this.ws=null,this.pending=new Map,this.closed=!1,this.lastSeq=null,this.connectNonce=null,this.connectSent=!1,this.connectTimer=null,this.backoffMs=800}start(){this.closed=!1,this.connect()}stop(){this.closed=!0,this.ws?.close(),this.ws=null,this.flushPending(new Error("gateway client stopped"))}get connected(){return this.ws?.readyState===WebSocket.OPEN}connect(){this.closed||(this.ws=new WebSocket(this.opts.url),this.ws.onopen=()=>this.queueConnect(),this.ws.onmessage=t=>this.handleMessage(String(t.data??"")),this.ws.onclose=t=>{const n=String(t.reason??"");this.ws=null,this.flushPending(new Error(`gateway closed (${t.code}): ${n}`)),this.opts.onClose?.({code:t.code,reason:n}),this.scheduleReconnect()},this.ws.onerror=()=>{})}scheduleReconnect(){if(this.closed)return;const t=this.backoffMs;this.backoffMs=Math.min(this.backoffMs*1.7,15e3),window.setTimeout(()=>this.connect(),t)}flushPending(t){for(const[,n]of this.pending)n.reject(t);this.pending.clear()}async sendConnect(){if(this.connectSent)return;this.connectSent=!0,this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null);const t=typeof crypto<"u"&&!!crypto.subtle,n=["operator.admin","operator.approvals","operator.pairing"],s="operator";let i=null,a=!1,r=this.opts.token;if(t){i=await Us();const d=Uc({deviceId:i.deviceId,role:s})?.token;r=d??this.opts.token,a=!!(d&&this.opts.token)}const l=r||this.opts.password?{token:r,password:this.opts.password}:void 0;let c;if(t&&i){const d=Date.now(),u=this.connectNonce??void 0,h=jh({deviceId:i.deviceId,clientId:this.opts.clientName??za.CONTROL_UI,clientMode:this.opts.mode??Ss.WEBCHAT,role:s,scopes:n,signedAtMs:d,token:r??null,nonce:u}),g=await Bc(i.privateKey,h);c={id:i.deviceId,publicKey:i.publicKey,signature:g,signedAt:d,nonce:u}}const p={minProtocol:3,maxProtocol:3,client:{id:this.opts.clientName??za.CONTROL_UI,version:this.opts.clientVersion??"dev",platform:this.opts.platform??navigator.platform??"web",mode:this.opts.mode??Ss.WEBCHAT,instanceId:this.opts.instanceId},role:s,scopes:n,device:c,caps:[],auth:l,userAgent:navigator.userAgent,locale:navigator.language};this.request("connect",p).then(d=>{d?.auth?.deviceToken&&i&&Er({deviceId:i.deviceId,role:d.auth.role??s,token:d.auth.deviceToken,scopes:d.auth.scopes??[]}),this.backoffMs=800,this.opts.onHello?.(d)}).catch(()=>{a&&i&&Cr({deviceId:i.deviceId,role:s}),this.ws?.close(qh,"connect failed")})}handleMessage(t){let n;try{n=JSON.parse(t)}catch{return}const s=n;if(s.type==="event"){const i=n;if(i.event==="connect.challenge"){const r=i.payload,l=r&&typeof r.nonce=="string"?r.nonce:null;l&&(this.connectNonce=l,this.sendConnect());return}const a=typeof i.seq=="number"?i.seq:null;a!==null&&(this.lastSeq!==null&&a>this.lastSeq+1&&this.opts.onGap?.({expected:this.lastSeq+1,received:a}),this.lastSeq=a);try{this.opts.onEvent?.(i)}catch(r){console.error("[gateway] event handler error:",r)}return}if(s.type==="res"){const i=n,a=this.pending.get(i.id);if(!a)return;this.pending.delete(i.id),i.ok?a.resolve(i.payload):a.reject(new Error(i.error?.message??"request failed"));return}}request(t,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(new Error("gateway not connected"));const s=Ps(),i={type:"req",id:s,method:t,params:n},a=new Promise((r,l)=>{this.pending.set(s,{resolve:c=>r(c),reject:l})});return this.ws.send(JSON.stringify(i)),a}queueConnect(){this.connectNonce=null,this.connectSent=!1,this.connectTimer!==null&&window.clearTimeout(this.connectTimer),this.connectTimer=window.setTimeout(()=>{this.sendConnect()},750)}}function _s(e){return typeof e=="object"&&e!==null}function Wh(e){if(!_s(e))return null;const t=typeof e.id=="string"?e.id.trim():"",n=e.request;if(!t||!_s(n))return null;const s=typeof n.command=="string"?n.command.trim():"";if(!s)return null;const i=typeof e.createdAtMs=="number"?e.createdAtMs:0,a=typeof e.expiresAtMs=="number"?e.expiresAtMs:0;return!i||!a?null:{id:t,request:{command:s,cwd:typeof n.cwd=="string"?n.cwd:null,host:typeof n.host=="string"?n.host:null,security:typeof n.security=="string"?n.security:null,ask:typeof n.ask=="string"?n.ask:null,agentId:typeof n.agentId=="string"?n.agentId:null,resolvedPath:typeof n.resolvedPath=="string"?n.resolvedPath:null,sessionKey:typeof n.sessionKey=="string"?n.sessionKey:null},createdAtMs:i,expiresAtMs:a}}function Gh(e){if(!_s(e))return null;const t=typeof e.id=="string"?e.id.trim():"";return t?{id:t,decision:typeof e.decision=="string"?e.decision:null,resolvedBy:typeof e.resolvedBy=="string"?e.resolvedBy:null,ts:typeof e.ts=="number"?e.ts:null}:null}function yo(e){const t=Date.now();return e.filter(n=>n.expiresAtMs>t)}function Qh(e,t){const n=yo(e).filter(s=>s.id!==t.id);return n.push(t),n}function ja(e,t){return yo(e).filter(n=>n.id!==t)}async function bo(e,t){if(!e.client||!e.connected)return;const n=e.sessionKey.trim(),s=n?{sessionKey:n}:{};try{const i=await e.client.request("agent.identity.get",s);if(!i)return;const a=ns(i);e.assistantName=a.name,e.assistantAvatar=a.avatar,e.assistantAgentId=a.agentId??null}catch{}}function Jn(e,t){const n=(e??"").trim(),s=t.mainSessionKey?.trim();if(!s)return n;if(!n)return s;const i=t.mainKey?.trim()||"main",a=t.defaultAgentId?.trim();return n==="main"||n===i||a&&(n===`agent:${a}:main`||n===`agent:${a}:${i}`)?s:n}function Yh(e,t){if(!t?.mainSessionKey)return;const n=Jn(e.sessionKey,t),s=Jn(e.settings.sessionKey,t),i=Jn(e.settings.lastActiveSessionKey,t),a=n||s||e.sessionKey,r={...e.settings,sessionKey:s||a,lastActiveSessionKey:i||a},l=r.sessionKey!==e.settings.sessionKey||r.lastActiveSessionKey!==e.settings.lastActiveSessionKey;a!==e.sessionKey&&(e.sessionKey=a),l&&Fe(e,r)}function $o(e){e.lastError=null,e.hello=null,e.connected=!1,e.execApprovalQueue=[],e.execApprovalError=null,e.client?.stop(),e.client=new Vh({url:e.settings.gatewayUrl,token:e.settings.token.trim()?e.settings.token:void 0,password:e.password.trim()?e.password:void 0,clientName:"clawdbot-control-ui",mode:"webchat",onHello:t=>{e.connected=!0,e.lastError=null,e.hello=t,Jh(e,t),bo(e),zh(e),pn(e,{quiet:!0}),_e(e,{quiet:!0}),Ys(e)},onClose:({code:t,reason:n})=>{e.connected=!1,t!==1012&&(e.lastError=`disconnected (${t}): ${n||"no reason"}`)},onEvent:t=>Zh(e,t),onGap:({expected:t,received:n})=>{e.lastError=`event gap detected (expected seq ${t}, got ${n}); refresh recommended`}}),e.client.start()}function Zh(e,t){try{Xh(e,t)}catch(n){console.error("[gateway] handleGatewayEvent error:",t.event,n)}}function Xh(e,t){if(e.eventLogBuffer=[{ts:Date.now(),event:t.event,payload:t.payload},...e.eventLogBuffer].slice(0,250),e.tab==="debug"&&(e.eventLog=e.eventLogBuffer),t.event==="agent"){if(e.onboarding)return;zl(e,t.payload);return}if(t.event==="chat"){const n=t.payload;n?.sessionKey&&Ir(e,n.sessionKey);const s=Ml(e,n);(s==="final"||s==="error"||s==="aborted")&&(Ns(e),xd(e)),s==="final"&&Je(e);return}if(t.event==="presence"){const n=t.payload;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence,e.presenceError=null,e.presenceStatus=null);return}if(t.event==="cron"&&e.tab==="cron"&&Zs(e),(t.event==="device.pair.requested"||t.event==="device.pair.resolved")&&_e(e,{quiet:!0}),t.event==="exec.approval.requested"){const n=Wh(t.payload);if(n){e.execApprovalQueue=Qh(e.execApprovalQueue,n),e.execApprovalError=null;const s=Math.max(0,n.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=ja(e.execApprovalQueue,n.id)},s)}return}if(t.event==="exec.approval.resolved"){const n=Gh(t.payload);n&&(e.execApprovalQueue=ja(e.execApprovalQueue,n.id))}}function Jh(e,t){const n=t.snapshot;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n?.health&&(e.debugHealth=n.health),n?.sessionDefaults&&Yh(e,n.sessionDefaults)}function eg(e){e.basePath=cd(),fd(e,!0),dd(e),ud(e),window.addEventListener("popstate",e.popStateHandler),rd(e),$o(e),id(e),e.tab==="logs"&&Vs(e),e.tab==="debug"&&Gs(e)}function tg(e){Gl(e)}function ng(e){window.removeEventListener("popstate",e.popStateHandler),ad(e),Ws(e),Qs(e),pd(e),e.topbarObserver?.disconnect(),e.topbarObserver=null}function sg(e,t){if(e.tab==="chat"&&(t.has("chatMessages")||t.has("chatToolMessages")||t.has("chatStream")||t.has("chatLoading")||t.has("tab"))){const n=t.has("tab"),s=t.has("chatLoading")&&t.get("chatLoading")===!0&&e.chatLoading===!1;ln(e,n||s||!e.chatHasAutoScrolled)}e.tab==="logs"&&(t.has("logsEntries")||t.has("logsAutoFollow")||t.has("tab"))&&e.logsAutoFollow&&e.logsAtBottom&&or(e,t.has("tab")||t.has("logsAutoFollow"))}async function ig(e,t){await ac(e,t),await re(e,!0)}async function ag(e){await rc(e),await re(e,!0)}async function rg(e){await oc(e),await re(e,!0)}async function og(e){await ls(e),await ye(e),await re(e,!0)}async function lg(e){await ye(e),await re(e,!0)}function cg(e){if(!Array.isArray(e))return{};const t={};for(const n of e){if(typeof n!="string")continue;const[s,...i]=n.split(":");if(!s||i.length===0)continue;const a=s.trim(),r=i.join(":").trim();a&&r&&(t[a]=r)}return t}function wo(e){return(e.channelsSnapshot?.channelAccounts?.nostr??[])[0]?.accountId??e.nostrProfileAccountId??"default"}function xo(e,t=""){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}function dg(e,t,n){e.nostrProfileAccountId=t,e.nostrProfileFormState=rf(n??void 0)}function ug(e){e.nostrProfileFormState=null,e.nostrProfileAccountId=null}function pg(e,t,n){const s=e.nostrProfileFormState;s&&(e.nostrProfileFormState={...s,values:{...s.values,[t]:n},fieldErrors:{...s.fieldErrors,[t]:""}})}function fg(e){const t=e.nostrProfileFormState;t&&(e.nostrProfileFormState={...t,showAdvanced:!t.showAdvanced})}async function hg(e){const t=e.nostrProfileFormState;if(!t||t.saving)return;const n=wo(e);e.nostrProfileFormState={...t,saving:!0,error:null,success:null,fieldErrors:{}};try{const s=await fetch(xo(n),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.values)}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const a=i?.error??`Profile update failed (${s.status})`;e.nostrProfileFormState={...t,saving:!1,error:a,success:null,fieldErrors:cg(i?.details)};return}if(!i.persisted){e.nostrProfileFormState={...t,saving:!1,error:"Profile publish failed on all relays.",success:null};return}e.nostrProfileFormState={...t,saving:!1,error:null,success:"Profile published to relays.",fieldErrors:{},original:{...t.values}},await re(e,!0)}catch(s){e.nostrProfileFormState={...t,saving:!1,error:`Profile update failed: ${String(s)}`,success:null}}}async function gg(e){const t=e.nostrProfileFormState;if(!t||t.importing)return;const n=wo(e);e.nostrProfileFormState={...t,importing:!0,error:null,success:null};try{const s=await fetch(xo(n,"/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoMerge:!0})}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const c=i?.error??`Profile import failed (${s.status})`;e.nostrProfileFormState={...t,importing:!1,error:c,success:null};return}const a=i.merged??i.imported??null,r=a?{...t.values,...a}:t.values,l=!!(r.banner||r.website||r.nip05||r.lud16);e.nostrProfileFormState={...t,importing:!1,values:r,error:null,success:i.saved?"Profile imported from relays. Review and publish.":"Profile imported. Review and publish.",showAdvanced:l},i.saved&&await re(e,!0)}catch(s){e.nostrProfileFormState={...t,importing:!1,error:`Profile import failed: ${String(s)}`,success:null}}}var vg=Object.defineProperty,mg=Object.getOwnPropertyDescriptor,y=(e,t,n,s)=>{for(var i=s>1?void 0:s?mg(t,n):t,a=e.length-1,r;a>=0;a--)(r=e[a])&&(i=(s?r(t,n,i):r(i))||i);return s&&i&&vg(t,n,i),i};const es=ul();function yg(){if(!window.location.search)return!1;const t=new URLSearchParams(window.location.search).get("onboarding");if(!t)return!1;const n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}let m=class extends Ze{constructor(){super(...arguments),this.settings=pl(),this.password="",this.tab="chat",this.onboarding=yg(),this.connected=!1,this.theme=this.settings.theme??"system",this.themeResolved="dark",this.hello=null,this.lastError=null,this.eventLog=[],this.eventLogBuffer=[],this.toolStreamSyncTimer=null,this.sidebarCloseTimer=null,this.assistantName=es.name,this.assistantAvatar=es.avatar,this.assistantAgentId=es.agentId??null,this.pendingGatewayUrl=null,this.sessionKey=this.settings.sessionKey,this.chatLoading=!1,this.chatSending=!1,this.chatMessage="",this.chatMessages=[],this.chatToolMessages=[],this.chatStream=null,this.chatStreamStartedAt=null,this.chatRunId=null,this.compactionStatus=null,this.chatAvatarUrl=null,this.chatThinkingLevel=null,this.chatQueue=[],this.chatAttachments=[],this.sidebarOpen=!1,this.sidebarContent=null,this.sidebarError=null,this.splitRatio=this.settings.splitRatio,this.nodesLoading=!1,this.nodes=[],this.devicesLoading=!1,this.devicesError=null,this.devicesList=null,this.execApprovalsLoading=!1,this.execApprovalsSaving=!1,this.execApprovalsDirty=!1,this.execApprovalsSnapshot=null,this.execApprovalsForm=null,this.execApprovalsSelectedAgent=null,this.execApprovalsTarget="gateway",this.execApprovalsTargetNodeId=null,this.execApprovalQueue=[],this.execApprovalBusy=!1,this.execApprovalError=null,this.configLoading=!1,this.configRaw=`{
3197
+ }
3198
+ `,this.configRawOriginal="",this.configValid=null,this.configIssues=[],this.configSaving=!1,this.configApplying=!1,this.updateRunning=!1,this.applySessionKey=this.settings.lastActiveSessionKey,this.configSnapshot=null,this.configSchema=null,this.configSchemaVersion=null,this.configSchemaLoading=!1,this.configUiHints={},this.configForm=null,this.configFormOriginal=null,this.configFormDirty=!1,this.configFormMode="form",this.configSearchQuery="",this.configActiveSection=null,this.configActiveSubsection=null,this.channelsLoading=!1,this.channelsSnapshot=null,this.channelsError=null,this.channelsLastSuccess=null,this.whatsappLoginMessage=null,this.whatsappLoginQrDataUrl=null,this.whatsappLoginConnected=null,this.whatsappBusy=!1,this.nostrProfileFormState=null,this.nostrProfileAccountId=null,this.presenceLoading=!1,this.presenceEntries=[],this.presenceError=null,this.presenceStatus=null,this.agentsLoading=!1,this.agentsList=null,this.agentsError=null,this.sessionsLoading=!1,this.sessionsResult=null,this.sessionsError=null,this.sessionsFilterActive="",this.sessionsFilterLimit="120",this.sessionsIncludeGlobal=!0,this.sessionsIncludeUnknown=!1,this.cronLoading=!1,this.cronJobs=[],this.cronStatus=null,this.cronError=null,this.cronForm={...Hh},this.cronRunsJobId=null,this.cronRuns=[],this.cronBusy=!1,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillsFilter="",this.skillEdits={},this.skillsBusyKey=null,this.skillMessages={},this.debugLoading=!1,this.debugStatus=null,this.debugHealth=null,this.debugModels=[],this.debugHeartbeat=null,this.debugCallMethod="",this.debugCallParams="{}",this.debugCallResult=null,this.debugCallError=null,this.logsLoading=!1,this.logsError=null,this.logsFile=null,this.logsEntries=[],this.logsFilterText="",this.logsLevelFilters={...Kh},this.logsAutoFollow=!0,this.logsTruncated=!1,this.logsCursor=null,this.logsLastFetchAt=null,this.logsLimit=500,this.logsMaxBytes=25e4,this.logsAtBottom=!0,this.client=null,this.chatScrollFrame=null,this.chatScrollTimeout=null,this.chatHasAutoScrolled=!1,this.chatUserNearBottom=!0,this.nodesPollInterval=null,this.logsPollInterval=null,this.debugPollInterval=null,this.logsScrollFrame=null,this.toolStreamById=new Map,this.toolStreamOrder=[],this.basePath="",this.popStateHandler=()=>hd(this),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),eg(this)}firstUpdated(){tg(this)}disconnectedCallback(){ng(this),super.disconnectedCallback()}updated(e){sg(this,e)}connect(){$o(this)}handleChatScroll(e){jl(this,e)}handleLogsScroll(e){ql(this,e)}exportLogs(e,t){Wl(e,t)}resetToolStream(){Ns(this)}resetChatScroll(){Vl(this)}async loadAssistantIdentity(){await bo(this)}applySettings(e){Fe(this,e)}setTab(e){od(this,e)}setTheme(e,t){ld(this,e,t)}async loadOverview(){await Rr(this)}async loadCron(){await Zs(this)}async handleAbortChat(){await Nr(this)}removeQueuedMessage(e){bd(this,e)}async handleSendChat(e,t){await $d(this,e,t)}async handleWhatsAppStart(e){await ig(this,e)}async handleWhatsAppWait(){await ag(this)}async handleWhatsAppLogout(){await rg(this)}async handleChannelConfigSave(){await og(this)}async handleChannelConfigReload(){await lg(this)}handleNostrProfileEdit(e,t){dg(this,e,t)}handleNostrProfileCancel(){ug(this)}handleNostrProfileFieldChange(e,t){pg(this,e,t)}async handleNostrProfileSave(){await hg(this)}async handleNostrProfileImport(){await gg(this)}handleNostrProfileToggleAdvanced(){fg(this)}async handleExecApprovalDecision(e){const t=this.execApprovalQueue[0];if(!(!t||!this.client||this.execApprovalBusy)){this.execApprovalBusy=!0,this.execApprovalError=null;try{await this.client.request("exec.approval.resolve",{id:t.id,decision:e}),this.execApprovalQueue=this.execApprovalQueue.filter(n=>n.id!==t.id)}catch(n){this.execApprovalError=`Exec approval failed: ${String(n)}`}finally{this.execApprovalBusy=!1}}}handleOpenSidebar(e){this.sidebarCloseTimer!=null&&(window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=null),this.sidebarContent=e,this.sidebarError=null,this.sidebarOpen=!0}handleCloseSidebar(){this.sidebarOpen=!1,this.sidebarCloseTimer!=null&&window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=window.setTimeout(()=>{this.sidebarOpen||(this.sidebarContent=null,this.sidebarError=null,this.sidebarCloseTimer=null)},200)}handleSplitRatioChange(e){const t=Math.max(.4,Math.min(.7,e));this.splitRatio=t,this.applySettings({...this.settings,splitRatio:t})}acceptPendingGatewayUrl(){const e=this.pendingGatewayUrl;e&&(this.pendingGatewayUrl=null,this.applySettings({...this.settings,gatewayUrl:e}),this.connect())}rejectPendingGatewayUrl(){this.pendingGatewayUrl=null}render(){return Uh(this)}};y([b()],m.prototype,"settings",2);y([b()],m.prototype,"password",2);y([b()],m.prototype,"tab",2);y([b()],m.prototype,"onboarding",2);y([b()],m.prototype,"connected",2);y([b()],m.prototype,"theme",2);y([b()],m.prototype,"themeResolved",2);y([b()],m.prototype,"hello",2);y([b()],m.prototype,"lastError",2);y([b()],m.prototype,"eventLog",2);y([b()],m.prototype,"assistantName",2);y([b()],m.prototype,"assistantAvatar",2);y([b()],m.prototype,"assistantAgentId",2);y([b()],m.prototype,"pendingGatewayUrl",2);y([b()],m.prototype,"sessionKey",2);y([b()],m.prototype,"chatLoading",2);y([b()],m.prototype,"chatSending",2);y([b()],m.prototype,"chatMessage",2);y([b()],m.prototype,"chatMessages",2);y([b()],m.prototype,"chatToolMessages",2);y([b()],m.prototype,"chatStream",2);y([b()],m.prototype,"chatStreamStartedAt",2);y([b()],m.prototype,"chatRunId",2);y([b()],m.prototype,"compactionStatus",2);y([b()],m.prototype,"chatAvatarUrl",2);y([b()],m.prototype,"chatThinkingLevel",2);y([b()],m.prototype,"chatQueue",2);y([b()],m.prototype,"chatAttachments",2);y([b()],m.prototype,"sidebarOpen",2);y([b()],m.prototype,"sidebarContent",2);y([b()],m.prototype,"sidebarError",2);y([b()],m.prototype,"splitRatio",2);y([b()],m.prototype,"nodesLoading",2);y([b()],m.prototype,"nodes",2);y([b()],m.prototype,"devicesLoading",2);y([b()],m.prototype,"devicesError",2);y([b()],m.prototype,"devicesList",2);y([b()],m.prototype,"execApprovalsLoading",2);y([b()],m.prototype,"execApprovalsSaving",2);y([b()],m.prototype,"execApprovalsDirty",2);y([b()],m.prototype,"execApprovalsSnapshot",2);y([b()],m.prototype,"execApprovalsForm",2);y([b()],m.prototype,"execApprovalsSelectedAgent",2);y([b()],m.prototype,"execApprovalsTarget",2);y([b()],m.prototype,"execApprovalsTargetNodeId",2);y([b()],m.prototype,"execApprovalQueue",2);y([b()],m.prototype,"execApprovalBusy",2);y([b()],m.prototype,"execApprovalError",2);y([b()],m.prototype,"configLoading",2);y([b()],m.prototype,"configRaw",2);y([b()],m.prototype,"configRawOriginal",2);y([b()],m.prototype,"configValid",2);y([b()],m.prototype,"configIssues",2);y([b()],m.prototype,"configSaving",2);y([b()],m.prototype,"configApplying",2);y([b()],m.prototype,"updateRunning",2);y([b()],m.prototype,"applySessionKey",2);y([b()],m.prototype,"configSnapshot",2);y([b()],m.prototype,"configSchema",2);y([b()],m.prototype,"configSchemaVersion",2);y([b()],m.prototype,"configSchemaLoading",2);y([b()],m.prototype,"configUiHints",2);y([b()],m.prototype,"configForm",2);y([b()],m.prototype,"configFormOriginal",2);y([b()],m.prototype,"configFormDirty",2);y([b()],m.prototype,"configFormMode",2);y([b()],m.prototype,"configSearchQuery",2);y([b()],m.prototype,"configActiveSection",2);y([b()],m.prototype,"configActiveSubsection",2);y([b()],m.prototype,"channelsLoading",2);y([b()],m.prototype,"channelsSnapshot",2);y([b()],m.prototype,"channelsError",2);y([b()],m.prototype,"channelsLastSuccess",2);y([b()],m.prototype,"whatsappLoginMessage",2);y([b()],m.prototype,"whatsappLoginQrDataUrl",2);y([b()],m.prototype,"whatsappLoginConnected",2);y([b()],m.prototype,"whatsappBusy",2);y([b()],m.prototype,"nostrProfileFormState",2);y([b()],m.prototype,"nostrProfileAccountId",2);y([b()],m.prototype,"presenceLoading",2);y([b()],m.prototype,"presenceEntries",2);y([b()],m.prototype,"presenceError",2);y([b()],m.prototype,"presenceStatus",2);y([b()],m.prototype,"agentsLoading",2);y([b()],m.prototype,"agentsList",2);y([b()],m.prototype,"agentsError",2);y([b()],m.prototype,"sessionsLoading",2);y([b()],m.prototype,"sessionsResult",2);y([b()],m.prototype,"sessionsError",2);y([b()],m.prototype,"sessionsFilterActive",2);y([b()],m.prototype,"sessionsFilterLimit",2);y([b()],m.prototype,"sessionsIncludeGlobal",2);y([b()],m.prototype,"sessionsIncludeUnknown",2);y([b()],m.prototype,"cronLoading",2);y([b()],m.prototype,"cronJobs",2);y([b()],m.prototype,"cronStatus",2);y([b()],m.prototype,"cronError",2);y([b()],m.prototype,"cronForm",2);y([b()],m.prototype,"cronRunsJobId",2);y([b()],m.prototype,"cronRuns",2);y([b()],m.prototype,"cronBusy",2);y([b()],m.prototype,"skillsLoading",2);y([b()],m.prototype,"skillsReport",2);y([b()],m.prototype,"skillsError",2);y([b()],m.prototype,"skillsFilter",2);y([b()],m.prototype,"skillEdits",2);y([b()],m.prototype,"skillsBusyKey",2);y([b()],m.prototype,"skillMessages",2);y([b()],m.prototype,"debugLoading",2);y([b()],m.prototype,"debugStatus",2);y([b()],m.prototype,"debugHealth",2);y([b()],m.prototype,"debugModels",2);y([b()],m.prototype,"debugHeartbeat",2);y([b()],m.prototype,"debugCallMethod",2);y([b()],m.prototype,"debugCallParams",2);y([b()],m.prototype,"debugCallResult",2);y([b()],m.prototype,"debugCallError",2);y([b()],m.prototype,"logsLoading",2);y([b()],m.prototype,"logsError",2);y([b()],m.prototype,"logsFile",2);y([b()],m.prototype,"logsEntries",2);y([b()],m.prototype,"logsFilterText",2);y([b()],m.prototype,"logsLevelFilters",2);y([b()],m.prototype,"logsAutoFollow",2);y([b()],m.prototype,"logsTruncated",2);y([b()],m.prototype,"logsCursor",2);y([b()],m.prototype,"logsLastFetchAt",2);y([b()],m.prototype,"logsLimit",2);y([b()],m.prototype,"logsMaxBytes",2);y([b()],m.prototype,"logsAtBottom",2);m=y([Xa("clawdbot-app")],m);
3199
+ //# sourceMappingURL=index-CNUQGStP.js.map