@rubytech/taskmaster 1.0.1

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 (2238) hide show
  1. package/README.md +32 -0
  2. package/assets/avatar-placeholder.svg +19 -0
  3. package/assets/chrome-extension/README.md +22 -0
  4. package/assets/chrome-extension/background.js +438 -0
  5. package/assets/chrome-extension/icons/icon128.png +0 -0
  6. package/assets/chrome-extension/icons/icon16.png +0 -0
  7. package/assets/chrome-extension/icons/icon32.png +0 -0
  8. package/assets/chrome-extension/icons/icon48.png +0 -0
  9. package/assets/chrome-extension/manifest.json +25 -0
  10. package/assets/chrome-extension/options.html +197 -0
  11. package/assets/chrome-extension/options.js +59 -0
  12. package/assets/dmg-background-small.png +0 -0
  13. package/assets/dmg-background.png +0 -0
  14. package/dist/acp/client.js +144 -0
  15. package/dist/acp/commands.js +38 -0
  16. package/dist/acp/event-mapper.js +70 -0
  17. package/dist/acp/index.js +2 -0
  18. package/dist/acp/meta.js +30 -0
  19. package/dist/acp/server.js +131 -0
  20. package/dist/acp/session-mapper.js +65 -0
  21. package/dist/acp/session.js +68 -0
  22. package/dist/acp/translator.js +344 -0
  23. package/dist/acp/types.js +6 -0
  24. package/dist/agents/agent-model-config.js +55 -0
  25. package/dist/agents/agent-paths.js +19 -0
  26. package/dist/agents/agent-scope.js +122 -0
  27. package/dist/agents/anthropic-payload-log.js +160 -0
  28. package/dist/agents/apply-patch-update.js +145 -0
  29. package/dist/agents/apply-patch.js +355 -0
  30. package/dist/agents/auth-health.js +169 -0
  31. package/dist/agents/auth-profiles/constants.js +20 -0
  32. package/dist/agents/auth-profiles/display.js +10 -0
  33. package/dist/agents/auth-profiles/doctor.js +31 -0
  34. package/dist/agents/auth-profiles/external-cli-sync.js +207 -0
  35. package/dist/agents/auth-profiles/oauth.js +199 -0
  36. package/dist/agents/auth-profiles/order.js +166 -0
  37. package/dist/agents/auth-profiles/paths.js +27 -0
  38. package/dist/agents/auth-profiles/profiles.js +63 -0
  39. package/dist/agents/auth-profiles/repair.js +120 -0
  40. package/dist/agents/auth-profiles/session-override.js +97 -0
  41. package/dist/agents/auth-profiles/store.js +363 -0
  42. package/dist/agents/auth-profiles/types.js +1 -0
  43. package/dist/agents/auth-profiles/usage.js +235 -0
  44. package/dist/agents/auth-profiles.js +10 -0
  45. package/dist/agents/bash-process-registry.js +177 -0
  46. package/dist/agents/bash-tools.exec.js +1176 -0
  47. package/dist/agents/bash-tools.js +2 -0
  48. package/dist/agents/bash-tools.process.js +569 -0
  49. package/dist/agents/bash-tools.shared.js +191 -0
  50. package/dist/agents/bedrock-discovery.js +157 -0
  51. package/dist/agents/bootstrap-files.js +28 -0
  52. package/dist/agents/bootstrap-hooks.js +19 -0
  53. package/dist/agents/cache-trace.js +185 -0
  54. package/dist/agents/channel-tools.js +58 -0
  55. package/dist/agents/chutes-oauth.js +133 -0
  56. package/dist/agents/claude-cli-runner.js +3 -0
  57. package/dist/agents/cli-backends.js +126 -0
  58. package/dist/agents/cli-credentials.js +360 -0
  59. package/dist/agents/cli-runner/helpers.js +409 -0
  60. package/dist/agents/cli-runner.js +265 -0
  61. package/dist/agents/cli-session.js +27 -0
  62. package/dist/agents/compaction.js +226 -0
  63. package/dist/agents/context-window-guard.js +37 -0
  64. package/dist/agents/context.js +35 -0
  65. package/dist/agents/date-time.js +158 -0
  66. package/dist/agents/defaults.js +6 -0
  67. package/dist/agents/docs-path.js +20 -0
  68. package/dist/agents/failover-error.js +164 -0
  69. package/dist/agents/identity-avatar.js +82 -0
  70. package/dist/agents/identity-file.js +80 -0
  71. package/dist/agents/identity.js +81 -0
  72. package/dist/agents/lanes.js +2 -0
  73. package/dist/agents/live-auth-keys.js +70 -0
  74. package/dist/agents/live-model-filter.js +70 -0
  75. package/dist/agents/memory-search.js +200 -0
  76. package/dist/agents/minimax-vlm.js +81 -0
  77. package/dist/agents/model-auth.js +277 -0
  78. package/dist/agents/model-catalog.js +96 -0
  79. package/dist/agents/model-compat.js +17 -0
  80. package/dist/agents/model-fallback.js +246 -0
  81. package/dist/agents/model-scan.js +350 -0
  82. package/dist/agents/model-selection.js +290 -0
  83. package/dist/agents/models-config.js +111 -0
  84. package/dist/agents/models-config.providers.js +423 -0
  85. package/dist/agents/opencode-zen-models.js +255 -0
  86. package/dist/agents/pi-embedded-block-chunker.js +209 -0
  87. package/dist/agents/pi-embedded-helpers/bootstrap.js +159 -0
  88. package/dist/agents/pi-embedded-helpers/errors.js +436 -0
  89. package/dist/agents/pi-embedded-helpers/google.js +12 -0
  90. package/dist/agents/pi-embedded-helpers/images.js +92 -0
  91. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +35 -0
  92. package/dist/agents/pi-embedded-helpers/openai.js +98 -0
  93. package/dist/agents/pi-embedded-helpers/thinking.js +32 -0
  94. package/dist/agents/pi-embedded-helpers/turns.js +95 -0
  95. package/dist/agents/pi-embedded-helpers/types.js +1 -0
  96. package/dist/agents/pi-embedded-helpers.js +9 -0
  97. package/dist/agents/pi-embedded-messaging.js +24 -0
  98. package/dist/agents/pi-embedded-runner/abort.js +9 -0
  99. package/dist/agents/pi-embedded-runner/cache-ttl.js +45 -0
  100. package/dist/agents/pi-embedded-runner/compact.js +415 -0
  101. package/dist/agents/pi-embedded-runner/extensions.js +59 -0
  102. package/dist/agents/pi-embedded-runner/extra-params.js +70 -0
  103. package/dist/agents/pi-embedded-runner/google.js +302 -0
  104. package/dist/agents/pi-embedded-runner/history.js +61 -0
  105. package/dist/agents/pi-embedded-runner/lanes.js +11 -0
  106. package/dist/agents/pi-embedded-runner/logger.js +2 -0
  107. package/dist/agents/pi-embedded-runner/model.js +71 -0
  108. package/dist/agents/pi-embedded-runner/run/attempt.js +814 -0
  109. package/dist/agents/pi-embedded-runner/run/images.js +344 -0
  110. package/dist/agents/pi-embedded-runner/run/params.js +1 -0
  111. package/dist/agents/pi-embedded-runner/run/payloads.js +165 -0
  112. package/dist/agents/pi-embedded-runner/run/types.js +1 -0
  113. package/dist/agents/pi-embedded-runner/run.js +538 -0
  114. package/dist/agents/pi-embedded-runner/runs.js +107 -0
  115. package/dist/agents/pi-embedded-runner/sandbox-info.js +25 -0
  116. package/dist/agents/pi-embedded-runner/session-manager-cache.js +54 -0
  117. package/dist/agents/pi-embedded-runner/session-manager-init.js +31 -0
  118. package/dist/agents/pi-embedded-runner/system-prompt.js +33 -0
  119. package/dist/agents/pi-embedded-runner/tool-split.js +8 -0
  120. package/dist/agents/pi-embedded-runner/types.js +1 -0
  121. package/dist/agents/pi-embedded-runner/utils.js +25 -0
  122. package/dist/agents/pi-embedded-runner.js +10 -0
  123. package/dist/agents/pi-embedded-subscribe.handlers.js +45 -0
  124. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +86 -0
  125. package/dist/agents/pi-embedded-subscribe.handlers.messages.js +230 -0
  126. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +176 -0
  127. package/dist/agents/pi-embedded-subscribe.handlers.types.js +1 -0
  128. package/dist/agents/pi-embedded-subscribe.js +454 -0
  129. package/dist/agents/pi-embedded-subscribe.raw-stream.js +27 -0
  130. package/dist/agents/pi-embedded-subscribe.tools.js +166 -0
  131. package/dist/agents/pi-embedded-subscribe.types.js +1 -0
  132. package/dist/agents/pi-embedded-utils.js +335 -0
  133. package/dist/agents/pi-embedded.js +1 -0
  134. package/dist/agents/pi-extensions/compaction-safeguard.js +223 -0
  135. package/dist/agents/pi-extensions/context-pruning/extension.js +32 -0
  136. package/dist/agents/pi-extensions/context-pruning/pruner.js +263 -0
  137. package/dist/agents/pi-extensions/context-pruning/runtime.js +21 -0
  138. package/dist/agents/pi-extensions/context-pruning/settings.js +71 -0
  139. package/dist/agents/pi-extensions/context-pruning/tools.js +44 -0
  140. package/dist/agents/pi-extensions/context-pruning.js +9 -0
  141. package/dist/agents/pi-settings.js +19 -0
  142. package/dist/agents/pi-tool-definition-adapter.js +72 -0
  143. package/dist/agents/pi-tools.abort.js +41 -0
  144. package/dist/agents/pi-tools.js +288 -0
  145. package/dist/agents/pi-tools.policy.js +212 -0
  146. package/dist/agents/pi-tools.read.js +227 -0
  147. package/dist/agents/pi-tools.schema.js +147 -0
  148. package/dist/agents/pi-tools.types.js +1 -0
  149. package/dist/agents/profile-injection.js +91 -0
  150. package/dist/agents/pty-dsr.js +13 -0
  151. package/dist/agents/pty-keys.js +235 -0
  152. package/dist/agents/sandbox/browser-bridges.js +1 -0
  153. package/dist/agents/sandbox/browser.js +180 -0
  154. package/dist/agents/sandbox/config-hash.js +45 -0
  155. package/dist/agents/sandbox/config.js +126 -0
  156. package/dist/agents/sandbox/constants.js +45 -0
  157. package/dist/agents/sandbox/context.js +117 -0
  158. package/dist/agents/sandbox/docker.js +272 -0
  159. package/dist/agents/sandbox/manage.js +91 -0
  160. package/dist/agents/sandbox/prune.js +87 -0
  161. package/dist/agents/sandbox/registry.js +71 -0
  162. package/dist/agents/sandbox/runtime-status.js +90 -0
  163. package/dist/agents/sandbox/shared.js +38 -0
  164. package/dist/agents/sandbox/tool-policy.js +106 -0
  165. package/dist/agents/sandbox/types.docker.js +1 -0
  166. package/dist/agents/sandbox/types.js +1 -0
  167. package/dist/agents/sandbox/workspace.js +39 -0
  168. package/dist/agents/sandbox-paths.js +68 -0
  169. package/dist/agents/sandbox.js +7 -0
  170. package/dist/agents/schema/clean-for-gemini.js +295 -0
  171. package/dist/agents/schema/typebox.js +22 -0
  172. package/dist/agents/session-slug.js +134 -0
  173. package/dist/agents/session-tool-result-guard-wrapper.js +34 -0
  174. package/dist/agents/session-tool-result-guard.js +99 -0
  175. package/dist/agents/session-transcript-repair.js +174 -0
  176. package/dist/agents/session-write-lock.js +102 -0
  177. package/dist/agents/shell-utils.js +99 -0
  178. package/dist/agents/skills/bundled-dir.js +30 -0
  179. package/dist/agents/skills/config.js +141 -0
  180. package/dist/agents/skills/env-overrides.js +67 -0
  181. package/dist/agents/skills/frontmatter.js +121 -0
  182. package/dist/agents/skills/plugin-skills.js +55 -0
  183. package/dist/agents/skills/refresh.js +135 -0
  184. package/dist/agents/skills/serialize.js +13 -0
  185. package/dist/agents/skills/types.js +1 -0
  186. package/dist/agents/skills/workspace.js +272 -0
  187. package/dist/agents/skills-install.js +390 -0
  188. package/dist/agents/skills-status.js +183 -0
  189. package/dist/agents/skills.js +13 -0
  190. package/dist/agents/subagent-announce-queue.js +129 -0
  191. package/dist/agents/subagent-announce.js +391 -0
  192. package/dist/agents/subagent-registry.js +343 -0
  193. package/dist/agents/subagent-registry.store.js +73 -0
  194. package/dist/agents/synthetic-models.js +174 -0
  195. package/dist/agents/system-prompt-params.js +70 -0
  196. package/dist/agents/system-prompt-report.js +113 -0
  197. package/dist/agents/system-prompt.js +468 -0
  198. package/dist/agents/taskmaster-tools.js +165 -0
  199. package/dist/agents/test-helpers/fast-coding-tools.js +18 -0
  200. package/dist/agents/test-helpers/fast-core-tools.js +24 -0
  201. package/dist/agents/timeout.js +24 -0
  202. package/dist/agents/tool-call-id.js +164 -0
  203. package/dist/agents/tool-display.js +209 -0
  204. package/dist/agents/tool-display.json +308 -0
  205. package/dist/agents/tool-images.js +166 -0
  206. package/dist/agents/tool-policy.js +244 -0
  207. package/dist/agents/tool-summaries.js +10 -0
  208. package/dist/agents/tools/agent-step.js +44 -0
  209. package/dist/agents/tools/agents-list-tool.js +66 -0
  210. package/dist/agents/tools/authorize-admin-tool.js +194 -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 +267 -0
  216. package/dist/agents/tools/current-time.js +34 -0
  217. package/dist/agents/tools/customer-lookup-tool.js +45 -0
  218. package/dist/agents/tools/customer-update-tool.js +68 -0
  219. package/dist/agents/tools/discord-actions-guild.js +449 -0
  220. package/dist/agents/tools/discord-actions-messaging.js +383 -0
  221. package/dist/agents/tools/discord-actions-moderation.js +92 -0
  222. package/dist/agents/tools/discord-actions.js +61 -0
  223. package/dist/agents/tools/document-tool.js +284 -0
  224. package/dist/agents/tools/gateway-tool.js +214 -0
  225. package/dist/agents/tools/gateway.js +30 -0
  226. package/dist/agents/tools/image-tool.helpers.js +55 -0
  227. package/dist/agents/tools/image-tool.js +370 -0
  228. package/dist/agents/tools/license-tool.js +81 -0
  229. package/dist/agents/tools/memory-tool.js +230 -0
  230. package/dist/agents/tools/message-tool.js +320 -0
  231. package/dist/agents/tools/nodes-tool.js +399 -0
  232. package/dist/agents/tools/nodes-utils.js +92 -0
  233. package/dist/agents/tools/relay-message-tool.js +166 -0
  234. package/dist/agents/tools/session-status-tool.js +352 -0
  235. package/dist/agents/tools/sessions-announce-target.js +43 -0
  236. package/dist/agents/tools/sessions-helpers.js +279 -0
  237. package/dist/agents/tools/sessions-history-tool.js +125 -0
  238. package/dist/agents/tools/sessions-list-tool.js +167 -0
  239. package/dist/agents/tools/sessions-send-helpers.js +116 -0
  240. package/dist/agents/tools/sessions-send-tool.a2a.js +119 -0
  241. package/dist/agents/tools/sessions-send-tool.js +345 -0
  242. package/dist/agents/tools/sessions-spawn-tool.js +232 -0
  243. package/dist/agents/tools/slack-actions.js +243 -0
  244. package/dist/agents/tools/telegram-actions.js +162 -0
  245. package/dist/agents/tools/tts-tool.js +47 -0
  246. package/dist/agents/tools/web-fetch-utils.js +104 -0
  247. package/dist/agents/tools/web-fetch.js +457 -0
  248. package/dist/agents/tools/web-search.js +446 -0
  249. package/dist/agents/tools/web-shared.js +62 -0
  250. package/dist/agents/tools/web-tools.js +2 -0
  251. package/dist/agents/tools/whatsapp-actions.js +32 -0
  252. package/dist/agents/transcript-policy.js +83 -0
  253. package/dist/agents/usage.js +48 -0
  254. package/dist/agents/venice-models.js +342 -0
  255. package/dist/agents/workspace.js +198 -0
  256. package/dist/auto-reply/chunk.js +358 -0
  257. package/dist/auto-reply/command-auth.js +132 -0
  258. package/dist/auto-reply/command-detection.js +56 -0
  259. package/dist/auto-reply/commands-args.js +85 -0
  260. package/dist/auto-reply/commands-registry.data.js +524 -0
  261. package/dist/auto-reply/commands-registry.js +351 -0
  262. package/dist/auto-reply/commands-registry.types.js +1 -0
  263. package/dist/auto-reply/dispatch.js +40 -0
  264. package/dist/auto-reply/envelope.js +173 -0
  265. package/dist/auto-reply/group-activation.js +22 -0
  266. package/dist/auto-reply/heartbeat.js +130 -0
  267. package/dist/auto-reply/inbound-debounce.js +74 -0
  268. package/dist/auto-reply/media-note.js +72 -0
  269. package/dist/auto-reply/model.js +28 -0
  270. package/dist/auto-reply/reply/abort.js +151 -0
  271. package/dist/auto-reply/reply/agent-runner-execution.js +502 -0
  272. package/dist/auto-reply/reply/agent-runner-helpers.js +65 -0
  273. package/dist/auto-reply/reply/agent-runner-memory.js +155 -0
  274. package/dist/auto-reply/reply/agent-runner-payloads.js +85 -0
  275. package/dist/auto-reply/reply/agent-runner-utils.js +101 -0
  276. package/dist/auto-reply/reply/agent-runner.js +384 -0
  277. package/dist/auto-reply/reply/audio-tags.js +1 -0
  278. package/dist/auto-reply/reply/bash-command.js +336 -0
  279. package/dist/auto-reply/reply/block-reply-coalescer.js +101 -0
  280. package/dist/auto-reply/reply/block-reply-pipeline.js +179 -0
  281. package/dist/auto-reply/reply/block-streaming.js +91 -0
  282. package/dist/auto-reply/reply/body.js +37 -0
  283. package/dist/auto-reply/reply/commands-allowlist.js +570 -0
  284. package/dist/auto-reply/reply/commands-approve.js +88 -0
  285. package/dist/auto-reply/reply/commands-bash.js +25 -0
  286. package/dist/auto-reply/reply/commands-compact.js +106 -0
  287. package/dist/auto-reply/reply/commands-config.js +239 -0
  288. package/dist/auto-reply/reply/commands-context-report.js +294 -0
  289. package/dist/auto-reply/reply/commands-context.js +29 -0
  290. package/dist/auto-reply/reply/commands-core.js +101 -0
  291. package/dist/auto-reply/reply/commands-info.js +106 -0
  292. package/dist/auto-reply/reply/commands-models.js +201 -0
  293. package/dist/auto-reply/reply/commands-plugin.js +35 -0
  294. package/dist/auto-reply/reply/commands-session.js +311 -0
  295. package/dist/auto-reply/reply/commands-status.js +194 -0
  296. package/dist/auto-reply/reply/commands-subagents.js +357 -0
  297. package/dist/auto-reply/reply/commands-tts.js +228 -0
  298. package/dist/auto-reply/reply/commands-types.js +1 -0
  299. package/dist/auto-reply/reply/commands.js +3 -0
  300. package/dist/auto-reply/reply/config-commands.js +58 -0
  301. package/dist/auto-reply/reply/config-value.js +35 -0
  302. package/dist/auto-reply/reply/debug-commands.js +58 -0
  303. package/dist/auto-reply/reply/directive-handling.auth.js +191 -0
  304. package/dist/auto-reply/reply/directive-handling.fast-lane.js +53 -0
  305. package/dist/auto-reply/reply/directive-handling.impl.js +411 -0
  306. package/dist/auto-reply/reply/directive-handling.js +5 -0
  307. package/dist/auto-reply/reply/directive-handling.model-picker.js +64 -0
  308. package/dist/auto-reply/reply/directive-handling.model.js +279 -0
  309. package/dist/auto-reply/reply/directive-handling.parse.js +89 -0
  310. package/dist/auto-reply/reply/directive-handling.persist.js +189 -0
  311. package/dist/auto-reply/reply/directive-handling.queue-validation.js +48 -0
  312. package/dist/auto-reply/reply/directive-handling.shared.js +43 -0
  313. package/dist/auto-reply/reply/directives.js +133 -0
  314. package/dist/auto-reply/reply/dispatch-from-config.js +289 -0
  315. package/dist/auto-reply/reply/exec/directive.js +183 -0
  316. package/dist/auto-reply/reply/exec.js +1 -0
  317. package/dist/auto-reply/reply/followup-runner.js +221 -0
  318. package/dist/auto-reply/reply/get-reply-directives-apply.js +197 -0
  319. package/dist/auto-reply/reply/get-reply-directives-utils.js +48 -0
  320. package/dist/auto-reply/reply/get-reply-directives.js +343 -0
  321. package/dist/auto-reply/reply/get-reply-inline-actions.js +254 -0
  322. package/dist/auto-reply/reply/get-reply-run.js +290 -0
  323. package/dist/auto-reply/reply/get-reply.js +234 -0
  324. package/dist/auto-reply/reply/groups.js +109 -0
  325. package/dist/auto-reply/reply/history.js +87 -0
  326. package/dist/auto-reply/reply/inbound-context.js +51 -0
  327. package/dist/auto-reply/reply/inbound-dedupe.js +39 -0
  328. package/dist/auto-reply/reply/inbound-sender-meta.js +45 -0
  329. package/dist/auto-reply/reply/inbound-text.js +3 -0
  330. package/dist/auto-reply/reply/line-directives.js +294 -0
  331. package/dist/auto-reply/reply/memory-flush.js +66 -0
  332. package/dist/auto-reply/reply/mentions.js +122 -0
  333. package/dist/auto-reply/reply/model-selection.js +331 -0
  334. package/dist/auto-reply/reply/normalize-reply.js +54 -0
  335. package/dist/auto-reply/reply/provider-dispatcher.js +19 -0
  336. package/dist/auto-reply/reply/queue/cleanup.js +19 -0
  337. package/dist/auto-reply/reply/queue/directive.js +155 -0
  338. package/dist/auto-reply/reply/queue/drain.js +111 -0
  339. package/dist/auto-reply/reply/queue/enqueue.js +43 -0
  340. package/dist/auto-reply/reply/queue/normalize.js +30 -0
  341. package/dist/auto-reply/reply/queue/settings.js +52 -0
  342. package/dist/auto-reply/reply/queue/state.js +53 -0
  343. package/dist/auto-reply/reply/queue/types.js +1 -0
  344. package/dist/auto-reply/reply/queue.js +6 -0
  345. package/dist/auto-reply/reply/reply-directives.js +30 -0
  346. package/dist/auto-reply/reply/reply-dispatcher.js +100 -0
  347. package/dist/auto-reply/reply/reply-elevated.js +166 -0
  348. package/dist/auto-reply/reply/reply-inline.js +28 -0
  349. package/dist/auto-reply/reply/reply-payloads.js +83 -0
  350. package/dist/auto-reply/reply/reply-reference.js +35 -0
  351. package/dist/auto-reply/reply/reply-tags.js +13 -0
  352. package/dist/auto-reply/reply/reply-threading.js +41 -0
  353. package/dist/auto-reply/reply/response-prefix-template.js +76 -0
  354. package/dist/auto-reply/reply/route-reply.js +108 -0
  355. package/dist/auto-reply/reply/session-reset-model.js +120 -0
  356. package/dist/auto-reply/reply/session-updates.js +228 -0
  357. package/dist/auto-reply/reply/session-usage.js +79 -0
  358. package/dist/auto-reply/reply/session.js +307 -0
  359. package/dist/auto-reply/reply/stage-sandbox-media.js +146 -0
  360. package/dist/auto-reply/reply/streaming-directives.js +92 -0
  361. package/dist/auto-reply/reply/subagents-utils.js +52 -0
  362. package/dist/auto-reply/reply/test-ctx.js +15 -0
  363. package/dist/auto-reply/reply/typing-mode.js +91 -0
  364. package/dist/auto-reply/reply/typing.js +132 -0
  365. package/dist/auto-reply/reply.js +5 -0
  366. package/dist/auto-reply/send-policy.js +30 -0
  367. package/dist/auto-reply/skill-commands.js +97 -0
  368. package/dist/auto-reply/status.js +390 -0
  369. package/dist/auto-reply/templating.js +39 -0
  370. package/dist/auto-reply/thinking.js +154 -0
  371. package/dist/auto-reply/tokens.js +15 -0
  372. package/dist/auto-reply/tool-meta.js +112 -0
  373. package/dist/auto-reply/types.js +1 -0
  374. package/dist/browser/bridge-server.js +47 -0
  375. package/dist/browser/cdp.helpers.js +136 -0
  376. package/dist/browser/cdp.js +293 -0
  377. package/dist/browser/chrome.executables.js +509 -0
  378. package/dist/browser/chrome.js +253 -0
  379. package/dist/browser/chrome.profile-decoration.js +144 -0
  380. package/dist/browser/client-actions-core.js +94 -0
  381. package/dist/browser/client-actions-observe.js +94 -0
  382. package/dist/browser/client-actions-state.js +163 -0
  383. package/dist/browser/client-actions-types.js +1 -0
  384. package/dist/browser/client-actions.js +4 -0
  385. package/dist/browser/client-fetch.js +78 -0
  386. package/dist/browser/client.js +139 -0
  387. package/dist/browser/config.js +193 -0
  388. package/dist/browser/constants.js +8 -0
  389. package/dist/browser/extension-relay.js +541 -0
  390. package/dist/browser/handoff.js +80 -0
  391. package/dist/browser/profiles-service.js +132 -0
  392. package/dist/browser/profiles.js +93 -0
  393. package/dist/browser/pw-ai-module.js +37 -0
  394. package/dist/browser/pw-ai.js +2 -0
  395. package/dist/browser/pw-role-snapshot.js +310 -0
  396. package/dist/browser/pw-session.js +431 -0
  397. package/dist/browser/pw-tools-core.activity.js +44 -0
  398. package/dist/browser/pw-tools-core.downloads.js +176 -0
  399. package/dist/browser/pw-tools-core.interactions.js +420 -0
  400. package/dist/browser/pw-tools-core.js +8 -0
  401. package/dist/browser/pw-tools-core.responses.js +83 -0
  402. package/dist/browser/pw-tools-core.shared.js +48 -0
  403. package/dist/browser/pw-tools-core.snapshot.js +142 -0
  404. package/dist/browser/pw-tools-core.state.js +147 -0
  405. package/dist/browser/pw-tools-core.storage.js +72 -0
  406. package/dist/browser/pw-tools-core.trace.js +25 -0
  407. package/dist/browser/routes/agent.act.js +453 -0
  408. package/dist/browser/routes/agent.act.shared.js +38 -0
  409. package/dist/browser/routes/agent.debug.js +133 -0
  410. package/dist/browser/routes/agent.js +10 -0
  411. package/dist/browser/routes/agent.shared.js +45 -0
  412. package/dist/browser/routes/agent.snapshot.js +269 -0
  413. package/dist/browser/routes/agent.storage.js +386 -0
  414. package/dist/browser/routes/basic.js +174 -0
  415. package/dist/browser/routes/index.js +10 -0
  416. package/dist/browser/routes/screencast.js +153 -0
  417. package/dist/browser/routes/tabs.js +120 -0
  418. package/dist/browser/routes/utils.js +57 -0
  419. package/dist/browser/screencast.js +153 -0
  420. package/dist/browser/screenshot.js +39 -0
  421. package/dist/browser/server-context.js +533 -0
  422. package/dist/browser/server-context.types.js +1 -0
  423. package/dist/browser/server.js +92 -0
  424. package/dist/browser/target-id.js +16 -0
  425. package/dist/browser/trash.js +21 -0
  426. package/dist/build-info.json +5 -0
  427. package/dist/canvas-host/a2ui/a2ui.bundle.js +17768 -0
  428. package/dist/canvas-host/a2ui/index.html +307 -0
  429. package/dist/canvas-host/a2ui.js +185 -0
  430. package/dist/canvas-host/server.js +380 -0
  431. package/dist/channel-web.js +8 -0
  432. package/dist/channels/ack-reactions.js +56 -0
  433. package/dist/channels/allowlist-match.js +3 -0
  434. package/dist/channels/allowlists/resolve-utils.js +37 -0
  435. package/dist/channels/channel-config.js +131 -0
  436. package/dist/channels/chat-type.js +12 -0
  437. package/dist/channels/command-gating.js +24 -0
  438. package/dist/channels/conversation-label.js +48 -0
  439. package/dist/channels/dock.js +344 -0
  440. package/dist/channels/location.js +44 -0
  441. package/dist/channels/logging.js +13 -0
  442. package/dist/channels/mention-gating.js +26 -0
  443. package/dist/channels/plugins/actions/discord/handle-action.guild-admin.js +328 -0
  444. package/dist/channels/plugins/actions/discord/handle-action.js +165 -0
  445. package/dist/channels/plugins/actions/discord.js +93 -0
  446. package/dist/channels/plugins/actions/signal.js +115 -0
  447. package/dist/channels/plugins/actions/telegram.js +95 -0
  448. package/dist/channels/plugins/agent-tools/whatsapp-login.js +63 -0
  449. package/dist/channels/plugins/allowlist-match.js +1 -0
  450. package/dist/channels/plugins/bluebubbles-actions.js +16 -0
  451. package/dist/channels/plugins/catalog.js +216 -0
  452. package/dist/channels/plugins/channel-config.js +1 -0
  453. package/dist/channels/plugins/config-helpers.js +87 -0
  454. package/dist/channels/plugins/config-schema.js +8 -0
  455. package/dist/channels/plugins/config-writes.js +21 -0
  456. package/dist/channels/plugins/directory-config.js +185 -0
  457. package/dist/channels/plugins/group-mentions.js +267 -0
  458. package/dist/channels/plugins/helpers.js +12 -0
  459. package/dist/channels/plugins/index.js +51 -0
  460. package/dist/channels/plugins/load.js +22 -0
  461. package/dist/channels/plugins/media-limits.js +15 -0
  462. package/dist/channels/plugins/message-action-names.js +50 -0
  463. package/dist/channels/plugins/message-actions.js +35 -0
  464. package/dist/channels/plugins/normalize/discord.js +18 -0
  465. package/dist/channels/plugins/normalize/imessage.js +36 -0
  466. package/dist/channels/plugins/normalize/signal.js +52 -0
  467. package/dist/channels/plugins/normalize/slack.js +19 -0
  468. package/dist/channels/plugins/normalize/telegram.js +31 -0
  469. package/dist/channels/plugins/normalize/whatsapp.js +17 -0
  470. package/dist/channels/plugins/onboarding/channel-access.js +68 -0
  471. package/dist/channels/plugins/onboarding/discord.js +413 -0
  472. package/dist/channels/plugins/onboarding/helpers.js +33 -0
  473. package/dist/channels/plugins/onboarding/imessage.js +231 -0
  474. package/dist/channels/plugins/onboarding/signal.js +262 -0
  475. package/dist/channels/plugins/onboarding/slack.js +470 -0
  476. package/dist/channels/plugins/onboarding/telegram.js +281 -0
  477. package/dist/channels/plugins/onboarding/whatsapp.js +286 -0
  478. package/dist/channels/plugins/onboarding-types.js +1 -0
  479. package/dist/channels/plugins/outbound/discord.js +29 -0
  480. package/dist/channels/plugins/outbound/imessage.js +38 -0
  481. package/dist/channels/plugins/outbound/load.js +28 -0
  482. package/dist/channels/plugins/outbound/signal.js +36 -0
  483. package/dist/channels/plugins/outbound/slack.js +27 -0
  484. package/dist/channels/plugins/outbound/telegram.js +53 -0
  485. package/dist/channels/plugins/outbound/whatsapp.js +76 -0
  486. package/dist/channels/plugins/pairing-message.js +1 -0
  487. package/dist/channels/plugins/pairing.js +44 -0
  488. package/dist/channels/plugins/setup-helpers.js +89 -0
  489. package/dist/channels/plugins/slack.actions.js +158 -0
  490. package/dist/channels/plugins/status-issues/bluebubbles.js +76 -0
  491. package/dist/channels/plugins/status-issues/discord.js +115 -0
  492. package/dist/channels/plugins/status-issues/shared.js +23 -0
  493. package/dist/channels/plugins/status-issues/telegram.js +100 -0
  494. package/dist/channels/plugins/status-issues/whatsapp.js +60 -0
  495. package/dist/channels/plugins/status.js +26 -0
  496. package/dist/channels/plugins/types.adapters.js +1 -0
  497. package/dist/channels/plugins/types.core.js +1 -0
  498. package/dist/channels/plugins/types.js +1 -0
  499. package/dist/channels/plugins/types.plugin.js +1 -0
  500. package/dist/channels/plugins/whatsapp-heartbeat.js +56 -0
  501. package/dist/channels/registry.js +153 -0
  502. package/dist/channels/reply-prefix.js +21 -0
  503. package/dist/channels/sender-identity.js +30 -0
  504. package/dist/channels/sender-label.js +38 -0
  505. package/dist/channels/session.js +26 -0
  506. package/dist/channels/targets.js +27 -0
  507. package/dist/channels/typing.js +17 -0
  508. package/dist/channels/web/index.js +2 -0
  509. package/dist/cli/acp-cli.js +61 -0
  510. package/dist/cli/argv.js +119 -0
  511. package/dist/cli/banner.js +44 -0
  512. package/dist/cli/browser-cli-actions-input/register.element.js +200 -0
  513. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +128 -0
  514. package/dist/cli/browser-cli-actions-input/register.form-wait-eval.js +108 -0
  515. package/dist/cli/browser-cli-actions-input/register.js +10 -0
  516. package/dist/cli/browser-cli-actions-input/register.navigation.js +63 -0
  517. package/dist/cli/browser-cli-actions-input/shared.js +50 -0
  518. package/dist/cli/browser-cli-actions-input.js +1 -0
  519. package/dist/cli/browser-cli-actions-observe.js +82 -0
  520. package/dist/cli/browser-cli-debug.js +148 -0
  521. package/dist/cli/browser-cli-examples.js +33 -0
  522. package/dist/cli/browser-cli-extension.js +98 -0
  523. package/dist/cli/browser-cli-inspect.js +130 -0
  524. package/dist/cli/browser-cli-manage.js +351 -0
  525. package/dist/cli/browser-cli-serve.js +91 -0
  526. package/dist/cli/browser-cli-shared.js +1 -0
  527. package/dist/cli/browser-cli-state.cookies-storage.js +168 -0
  528. package/dist/cli/browser-cli-state.js +261 -0
  529. package/dist/cli/browser-cli.js +38 -0
  530. package/dist/cli/channel-auth.js +49 -0
  531. package/dist/cli/channel-options.js +29 -0
  532. package/dist/cli/channels-cli.js +208 -0
  533. package/dist/cli/cli-utils.js +34 -0
  534. package/dist/cli/command-format.js +14 -0
  535. package/dist/cli/command-options.js +6 -0
  536. package/dist/cli/config-cli.js +295 -0
  537. package/dist/cli/cron-cli/register.cron-add.js +188 -0
  538. package/dist/cli/cron-cli/register.cron-edit.js +160 -0
  539. package/dist/cli/cron-cli/register.cron-simple.js +98 -0
  540. package/dist/cli/cron-cli/register.js +16 -0
  541. package/dist/cli/cron-cli/shared.js +178 -0
  542. package/dist/cli/cron-cli.js +1 -0
  543. package/dist/cli/daemon-cli/install.js +218 -0
  544. package/dist/cli/daemon-cli/lifecycle.js +265 -0
  545. package/dist/cli/daemon-cli/probe.js +28 -0
  546. package/dist/cli/daemon-cli/register.js +69 -0
  547. package/dist/cli/daemon-cli/response.js +20 -0
  548. package/dist/cli/daemon-cli/runners.js +3 -0
  549. package/dist/cli/daemon-cli/shared.js +162 -0
  550. package/dist/cli/daemon-cli/status.gather.js +170 -0
  551. package/dist/cli/daemon-cli/status.js +19 -0
  552. package/dist/cli/daemon-cli/status.print.js +241 -0
  553. package/dist/cli/daemon-cli/types.js +1 -0
  554. package/dist/cli/daemon-cli.js +2 -0
  555. package/dist/cli/deps.js +28 -0
  556. package/dist/cli/devices-cli.js +181 -0
  557. package/dist/cli/directory-cli.js +227 -0
  558. package/dist/cli/dns-cli.js +199 -0
  559. package/dist/cli/docs-cli.js +17 -0
  560. package/dist/cli/exec-approvals-cli.js +378 -0
  561. package/dist/cli/gateway-cli/call.js +25 -0
  562. package/dist/cli/gateway-cli/dev.js +99 -0
  563. package/dist/cli/gateway-cli/discover.js +88 -0
  564. package/dist/cli/gateway-cli/register.js +255 -0
  565. package/dist/cli/gateway-cli/run-loop.js +87 -0
  566. package/dist/cli/gateway-cli/run.js +332 -0
  567. package/dist/cli/gateway-cli/shared.js +101 -0
  568. package/dist/cli/gateway-cli.js +1 -0
  569. package/dist/cli/gateway-rpc.js +27 -0
  570. package/dist/cli/help-format.js +16 -0
  571. package/dist/cli/hooks-cli.js +709 -0
  572. package/dist/cli/logs-cli.js +222 -0
  573. package/dist/cli/memory-cli.js +527 -0
  574. package/dist/cli/models-cli.js +321 -0
  575. package/dist/cli/node-cli/daemon.js +484 -0
  576. package/dist/cli/node-cli/register.js +81 -0
  577. package/dist/cli/node-cli.js +1 -0
  578. package/dist/cli/nodes-camera.js +50 -0
  579. package/dist/cli/nodes-canvas.js +24 -0
  580. package/dist/cli/nodes-cli/a2ui-jsonl.js +81 -0
  581. package/dist/cli/nodes-cli/cli-utils.js +27 -0
  582. package/dist/cli/nodes-cli/format.js +35 -0
  583. package/dist/cli/nodes-cli/register.camera.js +193 -0
  584. package/dist/cli/nodes-cli/register.canvas.js +215 -0
  585. package/dist/cli/nodes-cli/register.invoke.js +303 -0
  586. package/dist/cli/nodes-cli/register.js +24 -0
  587. package/dist/cli/nodes-cli/register.location.js +64 -0
  588. package/dist/cli/nodes-cli/register.notify.js +51 -0
  589. package/dist/cli/nodes-cli/register.pairing.js +99 -0
  590. package/dist/cli/nodes-cli/register.screen.js +66 -0
  591. package/dist/cli/nodes-cli/register.status.js +328 -0
  592. package/dist/cli/nodes-cli/rpc.js +88 -0
  593. package/dist/cli/nodes-cli/types.js +1 -0
  594. package/dist/cli/nodes-cli.js +1 -0
  595. package/dist/cli/nodes-run.js +19 -0
  596. package/dist/cli/nodes-screen.js +35 -0
  597. package/dist/cli/outbound-send-deps.js +11 -0
  598. package/dist/cli/pairing-cli.js +115 -0
  599. package/dist/cli/parse-duration.js +28 -0
  600. package/dist/cli/parse-timeout.js +18 -0
  601. package/dist/cli/plugin-registry.js +24 -0
  602. package/dist/cli/plugins-cli.js +469 -0
  603. package/dist/cli/ports.js +101 -0
  604. package/dist/cli/profile-utils.js +17 -0
  605. package/dist/cli/profile.js +86 -0
  606. package/dist/cli/program/build-program.js +14 -0
  607. package/dist/cli/program/command-registry.js +148 -0
  608. package/dist/cli/program/config-guard.js +67 -0
  609. package/dist/cli/program/context.js +11 -0
  610. package/dist/cli/program/help.js +72 -0
  611. package/dist/cli/program/helpers.js +26 -0
  612. package/dist/cli/program/message/helpers.js +46 -0
  613. package/dist/cli/program/message/register.broadcast.js +11 -0
  614. package/dist/cli/program/message/register.discord-admin.js +119 -0
  615. package/dist/cli/program/message/register.emoji-sticker.js +43 -0
  616. package/dist/cli/program/message/register.permissions-search.js +22 -0
  617. package/dist/cli/program/message/register.pins.js +23 -0
  618. package/dist/cli/program/message/register.poll.js +13 -0
  619. package/dist/cli/program/message/register.reactions.js +21 -0
  620. package/dist/cli/program/message/register.read-edit-delete.js +30 -0
  621. package/dist/cli/program/message/register.send.js +17 -0
  622. package/dist/cli/program/message/register.thread.js +35 -0
  623. package/dist/cli/program/preaction.js +46 -0
  624. package/dist/cli/program/register.agent.js +168 -0
  625. package/dist/cli/program/register.configure.js +32 -0
  626. package/dist/cli/program/register.maintenance.js +91 -0
  627. package/dist/cli/program/register.message.js +54 -0
  628. package/dist/cli/program/register.onboard.js +120 -0
  629. package/dist/cli/program/register.setup.js +41 -0
  630. package/dist/cli/program/register.status-health-sessions.js +109 -0
  631. package/dist/cli/program/register.subclis.js +279 -0
  632. package/dist/cli/program.js +2 -0
  633. package/dist/cli/progress.js +165 -0
  634. package/dist/cli/prompt.js +17 -0
  635. package/dist/cli/provision-cli.js +248 -0
  636. package/dist/cli/provision-seed.js +150 -0
  637. package/dist/cli/route.js +29 -0
  638. package/dist/cli/run-main.js +100 -0
  639. package/dist/cli/sandbox-cli.js +101 -0
  640. package/dist/cli/security-cli.js +113 -0
  641. package/dist/cli/skills-cli.js +341 -0
  642. package/dist/cli/system-cli.js +98 -0
  643. package/dist/cli/tagline.js +7 -0
  644. package/dist/cli/tui-cli.js +44 -0
  645. package/dist/cli/update-cli.js +997 -0
  646. package/dist/cli/wait.js +8 -0
  647. package/dist/cli/webhooks-cli.js +140 -0
  648. package/dist/commands/agent/delivery.js +140 -0
  649. package/dist/commands/agent/run-context.js +27 -0
  650. package/dist/commands/agent/session-store.js +43 -0
  651. package/dist/commands/agent/session.js +74 -0
  652. package/dist/commands/agent/types.js +1 -0
  653. package/dist/commands/agent-via-gateway.js +119 -0
  654. package/dist/commands/agent.js +403 -0
  655. package/dist/commands/agents.bindings.js +126 -0
  656. package/dist/commands/agents.command-shared.js +18 -0
  657. package/dist/commands/agents.commands.add.js +294 -0
  658. package/dist/commands/agents.commands.delete.js +75 -0
  659. package/dist/commands/agents.commands.identity.js +179 -0
  660. package/dist/commands/agents.commands.list.js +98 -0
  661. package/dist/commands/agents.config.js +145 -0
  662. package/dist/commands/agents.js +6 -0
  663. package/dist/commands/agents.providers.js +140 -0
  664. package/dist/commands/auth-choice-options.js +215 -0
  665. package/dist/commands/auth-choice-prompt.js +36 -0
  666. package/dist/commands/auth-choice.api-key.js +34 -0
  667. package/dist/commands/auth-choice.apply.anthropic.js +180 -0
  668. package/dist/commands/auth-choice.apply.api-providers.js +502 -0
  669. package/dist/commands/auth-choice.apply.copilot-proxy.js +10 -0
  670. package/dist/commands/auth-choice.apply.github-copilot.js +47 -0
  671. package/dist/commands/auth-choice.apply.google-antigravity.js +10 -0
  672. package/dist/commands/auth-choice.apply.google-gemini-cli.js +10 -0
  673. package/dist/commands/auth-choice.apply.js +30 -0
  674. package/dist/commands/auth-choice.apply.minimax.js +72 -0
  675. package/dist/commands/auth-choice.apply.oauth.js +78 -0
  676. package/dist/commands/auth-choice.apply.openai.js +149 -0
  677. package/dist/commands/auth-choice.apply.plugin-provider.js +142 -0
  678. package/dist/commands/auth-choice.apply.qwen-portal.js +10 -0
  679. package/dist/commands/auth-choice.default-model.js +12 -0
  680. package/dist/commands/auth-choice.js +3 -0
  681. package/dist/commands/auth-choice.model-check.js +61 -0
  682. package/dist/commands/auth-choice.preferred-provider.js +32 -0
  683. package/dist/commands/auth-token.js +32 -0
  684. package/dist/commands/channels/add-mutators.js +49 -0
  685. package/dist/commands/channels/add.js +210 -0
  686. package/dist/commands/channels/capabilities.js +439 -0
  687. package/dist/commands/channels/list.js +145 -0
  688. package/dist/commands/channels/logs.js +85 -0
  689. package/dist/commands/channels/remove.js +114 -0
  690. package/dist/commands/channels/resolve.js +107 -0
  691. package/dist/commands/channels/shared.js +41 -0
  692. package/dist/commands/channels/status.js +238 -0
  693. package/dist/commands/channels.js +7 -0
  694. package/dist/commands/chutes-oauth.js +144 -0
  695. package/dist/commands/cleanup-utils.js +74 -0
  696. package/dist/commands/configure.channels.js +52 -0
  697. package/dist/commands/configure.commands.js +8 -0
  698. package/dist/commands/configure.daemon.js +101 -0
  699. package/dist/commands/configure.gateway-auth.js +71 -0
  700. package/dist/commands/configure.gateway.js +172 -0
  701. package/dist/commands/configure.js +4 -0
  702. package/dist/commands/configure.shared.js +49 -0
  703. package/dist/commands/configure.wizard.js +466 -0
  704. package/dist/commands/daemon-install-helpers.js +51 -0
  705. package/dist/commands/daemon-runtime.js +11 -0
  706. package/dist/commands/dashboard.js +47 -0
  707. package/dist/commands/docs.js +148 -0
  708. package/dist/commands/doctor-auth.js +117 -0
  709. package/dist/commands/doctor-config-flow.js +188 -0
  710. package/dist/commands/doctor-format.js +85 -0
  711. package/dist/commands/doctor-gateway-daemon-flow.js +201 -0
  712. package/dist/commands/doctor-gateway-health.js +43 -0
  713. package/dist/commands/doctor-gateway-services.js +209 -0
  714. package/dist/commands/doctor-install.js +27 -0
  715. package/dist/commands/doctor-legacy-config.js +42 -0
  716. package/dist/commands/doctor-platform-notes.js +66 -0
  717. package/dist/commands/doctor-prompter.js +64 -0
  718. package/dist/commands/doctor-sandbox.js +207 -0
  719. package/dist/commands/doctor-security.js +130 -0
  720. package/dist/commands/doctor-state-integrity.js +332 -0
  721. package/dist/commands/doctor-state-migrations.js +1 -0
  722. package/dist/commands/doctor-ui.js +119 -0
  723. package/dist/commands/doctor-update.js +65 -0
  724. package/dist/commands/doctor-workspace-status.js +56 -0
  725. package/dist/commands/doctor-workspace.js +69 -0
  726. package/dist/commands/doctor.js +251 -0
  727. package/dist/commands/gateway-status/helpers.js +200 -0
  728. package/dist/commands/gateway-status.js +300 -0
  729. package/dist/commands/google-gemini-model-default.js +33 -0
  730. package/dist/commands/health-format.js +37 -0
  731. package/dist/commands/health.js +595 -0
  732. package/dist/commands/message-format.js +345 -0
  733. package/dist/commands/message.js +45 -0
  734. package/dist/commands/model-picker.js +420 -0
  735. package/dist/commands/models/aliases.js +92 -0
  736. package/dist/commands/models/auth-order.js +95 -0
  737. package/dist/commands/models/auth.js +333 -0
  738. package/dist/commands/models/fallbacks.js +126 -0
  739. package/dist/commands/models/image-fallbacks.js +126 -0
  740. package/dist/commands/models/list.auth-overview.js +93 -0
  741. package/dist/commands/models/list.configured.js +80 -0
  742. package/dist/commands/models/list.format.js +41 -0
  743. package/dist/commands/models/list.js +2 -0
  744. package/dist/commands/models/list.list-command.js +99 -0
  745. package/dist/commands/models/list.probe.js +348 -0
  746. package/dist/commands/models/list.registry.js +82 -0
  747. package/dist/commands/models/list.status-command.js +421 -0
  748. package/dist/commands/models/list.table.js +58 -0
  749. package/dist/commands/models/list.types.js +1 -0
  750. package/dist/commands/models/scan.js +293 -0
  751. package/dist/commands/models/set-image.js +28 -0
  752. package/dist/commands/models/set.js +28 -0
  753. package/dist/commands/models/shared.js +80 -0
  754. package/dist/commands/models.js +10 -0
  755. package/dist/commands/node-daemon-install-helpers.js +35 -0
  756. package/dist/commands/node-daemon-runtime.js +6 -0
  757. package/dist/commands/oauth-env.js +16 -0
  758. package/dist/commands/oauth-flow.js +33 -0
  759. package/dist/commands/onboard-auth.config-core.js +386 -0
  760. package/dist/commands/onboard-auth.config-minimax.js +176 -0
  761. package/dist/commands/onboard-auth.config-opencode.js +40 -0
  762. package/dist/commands/onboard-auth.credentials.js +147 -0
  763. package/dist/commands/onboard-auth.js +7 -0
  764. package/dist/commands/onboard-auth.models.js +100 -0
  765. package/dist/commands/onboard-channels.js +527 -0
  766. package/dist/commands/onboard-helpers.js +359 -0
  767. package/dist/commands/onboard-hooks.js +59 -0
  768. package/dist/commands/onboard-interactive.js +17 -0
  769. package/dist/commands/onboard-non-interactive/api-keys.js +45 -0
  770. package/dist/commands/onboard-non-interactive/local/auth-choice.js +349 -0
  771. package/dist/commands/onboard-non-interactive/local/daemon-install.js +45 -0
  772. package/dist/commands/onboard-non-interactive/local/gateway-config.js +83 -0
  773. package/dist/commands/onboard-non-interactive/local/output.js +14 -0
  774. package/dist/commands/onboard-non-interactive/local/skills-config.js +21 -0
  775. package/dist/commands/onboard-non-interactive/local/workspace.js +7 -0
  776. package/dist/commands/onboard-non-interactive/local.js +105 -0
  777. package/dist/commands/onboard-non-interactive/remote.js +41 -0
  778. package/dist/commands/onboard-non-interactive.js +25 -0
  779. package/dist/commands/onboard-remote.js +121 -0
  780. package/dist/commands/onboard-skills.js +146 -0
  781. package/dist/commands/onboard-types.js +1 -0
  782. package/dist/commands/onboard.js +41 -0
  783. package/dist/commands/onboarding/__tests__/test-utils.js +20 -0
  784. package/dist/commands/onboarding/plugin-install.js +162 -0
  785. package/dist/commands/onboarding/registry.js +13 -0
  786. package/dist/commands/onboarding/types.js +1 -0
  787. package/dist/commands/openai-codex-model-default.js +44 -0
  788. package/dist/commands/opencode-zen-model-default.js +35 -0
  789. package/dist/commands/reset.js +134 -0
  790. package/dist/commands/sandbox-display.js +82 -0
  791. package/dist/commands/sandbox-explain.js +226 -0
  792. package/dist/commands/sandbox-formatters.js +31 -0
  793. package/dist/commands/sandbox.js +119 -0
  794. package/dist/commands/sessions.js +211 -0
  795. package/dist/commands/setup.js +66 -0
  796. package/dist/commands/signal-install.js +132 -0
  797. package/dist/commands/status-all/agents.js +62 -0
  798. package/dist/commands/status-all/channels.js +354 -0
  799. package/dist/commands/status-all/diagnosis.js +156 -0
  800. package/dist/commands/status-all/format.js +41 -0
  801. package/dist/commands/status-all/gateway.js +158 -0
  802. package/dist/commands/status-all/report-lines.js +135 -0
  803. package/dist/commands/status-all.js +409 -0
  804. package/dist/commands/status.agent-local.js +68 -0
  805. package/dist/commands/status.command.js +476 -0
  806. package/dist/commands/status.daemon.js +30 -0
  807. package/dist/commands/status.format.js +52 -0
  808. package/dist/commands/status.gateway-probe.js +35 -0
  809. package/dist/commands/status.js +2 -0
  810. package/dist/commands/status.link-channel.js +39 -0
  811. package/dist/commands/status.scan.js +140 -0
  812. package/dist/commands/status.summary.js +172 -0
  813. package/dist/commands/status.types.js +1 -0
  814. package/dist/commands/status.update.js +112 -0
  815. package/dist/commands/systemd-linger.js +77 -0
  816. package/dist/commands/uninstall.js +161 -0
  817. package/dist/config/agent-dirs.js +79 -0
  818. package/dist/config/agent-limits.js +16 -0
  819. package/dist/config/cache-utils.js +22 -0
  820. package/dist/config/channel-capabilities.js +42 -0
  821. package/dist/config/commands.js +38 -0
  822. package/dist/config/config-paths.js +75 -0
  823. package/dist/config/config.js +7 -0
  824. package/dist/config/defaults.js +410 -0
  825. package/dist/config/env-substitution.js +117 -0
  826. package/dist/config/env-vars.js +21 -0
  827. package/dist/config/group-policy.js +54 -0
  828. package/dist/config/includes.js +183 -0
  829. package/dist/config/io.js +488 -0
  830. package/dist/config/legacy-migrate.js +13 -0
  831. package/dist/config/legacy.js +34 -0
  832. package/dist/config/legacy.migrations.js +8 -0
  833. package/dist/config/legacy.migrations.part-1.js +308 -0
  834. package/dist/config/legacy.migrations.part-2.js +343 -0
  835. package/dist/config/legacy.migrations.part-3.js +191 -0
  836. package/dist/config/legacy.rules.js +116 -0
  837. package/dist/config/legacy.shared.js +76 -0
  838. package/dist/config/logging.js +10 -0
  839. package/dist/config/markdown-tables.js +36 -0
  840. package/dist/config/merge-config.js +22 -0
  841. package/dist/config/merge-patch.js +22 -0
  842. package/dist/config/normalize-paths.js +54 -0
  843. package/dist/config/paths.js +90 -0
  844. package/dist/config/plugin-auto-enable.js +338 -0
  845. package/dist/config/port-defaults.js +30 -0
  846. package/dist/config/runtime-overrides.js +50 -0
  847. package/dist/config/schema.js +791 -0
  848. package/dist/config/sessions/group.js +83 -0
  849. package/dist/config/sessions/main-session.js +43 -0
  850. package/dist/config/sessions/metadata.js +114 -0
  851. package/dist/config/sessions/paths.js +46 -0
  852. package/dist/config/sessions/reset.js +103 -0
  853. package/dist/config/sessions/session-key.js +34 -0
  854. package/dist/config/sessions/store.js +351 -0
  855. package/dist/config/sessions/transcript.js +113 -0
  856. package/dist/config/sessions/types.js +11 -0
  857. package/dist/config/sessions.js +9 -0
  858. package/dist/config/talk.js +31 -0
  859. package/dist/config/telegram-custom-commands.js +70 -0
  860. package/dist/config/types.agent-defaults.js +1 -0
  861. package/dist/config/types.agents.js +1 -0
  862. package/dist/config/types.approvals.js +1 -0
  863. package/dist/config/types.auth.js +1 -0
  864. package/dist/config/types.base.js +1 -0
  865. package/dist/config/types.browser.js +1 -0
  866. package/dist/config/types.channels.js +1 -0
  867. package/dist/config/types.cron.js +1 -0
  868. package/dist/config/types.discord.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 +30 -0
  874. package/dist/config/types.license.js +1 -0
  875. package/dist/config/types.messages.js +1 -0
  876. package/dist/config/types.models.js +1 -0
  877. package/dist/config/types.msteams.js +1 -0
  878. package/dist/config/types.node-host.js +1 -0
  879. package/dist/config/types.plugins.js +1 -0
  880. package/dist/config/types.queue.js +1 -0
  881. package/dist/config/types.sandbox.js +1 -0
  882. package/dist/config/types.signal.js +1 -0
  883. package/dist/config/types.skills.js +1 -0
  884. package/dist/config/types.slack.js +1 -0
  885. package/dist/config/types.taskmaster.js +1 -0
  886. package/dist/config/types.telegram.js +1 -0
  887. package/dist/config/types.tools.js +1 -0
  888. package/dist/config/types.tts.js +1 -0
  889. package/dist/config/types.whatsapp.js +1 -0
  890. package/dist/config/validation.js +297 -0
  891. package/dist/config/version.js +30 -0
  892. package/dist/config/zod-schema.agent-defaults.js +157 -0
  893. package/dist/config/zod-schema.agent-runtime.js +521 -0
  894. package/dist/config/zod-schema.agents.js +53 -0
  895. package/dist/config/zod-schema.approvals.js +25 -0
  896. package/dist/config/zod-schema.channels.js +9 -0
  897. package/dist/config/zod-schema.core.js +452 -0
  898. package/dist/config/zod-schema.hooks.js +122 -0
  899. package/dist/config/zod-schema.js +582 -0
  900. package/dist/config/zod-schema.providers-core.js +681 -0
  901. package/dist/config/zod-schema.providers-whatsapp.js +125 -0
  902. package/dist/config/zod-schema.providers.js +29 -0
  903. package/dist/config/zod-schema.session.js +100 -0
  904. package/dist/control-ui/assets/index-DE-53MKi.css +1 -0
  905. package/dist/control-ui/assets/index-Dcwiyz6o.js +2714 -0
  906. package/dist/control-ui/assets/index-Dcwiyz6o.js.map +1 -0
  907. package/dist/control-ui/beagle-icon.png +0 -0
  908. package/dist/control-ui/favicon-16x16.png +0 -0
  909. package/dist/control-ui/favicon-32x32.png +0 -0
  910. package/dist/control-ui/favicon.ico +0 -0
  911. package/dist/control-ui/favicon.png +0 -0
  912. package/dist/control-ui/index.html +15 -0
  913. package/dist/control-ui/taskmaster-icon.png +0 -0
  914. package/dist/control-ui/taskmaster-logo.png +0 -0
  915. package/dist/control-ui/tradesupport-icon.png +0 -0
  916. package/dist/cron/isolated-agent/delivery-target.js +61 -0
  917. package/dist/cron/isolated-agent/helpers.js +49 -0
  918. package/dist/cron/isolated-agent/run.js +346 -0
  919. package/dist/cron/isolated-agent/session.js +27 -0
  920. package/dist/cron/isolated-agent.js +1 -0
  921. package/dist/cron/normalize.js +124 -0
  922. package/dist/cron/parse.js +24 -0
  923. package/dist/cron/payload-migration.js +29 -0
  924. package/dist/cron/run-log.js +70 -0
  925. package/dist/cron/schedule.js +24 -0
  926. package/dist/cron/service/jobs.js +178 -0
  927. package/dist/cron/service/locked.js +12 -0
  928. package/dist/cron/service/normalize.js +55 -0
  929. package/dist/cron/service/ops.js +118 -0
  930. package/dist/cron/service/state.js +10 -0
  931. package/dist/cron/service/store.js +78 -0
  932. package/dist/cron/service/timer.js +217 -0
  933. package/dist/cron/service.js +35 -0
  934. package/dist/cron/store.js +43 -0
  935. package/dist/cron/types.js +1 -0
  936. package/dist/daemon/constants.js +71 -0
  937. package/dist/daemon/diagnostics.js +38 -0
  938. package/dist/daemon/inspect.js +313 -0
  939. package/dist/daemon/launchd-plist.js +68 -0
  940. package/dist/daemon/launchd.js +316 -0
  941. package/dist/daemon/legacy.js +44 -0
  942. package/dist/daemon/node-service.js +53 -0
  943. package/dist/daemon/paths.js +35 -0
  944. package/dist/daemon/program-args.js +220 -0
  945. package/dist/daemon/runtime-parse.js +17 -0
  946. package/dist/daemon/runtime-paths.js +109 -0
  947. package/dist/daemon/schtasks.js +303 -0
  948. package/dist/daemon/service-audit.js +270 -0
  949. package/dist/daemon/service-env.js +128 -0
  950. package/dist/daemon/service-runtime.js +1 -0
  951. package/dist/daemon/service.js +90 -0
  952. package/dist/daemon/systemd-hints.js +24 -0
  953. package/dist/daemon/systemd-linger.js +59 -0
  954. package/dist/daemon/systemd-unit.js +108 -0
  955. package/dist/daemon/systemd.js +318 -0
  956. package/dist/discord/accounts.js +52 -0
  957. package/dist/discord/api.js +93 -0
  958. package/dist/discord/audit.js +94 -0
  959. package/dist/discord/chunk.js +200 -0
  960. package/dist/discord/directory-live.js +76 -0
  961. package/dist/discord/gateway-logging.js +48 -0
  962. package/dist/discord/index.js +2 -0
  963. package/dist/discord/monitor/allow-list.js +230 -0
  964. package/dist/discord/monitor/exec-approvals.js +406 -0
  965. package/dist/discord/monitor/format.js +27 -0
  966. package/dist/discord/monitor/listeners.js +216 -0
  967. package/dist/discord/monitor/message-handler.js +101 -0
  968. package/dist/discord/monitor/message-handler.preflight.js +438 -0
  969. package/dist/discord/monitor/message-handler.preflight.types.js +1 -0
  970. package/dist/discord/monitor/message-handler.process.js +344 -0
  971. package/dist/discord/monitor/message-utils.js +189 -0
  972. package/dist/discord/monitor/native-command.js +705 -0
  973. package/dist/discord/monitor/provider.js +537 -0
  974. package/dist/discord/monitor/reply-context.js +29 -0
  975. package/dist/discord/monitor/reply-delivery.js +57 -0
  976. package/dist/discord/monitor/system-events.js +53 -0
  977. package/dist/discord/monitor/threading.js +201 -0
  978. package/dist/discord/monitor/typing.js +8 -0
  979. package/dist/discord/monitor.gateway.js +54 -0
  980. package/dist/discord/monitor.js +7 -0
  981. package/dist/discord/probe.js +124 -0
  982. package/dist/discord/resolve-channels.js +239 -0
  983. package/dist/discord/resolve-users.js +114 -0
  984. package/dist/discord/send.channels.js +74 -0
  985. package/dist/discord/send.emojis-stickers.js +48 -0
  986. package/dist/discord/send.guild.js +79 -0
  987. package/dist/discord/send.js +7 -0
  988. package/dist/discord/send.messages.js +91 -0
  989. package/dist/discord/send.outbound.js +87 -0
  990. package/dist/discord/send.permissions.js +116 -0
  991. package/dist/discord/send.reactions.js +71 -0
  992. package/dist/discord/send.shared.js +249 -0
  993. package/dist/discord/send.types.js +16 -0
  994. package/dist/discord/targets.js +43 -0
  995. package/dist/discord/token.js +29 -0
  996. package/dist/entry.js +140 -0
  997. package/dist/gateway/assistant-identity.js +64 -0
  998. package/dist/gateway/auth.js +161 -0
  999. package/dist/gateway/boot.js +72 -0
  1000. package/dist/gateway/call.js +182 -0
  1001. package/dist/gateway/chat-abort.js +55 -0
  1002. package/dist/gateway/chat-attachments.js +133 -0
  1003. package/dist/gateway/chat-sanitize.js +103 -0
  1004. package/dist/gateway/client.js +339 -0
  1005. package/dist/gateway/config-reload.js +299 -0
  1006. package/dist/gateway/control-ui-shared.js +48 -0
  1007. package/dist/gateway/control-ui.js +347 -0
  1008. package/dist/gateway/device-auth.js +19 -0
  1009. package/dist/gateway/exec-approval-manager.js +40 -0
  1010. package/dist/gateway/hooks-mapping.js +273 -0
  1011. package/dist/gateway/hooks.js +169 -0
  1012. package/dist/gateway/http-common.js +43 -0
  1013. package/dist/gateway/http-utils.js +51 -0
  1014. package/dist/gateway/live-image-probe.js +156 -0
  1015. package/dist/gateway/net.js +176 -0
  1016. package/dist/gateway/node-command-policy.js +106 -0
  1017. package/dist/gateway/node-registry.js +142 -0
  1018. package/dist/gateway/open-responses.schema.js +285 -0
  1019. package/dist/gateway/openai-http.js +327 -0
  1020. package/dist/gateway/openresponses-http.js +693 -0
  1021. package/dist/gateway/probe.js +87 -0
  1022. package/dist/gateway/protocol/client-info.js +47 -0
  1023. package/dist/gateway/protocol/index.js +110 -0
  1024. package/dist/gateway/protocol/schema/agent.js +73 -0
  1025. package/dist/gateway/protocol/schema/agents-models-skills.js +47 -0
  1026. package/dist/gateway/protocol/schema/channels.js +74 -0
  1027. package/dist/gateway/protocol/schema/config.js +45 -0
  1028. package/dist/gateway/protocol/schema/cron.js +160 -0
  1029. package/dist/gateway/protocol/schema/devices.js +36 -0
  1030. package/dist/gateway/protocol/schema/error-codes.js +14 -0
  1031. package/dist/gateway/protocol/schema/exec-approvals.js +66 -0
  1032. package/dist/gateway/protocol/schema/frames.js +101 -0
  1033. package/dist/gateway/protocol/schema/logs-chat.js +55 -0
  1034. package/dist/gateway/protocol/schema/nodes.js +54 -0
  1035. package/dist/gateway/protocol/schema/primitives.js +10 -0
  1036. package/dist/gateway/protocol/schema/protocol-schemas.js +117 -0
  1037. package/dist/gateway/protocol/schema/sessions-transcript.js +30 -0
  1038. package/dist/gateway/protocol/schema/sessions.js +70 -0
  1039. package/dist/gateway/protocol/schema/snapshot.js +40 -0
  1040. package/dist/gateway/protocol/schema/types.js +1 -0
  1041. package/dist/gateway/protocol/schema/wizard.js +76 -0
  1042. package/dist/gateway/protocol/schema.js +17 -0
  1043. package/dist/gateway/server/__tests__/test-utils.js +24 -0
  1044. package/dist/gateway/server/close-reason.js +10 -0
  1045. package/dist/gateway/server/health-state.js +69 -0
  1046. package/dist/gateway/server/hooks.js +84 -0
  1047. package/dist/gateway/server/http-listen.js +26 -0
  1048. package/dist/gateway/server/plugins-http.js +45 -0
  1049. package/dist/gateway/server/tls.js +4 -0
  1050. package/dist/gateway/server/ws-connection/message-handler.js +773 -0
  1051. package/dist/gateway/server/ws-connection.js +191 -0
  1052. package/dist/gateway/server/ws-types.js +1 -0
  1053. package/dist/gateway/server-broadcast.js +73 -0
  1054. package/dist/gateway/server-browser.js +11 -0
  1055. package/dist/gateway/server-channels.js +242 -0
  1056. package/dist/gateway/server-chat.js +201 -0
  1057. package/dist/gateway/server-close.js +99 -0
  1058. package/dist/gateway/server-constants.js +29 -0
  1059. package/dist/gateway/server-cron.js +84 -0
  1060. package/dist/gateway/server-discovery-runtime.js +62 -0
  1061. package/dist/gateway/server-discovery.js +62 -0
  1062. package/dist/gateway/server-http.js +249 -0
  1063. package/dist/gateway/server-lanes.js +7 -0
  1064. package/dist/gateway/server-maintenance.js +68 -0
  1065. package/dist/gateway/server-methods/access.js +236 -0
  1066. package/dist/gateway/server-methods/agent-job.js +104 -0
  1067. package/dist/gateway/server-methods/agent.js +358 -0
  1068. package/dist/gateway/server-methods/agents.js +14 -0
  1069. package/dist/gateway/server-methods/apikeys.js +83 -0
  1070. package/dist/gateway/server-methods/auth.js +283 -0
  1071. package/dist/gateway/server-methods/browser-screencast.js +150 -0
  1072. package/dist/gateway/server-methods/channels.js +218 -0
  1073. package/dist/gateway/server-methods/chat.js +589 -0
  1074. package/dist/gateway/server-methods/config.js +273 -0
  1075. package/dist/gateway/server-methods/connect.js +6 -0
  1076. package/dist/gateway/server-methods/cron.js +117 -0
  1077. package/dist/gateway/server-methods/devices.js +95 -0
  1078. package/dist/gateway/server-methods/exec-approval.js +78 -0
  1079. package/dist/gateway/server-methods/exec-approvals.js +141 -0
  1080. package/dist/gateway/server-methods/files.js +388 -0
  1081. package/dist/gateway/server-methods/health.js +29 -0
  1082. package/dist/gateway/server-methods/license.js +94 -0
  1083. package/dist/gateway/server-methods/logs.js +143 -0
  1084. package/dist/gateway/server-methods/models.js +16 -0
  1085. package/dist/gateway/server-methods/nodes.helpers.js +32 -0
  1086. package/dist/gateway/server-methods/nodes.js +426 -0
  1087. package/dist/gateway/server-methods/records.js +132 -0
  1088. package/dist/gateway/server-methods/send.js +280 -0
  1089. package/dist/gateway/server-methods/sessions-transcript.js +306 -0
  1090. package/dist/gateway/server-methods/sessions.js +322 -0
  1091. package/dist/gateway/server-methods/skills.js +137 -0
  1092. package/dist/gateway/server-methods/system.js +122 -0
  1093. package/dist/gateway/server-methods/talk.js +20 -0
  1094. package/dist/gateway/server-methods/tts.js +132 -0
  1095. package/dist/gateway/server-methods/types.js +1 -0
  1096. package/dist/gateway/server-methods/update.js +162 -0
  1097. package/dist/gateway/server-methods/usage.js +63 -0
  1098. package/dist/gateway/server-methods/voicewake.js +30 -0
  1099. package/dist/gateway/server-methods/web.js +178 -0
  1100. package/dist/gateway/server-methods/wizard.js +100 -0
  1101. package/dist/gateway/server-methods/workspaces.js +666 -0
  1102. package/dist/gateway/server-methods-list.js +115 -0
  1103. package/dist/gateway/server-methods.js +235 -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 +63 -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 +470 -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 +528 -0
  1126. package/dist/gateway/session-utils.types.js +1 -0
  1127. package/dist/gateway/sessions-patch.js +293 -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 +510 -0
  1131. package/dist/gateway/test-helpers.openai-mock.js +163 -0
  1132. package/dist/gateway/test-helpers.server.js +350 -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/conversation-archive/HOOK.md +103 -0
  1142. package/dist/hooks/bundled/conversation-archive/handler.js +199 -0
  1143. package/dist/hooks/bundled/session-memory/HOOK.md +86 -0
  1144. package/dist/hooks/bundled/session-memory/handler.js +140 -0
  1145. package/dist/hooks/bundled-dir.js +42 -0
  1146. package/dist/hooks/config.js +122 -0
  1147. package/dist/hooks/frontmatter.js +107 -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/types.js +1 -0
  1161. package/dist/hooks/workspace.js +206 -0
  1162. package/dist/imessage/accounts.js +61 -0
  1163. package/dist/imessage/client.js +174 -0
  1164. package/dist/imessage/index.js +3 -0
  1165. package/dist/imessage/monitor/deliver.js +45 -0
  1166. package/dist/imessage/monitor/monitor-provider.js +641 -0
  1167. package/dist/imessage/monitor/runtime.js +12 -0
  1168. package/dist/imessage/monitor/types.js +1 -0
  1169. package/dist/imessage/monitor.js +1 -0
  1170. package/dist/imessage/probe.js +68 -0
  1171. package/dist/imessage/send.js +101 -0
  1172. package/dist/imessage/targets.js +172 -0
  1173. package/dist/index.js +49 -0
  1174. package/dist/infra/agent-events.js +54 -0
  1175. package/dist/infra/archive.js +97 -0
  1176. package/dist/infra/backoff.js +19 -0
  1177. package/dist/infra/binaries.js +9 -0
  1178. package/dist/infra/bonjour-ciao.js +10 -0
  1179. package/dist/infra/bonjour-discovery.js +445 -0
  1180. package/dist/infra/bonjour-errors.js +7 -0
  1181. package/dist/infra/bonjour.js +209 -0
  1182. package/dist/infra/brew.js +55 -0
  1183. package/dist/infra/canvas-host-url.js +52 -0
  1184. package/dist/infra/channel-activity.js +32 -0
  1185. package/dist/infra/channel-summary.js +183 -0
  1186. package/dist/infra/channels-status-issues.js +15 -0
  1187. package/dist/infra/clipboard.js +24 -0
  1188. package/dist/infra/control-ui-assets.js +98 -0
  1189. package/dist/infra/dedupe.js +47 -0
  1190. package/dist/infra/device-auth-store.js +97 -0
  1191. package/dist/infra/device-identity.js +149 -0
  1192. package/dist/infra/device-pairing.js +401 -0
  1193. package/dist/infra/diagnostic-events.js +28 -0
  1194. package/dist/infra/diagnostic-flags.js +66 -0
  1195. package/dist/infra/dotenv.js +15 -0
  1196. package/dist/infra/env-file.js +43 -0
  1197. package/dist/infra/env.js +34 -0
  1198. package/dist/infra/errors.js +35 -0
  1199. package/dist/infra/exec-approval-forwarder.js +212 -0
  1200. package/dist/infra/exec-approvals.js +1040 -0
  1201. package/dist/infra/exec-host.js +75 -0
  1202. package/dist/infra/exec-safety.js +31 -0
  1203. package/dist/infra/fetch.js +58 -0
  1204. package/dist/infra/format-duration.js +20 -0
  1205. package/dist/infra/gateway-lock.js +202 -0
  1206. package/dist/infra/git-commit.js +106 -0
  1207. package/dist/infra/heartbeat-events.js +34 -0
  1208. package/dist/infra/heartbeat-runner.js +748 -0
  1209. package/dist/infra/heartbeat-visibility.js +31 -0
  1210. package/dist/infra/heartbeat-wake.js +61 -0
  1211. package/dist/infra/is-main.js +33 -0
  1212. package/dist/infra/json-file.js +21 -0
  1213. package/dist/infra/machine-name.js +43 -0
  1214. package/dist/infra/net/ssrf.js +123 -0
  1215. package/dist/infra/node-pairing.js +228 -0
  1216. package/dist/infra/node-shell.js +9 -0
  1217. package/dist/infra/os-summary.js +23 -0
  1218. package/dist/infra/outbound/agent-delivery.js +86 -0
  1219. package/dist/infra/outbound/channel-adapters.js +16 -0
  1220. package/dist/infra/outbound/channel-selection.js +62 -0
  1221. package/dist/infra/outbound/channel-target.js +28 -0
  1222. package/dist/infra/outbound/cross-agent-echo.js +30 -0
  1223. package/dist/infra/outbound/deliver.js +253 -0
  1224. package/dist/infra/outbound/directory-cache.js +44 -0
  1225. package/dist/infra/outbound/envelope.js +20 -0
  1226. package/dist/infra/outbound/format.js +66 -0
  1227. package/dist/infra/outbound/message-action-runner.js +799 -0
  1228. package/dist/infra/outbound/message-action-spec.js +82 -0
  1229. package/dist/infra/outbound/message.js +189 -0
  1230. package/dist/infra/outbound/outbound-policy.js +122 -0
  1231. package/dist/infra/outbound/outbound-send-service.js +123 -0
  1232. package/dist/infra/outbound/outbound-session.js +744 -0
  1233. package/dist/infra/outbound/payloads.js +78 -0
  1234. package/dist/infra/outbound/target-errors.js +23 -0
  1235. package/dist/infra/outbound/target-normalization.js +27 -0
  1236. package/dist/infra/outbound/target-resolver.js +348 -0
  1237. package/dist/infra/outbound/targets.js +215 -0
  1238. package/dist/infra/path-env.js +93 -0
  1239. package/dist/infra/ports-format.js +53 -0
  1240. package/dist/infra/ports-inspect.js +240 -0
  1241. package/dist/infra/ports-lsof.js +33 -0
  1242. package/dist/infra/ports-types.js +1 -0
  1243. package/dist/infra/ports.js +75 -0
  1244. package/dist/infra/provider-usage.auth.js +190 -0
  1245. package/dist/infra/provider-usage.fetch.antigravity.js +212 -0
  1246. package/dist/infra/provider-usage.fetch.claude.js +129 -0
  1247. package/dist/infra/provider-usage.fetch.codex.js +62 -0
  1248. package/dist/infra/provider-usage.fetch.copilot.js +42 -0
  1249. package/dist/infra/provider-usage.fetch.gemini.js +57 -0
  1250. package/dist/infra/provider-usage.fetch.js +7 -0
  1251. package/dist/infra/provider-usage.fetch.minimax.js +332 -0
  1252. package/dist/infra/provider-usage.fetch.shared.js +10 -0
  1253. package/dist/infra/provider-usage.fetch.zai.js +62 -0
  1254. package/dist/infra/provider-usage.format.js +96 -0
  1255. package/dist/infra/provider-usage.js +3 -0
  1256. package/dist/infra/provider-usage.load.js +59 -0
  1257. package/dist/infra/provider-usage.shared.js +51 -0
  1258. package/dist/infra/provider-usage.types.js +1 -0
  1259. package/dist/infra/restart-sentinel.js +65 -0
  1260. package/dist/infra/restart.js +171 -0
  1261. package/dist/infra/retry-policy.js +68 -0
  1262. package/dist/infra/retry.js +85 -0
  1263. package/dist/infra/runtime-guard.js +60 -0
  1264. package/dist/infra/session-cost-usage.js +190 -0
  1265. package/dist/infra/shell-env.js +125 -0
  1266. package/dist/infra/skills-remote.js +282 -0
  1267. package/dist/infra/ssh-config.js +83 -0
  1268. package/dist/infra/ssh-tunnel.js +166 -0
  1269. package/dist/infra/state-migrations.fs.js +49 -0
  1270. package/dist/infra/state-migrations.js +498 -0
  1271. package/dist/infra/system-events.js +75 -0
  1272. package/dist/infra/system-presence.js +231 -0
  1273. package/dist/infra/tailnet.js +46 -0
  1274. package/dist/infra/tailscale.js +306 -0
  1275. package/dist/infra/taskmaster-root.js +56 -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/tunnel-config.js +86 -0
  1280. package/dist/infra/tunnel.js +261 -0
  1281. package/dist/infra/unhandled-rejections.js +29 -0
  1282. package/dist/infra/update-channels.js +57 -0
  1283. package/dist/infra/update-check.js +293 -0
  1284. package/dist/infra/update-global.js +85 -0
  1285. package/dist/infra/update-runner.js +557 -0
  1286. package/dist/infra/update-startup.js +86 -0
  1287. package/dist/infra/voicewake.js +74 -0
  1288. package/dist/infra/warnings.js +25 -0
  1289. package/dist/infra/widearea-dns.js +131 -0
  1290. package/dist/infra/ws.js +13 -0
  1291. package/dist/infra/wsl.js +25 -0
  1292. package/dist/line/accounts.js +130 -0
  1293. package/dist/line/auto-reply-delivery.js +102 -0
  1294. package/dist/line/bot-access.js +38 -0
  1295. package/dist/line/bot-handlers.js +258 -0
  1296. package/dist/line/bot-message-context.js +374 -0
  1297. package/dist/line/bot.js +48 -0
  1298. package/dist/line/config-schema.js +47 -0
  1299. package/dist/line/download.js +95 -0
  1300. package/dist/line/flex-templates.js +1264 -0
  1301. package/dist/line/http-registry.js +27 -0
  1302. package/dist/line/index.js +19 -0
  1303. package/dist/line/markdown-to-line.js +346 -0
  1304. package/dist/line/monitor.js +270 -0
  1305. package/dist/line/probe.js +37 -0
  1306. package/dist/line/reply-chunks.js +53 -0
  1307. package/dist/line/rich-menu.js +320 -0
  1308. package/dist/line/send.js +451 -0
  1309. package/dist/line/template-messages.js +258 -0
  1310. package/dist/line/types.js +1 -0
  1311. package/dist/line/webhook.js +75 -0
  1312. package/dist/link-understanding/apply.js +22 -0
  1313. package/dist/link-understanding/defaults.js +2 -0
  1314. package/dist/link-understanding/detect.js +49 -0
  1315. package/dist/link-understanding/format.js +10 -0
  1316. package/dist/link-understanding/index.js +4 -0
  1317. package/dist/link-understanding/runner.js +99 -0
  1318. package/dist/logger.js +53 -0
  1319. package/dist/logging/config.js +19 -0
  1320. package/dist/logging/console.js +237 -0
  1321. package/dist/logging/diagnostic.js +236 -0
  1322. package/dist/logging/levels.js +26 -0
  1323. package/dist/logging/logger.js +185 -0
  1324. package/dist/logging/parse-log-line.js +52 -0
  1325. package/dist/logging/redact.js +115 -0
  1326. package/dist/logging/state.js +12 -0
  1327. package/dist/logging/subsystem.js +234 -0
  1328. package/dist/logging.js +5 -0
  1329. package/dist/macos/gateway-daemon.js +178 -0
  1330. package/dist/macos/relay-smoke.js +29 -0
  1331. package/dist/macos/relay.js +60 -0
  1332. package/dist/markdown/code-spans.js +67 -0
  1333. package/dist/markdown/fences.js +57 -0
  1334. package/dist/markdown/frontmatter.js +124 -0
  1335. package/dist/markdown/ir.js +687 -0
  1336. package/dist/markdown/render.js +113 -0
  1337. package/dist/markdown/tables.js +35 -0
  1338. package/dist/media/audio-tags.js +14 -0
  1339. package/dist/media/audio.js +15 -0
  1340. package/dist/media/constants.js +33 -0
  1341. package/dist/media/document-extract.js +139 -0
  1342. package/dist/media/fetch.js +151 -0
  1343. package/dist/media/host.js +43 -0
  1344. package/dist/media/image-ops.js +385 -0
  1345. package/dist/media/input-files.js +268 -0
  1346. package/dist/media/mime.js +147 -0
  1347. package/dist/media/parse.js +175 -0
  1348. package/dist/media/server.js +64 -0
  1349. package/dist/media/store.js +210 -0
  1350. package/dist/media-understanding/apply.js +78 -0
  1351. package/dist/media-understanding/attachments.js +320 -0
  1352. package/dist/media-understanding/concurrency.js +26 -0
  1353. package/dist/media-understanding/defaults.js +30 -0
  1354. package/dist/media-understanding/errors.js +11 -0
  1355. package/dist/media-understanding/format.js +56 -0
  1356. package/dist/media-understanding/index.js +3 -0
  1357. package/dist/media-understanding/providers/anthropic/index.js +6 -0
  1358. package/dist/media-understanding/providers/deepgram/audio.js +47 -0
  1359. package/dist/media-understanding/providers/deepgram/index.js +6 -0
  1360. package/dist/media-understanding/providers/google/audio.js +64 -0
  1361. package/dist/media-understanding/providers/google/index.js +10 -0
  1362. package/dist/media-understanding/providers/google/video.js +64 -0
  1363. package/dist/media-understanding/providers/groq/index.js +10 -0
  1364. package/dist/media-understanding/providers/image.js +64 -0
  1365. package/dist/media-understanding/providers/index.js +45 -0
  1366. package/dist/media-understanding/providers/minimax/index.js +6 -0
  1367. package/dist/media-understanding/providers/openai/audio.js +46 -0
  1368. package/dist/media-understanding/providers/openai/index.js +8 -0
  1369. package/dist/media-understanding/providers/shared.js +29 -0
  1370. package/dist/media-understanding/resolve.js +113 -0
  1371. package/dist/media-understanding/runner.js +976 -0
  1372. package/dist/media-understanding/scope.js +41 -0
  1373. package/dist/media-understanding/types.js +1 -0
  1374. package/dist/media-understanding/video.js +8 -0
  1375. package/dist/memory/batch-gemini.js +320 -0
  1376. package/dist/memory/batch-openai.js +290 -0
  1377. package/dist/memory/embeddings-gemini.js +129 -0
  1378. package/dist/memory/embeddings-openai.js +65 -0
  1379. package/dist/memory/embeddings.js +170 -0
  1380. package/dist/memory/headers-fingerprint.js +16 -0
  1381. package/dist/memory/hybrid.js +61 -0
  1382. package/dist/memory/index.js +1 -0
  1383. package/dist/memory/internal.js +198 -0
  1384. package/dist/memory/manager-cache-key.js +45 -0
  1385. package/dist/memory/manager-search.js +95 -0
  1386. package/dist/memory/manager.js +2187 -0
  1387. package/dist/memory/memory-schema.js +76 -0
  1388. package/dist/memory/node-llama.js +3 -0
  1389. package/dist/memory/openai-batch.js +2 -0
  1390. package/dist/memory/provider-key.js +23 -0
  1391. package/dist/memory/search-manager.js +11 -0
  1392. package/dist/memory/session-files.js +98 -0
  1393. package/dist/memory/sqlite-vec.js +19 -0
  1394. package/dist/memory/sqlite.js +7 -0
  1395. package/dist/memory/status-format.js +23 -0
  1396. package/dist/memory/sync-memory-files.js +73 -0
  1397. package/dist/memory/sync-session-files.js +95 -0
  1398. package/dist/node-host/config.js +53 -0
  1399. package/dist/node-host/runner.js +951 -0
  1400. package/dist/pairing/pairing-labels.js +4 -0
  1401. package/dist/pairing/pairing-messages.js +14 -0
  1402. package/dist/pairing/pairing-store.js +357 -0
  1403. package/dist/plugin-sdk/index.js +84 -0
  1404. package/dist/plugins/bundled-dir.js +35 -0
  1405. package/dist/plugins/cli.js +49 -0
  1406. package/dist/plugins/commands.js +228 -0
  1407. package/dist/plugins/config-schema.js +23 -0
  1408. package/dist/plugins/config-state.js +101 -0
  1409. package/dist/plugins/discovery.js +276 -0
  1410. package/dist/plugins/enable.js +36 -0
  1411. package/dist/plugins/hook-runner-global.js +57 -0
  1412. package/dist/plugins/hooks.js +283 -0
  1413. package/dist/plugins/http-path.js +10 -0
  1414. package/dist/plugins/http-registry.js +31 -0
  1415. package/dist/plugins/install.js +323 -0
  1416. package/dist/plugins/installs.js +21 -0
  1417. package/dist/plugins/loader.js +364 -0
  1418. package/dist/plugins/manifest-registry.js +136 -0
  1419. package/dist/plugins/manifest.js +69 -0
  1420. package/dist/plugins/providers.js +16 -0
  1421. package/dist/plugins/registry.js +312 -0
  1422. package/dist/plugins/runtime/index.js +293 -0
  1423. package/dist/plugins/runtime/native-deps.js +16 -0
  1424. package/dist/plugins/runtime/types.js +1 -0
  1425. package/dist/plugins/runtime.js +42 -0
  1426. package/dist/plugins/schema-validator.js +28 -0
  1427. package/dist/plugins/services.js +55 -0
  1428. package/dist/plugins/slots.js +70 -0
  1429. package/dist/plugins/status.js +27 -0
  1430. package/dist/plugins/tools.js +98 -0
  1431. package/dist/plugins/types.js +1 -0
  1432. package/dist/plugins/update.js +324 -0
  1433. package/dist/polls.js +41 -0
  1434. package/dist/process/child-process-bridge.js +34 -0
  1435. package/dist/process/command-queue.js +104 -0
  1436. package/dist/process/exec.js +98 -0
  1437. package/dist/process/lanes.js +1 -0
  1438. package/dist/process/spawn-utils.js +95 -0
  1439. package/dist/providers/github-copilot-auth.js +124 -0
  1440. package/dist/providers/github-copilot-models.js +35 -0
  1441. package/dist/providers/github-copilot-token.js +95 -0
  1442. package/dist/providers/qwen-portal-oauth.js +38 -0
  1443. package/dist/routing/bindings.js +90 -0
  1444. package/dist/routing/resolve-route.js +140 -0
  1445. package/dist/routing/session-key.js +169 -0
  1446. package/dist/runtime.js +15 -0
  1447. package/dist/security/audit-extra.js +783 -0
  1448. package/dist/security/audit-fs.js +55 -0
  1449. package/dist/security/audit.js +726 -0
  1450. package/dist/security/fix.js +317 -0
  1451. package/dist/sessions/level-overrides.js +24 -0
  1452. package/dist/sessions/model-overrides.js +57 -0
  1453. package/dist/sessions/send-policy.js +69 -0
  1454. package/dist/sessions/session-key-utils.js +51 -0
  1455. package/dist/sessions/session-label.js +16 -0
  1456. package/dist/sessions/transcript-events.js +16 -0
  1457. package/dist/shared/text/reasoning-tags.js +48 -0
  1458. package/dist/signal/accounts.js +59 -0
  1459. package/dist/signal/client.js +141 -0
  1460. package/dist/signal/daemon.js +69 -0
  1461. package/dist/signal/format.js +165 -0
  1462. package/dist/signal/identity.js +95 -0
  1463. package/dist/signal/index.js +5 -0
  1464. package/dist/signal/monitor/event-handler.js +492 -0
  1465. package/dist/signal/monitor/event-handler.types.js +1 -0
  1466. package/dist/signal/monitor.js +269 -0
  1467. package/dist/signal/probe.js +46 -0
  1468. package/dist/signal/reaction-level.js +53 -0
  1469. package/dist/signal/send-reactions.js +155 -0
  1470. package/dist/signal/send.js +192 -0
  1471. package/dist/signal/sse-reconnect.js +56 -0
  1472. package/dist/slack/accounts.js +84 -0
  1473. package/dist/slack/actions.js +156 -0
  1474. package/dist/slack/channel-migration.js +53 -0
  1475. package/dist/slack/client.js +17 -0
  1476. package/dist/slack/directory-live.js +122 -0
  1477. package/dist/slack/format.js +111 -0
  1478. package/dist/slack/http/index.js +1 -0
  1479. package/dist/slack/http/registry.js +27 -0
  1480. package/dist/slack/index.js +6 -0
  1481. package/dist/slack/monitor/allow-list.js +58 -0
  1482. package/dist/slack/monitor/auth.js +17 -0
  1483. package/dist/slack/monitor/channel-config.js +79 -0
  1484. package/dist/slack/monitor/commands.js +17 -0
  1485. package/dist/slack/monitor/context.js +242 -0
  1486. package/dist/slack/monitor/events/channels.js +116 -0
  1487. package/dist/slack/monitor/events/members.js +74 -0
  1488. package/dist/slack/monitor/events/messages.js +111 -0
  1489. package/dist/slack/monitor/events/pins.js +76 -0
  1490. package/dist/slack/monitor/events/reactions.js +54 -0
  1491. package/dist/slack/monitor/events.js +15 -0
  1492. package/dist/slack/monitor/media.js +65 -0
  1493. package/dist/slack/monitor/message-handler/dispatch.js +170 -0
  1494. package/dist/slack/monitor/message-handler/prepare.js +477 -0
  1495. package/dist/slack/monitor/message-handler/types.js +1 -0
  1496. package/dist/slack/monitor/message-handler.js +87 -0
  1497. package/dist/slack/monitor/policy.js +10 -0
  1498. package/dist/slack/monitor/provider.js +324 -0
  1499. package/dist/slack/monitor/replies.js +107 -0
  1500. package/dist/slack/monitor/slash.js +504 -0
  1501. package/dist/slack/monitor/thread-resolution.js +102 -0
  1502. package/dist/slack/monitor/types.js +1 -0
  1503. package/dist/slack/monitor.js +4 -0
  1504. package/dist/slack/monitor.test-helpers.js +119 -0
  1505. package/dist/slack/probe.js +47 -0
  1506. package/dist/slack/resolve-channels.js +88 -0
  1507. package/dist/slack/resolve-users.js +133 -0
  1508. package/dist/slack/scopes.js +87 -0
  1509. package/dist/slack/send.js +132 -0
  1510. package/dist/slack/targets.js +48 -0
  1511. package/dist/slack/threading-tool-context.js +18 -0
  1512. package/dist/slack/threading.js +26 -0
  1513. package/dist/slack/token.js +10 -0
  1514. package/dist/slack/types.js +1 -0
  1515. package/dist/telegram/accounts.js +98 -0
  1516. package/dist/telegram/allowed-updates.js +8 -0
  1517. package/dist/telegram/audit.js +116 -0
  1518. package/dist/telegram/bot/delivery.js +294 -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 +286 -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 +34 -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 +58 -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 +1159 -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 +439 -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 +156 -0
  1597. package/dist/web/active-listener.js +49 -0
  1598. package/dist/web/auth-store.js +168 -0
  1599. package/dist/web/auto-reply/cloud-monitor.js +259 -0
  1600. package/dist/web/auto-reply/constants.js +1 -0
  1601. package/dist/web/auto-reply/deliver-reply.js +140 -0
  1602. package/dist/web/auto-reply/heartbeat-runner.js +264 -0
  1603. package/dist/web/auto-reply/loggers.js +5 -0
  1604. package/dist/web/auto-reply/mentions.js +79 -0
  1605. package/dist/web/auto-reply/monitor/ack-reaction.js +47 -0
  1606. package/dist/web/auto-reply/monitor/broadcast.js +64 -0
  1607. package/dist/web/auto-reply/monitor/commands.js +21 -0
  1608. package/dist/web/auto-reply/monitor/echo.js +36 -0
  1609. package/dist/web/auto-reply/monitor/group-activation.js +37 -0
  1610. package/dist/web/auto-reply/monitor/group-gating.js +83 -0
  1611. package/dist/web/auto-reply/monitor/group-members.js +53 -0
  1612. package/dist/web/auto-reply/monitor/last-route.js +38 -0
  1613. package/dist/web/auto-reply/monitor/message-line.js +35 -0
  1614. package/dist/web/auto-reply/monitor/on-message.js +160 -0
  1615. package/dist/web/auto-reply/monitor/peer.js +10 -0
  1616. package/dist/web/auto-reply/monitor/process-message.js +379 -0
  1617. package/dist/web/auto-reply/monitor.js +355 -0
  1618. package/dist/web/auto-reply/session-snapshot.js +40 -0
  1619. package/dist/web/auto-reply/types.js +1 -0
  1620. package/dist/web/auto-reply/util.js +47 -0
  1621. package/dist/web/auto-reply.impl.js +6 -0
  1622. package/dist/web/auto-reply.js +1 -0
  1623. package/dist/web/inbound/access-control.js +154 -0
  1624. package/dist/web/inbound/dedupe.js +13 -0
  1625. package/dist/web/inbound/extract.js +254 -0
  1626. package/dist/web/inbound/media.js +91 -0
  1627. package/dist/web/inbound/monitor.js +369 -0
  1628. package/dist/web/inbound/send-api.js +90 -0
  1629. package/dist/web/inbound/types.js +1 -0
  1630. package/dist/web/inbound.js +3 -0
  1631. package/dist/web/login-qr.js +198 -0
  1632. package/dist/web/login.js +131 -0
  1633. package/dist/web/media.js +221 -0
  1634. package/dist/web/outbound-routing.js +65 -0
  1635. package/dist/web/outbound.js +154 -0
  1636. package/dist/web/providers/baileys/index.js +157 -0
  1637. package/dist/web/providers/cloud/client.js +189 -0
  1638. package/dist/web/providers/cloud/index.js +209 -0
  1639. package/dist/web/providers/cloud/media.js +151 -0
  1640. package/dist/web/providers/cloud/receive.js +198 -0
  1641. package/dist/web/providers/cloud/send.js +137 -0
  1642. package/dist/web/providers/cloud/webhook-http.js +170 -0
  1643. package/dist/web/providers/cloud/webhook.js +185 -0
  1644. package/dist/web/providers/factory.js +82 -0
  1645. package/dist/web/providers/index.js +9 -0
  1646. package/dist/web/providers/types.js +7 -0
  1647. package/dist/web/qr-image.js +141 -0
  1648. package/dist/web/reconnect.js +36 -0
  1649. package/dist/web/session.js +227 -0
  1650. package/dist/web/vcard.js +63 -0
  1651. package/dist/whatsapp/normalize.js +66 -0
  1652. package/dist/wizard/clack-prompter.js +72 -0
  1653. package/dist/wizard/onboarding.finalize.js +354 -0
  1654. package/dist/wizard/onboarding.gateway-config.js +202 -0
  1655. package/dist/wizard/onboarding.js +361 -0
  1656. package/dist/wizard/onboarding.types.js +1 -0
  1657. package/dist/wizard/prompts.js +6 -0
  1658. package/dist/wizard/session.js +201 -0
  1659. package/extensions/bluebubbles/index.ts +20 -0
  1660. package/extensions/bluebubbles/package.json +33 -0
  1661. package/extensions/bluebubbles/src/accounts.ts +80 -0
  1662. package/extensions/bluebubbles/src/actions.test.ts +651 -0
  1663. package/extensions/bluebubbles/src/actions.ts +403 -0
  1664. package/extensions/bluebubbles/src/attachments.test.ts +346 -0
  1665. package/extensions/bluebubbles/src/attachments.ts +282 -0
  1666. package/extensions/bluebubbles/src/channel.ts +399 -0
  1667. package/extensions/bluebubbles/src/chat.test.ts +462 -0
  1668. package/extensions/bluebubbles/src/chat.ts +354 -0
  1669. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  1670. package/extensions/bluebubbles/src/media-send.ts +168 -0
  1671. package/extensions/bluebubbles/src/monitor.test.ts +2140 -0
  1672. package/extensions/bluebubbles/src/monitor.ts +2101 -0
  1673. package/extensions/bluebubbles/src/onboarding.ts +340 -0
  1674. package/extensions/bluebubbles/src/probe.ts +127 -0
  1675. package/extensions/bluebubbles/src/reactions.test.ts +393 -0
  1676. package/extensions/bluebubbles/src/reactions.ts +183 -0
  1677. package/extensions/bluebubbles/src/runtime.ts +14 -0
  1678. package/extensions/bluebubbles/src/send.test.ts +809 -0
  1679. package/extensions/bluebubbles/src/send.ts +418 -0
  1680. package/extensions/bluebubbles/src/targets.test.ts +184 -0
  1681. package/extensions/bluebubbles/src/targets.ts +323 -0
  1682. package/extensions/bluebubbles/src/types.ts +127 -0
  1683. package/extensions/bluebubbles/taskmaster.plugin.json +11 -0
  1684. package/extensions/copilot-proxy/README.md +24 -0
  1685. package/extensions/copilot-proxy/index.ts +142 -0
  1686. package/extensions/copilot-proxy/package.json +11 -0
  1687. package/extensions/copilot-proxy/taskmaster.plugin.json +11 -0
  1688. package/extensions/diagnostics-otel/index.ts +16 -0
  1689. package/extensions/diagnostics-otel/node_modules/.bin/acorn +21 -0
  1690. package/extensions/diagnostics-otel/package.json +24 -0
  1691. package/extensions/diagnostics-otel/src/service.test.ts +220 -0
  1692. package/extensions/diagnostics-otel/src/service.ts +566 -0
  1693. package/extensions/diagnostics-otel/taskmaster.plugin.json +8 -0
  1694. package/extensions/discord/index.ts +18 -0
  1695. package/extensions/discord/package.json +11 -0
  1696. package/extensions/discord/src/channel.ts +422 -0
  1697. package/extensions/discord/src/runtime.ts +14 -0
  1698. package/extensions/discord/taskmaster.plugin.json +11 -0
  1699. package/extensions/google-antigravity-auth/README.md +24 -0
  1700. package/extensions/google-antigravity-auth/index.ts +437 -0
  1701. package/extensions/google-antigravity-auth/package.json +11 -0
  1702. package/extensions/google-antigravity-auth/taskmaster.plugin.json +11 -0
  1703. package/extensions/google-gemini-cli-auth/README.md +35 -0
  1704. package/extensions/google-gemini-cli-auth/index.ts +91 -0
  1705. package/extensions/google-gemini-cli-auth/oauth.test.ts +228 -0
  1706. package/extensions/google-gemini-cli-auth/oauth.ts +580 -0
  1707. package/extensions/google-gemini-cli-auth/package.json +11 -0
  1708. package/extensions/google-gemini-cli-auth/taskmaster.plugin.json +11 -0
  1709. package/extensions/googlechat/index.ts +20 -0
  1710. package/extensions/googlechat/node_modules/.bin/taskmaster +21 -0
  1711. package/extensions/googlechat/package.json +39 -0
  1712. package/extensions/googlechat/src/accounts.ts +133 -0
  1713. package/extensions/googlechat/src/actions.ts +162 -0
  1714. package/extensions/googlechat/src/api.test.ts +62 -0
  1715. package/extensions/googlechat/src/api.ts +259 -0
  1716. package/extensions/googlechat/src/auth.ts +113 -0
  1717. package/extensions/googlechat/src/channel.ts +580 -0
  1718. package/extensions/googlechat/src/monitor.test.ts +27 -0
  1719. package/extensions/googlechat/src/monitor.ts +900 -0
  1720. package/extensions/googlechat/src/onboarding.ts +278 -0
  1721. package/extensions/googlechat/src/runtime.ts +14 -0
  1722. package/extensions/googlechat/src/targets.test.ts +35 -0
  1723. package/extensions/googlechat/src/targets.ts +55 -0
  1724. package/extensions/googlechat/src/types.config.ts +3 -0
  1725. package/extensions/googlechat/src/types.ts +73 -0
  1726. package/extensions/googlechat/taskmaster.plugin.json +11 -0
  1727. package/extensions/imessage/index.ts +18 -0
  1728. package/extensions/imessage/package.json +11 -0
  1729. package/extensions/imessage/src/channel.ts +296 -0
  1730. package/extensions/imessage/src/runtime.ts +14 -0
  1731. package/extensions/imessage/taskmaster.plugin.json +11 -0
  1732. package/extensions/line/index.ts +20 -0
  1733. package/extensions/line/node_modules/.bin/taskmaster +21 -0
  1734. package/extensions/line/package.json +29 -0
  1735. package/extensions/line/src/card-command.ts +338 -0
  1736. package/extensions/line/src/channel.logout.test.ts +96 -0
  1737. package/extensions/line/src/channel.sendPayload.test.ts +308 -0
  1738. package/extensions/line/src/channel.ts +773 -0
  1739. package/extensions/line/src/runtime.ts +14 -0
  1740. package/extensions/line/taskmaster.plugin.json +11 -0
  1741. package/extensions/llm-task/README.md +97 -0
  1742. package/extensions/llm-task/index.ts +7 -0
  1743. package/extensions/llm-task/package.json +11 -0
  1744. package/extensions/llm-task/src/llm-task-tool.test.ts +117 -0
  1745. package/extensions/llm-task/src/llm-task-tool.ts +218 -0
  1746. package/extensions/llm-task/taskmaster.plugin.json +21 -0
  1747. package/extensions/lobster/README.md +80 -0
  1748. package/extensions/lobster/SKILL.md +90 -0
  1749. package/extensions/lobster/index.ts +13 -0
  1750. package/extensions/lobster/package.json +11 -0
  1751. package/extensions/lobster/src/lobster-tool.test.ts +123 -0
  1752. package/extensions/lobster/src/lobster-tool.ts +222 -0
  1753. package/extensions/lobster/taskmaster.plugin.json +10 -0
  1754. package/extensions/matrix/CHANGELOG.md +54 -0
  1755. package/extensions/matrix/index.ts +18 -0
  1756. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  1757. package/extensions/matrix/node_modules/.bin/taskmaster +21 -0
  1758. package/extensions/matrix/package.json +36 -0
  1759. package/extensions/matrix/src/actions.ts +185 -0
  1760. package/extensions/matrix/src/channel.directory.test.ts +56 -0
  1761. package/extensions/matrix/src/channel.ts +417 -0
  1762. package/extensions/matrix/src/config-schema.ts +62 -0
  1763. package/extensions/matrix/src/directory-live.ts +175 -0
  1764. package/extensions/matrix/src/group-mentions.ts +61 -0
  1765. package/extensions/matrix/src/matrix/accounts.test.ts +83 -0
  1766. package/extensions/matrix/src/matrix/accounts.ts +63 -0
  1767. package/extensions/matrix/src/matrix/actions/client.ts +53 -0
  1768. package/extensions/matrix/src/matrix/actions/messages.ts +120 -0
  1769. package/extensions/matrix/src/matrix/actions/pins.ts +70 -0
  1770. package/extensions/matrix/src/matrix/actions/reactions.ts +84 -0
  1771. package/extensions/matrix/src/matrix/actions/room.ts +88 -0
  1772. package/extensions/matrix/src/matrix/actions/summary.ts +77 -0
  1773. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  1774. package/extensions/matrix/src/matrix/actions.ts +15 -0
  1775. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  1776. package/extensions/matrix/src/matrix/client/config.ts +165 -0
  1777. package/extensions/matrix/src/matrix/client/create-client.ts +127 -0
  1778. package/extensions/matrix/src/matrix/client/logging.ts +35 -0
  1779. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  1780. package/extensions/matrix/src/matrix/client/shared.ts +169 -0
  1781. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  1782. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  1783. package/extensions/matrix/src/matrix/client.test.ts +57 -0
  1784. package/extensions/matrix/src/matrix/client.ts +9 -0
  1785. package/extensions/matrix/src/matrix/credentials.ts +103 -0
  1786. package/extensions/matrix/src/matrix/deps.ts +57 -0
  1787. package/extensions/matrix/src/matrix/format.test.ts +34 -0
  1788. package/extensions/matrix/src/matrix/format.ts +22 -0
  1789. package/extensions/matrix/src/matrix/index.ts +11 -0
  1790. package/extensions/matrix/src/matrix/monitor/allowlist.ts +58 -0
  1791. package/extensions/matrix/src/matrix/monitor/auto-join.ts +68 -0
  1792. package/extensions/matrix/src/matrix/monitor/direct.ts +105 -0
  1793. package/extensions/matrix/src/matrix/monitor/events.ts +103 -0
  1794. package/extensions/matrix/src/matrix/monitor/handler.ts +645 -0
  1795. package/extensions/matrix/src/matrix/monitor/index.ts +279 -0
  1796. package/extensions/matrix/src/matrix/monitor/location.ts +83 -0
  1797. package/extensions/matrix/src/matrix/monitor/media.test.ts +103 -0
  1798. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  1799. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  1800. package/extensions/matrix/src/matrix/monitor/replies.ts +96 -0
  1801. package/extensions/matrix/src/matrix/monitor/room-info.ts +58 -0
  1802. package/extensions/matrix/src/matrix/monitor/rooms.ts +43 -0
  1803. package/extensions/matrix/src/matrix/monitor/threads.ts +64 -0
  1804. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  1805. package/extensions/matrix/src/matrix/poll-types.test.ts +22 -0
  1806. package/extensions/matrix/src/matrix/poll-types.ts +157 -0
  1807. package/extensions/matrix/src/matrix/probe.ts +70 -0
  1808. package/extensions/matrix/src/matrix/send/client.ts +63 -0
  1809. package/extensions/matrix/src/matrix/send/formatting.ts +92 -0
  1810. package/extensions/matrix/src/matrix/send/media.ts +220 -0
  1811. package/extensions/matrix/src/matrix/send/targets.test.ts +102 -0
  1812. package/extensions/matrix/src/matrix/send/targets.ts +144 -0
  1813. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  1814. package/extensions/matrix/src/matrix/send.test.ts +172 -0
  1815. package/extensions/matrix/src/matrix/send.ts +255 -0
  1816. package/extensions/matrix/src/onboarding.ts +432 -0
  1817. package/extensions/matrix/src/outbound.ts +53 -0
  1818. package/extensions/matrix/src/resolve-targets.ts +89 -0
  1819. package/extensions/matrix/src/runtime.ts +14 -0
  1820. package/extensions/matrix/src/tool-actions.ts +160 -0
  1821. package/extensions/matrix/src/types.ts +95 -0
  1822. package/extensions/matrix/taskmaster.plugin.json +11 -0
  1823. package/extensions/mattermost/index.ts +18 -0
  1824. package/extensions/mattermost/package.json +25 -0
  1825. package/extensions/mattermost/src/channel.test.ts +43 -0
  1826. package/extensions/mattermost/src/channel.ts +339 -0
  1827. package/extensions/mattermost/src/config-schema.ts +56 -0
  1828. package/extensions/mattermost/src/group-mentions.ts +14 -0
  1829. package/extensions/mattermost/src/mattermost/accounts.ts +115 -0
  1830. package/extensions/mattermost/src/mattermost/client.ts +208 -0
  1831. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  1832. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +150 -0
  1833. package/extensions/mattermost/src/mattermost/monitor.ts +921 -0
  1834. package/extensions/mattermost/src/mattermost/probe.ts +70 -0
  1835. package/extensions/mattermost/src/mattermost/send.ts +217 -0
  1836. package/extensions/mattermost/src/normalize.ts +38 -0
  1837. package/extensions/mattermost/src/onboarding-helpers.ts +42 -0
  1838. package/extensions/mattermost/src/onboarding.ts +187 -0
  1839. package/extensions/mattermost/src/runtime.ts +14 -0
  1840. package/extensions/mattermost/src/types.ts +50 -0
  1841. package/extensions/mattermost/taskmaster.plugin.json +11 -0
  1842. package/extensions/memory-lancedb/config.ts +114 -0
  1843. package/extensions/memory-lancedb/index.test.ts +291 -0
  1844. package/extensions/memory-lancedb/index.ts +590 -0
  1845. package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +21 -0
  1846. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  1847. package/extensions/memory-lancedb/package.json +16 -0
  1848. package/extensions/memory-lancedb/taskmaster.plugin.json +67 -0
  1849. package/extensions/msteams/CHANGELOG.md +51 -0
  1850. package/extensions/msteams/index.ts +18 -0
  1851. package/extensions/msteams/node_modules/.bin/taskmaster +21 -0
  1852. package/extensions/msteams/package.json +36 -0
  1853. package/extensions/msteams/src/attachments/download.ts +206 -0
  1854. package/extensions/msteams/src/attachments/graph.ts +319 -0
  1855. package/extensions/msteams/src/attachments/html.ts +76 -0
  1856. package/extensions/msteams/src/attachments/payload.ts +22 -0
  1857. package/extensions/msteams/src/attachments/shared.ts +235 -0
  1858. package/extensions/msteams/src/attachments/types.ts +37 -0
  1859. package/extensions/msteams/src/attachments.test.ts +424 -0
  1860. package/extensions/msteams/src/attachments.ts +18 -0
  1861. package/extensions/msteams/src/channel.directory.test.ts +46 -0
  1862. package/extensions/msteams/src/channel.ts +436 -0
  1863. package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
  1864. package/extensions/msteams/src/conversation-store-fs.ts +155 -0
  1865. package/extensions/msteams/src/conversation-store-memory.ts +45 -0
  1866. package/extensions/msteams/src/conversation-store.ts +41 -0
  1867. package/extensions/msteams/src/directory-live.ts +179 -0
  1868. package/extensions/msteams/src/errors.test.ts +46 -0
  1869. package/extensions/msteams/src/errors.ts +158 -0
  1870. package/extensions/msteams/src/file-consent-helpers.test.ts +234 -0
  1871. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  1872. package/extensions/msteams/src/file-consent.ts +122 -0
  1873. package/extensions/msteams/src/graph-chat.ts +52 -0
  1874. package/extensions/msteams/src/graph-upload.ts +445 -0
  1875. package/extensions/msteams/src/inbound.test.ts +67 -0
  1876. package/extensions/msteams/src/inbound.ts +38 -0
  1877. package/extensions/msteams/src/index.ts +4 -0
  1878. package/extensions/msteams/src/media-helpers.test.ts +186 -0
  1879. package/extensions/msteams/src/media-helpers.ts +77 -0
  1880. package/extensions/msteams/src/messenger.test.ts +245 -0
  1881. package/extensions/msteams/src/messenger.ts +460 -0
  1882. package/extensions/msteams/src/monitor-handler/inbound-media.ts +123 -0
  1883. package/extensions/msteams/src/monitor-handler/message-handler.ts +629 -0
  1884. package/extensions/msteams/src/monitor-handler.ts +166 -0
  1885. package/extensions/msteams/src/monitor-types.ts +5 -0
  1886. package/extensions/msteams/src/monitor.ts +290 -0
  1887. package/extensions/msteams/src/onboarding.ts +432 -0
  1888. package/extensions/msteams/src/outbound.ts +47 -0
  1889. package/extensions/msteams/src/pending-uploads.ts +87 -0
  1890. package/extensions/msteams/src/policy.test.ts +210 -0
  1891. package/extensions/msteams/src/policy.ts +202 -0
  1892. package/extensions/msteams/src/polls-store-memory.ts +30 -0
  1893. package/extensions/msteams/src/polls-store.test.ts +40 -0
  1894. package/extensions/msteams/src/polls.test.ts +72 -0
  1895. package/extensions/msteams/src/polls.ts +299 -0
  1896. package/extensions/msteams/src/probe.test.ts +57 -0
  1897. package/extensions/msteams/src/probe.ts +99 -0
  1898. package/extensions/msteams/src/reply-dispatcher.ts +128 -0
  1899. package/extensions/msteams/src/resolve-allowlist.ts +277 -0
  1900. package/extensions/msteams/src/runtime.ts +14 -0
  1901. package/extensions/msteams/src/sdk-types.ts +19 -0
  1902. package/extensions/msteams/src/sdk.ts +33 -0
  1903. package/extensions/msteams/src/send-context.ts +156 -0
  1904. package/extensions/msteams/src/send.ts +489 -0
  1905. package/extensions/msteams/src/sent-message-cache.test.ts +16 -0
  1906. package/extensions/msteams/src/sent-message-cache.ts +41 -0
  1907. package/extensions/msteams/src/storage.ts +22 -0
  1908. package/extensions/msteams/src/store-fs.ts +80 -0
  1909. package/extensions/msteams/src/token.ts +19 -0
  1910. package/extensions/msteams/taskmaster.plugin.json +11 -0
  1911. package/extensions/nextcloud-talk/index.ts +18 -0
  1912. package/extensions/nextcloud-talk/package.json +30 -0
  1913. package/extensions/nextcloud-talk/src/accounts.ts +154 -0
  1914. package/extensions/nextcloud-talk/src/channel.ts +404 -0
  1915. package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
  1916. package/extensions/nextcloud-talk/src/format.ts +79 -0
  1917. package/extensions/nextcloud-talk/src/inbound.ts +336 -0
  1918. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  1919. package/extensions/nextcloud-talk/src/normalize.ts +31 -0
  1920. package/extensions/nextcloud-talk/src/onboarding.ts +341 -0
  1921. package/extensions/nextcloud-talk/src/policy.ts +175 -0
  1922. package/extensions/nextcloud-talk/src/room-info.ts +111 -0
  1923. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  1924. package/extensions/nextcloud-talk/src/send.ts +206 -0
  1925. package/extensions/nextcloud-talk/src/signature.ts +67 -0
  1926. package/extensions/nextcloud-talk/src/types.ts +179 -0
  1927. package/extensions/nextcloud-talk/taskmaster.plugin.json +11 -0
  1928. package/extensions/nostr/CHANGELOG.md +46 -0
  1929. package/extensions/nostr/README.md +136 -0
  1930. package/extensions/nostr/index.ts +69 -0
  1931. package/extensions/nostr/node_modules/.bin/taskmaster +21 -0
  1932. package/extensions/nostr/node_modules/.bin/tsc +21 -0
  1933. package/extensions/nostr/node_modules/.bin/tsserver +21 -0
  1934. package/extensions/nostr/package.json +31 -0
  1935. package/extensions/nostr/src/channel.test.ts +141 -0
  1936. package/extensions/nostr/src/channel.ts +342 -0
  1937. package/extensions/nostr/src/config-schema.ts +90 -0
  1938. package/extensions/nostr/src/metrics.ts +464 -0
  1939. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +544 -0
  1940. package/extensions/nostr/src/nostr-bus.integration.test.ts +452 -0
  1941. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  1942. package/extensions/nostr/src/nostr-bus.ts +741 -0
  1943. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  1944. package/extensions/nostr/src/nostr-profile-http.ts +500 -0
  1945. package/extensions/nostr/src/nostr-profile-import.test.ts +120 -0
  1946. package/extensions/nostr/src/nostr-profile-import.ts +259 -0
  1947. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +479 -0
  1948. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  1949. package/extensions/nostr/src/nostr-profile.ts +242 -0
  1950. package/extensions/nostr/src/nostr-state-store.test.ts +128 -0
  1951. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  1952. package/extensions/nostr/src/runtime.ts +14 -0
  1953. package/extensions/nostr/src/seen-tracker.ts +271 -0
  1954. package/extensions/nostr/src/types.test.ts +161 -0
  1955. package/extensions/nostr/src/types.ts +99 -0
  1956. package/extensions/nostr/taskmaster.plugin.json +11 -0
  1957. package/extensions/nostr/test/setup.ts +5 -0
  1958. package/extensions/open-prose/README.md +25 -0
  1959. package/extensions/open-prose/index.ts +5 -0
  1960. package/extensions/open-prose/package.json +11 -0
  1961. package/extensions/open-prose/skills/prose/LICENSE +21 -0
  1962. package/extensions/open-prose/skills/prose/SKILL.md +318 -0
  1963. package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
  1964. package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
  1965. package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
  1966. package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
  1967. package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
  1968. package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
  1969. package/extensions/open-prose/skills/prose/compiler.md +2967 -0
  1970. package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
  1971. package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
  1972. package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
  1973. package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
  1974. package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
  1975. package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
  1976. package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
  1977. package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
  1978. package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
  1979. package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
  1980. package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
  1981. package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
  1982. package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
  1983. package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
  1984. package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
  1985. package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
  1986. package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
  1987. package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
  1988. package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
  1989. package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
  1990. package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
  1991. package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
  1992. package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
  1993. package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
  1994. package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
  1995. package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
  1996. package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
  1997. package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
  1998. package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
  1999. package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
  2000. package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
  2001. package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
  2002. package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
  2003. package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
  2004. package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
  2005. package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
  2006. package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
  2007. package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
  2008. package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
  2009. package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
  2010. package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
  2011. package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
  2012. package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
  2013. package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
  2014. package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
  2015. package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
  2016. package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
  2017. package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
  2018. package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
  2019. package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
  2020. package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
  2021. package/extensions/open-prose/skills/prose/examples/README.md +391 -0
  2022. package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
  2023. package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
  2024. package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
  2025. package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
  2026. package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
  2027. package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
  2028. package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
  2029. package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
  2030. package/extensions/open-prose/skills/prose/help.md +143 -0
  2031. package/extensions/open-prose/skills/prose/lib/README.md +105 -0
  2032. package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
  2033. package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
  2034. package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
  2035. package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
  2036. package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
  2037. package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
  2038. package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
  2039. package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
  2040. package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
  2041. package/extensions/open-prose/skills/prose/primitives/session.md +587 -0
  2042. package/extensions/open-prose/skills/prose/prose.md +1235 -0
  2043. package/extensions/open-prose/skills/prose/state/filesystem.md +478 -0
  2044. package/extensions/open-prose/skills/prose/state/in-context.md +380 -0
  2045. package/extensions/open-prose/skills/prose/state/postgres.md +875 -0
  2046. package/extensions/open-prose/skills/prose/state/sqlite.md +572 -0
  2047. package/extensions/open-prose/taskmaster.plugin.json +11 -0
  2048. package/extensions/qwen-portal-auth/README.md +24 -0
  2049. package/extensions/qwen-portal-auth/index.ts +127 -0
  2050. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  2051. package/extensions/qwen-portal-auth/taskmaster.plugin.json +11 -0
  2052. package/extensions/signal/index.ts +18 -0
  2053. package/extensions/signal/package.json +11 -0
  2054. package/extensions/signal/src/channel.ts +312 -0
  2055. package/extensions/signal/src/runtime.ts +14 -0
  2056. package/extensions/signal/taskmaster.plugin.json +11 -0
  2057. package/extensions/slack/index.ts +18 -0
  2058. package/extensions/slack/package.json +11 -0
  2059. package/extensions/slack/src/channel.ts +577 -0
  2060. package/extensions/slack/src/runtime.ts +14 -0
  2061. package/extensions/slack/taskmaster.plugin.json +11 -0
  2062. package/extensions/telegram/index.ts +18 -0
  2063. package/extensions/telegram/package.json +11 -0
  2064. package/extensions/telegram/src/channel.ts +478 -0
  2065. package/extensions/telegram/src/runtime.ts +14 -0
  2066. package/extensions/telegram/taskmaster.plugin.json +11 -0
  2067. package/extensions/tlon/README.md +5 -0
  2068. package/extensions/tlon/index.ts +18 -0
  2069. package/extensions/tlon/package.json +30 -0
  2070. package/extensions/tlon/src/channel.ts +379 -0
  2071. package/extensions/tlon/src/config-schema.test.ts +32 -0
  2072. package/extensions/tlon/src/config-schema.ts +43 -0
  2073. package/extensions/tlon/src/monitor/discovery.ts +71 -0
  2074. package/extensions/tlon/src/monitor/history.ts +87 -0
  2075. package/extensions/tlon/src/monitor/index.ts +501 -0
  2076. package/extensions/tlon/src/monitor/processed-messages.test.ts +24 -0
  2077. package/extensions/tlon/src/monitor/processed-messages.ts +38 -0
  2078. package/extensions/tlon/src/monitor/utils.ts +83 -0
  2079. package/extensions/tlon/src/onboarding.ts +213 -0
  2080. package/extensions/tlon/src/runtime.ts +14 -0
  2081. package/extensions/tlon/src/targets.ts +79 -0
  2082. package/extensions/tlon/src/types.ts +85 -0
  2083. package/extensions/tlon/src/urbit/auth.ts +18 -0
  2084. package/extensions/tlon/src/urbit/http-api.ts +36 -0
  2085. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  2086. package/extensions/tlon/src/urbit/send.ts +127 -0
  2087. package/extensions/tlon/src/urbit/sse-client.test.ts +41 -0
  2088. package/extensions/tlon/src/urbit/sse-client.ts +367 -0
  2089. package/extensions/tlon/taskmaster.plugin.json +11 -0
  2090. package/extensions/voice-call/CHANGELOG.md +72 -0
  2091. package/extensions/voice-call/README.md +134 -0
  2092. package/extensions/voice-call/index.ts +495 -0
  2093. package/extensions/voice-call/package.json +16 -0
  2094. package/extensions/voice-call/src/cli.ts +300 -0
  2095. package/extensions/voice-call/src/config.ts +445 -0
  2096. package/extensions/voice-call/src/core-bridge.ts +196 -0
  2097. package/extensions/voice-call/src/manager/context.ts +21 -0
  2098. package/extensions/voice-call/src/manager/events.ts +177 -0
  2099. package/extensions/voice-call/src/manager/lookup.ts +33 -0
  2100. package/extensions/voice-call/src/manager/outbound.ts +248 -0
  2101. package/extensions/voice-call/src/manager/state.ts +50 -0
  2102. package/extensions/voice-call/src/manager/store.ts +88 -0
  2103. package/extensions/voice-call/src/manager/timers.ts +86 -0
  2104. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  2105. package/extensions/voice-call/src/manager.test.ts +108 -0
  2106. package/extensions/voice-call/src/manager.ts +876 -0
  2107. package/extensions/voice-call/src/media-stream.test.ts +97 -0
  2108. package/extensions/voice-call/src/media-stream.ts +393 -0
  2109. package/extensions/voice-call/src/providers/base.ts +67 -0
  2110. package/extensions/voice-call/src/providers/index.ts +10 -0
  2111. package/extensions/voice-call/src/providers/mock.ts +168 -0
  2112. package/extensions/voice-call/src/providers/plivo.test.ts +28 -0
  2113. package/extensions/voice-call/src/providers/plivo.ts +504 -0
  2114. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  2115. package/extensions/voice-call/src/providers/telnyx.ts +364 -0
  2116. package/extensions/voice-call/src/providers/tts-openai.ts +264 -0
  2117. package/extensions/voice-call/src/providers/twilio/api.ts +45 -0
  2118. package/extensions/voice-call/src/providers/twilio/webhook.ts +29 -0
  2119. package/extensions/voice-call/src/providers/twilio.test.ts +64 -0
  2120. package/extensions/voice-call/src/providers/twilio.ts +595 -0
  2121. package/extensions/voice-call/src/response-generator.ts +171 -0
  2122. package/extensions/voice-call/src/runtime.ts +206 -0
  2123. package/extensions/voice-call/src/telephony-audio.ts +88 -0
  2124. package/extensions/voice-call/src/telephony-tts.ts +95 -0
  2125. package/extensions/voice-call/src/tunnel.ts +331 -0
  2126. package/extensions/voice-call/src/types.ts +272 -0
  2127. package/extensions/voice-call/src/utils.ts +12 -0
  2128. package/extensions/voice-call/src/voice-mapping.ts +65 -0
  2129. package/extensions/voice-call/src/webhook-security.test.ts +208 -0
  2130. package/extensions/voice-call/src/webhook-security.ts +458 -0
  2131. package/extensions/voice-call/src/webhook.ts +490 -0
  2132. package/extensions/voice-call/taskmaster.plugin.json +601 -0
  2133. package/extensions/whatsapp/index.ts +18 -0
  2134. package/extensions/whatsapp/package.json +11 -0
  2135. package/extensions/whatsapp/src/channel.ts +624 -0
  2136. package/extensions/whatsapp/src/runtime.ts +14 -0
  2137. package/extensions/whatsapp/taskmaster.plugin.json +11 -0
  2138. package/extensions/zalo/CHANGELOG.md +55 -0
  2139. package/extensions/zalo/README.md +50 -0
  2140. package/extensions/zalo/index.ts +20 -0
  2141. package/extensions/zalo/node_modules/.bin/taskmaster +21 -0
  2142. package/extensions/zalo/package.json +33 -0
  2143. package/extensions/zalo/src/accounts.ts +71 -0
  2144. package/extensions/zalo/src/actions.ts +62 -0
  2145. package/extensions/zalo/src/api.ts +206 -0
  2146. package/extensions/zalo/src/channel.directory.test.ts +35 -0
  2147. package/extensions/zalo/src/channel.ts +394 -0
  2148. package/extensions/zalo/src/config-schema.ts +24 -0
  2149. package/extensions/zalo/src/monitor.ts +760 -0
  2150. package/extensions/zalo/src/monitor.webhook.test.ts +70 -0
  2151. package/extensions/zalo/src/onboarding.ts +405 -0
  2152. package/extensions/zalo/src/probe.ts +46 -0
  2153. package/extensions/zalo/src/proxy.ts +18 -0
  2154. package/extensions/zalo/src/runtime.ts +14 -0
  2155. package/extensions/zalo/src/send.ts +117 -0
  2156. package/extensions/zalo/src/status-issues.ts +50 -0
  2157. package/extensions/zalo/src/token.ts +55 -0
  2158. package/extensions/zalo/src/types.ts +42 -0
  2159. package/extensions/zalo/taskmaster.plugin.json +11 -0
  2160. package/extensions/zalouser/CHANGELOG.md +33 -0
  2161. package/extensions/zalouser/README.md +221 -0
  2162. package/extensions/zalouser/index.ts +32 -0
  2163. package/extensions/zalouser/node_modules/.bin/taskmaster +21 -0
  2164. package/extensions/zalouser/package.json +33 -0
  2165. package/extensions/zalouser/src/accounts.ts +117 -0
  2166. package/extensions/zalouser/src/channel.test.ts +17 -0
  2167. package/extensions/zalouser/src/channel.ts +641 -0
  2168. package/extensions/zalouser/src/config-schema.ts +27 -0
  2169. package/extensions/zalouser/src/monitor.ts +574 -0
  2170. package/extensions/zalouser/src/onboarding.ts +488 -0
  2171. package/extensions/zalouser/src/probe.ts +28 -0
  2172. package/extensions/zalouser/src/runtime.ts +14 -0
  2173. package/extensions/zalouser/src/send.ts +150 -0
  2174. package/extensions/zalouser/src/status-issues.test.ts +58 -0
  2175. package/extensions/zalouser/src/status-issues.ts +81 -0
  2176. package/extensions/zalouser/src/tool.ts +156 -0
  2177. package/extensions/zalouser/src/types.ts +102 -0
  2178. package/extensions/zalouser/src/zca.ts +208 -0
  2179. package/extensions/zalouser/taskmaster.plugin.json +11 -0
  2180. package/package.json +263 -0
  2181. package/patches/.gitkeep +0 -0
  2182. package/scripts/install.sh +126 -0
  2183. package/scripts/postinstall.js +300 -0
  2184. package/skills/business-assistant/SKILL.md +436 -0
  2185. package/skills/business-assistant/overlays/trades/plumbing.md +161 -0
  2186. package/skills/taskmaster/SKILL.md +170 -0
  2187. package/skills/weather/SKILL.md +49 -0
  2188. package/taskmaster-docs/USER-GUIDE.md +954 -0
  2189. package/templates/beagle/agents/admin/AGENTS.md +130 -0
  2190. package/templates/beagle/agents/admin/IDENTITY.md +11 -0
  2191. package/templates/beagle/agents/admin/SOUL.md +34 -0
  2192. package/templates/beagle/agents/public/AGENTS.md +142 -0
  2193. package/templates/beagle/agents/public/IDENTITY.md +12 -0
  2194. package/templates/beagle/agents/public/SOUL.md +27 -0
  2195. package/templates/beagle/skills/beagle/SKILL.md +127 -0
  2196. package/templates/beagle/skills/beagle/references/booking-schema.md +173 -0
  2197. package/templates/beagle/skills/beagle/references/customer-scripts.md +168 -0
  2198. package/templates/beagle/skills/beagle/references/data-compliance.md +102 -0
  2199. package/templates/beagle/skills/beagle/references/fee-collection.md +111 -0
  2200. package/templates/beagle/skills/beagle/references/provider-scripts.md +78 -0
  2201. package/templates/beagle/skills/beagle/references/reputation.md +109 -0
  2202. package/templates/beagle/skills/beagle/references/validation-tests.md +171 -0
  2203. package/templates/beagle/skills/beagle/references/workflow.md +175 -0
  2204. package/templates/customer/agents/admin/AGENTS.md +173 -0
  2205. package/templates/customer/agents/admin/BOOTSTRAP.md +63 -0
  2206. package/templates/customer/agents/admin/HEARTBEAT.md +9 -0
  2207. package/templates/customer/agents/admin/IDENTITY.md +15 -0
  2208. package/templates/customer/agents/admin/SOUL.md +34 -0
  2209. package/templates/customer/agents/admin/USER.md +13 -0
  2210. package/templates/customer/agents/public/AGENTS.md +179 -0
  2211. package/templates/customer/agents/public/IDENTITY.md +13 -0
  2212. package/templates/customer/agents/public/SOUL.md +34 -0
  2213. package/templates/customer/skills/business-assistant/SKILL.md +80 -0
  2214. package/templates/taskmaster/TOOLS.md +36 -0
  2215. package/templates/taskmaster/agents/admin/AGENTS.md +207 -0
  2216. package/templates/taskmaster/agents/admin/BOOTSTRAP.md +39 -0
  2217. package/templates/taskmaster/agents/admin/HEARTBEAT.md +8 -0
  2218. package/templates/taskmaster/agents/admin/IDENTITY.md +14 -0
  2219. package/templates/taskmaster/agents/admin/SOUL.md +21 -0
  2220. package/templates/taskmaster/agents/admin/TOOLS.md +36 -0
  2221. package/templates/taskmaster/agents/admin/USER.md +18 -0
  2222. package/templates/taskmaster/agents/public/AGENTS.md +137 -0
  2223. package/templates/taskmaster/agents/public/HEARTBEAT.md +4 -0
  2224. package/templates/taskmaster/agents/public/IDENTITY.md +15 -0
  2225. package/templates/taskmaster/agents/public/SOUL.md +59 -0
  2226. package/templates/taskmaster/agents/public/TOOLS.md +36 -0
  2227. package/templates/taskmaster/agents/public/USER.md +17 -0
  2228. package/templates/taskmaster/skills/taskmaster/SKILL.md +96 -0
  2229. package/templates/tradesupport/agents/admin/AGENTS.md +173 -0
  2230. package/templates/tradesupport/agents/admin/BOOTSTRAP.md +64 -0
  2231. package/templates/tradesupport/agents/admin/HEARTBEAT.md +9 -0
  2232. package/templates/tradesupport/agents/admin/IDENTITY.md +13 -0
  2233. package/templates/tradesupport/agents/admin/SOUL.md +36 -0
  2234. package/templates/tradesupport/agents/admin/USER.md +20 -0
  2235. package/templates/tradesupport/agents/public/AGENTS.md +181 -0
  2236. package/templates/tradesupport/agents/public/IDENTITY.md +12 -0
  2237. package/templates/tradesupport/agents/public/SOUL.md +35 -0
  2238. package/templates/tradesupport/skills/business-assistant/SKILL.md +80 -0
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["t","e","s","o","n$3","r","n","i","S","c","h","a","l","p","d","u","f","b","y$2","y","v","_","m","g","$","x","E","A","C","P","V","N","S$1","I","L","z","H","M","R","k","Z","I$2","Z$1","j","B","D","MAX_ASSISTANT_NAME","MAX_ASSISTANT_AVATAR","DEFAULT_ASSISTANT_NAME","coerceIdentityValue","value","maxLength","trimmed","normalizeAssistantIdentity","input","name","avatar","resolveInjectedAssistantIdentity","GLOBAL_KEY","ACCOUNT_PREFIX","defaultGatewayUrl","GLOBAL_DEFAULTS","ACCOUNT_DEFAULTS","loadGlobal","raw","loadAccount","workspace","activeWorkspace","setActiveWorkspace","loadSettings","saveSettings","next","global","account","parseAgentSessionKey","sessionKey","parts","agentId","rest","QUICK_TAG_RE","FINAL_TAG_RE","THINKING_TAG_RE","applyTrim","mode","stripReasoningTagsFromText","text","options","cleaned","result","lastIndex","inThinking","match","idx","isClose","formatMs","ms","formatAgo","diff","sec","min","hr","formatDurationMs","clampText","max","truncateText","toNumber","fallback","stripThinkingTags","ENVELOPE_PREFIX","ENVELOPE_CHANNELS","textCache","thinkingCache","looksLikeEnvelopeHeader","header","label","stripEnvelope","extractText","message","role","content","item","joined","extractTextCached","obj","extractThinking","rawText","extractRawText","extracted","extractThinkingCached","formatReasoningMarkdown","lines","line","HEARTBEAT_PROMPT_PATTERN","HEARTBEAT_RESPONSE_PATTERN","SILENT_REPLY_PATTERN","INTERNAL_PROMPT_PATTERN","isHeartbeatMessage","filterHeartbeatMessages","messages","msg","normalizeMessage","hasToolId","contentRaw","contentItems","hasToolContent","hasToolName","timestamp","id","normalizeRoleForGrouping","lower","isToolResultMessage","uuidFromBytes","bytes","hex","weakRandomBytes","now","generateUUID","cryptoLike","loadChatHistory","state","res","rawMessages","err","dataUrlToBase64","dataUrl","sendChatMessage","attachments","hasAttachments","imageAtts","fileAtts","contentBlocks","fileNames","displayText","att","runId","allAtts","apiAttachments","parsed","error","abortChatRun","handleChatEvent","payload","current","loadSessions","params","activeMinutes","limit","patchSession","key","patch","TOOL_STREAM_LIMIT","TOOL_STREAM_THROTTLE_MS","TOOL_OUTPUT_CHAR_LIMIT","extractToolOutputText","record","entry","part","formatToolOutput","contentText","truncated","buildToolStreamMessage","trimToolStream","host","overflow","removed","syncToolStreamMessages","flushToolStreamSync","scheduleToolStreamSync","force","resetToolStream","COMPACTION_TOAST_DURATION_MS","handleCompactionEvent","data","phase","handleAgentEvent","toolCallId","args","output","scheduleChatScroll","pickScrollTarget","container","overflowY","target","distanceFromBottom","retryDelay","latest","latestDistanceFromBottom","scheduleLogsScroll","handleChatScroll","event","handleLogsScroll","handleSessionLogsScroll","resetChatScroll","exportLogs","blob","url","anchor","stamp","exportSessionLogs","observeTopbar","topbar","update","height","cloneConfigObject","serializeConfigForm","form","setPathValue","path","nextKey","lastKey","loadConfig","applyConfigSnapshot","loadConfigSchema","applyConfigSchema","snapshot","rawFromSnapshot","saveConfig","baseHash","loadCronStatus","loadCronJobs","listParams","buildCronSchedule","amount","unit","expr","buildCronPayload","timeoutSeconds","addCronJob","schedule","accountId","job","toggleCronJob","enabled","runCronJob","loadCronRuns","removeCronJob","jobId","loadChannels","probe","startWhatsAppLogin","waitWhatsAppLogin","logoutWhatsApp","addWhatsAppAccount","configRes","config","channels","whatsapp","accounts","removeWhatsAppAccount","binding","loadDebug","status","health","models","heartbeat","modelPayload","LOG_BUFFER_LIMIT","LEVELS","parseMaybeJsonString","normalizeLevel","lowered","parseLogLine","meta","time","level","contextCandidate","contextObj","subsystem","loadLogs","opts","entries","shouldReset","ed25519_CURVE","Gx","Gy","_a","_d","L2","captureTrace","isBig","isStr","isBytes","abytes","length","title","len","needsLen","prefix","ofLen","got","u8n","u8fr","buf","padh","pad","bytesToHex","_ch","ch","hexToBytes","hl","al","array","ai","hi","n1","n2","cr","subtle","concatBytes","arrs","sum","randomBytes","big","assertRange","modN","invert","num","md","q","callHash","fn","hashes","apoint","Point","B256","X","Y","T","zip215","normed","lastByte","bytesToNumLE","y2","isValid","uvRatio","isXOdd","isLastByteOdd","X2","Y2","Z2","Z4","aX2","left","right","XY","ZT","other","X1","Y1","Z1","X1Z2","X2Z1","Y1Z2","Y2Z1","x1y1","G","F","X3","Y3","T3","Z3","T1","T2","safe","wNAF","scalar","iz","numTo32bLE","pow2","power","pow_2_252_3","b2","b4","b5","b10","b20","b40","b80","b160","b240","b250","RM1","v3","v7","pow","vx2","root1","root2","useRoot1","useRoot2","noRoot","modL_LE","hash","sha512a","sha512s","hash2extK","hashed","head","point","pointBytes","getExtendedPublicKeyAsync","secretKey","getExtendedPublicKey","getPublicKeyAsync","hashFinishA","_sign","rBytes","signAsync","randomSecretKey","seed","utils","W","scalarBits","pwindows","pwindowSize","precompute","points","w","Gpows","ctneg","cnd","comp","pow_2_w","maxNum","mask","shiftBy","wbits","off","offF","offP","isEven","isNeg","STORAGE_KEY","base64UrlEncode","binary","byte","base64UrlDecode","normalized","padded","out","fingerprintPublicKey","publicKey","generateIdentity","privateKey","loadOrCreateDeviceIdentity","derivedId","updated","identity","stored","signDevicePayload","privateKeyBase64Url","sig","normalizeRole","normalizeScopes","scopes","scope","readStore","writeStore","store","loadDeviceAuthToken","storeDeviceAuthToken","existing","clearDeviceAuthToken","loadDevices","loadNodes","resolveExecApprovalsRpc","loadExecApprovals","rpc","applyExecApprovalsSnapshot","loadPresence","setSkillMessage","getErrorMessage","loadSkills","updateSkillEdit","skillKey","updateSkillEnabled","saveSkillApiKey","apiKey","installSkill","installId","TAB_PATHS","PATH_TO_TAB","tab","normalizeBasePath","basePath","base","normalizePath","pathForTab","tabFromPath","pathname","inferBasePathFromPathname","segments","candidate","getSystemTheme","resolveTheme","clamp01","hasReducedMotionPreference","cleanupThemeTransition","root","startThemeTransition","nextTheme","applyTheme","context","currentTheme","documentReference","document_","prefersReducedMotion","xPercent","yPercent","rect","transition","SESSION_LOG_BUFFER_LIMIT","loadSessionLogs","startNodesPolling","stopNodesPolling","startLogsPolling","stopLogsPolling","startSessionLogsPolling","stopSessionLogsPolling","startDebugPolling","stopDebugPolling","applySettings","applyResolvedTheme","setLastActiveSessionKey","applySettingsFromUrl","tokenRaw","passwordRaw","sessionRaw","gatewayUrlRaw","shouldCleanUrl","token","password","session","gatewayUrl","setTab","refreshActiveTab","syncUrlWithTab","setTheme","loadOverview","loadChannelsTab","loadCron","refreshChat","__vitePreload","sessionLogs","inferBasePath","configured","syncThemeWithSettings","resolved","attachThemeListener","detachThemeListener","syncTabWithLocation","replace","setTabFromRoute","onPopState","targetPath","currentPath","isChatBusy","isChatStopCommand","handleAbortChat","enqueueChatMessage","sendChatMessageNow","ok","flushChatQueue","removeQueuedMessage","handleSendChat","messageOverride","previousDraft","attachmentsToSend","refreshChatAvatar","flushChatQueueForEvent","resolveAgentIdForSession","buildAvatarMetaUrl","encoded","avatarUrl","icons","html","DEFAULT_BRAND_NAME","DEFAULT_BRAND_ICON_URL","DEFAULT_ACCENT_COLOR","cached","resolveBrand","hexToRgb","applyBrandAccentColor","color","rgb","lockIcon","burgerListenerBound","ensureBurgerOutsideClickListener","cb","renderPageNav","currentPage","wsProps","link","href","links","selectorEl","renderWorkspaceSelector","nothing","logoutEl","closeBurger","workspaces","selectedWorkspace","onWorkspaceSelect","select","ws","renderBrowserViewer","props","INTERNAL_DRAG_MIME","formatSize","parentDir","filePath","handleDirDrop","dirPath","internalPath","files","mdFiles","renderTreeEntry","depth","isDir","isExpanded","isSelected","indent","child","renderBulkActions","count","renderPreview","fileName","dest","resolveUploadTarget","renderFiles","uploadTarget","renderStatusLight","renderInfoButton","renderInfoModal","rows","addr","mins","expiryText","maskedKey","getSelectedWorkspace","resolveWorkspaceWhatsApp","imsgOwned","resolveIMessageState","row","renderStepIndicator","currentStep","steps","stepOrder","currentIndex","step","stepIndex","isActive","isCompleted","renderLicenseStep","licenseKey","licenseBusy","licenseValid","licenseMessage","licenseDeviceId","onLicenseKeyChange","onLicenseActivate","btn","el","renderAuthStep","authConnected","authBusy","authMessage","authUrl","authCodeInput","authExpiresIn","onStartAuth","onSubmitAuthCode","onAuthCodeChange","onSkipToWhatsApp","accountMap","selected","renderDashboardHeader","businessName","isLoading","handleSave","val","renderGatewayStatusRow","renderClaudeStatusRow","isConnected","renderLicenseStatusRow","renderWhatsAppStatusRow","isLinked","hasAccount","waStatus","waStatusText","isBaileys","isActiveQr","SETUP_CURATED_MODELS","SETUP_DEFAULT_MODEL_KEY","SETUP_THINKING_LEVELS","renderWhatsAppSettingsModal","closeModal","catalog","available","currentModelKey","currentThinkingLevel","selectedWs","ownerWs","thisWsOwns","anotherWsOwns","renderIMessageStatusRow","statusText","renderIMessageActionModal","renderApiKeysSection","providers","total","renderApiKeysModal","storedKeys","providerId","toggleVisibility","visible","handleInput","changed","saveBtn","eyeBtn","renderUpdateRow","statusLight","versionText","isBusy","renderAccountPinRow","hasPin","renderAccountPinModal","busy","oldPin","newPin","confirmPin","pinInputHandler","setter","showValidationError","handleSubmit","renderAddAccountForm","workspaceSaving","renderRemoveAccountSection","renderWhatsAppStep","whatsappBusy","whatsappLoginMessage","whatsappLoginQrDataUrl","whatsappLoginConnected","whatsappChannelStatus","isReallyConnected","renderSetup","connected","stepContent","pageNav","renderPhoneEntry","subtitle","renderAdminsPage","fieldCount","renderFieldEditor","renderRecord","expanded","fields","fieldLabel","renderCustomersPage","handleSearchSubmit","handleAddSubmit","i$1","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","transformCaseFunc","element","lcElement","cleanArray","index","clone","object","newObject","property","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","hook","_sanitizeElements","_isBasicCustomElement","parentNode","childNodes","childCount","childClone","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","tag","entryPoint","hookFunction","purify","me","xe","be","Re","Te","re","se","Oe","Q","we","ye","Pe","Se","ie","$e","U","te","_e","Le","Me","ze","oe","Ae","K","ae","Ce","le","Ie","Ee","Be","ue","qe","ve","pe","De","He","Ze","Ge","Ne","Qe","Fe","je","ce","he","Ue","ne","Ke","We","Xe","ke","J","de","ge","Je","O","ee","fe","marked","allowedTags","allowedAttrs","hooksInstalled","MARKDOWN_CHAR_LIMIT","MARKDOWN_PARSE_LIMIT","MARKDOWN_CACHE_LIMIT","MARKDOWN_CACHE_MAX_CHARS","markdownCache","getCachedMarkdown","setCachedMarkdown","oldest","installHooks","toSanitizedMarkdownHtml","markdown","escapeHtml","sanitized","rendered","COPIED_FOR_MS","ERROR_FOR_MS","COPY_LABEL","COPIED_LABEL","ERROR_LABEL","copyTextToClipboard","setButtonLabel","button","createCopyButton","idleLabel","copied","renderCopyAsMarkdownButton","extractToolCards","normalizeContent","cards","kind","coerceArgs","extractToolText","card","extractImages","images","block","source","mediaType","imageUrl","renderReadingIndicatorGroup","_assistant","renderStreamingGroup","startedAt","onOpenSidebar","renderGroupedMessage","renderMessageGroup","group","normalizedRole","roleClass","renderMessageImages","img","isToolResult","hasToolCards","hasImages","extractedText","extractedThinking","markdownBase","reasoningMarkdown","canCopyMarkdown","bubbleClasses","unsafeHTML","renderMarkdownSidebar","ResizableDivider","LitElement","containerWidth","deltaRatio","newRatio","css","__decorateClass","customElement","assertNonEmptyString","str","assertNumber","number","DB_VERSION_CURRENT","DB_VERSION_INITIAL","STORE_EMOJI","STORE_KEYVALUE","STORE_FAVORITES","FIELD_TOKENS","INDEX_TOKENS","FIELD_UNICODE","INDEX_COUNT","FIELD_GROUP","FIELD_ORDER","INDEX_GROUP_AND_ORDER","KEY_ETAG","KEY_URL","KEY_PREFERRED_SKINTONE","MODE_READONLY","MODE_READWRITE","INDEX_SKIN_UNICODE","FIELD_SKIN_UNICODE","DEFAULT_DATA_SOURCE","DEFAULT_LOCALE","uniqBy","arr","uniqEmoji","emojis","initialMigration","db","createObjectStore","keyPath","indexes","indexName","multiEntry","openIndexedDBRequests","databaseCache","onCloseListeners","handleOpenOrDeleteReq","resolve","reject","req","createDatabase","dbName","closeDatabase","openDatabase","dbPromise","storeName","readOnlyOrReadWrite","txn","listeners","listener","deleteDatabase","addOnCloseListener","irregularEmoticons","extractTokens","word","MIN_SEARCH_TEXT_LENGTH","normalizeTokens","transformEmojiData","emojiData","annotation","emoticon","order","shortcodes","skins","tags","emoji","version","tokens","tone","callStore","method","getIDB","getAllIDB","commit","minBy","minItem","findCommonMembers","arrays","uniqByFunc","shortestArray","results","isEmpty","get","hasData","eTag","oldETag","oldUrl","doFullDatabaseScanForSingleResult","predicate","emojiStore","processNextBatch","loadData","transformedData","metaStore","todo","checkFetched","onFetched","getEmojiByGroup","range","getEmojiBySearchQuery","query","intermediateResults","checkDone","onDone","getEmojiByShortcode","shortcode","getEmojiByUnicode","unicode","incrementFavoriteEmojiCount","getTopFavoriteEmoji","customEmojiIndex","favoritesStore","cursor","addResult","unicodeOrName","custom","CODA_MARKER","trie","itemToTokens","map","currentMap","char","nextMap","valuesAtCoda","exact","queue","entriesSortedByKey","requiredKeys$1","assertCustomEmojis","customEmojis","isArray","firstItemIsFaulty","sortByName","all","searchTrie","searchByExactMatch","searchByPrefix","search","shortcodeToEmoji","nameToEmoji","customEmoji","isFirefoxContentScript","cleanEmoji","warnETag","requiredKeys","assertEmojiData","assertStatus","response","dataSource","getETag","getETagAndData","arrayBufferToBinaryString","buffer","binaryStringToArrayBuffer","jsonChecksum","inString","inBuffer","outBuffer","outBinString","doCheckForUpdates","eTagAndData","loadDataForFirstTime","checkForUpdates","Database","locale","checkReady","customs","natives","skinTone","allGroups","groups","NUM_SKIN_TONES","rIC","hasZwj","versionsAndTestEmoji","TIMEOUT_BEFORE_LOADING_MESSAGE","DEFAULT_SKIN_TONE_EMOJI","DEFAULT_NUM_COLUMNS","MOST_COMMONLY_USED_EMOJI","FONT_FAMILY","DEFAULT_CATEGORY_SORTING","getTextFeature","canvas","ctx","compareFeatures","feature1","feature2","feature1Str","feature2Str","testColorEmojiSupported","determineEmojiSupportLevel","promise","detectEmojiSupportLevel","supportedZwjEmojis","VARIATION_SELECTOR","SKINTONE_MODIFIER","ZWJ","LIGHT_SKIN_TONE","LIGHT_SKIN_TONE_MODIFIER","applySkinTone","zwjIndex","halt","incrementOrDecrement","decrement","summarizeEmojisForUI","emojiSupportLevel","toSimpleSkinsMap","skin","category","rAF","resizeObserverSupported","resizeObserverAction","abortSignal","onUpdate","resizeObserver","calculateTextWidth","baselineEmojiWidth","checkZwjSupport","zwjEmojisToCheck","baselineEmoji","emojiToDomNode","allSupported","shouldWarn","domNode","emojiWidth","supported","uniq","resetScrollTopIfPossible","getFromMap","cache","toString","parseTemplate","htmlString","parseCache","domInstancesCache","unkeyedSymbol","hasReplaceChildren","replaceChildren","newChildren","doChildrenNeedRerender","oldChild","oldChildrenCount","patchChildren","instanceBinding","targetNode","targetParentNode","needsRerender","expressions","instanceBindings","currentExpression","expressionIndex","attributeName","attributeValuePre","attributeValuePost","expression","newValue","newNode","parse","withinTag","withinAttribute","elementIndexCounter","elementsToBindings","elementIndexes","skipTokenChars","elementIndex","bindings","attributePreMatch","attributePostMatch","applyBindings","traverseAndSetupBindings","rootElement","topLevelBindings","treeWalker","parseHtml","dom","createFramework","domInstances","domInstanceCacheKey","domInstancesForTokens","callback","keyFunction","originalCacheKey","render","helpers","events","actions","refs","actionContext","firstRender","labelWithSkin","titleForEmoji","unicodeWithSkin","emojiList","searchMode","rootDom","emojiWithCategory","forElementWithAttribute","eventName","listenerName","ref","action","boundActions","qM","createState","destroyed","currentObserver","propsToObservers","dirtyObservers","queued","flush","observersToRun","observer","observers","createEffect","runnable","oldObserver","arraysAreEqualByFunction","areEqualFunc","intersectionObserverCache","intersectionObserverAction","EMPTY_ARRAY","assign","createRoot","shadowRoot","abortController","focus","fireEvent","detail","compareEmojiArrays","compareCurrentEmojisWithCategories","aCategory","aEmojis","bCategory","bEmojis","updateCurrentEmojis","newEmojis","updateSearchMode","newSearchMode","updateCurrentEmojisWithCategories","newEmojisWithCategories","currentSkinTone","onClickSkinToneButton","onEmojiClick","onNavClick","onNavKeydown","onSearchKeydown","onSkinToneOptionsClick","onSkinToneOptionsFocusOut","onSkinToneOptionsKeydown","onSkinToneOptionsKeyup","onSearchInput","calculateEmojiGridStyle","updateOnIntersection","handleDatabaseLoading","showingLoadingMessage","timeoutHandle","updateCustomEmoji","updatePreferredSkinTone","updateDefaultFavoriteEmojis","database","favs","databaseCustomEmoji","updateFavorites","defaultFavoriteEmojis","numColumns","dbFavorites","favorites","summarizeEmojis","style","newNumColumns","newIsRtl","isIntersecting","updateEmojis","searchText","currentGroup","databaseLoaded","getEmojisBySearchQuery","currentGroupId","getEmojisByGroup","resetScrollTopInRaf","currentEmojis","emojiVersion","checkZwjSupportAndUpdate","isZwjSupported","filterEmojisByVersion","calculateCurrentEmojisWithCategories","categoriesToEmoji","rawSearchText","goToNextOrPrevious","previous","clickEmoji","closestTarget","groupId","doFocus","getDetailForClickEvent","emojiSummary","skinTonedUnicode","promiseForDetail","changeSkinTone","changeActiveSkinTone","nextSkinTone","relatedTarget","newState","enI18n","baseStyles","PROPS","EXTRA_STYLES","PickerElement","rescueElementPrototype","attrName","oldValue","up","definitions","autoGrow","desired","resetGrow","renderCompactionIndicator","MAX_ATTACHMENT_BYTES","generateAttachmentId","showAttachmentError","toast","compose","TEXT_EXTENSIONS","isImageFile","file","isTextFile","isPdfFile","isVideoFile","handleDrop","reader","newAttachment","handleDragOver","handleDragLeave","related","handlePaste","items","mediaItems","chatEl","isVideo","toggleEmojiPicker","popup","isOpen","close","ev","handleEmojiSelect","ta","start","end","before","after","pos","renderAttachmentPreview","renderChat","canCompose","canAbort","reasoningLevel","showReasoning","composePlaceholder","splitRatio","sidebarOpen","thread","repeat","buildChatItems","renderModelBar","CURATED_MODELS","buildModelDisplayList","THINKING_LEVELS","toggleSettingsMenu","menu","thinkingLevel","verboseOn","fillerOn","checked","CHAT_HISTORY_RENDER_LIMIT","groupMessages","history","tools","showToolDetail","historyStart","messageKey","qi","messageId","renderChatPage","formatNextRun","formatCronState","last","formatCronSchedule","formatCronPayload","buildChannelOptions","seen","resolveChannelLabel","channel","agentLabel","iconPlay","iconPause","iconTrash","iconX","iconPlus","renderCron","detailJob","renderStatusBar","renderEventGrid","renderNewEventModal","renderDetailModal","jobCount","nextWake","renderEventCard","channelOptions","renderScheduleFields","renderRun","runStatusClass","renderSkills","skills","filter","filtered","skill","renderSkill","canInstall","missing","reasons","TYPES","TYPE_LABELS","formatTime","date","formatSessionLabel","matchesFilter","needle","truncateContent","renderSessionLogs","type","agent","renderLogs","levelFiltered","exportLabel","sp","renderSystemLogs","TABS","renderTabContent","renderAdvancedPage","renderLoginOverlay","brand","isFirstTime","isChangeMode","changeBusy","selectedAccount","handleAccountChange","accountSelector","acc","handleChangePinSubmit","pinValue","confirmValue","ACCESS_SESSION_KEY","DEFAULT_ACCESS_STATE","getStoredSessionToken","storeSessionToken","clearSessionToken","checkAccessStatus","verifyPin","pin","setMasterPin","setAccountPin","logout","loadApiKeyProviders","client","saveApiKey","provider","removeApiKey","BrowserCanvasRenderer","base64Data","metadata","canvasX","canvasY","scaleX","scaleY","viewportScaleX","viewportScaleY","canvasRenderer","getCanvasRenderer","startScreencast","stopScreencast","sendMouseInput","sendKeyInput","completeHandoff","toggleInputMode","handleScreencastFrame","handleHandoffEvent","handleHandoffResolved","messageTimer","setSuccessMessage","loadFileTree","selectFile","previewFile","toggleSelectFile","remaining","bulkDownloadFiles","paths","successCount","errorMsg","downloadFile","moveFileToDir","targetDir","moveFile","uploadFiles","base64","deleteFile","from","to","toggleDirectory","extractAdminPhones","targetAgentId","peer","buildBindingsWithAdmins","existingBindings","phones","existingMetaMap","existingAccountIdMap","newBindings","resolvedAccountId","matchObj","existingMeta","loadAdmins","adminAgentId","addAdmin","phone","newPhones","updatedBindings","removeAdmin","loadCustomers","addCustomer","normalizedPhone","trimmedName","deleteCustomer","setCustomerField","deleteCustomerField","buildWorkspaceNavProps","buildSetupWorkspaceNavProps","resolveAdminAgentId","getSelectedWorkspaceInfo","resolveWhatsAppAccountId","resolveFilesAgentId","resolveWorkspaceName","AVATAR_DATA_RE","AVATAR_HTTP_RE","resolveAssistantAvatarUrl","list","extractWhatsAppStatus","extractIMessageStatus","running","resolveIMessageOwnerWorkspace","imsgBinding","renderApp","accessState","accountOrPin","whatsappAccounts","imsg","imessageOwnerWorkspace","code","workspacePath","adding","displayName","newPolicy","policyFields","publicAgent","agentsList","modelRef","agents","effectiveLevel","wa","accts","acctCfg","currentPolicy","enabling","groupsPatch","requireMention","groupsField","nonImessageBindings","imessageBindings","loadApiKeys","filesAgentId","startBrowserScreencast","stopBrowserScreencast","coords","renderer","modifiers","waAccountId","wsName","chatDisabledReason","assistantAvatarUrl","chatAvatarUrl","ratio","DEFAULT_LOG_LEVEL_FILTERS","DEFAULT_CRON_FORM","loadAgents","loadWorkspaces","createWorkspace","rpcParams","removeWorkspace","renameWorkspace","GATEWAY_CLIENT_IDS","GATEWAY_CLIENT_NAMES","GATEWAY_CLIENT_MODES","buildDeviceAuthPayload","CONNECT_FAILED_CLOSE_CODE","GatewayBrowserClient","reason","delay","isSecureContext","deviceIdentity","canFallbackToShared","authToken","storedToken","auth","device","signedAtMs","nonce","signature","hello","frame","evt","seq","pending","isRecord","parseExecApprovalRequested","request","command","createdAtMs","expiresAtMs","parseExecApprovalResolved","pruneExecApprovalQueue","addExecApproval","removeExecApproval","loadAssistantIdentity","normalizeSessionKeyForDefaults","defaults","mainSessionKey","mainKey","defaultAgentId","applySessionDefaults","resolvedSessionKey","resolvedSettingsSessionKey","resolvedLastActiveSessionKey","nextSessionKey","nextSettings","shouldUpdateSettings","connectGateway","clientName","applySnapshot","loadModelCatalog","handleGatewayEvent","expected","received","handleGatewayEventUnsafe","fetchApiKeyProviders","handleConnected","handleFirstUpdated","handleDisconnected","handleUpdated","justConnected","justEnteredAuth","forcedByTab","forcedByLoad","createNostrProfileFormState","profile","values","handleWhatsAppStart","handleWhatsAppWait","handleWhatsAppLogout","handleAddWhatsAppAccount","handleRemoveWhatsAppAccount","handleChannelConfigSave","handleChannelConfigReload","parseValidationErrors","details","errors","rawField","field","resolveNostrAccountId","buildNostrProfileUrl","handleNostrProfileEdit","handleNostrProfileCancel","handleNostrProfileFieldChange","handleNostrProfileToggleAdvanced","handleNostrProfileSave","errorMessage","handleNostrProfileImport","merged","nextValues","showAdvanced","checkAuthStatus","startAuth","submitAuthCode","updateAuthCodeInput","skipToWhatsApp","checkLicenseStatus","activateLicense","removeLicense","updateLicenseKey","loadGatewayHealth","restartGateway","runUpdate","injectedAssistantIdentity","resolveOnboardingMode","resolveSetupMode","resolveFilesPageMode","resolveBrowserPageMode","resolveAdminsPageMode","resolveCustomersPageMode","resolveChatPageMode","resolveAdvancedPageMode","TaskmasterApp","onPopStateInternal","connectGatewayInternal","handleChatScrollInternal","handleLogsScrollInternal","handleSessionLogsScrollInternal","exportLogsInternal","exportSessionLogsInternal","resetToolStreamInternal","resetChatScrollInternal","loadAssistantIdentityInternal","applySettingsInternal","setTabInternal","setThemeInternal","loadOverviewInternal","wsInfo","loadCronInternal","handleAbortChatInternal","removeQueuedMessageInternal","handleSendChatInternal","handleWhatsAppStartInternal","handleWhatsAppWaitInternal","handleWhatsAppLogoutInternal","handleAddWhatsAppAccountInternal","handleRemoveWhatsAppAccountInternal","checkAccessStatusInternal","verifyPinInternal","setMasterPinInternal","logoutInternal","verifyResult","checkLicenseStatusInternal","activateLicenseInternal","removeLicenseInternal","updateLicenseKeyInternal","checkAuthStatusInternal","startAuthInternal","submitAuthCodeInternal","updateAuthCodeInputInternal","skipToWhatsAppInternal","loadGatewayHealthInternal","restartGatewayInternal","checkForUpdatesInternal","runUpdateInternal","loadFileTreeInternal","admins","newSessionKey","chat","handleChannelConfigSaveInternal","handleChannelConfigReloadInternal","handleNostrProfileEditInternal","handleNostrProfileCancelInternal","handleNostrProfileFieldChangeInternal","handleNostrProfileSaveInternal","handleNostrProfileImportInternal","handleNostrProfileToggleAdvancedInternal","decision","active","customers","defaultWs"],"ignoreList":[0,1,2,3,4,5,6,25,48,49,50,51,52,53,60,61],"sources":["../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../ui/src/ui/assistant-identity.ts","../../../ui/src/ui/storage.ts","../../../src/sessions/session-key-utils.ts","../../../src/shared/text/reasoning-tags.ts","../../../ui/src/ui/format.ts","../../../ui/src/ui/chat/message-extract.ts","../../../ui/src/ui/chat/message-normalizer.ts","../../../ui/src/ui/uuid.ts","../../../ui/src/ui/controllers/chat.ts","../../../ui/src/ui/controllers/sessions.ts","../../../ui/src/ui/app-tool-stream.ts","../../../ui/src/ui/app-scroll.ts","../../../ui/src/ui/controllers/config/form-utils.ts","../../../ui/src/ui/controllers/config.ts","../../../ui/src/ui/controllers/cron.ts","../../../ui/src/ui/controllers/channels.ts","../../../ui/src/ui/controllers/debug.ts","../../../ui/src/ui/controllers/logs.ts","../../../node_modules/.pnpm/@noble+ed25519@3.0.0/node_modules/@noble/ed25519/index.js","../../../ui/src/ui/device-identity.ts","../../../ui/src/ui/device-auth.ts","../../../ui/src/ui/controllers/devices.ts","../../../ui/src/ui/controllers/nodes.ts","../../../ui/src/ui/controllers/exec-approvals.ts","../../../ui/src/ui/controllers/presence.ts","../../../ui/src/ui/controllers/skills.ts","../../../ui/src/ui/navigation.ts","../../../ui/src/ui/theme.ts","../../../ui/src/ui/theme-transition.ts","../../../ui/src/ui/controllers/session-logs.ts","../../../ui/src/ui/app-polling.ts","../../../ui/src/ui/app-settings.ts","../../../ui/src/ui/app-chat.ts","../../../ui/src/ui/icons.ts","../../../ui/src/ui/brand.ts","../../../ui/src/ui/views/page-nav.ts","../../../ui/src/ui/views/browser-viewer.ts","../../../ui/src/ui/views/files.ts","../../../ui/src/ui/views/setup.ts","../../../ui/src/ui/views/admins.ts","../../../ui/src/ui/views/customers.ts","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directive-helpers.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/repeat.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/directives/unsafe-html.js","../../../node_modules/.pnpm/dompurify@3.3.1/node_modules/dompurify/dist/purify.es.mjs","../../../node_modules/.pnpm/marked@17.0.1/node_modules/marked/lib/marked.esm.js","../../../ui/src/ui/markdown.ts","../../../ui/src/ui/chat/copy-as-markdown.ts","../../../ui/src/ui/chat/tool-cards.ts","../../../ui/src/ui/chat/grouped-render.ts","../../../ui/src/ui/views/markdown-sidebar.ts","../../../ui/src/ui/components/resizable-divider.ts","../../../node_modules/.pnpm/emoji-picker-element@1.29.0/node_modules/emoji-picker-element/database.js","../../../node_modules/.pnpm/emoji-picker-element@1.29.0/node_modules/emoji-picker-element/picker.js","../../../ui/src/ui/views/chat.ts","../../../ui/src/ui/views/chat-page.ts","../../../ui/src/ui/presenter.ts","../../../ui/src/ui/views/cron.ts","../../../ui/src/ui/views/skills.ts","../../../ui/src/ui/views/session-logs.ts","../../../ui/src/ui/views/logs.ts","../../../ui/src/ui/views/advanced.ts","../../../ui/src/ui/views/login.ts","../../../ui/src/ui/controllers/access.ts","../../../ui/src/ui/controllers/apikeys.ts","../../../ui/src/ui/browser-canvas.ts","../../../ui/src/ui/controllers/browser-viewer.ts","../../../ui/src/ui/controllers/files.ts","../../../ui/src/ui/controllers/admins.ts","../../../ui/src/ui/controllers/customers.ts","../../../ui/src/ui/app-render.ts","../../../ui/src/ui/app-defaults.ts","../../../ui/src/ui/controllers/agents.ts","../../../ui/src/ui/controllers/workspaces.ts","../../../src/gateway/protocol/client-info.ts","../../../src/gateway/device-auth.ts","../../../ui/src/ui/gateway.ts","../../../ui/src/ui/controllers/exec-approval.ts","../../../ui/src/ui/controllers/assistant-identity.ts","../../../ui/src/ui/app-gateway.ts","../../../ui/src/ui/app-lifecycle.ts","../../../ui/src/ui/views/channels.nostr-profile-form.ts","../../../ui/src/ui/app-channels.ts","../../../ui/src/ui/controllers/auth.ts","../../../ui/src/ui/controllers/license.ts","../../../ui/src/ui/controllers/gateway.ts","../../../ui/src/ui/controllers/update.ts","../../../ui/src/ui/app.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","const MAX_ASSISTANT_NAME = 50;\nconst MAX_ASSISTANT_AVATAR = 200;\n\nexport const DEFAULT_ASSISTANT_NAME = \"Assistant\";\nexport const DEFAULT_ASSISTANT_AVATAR = \"A\";\n\nexport type AssistantIdentity = {\n agentId?: string | null;\n name: string;\n avatar: string | null;\n};\n\ndeclare global {\n interface Window {\n __TASKMASTER_ASSISTANT_NAME__?: string;\n __TASKMASTER_ASSISTANT_AVATAR__?: string;\n }\n}\n\nfunction coerceIdentityValue(value: string | undefined, maxLength: number): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n if (trimmed.length <= maxLength) return trimmed;\n return trimmed.slice(0, maxLength);\n}\n\nexport function normalizeAssistantIdentity(\n input?: Partial<AssistantIdentity> | null,\n): AssistantIdentity {\n const name =\n coerceIdentityValue(input?.name, MAX_ASSISTANT_NAME) ?? DEFAULT_ASSISTANT_NAME;\n const avatar = coerceIdentityValue(input?.avatar ?? undefined, MAX_ASSISTANT_AVATAR) ?? null;\n const agentId =\n typeof input?.agentId === \"string\" && input.agentId.trim()\n ? input.agentId.trim()\n : null;\n return { agentId, name, avatar };\n}\n\nexport function resolveInjectedAssistantIdentity(): AssistantIdentity {\n if (typeof window === \"undefined\") {\n return normalizeAssistantIdentity({});\n }\n return normalizeAssistantIdentity({\n name: window.__TASKMASTER_ASSISTANT_NAME__,\n avatar: window.__TASKMASTER_ASSISTANT_AVATAR__,\n });\n}\n","const GLOBAL_KEY = \"taskmaster.control.settings.v1\";\nconst ACCOUNT_PREFIX = \"taskmaster.account.settings.\";\n\nimport type { ThemeMode } from \"./theme\";\n\n/** Browser-level settings (shared across all accounts). */\nexport type GlobalSettings = {\n gatewayUrl: string;\n token: string;\n theme: ThemeMode;\n navCollapsed: boolean;\n navGroupsCollapsed: Record<string, boolean>;\n};\n\n/** Per-account settings (scoped to a workspace). */\nexport type AccountSettings = {\n sessionKey: string;\n lastActiveSessionKey: string;\n chatFocusMode: boolean;\n chatShowThinking: boolean;\n splitRatio: number;\n};\n\n/** Combined settings (what the rest of the app sees). */\nexport type UiSettings = GlobalSettings & AccountSettings;\n\nfunction defaultGatewayUrl(): string {\n const proto = location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return `${proto}://${location.host}`;\n}\n\nconst GLOBAL_DEFAULTS: GlobalSettings = {\n gatewayUrl: defaultGatewayUrl(),\n token: \"\",\n theme: \"system\",\n navCollapsed: false,\n navGroupsCollapsed: {},\n};\n\nconst ACCOUNT_DEFAULTS: AccountSettings = {\n sessionKey: \"main\",\n lastActiveSessionKey: \"main\",\n chatFocusMode: false,\n chatShowThinking: false,\n splitRatio: 0.6,\n};\n\nfunction loadGlobal(): GlobalSettings {\n try {\n const raw = localStorage.getItem(GLOBAL_KEY);\n if (!raw) return { ...GLOBAL_DEFAULTS, gatewayUrl: defaultGatewayUrl() };\n const p = JSON.parse(raw) as Partial<GlobalSettings>;\n return {\n gatewayUrl:\n typeof p.gatewayUrl === \"string\" && p.gatewayUrl.trim()\n ? p.gatewayUrl.trim()\n : defaultGatewayUrl(),\n token: typeof p.token === \"string\" ? p.token : GLOBAL_DEFAULTS.token,\n theme:\n p.theme === \"light\" || p.theme === \"dark\" || p.theme === \"system\"\n ? p.theme\n : GLOBAL_DEFAULTS.theme,\n navCollapsed:\n typeof p.navCollapsed === \"boolean\"\n ? p.navCollapsed\n : GLOBAL_DEFAULTS.navCollapsed,\n navGroupsCollapsed:\n typeof p.navGroupsCollapsed === \"object\" && p.navGroupsCollapsed !== null\n ? p.navGroupsCollapsed\n : GLOBAL_DEFAULTS.navGroupsCollapsed,\n };\n } catch {\n return { ...GLOBAL_DEFAULTS, gatewayUrl: defaultGatewayUrl() };\n }\n}\n\nfunction loadAccount(workspace: string | null): AccountSettings {\n if (!workspace) return { ...ACCOUNT_DEFAULTS };\n try {\n const raw = localStorage.getItem(ACCOUNT_PREFIX + workspace);\n if (!raw) return { ...ACCOUNT_DEFAULTS };\n const p = JSON.parse(raw) as Partial<AccountSettings>;\n return {\n sessionKey:\n typeof p.sessionKey === \"string\" && p.sessionKey.trim()\n ? p.sessionKey.trim()\n : ACCOUNT_DEFAULTS.sessionKey,\n lastActiveSessionKey:\n typeof p.lastActiveSessionKey === \"string\" && p.lastActiveSessionKey.trim()\n ? p.lastActiveSessionKey.trim()\n : (typeof p.sessionKey === \"string\" && p.sessionKey.trim()) ||\n ACCOUNT_DEFAULTS.lastActiveSessionKey,\n chatFocusMode:\n typeof p.chatFocusMode === \"boolean\"\n ? p.chatFocusMode\n : ACCOUNT_DEFAULTS.chatFocusMode,\n chatShowThinking:\n typeof p.chatShowThinking === \"boolean\"\n ? p.chatShowThinking\n : ACCOUNT_DEFAULTS.chatShowThinking,\n splitRatio:\n typeof p.splitRatio === \"number\" && p.splitRatio >= 0.4 && p.splitRatio <= 0.7\n ? p.splitRatio\n : ACCOUNT_DEFAULTS.splitRatio,\n };\n } catch {\n return { ...ACCOUNT_DEFAULTS };\n }\n}\n\n/** Current workspace for per-account storage. Set via setActiveWorkspace(). */\nlet activeWorkspace: string | null = null;\n\n/** Update the workspace used for per-account settings. Call on account switch. */\nexport function setActiveWorkspace(workspace: string | null) {\n activeWorkspace = workspace;\n}\n\n/** Load combined settings (global + per-account for active workspace). */\nexport function loadSettings(): UiSettings {\n return { ...loadGlobal(), ...loadAccount(activeWorkspace) };\n}\n\n/** Save combined settings (routes fields to the correct store). */\nexport function saveSettings(next: UiSettings) {\n const global: GlobalSettings = {\n gatewayUrl: next.gatewayUrl,\n token: next.token,\n theme: next.theme,\n navCollapsed: next.navCollapsed,\n navGroupsCollapsed: next.navGroupsCollapsed,\n };\n localStorage.setItem(GLOBAL_KEY, JSON.stringify(global));\n\n if (activeWorkspace) {\n const account: AccountSettings = {\n sessionKey: next.sessionKey,\n lastActiveSessionKey: next.lastActiveSessionKey,\n chatFocusMode: next.chatFocusMode,\n chatShowThinking: next.chatShowThinking,\n splitRatio: next.splitRatio,\n };\n localStorage.setItem(ACCOUNT_PREFIX + activeWorkspace, JSON.stringify(account));\n }\n}\n\n// ---- Migration: move legacy v1 settings into the new split format ----\n(function migrateLegacy() {\n try {\n const raw = localStorage.getItem(GLOBAL_KEY);\n if (!raw) return;\n const p = JSON.parse(raw) as Record<string, unknown>;\n // If the old key has account-level fields, it's legacy format\n if (!(\"sessionKey\" in p)) return;\n // Save global portion under the global key (stripping account fields)\n const global: GlobalSettings = {\n gatewayUrl: typeof p.gatewayUrl === \"string\" ? p.gatewayUrl : defaultGatewayUrl(),\n token: typeof p.token === \"string\" ? p.token : \"\",\n theme: (p.theme === \"light\" || p.theme === \"dark\" || p.theme === \"system\") ? p.theme : \"system\",\n navCollapsed: typeof p.navCollapsed === \"boolean\" ? p.navCollapsed : false,\n navGroupsCollapsed:\n typeof p.navGroupsCollapsed === \"object\" && p.navGroupsCollapsed !== null\n ? (p.navGroupsCollapsed as Record<string, boolean>)\n : {},\n };\n localStorage.setItem(GLOBAL_KEY, JSON.stringify(global));\n // Don't migrate account settings — they'll use fresh defaults per account\n } catch {\n // ignore\n }\n})();\n","export type ParsedAgentSessionKey = {\n agentId: string;\n rest: string;\n};\n\nexport function parseAgentSessionKey(\n sessionKey: string | undefined | null,\n): ParsedAgentSessionKey | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return null;\n const parts = raw.split(\":\").filter(Boolean);\n if (parts.length < 3) return null;\n if (parts[0] !== \"agent\") return null;\n const agentId = parts[1]?.trim();\n const rest = parts.slice(2).join(\":\");\n if (!agentId || !rest) return null;\n return { agentId, rest };\n}\n\nexport function isSubagentSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return false;\n if (raw.toLowerCase().startsWith(\"subagent:\")) return true;\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"subagent:\"));\n}\n\nexport function isAcpSessionKey(sessionKey: string | undefined | null): boolean {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return false;\n const normalized = raw.toLowerCase();\n if (normalized.startsWith(\"acp:\")) return true;\n const parsed = parseAgentSessionKey(raw);\n return Boolean((parsed?.rest ?? \"\").toLowerCase().startsWith(\"acp:\"));\n}\n\nconst THREAD_SESSION_MARKERS = [\":thread:\", \":topic:\"];\n\nexport function resolveThreadParentSessionKey(\n sessionKey: string | undefined | null,\n): string | null {\n const raw = (sessionKey ?? \"\").trim();\n if (!raw) return null;\n const normalized = raw.toLowerCase();\n let idx = -1;\n for (const marker of THREAD_SESSION_MARKERS) {\n const candidate = normalized.lastIndexOf(marker);\n if (candidate > idx) idx = candidate;\n }\n if (idx <= 0) return null;\n const parent = raw.slice(0, idx).trim();\n return parent ? parent : null;\n}\n","export type ReasoningTagMode = \"strict\" | \"preserve\";\nexport type ReasoningTagTrim = \"none\" | \"start\" | \"both\";\n\nconst QUICK_TAG_RE = /<\\s*\\/?\\s*(?:think(?:ing)?|thought|antthinking|final)\\b/i;\nconst FINAL_TAG_RE = /<\\s*\\/?\\s*final\\b[^>]*>/gi;\nconst THINKING_TAG_RE = /<\\s*(\\/?)\\s*(?:think(?:ing)?|thought|antthinking)\\b[^>]*>/gi;\n\nfunction applyTrim(value: string, mode: ReasoningTagTrim): string {\n if (mode === \"none\") return value;\n if (mode === \"start\") return value.trimStart();\n return value.trim();\n}\n\nexport function stripReasoningTagsFromText(\n text: string,\n options?: {\n mode?: ReasoningTagMode;\n trim?: ReasoningTagTrim;\n },\n): string {\n if (!text) return text;\n if (!QUICK_TAG_RE.test(text)) return text;\n\n const mode = options?.mode ?? \"strict\";\n const trimMode = options?.trim ?? \"both\";\n\n let cleaned = text;\n if (FINAL_TAG_RE.test(cleaned)) {\n FINAL_TAG_RE.lastIndex = 0;\n cleaned = cleaned.replace(FINAL_TAG_RE, \"\");\n } else {\n FINAL_TAG_RE.lastIndex = 0;\n }\n\n THINKING_TAG_RE.lastIndex = 0;\n let result = \"\";\n let lastIndex = 0;\n let inThinking = false;\n\n for (const match of cleaned.matchAll(THINKING_TAG_RE)) {\n const idx = match.index ?? 0;\n const isClose = match[1] === \"/\";\n\n if (!inThinking) {\n result += cleaned.slice(lastIndex, idx);\n if (!isClose) {\n inThinking = true;\n }\n } else if (isClose) {\n inThinking = false;\n }\n\n lastIndex = idx + match[0].length;\n }\n\n if (!inThinking || mode === \"preserve\") {\n result += cleaned.slice(lastIndex);\n }\n\n return applyTrim(result, trimMode);\n}\n","import { stripReasoningTagsFromText } from \"../../../src/shared/text/reasoning-tags.js\";\n\nexport function formatMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n return new Date(ms).toLocaleString();\n}\n\nexport function formatAgo(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n const diff = Date.now() - ms;\n if (diff < 0) return \"just now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n return `${day}d ago`;\n}\n\nexport function formatDurationMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n if (ms < 1000) return `${ms}ms`;\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h`;\n const day = Math.round(hr / 24);\n return `${day}d`;\n}\n\nexport function formatList(values?: Array<string | null | undefined>): string {\n if (!values || values.length === 0) return \"none\";\n return values.filter((v): v is string => Boolean(v && v.trim())).join(\", \");\n}\n\nexport function clampText(value: string, max = 120): string {\n if (value.length <= max) return value;\n return `${value.slice(0, Math.max(0, max - 1))}…`;\n}\n\nexport function truncateText(value: string, max: number): {\n text: string;\n truncated: boolean;\n total: number;\n} {\n if (value.length <= max) {\n return { text: value, truncated: false, total: value.length };\n }\n return {\n text: value.slice(0, Math.max(0, max)),\n truncated: true,\n total: value.length,\n };\n}\n\nexport function toNumber(value: string, fallback: number): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function parseList(input: string): string[] {\n return input\n .split(/[,\\n]/)\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n}\n\nexport function stripThinkingTags(value: string): string {\n return stripReasoningTagsFromText(value, { mode: \"preserve\", trim: \"start\" });\n}\n","import { stripThinkingTags } from \"../format\";\n\nconst ENVELOPE_PREFIX = /^\\[([^\\]]+)\\]\\s*/;\nconst ENVELOPE_CHANNELS = [\n \"WebChat\",\n \"WhatsApp\",\n \"Telegram\",\n \"Signal\",\n \"Slack\",\n \"Discord\",\n \"iMessage\",\n \"Teams\",\n \"Matrix\",\n \"Zalo\",\n \"Zalo Personal\",\n \"BlueBubbles\",\n];\n\nconst textCache = new WeakMap<object, string | null>();\nconst thinkingCache = new WeakMap<object, string | null>();\n\nfunction looksLikeEnvelopeHeader(header: string): boolean {\n if (/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}Z\\b/.test(header)) return true;\n if (/\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}\\b/.test(header)) return true;\n return ENVELOPE_CHANNELS.some((label) => header.startsWith(`${label} `));\n}\n\nexport function stripEnvelope(text: string): string {\n const match = text.match(ENVELOPE_PREFIX);\n if (!match) return text;\n const header = match[1] ?? \"\";\n if (!looksLikeEnvelopeHeader(header)) return text;\n return text.slice(match[0].length);\n}\n\nexport function extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"\";\n const content = m.content;\n if (typeof content === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(content) : stripEnvelope(content);\n return processed;\n }\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) {\n const joined = parts.join(\"\\n\");\n const processed = role === \"assistant\" ? stripThinkingTags(joined) : stripEnvelope(joined);\n return processed;\n }\n }\n if (typeof m.text === \"string\") {\n const processed = role === \"assistant\" ? stripThinkingTags(m.text) : stripEnvelope(m.text);\n return processed;\n }\n return null;\n}\n\nexport function extractTextCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractText(message);\n const obj = message as object;\n if (textCache.has(obj)) return textCache.get(obj) ?? null;\n const value = extractText(message);\n textCache.set(obj, value);\n return value;\n}\n\nexport function extractThinking(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const parts: string[] = [];\n if (Array.isArray(content)) {\n for (const p of content) {\n const item = p as Record<string, unknown>;\n if (item.type === \"thinking\" && typeof item.thinking === \"string\") {\n const cleaned = item.thinking.trim();\n if (cleaned) parts.push(cleaned);\n }\n }\n }\n if (parts.length > 0) return parts.join(\"\\n\");\n\n // Back-compat: older logs may still have <think> tags inside text blocks.\n const rawText = extractRawText(message);\n if (!rawText) return null;\n const matches = [\n ...rawText.matchAll(\n /<\\s*think(?:ing)?\\s*>([\\s\\S]*?)<\\s*\\/\\s*think(?:ing)?\\s*>/gi,\n ),\n ];\n const extracted = matches\n .map((m) => (m[1] ?? \"\").trim())\n .filter(Boolean);\n return extracted.length > 0 ? extracted.join(\"\\n\") : null;\n}\n\nexport function extractThinkingCached(message: unknown): string | null {\n if (!message || typeof message !== \"object\") return extractThinking(message);\n const obj = message as object;\n if (thinkingCache.has(obj)) return thinkingCache.get(obj) ?? null;\n const value = extractThinking(message);\n thinkingCache.set(obj, value);\n return value;\n}\n\nexport function extractRawText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n\nexport function formatReasoningMarkdown(text: string): string {\n const trimmed = text.trim();\n if (!trimmed) return \"\";\n const lines = trimmed\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => `_${line}_`);\n return lines.length ? [\"_Reasoning:_\", ...lines].join(\"\\n\") : \"\";\n}\n","/**\n * Message normalization utilities for chat rendering.\n */\n\nimport type {\n NormalizedMessage,\n MessageContentItem,\n} from \"../types/chat-types\";\n\n// Heartbeat detection patterns\nconst HEARTBEAT_PROMPT_PATTERN = /Read HEARTBEAT\\.md if it exists|reply HEARTBEAT_OK/i;\nconst HEARTBEAT_RESPONSE_PATTERN = /^[\\s*`_]*HEARTBEAT_OK[\\s*`_]*$/i;\n\n// Silent reply token — agent outputs this to indicate no reply needed\nconst SILENT_REPLY_PATTERN = /^[\\s*`_]*NO_REPLY[\\s*`_]*$/i;\n\n// Internal system prompt patterns (should never be shown to users)\nconst INTERNAL_PROMPT_PATTERN = /^A new session was started via \\/new or \\/reset\\./;\n\n/**\n * Check if a message is a heartbeat prompt or response.\n * These are internal system messages that shouldn't be shown to users.\n */\nexport function isHeartbeatMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"\";\n\n // Extract text content\n let text = \"\";\n if (typeof m.content === \"string\") {\n text = m.content;\n } else if (Array.isArray(m.content)) {\n text = m.content\n .filter((item: unknown) => typeof item === \"object\" && item !== null)\n .map((item: Record<string, unknown>) => item.text ?? \"\")\n .join(\" \");\n } else if (typeof m.text === \"string\") {\n text = m.text;\n }\n\n const trimmed = text.trim();\n if (!trimmed) return false;\n\n // Check for heartbeat prompt (user role)\n if (role === \"user\" && HEARTBEAT_PROMPT_PATTERN.test(trimmed)) {\n return true;\n }\n\n // Check for heartbeat response (assistant role)\n if (role === \"assistant\" && HEARTBEAT_RESPONSE_PATTERN.test(trimmed)) {\n return true;\n }\n\n // Check for internal system prompts leaked as user messages (e.g. /new greeting)\n if (role === \"user\" && INTERNAL_PROMPT_PATTERN.test(trimmed)) {\n return true;\n }\n\n // Check for silent reply token (assistant NO_REPLY)\n if (role === \"assistant\" && SILENT_REPLY_PATTERN.test(trimmed)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Filter out heartbeat messages from an array of messages.\n */\nexport function filterHeartbeatMessages<T>(messages: T[]): T[] {\n return messages.filter((msg) => !isHeartbeatMessage(msg));\n}\n\n/**\n * Normalize a raw message object into a consistent structure.\n */\nexport function normalizeMessage(message: unknown): NormalizedMessage {\n const m = message as Record<string, unknown>;\n let role = typeof m.role === \"string\" ? m.role : \"unknown\";\n\n // Detect tool messages by common gateway shapes.\n // Some tool events come through as assistant role with tool_* items in the content array.\n const hasToolId =\n typeof m.toolCallId === \"string\" || typeof m.tool_call_id === \"string\";\n\n const contentRaw = m.content;\n const contentItems = Array.isArray(contentRaw) ? contentRaw : null;\n const hasToolContent =\n Array.isArray(contentItems) &&\n contentItems.some((item) => {\n const x = item as Record<string, unknown>;\n const t = String(x.type ?? \"\").toLowerCase();\n return t === \"toolresult\" || t === \"tool_result\";\n });\n\n const hasToolName =\n typeof (m as Record<string, unknown>).toolName === \"string\" ||\n typeof (m as Record<string, unknown>).tool_name === \"string\";\n\n if (hasToolId || hasToolContent || hasToolName) {\n role = \"toolResult\";\n }\n\n // Extract content\n let content: MessageContentItem[] = [];\n\n if (typeof m.content === \"string\") {\n content = [{ type: \"text\", text: m.content }];\n } else if (Array.isArray(m.content)) {\n content = m.content.map((item: Record<string, unknown>) => ({\n type: (item.type as MessageContentItem[\"type\"]) || \"text\",\n text: item.text as string | undefined,\n name: item.name as string | undefined,\n args: item.args || item.arguments,\n }));\n } else if (typeof m.text === \"string\") {\n content = [{ type: \"text\", text: m.text }];\n }\n\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : Date.now();\n const id = typeof m.id === \"string\" ? m.id : undefined;\n\n return { role, content, timestamp, id };\n}\n\n/**\n * Normalize role for grouping purposes.\n */\nexport function normalizeRoleForGrouping(role: string): string {\n const lower = role.toLowerCase();\n // Preserve original casing when it's already a core role.\n if (role === \"user\" || role === \"User\") return role;\n if (role === \"assistant\") return \"assistant\";\n if (role === \"system\") return \"system\";\n // Keep tool-related roles distinct so the UI can style/toggle them.\n if (\n lower === \"toolresult\" ||\n lower === \"tool_result\" ||\n lower === \"tool\" ||\n lower === \"function\"\n ) {\n return \"tool\";\n }\n return role;\n}\n\n/**\n * Check if a message is a tool result message based on its role.\n */\nexport function isToolResultMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role.toLowerCase() : \"\";\n return role === \"toolresult\" || role === \"tool_result\";\n}\n","export type CryptoLike = {\n randomUUID?: (() => string) | undefined;\n getRandomValues?: ((array: Uint8Array) => Uint8Array) | undefined;\n};\n\nfunction uuidFromBytes(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(\n 16,\n 20,\n )}-${hex.slice(20)}`;\n}\n\nfunction weakRandomBytes(): Uint8Array {\n const bytes = new Uint8Array(16);\n const now = Date.now();\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n bytes[0] ^= now & 0xff;\n bytes[1] ^= (now >>> 8) & 0xff;\n bytes[2] ^= (now >>> 16) & 0xff;\n bytes[3] ^= (now >>> 24) & 0xff;\n return bytes;\n}\n\nexport function generateUUID(cryptoLike: CryptoLike | null = globalThis.crypto): string {\n if (cryptoLike && typeof cryptoLike.randomUUID === \"function\") return cryptoLike.randomUUID();\n\n if (cryptoLike && typeof cryptoLike.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoLike.getRandomValues(bytes);\n return uuidFromBytes(bytes);\n }\n\n return uuidFromBytes(weakRandomBytes());\n}\n","import { extractText } from \"../chat/message-extract\";\nimport { filterHeartbeatMessages } from \"../chat/message-normalizer\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport { generateUUID } from \"../uuid\";\nimport type { ChatAttachment } from \"../ui-types\";\n\nexport type ChatState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatThinkingLevel: string | null;\n chatModelProvider: string | null;\n chatModel: string | null;\n chatVerboseLevel: string | null;\n chatFillerEnabled: boolean | null;\n chatSending: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatRunId: string | null;\n chatStream: string | null;\n chatStreamStartedAt: number | null;\n lastError: string | null;\n};\n\nexport type ChatEventPayload = {\n runId: string;\n sessionKey: string;\n state: \"delta\" | \"final\" | \"aborted\" | \"error\" | \"block\";\n message?: unknown;\n errorMessage?: string;\n};\n\nexport async function loadChatHistory(state: ChatState) {\n if (!state.client || !state.connected) return;\n state.chatLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"chat.history\", {\n sessionKey: state.sessionKey,\n limit: 200,\n })) as { messages?: unknown[]; thinkingLevel?: string | null; modelProvider?: string | null; model?: string | null; verboseLevel?: string | null; fillerEnabled?: boolean | null };\n const rawMessages = Array.isArray(res.messages) ? res.messages : [];\n // Filter out heartbeat messages (internal system messages)\n state.chatMessages = filterHeartbeatMessages(rawMessages);\n state.chatThinkingLevel = res.thinkingLevel ?? null;\n state.chatModelProvider = typeof res.modelProvider === \"string\" ? res.modelProvider : null;\n state.chatModel = typeof res.model === \"string\" ? res.model : null;\n state.chatVerboseLevel = typeof res.verboseLevel === \"string\" ? res.verboseLevel : null;\n state.chatFillerEnabled = typeof res.fillerEnabled === \"boolean\" ? res.fillerEnabled : null;\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.chatLoading = false;\n }\n}\n\nfunction dataUrlToBase64(dataUrl: string): { content: string; mimeType: string } | null {\n const match = /^data:([^;]+);base64,(.+)$/.exec(dataUrl);\n if (!match) return null;\n return { mimeType: match[1], content: match[2] };\n}\n\nexport async function sendChatMessage(\n state: ChatState,\n message: string,\n attachments?: ChatAttachment[],\n): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const msg = message.trim();\n const hasAttachments = attachments && attachments.length > 0;\n if (!msg && !hasAttachments) return false;\n\n const now = Date.now();\n\n // Split: images (no fileName) vs file attachments (have fileName)\n const imageAtts = (attachments ?? []).filter((a) => !a.fileName);\n const fileAtts = (attachments ?? []).filter((a) => a.fileName);\n\n // Build user message content blocks for local chat history display\n const contentBlocks: Array<{ type: string; text?: string; source?: unknown }> = [];\n const fileNames = fileAtts.map((f) => f.fileName).filter(Boolean);\n if (fileNames.length > 0) {\n const displayText = msg ? `${fileNames.join(\", \")}\\n\\n${msg}` : fileNames.join(\", \");\n contentBlocks.push({ type: \"text\", text: displayText });\n } else if (msg) {\n contentBlocks.push({ type: \"text\", text: msg });\n }\n for (const att of imageAtts) {\n contentBlocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: att.mimeType, data: att.dataUrl },\n });\n }\n\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"user\",\n content: contentBlocks,\n timestamp: now,\n },\n ];\n\n state.chatSending = true;\n state.lastError = null;\n const runId = generateUUID();\n state.chatRunId = runId;\n state.chatStream = \"\";\n state.chatStreamStartedAt = now;\n\n // Build API attachments: images + all file attachments (text + binary)\n const allAtts = [...imageAtts, ...fileAtts];\n const apiAttachments = allAtts.length > 0\n ? allAtts\n .map((att) => {\n // Text file: base64-encode the text content\n if (att.textContent) {\n return {\n type: \"document\" as const,\n mimeType: att.mimeType || \"text/plain\",\n fileName: att.fileName,\n content: btoa(unescape(encodeURIComponent(att.textContent))),\n };\n }\n // Binary file (images, PDFs): parse data URL\n const parsed = dataUrlToBase64(att.dataUrl);\n if (!parsed) return null;\n return {\n type: att.fileName ? (\"document\" as const) : (\"image\" as const),\n mimeType: parsed.mimeType,\n fileName: att.fileName,\n content: parsed.content,\n };\n })\n .filter((a): a is NonNullable<typeof a> => a !== null)\n : undefined;\n\n try {\n await state.client.request(\"chat.send\", {\n sessionKey: state.sessionKey,\n message: msg,\n deliver: false,\n idempotencyKey: runId,\n attachments: apiAttachments,\n });\n return true;\n } catch (err) {\n const error = String(err);\n state.chatRunId = null;\n state.chatStream = null;\n state.chatStreamStartedAt = null;\n state.lastError = error;\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Error: \" + error }],\n timestamp: Date.now(),\n },\n ];\n return false;\n } finally {\n state.chatSending = false;\n }\n}\n\nexport async function abortChatRun(state: ChatState): Promise<boolean> {\n if (!state.client || !state.connected) return false;\n const runId = state.chatRunId;\n try {\n await state.client.request(\n \"chat.abort\",\n runId\n ? { sessionKey: state.sessionKey, runId }\n : { sessionKey: state.sessionKey },\n );\n return true;\n } catch (err) {\n state.lastError = String(err);\n return false;\n }\n}\n\nexport function handleChatEvent(\n state: ChatState,\n payload?: ChatEventPayload,\n) {\n if (!payload) return null;\n if (payload.sessionKey !== state.sessionKey) return null;\n\n // Final from another run (e.g. sub-agent announce): refresh history to show new message.\n if (\n payload.runId &&\n state.chatRunId &&\n payload.runId !== state.chatRunId\n ) {\n if (payload.state === \"final\") return \"final\";\n return null;\n }\n\n if (payload.state === \"block\") {\n // Filler / block reply — add as an inline assistant message\n const text = extractText(payload.message);\n if (typeof text === \"string\" && text.trim()) {\n state.chatMessages = [\n ...state.chatMessages,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: text.trim() }],\n timestamp: Date.now(),\n filler: true,\n },\n ];\n }\n return \"block\";\n } else if (payload.state === \"delta\") {\n const next = extractText(payload.message);\n if (typeof next === \"string\") {\n // Suppress \"NO_REPLY\" silent token from streaming display\n if (next.trim() === \"NO_REPLY\") return null;\n const current = state.chatStream ?? \"\";\n if (!current || next.length >= current.length) {\n state.chatStream = next;\n }\n }\n } else if (payload.state === \"final\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"aborted\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n } else if (payload.state === \"error\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.chatStreamStartedAt = null;\n state.lastError = payload.errorMessage ?? \"chat error\";\n }\n return payload.state;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { toNumber } from \"../format\";\nimport type { SessionsListResult } from \"../types\";\n\nexport type SessionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive?: string;\n sessionsFilterLimit?: string;\n sessionsIncludeGlobal?: boolean;\n sessionsIncludeUnknown?: boolean;\n};\n\nexport async function loadSessions(state: SessionsState) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n const params: Record<string, unknown> = {\n includeGlobal: state.sessionsIncludeGlobal ?? true,\n includeUnknown: state.sessionsIncludeUnknown ?? false,\n };\n const activeMinutes = toNumber(state.sessionsFilterActive ?? \"\", 0);\n const limit = toNumber(state.sessionsFilterLimit ?? \"\", 0);\n if (activeMinutes > 0) params.activeMinutes = activeMinutes;\n if (limit > 0) params.limit = limit;\n const res = (await state.client.request(\"sessions.list\", params)) as\n | SessionsListResult\n | undefined;\n if (res) state.sessionsResult = res;\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n\nexport async function patchSession(\n state: SessionsState,\n key: string,\n patch: {\n label?: string | null;\n thinkingLevel?: string | null;\n verboseLevel?: string | null;\n reasoningLevel?: string | null;\n model?: string | null;\n fillerEnabled?: boolean | null;\n },\n) {\n if (!state.client || !state.connected) return;\n const params: Record<string, unknown> = { key };\n if (\"label\" in patch) params.label = patch.label;\n if (\"thinkingLevel\" in patch) params.thinkingLevel = patch.thinkingLevel;\n if (\"verboseLevel\" in patch) params.verboseLevel = patch.verboseLevel;\n if (\"reasoningLevel\" in patch) params.reasoningLevel = patch.reasoningLevel;\n if (\"model\" in patch) params.model = patch.model;\n if (\"fillerEnabled\" in patch) params.fillerEnabled = patch.fillerEnabled;\n try {\n await state.client.request(\"sessions.patch\", params);\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n }\n}\n\nexport async function deleteSession(state: SessionsState, key: string) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n const confirmed = window.confirm(\n `Delete session \"${key}\"?\\n\\nDeletes the session entry and archives its transcript.`,\n );\n if (!confirmed) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n await state.client.request(\"sessions.delete\", { key, deleteTranscript: true });\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n","import { truncateText } from \"./format\";\n\nconst TOOL_STREAM_LIMIT = 50;\nconst TOOL_STREAM_THROTTLE_MS = 80;\nconst TOOL_OUTPUT_CHAR_LIMIT = 120_000;\n\nexport type AgentEventPayload = {\n runId: string;\n seq: number;\n stream: string;\n ts: number;\n sessionKey?: string;\n data: Record<string, unknown>;\n};\n\nexport type ToolStreamEntry = {\n toolCallId: string;\n runId: string;\n sessionKey?: string;\n name: string;\n args?: unknown;\n output?: string;\n startedAt: number;\n updatedAt: number;\n message: Record<string, unknown>;\n};\n\ntype ToolStreamHost = {\n sessionKey: string;\n chatRunId: string | null;\n toolStreamById: Map<string, ToolStreamEntry>;\n toolStreamOrder: string[];\n chatToolMessages: Record<string, unknown>[];\n toolStreamSyncTimer: number | null;\n};\n\nfunction extractToolOutputText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n const content = record.content;\n if (!Array.isArray(content)) return null;\n const parts = content\n .map((item) => {\n if (!item || typeof item !== \"object\") return null;\n const entry = item as Record<string, unknown>;\n if (entry.type === \"text\" && typeof entry.text === \"string\") return entry.text;\n return null;\n })\n .filter((part): part is string => Boolean(part));\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n\nfunction formatToolOutput(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const contentText = extractToolOutputText(value);\n let text: string;\n if (typeof value === \"string\") {\n text = value;\n } else if (contentText) {\n text = contentText;\n } else {\n try {\n text = JSON.stringify(value, null, 2);\n } catch {\n text = String(value);\n }\n }\n const truncated = truncateText(text, TOOL_OUTPUT_CHAR_LIMIT);\n if (!truncated.truncated) return truncated.text;\n return `${truncated.text}\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`;\n}\n\nfunction buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n content.push({\n type: \"toolcall\",\n name: entry.name,\n arguments: entry.args ?? {},\n });\n if (entry.output) {\n content.push({\n type: \"toolresult\",\n name: entry.name,\n text: entry.output,\n });\n }\n return {\n role: \"assistant\",\n toolCallId: entry.toolCallId,\n runId: entry.runId,\n content,\n timestamp: entry.startedAt,\n };\n}\n\nfunction trimToolStream(host: ToolStreamHost) {\n if (host.toolStreamOrder.length <= TOOL_STREAM_LIMIT) return;\n const overflow = host.toolStreamOrder.length - TOOL_STREAM_LIMIT;\n const removed = host.toolStreamOrder.splice(0, overflow);\n for (const id of removed) host.toolStreamById.delete(id);\n}\n\nfunction syncToolStreamMessages(host: ToolStreamHost) {\n host.chatToolMessages = host.toolStreamOrder\n .map((id) => host.toolStreamById.get(id)?.message)\n .filter((msg): msg is Record<string, unknown> => Boolean(msg));\n}\n\nexport function flushToolStreamSync(host: ToolStreamHost) {\n if (host.toolStreamSyncTimer != null) {\n clearTimeout(host.toolStreamSyncTimer);\n host.toolStreamSyncTimer = null;\n }\n syncToolStreamMessages(host);\n}\n\nexport function scheduleToolStreamSync(host: ToolStreamHost, force = false) {\n if (force) {\n flushToolStreamSync(host);\n return;\n }\n if (host.toolStreamSyncTimer != null) return;\n host.toolStreamSyncTimer = window.setTimeout(\n () => flushToolStreamSync(host),\n TOOL_STREAM_THROTTLE_MS,\n );\n}\n\nexport function resetToolStream(host: ToolStreamHost) {\n host.toolStreamById.clear();\n host.toolStreamOrder = [];\n host.chatToolMessages = [];\n flushToolStreamSync(host);\n}\n\nexport type CompactionStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\ntype CompactionHost = ToolStreamHost & {\n compactionStatus?: CompactionStatus | null;\n compactionClearTimer?: number | null;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nexport function handleCompactionEvent(host: CompactionHost, payload: AgentEventPayload) {\n const data = payload.data ?? {};\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n\n // Clear any existing timer\n if (host.compactionClearTimer != null) {\n window.clearTimeout(host.compactionClearTimer);\n host.compactionClearTimer = null;\n }\n\n if (phase === \"start\") {\n host.compactionStatus = {\n active: true,\n startedAt: Date.now(),\n completedAt: null,\n };\n } else if (phase === \"end\") {\n host.compactionStatus = {\n active: false,\n startedAt: host.compactionStatus?.startedAt ?? null,\n completedAt: Date.now(),\n };\n // Auto-clear the toast after duration\n host.compactionClearTimer = window.setTimeout(() => {\n host.compactionStatus = null;\n host.compactionClearTimer = null;\n }, COMPACTION_TOAST_DURATION_MS);\n }\n}\n\nexport function handleAgentEvent(host: ToolStreamHost, payload?: AgentEventPayload) {\n if (!payload) return;\n\n // Handle compaction events\n if (payload.stream === \"compaction\") {\n handleCompactionEvent(host as CompactionHost, payload);\n return;\n }\n\n if (payload.stream !== \"tool\") return;\n const sessionKey =\n typeof payload.sessionKey === \"string\" ? payload.sessionKey : undefined;\n if (sessionKey && sessionKey !== host.sessionKey) return;\n // Fallback: only accept session-less events for the active run.\n if (!sessionKey && host.chatRunId && payload.runId !== host.chatRunId) return;\n if (host.chatRunId && payload.runId !== host.chatRunId) return;\n if (!host.chatRunId) return;\n\n const data = payload.data ?? {};\n const toolCallId = typeof data.toolCallId === \"string\" ? data.toolCallId : \"\";\n if (!toolCallId) return;\n const name = typeof data.name === \"string\" ? data.name : \"tool\";\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n const args = phase === \"start\" ? data.args : undefined;\n const output =\n phase === \"update\"\n ? formatToolOutput(data.partialResult)\n : phase === \"result\"\n ? formatToolOutput(data.result)\n : undefined;\n\n const now = Date.now();\n let entry = host.toolStreamById.get(toolCallId);\n if (!entry) {\n entry = {\n toolCallId,\n runId: payload.runId,\n sessionKey,\n name,\n args,\n output,\n startedAt: typeof payload.ts === \"number\" ? payload.ts : now,\n updatedAt: now,\n message: {},\n };\n host.toolStreamById.set(toolCallId, entry);\n host.toolStreamOrder.push(toolCallId);\n } else {\n entry.name = name;\n if (args !== undefined) entry.args = args;\n if (output !== undefined) entry.output = output;\n entry.updatedAt = now;\n }\n\n entry.message = buildToolStreamMessage(entry);\n trimToolStream(host);\n scheduleToolStreamSync(host, phase === \"result\");\n}\n","type ScrollHost = {\n updateComplete: Promise<unknown>;\n querySelector: (selectors: string) => Element | null;\n style: CSSStyleDeclaration;\n chatScrollFrame: number | null;\n chatScrollTimeout: number | null;\n chatHasAutoScrolled: boolean;\n chatUserNearBottom: boolean;\n logsScrollFrame: number | null;\n logsAtBottom: boolean;\n topbarObserver: ResizeObserver | null;\n};\n\nexport function scheduleChatScroll(host: ScrollHost, force = false) {\n if (host.chatScrollFrame) cancelAnimationFrame(host.chatScrollFrame);\n if (host.chatScrollTimeout != null) {\n clearTimeout(host.chatScrollTimeout);\n host.chatScrollTimeout = null;\n }\n const pickScrollTarget = () => {\n const container = host.querySelector(\".chat-thread\") as HTMLElement | null;\n if (container) {\n const overflowY = getComputedStyle(container).overflowY;\n const canScroll =\n overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n container.scrollHeight - container.clientHeight > 1;\n if (canScroll) return container;\n }\n return (document.scrollingElement ?? document.documentElement) as HTMLElement | null;\n };\n // Wait for Lit render to complete, then scroll\n void host.updateComplete.then(() => {\n host.chatScrollFrame = requestAnimationFrame(() => {\n host.chatScrollFrame = null;\n const target = pickScrollTarget();\n if (!target) return;\n const distanceFromBottom =\n target.scrollHeight - target.scrollTop - target.clientHeight;\n const shouldStick = force || host.chatUserNearBottom || distanceFromBottom < 200;\n if (!shouldStick) return;\n if (force) host.chatHasAutoScrolled = true;\n target.scrollTop = target.scrollHeight;\n host.chatUserNearBottom = true;\n const retryDelay = force ? 150 : 120;\n host.chatScrollTimeout = window.setTimeout(() => {\n host.chatScrollTimeout = null;\n const latest = pickScrollTarget();\n if (!latest) return;\n const latestDistanceFromBottom =\n latest.scrollHeight - latest.scrollTop - latest.clientHeight;\n const shouldStickRetry =\n force || host.chatUserNearBottom || latestDistanceFromBottom < 200;\n if (!shouldStickRetry) return;\n latest.scrollTop = latest.scrollHeight;\n host.chatUserNearBottom = true;\n }, retryDelay);\n });\n });\n}\n\nexport function scheduleLogsScroll(host: ScrollHost, force = false) {\n if (host.logsScrollFrame) cancelAnimationFrame(host.logsScrollFrame);\n void host.updateComplete.then(() => {\n host.logsScrollFrame = requestAnimationFrame(() => {\n host.logsScrollFrame = null;\n const container = host.querySelector(\".log-stream\") as HTMLElement | null;\n if (!container) return;\n // Logs are newest-first, so \"auto-follow\" means staying at the top\n const shouldStick = force || container.scrollTop < 80;\n if (!shouldStick) return;\n container.scrollTop = 0;\n });\n });\n}\n\nexport function handleChatScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n const distanceFromBottom =\n container.scrollHeight - container.scrollTop - container.clientHeight;\n host.chatUserNearBottom = distanceFromBottom < 200;\n}\n\nexport function handleLogsScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n // Logs are newest-first, so \"at top\" means following latest entries\n host.logsAtBottom = container.scrollTop < 80;\n}\n\nexport function handleSessionLogsScroll(host: ScrollHost, event: Event) {\n const container = event.currentTarget as HTMLElement | null;\n if (!container) return;\n host.logsAtBottom = container.scrollTop < 80;\n}\n\nexport function resetChatScroll(host: ScrollHost) {\n host.chatHasAutoScrolled = false;\n host.chatUserNearBottom = true;\n}\n\nexport function exportLogs(lines: string[], label: string) {\n if (lines.length === 0) return;\n const blob = new Blob([`${lines.join(\"\\n\")}\\n`], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, \"-\");\n anchor.href = url;\n anchor.download = `taskmaster-logs-${label}-${stamp}.log`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function exportSessionLogs(lines: string[], label: string) {\n if (lines.length === 0) return;\n const blob = new Blob([`${lines.join(\"\\n\")}\\n`], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, \"-\");\n anchor.href = url;\n anchor.download = `taskmaster-session-logs-${label}-${stamp}.log`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport function observeTopbar(host: ScrollHost) {\n if (typeof ResizeObserver === \"undefined\") return;\n const topbar = host.querySelector(\".topbar\");\n if (!topbar) return;\n const update = () => {\n const { height } = topbar.getBoundingClientRect();\n host.style.setProperty(\"--topbar-height\", `${height}px`);\n };\n update();\n host.topbarObserver = new ResizeObserver(() => update());\n host.topbarObserver.observe(topbar);\n}\n","export function cloneConfigObject<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nexport function serializeConfigForm(form: Record<string, unknown>): string {\n return `${JSON.stringify(form, null, 2).trimEnd()}\\n`;\n}\n\nexport function setPathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n value: unknown,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n const nextKey = path[i + 1];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n if (current[key] == null) {\n current[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n const record = current as Record<string, unknown>;\n if (record[key] == null) {\n record[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = record[key] as Record<string, unknown> | unknown[];\n }\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current[lastKey] = value;\n return;\n }\n if (typeof current === \"object\" && current != null) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n}\n\nexport function removePathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n current = (current as Record<string, unknown>)[key] as\n | Record<string, unknown>\n | unknown[];\n }\n if (current == null) return;\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) current.splice(lastKey, 1);\n return;\n }\n if (typeof current === \"object\" && current != null) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type {\n ConfigSchemaResponse,\n ConfigSnapshot,\n ConfigUiHints,\n} from \"../types\";\nimport {\n cloneConfigObject,\n removePathValue,\n serializeConfigForm,\n setPathValue,\n} from \"./config/form-utils\";\n\nexport type ConfigState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n applySessionKey: string;\n configLoading: boolean;\n configRaw: string;\n configRawOriginal: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configApplying: boolean;\n updateRunning: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaVersion: string | null;\n configSchemaLoading: boolean;\n configUiHints: ConfigUiHints;\n configForm: Record<string, unknown> | null;\n configFormOriginal: Record<string, unknown> | null;\n configFormDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n configSearchQuery: string;\n configActiveSection: string | null;\n configActiveSubsection: string | null;\n lastError: string | null;\n};\n\nexport async function loadConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n applyConfigSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configLoading = false;\n }\n}\n\nexport async function loadConfigSchema(state: ConfigState) {\n if (!state.client || !state.connected) return;\n if (state.configSchemaLoading) return;\n state.configSchemaLoading = true;\n try {\n const res = (await state.client.request(\n \"config.schema\",\n {},\n )) as ConfigSchemaResponse;\n applyConfigSchema(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSchemaLoading = false;\n }\n}\n\nexport function applyConfigSchema(\n state: ConfigState,\n res: ConfigSchemaResponse,\n) {\n state.configSchema = res.schema ?? null;\n state.configUiHints = res.uiHints ?? {};\n state.configSchemaVersion = res.version ?? null;\n}\n\nexport function applyConfigSnapshot(state: ConfigState, snapshot: ConfigSnapshot) {\n state.configSnapshot = snapshot;\n const rawFromSnapshot =\n typeof snapshot.raw === \"string\"\n ? snapshot.raw\n : snapshot.config && typeof snapshot.config === \"object\"\n ? serializeConfigForm(snapshot.config as Record<string, unknown>)\n : state.configRaw;\n if (!state.configFormDirty || state.configFormMode === \"raw\") {\n state.configRaw = rawFromSnapshot;\n } else if (state.configForm) {\n state.configRaw = serializeConfigForm(state.configForm);\n } else {\n state.configRaw = rawFromSnapshot;\n }\n state.configValid = typeof snapshot.valid === \"boolean\" ? snapshot.valid : null;\n state.configIssues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n\n if (!state.configFormDirty) {\n state.configForm = cloneConfigObject(snapshot.config ?? {});\n state.configFormOriginal = cloneConfigObject(snapshot.config ?? {});\n state.configRawOriginal = rawFromSnapshot;\n }\n}\n\nexport async function saveConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configSaving = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.set\", { raw, baseHash });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSaving = false;\n }\n}\n\nexport async function applyConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configApplying = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? serializeConfigForm(state.configForm)\n : state.configRaw;\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Config hash missing; reload and retry.\";\n return;\n }\n await state.client.request(\"config.apply\", {\n raw,\n baseHash,\n sessionKey: state.applySessionKey,\n });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configApplying = false;\n }\n}\n\nexport async function runUpdate(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.updateRunning = true;\n state.lastError = null;\n try {\n await state.client.request(\"update.run\", {\n sessionKey: state.applySessionKey,\n });\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.updateRunning = false;\n }\n}\n\nexport function updateConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n setPathValue(base, path, value);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n\nexport function removeConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n removePathValue(base, path);\n state.configForm = base;\n state.configFormDirty = true;\n if (state.configFormMode === \"form\") {\n state.configRaw = serializeConfigForm(base);\n }\n}\n","import { toNumber } from \"../format\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n workspaceAgentIds?: string[];\n};\n\nexport async function loadCronStatus(state: CronState) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.status\", {})) as CronStatus;\n state.cronStatus = res;\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\nexport async function loadCronJobs(state: CronState) {\n if (!state.client || !state.connected) return;\n if (state.cronLoading) return;\n state.cronLoading = true;\n state.cronError = null;\n try {\n const listParams: Record<string, unknown> = { includeDisabled: true };\n if (Array.isArray(state.workspaceAgentIds) && state.workspaceAgentIds.length > 0) {\n listParams.agentIds = state.workspaceAgentIds;\n }\n const res = (await state.client.request(\"cron.list\", listParams)) as { jobs?: CronJob[] };\n state.cronJobs = Array.isArray(res.jobs) ? res.jobs : [];\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronLoading = false;\n }\n}\n\nexport function buildCronSchedule(form: CronFormState) {\n if (form.scheduleKind === \"at\") {\n const ms = Date.parse(form.scheduleAt);\n if (!Number.isFinite(ms)) throw new Error(\"Invalid run time.\");\n return { kind: \"at\" as const, atMs: ms };\n }\n if (form.scheduleKind === \"every\") {\n const amount = toNumber(form.everyAmount, 0);\n if (amount <= 0) throw new Error(\"Invalid interval amount.\");\n const unit = form.everyUnit;\n const mult = unit === \"minutes\" ? 60_000 : unit === \"hours\" ? 3_600_000 : 86_400_000;\n return { kind: \"every\" as const, everyMs: amount * mult };\n }\n const expr = form.cronExpr.trim();\n if (!expr) throw new Error(\"Cron expression required.\");\n return { kind: \"cron\" as const, expr, tz: form.cronTz.trim() || undefined };\n}\n\nexport function buildCronPayload(form: CronFormState) {\n if (form.payloadKind === \"systemEvent\") {\n const text = form.payloadText.trim();\n if (!text) throw new Error(\"System event text required.\");\n return { kind: \"systemEvent\" as const, text };\n }\n const message = form.payloadText.trim();\n if (!message) throw new Error(\"Agent message required.\");\n const payload: {\n kind: \"agentTurn\";\n message: string;\n deliver?: boolean;\n channel?: string;\n to?: string;\n timeoutSeconds?: number;\n } = { kind: \"agentTurn\", message };\n if (form.deliver) payload.deliver = true;\n if (form.channel) payload.channel = form.channel;\n if (form.to.trim()) payload.to = form.to.trim();\n const timeoutSeconds = toNumber(form.timeoutSeconds, 0);\n if (timeoutSeconds > 0) payload.timeoutSeconds = timeoutSeconds;\n return payload;\n}\n\nexport async function addCronJob(state: CronState) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n const schedule = buildCronSchedule(state.cronForm);\n const payload = buildCronPayload(state.cronForm);\n const agentId = state.cronForm.agentId.trim();\n const accountId = state.cronForm.accountId?.trim();\n const job = {\n name: state.cronForm.name.trim(),\n description: state.cronForm.description.trim() || undefined,\n agentId: agentId || undefined,\n accountId: accountId || undefined,\n enabled: state.cronForm.enabled,\n schedule,\n sessionTarget: state.cronForm.sessionTarget,\n wakeMode: state.cronForm.wakeMode,\n payload,\n isolation:\n state.cronForm.postToMainPrefix.trim() &&\n state.cronForm.sessionTarget === \"isolated\"\n ? { postToMainPrefix: state.cronForm.postToMainPrefix.trim() }\n : undefined,\n };\n if (!job.name) throw new Error(\"Name required.\");\n await state.client.request(\"cron.add\", job);\n state.cronForm = {\n ...state.cronForm,\n name: \"\",\n description: \"\",\n payloadText: \"\",\n };\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function toggleCronJob(\n state: CronState,\n job: CronJob,\n enabled: boolean,\n) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.update\", { id: job.id, patch: { enabled } });\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function runCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.run\", { id: job.id, mode: \"force\" });\n await loadCronRuns(state, job.id);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function removeCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.remove\", { id: job.id });\n if (state.cronRunsJobId === job.id) {\n state.cronRunsJobId = null;\n state.cronRuns = [];\n }\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function loadCronRuns(state: CronState, jobId: string) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.runs\", {\n id: jobId,\n limit: 50,\n })) as { entries?: CronRunLogEntry[] };\n state.cronRunsJobId = jobId;\n state.cronRuns = Array.isArray(res.entries) ? res.entries : [];\n } catch (err) {\n state.cronError = String(err);\n }\n}\n","import type { ChannelsStatusSnapshot, ConfigSnapshot } from \"../types\";\nimport type { ChannelsState } from \"./channels.types\";\nimport { cloneConfigObject, serializeConfigForm } from \"./config/form-utils\";\n\nexport type { ChannelsState };\n\nexport async function loadChannels(state: ChannelsState, probe: boolean) {\n if (!state.client || !state.connected) return;\n if (state.channelsLoading) return;\n state.channelsLoading = true;\n state.channelsError = null;\n try {\n const res = (await state.client.request(\"channels.status\", {\n probe,\n timeoutMs: 8000,\n })) as ChannelsStatusSnapshot;\n state.channelsSnapshot = res;\n state.channelsLastSuccess = Date.now();\n } catch (err) {\n state.channelsError = String(err);\n } finally {\n state.channelsLoading = false;\n }\n}\n\nexport async function startWhatsAppLogin(state: ChannelsState, force: boolean, accountId?: string) {\n if (!state.client || !state.connected || state.whatsappBusy) {\n return;\n }\n state.whatsappBusy = true;\n state.whatsappActiveQrAccountId = accountId ?? null;\n try {\n const res = (await state.client.request(\"web.login.start\", {\n force,\n timeoutMs: 30000,\n accountId,\n })) as { message?: string; qrDataUrl?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function waitWhatsAppLogin(state: ChannelsState, accountId?: string) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.wait\", {\n timeoutMs: 120000,\n accountId,\n })) as { connected?: boolean; message?: string; selfPhone?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginConnected = res.connected ?? null;\n if (res.connected) {\n state.whatsappLoginQrDataUrl = null;\n state.whatsappActiveQrAccountId = null;\n state.whatsappPairedPhone = res.selfPhone ?? null;\n }\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function logoutWhatsApp(state: ChannelsState, accountId?: string) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n await state.client.request(\"channels.logout\", { channel: \"whatsapp\", accountId });\n state.whatsappLoginMessage = \"Logged out.\";\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n state.whatsappActiveQrAccountId = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n } finally {\n state.whatsappBusy = false;\n }\n}\n\n/**\n * Add a new WhatsApp Baileys account to config.\n * Follows the admins controller pattern: config.get → mutate → config.set with baseHash.\n */\nexport async function addWhatsAppAccount(state: ChannelsState, name: string) {\n if (!state.client || !state.connected) return;\n if (state.whatsappAccountSaving) return;\n\n const trimmed = name.trim();\n if (!trimmed) {\n state.whatsappAccountError = \"Account name is required.\";\n return;\n }\n\n // Generate accountId from name: lowercase, replace spaces/special chars with hyphens\n const accountId = trimmed\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n if (!accountId) {\n state.whatsappAccountError = \"Invalid account name.\";\n return;\n }\n\n state.whatsappAccountSaving = true;\n state.whatsappAccountError = null;\n try {\n // Load fresh config\n const configRes = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = configRes;\n const config = cloneConfigObject((configRes.config ?? {}) as Record<string, unknown>);\n\n // Ensure channels.whatsapp.accounts exists\n if (!config.channels || typeof config.channels !== \"object\") {\n config.channels = {};\n }\n const channels = config.channels as Record<string, unknown>;\n if (!channels.whatsapp || typeof channels.whatsapp !== \"object\") {\n channels.whatsapp = {};\n }\n const whatsapp = channels.whatsapp as Record<string, unknown>;\n if (!whatsapp.accounts || typeof whatsapp.accounts !== \"object\") {\n whatsapp.accounts = {};\n }\n const accounts = whatsapp.accounts as Record<string, unknown>;\n\n // Check for duplicate\n if (accounts[accountId]) {\n state.whatsappAccountError = `Account \"${accountId}\" already exists.`;\n return;\n }\n\n // Add the new account\n accounts[accountId] = { name: trimmed, provider: \"baileys\" };\n\n const baseHash = configRes.hash;\n if (!baseHash) {\n state.whatsappAccountError = \"Config hash missing; reload and retry.\";\n return;\n }\n const raw = serializeConfigForm(config);\n await state.client.request(\"config.set\", { raw, baseHash });\n\n // Reset form state\n state.addingWhatsAppAccount = false;\n state.newWhatsAppAccountName = \"\";\n\n // Reload channels to show the new account\n await loadChannels(state, true);\n\n // Start QR flow for the new account\n await startWhatsAppLogin(state, true, accountId);\n } catch (err) {\n state.whatsappAccountError = String(err);\n } finally {\n state.whatsappAccountSaving = false;\n }\n}\n\n/**\n * Remove a WhatsApp account from config.\n * Prevents removing the last remaining account.\n */\nexport async function removeWhatsAppAccount(state: ChannelsState, accountId: string) {\n if (!state.client || !state.connected) return;\n if (state.whatsappAccountSaving) return;\n\n state.whatsappAccountSaving = true;\n state.whatsappAccountError = null;\n try {\n // Load fresh config\n const configRes = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = configRes;\n const config = cloneConfigObject((configRes.config ?? {}) as Record<string, unknown>);\n\n const channels = config.channels as Record<string, unknown> | undefined;\n const whatsapp = channels?.whatsapp as Record<string, unknown> | undefined;\n const accounts = whatsapp?.accounts as Record<string, unknown> | undefined;\n\n if (!accounts) {\n state.whatsappAccountError = \"No accounts found in config.\";\n return;\n }\n\n const accountKeys = Object.keys(accounts);\n if (accountKeys.length <= 1) {\n state.whatsappAccountError = \"Cannot remove the last account.\";\n return;\n }\n\n if (!accounts[accountId]) {\n state.whatsappAccountError = `Account \"${accountId}\" not found.`;\n return;\n }\n\n // Logout the account first\n try {\n await state.client.request(\"channels.logout\", { channel: \"whatsapp\", accountId });\n } catch {\n // Logout failure is non-fatal — account may already be disconnected\n }\n\n // Remove the account\n delete accounts[accountId];\n\n // Remove any bindings referencing this accountId\n if (Array.isArray(config.bindings)) {\n config.bindings = (config.bindings as Array<Record<string, unknown>>).filter((binding) => {\n const match = binding.match as Record<string, unknown> | undefined;\n if (!match) return true;\n if (match.channel !== \"whatsapp\") return true;\n return match.accountId !== accountId;\n });\n }\n\n const baseHash = configRes.hash;\n if (!baseHash) {\n state.whatsappAccountError = \"Config hash missing; reload and retry.\";\n return;\n }\n const raw = serializeConfigForm(config);\n await state.client.request(\"config.set\", { raw, baseHash });\n\n // Clear any active QR state for this account\n if (state.whatsappActiveQrAccountId === accountId) {\n state.whatsappActiveQrAccountId = null;\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginMessage = null;\n }\n\n // Reload channels\n await loadChannels(state, true);\n } catch (err) {\n state.whatsappAccountError = String(err);\n } finally {\n state.whatsappAccountSaving = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { HealthSnapshot, StatusSummary } from \"../types\";\n\nexport type DebugState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n};\n\nexport async function loadDebug(state: DebugState) {\n if (!state.client || !state.connected) return;\n if (state.debugLoading) return;\n state.debugLoading = true;\n try {\n const [status, health, models, heartbeat] = await Promise.all([\n state.client.request(\"status\", {}),\n state.client.request(\"health\", {}),\n state.client.request(\"models.list\", {}),\n state.client.request(\"last-heartbeat\", {}),\n ]);\n state.debugStatus = status as StatusSummary;\n state.debugHealth = health as HealthSnapshot;\n const modelPayload = models as { models?: unknown[] } | undefined;\n state.debugModels = Array.isArray(modelPayload?.models)\n ? modelPayload?.models\n : [];\n state.debugHeartbeat = heartbeat as unknown;\n } catch (err) {\n state.debugCallError = String(err);\n } finally {\n state.debugLoading = false;\n }\n}\n\nexport async function callDebugMethod(state: DebugState) {\n if (!state.client || !state.connected) return;\n state.debugCallError = null;\n state.debugCallResult = null;\n try {\n const params = state.debugCallParams.trim()\n ? (JSON.parse(state.debugCallParams) as unknown)\n : {};\n const res = await state.client.request(state.debugCallMethod.trim(), params);\n state.debugCallResult = JSON.stringify(res, null, 2);\n } catch (err) {\n state.debugCallError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { LogEntry, LogLevel } from \"../types\";\n\nexport type LogsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n logsLoading: boolean;\n logsError: string | null;\n logsCursor: number | null;\n logsFile: string | null;\n logsEntries: LogEntry[];\n logsTruncated: boolean;\n logsLastFetchAt: number | null;\n logsLimit: number;\n logsMaxBytes: number;\n};\n\nconst LOG_BUFFER_LIMIT = 2000;\nconst LEVELS = new Set<LogLevel>([\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\",\n \"fatal\",\n]);\n\nfunction parseMaybeJsonString(value: unknown) {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed.startsWith(\"{\") || !trimmed.endsWith(\"}\")) return null;\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (!parsed || typeof parsed !== \"object\") return null;\n return parsed as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nfunction normalizeLevel(value: unknown): LogLevel | null {\n if (typeof value !== \"string\") return null;\n const lowered = value.toLowerCase() as LogLevel;\n return LEVELS.has(lowered) ? lowered : null;\n}\n\nexport function parseLogLine(line: string): LogEntry {\n if (!line.trim()) return { raw: line, message: line };\n try {\n const obj = JSON.parse(line) as Record<string, unknown>;\n const meta =\n obj && typeof obj._meta === \"object\" && obj._meta !== null\n ? (obj._meta as Record<string, unknown>)\n : null;\n const time =\n typeof obj.time === \"string\"\n ? obj.time\n : typeof meta?.date === \"string\"\n ? meta?.date\n : null;\n const level = normalizeLevel(meta?.logLevelName ?? meta?.level);\n\n const contextCandidate =\n typeof obj[\"0\"] === \"string\"\n ? (obj[\"0\"] as string)\n : typeof meta?.name === \"string\"\n ? (meta?.name as string)\n : null;\n const contextObj = parseMaybeJsonString(contextCandidate);\n let subsystem: string | null = null;\n if (contextObj) {\n if (typeof contextObj.subsystem === \"string\") subsystem = contextObj.subsystem;\n else if (typeof contextObj.module === \"string\") subsystem = contextObj.module;\n }\n if (!subsystem && contextCandidate && contextCandidate.length < 120) {\n subsystem = contextCandidate;\n }\n\n let message: string | null = null;\n if (typeof obj[\"1\"] === \"string\") message = obj[\"1\"] as string;\n else if (!contextObj && typeof obj[\"0\"] === \"string\") message = obj[\"0\"] as string;\n else if (typeof obj.message === \"string\") message = obj.message as string;\n\n return {\n raw: line,\n time,\n level,\n subsystem,\n message: message ?? line,\n meta: meta ?? undefined,\n };\n } catch {\n return { raw: line, message: line };\n }\n}\n\nexport async function loadLogs(\n state: LogsState,\n opts?: { reset?: boolean; quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.logsLoading && !opts?.quiet) return;\n if (!opts?.quiet) state.logsLoading = true;\n state.logsError = null;\n try {\n const res = await state.client.request(\"logs.tail\", {\n cursor: opts?.reset ? undefined : state.logsCursor ?? undefined,\n limit: state.logsLimit,\n maxBytes: state.logsMaxBytes,\n });\n const payload = res as {\n file?: string;\n cursor?: number;\n size?: number;\n lines?: unknown;\n truncated?: boolean;\n reset?: boolean;\n };\n const lines = Array.isArray(payload.lines)\n ? (payload.lines.filter((line) => typeof line === \"string\") as string[])\n : [];\n const entries = lines.map(parseLogLine);\n const shouldReset = Boolean(opts?.reset || payload.reset || state.logsCursor == null);\n state.logsEntries = shouldReset\n ? entries\n : [...state.logsEntries, ...entries].slice(-LOG_BUFFER_LIMIT);\n if (typeof payload.cursor === \"number\") state.logsCursor = payload.cursor;\n if (typeof payload.file === \"string\") state.logsFile = payload.file;\n state.logsTruncated = Boolean(payload.truncated);\n state.logsLastFetchAt = Date.now();\n } catch (err) {\n state.logsError = String(err);\n } finally {\n if (!opts?.quiet) state.logsLoading = false;\n }\n}\n","/*! noble-ed25519 - MIT License (c) 2019 Paul Miller (paulmillr.com) */\n/**\n * 5KB JS implementation of ed25519 EdDSA signatures.\n * Compliant with RFC8032, FIPS 186-5 & ZIP215.\n * @module\n * @example\n * ```js\nimport * as ed from '@noble/ed25519';\n(async () => {\n const secretKey = ed.utils.randomSecretKey();\n const message = Uint8Array.from([0xab, 0xbc, 0xcd, 0xde]);\n const pubKey = await ed.getPublicKeyAsync(secretKey); // Sync methods are also present\n const signature = await ed.signAsync(message, secretKey);\n const isValid = await ed.verifyAsync(signature, message, pubKey);\n})();\n```\n */\n/**\n * Curve params. ed25519 is twisted edwards curve. Equation is −x² + y² = -a + dx²y².\n * * P = `2n**255n - 19n` // field over which calculations are done\n * * N = `2n**252n + 27742317777372353535851937790883648493n` // group order, amount of curve points\n * * h = 8 // cofactor\n * * a = `Fp.create(BigInt(-1))` // equation param\n * * d = -121665/121666 a.k.a. `Fp.neg(121665 * Fp.inv(121666))` // equation param\n * * Gx, Gy are coordinates of Generator / base point\n */\nconst ed25519_CURVE = {\n p: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,\n n: 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,\n h: 8n,\n a: 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,\n d: 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,\n Gx: 0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,\n Gy: 0x6666666666666666666666666666666666666666666666666666666666666658n,\n};\nconst { p: P, n: N, Gx, Gy, a: _a, d: _d, h } = ed25519_CURVE;\nconst L = 32; // field / group byte length\nconst L2 = 64;\n// Helpers and Precomputes sections are reused between libraries\n// ## Helpers\n// ----------\nconst captureTrace = (...args) => {\n if ('captureStackTrace' in Error && typeof Error.captureStackTrace === 'function') {\n Error.captureStackTrace(...args);\n }\n};\nconst err = (message = '') => {\n const e = new Error(message);\n captureTrace(e, err);\n throw e;\n};\nconst isBig = (n) => typeof n === 'bigint'; // is big integer\nconst isStr = (s) => typeof s === 'string'; // is string\nconst isBytes = (a) => a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n/** Asserts something is Uint8Array. */\nconst abytes = (value, length, title = '') => {\n const bytes = isBytes(value);\n const len = value?.length;\n const needsLen = length !== undefined;\n if (!bytes || (needsLen && len !== length)) {\n const prefix = title && `\"${title}\" `;\n const ofLen = needsLen ? ` of length ${length}` : '';\n const got = bytes ? `length=${len}` : `type=${typeof value}`;\n err(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n }\n return value;\n};\n/** create Uint8Array */\nconst u8n = (len) => new Uint8Array(len);\nconst u8fr = (buf) => Uint8Array.from(buf);\nconst padh = (n, pad) => n.toString(16).padStart(pad, '0');\nconst bytesToHex = (b) => Array.from(abytes(b))\n .map((e) => padh(e, 2))\n .join('');\nconst C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters\nconst _ch = (ch) => {\n if (ch >= C._0 && ch <= C._9)\n return ch - C._0; // '2' => 50-48\n if (ch >= C.A && ch <= C.F)\n return ch - (C.A - 10); // 'B' => 66-(65-10)\n if (ch >= C.a && ch <= C.f)\n return ch - (C.a - 10); // 'b' => 98-(97-10)\n return;\n};\nconst hexToBytes = (hex) => {\n const e = 'hex invalid';\n if (!isStr(hex))\n return err(e);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2)\n return err(e);\n const array = u8n(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n // treat each char as ASCII\n const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16\n const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char\n if (n1 === undefined || n2 === undefined)\n return err(e);\n array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9\n }\n return array;\n};\nconst cr = () => globalThis?.crypto; // WebCrypto is available in all modern environments\nconst subtle = () => cr()?.subtle ?? err('crypto.subtle must be defined, consider polyfill');\n// prettier-ignore\nconst concatBytes = (...arrs) => {\n const r = u8n(arrs.reduce((sum, a) => sum + abytes(a).length, 0)); // create u8a of summed length\n let pad = 0; // walk through each array,\n arrs.forEach(a => { r.set(a, pad); pad += a.length; }); // ensure they have proper type\n return r;\n};\n/** WebCrypto OS-level CSPRNG (random number generator). Will throw when not available. */\nconst randomBytes = (len = L) => {\n const c = cr();\n return c.getRandomValues(u8n(len));\n};\nconst big = BigInt;\nconst assertRange = (n, min, max, msg = 'bad number: out of range') => (isBig(n) && min <= n && n < max ? n : err(msg));\n/** modular division */\nconst M = (a, b = P) => {\n const r = a % b;\n return r >= 0n ? r : b + r;\n};\nconst modN = (a) => M(a, N);\n/** Modular inversion using euclidean GCD (non-CT). No negative exponent for now. */\n// prettier-ignore\nconst invert = (num, md) => {\n if (num === 0n || md <= 0n)\n err('no inverse n=' + num + ' mod=' + md);\n let a = M(num, md), b = md, x = 0n, y = 1n, u = 1n, v = 0n;\n while (a !== 0n) {\n const q = b / a, r = b % a;\n const m = x - u * q, n = y - v * q;\n b = a, a = r, x = u, y = v, u = m, v = n;\n }\n return b === 1n ? M(x, md) : err('no inverse'); // b is gcd at this point\n};\nconst callHash = (name) => {\n // @ts-ignore\n const fn = hashes[name];\n if (typeof fn !== 'function')\n err('hashes.' + name + ' not set');\n return fn;\n};\nconst hash = (msg) => callHash('sha512')(msg);\nconst apoint = (p) => (p instanceof Point ? p : err('Point expected'));\n// ## End of Helpers\n// -----------------\nconst B256 = 2n ** 256n;\n/** Point in XYZT extended coordinates. */\nclass Point {\n static BASE;\n static ZERO;\n X;\n Y;\n Z;\n T;\n constructor(X, Y, Z, T) {\n const max = B256;\n this.X = assertRange(X, 0n, max);\n this.Y = assertRange(Y, 0n, max);\n this.Z = assertRange(Z, 1n, max);\n this.T = assertRange(T, 0n, max);\n Object.freeze(this);\n }\n static CURVE() {\n return ed25519_CURVE;\n }\n static fromAffine(p) {\n return new Point(p.x, p.y, 1n, M(p.x * p.y));\n }\n /** RFC8032 5.1.3: Uint8Array to Point. */\n static fromBytes(hex, zip215 = false) {\n const d = _d;\n // Copy array to not mess it up.\n const normed = u8fr(abytes(hex, L));\n // adjust first LE byte = last BE byte\n const lastByte = hex[31];\n normed[31] = lastByte & ~0x80;\n const y = bytesToNumLE(normed);\n // zip215=true: 0 <= y < 2^256\n // zip215=false, RFC8032: 0 <= y < 2^255-19\n const max = zip215 ? B256 : P;\n assertRange(y, 0n, max);\n const y2 = M(y * y); // y²\n const u = M(y2 - 1n); // u=y²-1\n const v = M(d * y2 + 1n); // v=dy²+1\n let { isValid, value: x } = uvRatio(u, v); // (uv³)(uv⁷)^(p-5)/8; square root\n if (!isValid)\n err('bad point: y not sqrt'); // not square root: bad point\n const isXOdd = (x & 1n) === 1n; // adjust sign of x coordinate\n const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n if (!zip215 && x === 0n && isLastByteOdd)\n err('bad point: x==0, isLastByteOdd'); // x=0, x_0=1\n if (isLastByteOdd !== isXOdd)\n x = M(-x);\n return new Point(x, y, 1n, M(x * y)); // Z=1, T=xy\n }\n static fromHex(hex, zip215) {\n return Point.fromBytes(hexToBytes(hex), zip215);\n }\n get x() {\n return this.toAffine().x;\n }\n get y() {\n return this.toAffine().y;\n }\n /** Checks if the point is valid and on-curve. */\n assertValidity() {\n const a = _a;\n const d = _d;\n const p = this;\n if (p.is0())\n return err('bad point: ZERO'); // TODO: optimize, with vars below?\n // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y²\n const { X, Y, Z, T } = p;\n const X2 = M(X * X); // X²\n const Y2 = M(Y * Y); // Y²\n const Z2 = M(Z * Z); // Z²\n const Z4 = M(Z2 * Z2); // Z⁴\n const aX2 = M(X2 * a); // aX²\n const left = M(Z2 * M(aX2 + Y2)); // (aX² + Y²)Z²\n const right = M(Z4 + M(d * M(X2 * Y2))); // Z⁴ + dX²Y²\n if (left !== right)\n return err('bad point: equation left != right (1)');\n // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n const XY = M(X * Y);\n const ZT = M(Z * T);\n if (XY !== ZT)\n return err('bad point: equation left != right (2)');\n return this;\n }\n /** Equality check: compare points P&Q. */\n equals(other) {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality\n const X1Z2 = M(X1 * Z2);\n const X2Z1 = M(X2 * Z1);\n const Y1Z2 = M(Y1 * Z2);\n const Y2Z1 = M(Y2 * Z1);\n return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n }\n is0() {\n return this.equals(I);\n }\n /** Flip point over y coordinate. */\n negate() {\n return new Point(M(-this.X), this.Y, this.Z, M(-this.T));\n }\n /** Point doubling. Complete formula. Cost: `4M + 4S + 1*a + 6add + 1*2`. */\n double() {\n const { X: X1, Y: Y1, Z: Z1 } = this;\n const a = _a;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n const A = M(X1 * X1);\n const B = M(Y1 * Y1);\n const C = M(2n * M(Z1 * Z1));\n const D = M(a * A);\n const x1y1 = X1 + Y1;\n const E = M(M(x1y1 * x1y1) - A - B);\n const G = D + B;\n const F = G - C;\n const H = D - B;\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n /** Point addition. Complete formula. Cost: `8M + 1*k + 8add + 1*2`. */\n add(other) {\n const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n const { X: X2, Y: Y2, Z: Z2, T: T2 } = apoint(other); // doesn't check if other on-curve\n const a = _a;\n const d = _d;\n // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#addition-add-2008-hwcd-3\n const A = M(X1 * X2);\n const B = M(Y1 * Y2);\n const C = M(T1 * d * T2);\n const D = M(Z1 * Z2);\n const E = M((X1 + Y1) * (X2 + Y2) - A - B);\n const F = M(D - C);\n const G = M(D + C);\n const H = M(B - a * A);\n const X3 = M(E * F);\n const Y3 = M(G * H);\n const T3 = M(E * H);\n const Z3 = M(F * G);\n return new Point(X3, Y3, Z3, T3);\n }\n subtract(other) {\n return this.add(apoint(other).negate());\n }\n /**\n * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.\n * Uses {@link wNAF} for base point.\n * Uses fake point to mitigate side-channel leakage.\n * @param n scalar by which point is multiplied\n * @param safe safe mode guards against timing attacks; unsafe mode is faster\n */\n multiply(n, safe = true) {\n if (!safe && (n === 0n || this.is0()))\n return I;\n assertRange(n, 1n, N);\n if (n === 1n)\n return this;\n if (this.equals(G))\n return wNAF(n).p;\n // init result point & fake point\n let p = I;\n let f = G;\n for (let d = this; n > 0n; d = d.double(), n >>= 1n) {\n // if bit is present, add to point\n // if not present, add to fake, for timing safety\n if (n & 1n)\n p = p.add(d);\n else if (safe)\n f = f.add(d);\n }\n return p;\n }\n multiplyUnsafe(scalar) {\n return this.multiply(scalar, false);\n }\n /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */\n toAffine() {\n const { X, Y, Z } = this;\n // fast-paths for ZERO point OR Z=1\n if (this.equals(I))\n return { x: 0n, y: 1n };\n const iz = invert(Z, P);\n // (Z * Z^-1) must be 1, otherwise bad math\n if (M(Z * iz) !== 1n)\n err('invalid inverse');\n // x = X*Z^-1; y = Y*Z^-1\n const x = M(X * iz);\n const y = M(Y * iz);\n return { x, y };\n }\n toBytes() {\n const { x, y } = this.assertValidity().toAffine();\n const b = numTo32bLE(y);\n // store sign in first LE byte\n b[31] |= x & 1n ? 0x80 : 0;\n return b;\n }\n toHex() {\n return bytesToHex(this.toBytes());\n }\n clearCofactor() {\n return this.multiply(big(h), false);\n }\n isSmallOrder() {\n return this.clearCofactor().is0();\n }\n isTorsionFree() {\n // Multiply by big number N. We can't `mul(N)` because of checks. Instead, we `mul(N/2)*2+1`\n let p = this.multiply(N / 2n, false).double();\n if (N % 2n)\n p = p.add(this);\n return p.is0();\n }\n}\n/** Generator / base point */\nconst G = new Point(Gx, Gy, 1n, M(Gx * Gy));\n/** Identity / zero point */\nconst I = new Point(0n, 1n, 1n, 0n);\n// Static aliases\nPoint.BASE = G;\nPoint.ZERO = I;\nconst numTo32bLE = (num) => hexToBytes(padh(assertRange(num, 0n, B256), L2)).reverse();\nconst bytesToNumLE = (b) => big('0x' + bytesToHex(u8fr(abytes(b)).reverse()));\nconst pow2 = (x, power) => {\n // pow2(x, 4) == x^(2^4)\n let r = x;\n while (power-- > 0n) {\n r *= r;\n r %= P;\n }\n return r;\n};\n// prettier-ignore\nconst pow_2_252_3 = (x) => {\n const x2 = (x * x) % P; // x^2, bits 1\n const b2 = (x2 * x) % P; // x^3, bits 11\n const b4 = (pow2(b2, 2n) * b2) % P; // x^(2^4-1), bits 1111\n const b5 = (pow2(b4, 1n) * x) % P; // x^(2^5-1), bits 11111\n const b10 = (pow2(b5, 5n) * b5) % P; // x^(2^10)\n const b20 = (pow2(b10, 10n) * b10) % P; // x^(2^20)\n const b40 = (pow2(b20, 20n) * b20) % P; // x^(2^40)\n const b80 = (pow2(b40, 40n) * b40) % P; // x^(2^80)\n const b160 = (pow2(b80, 80n) * b80) % P; // x^(2^160)\n const b240 = (pow2(b160, 80n) * b80) % P; // x^(2^240)\n const b250 = (pow2(b240, 10n) * b10) % P; // x^(2^250)\n const pow_p_5_8 = (pow2(b250, 2n) * x) % P; // < To pow to (p+3)/8, multiply it by x.\n return { pow_p_5_8, b2 };\n};\nconst RM1 = 0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n; // √-1\n// for sqrt comp\n// prettier-ignore\nconst uvRatio = (u, v) => {\n const v3 = M(v * v * v); // v³\n const v7 = M(v3 * v3 * v); // v⁷\n const pow = pow_2_252_3(u * v7).pow_p_5_8; // (uv⁷)^(p-5)/8\n let x = M(u * v3 * pow); // (uv³)(uv⁷)^(p-5)/8\n const vx2 = M(v * x * x); // vx²\n const root1 = x; // First root candidate\n const root2 = M(x * RM1); // Second root candidate; RM1 is √-1\n const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n const useRoot2 = vx2 === M(-u); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n const noRoot = vx2 === M(-u * RM1); // There is no valid root, vx² = -u√-1\n if (useRoot1)\n x = root1;\n if (useRoot2 || noRoot)\n x = root2; // We return root2 anyway, for const-time\n if ((M(x) & 1n) === 1n)\n x = M(-x); // edIsNegative\n return { isValid: useRoot1 || useRoot2, value: x };\n};\n// N == L, just weird naming\nconst modL_LE = (hash) => modN(bytesToNumLE(hash)); // modulo L; but little-endian\n/** hashes.sha512 should conform to the interface. */\n// TODO: rename\nconst sha512a = (...m) => hashes.sha512Async(concatBytes(...m)); // Async SHA512\nconst sha512s = (...m) => callHash('sha512')(concatBytes(...m));\n// RFC8032 5.1.5\nconst hash2extK = (hashed) => {\n // slice creates a copy, unlike subarray\n const head = hashed.slice(0, L);\n head[0] &= 248; // Clamp bits: 0b1111_1000\n head[31] &= 127; // 0b0111_1111\n head[31] |= 64; // 0b0100_0000\n const prefix = hashed.slice(L, L2); // secret key \"prefix\"\n const scalar = modL_LE(head); // modular division over curve order\n const point = G.multiply(scalar); // public key point\n const pointBytes = point.toBytes(); // point serialized to Uint8Array\n return { head, prefix, scalar, point, pointBytes };\n};\n// RFC8032 5.1.5; getPublicKey async, sync. Hash priv key and extract point.\nconst getExtendedPublicKeyAsync = (secretKey) => sha512a(abytes(secretKey, L)).then(hash2extK);\nconst getExtendedPublicKey = (secretKey) => hash2extK(sha512s(abytes(secretKey, L)));\n/** Creates 32-byte ed25519 public key from 32-byte secret key. Async. */\nconst getPublicKeyAsync = (secretKey) => getExtendedPublicKeyAsync(secretKey).then((p) => p.pointBytes);\n/** Creates 32-byte ed25519 public key from 32-byte secret key. To use, set `hashes.sha512` first. */\nconst getPublicKey = (priv) => getExtendedPublicKey(priv).pointBytes;\nconst hashFinishA = (res) => sha512a(res.hashable).then(res.finish);\nconst hashFinishS = (res) => res.finish(sha512s(res.hashable));\n// Code, shared between sync & async sign\nconst _sign = (e, rBytes, msg) => {\n const { pointBytes: P, scalar: s } = e;\n const r = modL_LE(rBytes); // r was created outside, reduce it modulo L\n const R = G.multiply(r).toBytes(); // R = [r]B\n const hashable = concatBytes(R, P, msg); // dom2(F, C) || R || A || PH(M)\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n const S = modN(r + modL_LE(hashed) * s); // S = (r + k * s) mod L; 0 <= s < l\n return abytes(concatBytes(R, numTo32bLE(S)), L2); // 64-byte sig: 32b R.x + 32b LE(S)\n };\n return { hashable, finish };\n};\n/**\n * Signs message using secret key. Async.\n * Follows RFC8032 5.1.6.\n */\nconst signAsync = async (message, secretKey) => {\n const m = abytes(message);\n const e = await getExtendedPublicKeyAsync(secretKey);\n const rBytes = await sha512a(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishA(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\n/**\n * Signs message using secret key. To use, set `hashes.sha512` first.\n * Follows RFC8032 5.1.6.\n */\nconst sign = (message, secretKey) => {\n const m = abytes(message);\n const e = getExtendedPublicKey(secretKey);\n const rBytes = sha512s(e.prefix, m); // r = SHA512(dom2(F, C) || prefix || PH(M))\n return hashFinishS(_sign(e, rBytes, m)); // gen R, k, S, then 64-byte signature\n};\nconst defaultVerifyOpts = { zip215: true };\nconst _verify = (sig, msg, pub, opts = defaultVerifyOpts) => {\n sig = abytes(sig, L2); // Signature hex str/Bytes, must be 64 bytes\n msg = abytes(msg); // Message hex str/Bytes\n pub = abytes(pub, L);\n const { zip215 } = opts; // switch between zip215 and rfc8032 verif\n let A;\n let R;\n let s;\n let SB;\n let hashable = Uint8Array.of();\n try {\n A = Point.fromBytes(pub, zip215); // public key A decoded\n R = Point.fromBytes(sig.slice(0, L), zip215); // 0 <= R < 2^256: ZIP215 R can be >= P\n s = bytesToNumLE(sig.slice(L, L2)); // Decode second half as an integer S\n SB = G.multiply(s, false); // in the range 0 <= s < L\n hashable = concatBytes(R.toBytes(), A.toBytes(), msg); // dom2(F, C) || R || A || PH(M)\n }\n catch (error) { }\n const finish = (hashed) => {\n // k = SHA512(dom2(F, C) || R || A || PH(M))\n if (SB == null)\n return false; // false if try-catch catched an error\n if (!zip215 && A.isSmallOrder())\n return false; // false for SBS: Strongly Binding Signature\n const k = modL_LE(hashed); // decode in little-endian, modulo L\n const RkA = R.add(A.multiply(k, false)); // [8]R + [8][k]A'\n return RkA.add(SB.negate()).clearCofactor().is0(); // [8][S]B = [8]R + [8][k]A'\n };\n return { hashable, finish };\n};\n/** Verifies signature on message and public key. Async. Follows RFC8032 5.1.7. */\nconst verifyAsync = async (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishA(_verify(signature, message, publicKey, opts));\n/** Verifies signature on message and public key. To use, set `hashes.sha512` first. Follows RFC8032 5.1.7. */\nconst verify = (signature, message, publicKey, opts = defaultVerifyOpts) => hashFinishS(_verify(signature, message, publicKey, opts));\n/** Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves. */\nconst etc = {\n bytesToHex: bytesToHex,\n hexToBytes: hexToBytes,\n concatBytes: concatBytes,\n mod: M,\n invert: invert,\n randomBytes: randomBytes,\n};\nconst hashes = {\n sha512Async: async (message) => {\n const s = subtle();\n const m = concatBytes(message);\n return u8n(await s.digest('SHA-512', m.buffer));\n },\n sha512: undefined,\n};\n// FIPS 186 B.4.1 compliant key generation produces private keys\n// with modulo bias being neglible. takes >N+16 bytes, returns (hash mod n-1)+1\nconst randomSecretKey = (seed = randomBytes(L)) => seed;\nconst keygen = (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = getPublicKey(secretKey);\n return { secretKey, publicKey };\n};\nconst keygenAsync = async (seed) => {\n const secretKey = randomSecretKey(seed);\n const publicKey = await getPublicKeyAsync(secretKey);\n return { secretKey, publicKey };\n};\n/** ed25519-specific key utilities. */\nconst utils = {\n getExtendedPublicKeyAsync: getExtendedPublicKeyAsync,\n getExtendedPublicKey: getExtendedPublicKey,\n randomSecretKey: randomSecretKey,\n};\n// ## Precomputes\n// --------------\nconst W = 8; // W is window size\nconst scalarBits = 256;\nconst pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop\nconst pwindowSize = 2 ** (W - 1); // 128 for W=8\nconst precompute = () => {\n const points = [];\n let p = G;\n let b = p;\n for (let w = 0; w < pwindows; w++) {\n b = p;\n points.push(b);\n for (let i = 1; i < pwindowSize; i++) {\n b = b.add(p);\n points.push(b);\n } // i=1, bc we skip 0\n p = b.double();\n }\n return points;\n};\nlet Gpows = undefined; // precomputes for base point G\n// const-time negate\nconst ctneg = (cnd, p) => {\n const n = p.negate();\n return cnd ? n : p;\n};\n/**\n * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by\n * caching multiples of G (base point). Cache is stored in 32MB of RAM.\n * Any time `G.multiply` is done, precomputes are used.\n * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.\n *\n * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,\n * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.\n *\n * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().\n */\nconst wNAF = (n) => {\n const comp = Gpows || (Gpows = precompute());\n let p = I;\n let f = G; // f must be G, or could become I in the end\n const pow_2_w = 2 ** W; // 256 for W=8\n const maxNum = pow_2_w; // 256 for W=8\n const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111\n const shiftBy = big(W); // 8 for W=8\n for (let w = 0; w < pwindows; w++) {\n let wbits = Number(n & mask); // extract W bits.\n n >>= shiftBy; // shift number by W bits.\n // We use negative indexes to reduce size of precomputed table by 2x.\n // Instead of needing precomputes 0..256, we only calculate them for 0..128.\n // If an index > 128 is found, we do (256-index) - where 256 is next window.\n // Naive: index +127 => 127, +224 => 224\n // Optimized: index +127 => 127, +224 => 256-32\n if (wbits > pwindowSize) {\n wbits -= maxNum;\n n += 1n;\n }\n const off = w * pwindowSize;\n const offF = off; // offsets, evaluate both\n const offP = off + Math.abs(wbits) - 1;\n const isEven = w % 2 !== 0; // conditions, evaluate both\n const isNeg = wbits < 0;\n if (wbits === 0) {\n // off == I: can't add it. Adding random offF instead.\n f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point\n }\n else {\n p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point\n }\n }\n if (n !== 0n)\n err('invalid wnaf');\n return { p, f }; // return both real and fake points for JIT\n};\n// !! Remove the export to easily use in REPL / browser console\nexport { etc, getPublicKey, getPublicKeyAsync, hash, hashes, keygen, keygenAsync, Point, sign, signAsync, utils, verify, verifyAsync, };\n","import { getPublicKeyAsync, signAsync, utils } from \"@noble/ed25519\";\n\ntype StoredIdentity = {\n version: 1;\n deviceId: string;\n publicKey: string;\n privateKey: string;\n createdAtMs: number;\n};\n\nexport type DeviceIdentity = {\n deviceId: string;\n publicKey: string;\n privateKey: string;\n};\n\nconst STORAGE_KEY = \"taskmaster-device-identity-v1\";\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(input: string): Uint8Array {\n const normalized = input.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = normalized + \"=\".repeat((4 - (normalized.length % 4)) % 4);\n const binary = atob(padded);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i += 1) out[i] = binary.charCodeAt(i);\n return out;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nasync function fingerprintPublicKey(publicKey: Uint8Array): Promise<string> {\n const hash = await crypto.subtle.digest(\"SHA-256\", publicKey);\n return bytesToHex(new Uint8Array(hash));\n}\n\nasync function generateIdentity(): Promise<DeviceIdentity> {\n const privateKey = utils.randomSecretKey();\n const publicKey = await getPublicKeyAsync(privateKey);\n const deviceId = await fingerprintPublicKey(publicKey);\n return {\n deviceId,\n publicKey: base64UrlEncode(publicKey),\n privateKey: base64UrlEncode(privateKey),\n };\n}\n\nexport async function loadOrCreateDeviceIdentity(): Promise<DeviceIdentity> {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as StoredIdentity;\n if (\n parsed?.version === 1 &&\n typeof parsed.deviceId === \"string\" &&\n typeof parsed.publicKey === \"string\" &&\n typeof parsed.privateKey === \"string\"\n ) {\n const derivedId = await fingerprintPublicKey(base64UrlDecode(parsed.publicKey));\n if (derivedId !== parsed.deviceId) {\n const updated: StoredIdentity = {\n ...parsed,\n deviceId: derivedId,\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n return {\n deviceId: derivedId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n return {\n deviceId: parsed.deviceId,\n publicKey: parsed.publicKey,\n privateKey: parsed.privateKey,\n };\n }\n }\n } catch {\n // fall through to regenerate\n }\n\n const identity = await generateIdentity();\n const stored: StoredIdentity = {\n version: 1,\n deviceId: identity.deviceId,\n publicKey: identity.publicKey,\n privateKey: identity.privateKey,\n createdAtMs: Date.now(),\n };\n localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));\n return identity;\n}\n\nexport async function signDevicePayload(privateKeyBase64Url: string, payload: string) {\n const key = base64UrlDecode(privateKeyBase64Url);\n const data = new TextEncoder().encode(payload);\n const sig = await signAsync(data, key);\n return base64UrlEncode(sig);\n}\n","export type DeviceAuthEntry = {\n token: string;\n role: string;\n scopes: string[];\n updatedAtMs: number;\n};\n\ntype DeviceAuthStore = {\n version: 1;\n deviceId: string;\n tokens: Record<string, DeviceAuthEntry>;\n};\n\nconst STORAGE_KEY = \"taskmaster.device.auth.v1\";\n\nfunction normalizeRole(role: string): string {\n return role.trim();\n}\n\nfunction normalizeScopes(scopes: string[] | undefined): string[] {\n if (!Array.isArray(scopes)) return [];\n const out = new Set<string>();\n for (const scope of scopes) {\n const trimmed = scope.trim();\n if (trimmed) out.add(trimmed);\n }\n return [...out].sort();\n}\n\nfunction readStore(): DeviceAuthStore | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as DeviceAuthStore;\n if (!parsed || parsed.version !== 1) return null;\n if (!parsed.deviceId || typeof parsed.deviceId !== \"string\") return null;\n if (!parsed.tokens || typeof parsed.tokens !== \"object\") return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeStore(store: DeviceAuthStore) {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(store));\n } catch {\n // best-effort\n }\n}\n\nexport function loadDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n}): DeviceAuthEntry | null {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return null;\n const role = normalizeRole(params.role);\n const entry = store.tokens[role];\n if (!entry || typeof entry.token !== \"string\") return null;\n return entry;\n}\n\nexport function storeDeviceAuthToken(params: {\n deviceId: string;\n role: string;\n token: string;\n scopes?: string[];\n}): DeviceAuthEntry {\n const role = normalizeRole(params.role);\n const next: DeviceAuthStore = {\n version: 1,\n deviceId: params.deviceId,\n tokens: {},\n };\n const existing = readStore();\n if (existing && existing.deviceId === params.deviceId) {\n next.tokens = { ...existing.tokens };\n }\n const entry: DeviceAuthEntry = {\n token: params.token,\n role,\n scopes: normalizeScopes(params.scopes),\n updatedAtMs: Date.now(),\n };\n next.tokens[role] = entry;\n writeStore(next);\n return entry;\n}\n\nexport function clearDeviceAuthToken(params: { deviceId: string; role: string }) {\n const store = readStore();\n if (!store || store.deviceId !== params.deviceId) return;\n const role = normalizeRole(params.role);\n if (!store.tokens[role]) return;\n const next = { ...store, tokens: { ...store.tokens } };\n delete next.tokens[role];\n writeStore(next);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { loadOrCreateDeviceIdentity } from \"../device-identity\";\nimport { clearDeviceAuthToken, storeDeviceAuthToken } from \"../device-auth\";\n\nexport type DeviceTokenSummary = {\n role: string;\n scopes?: string[];\n createdAtMs?: number;\n rotatedAtMs?: number;\n revokedAtMs?: number;\n lastUsedAtMs?: number;\n};\n\nexport type PendingDevice = {\n requestId: string;\n deviceId: string;\n displayName?: string;\n role?: string;\n remoteIp?: string;\n isRepair?: boolean;\n ts?: number;\n};\n\nexport type PairedDevice = {\n deviceId: string;\n displayName?: string;\n roles?: string[];\n scopes?: string[];\n remoteIp?: string;\n tokens?: DeviceTokenSummary[];\n createdAtMs?: number;\n approvedAtMs?: number;\n};\n\nexport type DevicePairingList = {\n pending: PendingDevice[];\n paired: PairedDevice[];\n};\n\nexport type DevicesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n devicesLoading: boolean;\n devicesError: string | null;\n devicesList: DevicePairingList | null;\n};\n\nexport async function loadDevices(state: DevicesState, opts?: { quiet?: boolean }) {\n if (!state.client || !state.connected) return;\n if (state.devicesLoading) return;\n state.devicesLoading = true;\n if (!opts?.quiet) state.devicesError = null;\n try {\n const res = (await state.client.request(\"device.pair.list\", {})) as DevicePairingList | null;\n state.devicesList = {\n pending: Array.isArray(res?.pending) ? res!.pending : [],\n paired: Array.isArray(res?.paired) ? res!.paired : [],\n };\n } catch (err) {\n if (!opts?.quiet) state.devicesError = String(err);\n } finally {\n state.devicesLoading = false;\n }\n}\n\nexport async function approveDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n try {\n await state.client.request(\"device.pair.approve\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rejectDevicePairing(state: DevicesState, requestId: string) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\"Reject this device pairing request?\");\n if (!confirmed) return;\n try {\n await state.client.request(\"device.pair.reject\", { requestId });\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function rotateDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string; scopes?: string[] },\n) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"device.token.rotate\", params)) as\n | { token?: string; role?: string; deviceId?: string; scopes?: string[] }\n | undefined;\n if (res?.token) {\n const identity = await loadOrCreateDeviceIdentity();\n const role = res.role ?? params.role;\n if (res.deviceId === identity.deviceId || params.deviceId === identity.deviceId) {\n storeDeviceAuthToken({\n deviceId: identity.deviceId,\n role,\n token: res.token,\n scopes: res.scopes ?? params.scopes ?? [],\n });\n }\n window.prompt(\"New device token (copy and store securely):\", res.token);\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n\nexport async function revokeDeviceToken(\n state: DevicesState,\n params: { deviceId: string; role: string },\n) {\n if (!state.client || !state.connected) return;\n const confirmed = window.confirm(\n `Revoke token for ${params.deviceId} (${params.role})?`,\n );\n if (!confirmed) return;\n try {\n await state.client.request(\"device.token.revoke\", params);\n const identity = await loadOrCreateDeviceIdentity();\n if (params.deviceId === identity.deviceId) {\n clearDeviceAuthToken({ deviceId: identity.deviceId, role: params.role });\n }\n await loadDevices(state);\n } catch (err) {\n state.devicesError = String(err);\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type NodesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n lastError: string | null;\n};\n\nexport async function loadNodes(\n state: NodesState,\n opts?: { quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.nodesLoading) return;\n state.nodesLoading = true;\n if (!opts?.quiet) state.lastError = null;\n try {\n const res = (await state.client.request(\"node.list\", {})) as {\n nodes?: Array<Record<string, unknown>>;\n };\n state.nodes = Array.isArray(res.nodes) ? res.nodes : [];\n } catch (err) {\n if (!opts?.quiet) state.lastError = String(err);\n } finally {\n state.nodesLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { cloneConfigObject, removePathValue, setPathValue } from \"./config/form-utils\";\n\nexport type ExecApprovalsDefaults = {\n security?: string;\n ask?: string;\n askFallback?: string;\n autoAllowSkills?: boolean;\n};\n\nexport type ExecApprovalsAllowlistEntry = {\n id?: string;\n pattern: string;\n lastUsedAt?: number;\n lastUsedCommand?: string;\n lastResolvedPath?: string;\n};\n\nexport type ExecApprovalsAgent = ExecApprovalsDefaults & {\n allowlist?: ExecApprovalsAllowlistEntry[];\n};\n\nexport type ExecApprovalsFile = {\n version?: number;\n socket?: { path?: string };\n defaults?: ExecApprovalsDefaults;\n agents?: Record<string, ExecApprovalsAgent>;\n};\n\nexport type ExecApprovalsSnapshot = {\n path: string;\n exists: boolean;\n hash: string;\n file: ExecApprovalsFile;\n};\n\nexport type ExecApprovalsTarget =\n | { kind: \"gateway\" }\n | { kind: \"node\"; nodeId: string };\n\nexport type ExecApprovalsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n execApprovalsLoading: boolean;\n execApprovalsSaving: boolean;\n execApprovalsDirty: boolean;\n execApprovalsSnapshot: ExecApprovalsSnapshot | null;\n execApprovalsForm: ExecApprovalsFile | null;\n execApprovalsSelectedAgent: string | null;\n lastError: string | null;\n};\n\nfunction resolveExecApprovalsRpc(target?: ExecApprovalsTarget | null): {\n method: string;\n params: Record<string, unknown>;\n} | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.get\", params: {} };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.get\", params: { nodeId } };\n}\n\nfunction resolveExecApprovalsSaveRpc(\n target: ExecApprovalsTarget | null | undefined,\n params: { file: ExecApprovalsFile; baseHash: string },\n): { method: string; params: Record<string, unknown> } | null {\n if (!target || target.kind === \"gateway\") {\n return { method: \"exec.approvals.set\", params };\n }\n const nodeId = target.nodeId.trim();\n if (!nodeId) return null;\n return { method: \"exec.approvals.node.set\", params: { ...params, nodeId } };\n}\n\nexport async function loadExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n if (state.execApprovalsLoading) return;\n state.execApprovalsLoading = true;\n state.lastError = null;\n try {\n const rpc = resolveExecApprovalsRpc(target);\n if (!rpc) {\n state.lastError = \"Select a node before loading exec approvals.\";\n return;\n }\n const res = (await state.client.request(rpc.method, rpc.params)) as ExecApprovalsSnapshot;\n applyExecApprovalsSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsLoading = false;\n }\n}\n\nexport function applyExecApprovalsSnapshot(\n state: ExecApprovalsState,\n snapshot: ExecApprovalsSnapshot,\n) {\n state.execApprovalsSnapshot = snapshot;\n if (!state.execApprovalsDirty) {\n state.execApprovalsForm = cloneConfigObject(snapshot.file ?? {});\n }\n}\n\nexport async function saveExecApprovals(\n state: ExecApprovalsState,\n target?: ExecApprovalsTarget | null,\n) {\n if (!state.client || !state.connected) return;\n state.execApprovalsSaving = true;\n state.lastError = null;\n try {\n const baseHash = state.execApprovalsSnapshot?.hash;\n if (!baseHash) {\n state.lastError = \"Exec approvals hash missing; reload and retry.\";\n return;\n }\n const file =\n state.execApprovalsForm ??\n state.execApprovalsSnapshot?.file ??\n {};\n const rpc = resolveExecApprovalsSaveRpc(target, { file, baseHash });\n if (!rpc) {\n state.lastError = \"Select a node before saving exec approvals.\";\n return;\n }\n await state.client.request(rpc.method, rpc.params);\n state.execApprovalsDirty = false;\n await loadExecApprovals(state, target);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.execApprovalsSaving = false;\n }\n}\n\nexport function updateExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n setPathValue(base, path, value);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n\nexport function removeExecApprovalsFormValue(\n state: ExecApprovalsState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(\n state.execApprovalsForm ?? state.execApprovalsSnapshot?.file ?? {},\n );\n removePathValue(base, path);\n state.execApprovalsForm = base;\n state.execApprovalsDirty = true;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type PresenceState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n};\n\nexport async function loadPresence(state: PresenceState) {\n if (!state.client || !state.connected) return;\n if (state.presenceLoading) return;\n state.presenceLoading = true;\n state.presenceError = null;\n state.presenceStatus = null;\n try {\n const res = (await state.client.request(\"system-presence\", {})) as\n | PresenceEntry[]\n | undefined;\n if (Array.isArray(res)) {\n state.presenceEntries = res;\n state.presenceStatus = res.length === 0 ? \"No instances yet.\" : null;\n } else {\n state.presenceEntries = [];\n state.presenceStatus = \"No presence payload.\";\n }\n } catch (err) {\n state.presenceError = String(err);\n } finally {\n state.presenceLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SkillStatusReport } from \"../types\";\n\nexport type SkillsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsBusyKey: string | null;\n skillEdits: Record<string, string>;\n skillMessages: SkillMessageMap;\n};\n\nexport type SkillMessage = {\n kind: \"success\" | \"error\";\n message: string;\n};\n\nexport type SkillMessageMap = Record<string, SkillMessage>;\n\ntype LoadSkillsOptions = {\n clearMessages?: boolean;\n};\n\nfunction setSkillMessage(state: SkillsState, key: string, message?: SkillMessage) {\n if (!key.trim()) return;\n const next = { ...state.skillMessages };\n if (message) next[key] = message;\n else delete next[key];\n state.skillMessages = next;\n}\n\nfunction getErrorMessage(err: unknown) {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport async function loadSkills(state: SkillsState, options?: LoadSkillsOptions) {\n if (options?.clearMessages && Object.keys(state.skillMessages).length > 0) {\n state.skillMessages = {};\n }\n if (!state.client || !state.connected) return;\n if (state.skillsLoading) return;\n state.skillsLoading = true;\n state.skillsError = null;\n try {\n const res = (await state.client.request(\"skills.status\", {})) as\n | SkillStatusReport\n | undefined;\n if (res) state.skillsReport = res;\n } catch (err) {\n state.skillsError = getErrorMessage(err);\n } finally {\n state.skillsLoading = false;\n }\n}\n\nexport function updateSkillEdit(\n state: SkillsState,\n skillKey: string,\n value: string,\n) {\n state.skillEdits = { ...state.skillEdits, [skillKey]: value };\n}\n\nexport async function updateSkillEnabled(\n state: SkillsState,\n skillKey: string,\n enabled: boolean,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.update\", { skillKey, enabled });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: enabled ? \"Skill enabled\" : \"Skill disabled\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function saveSkillApiKey(state: SkillsState, skillKey: string) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const apiKey = state.skillEdits[skillKey] ?? \"\";\n await state.client.request(\"skills.update\", { skillKey, apiKey });\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: \"API key saved\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function installSkill(\n state: SkillsState,\n skillKey: string,\n name: string,\n installId: string,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const result = (await state.client.request(\"skills.install\", {\n name,\n installId,\n timeoutMs: 120000,\n })) as { ok?: boolean; message?: string };\n await loadSkills(state);\n setSkillMessage(state, skillKey, {\n kind: \"success\",\n message: result?.message ?? \"Installed\",\n });\n } catch (err) {\n const message = getErrorMessage(err);\n state.skillsError = message;\n setSkillMessage(state, skillKey, {\n kind: \"error\",\n message,\n });\n } finally {\n state.skillsBusyKey = null;\n }\n}\n","import type { IconName } from \"./icons.js\";\n\nexport const TAB_GROUPS = [\n { label: \"Chat\", tabs: [\"chat\"] },\n {\n label: \"Control\",\n tabs: [\"overview\", \"channels\", \"instances\", \"cron\"],\n },\n { label: \"Agent\", tabs: [\"skills\", \"nodes\"] },\n { label: \"Settings\", tabs: [\"admins\", \"config\", \"debug\", \"logs\"] },\n] as const;\n\nexport type Tab =\n | \"overview\"\n | \"channels\"\n | \"instances\"\n | \"cron\"\n | \"skills\"\n | \"nodes\"\n | \"chat\"\n | \"admins\"\n | \"config\"\n | \"debug\"\n | \"logs\";\n\nconst TAB_PATHS: Record<Tab, string> = {\n overview: \"/overview\",\n channels: \"/channels\",\n instances: \"/instances\",\n cron: \"/cron\",\n skills: \"/skills\",\n nodes: \"/nodes\",\n chat: \"/chat\",\n admins: \"/admins\",\n config: \"/config\",\n debug: \"/debug\",\n logs: \"/logs\",\n};\n\nconst PATH_TO_TAB = new Map(\n Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab]),\n);\n\nexport function normalizeBasePath(basePath: string): string {\n if (!basePath) return \"\";\n let base = basePath.trim();\n if (!base.startsWith(\"/\")) base = `/${base}`;\n if (base === \"/\") return \"\";\n if (base.endsWith(\"/\")) base = base.slice(0, -1);\n return base;\n}\n\nexport function normalizePath(path: string): string {\n if (!path) return \"/\";\n let normalized = path.trim();\n if (!normalized.startsWith(\"/\")) normalized = `/${normalized}`;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nexport function pathForTab(tab: Tab, basePath = \"\"): string {\n const base = normalizeBasePath(basePath);\n const path = TAB_PATHS[tab];\n return base ? `${base}${path}` : path;\n}\n\nexport function tabFromPath(pathname: string, basePath = \"\"): Tab | null {\n const base = normalizeBasePath(basePath);\n let path = pathname || \"/\";\n if (base) {\n if (path === base) {\n path = \"/\";\n } else if (path.startsWith(`${base}/`)) {\n path = path.slice(base.length);\n }\n }\n let normalized = normalizePath(path).toLowerCase();\n if (normalized.endsWith(\"/index.html\")) normalized = \"/\";\n if (normalized === \"/\") return \"chat\";\n return PATH_TO_TAB.get(normalized) ?? null;\n}\n\nexport function inferBasePathFromPathname(pathname: string): string {\n let normalized = normalizePath(pathname);\n if (normalized.endsWith(\"/index.html\")) {\n normalized = normalizePath(normalized.slice(0, -\"/index.html\".length));\n }\n if (normalized === \"/\") return \"\";\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return \"\";\n for (let i = 0; i < segments.length; i++) {\n const candidate = `/${segments.slice(i).join(\"/\")}`.toLowerCase();\n if (PATH_TO_TAB.has(candidate)) {\n const prefix = segments.slice(0, i);\n return prefix.length ? `/${prefix.join(\"/\")}` : \"\";\n }\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function iconForTab(tab: Tab): IconName {\n switch (tab) {\n case \"chat\":\n return \"messageSquare\";\n case \"overview\":\n return \"barChart\";\n case \"channels\":\n return \"link\";\n case \"instances\":\n return \"radio\";\n case \"cron\":\n return \"loader\";\n case \"skills\":\n return \"zap\";\n case \"nodes\":\n return \"monitor\";\n case \"admins\":\n return \"users\";\n case \"config\":\n return \"settings\";\n case \"debug\":\n return \"bug\";\n case \"logs\":\n return \"scrollText\";\n default:\n return \"folder\";\n }\n}\n\nexport function titleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Overview\";\n case \"channels\":\n return \"Channels\";\n case \"instances\":\n return \"Instances\";\n case \"cron\":\n return \"Events\";\n case \"skills\":\n return \"Skills\";\n case \"nodes\":\n return \"Nodes\";\n case \"chat\":\n return \"Chat\";\n case \"admins\":\n return \"Admins\";\n case \"config\":\n return \"Config\";\n case \"debug\":\n return \"Debug\";\n case \"logs\":\n return \"Logs\";\n default:\n return \"Control\";\n }\n}\n\nexport function subtitleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Gateway status, entry points, and a fast health read.\";\n case \"channels\":\n return \"Manage channels and settings.\";\n case \"instances\":\n return \"Presence beacons from connected clients and nodes.\";\n case \"cron\":\n return \"Reminders, recurring tasks, and automated routines.\";\n case \"skills\":\n return \"Manage skill availability and API key injection.\";\n case \"nodes\":\n return \"Paired devices, capabilities, and command exposure.\";\n case \"chat\":\n return \"Direct gateway chat session for quick interventions.\";\n case \"admins\":\n return \"Manage admin phone numbers for WhatsApp routing.\";\n case \"config\":\n return \"Edit ~/.taskmaster/taskmaster.json safely.\";\n case \"debug\":\n return \"Gateway snapshots, events, and manual RPC calls.\";\n case \"logs\":\n return \"Session transcripts and system logs.\";\n default:\n return \"\";\n }\n}\n","export type ThemeMode = \"system\" | \"light\" | \"dark\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport function getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"dark\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function resolveTheme(mode: ThemeMode): ResolvedTheme {\n if (mode === \"system\") return getSystemTheme();\n return mode;\n}\n","import type { ThemeMode } from \"./theme\";\n\nexport type ThemeTransitionContext = {\n element?: HTMLElement | null;\n pointerClientX?: number;\n pointerClientY?: number;\n};\n\nexport type ThemeTransitionOptions = {\n nextTheme: ThemeMode;\n applyTheme: () => void;\n context?: ThemeTransitionContext;\n currentTheme?: ThemeMode | null;\n};\n\ntype DocumentWithViewTransition = Document & {\n startViewTransition?: (callback: () => void) => { finished: Promise<void> };\n};\n\nconst clamp01 = (value: number) => {\n if (Number.isNaN(value)) return 0.5;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n};\n\nconst hasReducedMotionPreference = () => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n};\n\nconst cleanupThemeTransition = (root: HTMLElement) => {\n root.classList.remove(\"theme-transition\");\n root.style.removeProperty(\"--theme-switch-x\");\n root.style.removeProperty(\"--theme-switch-y\");\n};\n\nexport const startThemeTransition = ({\n nextTheme,\n applyTheme,\n context,\n currentTheme,\n}: ThemeTransitionOptions) => {\n if (currentTheme === nextTheme) return;\n\n const documentReference = globalThis.document ?? null;\n if (!documentReference) {\n applyTheme();\n return;\n }\n\n const root = documentReference.documentElement;\n const document_ = documentReference as DocumentWithViewTransition;\n const prefersReducedMotion = hasReducedMotionPreference();\n\n const canUseViewTransition =\n Boolean(document_.startViewTransition) && !prefersReducedMotion;\n\n if (canUseViewTransition) {\n let xPercent = 0.5;\n let yPercent = 0.5;\n\n if (\n context?.pointerClientX !== undefined &&\n context?.pointerClientY !== undefined &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01(context.pointerClientX / window.innerWidth);\n yPercent = clamp01(context.pointerClientY / window.innerHeight);\n } else if (context?.element) {\n const rect = context.element.getBoundingClientRect();\n if (\n rect.width > 0 &&\n rect.height > 0 &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01((rect.left + rect.width / 2) / window.innerWidth);\n yPercent = clamp01((rect.top + rect.height / 2) / window.innerHeight);\n }\n }\n\n root.style.setProperty(\"--theme-switch-x\", `${xPercent * 100}%`);\n root.style.setProperty(\"--theme-switch-y\", `${yPercent * 100}%`);\n root.classList.add(\"theme-transition\");\n\n try {\n const transition = document_.startViewTransition?.(() => {\n applyTheme();\n });\n if (transition?.finished) {\n void transition.finished.finally(() => cleanupThemeTransition(root));\n } else {\n cleanupThemeTransition(root);\n }\n } catch {\n cleanupThemeTransition(root);\n applyTheme();\n }\n return;\n }\n\n applyTheme();\n cleanupThemeTransition(root);\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SessionTranscriptEntry } from \"../types\";\n\nexport type SessionLogsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionLogsLoading: boolean;\n sessionLogsError: string | null;\n sessionLogsEntries: SessionTranscriptEntry[];\n sessionLogsCursors: Record<string, number>;\n sessionLogsAgents: string[];\n sessionLogsLastFetchAt: number | null;\n};\n\nconst SESSION_LOG_BUFFER_LIMIT = 2000;\n\nexport async function loadSessionLogs(\n state: SessionLogsState,\n opts?: { reset?: boolean; quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.sessionLogsLoading && !opts?.quiet) return;\n if (!opts?.quiet) state.sessionLogsLoading = true;\n state.sessionLogsError = null;\n try {\n const res = await state.client.request(\"sessions.transcript\", {\n cursors: opts?.reset ? undefined : state.sessionLogsCursors,\n limit: 200,\n maxBytesPerFile: 50_000,\n });\n const payload = res as {\n entries?: unknown;\n cursors?: Record<string, number>;\n agents?: string[];\n };\n const entries = Array.isArray(payload.entries)\n ? (payload.entries as SessionTranscriptEntry[])\n : [];\n const shouldReset = Boolean(\n opts?.reset || Object.keys(state.sessionLogsCursors).length === 0,\n );\n state.sessionLogsEntries = shouldReset\n ? entries\n : [...state.sessionLogsEntries, ...entries].slice(-SESSION_LOG_BUFFER_LIMIT);\n if (payload.cursors) state.sessionLogsCursors = payload.cursors;\n if (Array.isArray(payload.agents)) state.sessionLogsAgents = payload.agents;\n state.sessionLogsLastFetchAt = Date.now();\n } catch (err) {\n state.sessionLogsError = String(err);\n } finally {\n if (!opts?.quiet) state.sessionLogsLoading = false;\n }\n}\n","import { loadLogs } from \"./controllers/logs\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadDebug } from \"./controllers/debug\";\nimport { loadSessionLogs } from \"./controllers/session-logs\";\nimport type { TaskmasterApp } from \"./app\";\n\ntype PollingHost = {\n nodesPollInterval: number | null;\n logsPollInterval: number | null;\n debugPollInterval: number | null;\n tab: string;\n};\n\nexport function startNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval != null) return;\n host.nodesPollInterval = window.setInterval(\n () => void loadNodes(host as unknown as TaskmasterApp, { quiet: true }),\n 5000,\n );\n}\n\nexport function stopNodesPolling(host: PollingHost) {\n if (host.nodesPollInterval == null) return;\n clearInterval(host.nodesPollInterval);\n host.nodesPollInterval = null;\n}\n\nexport function startLogsPolling(host: PollingHost) {\n if (host.logsPollInterval != null) return;\n host.logsPollInterval = window.setInterval(() => {\n if (host.tab !== \"logs\") return;\n void loadLogs(host as unknown as TaskmasterApp, { quiet: true });\n }, 2000);\n}\n\nexport function stopLogsPolling(host: PollingHost) {\n if (host.logsPollInterval == null) return;\n clearInterval(host.logsPollInterval);\n host.logsPollInterval = null;\n}\n\nexport function startSessionLogsPolling(host: PollingHost & { sessionLogsPollInterval?: number | null; logsSubTab?: string }) {\n if (host.sessionLogsPollInterval != null) return;\n host.sessionLogsPollInterval = window.setInterval(() => {\n if (host.tab !== \"logs\" || host.logsSubTab !== \"session\") return;\n void loadSessionLogs(host as unknown as TaskmasterApp, { quiet: true });\n }, 2000);\n}\n\nexport function stopSessionLogsPolling(host: { sessionLogsPollInterval?: number | null }) {\n if (host.sessionLogsPollInterval == null) return;\n clearInterval(host.sessionLogsPollInterval);\n host.sessionLogsPollInterval = null;\n}\n\nexport function startDebugPolling(host: PollingHost) {\n if (host.debugPollInterval != null) return;\n host.debugPollInterval = window.setInterval(() => {\n if (host.tab !== \"debug\") return;\n void loadDebug(host as unknown as TaskmasterApp);\n }, 3000);\n}\n\nexport function stopDebugPolling(host: PollingHost) {\n if (host.debugPollInterval == null) return;\n clearInterval(host.debugPollInterval);\n host.debugPollInterval = null;\n}\n","import { loadConfig, loadConfigSchema } from \"./controllers/config\";\nimport { loadCronJobs, loadCronStatus } from \"./controllers/cron\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { loadDebug } from \"./controllers/debug\";\nimport { loadLogs } from \"./controllers/logs\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadExecApprovals } from \"./controllers/exec-approvals\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { loadSkills } from \"./controllers/skills\";\nimport { inferBasePathFromPathname, normalizeBasePath, normalizePath, pathForTab, tabFromPath, type Tab } from \"./navigation\";\nimport { saveSettings, type UiSettings } from \"./storage\";\nimport { resolveTheme, type ResolvedTheme, type ThemeMode } from \"./theme\";\nimport { startThemeTransition, type ThemeTransitionContext } from \"./theme-transition\";\nimport { scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport { startLogsPolling, stopLogsPolling, startDebugPolling, stopDebugPolling, startSessionLogsPolling, stopSessionLogsPolling } from \"./app-polling\";\nimport { refreshChat } from \"./app-chat\";\nimport type { TaskmasterApp } from \"./app\";\n\ntype SettingsHost = {\n settings: UiSettings;\n theme: ThemeMode;\n themeResolved: ResolvedTheme;\n applySessionKey: string;\n sessionKey: string;\n tab: Tab;\n connected: boolean;\n chatHasAutoScrolled: boolean;\n logsAtBottom: boolean;\n eventLog: unknown[];\n eventLogBuffer: unknown[];\n basePath: string;\n themeMedia: MediaQueryList | null;\n themeMediaHandler: ((event: MediaQueryListEvent) => void) | null;\n advancedPage?: boolean;\n chatPage?: boolean;\n};\n\nexport function applySettings(host: SettingsHost, next: UiSettings) {\n const normalized = {\n ...next,\n lastActiveSessionKey: next.lastActiveSessionKey?.trim() || next.sessionKey.trim() || \"main\",\n };\n host.settings = normalized;\n saveSettings(normalized);\n if (next.theme !== host.theme) {\n host.theme = next.theme;\n applyResolvedTheme(host, resolveTheme(next.theme));\n }\n host.applySessionKey = host.settings.lastActiveSessionKey;\n}\n\nexport function setLastActiveSessionKey(host: SettingsHost, next: string) {\n const trimmed = next.trim();\n if (!trimmed) return;\n if (host.settings.lastActiveSessionKey === trimmed) return;\n applySettings(host, { ...host.settings, lastActiveSessionKey: trimmed });\n}\n\nexport function applySettingsFromUrl(host: SettingsHost) {\n if (!window.location.search) return;\n const params = new URLSearchParams(window.location.search);\n const tokenRaw = params.get(\"token\");\n const passwordRaw = params.get(\"password\");\n const sessionRaw = params.get(\"session\");\n const gatewayUrlRaw = params.get(\"gatewayUrl\");\n let shouldCleanUrl = false;\n\n if (tokenRaw != null) {\n const token = tokenRaw.trim();\n if (token && token !== host.settings.token) {\n applySettings(host, { ...host.settings, token });\n }\n params.delete(\"token\");\n shouldCleanUrl = true;\n }\n\n if (passwordRaw != null) {\n const password = passwordRaw.trim();\n if (password) {\n (host as { password: string }).password = password;\n }\n params.delete(\"password\");\n shouldCleanUrl = true;\n }\n\n if (sessionRaw != null) {\n const session = sessionRaw.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n }\n\n if (gatewayUrlRaw != null) {\n const gatewayUrl = gatewayUrlRaw.trim();\n if (gatewayUrl && gatewayUrl !== host.settings.gatewayUrl) {\n applySettings(host, { ...host.settings, gatewayUrl });\n }\n params.delete(\"gatewayUrl\");\n shouldCleanUrl = true;\n }\n\n if (!shouldCleanUrl) return;\n const url = new URL(window.location.href);\n url.search = params.toString();\n window.history.replaceState({}, \"\", url.toString());\n}\n\nexport function setTab(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\") {\n const subTab = (host as unknown as { logsSubTab?: string }).logsSubTab;\n if (subTab === \"session\") {\n startSessionLogsPolling(host as unknown as Parameters<typeof startSessionLogsPolling>[0]);\n } else {\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n }\n } else {\n stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n stopSessionLogsPolling(host as unknown as Parameters<typeof stopSessionLogsPolling>[0]);\n }\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n void refreshActiveTab(host);\n syncUrlWithTab(host, next, false);\n}\n\nexport function setTheme(\n host: SettingsHost,\n next: ThemeMode,\n context?: ThemeTransitionContext,\n) {\n const applyTheme = () => {\n host.theme = next;\n applySettings(host, { ...host.settings, theme: next });\n applyResolvedTheme(host, resolveTheme(next));\n };\n startThemeTransition({\n nextTheme: next,\n applyTheme,\n context,\n currentTheme: host.theme,\n });\n}\n\nexport async function refreshActiveTab(host: SettingsHost) {\n if (host.tab === \"overview\") await loadOverview(host);\n if (host.tab === \"channels\") await loadChannelsTab(host);\n if (host.tab === \"instances\") await loadPresence(host as unknown as TaskmasterApp);\n if (host.tab === \"cron\") await loadCron(host);\n if (host.tab === \"skills\") await loadSkills(host as unknown as TaskmasterApp);\n if (host.tab === \"nodes\") {\n await loadNodes(host as unknown as TaskmasterApp);\n await loadDevices(host as unknown as TaskmasterApp);\n await loadConfig(host as unknown as TaskmasterApp);\n await loadExecApprovals(host as unknown as TaskmasterApp);\n }\n // For standalone chat page, skip early refresh — initWorkspaceSelection()\n // will call handleChatLoad() after workspaces are loaded with the correct\n // session key for the selected business.\n if (host.tab === \"chat\" && !host.advancedPage && !host.chatPage) {\n await refreshChat(host as unknown as Parameters<typeof refreshChat>[0]);\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n !host.chatHasAutoScrolled,\n );\n }\n if (host.tab === \"config\") {\n await loadConfigSchema(host as unknown as TaskmasterApp);\n await loadConfig(host as unknown as TaskmasterApp);\n }\n if (host.tab === \"debug\") {\n await loadDebug(host as unknown as TaskmasterApp);\n host.eventLog = host.eventLogBuffer;\n }\n if (host.tab === \"logs\") {\n host.logsAtBottom = true;\n const subTab = (host as unknown as { logsSubTab?: string }).logsSubTab;\n if (subTab === \"session\") {\n const { loadSessionLogs } = await import(\"./controllers/session-logs\");\n await loadSessionLogs(host as unknown as Parameters<typeof loadSessionLogs>[0], { reset: true });\n } else {\n await loadLogs(host as unknown as TaskmasterApp, { reset: true });\n }\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n true,\n );\n }\n}\n\nexport function inferBasePath() {\n if (typeof window === \"undefined\") return \"\";\n const configured = window.__TASKMASTER_CONTROL_UI_BASE_PATH__;\n if (typeof configured === \"string\" && configured.trim()) {\n return normalizeBasePath(configured);\n }\n return inferBasePathFromPathname(window.location.pathname);\n}\n\nexport function syncThemeWithSettings(host: SettingsHost) {\n host.theme = host.settings.theme ?? \"system\";\n applyResolvedTheme(host, resolveTheme(host.theme));\n}\n\nexport function applyResolvedTheme(host: SettingsHost, resolved: ResolvedTheme) {\n host.themeResolved = resolved;\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.dataset.theme = resolved;\n root.style.colorScheme = resolved;\n}\n\nexport function attachThemeListener(host: SettingsHost) {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n host.themeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n host.themeMediaHandler = (event) => {\n if (host.theme !== \"system\") return;\n applyResolvedTheme(host, event.matches ? \"dark\" : \"light\");\n };\n if (typeof host.themeMedia.addEventListener === \"function\") {\n host.themeMedia.addEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n addListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.addListener(host.themeMediaHandler);\n}\n\nexport function detachThemeListener(host: SettingsHost) {\n if (!host.themeMedia || !host.themeMediaHandler) return;\n if (typeof host.themeMedia.removeEventListener === \"function\") {\n host.themeMedia.removeEventListener(\"change\", host.themeMediaHandler);\n return;\n }\n const legacy = host.themeMedia as MediaQueryList & {\n removeListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.removeListener(host.themeMediaHandler);\n host.themeMedia = null;\n host.themeMediaHandler = null;\n}\n\nexport function syncTabWithLocation(host: SettingsHost, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath) ?? \"chat\";\n setTabFromRoute(host, resolved);\n syncUrlWithTab(host, resolved, replace);\n}\n\nexport function onPopState(host: SettingsHost) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, host.basePath);\n if (!resolved) return;\n\n const url = new URL(window.location.href);\n const session = url.searchParams.get(\"session\")?.trim();\n if (session) {\n host.sessionKey = session;\n applySettings(host, {\n ...host.settings,\n sessionKey: session,\n lastActiveSessionKey: session,\n });\n }\n\n setTabFromRoute(host, resolved);\n}\n\nexport function setTabFromRoute(host: SettingsHost, next: Tab) {\n if (host.tab !== next) host.tab = next;\n if (next === \"chat\") host.chatHasAutoScrolled = false;\n if (next === \"logs\") {\n const subTab = (host as unknown as { logsSubTab?: string }).logsSubTab;\n if (subTab === \"session\") {\n startSessionLogsPolling(host as unknown as Parameters<typeof startSessionLogsPolling>[0]);\n } else {\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n }\n } else {\n stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n stopSessionLogsPolling(host as unknown as Parameters<typeof stopSessionLogsPolling>[0]);\n }\n if (next === \"debug\")\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n else stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n if (host.connected) void refreshActiveTab(host);\n}\n\nexport function syncUrlWithTab(host: SettingsHost, tab: Tab, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const targetPath = normalizePath(pathForTab(tab, host.basePath));\n const currentPath = normalizePath(window.location.pathname);\n const url = new URL(window.location.href);\n\n if (tab === \"chat\" && host.sessionKey) {\n url.searchParams.set(\"session\", host.sessionKey);\n } else {\n url.searchParams.delete(\"session\");\n }\n\n if (currentPath !== targetPath) {\n url.pathname = targetPath;\n }\n\n if (replace) {\n window.history.replaceState({}, \"\", url.toString());\n } else {\n window.history.pushState({}, \"\", url.toString());\n }\n}\n\nexport function syncUrlWithSessionKey(\n host: SettingsHost,\n sessionKey: string,\n replace: boolean,\n) {\n if (typeof window === \"undefined\") return;\n const url = new URL(window.location.href);\n url.searchParams.set(\"session\", sessionKey);\n if (replace) window.history.replaceState({}, \"\", url.toString());\n else window.history.pushState({}, \"\", url.toString());\n}\n\nexport async function loadOverview(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as TaskmasterApp, false),\n loadPresence(host as unknown as TaskmasterApp),\n loadSessions(host as unknown as TaskmasterApp),\n loadCronStatus(host as unknown as TaskmasterApp),\n loadDebug(host as unknown as TaskmasterApp),\n ]);\n}\n\nexport async function loadChannelsTab(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as TaskmasterApp, true),\n loadConfigSchema(host as unknown as TaskmasterApp),\n loadConfig(host as unknown as TaskmasterApp),\n ]);\n}\n\nexport async function loadCron(host: SettingsHost) {\n await Promise.all([\n loadChannels(host as unknown as TaskmasterApp, false),\n loadCronStatus(host as unknown as TaskmasterApp),\n loadCronJobs(host as unknown as TaskmasterApp),\n ]);\n}\n","import { abortChatRun, loadChatHistory, sendChatMessage } from \"./controllers/chat\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport { generateUUID } from \"./uuid\";\nimport { resetToolStream } from \"./app-tool-stream\";\nimport { scheduleChatScroll } from \"./app-scroll\";\nimport { setLastActiveSessionKey } from \"./app-settings\";\nimport { normalizeBasePath } from \"./navigation\";\nimport type { GatewayHelloOk } from \"./gateway\";\nimport { parseAgentSessionKey } from \"../../../src/sessions/session-key-utils.js\";\nimport type { TaskmasterApp } from \"./app\";\nimport type { ChatAttachment, ChatQueueItem } from \"./ui-types\";\n\ntype ChatHost = {\n connected: boolean;\n chatMessage: string;\n chatAttachments: ChatAttachment[];\n chatQueue: ChatQueueItem[];\n chatRunId: string | null;\n chatSending: boolean;\n sessionKey: string;\n basePath: string;\n hello: GatewayHelloOk | null;\n chatAvatarUrl: string | null;\n};\n\nexport function isChatBusy(host: ChatHost) {\n return host.chatSending || Boolean(host.chatRunId);\n}\n\nexport function isChatStopCommand(text: string) {\n const trimmed = text.trim();\n if (!trimmed) return false;\n const normalized = trimmed.toLowerCase();\n if (normalized === \"/stop\") return true;\n return (\n normalized === \"stop\" ||\n normalized === \"esc\" ||\n normalized === \"abort\" ||\n normalized === \"wait\" ||\n normalized === \"exit\"\n );\n}\n\nexport async function handleAbortChat(host: ChatHost) {\n if (!host.connected) return;\n host.chatMessage = \"\";\n await abortChatRun(host as unknown as TaskmasterApp);\n}\n\nfunction enqueueChatMessage(host: ChatHost, text: string, attachments?: ChatAttachment[]) {\n const trimmed = text.trim();\n const hasAttachments = Boolean(attachments && attachments.length > 0);\n if (!trimmed && !hasAttachments) return;\n host.chatQueue = [\n ...host.chatQueue,\n {\n id: generateUUID(),\n text: trimmed,\n createdAt: Date.now(),\n attachments: hasAttachments ? attachments?.map((att) => ({ ...att })) : undefined,\n },\n ];\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0]);\n}\n\nasync function sendChatMessageNow(\n host: ChatHost,\n message: string,\n opts?: {\n previousDraft?: string;\n restoreDraft?: boolean;\n attachments?: ChatAttachment[];\n previousAttachments?: ChatAttachment[];\n restoreAttachments?: boolean;\n },\n) {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n const ok = await sendChatMessage(host as unknown as TaskmasterApp, message, opts?.attachments);\n if (!ok && opts?.previousDraft != null) {\n host.chatMessage = opts.previousDraft;\n }\n if (!ok && opts?.previousAttachments) {\n host.chatAttachments = opts.previousAttachments;\n }\n if (ok) {\n setLastActiveSessionKey(host as unknown as Parameters<typeof setLastActiveSessionKey>[0], host.sessionKey);\n }\n if (ok && opts?.restoreDraft && opts.previousDraft?.trim()) {\n host.chatMessage = opts.previousDraft;\n }\n if (ok && opts?.restoreAttachments && opts.previousAttachments?.length) {\n host.chatAttachments = opts.previousAttachments;\n }\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0]);\n if (ok && !host.chatRunId) {\n void flushChatQueue(host);\n }\n return ok;\n}\n\nasync function flushChatQueue(host: ChatHost) {\n if (!host.connected || isChatBusy(host)) return;\n const [next, ...rest] = host.chatQueue;\n if (!next) return;\n host.chatQueue = rest;\n const ok = await sendChatMessageNow(host, next.text, { attachments: next.attachments });\n if (!ok) {\n host.chatQueue = [next, ...host.chatQueue];\n }\n}\n\nexport function removeQueuedMessage(host: ChatHost, id: string) {\n host.chatQueue = host.chatQueue.filter((item) => item.id !== id);\n}\n\nexport async function handleSendChat(\n host: ChatHost,\n messageOverride?: string,\n opts?: { restoreDraft?: boolean },\n) {\n if (!host.connected) return;\n const previousDraft = host.chatMessage;\n const message = (messageOverride ?? host.chatMessage).trim();\n const attachments = host.chatAttachments ?? [];\n const attachmentsToSend = messageOverride == null ? attachments : [];\n const hasAttachments = attachmentsToSend.length > 0;\n\n // Allow sending with just attachments (no message text required)\n if (!message && !hasAttachments) return;\n\n if (isChatStopCommand(message)) {\n await handleAbortChat(host);\n return;\n }\n\n if (messageOverride == null) {\n host.chatMessage = \"\";\n // Clear attachments when sending\n host.chatAttachments = [];\n }\n\n if (isChatBusy(host)) {\n enqueueChatMessage(host, message, attachmentsToSend);\n return;\n }\n\n await sendChatMessageNow(host, message, {\n previousDraft: messageOverride == null ? previousDraft : undefined,\n restoreDraft: Boolean(messageOverride && opts?.restoreDraft),\n attachments: hasAttachments ? attachmentsToSend : undefined,\n previousAttachments: messageOverride == null ? attachments : undefined,\n restoreAttachments: Boolean(messageOverride && opts?.restoreDraft),\n });\n}\n\nexport async function refreshChat(host: ChatHost) {\n await Promise.all([\n loadChatHistory(host as unknown as TaskmasterApp),\n loadSessions(host as unknown as TaskmasterApp),\n refreshChatAvatar(host),\n ]);\n scheduleChatScroll(host as unknown as Parameters<typeof scheduleChatScroll>[0], true);\n}\n\nexport const flushChatQueueForEvent = flushChatQueue;\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n};\n\nfunction resolveAgentIdForSession(host: ChatHost): string | null {\n const parsed = parseAgentSessionKey(host.sessionKey);\n if (parsed?.agentId) return parsed.agentId;\n const snapshot = host.hello?.snapshot as { sessionDefaults?: SessionDefaultsSnapshot } | undefined;\n const fallback = snapshot?.sessionDefaults?.defaultAgentId?.trim();\n return fallback || \"main\";\n}\n\nfunction buildAvatarMetaUrl(basePath: string, agentId: string): string {\n const base = normalizeBasePath(basePath);\n const encoded = encodeURIComponent(agentId);\n return base ? `${base}/avatar/${encoded}?meta=1` : `/avatar/${encoded}?meta=1`;\n}\n\nexport async function refreshChatAvatar(host: ChatHost) {\n if (!host.connected) {\n host.chatAvatarUrl = null;\n return;\n }\n const agentId = resolveAgentIdForSession(host);\n if (!agentId) {\n host.chatAvatarUrl = null;\n return;\n }\n host.chatAvatarUrl = null;\n const url = buildAvatarMetaUrl(host.basePath, agentId);\n try {\n const res = await fetch(url, { method: \"GET\" });\n if (!res.ok) {\n host.chatAvatarUrl = null;\n return;\n }\n const data = (await res.json()) as { avatarUrl?: unknown };\n const avatarUrl = typeof data.avatarUrl === \"string\" ? data.avatarUrl.trim() : \"\";\n host.chatAvatarUrl = avatarUrl || null;\n } catch {\n host.chatAvatarUrl = null;\n }\n}\n","import { html, type TemplateResult } from \"lit\";\n\n// Lucide-style SVG icons\n// All icons use currentColor for stroke\n\nexport const icons = {\n // Navigation icons\n messageSquare: html`<svg viewBox=\"0 0 24 24\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`,\n barChart: html`<svg viewBox=\"0 0 24 24\"><line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"10\"/><line x1=\"18\" x2=\"18\" y1=\"20\" y2=\"4\"/><line x1=\"6\" x2=\"6\" y1=\"20\" y2=\"16\"/></svg>`,\n link: html`<svg viewBox=\"0 0 24 24\"><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></svg>`,\n radio: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\"/></svg>`,\n fileText: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/><line x1=\"16\" x2=\"8\" y1=\"13\" y2=\"13\"/><line x1=\"16\" x2=\"8\" y1=\"17\" y2=\"17\"/><line x1=\"10\" x2=\"8\" y1=\"9\" y2=\"9\"/></svg>`,\n zap: html`<svg viewBox=\"0 0 24 24\"><polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/></svg>`,\n monitor: html`<svg viewBox=\"0 0 24 24\"><rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/><line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"/><line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"/></svg>`,\n settings: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`,\n bug: html`<svg viewBox=\"0 0 24 24\"><path d=\"m8 2 1.88 1.88\"/><path d=\"M14.12 3.88 16 2\"/><path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\"/><path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\"/><path d=\"M12 20v-9\"/><path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\"/><path d=\"M6 13H2\"/><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\"/><path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\"/><path d=\"M22 13h-4\"/><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\"/></svg>`,\n scrollText: html`<svg viewBox=\"0 0 24 24\"><path d=\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\"/><path d=\"M19 17V5a2 2 0 0 0-2-2H4\"/><path d=\"M15 8h-5\"/><path d=\"M15 12h-5\"/></svg>`,\n folder: html`<svg viewBox=\"0 0 24 24\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"/></svg>`,\n users: html`<svg viewBox=\"0 0 24 24\"><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87\"/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/></svg>`,\n\n // UI icons\n menu: html`<svg viewBox=\"0 0 24 24\"><line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\"/><line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\"/><line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\"/></svg>`,\n x: html`<svg viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n check: html`<svg viewBox=\"0 0 24 24\"><path d=\"M20 6 9 17l-5-5\"/></svg>`,\n copy: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`,\n search: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.3-4.3\"/></svg>`,\n brain: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z\"/><path d=\"M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4\"/><path d=\"M17.599 6.5a3 3 0 0 0 .399-1.375\"/><path d=\"M6.003 5.125A3 3 0 0 0 6.401 6.5\"/><path d=\"M3.477 10.896a4 4 0 0 1 .585-.396\"/><path d=\"M19.938 10.5a4 4 0 0 1 .585.396\"/><path d=\"M6 18a4 4 0 0 1-1.967-.516\"/><path d=\"M19.967 17.484A4 4 0 0 1 18 18\"/></svg>`,\n book: html`<svg viewBox=\"0 0 24 24\"><path d=\"M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20\"/></svg>`,\n loader: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 2v4\"/><path d=\"m16.2 7.8 2.9-2.9\"/><path d=\"M18 12h4\"/><path d=\"m16.2 16.2 2.9 2.9\"/><path d=\"M12 18v4\"/><path d=\"m4.9 19.1 2.9-2.9\"/><path d=\"M2 12h4\"/><path d=\"m4.9 4.9 2.9 2.9\"/></svg>`,\n rotateCw: html`<svg viewBox=\"0 0 24 24\"><path d=\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\"/><path d=\"M21 3v5h-5\"/></svg>`,\n download: html`<svg viewBox=\"0 0 24 24\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><polyline points=\"7 10 12 15 17 10\"/><line x1=\"12\" x2=\"12\" y1=\"15\" y2=\"3\"/></svg>`,\n\n // Tool icons\n wrench: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\"/></svg>`,\n fileCode: html`<svg viewBox=\"0 0 24 24\"><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/><polyline points=\"14 2 14 8 20 8\"/><path d=\"m10 13-2 2 2 2\"/><path d=\"m14 17 2-2-2-2\"/></svg>`,\n edit: html`<svg viewBox=\"0 0 24 24\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>`,\n penLine: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 20h9\"/><path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"/></svg>`,\n paperclip: html`<svg viewBox=\"0 0 24 24\"><path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\"/></svg>`,\n globe: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/></svg>`,\n image: html`<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/><path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\"/></svg>`,\n smartphone: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\"/><path d=\"M12 18h.01\"/></svg>`,\n plug: html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 22v-5\"/><path d=\"M9 8V2\"/><path d=\"M15 8V2\"/><path d=\"M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z\"/></svg>`,\n circle: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/></svg>`,\n puzzle: html`<svg viewBox=\"0 0 24 24\"><path d=\"M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.076.874.54 1.02 1.02a2.5 2.5 0 1 0 3.237-3.237c-.48-.146-.944-.505-1.02-1.02a.98.98 0 0 1 .303-.917l1.526-1.526A2.402 2.402 0 0 1 11.998 2c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.236 3.236c-.464.18-.894.527-.967 1.02Z\"/></svg>`,\n info: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/></svg>`,\n send: html`<svg viewBox=\"0 0 24 24\"><path d=\"m22 2-7 20-4-9-9-4Z\"/><path d=\"M22 2 11 13\"/></svg>`,\n smile: html`<svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M8 14s1.5 2 4 2 4-2 4-2\"/><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"/><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"/></svg>`,\n slidersHorizontal: html`<svg viewBox=\"0 0 24 24\"><line x1=\"21\" x2=\"14\" y1=\"4\" y2=\"4\"/><line x1=\"10\" x2=\"3\" y1=\"4\" y2=\"4\"/><line x1=\"21\" x2=\"12\" y1=\"12\" y2=\"12\"/><line x1=\"8\" x2=\"3\" y1=\"12\" y2=\"12\"/><line x1=\"21\" x2=\"16\" y1=\"20\" y2=\"20\"/><line x1=\"12\" x2=\"3\" y1=\"20\" y2=\"20\"/><line x1=\"14\" x2=\"14\" y1=\"2\" y2=\"6\"/><line x1=\"8\" x2=\"8\" y1=\"10\" y2=\"14\"/><line x1=\"16\" x2=\"16\" y1=\"18\" y2=\"22\"/></svg>`,\n square: html`<svg viewBox=\"0 0 24 24\"><rect width=\"14\" height=\"14\" x=\"5\" y=\"5\" rx=\"2\"/></svg>`,\n eye: html`<svg viewBox=\"0 0 24 24\"><path d=\"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>`,\n eyeOff: html`<svg viewBox=\"0 0 24 24\"><path d=\"M9.88 9.88a3 3 0 1 0 4.24 4.24\"/><path d=\"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\"/><path d=\"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\"/><line x1=\"2\" x2=\"22\" y1=\"2\" y2=\"22\"/></svg>`,\n trash: html`<svg viewBox=\"0 0 24 24\"><path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/></svg>`,\n chevronDown: html`<svg viewBox=\"0 0 24 24\"><path d=\"m6 9 6 6 6-6\"/></svg>`,\n film: html`<svg viewBox=\"0 0 24 24\"><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"/><path d=\"M7 3v18\"/><path d=\"M3 7.5h4\"/><path d=\"M3 12h18\"/><path d=\"M3 16.5h4\"/><path d=\"M17 3v18\"/><path d=\"M17 7.5h4\"/><path d=\"M17 16.5h4\"/></svg>`,\n} as const;\n\nexport type IconName = keyof typeof icons;\n\nexport function icon(name: IconName): TemplateResult {\n return icons[name];\n}\n\nexport function renderIcon(name: IconName, className = \"nav-item__icon\"): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${icons[name]}</span>`;\n}\n\n// Legacy function for compatibility\nexport function renderEmojiIcon(iconContent: string | TemplateResult, className: string): TemplateResult {\n return html`<span class=${className} aria-hidden=\"true\">${iconContent}</span>`;\n}\n\nexport function setEmojiIcon(target: HTMLElement | null, icon: string): void {\n if (!target) return;\n target.textContent = icon;\n}\n","/**\n * Per-device product branding.\n *\n * Reads window globals injected by the gateway (control-ui.ts) and exposes\n * the resolved brand identity + a helper to apply the accent color as CSS\n * custom properties on :root.\n */\n\ndeclare global {\n interface Window {\n __TASKMASTER_BRAND_NAME__?: string;\n __TASKMASTER_BRAND_ICON_URL__?: string;\n __TASKMASTER_ACCENT_COLOR__?: string;\n }\n}\n\nexport type BrandIdentity = {\n name: string;\n iconUrl: string;\n accentColor: string;\n};\n\nconst DEFAULT_BRAND_NAME = \"Taskmaster\";\nconst DEFAULT_BRAND_ICON_URL = \"/taskmaster-icon.png\";\nconst DEFAULT_ACCENT_COLOR = \"#00d4ff\";\n\nlet cached: BrandIdentity | null = null;\n\n/** Read brand identity from injected window globals (cached after first call). */\nexport function resolveBrand(): BrandIdentity {\n if (cached) return cached;\n cached = {\n name: window.__TASKMASTER_BRAND_NAME__ || DEFAULT_BRAND_NAME,\n iconUrl: window.__TASKMASTER_BRAND_ICON_URL__ || DEFAULT_BRAND_ICON_URL,\n accentColor: window.__TASKMASTER_ACCENT_COLOR__ || DEFAULT_ACCENT_COLOR,\n };\n return cached;\n}\n\n/**\n * Hex → rgba helper (e.g. \"#f59e0b\" → \"245, 158, 11\").\n * Returns null on invalid input.\n */\nfunction hexToRgb(hex: string): string | null {\n const m = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hex);\n if (!m) return null;\n return `${parseInt(m[1], 16)}, ${parseInt(m[2], 16)}, ${parseInt(m[3], 16)}`;\n}\n\n/**\n * Apply brand accent color as CSS custom properties on :root.\n * This overrides the default cyan (#00d4ff) with the configured color.\n */\nexport function applyBrandAccentColor(color: string): void {\n if (color === DEFAULT_ACCENT_COLOR) return; // no-op for default\n\n const rgb = hexToRgb(color);\n if (!rgb) return;\n\n const root = document.documentElement;\n // Core accent vars used across all pages\n root.style.setProperty(\"--accent\", color);\n root.style.setProperty(\"--accent-hover\", color);\n root.style.setProperty(\"--accent-muted\", color);\n root.style.setProperty(\"--primary\", color);\n root.style.setProperty(\"--ring\", color);\n root.style.setProperty(\"--accent-subtle\", `rgba(${rgb}, 0.15)`);\n root.style.setProperty(\"--accent-glow\", `rgba(${rgb}, 0.25)`);\n // Setup page orange-themed vars\n root.style.setProperty(\"--tasker-orange\", color);\n root.style.setProperty(\"--tasker-orange-hover\", color);\n root.style.setProperty(\"--tasker-orange-glow\", `rgba(${rgb}, 0.25)`);\n}\n","import { html, nothing } from \"lit\";\n\nimport type { WorkspaceInfo } from \"../controllers/workspaces\";\nimport { resolveBrand } from \"../brand\";\n\nconst lockIcon = html`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"></rect><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"></path></svg>`;\n\nlet burgerListenerBound = false;\nfunction ensureBurgerOutsideClickListener() {\n if (burgerListenerBound) return;\n burgerListenerBound = true;\n document.addEventListener(\"click\", (e: MouseEvent) => {\n const cb = document.getElementById(\"nav-burger-toggle\") as HTMLInputElement | null;\n if (!cb?.checked) return;\n const header = cb.closest(\".setup-header\");\n if (header?.contains(e.target as Node)) return;\n cb.checked = false;\n });\n}\n\nexport type WorkspaceNavProps = {\n workspaces: WorkspaceInfo[];\n selectedWorkspace: string | null;\n onWorkspaceSelect: (name: string) => void;\n /** When set, \"Add Account\" triggers this callback instead of navigating to /setup. */\n onAddAccount?: () => void;\n /** Whether PINs are configured on this device. */\n hasPins?: boolean;\n /** Whether this is a master (device owner) session — shows all accounts. */\n isMaster?: boolean;\n /** Logout callback — shown when PINs are active. */\n onLogout?: () => void;\n};\n\n/**\n * Shared fixed top header with logo + nav for all standalone pages.\n * Pass the current page name to highlight it.\n *\n * Uses a checkbox hack for the burger menu so no JS state is needed.\n * The checkbox is hidden; the burger label toggles it. A media query\n * hides the inline nav and shows the burger + dropdown below 768px.\n *\n * When wsProps is provided, renders an account selector dropdown\n * right-aligned in the header bar.\n */\nexport function renderPageNav(currentPage: string, wsProps?: WorkspaceNavProps) {\n const link = (label: string, href: string) =>\n label === currentPage\n ? html`<span class=\"sp-page-nav-current\">${label}</span>`\n : html`<a href=${href}>${label}</a>`;\n\n const links = html`\n ${link(\"Setup\", \"/setup\")}\n ${link(\"Chat\", \"/chat\")}\n ${link(\"Admins\", \"/admins\")}\n ${link(\"Customers\", \"/customers\")}\n ${link(\"Files\", \"/files\")}\n ${link(\"Browser\", \"/browser\")}\n ${link(\"Advanced\", \"/advanced\")}\n `;\n\n // Account-PIN sessions (not master) see only their workspace — hide selector\n const showSelector = wsProps && (wsProps.isMaster !== false || !wsProps.hasPins);\n const selectorEl = showSelector\n ? renderWorkspaceSelector(wsProps!)\n : nothing;\n\n const logoutEl = wsProps?.hasPins && wsProps.onLogout\n ? html`<button class=\"nav-logout-btn\" @click=${wsProps.onLogout} title=\"Lock\">${lockIcon}</button>`\n : nothing;\n\n const closeBurger = () => {\n const cb = document.getElementById(\"nav-burger-toggle\") as HTMLInputElement | null;\n if (cb) cb.checked = false;\n };\n\n // Close burger menu when clicking outside the header (once per page)\n ensureBurgerOutsideClickListener();\n\n return html`\n <div class=\"setup-header\">\n <input type=\"checkbox\" id=\"nav-burger-toggle\" class=\"nav-burger-checkbox\" />\n ${selectorEl !== nothing\n ? html`<div class=\"setup-header-acct-row\"><div class=\"setup-header-acct-inner\">${selectorEl}</div></div>`\n : nothing}\n <div class=\"setup-header-inner\">\n <img class=\"setup-header-logo\" src=\"${resolveBrand().iconUrl}\" alt=\"${resolveBrand().name}\" />\n <nav class=\"setup-header-nav\">\n ${links}\n </nav>\n <div class=\"setup-header-right\">\n ${logoutEl}\n <label for=\"nav-burger-toggle\" class=\"nav-burger-button\" aria-label=\"Toggle menu\">\n <span class=\"nav-burger-icon\"></span>\n </label>\n </div>\n </div>\n <nav class=\"setup-header-dropdown\" @click=${closeBurger}>\n ${links}\n </nav>\n </div>\n `;\n}\n\nfunction renderWorkspaceSelector(wsProps: WorkspaceNavProps) {\n const { workspaces, selectedWorkspace, onWorkspaceSelect } = wsProps;\n\n const handleChange = (e: Event) => {\n const select = e.target as HTMLSelectElement;\n const value = select.value;\n if (value === \"__add__\") {\n // Reset dropdown back to current selection\n select.value = selectedWorkspace ?? \"\";\n if (wsProps.onAddAccount) {\n wsProps.onAddAccount();\n } else {\n window.location.href = \"/setup\";\n }\n return;\n }\n onWorkspaceSelect(value);\n };\n\n return html`\n <select\n class=\"sp-workspace-selector\"\n .value=${selectedWorkspace ?? \"\"}\n @change=${handleChange}\n >\n ${workspaces.map(\n (ws) => html`\n <option value=${ws.name} ?selected=${ws.name === selectedWorkspace}>\n ${ws.displayName ?? ws.name}\n </option>\n `,\n )}\n <option disabled>───</option>\n <option value=\"__add__\">+ Add Account</option>\n </select>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { icons } from \"../icons\";\nimport { renderPageNav } from \"./page-nav\";\n\nexport type BrowserViewerProps = {\n connected: boolean;\n active: boolean;\n loading: boolean;\n error: string | null;\n inputMode: boolean;\n handoffPending: boolean;\n handoffReason: string | null;\n onStart: () => void;\n onStop: () => void;\n onToggleInput: () => void;\n onCompleteHandoff: () => void;\n onCanvasMouseDown: (e: MouseEvent) => void;\n onCanvasMouseUp: (e: MouseEvent) => void;\n onCanvasMouseMove: (e: MouseEvent) => void;\n onCanvasKeyDown: (e: KeyboardEvent) => void;\n onCanvasKeyUp: (e: KeyboardEvent) => void;\n};\n\nexport function renderBrowserViewer(props: BrowserViewerProps) {\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"setup-container\">\n ${renderPageNav(\"Browser\")}\n <div class=\"setup-card sp-card-wide\">\n <h1>Remote Browser</h1>\n <p style=\"margin-bottom: 16px;\">Live view of the headless Chrome instance.</p>\n\n <div class=\"sp-toolbar\">\n ${props.active\n ? html`\n <button\n class=\"setup-button ${props.inputMode ? \"primary\" : \"secondary\"}\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n @click=${props.onToggleInput}\n >\n ${props.inputMode ? \"Input: ON\" : \"Input: OFF\"}\n </button>\n <button\n class=\"setup-button danger\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.loading}\n @click=${props.onStop}\n >\n Stop\n </button>\n `\n : html`\n <button\n class=\"setup-button primary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.loading}\n @click=${props.onStart}\n >\n ${props.loading ? \"Starting...\" : \"Start\"}\n </button>\n `}\n </div>\n\n ${props.error\n ? html`<div class=\"setup-error\" style=\"margin-top: 16px;\">${props.error}</div>`\n : nothing}\n\n ${props.handoffPending\n ? html`\n <div class=\"setup-warning\" style=\"margin-top: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; text-align: left;\">\n <div>\n <strong>Action required:</strong> ${props.handoffReason ?? \"The agent needs you to complete an action in the browser.\"}\n </div>\n <button class=\"setup-button primary\" style=\"flex-shrink: 0; padding: 10px 20px; font-size: 14px;\" @click=${props.onCompleteHandoff}>\n Done\n </button>\n </div>\n `\n : nothing}\n\n <div class=\"sp-canvas-area\" style=\"margin-top: 16px;\">\n ${props.active\n ? html`\n <div class=\"sp-canvas-wrap ${props.inputMode ? \"sp-input-active\" : \"\"}\">\n <canvas\n id=\"browser-screencast-canvas\"\n class=\"sp-canvas\"\n tabindex=\"0\"\n @mousedown=${(e: MouseEvent) => props.onCanvasMouseDown(e)}\n @mouseup=${(e: MouseEvent) => props.onCanvasMouseUp(e)}\n @mousemove=${(e: MouseEvent) => props.onCanvasMouseMove(e)}\n @keydown=${(e: KeyboardEvent) => {\n e.preventDefault();\n props.onCanvasKeyDown(e);\n }}\n @keyup=${(e: KeyboardEvent) => {\n e.preventDefault();\n props.onCanvasKeyUp(e);\n }}\n @contextmenu=${(e: Event) => e.preventDefault()}\n ></canvas>\n </div>\n `\n : html`\n <div class=\"sp-canvas-placeholder\">\n <div class=\"sp-canvas-placeholder-icon\">${icons.globe}</div>\n <p>Click Start to begin streaming the Chrome viewport.</p>\n </div>\n `}\n </div>\n\n ${props.active && props.inputMode\n ? html`<p class=\"setup-hint\" style=\"margin-top: 12px;\">\n Click the canvas to focus, then interact with the browser. Mouse and keyboard input are forwarded.\n </p>`\n : nothing}\n\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { icons } from \"../icons\";\nimport type { FileTreeEntry } from \"../controllers/files\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\n\n/** Custom MIME type used to identify drags originating from within the file tree. */\nconst INTERNAL_DRAG_MIME = \"application/x-taskmaster-file-path\";\n\nexport type FilesProps = {\n connected: boolean;\n wsProps?: WorkspaceNavProps;\n loading: boolean;\n tree: FileTreeEntry[];\n root: string;\n error: string | null;\n selectedPath: string | null;\n selectedPaths: Set<string>;\n previewContent: string | null;\n previewLoading: boolean;\n previewBinary: boolean;\n previewSize: number | null;\n expandedDirs: Set<string>;\n message: { kind: \"success\" | \"error\"; text: string } | null;\n uploadBusy: boolean;\n onRefresh: () => void;\n onSelectFile: (path: string) => void;\n onToggleSelectFile: (path: string) => void;\n onToggleDir: (path: string) => void;\n onUpload: (dirPath: string, files: File[]) => void;\n onDownload: (path: string) => void;\n onBulkDownload: () => void;\n onDelete: (path: string) => void;\n onMove: (from: string, to: string) => void;\n onMoveToDir: (filePath: string, targetDir: string) => void;\n};\n\nfunction formatSize(bytes: number | undefined): string {\n if (bytes === undefined || bytes === null) return \"\";\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Return the parent directory of a file path, or \".\" for root-level files. */\nfunction parentDir(filePath: string): string {\n const parts = filePath.split(\"/\");\n return parts.length > 1 ? parts.slice(0, -1).join(\"/\") : \".\";\n}\n\nfunction handleDirDrop(e: DragEvent, dirPath: string, props: FilesProps) {\n e.preventDefault();\n e.stopPropagation();\n (e.currentTarget as HTMLElement).classList.remove(\"sp-drop-target\");\n\n // Internal tree drag — move file into this directory\n const internalPath = e.dataTransfer?.getData(INTERNAL_DRAG_MIME);\n if (internalPath) {\n // Don't move if already in this directory\n if (parentDir(internalPath) !== dirPath) {\n props.onMoveToDir(internalPath, dirPath);\n }\n return;\n }\n\n // External file drop — upload\n const files = e.dataTransfer?.files;\n if (files && files.length > 0) {\n const mdFiles = Array.from(files).filter((f) => f.name.toLowerCase().endsWith(\".md\"));\n if (mdFiles.length > 0) props.onUpload(dirPath, mdFiles);\n }\n}\n\nfunction renderTreeEntry(\n entry: FileTreeEntry,\n props: FilesProps,\n depth: number,\n): unknown {\n const isDir = entry.type === \"directory\" || (entry.type === \"symlink\" && entry.children != null);\n const isExpanded = props.expandedDirs.has(entry.path);\n const isSelected = props.selectedPaths.has(entry.path);\n const indent = depth * 20 + 12;\n\n if (isDir) {\n return html`\n <div\n class=\"sp-tree-item sp-tree-dir ${isExpanded ? \"expanded\" : \"\"}\"\n style=\"padding-left: ${indent}px;\"\n @click=${() => props.onToggleDir(entry.path)}\n @dragover=${(e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"move\";\n (e.currentTarget as HTMLElement).classList.add(\"sp-drop-target\");\n }}\n @dragleave=${(e: DragEvent) => {\n (e.currentTarget as HTMLElement).classList.remove(\"sp-drop-target\");\n }}\n @drop=${(e: DragEvent) => handleDirDrop(e, entry.path, props)}\n >\n <span class=\"sp-tree-chevron\">${isExpanded ? \"−\" : \"+\"}</span>\n <span class=\"sp-tree-icon\">${icons.folder}</span>\n <span class=\"sp-tree-name\">${entry.name}</span>\n </div>\n ${isExpanded && entry.children\n ? entry.children.map((child) => renderTreeEntry(child, props, depth + 1))\n : nothing}\n `;\n }\n\n return html`\n <div\n class=\"sp-tree-item sp-tree-file ${isSelected ? \"selected\" : \"\"}\"\n style=\"padding-left: ${indent}px;\"\n draggable=\"true\"\n @click=${(e: MouseEvent) => {\n if (e.metaKey || e.ctrlKey) {\n props.onToggleSelectFile(entry.path);\n } else {\n props.onSelectFile(entry.path);\n }\n }}\n @dragstart=${(e: DragEvent) => {\n if (!e.dataTransfer) return;\n e.dataTransfer.effectAllowed = \"move\";\n e.dataTransfer.setData(INTERNAL_DRAG_MIME, entry.path);\n e.dataTransfer.setData(\"text/plain\", entry.name);\n }}\n >\n <span class=\"sp-tree-icon\">${icons.fileText}</span>\n <span class=\"sp-tree-name\">${entry.name}</span>\n <span class=\"sp-tree-size\">${formatSize(entry.size)}</span>\n </div>\n `;\n}\n\nfunction renderBulkActions(props: FilesProps) {\n const count = props.selectedPaths.size;\n if (count < 2) return nothing;\n\n return html`\n <div class=\"sp-bulk-actions\">\n <span style=\"color: var(--tasker-muted-grey); font-size: 13px;\">${count} files selected</span>\n <button\n class=\"setup-button secondary\"\n style=\"padding: 8px 16px; font-size: 13px;\"\n @click=${props.onBulkDownload}\n >\n Download ${count} files\n </button>\n </div>\n `;\n}\n\nfunction renderPreview(props: FilesProps) {\n // Hide preview when multiple files are selected\n if (props.selectedPaths.size !== 1) return nothing;\n if (!props.selectedPath) return nothing;\n\n if (props.previewLoading) {\n return html`\n <div class=\"sp-file-preview\">\n <div class=\"setup-spinner\" style=\"width: 32px; height: 32px; margin: 24px auto;\"></div>\n </div>\n `;\n }\n\n const fileName = props.selectedPath.split(\"/\").pop() ?? props.selectedPath;\n\n return html`\n <div class=\"sp-file-preview\">\n <div class=\"sp-file-preview-header\">\n <div>\n <strong>${fileName}</strong>\n <div class=\"sp-file-preview-meta\">\n ${props.selectedPath}${props.previewSize != null ? ` — ${formatSize(props.previewSize)}` : \"\"}\n </div>\n </div>\n <div class=\"sp-file-actions\">\n <button class=\"setup-button secondary\" style=\"padding: 8px 16px; font-size: 13px;\" @click=${() => props.onDownload(props.selectedPath!)}>\n Download\n </button>\n <button class=\"setup-button secondary\" style=\"padding: 8px 16px; font-size: 13px;\" @click=${() => {\n const dest = prompt(\"Move to (relative path):\", props.selectedPath!);\n if (dest && dest !== props.selectedPath) {\n props.onMove(props.selectedPath!, dest);\n }\n }}>\n Move\n </button>\n <button class=\"setup-button danger\" style=\"padding: 8px 16px; font-size: 13px;\" @click=${() => {\n if (confirm(`Delete ${fileName}?`)) {\n props.onDelete(props.selectedPath!);\n }\n }}>\n Delete\n </button>\n </div>\n </div>\n ${props.previewBinary\n ? html`<div class=\"sp-file-preview-body\"><p style=\"color: var(--tasker-muted-grey);\">Binary file — use Download to view.</p></div>`\n : props.previewContent != null\n ? html`<div class=\"sp-file-preview-body\"><pre class=\"sp-file-code\">${props.previewContent}</pre></div>`\n : html`<div class=\"sp-file-preview-body\"><p style=\"color: var(--tasker-muted-grey);\">File too large for preview — use Download.</p></div>`}\n </div>\n `;\n}\n\nfunction resolveUploadTarget(props: FilesProps): string {\n if (!props.selectedPath) return \".\";\n if (props.expandedDirs.has(props.selectedPath)) return props.selectedPath;\n const parts = props.selectedPath.split(\"/\");\n return parts.length > 1 ? parts.slice(0, -1).join(\"/\") : \".\";\n}\n\nexport function renderFiles(props: FilesProps) {\n const uploadTarget = resolveUploadTarget(props);\n\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"setup-container\">\n ${renderPageNav(\"Files\", props.wsProps)}\n <div class=\"setup-card sp-card-wide\">\n <h1>Workspace Files</h1>\n <p style=\"margin-bottom: 16px;\">Browse, upload, and manage files in your workspace. Drag files between folders to move them.</p>\n\n <div class=\"sp-toolbar\">\n <label class=\"setup-button secondary\" style=\"padding: 10px 20px; font-size: 14px; cursor: pointer;\">\n Upload\n <input\n type=\"file\"\n multiple\n accept=\".md\"\n style=\"display: none;\"\n @change=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n props.onUpload(uploadTarget, Array.from(input.files));\n input.value = \"\";\n }\n }}\n />\n </label>\n <button\n class=\"setup-button secondary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.loading}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading...\" : \"Refresh\"}\n </button>\n </div>\n\n ${props.error\n ? html`<div class=\"setup-error\" style=\"margin-top: 16px;\">${props.error}</div>`\n : nothing}\n\n ${props.message\n ? html`<div class=\"${props.message.kind === \"error\" ? \"setup-error\" : \"setup-success-message\"}\" style=\"margin-top: 12px;\">\n ${props.message.text}\n </div>`\n : nothing}\n\n ${props.uploadBusy\n ? html`<div style=\"margin-top: 12px; color: var(--tasker-orange); font-weight: 600; font-size: 14px;\">Uploading...</div>`\n : nothing}\n\n <div\n class=\"sp-file-tree\"\n @dragover=${(e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) e.dataTransfer.dropEffect = e.dataTransfer.types.includes(INTERNAL_DRAG_MIME) ? \"move\" : \"copy\";\n }}\n @drop=${(e: DragEvent) => {\n e.preventDefault();\n // Internal drag to root — move file to workspace root\n const internalPath = e.dataTransfer?.getData(INTERNAL_DRAG_MIME);\n if (internalPath) {\n if (parentDir(internalPath) !== \".\") {\n props.onMoveToDir(internalPath, \".\");\n }\n return;\n }\n // External file drop — upload\n const files = e.dataTransfer?.files;\n if (files && files.length > 0) {\n const mdFiles = Array.from(files).filter((f) => f.name.toLowerCase().endsWith(\".md\"));\n if (mdFiles.length > 0) props.onUpload(uploadTarget, mdFiles);\n }\n }}\n >\n ${props.tree.length === 0 && !props.loading\n ? html`<div style=\"padding: 24px; color: var(--tasker-muted-grey); text-align: center;\">No files found. Drop .md files here to upload.</div>`\n : props.tree.map((entry) => renderTreeEntry(entry, props, 0))}\n </div>\n\n ${renderBulkActions(props)}\n ${renderPreview(props)}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { icons } from \"../icons.js\";\nimport type { ChannelAccountSnapshot } from \"../types\";\nimport type { WorkspaceInfo } from \"../controllers/workspaces\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\nimport { resolveBrand } from \"../brand\";\n\nexport type SetupStep = \"license\" | \"auth\" | \"whatsapp\" | \"complete\";\n\nexport interface WhatsAppChannelStatus {\n running: boolean;\n connected: boolean;\n linked: boolean;\n lastError?: string | null;\n}\n\nexport interface SetupViewState {\n connected: boolean;\n assistantName: string;\n // Current setup step\n currentStep: SetupStep;\n // License state\n licenseKey: string;\n licenseBusy: boolean;\n licenseValid: boolean | null;\n licenseMessage: string | null;\n licenseTier: string | null;\n licenseDeviceId: string | null;\n licenseStoredKey: string | null;\n onLicenseKeyChange: (key: string) => void;\n onLicenseActivate: () => void;\n onLicenseRemove: () => void;\n licenseRemoveConfirm: boolean;\n onLicenseRemoveConfirm: () => void;\n onLicenseRemoveCancel: () => void;\n // Auth state\n authConnected: boolean | null;\n authBusy: boolean;\n authMessage: string | null;\n authUrl: string | null;\n authCodeInput: string;\n authExpiresIn: number | null;\n // WhatsApp login flow state\n whatsappBusy: boolean;\n whatsappLoginMessage: string | null;\n whatsappLoginQrDataUrl: string | null;\n whatsappLoginConnected: boolean | null;\n // Real WhatsApp channel status from channels.status\n whatsappChannelStatus: WhatsAppChannelStatus | null;\n // Multi-account WhatsApp\n whatsappAccounts: ChannelAccountSnapshot[];\n whatsappActiveQrAccountId: string | null;\n whatsappAccountSaving: boolean;\n // Gateway status\n gatewayHealthy: boolean | null;\n gatewayHealthLoading: boolean;\n gatewayHealthMessage: string | null;\n gatewayRestartBusy: boolean;\n // Callbacks\n onStartAuth: () => void;\n onSubmitAuthCode: (code: string) => void;\n onAuthCodeChange: (code: string) => void;\n onSkipToWhatsApp: () => void;\n onWhatsAppRelink: (accountId?: string) => void;\n onWhatsAppReset: (accountId?: string) => void;\n onRefreshStatus: () => void;\n onWhatsAppBack: () => void;\n onRestartGateway: () => void;\n onRemoveWhatsAppAccount: (accountId: string) => void;\n // Workspaces\n workspaces: WorkspaceInfo[];\n workspacesLoading: boolean;\n workspacesError: string | null;\n addingWorkspace: boolean;\n newWorkspaceName: string;\n newWorkspacePath: string;\n workspaceSaving: boolean;\n workspaceRemoveConfirm: string | null;\n onWorkspaceCreate: (name: string, workspacePath?: string) => void;\n onWorkspaceRemove: (name: string) => void;\n onSetAddingWorkspace: (adding: boolean) => void;\n onSetNewWorkspaceName: (name: string) => void;\n onSetNewWorkspacePath: (path: string) => void;\n onSetWorkspaceRemoveConfirm: (name: string | null) => void;\n // Workspace rename\n renamingWorkspace: boolean;\n renameWorkspaceName: string;\n onWorkspaceRenameStart: () => void;\n onWorkspaceRenameCancel: () => void;\n onWorkspaceRename: (name: string, displayName: string) => void;\n // Account PIN\n newWorkspacePin: string;\n onSetNewWorkspacePin: (pin: string) => void;\n // Account PIN management (on the setup dashboard)\n accountHasPin: boolean;\n accountPinModalOpen: boolean;\n accountPinBusy: boolean;\n accountPinError: string | null;\n accountPinSuccess: string | null;\n onAccountPinModalOpen: () => void;\n onAccountPinModalClose: () => void;\n onAccountPinSave: (oldPin: string | null, newPin: string) => void;\n // iMessage state\n imessageConfigured: boolean;\n imessageRunning: boolean;\n imessageConnected: boolean;\n imessageLastError: string | null;\n imessageSelfChatMode: boolean;\n imessageCliPath: string | null;\n imessageEnabling: boolean;\n imessageEnableConfirm: boolean;\n /** Name of the workspace that currently owns iMessage (has bindings), or null */\n imessageOwnerWorkspace: string | null;\n onIMessageEnable: () => void;\n onIMessageEnableConfirm: () => void;\n onIMessageEnableCancel: () => void;\n onIMessageProbe: () => void;\n /** Reassign iMessage to the currently selected workspace (removes old bindings, creates new) */\n onIMessageReassign: () => void;\n /** Disconnect iMessage from the currently selected workspace (removes bindings, disables channel) */\n onIMessageDisconnect: () => void;\n // WhatsApp DM policy\n whatsappDmPolicy: string | null;\n /** Toggle WhatsApp public DM handling on/off */\n onWhatsAppDmToggle: () => void;\n // WhatsApp per-account model selector\n whatsappModel: string | null;\n whatsappModelCatalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }>;\n onWhatsAppModelChange: (model: string) => void;\n // WhatsApp per-account thinking level selector\n whatsappThinkingLevel: string | null;\n onWhatsAppThinkingChange: (level: string) => void;\n // WhatsApp group chat\n whatsappGroupPolicy: \"open\" | \"disabled\" | \"allowlist\" | null;\n whatsappGroupRequireMention: boolean;\n onWhatsAppGroupToggle: () => void;\n onWhatsAppGroupMentionChange: (requireMention: boolean) => void;\n // WhatsApp settings modal\n whatsappSettingsOpen: boolean;\n onWhatsAppSettingsOpen: () => void;\n onWhatsAppSettingsClose: () => void;\n // API Keys management (global, admin-only)\n isMaster: boolean;\n apiKeyProviders: Array<{ id: string; name: string; category: string; hasKey: boolean }>;\n apiKeyModalOpen: boolean;\n apiKeyBusy: boolean;\n apiKeyError: string | null;\n apiKeySuccess: string | null;\n onApiKeyModalOpen: () => void;\n onApiKeyModalClose: () => void;\n onApiKeySave: (provider: string, apiKey: string) => void;\n onApiKeyRemove: (provider: string) => void;\n // Auth step API key fallback\n authApiKeyMode: boolean;\n authApiKeyInput: string;\n authApiKeyBusy: boolean;\n authApiKeyError: string | null;\n onAuthApiKeyToggle: () => void;\n onAuthApiKeyChange: (key: string) => void;\n onAuthApiKeySubmit: () => void;\n // Software update\n updateAvailable: boolean | null;\n currentVersion: string | null;\n latestVersion: string | null;\n updateChecking: boolean;\n updateRunning: boolean;\n updateMessage: string | null;\n onUpdateCheck: () => void;\n onUpdateRun: () => void;\n // Info modals\n infoModalOpen: string | null;\n onInfoModalOpen: (id: string) => void;\n onInfoModalClose: () => void;\n // Workspace nav props (for the account selector in the header)\n wsProps?: WorkspaceNavProps;\n}\n\n/** Status indicator light - green for good, red for bad, yellow for partial */\nfunction renderStatusLight(status: \"good\" | \"bad\" | \"partial\" | \"unknown\") {\n const colors = {\n good: \"#22c55e\", // green\n bad: \"#ef4444\", // red\n partial: \"#eab308\", // yellow\n unknown: \"#6b7280\", // gray\n };\n return html`\n <span\n class=\"setup-status-light\"\n style=\"background: ${colors[status]}\"\n ></span>\n `;\n}\n\n/** Small \"i\" circle button that opens an info modal */\nfunction renderInfoButton(id: string, state: SetupViewState) {\n return html`\n <button\n class=\"setup-info-btn\"\n @click=${() => state.onInfoModalOpen(id)}\n title=\"Details\"\n >\n ${icons.info}\n </button>\n `;\n}\n\n/** Info modal overlay with key/value rows */\nfunction renderInfoModal(state: SetupViewState) {\n if (!state.infoModalOpen) return nothing;\n\n let title = \"\";\n let rows: Array<{ label: string; value: string }> = [];\n\n switch (state.infoModalOpen) {\n case \"gateway\": {\n const addr = typeof window !== \"undefined\" ? window.location.host : \"unknown\";\n title = \"Gateway\";\n rows = [\n { label: \"Status\", value: state.gatewayHealthy === false ? \"Stopped\" : \"Running\" },\n { label: \"Address\", value: addr },\n { label: \"Health\", value: state.gatewayHealthMessage || \"OK\" },\n ];\n break;\n }\n case \"claude\": {\n const mins = state.authExpiresIn;\n let expiryText = \"N/A\";\n if (mins != null && mins > 0) {\n if (mins > 60) {\n const h = Math.floor(mins / 60);\n const m = mins % 60;\n expiryText = m > 0 ? `${h}h ${m}m` : `${h}h`;\n } else {\n expiryText = `${mins}m`;\n }\n }\n title = \"Claude\";\n rows = [\n { label: \"Connected\", value: state.authConnected ? \"Yes\" : \"No\" },\n { label: \"Token Expiry\", value: expiryText },\n { label: \"Renewal\", value: \"Automatic (tokens refresh on expiry)\" },\n ...(state.authMessage ? [{ label: \"Message\", value: state.authMessage }] : []),\n ];\n break;\n }\n case \"license\": {\n const maskedKey = state.licenseStoredKey\n ? `\\u2026${state.licenseStoredKey.slice(-12)}`\n : \"N/A\";\n title = \"License\";\n rows = [\n { label: \"Status\", value: state.licenseValid ? \"Active\" : \"Inactive\" },\n { label: \"Key\", value: maskedKey },\n { label: \"Tier\", value: state.licenseTier || \"Standard\" },\n { label: \"Device ID\", value: state.licenseDeviceId || \"N/A\" },\n ];\n break;\n }\n case \"whatsapp\": {\n const ws = getSelectedWorkspace(state);\n const account = ws ? resolveWorkspaceWhatsApp(ws, state) : null;\n title = \"WhatsApp\";\n rows = [\n { label: \"Account\", value: account?.name || account?.accountId || \"Default\" },\n { label: \"Phone\", value: account?.self?.e164 || \"Not paired\" },\n { label: \"Connected\", value: account?.connected ? \"Yes\" : \"No\" },\n { label: \"Linked\", value: account?.linked ? \"Yes\" : \"No\" },\n ...(account?.lastError ? [{ label: \"Last Error\", value: account.lastError }] : []),\n ];\n break;\n }\n case \"imessage\": {\n const { thisWsOwns: imsgOwned } = resolveIMessageState(state);\n title = \"iMessage\";\n rows = [\n { label: \"Connected\", value: imsgOwned && state.imessageConnected ? \"Yes\" : \"No\" },\n { label: \"Assigned To\", value: state.imessageOwnerWorkspace ?? \"Not assigned\" },\n { label: \"Mode\", value: \"Self-chat only\" },\n ...(state.imessageLastError ? [{ label: \"Last Error\", value: state.imessageLastError }] : []),\n ];\n break;\n }\n case \"update\": {\n title = \"Software Update\";\n rows = [\n { label: \"Current\", value: state.currentVersion ? `v${state.currentVersion}` : \"Unknown\" },\n { label: \"Latest\", value: state.latestVersion ? `v${state.latestVersion}` : \"Unknown\" },\n { label: \"Status\", value: state.updateAvailable === null ? \"Not checked\" : state.updateAvailable ? \"Update available\" : \"Up to date\" },\n ...(state.updateMessage ? [{ label: \"Message\", value: state.updateMessage }] : []),\n ];\n break;\n }\n default:\n return nothing;\n }\n\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) {\n state.onInfoModalClose();\n }\n }}>\n <div class=\"setup-info-card\">\n <h3>${title}</h3>\n ${rows.map(\n (row) => html`\n <div class=\"setup-info-row\">\n <span class=\"setup-info-label\">${row.label}</span>\n <span class=\"setup-info-value\">${row.value}</span>\n </div>\n `,\n )}\n <button\n class=\"setup-button secondary\"\n style=\"margin-top: 16px; width: 100%; padding: 10px;\"\n @click=${state.onInfoModalClose}\n >\n Close\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderStepIndicator(currentStep: SetupStep) {\n const steps = [\n { id: \"license\", label: \"1. Activate License\" },\n { id: \"auth\", label: \"2. Connect Claude\" },\n { id: \"whatsapp\", label: \"3. Link WhatsApp\" },\n ];\n\n const stepOrder = [\"license\", \"auth\", \"whatsapp\", \"complete\"];\n const currentIndex = stepOrder.indexOf(currentStep);\n\n return html`\n <div class=\"setup-steps\">\n ${steps.map((step) => {\n const stepIndex = stepOrder.indexOf(step.id);\n const isActive = currentStep === step.id;\n const isCompleted = currentIndex > stepIndex;\n return html`\n <div\n class=\"setup-step ${isActive ? \"active\" : \"\"} ${isCompleted ? \"completed\" : \"\"}\"\n >\n <span class=\"setup-step-dot\"></span>\n <span class=\"setup-step-label\">${step.label}</span>\n </div>\n `;\n })}\n </div>\n `;\n}\n\nfunction renderLicenseStep(state: SetupViewState) {\n const {\n licenseKey,\n licenseBusy,\n licenseValid,\n licenseMessage,\n licenseDeviceId,\n onLicenseKeyChange,\n onLicenseActivate,\n } = state;\n\n // Successfully activated — show brief success before moving on\n if (licenseValid === true) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card setup-success\">\n ${renderStepIndicator(\"license\")}\n <div class=\"setup-status-row\">\n ${renderStatusLight(\"good\")}\n <span>License Activated</span>\n </div>\n <p>${licenseMessage ?? \"Your license is active.\"}</p>\n </div>\n </div>\n `;\n }\n\n // Loading state\n if (licenseBusy && !licenseKey) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"license\")}\n <div class=\"setup-spinner\"></div>\n <p>Checking license...</p>\n </div>\n </div>\n `;\n }\n\n // Main license entry form\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"license\")}\n <h1>Activate License</h1>\n <p>Enter your license key to get started.</p>\n ${licenseDeviceId\n ? html`\n <div class=\"setup-device-id\">\n <span class=\"setup-device-id-label\">Your Device ID</span>\n <div class=\"setup-device-id-row\">\n <code class=\"setup-device-id-value\">${licenseDeviceId}</code>\n <button\n class=\"setup-device-id-copy\"\n title=\"Copy Device ID\"\n @click=${async (e: Event) => {\n const btn = e.currentTarget as HTMLButtonElement;\n try {\n await navigator.clipboard.writeText(licenseDeviceId);\n btn.textContent = \"Copied!\";\n setTimeout(() => { btn.textContent = \"Copy\"; }, 1500);\n } catch {\n // Fallback for non-HTTPS\n const el = document.createElement(\"textarea\");\n el.value = licenseDeviceId;\n el.style.position = \"fixed\";\n el.style.opacity = \"0\";\n document.body.appendChild(el);\n el.select();\n document.execCommand(\"copy\");\n document.body.removeChild(el);\n btn.textContent = \"Copied!\";\n setTimeout(() => { btn.textContent = \"Copy\"; }, 1500);\n }\n }}\n >Copy</button>\n </div>\n <p class=\"setup-hint\" style=\"margin-top: 4px;\">\n Send this ID along with your order number to our WhatsApp to receive your license key.\n </p>\n </div>\n `\n : nothing}\n <div class=\"setup-code-input\">\n <input\n type=\"text\"\n placeholder=\"Paste your license key here\"\n .value=${licenseKey}\n @input=${(e: Event) =>\n onLicenseKeyChange((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" && licenseKey.trim()) {\n onLicenseActivate();\n }\n }}\n />\n <button\n class=\"setup-button\"\n ?disabled=${!licenseKey.trim() || licenseBusy}\n @click=${onLicenseActivate}\n >\n ${licenseBusy ? \"Activating...\" : \"Activate\"}\n </button>\n </div>\n ${licenseValid === false && licenseMessage\n ? html`\n <div class=\"setup-status-row\" style=\"margin-top: 12px;\">\n ${renderStatusLight(\"bad\")}\n <span class=\"setup-error\">${licenseMessage}</span>\n </div>\n `\n : nothing}\n <p class=\"setup-hint\">\n Need a license?\n <a href=\"https://taskmaster.bot\" target=\"_blank\" rel=\"noopener\">\n Purchase at taskmaster.bot\n </a>\n </p>\n </div>\n </div>\n `;\n}\n\nfunction renderAuthStep(state: SetupViewState) {\n const {\n authConnected,\n authBusy,\n authMessage,\n authUrl,\n authCodeInput,\n authExpiresIn,\n onStartAuth,\n onSubmitAuthCode,\n onAuthCodeChange,\n onSkipToWhatsApp,\n } = state;\n\n // Already connected\n if (authConnected === true) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card setup-success\">\n ${renderStepIndicator(\"auth\")}\n <div class=\"setup-status-row\">\n ${renderStatusLight(\"good\")}\n <span>Claude Connected</span>\n </div>\n <p>\n Your Claude Pro subscription is linked.\n ${authExpiresIn\n ? html`<br /><span class=\"setup-hint\"\n >Expires in ${authExpiresIn} minutes</span\n >`\n : nothing}\n </p>\n <button class=\"setup-button primary\" @click=${onSkipToWhatsApp}>\n Continue to WhatsApp →\n </button>\n </div>\n </div>\n `;\n }\n\n // Waiting for auth URL\n if (authBusy && !authUrl) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"auth\")}\n <div class=\"setup-spinner\"></div>\n <p>Starting Claude connection...</p>\n </div>\n </div>\n `;\n }\n\n // Have auth URL - waiting for user to authenticate\n if (authUrl) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"auth\")}\n <h1>Connect to Claude</h1>\n <p>Click the button below to sign in with your Claude Pro account.</p>\n <a\n href=${authUrl}\n target=\"_blank\"\n rel=\"noopener\"\n class=\"setup-button primary\"\n >\n Sign in with Claude →\n </a>\n <div class=\"setup-divider\">\n <span>Then enter the code shown</span>\n </div>\n <div class=\"setup-code-input\">\n <input\n type=\"text\"\n placeholder=\"Enter authorization code\"\n .value=${authCodeInput}\n @input=${(e: Event) =>\n onAuthCodeChange((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" && authCodeInput.trim()) {\n onSubmitAuthCode(authCodeInput.trim());\n }\n }}\n />\n <button\n class=\"setup-button\"\n ?disabled=${!authCodeInput.trim() || authBusy}\n @click=${() => onSubmitAuthCode(authCodeInput.trim())}\n >\n ${authBusy ? \"Verifying...\" : \"Submit\"}\n </button>\n </div>\n ${authMessage\n ? html`<p class=\"setup-hint\">${authMessage}</p>`\n : nothing}\n <p class=\"setup-hint\" style=\"margin-top: 16px;\">\n <a href=\"#\" class=\"setup-link\" @click=${(e: Event) => { e.preventDefault(); state.onAuthApiKeyToggle(); }}>\n Or use an API key instead\n </a>\n </p>\n </div>\n </div>\n `;\n }\n\n // Error state\n if (authConnected === false && authMessage) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"auth\")}\n <div class=\"setup-status-row\">\n ${renderStatusLight(\"bad\")}\n <span>Connection Failed</span>\n </div>\n <p class=\"setup-error\">${authMessage}</p>\n <button class=\"setup-button primary\" @click=${onStartAuth}>\n Try Again\n </button>\n </div>\n </div>\n `;\n }\n\n // API key input mode\n if (state.authApiKeyMode) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"auth\")}\n <h1>Enter API Key</h1>\n <p>Paste your Anthropic API key below.</p>\n <div class=\"setup-code-input\">\n <input\n type=\"password\"\n placeholder=\"sk-ant-...\"\n .value=${state.authApiKeyInput}\n @input=${(e: Event) => state.onAuthApiKeyChange((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" && state.authApiKeyInput.trim()) {\n state.onAuthApiKeySubmit();\n }\n }}\n ?disabled=${state.authApiKeyBusy}\n autofocus\n />\n <button\n class=\"setup-button\"\n ?disabled=${!state.authApiKeyInput.trim() || state.authApiKeyBusy}\n @click=${() => state.onAuthApiKeySubmit()}\n >${state.authApiKeyBusy ? \"Saving...\" : \"Save\"}</button>\n </div>\n ${state.authApiKeyError\n ? html`<p class=\"setup-error\">${state.authApiKeyError}</p>`\n : nothing}\n <p class=\"setup-hint\" style=\"margin-top: 16px;\">\n <a href=\"#\" class=\"setup-link\" @click=${(e: Event) => { e.preventDefault(); state.onAuthApiKeyToggle(); }}>\n Use OAuth instead\n </a>\n </p>\n <p class=\"setup-hint\">\n Get an API key from\n <a href=\"https://console.anthropic.com/settings/keys\" target=\"_blank\" rel=\"noopener\">\n console.anthropic.com\n </a>\n </p>\n </div>\n </div>\n `;\n }\n\n // Initial state - not started\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"auth\")}\n <h1>Connect to Claude</h1>\n <p>\n First, let's connect your Claude Pro subscription.<br />\n This powers your AI assistant.\n </p>\n <button class=\"setup-button primary\" @click=${onStartAuth}>\n Connect to Claude →\n </button>\n <p class=\"setup-hint\" style=\"margin-top: 8px;\">\n <a href=\"#\" class=\"setup-link\" @click=${(e: Event) => { e.preventDefault(); state.onAuthApiKeyToggle(); }}>\n Or enter your API key\n </a>\n </p>\n <p class=\"setup-hint\">\n Need a Claude subscription?\n <a href=\"https://claude.ai/upgrade\" target=\"_blank\" rel=\"noopener\">\n Get Claude Pro\n </a>\n </p>\n </div>\n </div>\n `;\n}\n\n/** Resolve WhatsApp account status for a workspace card */\nfunction resolveWorkspaceWhatsApp(\n ws: WorkspaceInfo,\n state: SetupViewState,\n): ChannelAccountSnapshot | null {\n const accountMap = new Map(\n state.whatsappAccounts.map((a) => [a.accountId, a]),\n );\n if (ws.whatsappAccountId) {\n return accountMap.get(ws.whatsappAccountId) ?? null;\n }\n // Default workspace fallback: if single account, assume it's this one\n if (ws.isDefault && state.whatsappAccounts.length === 1) {\n return state.whatsappAccounts[0] ?? null;\n }\n return null;\n}\n\n/** Resolve the selected workspace from wsProps */\nfunction getSelectedWorkspace(state: SetupViewState): WorkspaceInfo | null {\n const selected = state.wsProps?.selectedWorkspace;\n if (!selected) return state.workspaces[0] ?? null;\n return state.workspaces.find((ws) => ws.name === selected) ?? null;\n}\n\n/** Render dashboard header with business name, pencil rename, and refresh button */\nfunction renderDashboardHeader(state: SetupViewState) {\n const ws = getSelectedWorkspace(state);\n const businessName = ws?.displayName ?? ws?.name ?? resolveBrand().name;\n const isLoading = state.whatsappBusy || state.gatewayHealthLoading;\n\n // Edit mode: inline text input with save/cancel\n if (state.renamingWorkspace && ws) {\n const handleSave = () => {\n const val = state.renameWorkspaceName.trim();\n if (val) state.onWorkspaceRename(ws.name, val);\n };\n return html`\n <div style=\"display: flex; align-items: center; gap: 6px; margin-bottom: 4px;\">\n <input\n type=\"text\"\n .value=${state.renameWorkspaceName}\n @input=${(e: Event) => { state.renameWorkspaceName = (e.target as HTMLInputElement).value; }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") handleSave();\n if (e.key === \"Escape\") state.onWorkspaceRenameCancel();\n }}\n style=\"flex: 1; font-size: 18px; font-weight: 600; background: var(--tasker-bg-input, rgba(255,255,255,0.08)); border: 1px solid var(--tasker-border, rgba(255,255,255,0.15)); border-radius: 6px; color: var(--tasker-white); padding: 4px 8px; outline: none;\"\n autofocus\n />\n <button\n class=\"setup-status-action\"\n @click=${handleSave}\n title=\"Save\"\n style=\"color: #22c55e;\"\n >${icons.check}</button>\n <button\n class=\"setup-status-action\"\n @click=${state.onWorkspaceRenameCancel}\n title=\"Cancel\"\n >${icons.x}</button>\n </div>\n `;\n }\n\n // View mode: business name + pencil + refresh\n return html`\n <div style=\"display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;\">\n <div style=\"display: flex; align-items: center; gap: 6px;\">\n <h2 style=\"margin: 0; font-size: 20px; font-weight: 600; color: var(--tasker-white);\">${businessName}</h2>\n <button\n class=\"setup-status-action\"\n @click=${state.onWorkspaceRenameStart}\n title=\"Rename\"\n style=\"opacity: 0.5; transform: scale(0.8);\"\n >${icons.edit}</button>\n </div>\n <button\n class=\"setup-status-action ${isLoading ? \"spinning\" : \"\"}\"\n ?disabled=${isLoading}\n @click=${state.onRefreshStatus}\n title=\"Refresh Status\"\n >\n ${icons.rotateCw}\n </button>\n </div>\n `;\n}\n\n/** Render gateway status row in the dashboard */\nfunction renderGatewayStatusRow(state: SetupViewState) {\n return html`\n <div class=\"setup-status-item\">\n ${renderStatusLight(state.gatewayHealthy === false ? \"bad\" : \"good\")}\n <div class=\"setup-status-info\">\n <strong>Gateway</strong>\n <span>${state.gatewayHealthMessage || \"Running\"}</span>\n </div>\n ${renderInfoButton(\"gateway\", state)}\n <button\n class=\"setup-status-action ${state.gatewayRestartBusy ? \"spinning\" : \"\"}\"\n ?disabled=${state.gatewayRestartBusy}\n @click=${state.onRestartGateway}\n title=\"Restart Gateway\"\n >\n ${icons.rotateCw}\n </button>\n </div>\n `;\n}\n\n/** Render Claude status row in the dashboard */\nfunction renderClaudeStatusRow(state: SetupViewState) {\n const isConnected = state.authConnected === true;\n return html`\n <div class=\"setup-status-item\">\n ${renderStatusLight(isConnected ? \"good\" : \"bad\")}\n <div class=\"setup-status-info\">\n <strong>Claude</strong>\n <span>\n ${isConnected ? \"Connected\" : \"Not connected\"}${isConnected && state.authExpiresIn\n ? html` <span style=\"color: var(--tasker-text-grey); font-size: 12px;\">(${state.authExpiresIn > 60 ? `${Math.floor(state.authExpiresIn / 60)}h ${state.authExpiresIn % 60}m` : `${state.authExpiresIn}m`})</span>`\n : nothing}\n </span>\n </div>\n ${renderInfoButton(\"claude\", state)}\n ${isConnected\n ? html`\n <button\n class=\"setup-status-action ${state.authBusy ? \"spinning\" : \"\"}\"\n ?disabled=${state.authBusy}\n @click=${state.onStartAuth}\n title=\"Refresh Token\"\n >\n ${icons.rotateCw}\n </button>\n `\n : html`\n <button\n class=\"setup-status-action\"\n @click=${state.onStartAuth}\n title=\"Connect Claude\"\n >\n ${icons.rotateCw}\n </button>\n `}\n </div>\n `;\n}\n\n/** Render license status row in the dashboard */\nfunction renderLicenseStatusRow(state: SetupViewState) {\n return html`\n <div class=\"setup-status-item\" style=\"flex-wrap: wrap;\">\n ${renderStatusLight(\"good\")}\n <div class=\"setup-status-info\">\n <strong>License</strong>\n <span>Active</span>\n </div>\n ${renderInfoButton(\"license\", state)}\n <button\n class=\"setup-status-action\"\n @click=${() => {\n if (state.licenseRemoveConfirm) {\n state.onLicenseRemoveCancel();\n } else {\n state.onLicenseRemoveConfirm();\n }\n }}\n title=\"Manage License\"\n >\n ${icons.rotateCw}\n </button>\n ${state.licenseRemoveConfirm\n ? html`\n <div style=\"width: 100%; margin-top: 8px; margin-left: 30px;\">\n <p style=\"color: var(--tasker-text-grey); font-size: 13px; margin: 0 0 8px;\">\n Removing your license will disable ${resolveBrand().name} until you enter a new key.\n </p>\n <div style=\"display: flex; gap: 8px;\">\n <button\n class=\"setup-button danger\"\n style=\"font-size: 12px; padding: 4px 12px;\"\n ?disabled=${state.licenseBusy}\n @click=${state.onLicenseRemove}\n >\n ${state.licenseBusy ? \"Removing\\u2026\" : \"Remove License\"}\n </button>\n <button\n class=\"setup-button secondary\"\n style=\"font-size: 12px; padding: 4px 12px;\"\n @click=${state.onLicenseRemoveCancel}\n >\n Cancel\n </button>\n </div>\n </div>\n `\n : nothing}\n </div>\n `;\n}\n\n/** Render WhatsApp status row for the selected workspace in the dashboard */\nfunction renderWhatsAppStatusRow(state: SetupViewState) {\n const ws = getSelectedWorkspace(state);\n if (!ws) return nothing;\n\n const account = resolveWorkspaceWhatsApp(ws, state);\n const isConnected = account?.running && account?.connected;\n const isLinked = account?.linked && !isConnected;\n const hasAccount = Boolean(account);\n const waStatus: \"good\" | \"bad\" | \"partial\" | \"unknown\" = isConnected\n ? \"good\"\n : isLinked\n ? \"partial\"\n : hasAccount\n ? \"bad\"\n : \"unknown\";\n const waStatusText = isConnected\n ? \"Connected\"\n : isLinked\n ? \"Linked, not connected\"\n : hasAccount\n ? account?.lastError || \"Not connected\"\n : \"Not paired\";\n const isBaileys = !account?.provider || account?.provider === \"baileys\";\n const accountId = ws.whatsappAccountId ?? (ws.isDefault && state.whatsappAccounts.length === 1 ? state.whatsappAccounts[0]?.accountId : undefined);\n const isActiveQr = accountId != null && state.whatsappActiveQrAccountId === accountId;\n\n return html`\n <div class=\"setup-status-item\" style=\"flex-wrap: wrap;\">\n ${renderStatusLight(waStatus)}\n <div class=\"setup-status-info\">\n <div style=\"display: flex; align-items: center; gap: 4px;\">\n <strong>WhatsApp</strong>\n ${hasAccount && isConnected\n ? html`\n <button\n class=\"setup-status-action\"\n @click=${state.onWhatsAppSettingsOpen}\n title=\"WhatsApp Settings\"\n style=\"opacity: 0.5; transform: scale(0.75);\"\n >\n ${icons.settings}\n </button>\n `\n : nothing}\n </div>\n <span>${waStatusText}</span>\n </div>\n ${renderInfoButton(\"whatsapp\", state)}\n ${isBaileys && accountId\n ? html`\n <button\n class=\"setup-status-action ${state.whatsappBusy && isActiveQr ? \"spinning\" : \"\"}\"\n ?disabled=${state.whatsappBusy}\n @click=${() => state.onWhatsAppRelink(accountId)}\n title=\"${isConnected ? \"Relink\" : \"Link\"} WhatsApp\"\n >\n ${icons.rotateCw}\n </button>\n `\n : nothing}\n ${isActiveQr && state.whatsappLoginQrDataUrl\n ? html`\n <div style=\"width: 100%; margin-top: 8px; margin-left: 30px;\">\n <div class=\"setup-qr\" style=\"display: inline-flex;\">\n <img\n src=${state.whatsappLoginQrDataUrl}\n alt=\"WhatsApp QR\"\n style=\"width: 140px; height: 140px;\"\n />\n </div>\n ${state.whatsappLoginMessage\n ? html`<p class=\"setup-hint\" style=\"margin-top: 4px;\">${state.whatsappLoginMessage}</p>`\n : nothing}\n </div>\n `\n : nothing}\n </div>\n `;\n}\n\n/** Curated Anthropic models for the per-account selector. */\nconst SETUP_CURATED_MODELS: Array<{ id: string; shortName: string }> = [\n { id: \"claude-opus-4-6\", shortName: \"Opus\" },\n { id: \"claude-sonnet-4-5-20250929\", shortName: \"Sonnet\" },\n { id: \"claude-haiku-4-5-20251001\", shortName: \"Haiku\" },\n];\n\n/** Default model when none is explicitly configured. */\nconst SETUP_DEFAULT_MODEL_KEY = \"anthropic/claude-sonnet-4-5-20250929\";\n\nfunction renderWhatsAppModelSelector(state: SetupViewState) {\n const catalog = state.whatsappModelCatalog ?? [];\n const available = new Set(catalog.filter((m) => m.provider === \"anthropic\").map((m) => m.id));\n const models = SETUP_CURATED_MODELS.filter((m) => available.has(m.id));\n if (models.length === 0) return nothing;\n\n // Every account must have an explicit model — default to Sonnet if unset\n const currentKey = state.whatsappModel ?? SETUP_DEFAULT_MODEL_KEY;\n\n return html`\n <div style=\"width: 100%; margin-top: 6px; margin-left: 30px; display: flex; align-items: center; gap: 6px;\">\n <div style=\"font-size: 12px; color: var(--tasker-text-grey); white-space: nowrap;\">Model</div>\n <select\n class=\"setup-model-select\"\n .value=${currentKey}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n state.onWhatsAppModelChange(value);\n }}\n >\n ${models.map(\n (m) => html`\n <option value=${\"anthropic/\" + m.id} ?selected=${currentKey === \"anthropic/\" + m.id}>\n ${m.shortName}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n}\n\n/** Thinking levels available in the per-account selector. */\nconst SETUP_THINKING_LEVELS: Array<{ value: string; label: string }> = [\n { value: \"off\", label: \"Off\" },\n { value: \"minimal\", label: \"Minimal\" },\n { value: \"low\", label: \"Low\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"high\", label: \"High\" },\n];\n\nfunction renderWhatsAppThinkingSelector(state: SetupViewState) {\n const currentLevel = state.whatsappThinkingLevel ?? \"off\";\n\n return html`\n <div style=\"width: 100%; margin-top: 6px; margin-left: 30px; display: flex; align-items: center; gap: 6px;\">\n <div style=\"font-size: 12px; color: var(--tasker-text-grey); white-space: nowrap;\">Thinking</div>\n <select\n class=\"setup-model-select\"\n .value=${currentLevel}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n state.onWhatsAppThinkingChange(value);\n }}\n >\n ${SETUP_THINKING_LEVELS.map(\n (l) => html`\n <option value=${l.value} ?selected=${currentLevel === l.value}>\n ${l.label}\n </option>\n `,\n )}\n </select>\n </div>\n `;\n}\n\n/** WhatsApp settings modal — Public facing, Model, Thinking */\nfunction renderWhatsAppSettingsModal(state: SetupViewState) {\n if (!state.whatsappSettingsOpen) return nothing;\n\n const ws = getSelectedWorkspace(state);\n if (!ws) return nothing;\n const account = resolveWorkspaceWhatsApp(ws, state);\n const isConnected = account?.running && account?.connected;\n if (!account || !isConnected) return nothing;\n\n const closeModal = () => state.onWhatsAppSettingsClose();\n\n // Model options\n const catalog = state.whatsappModelCatalog ?? [];\n const available = new Set(catalog.filter((m) => m.provider === \"anthropic\").map((m) => m.id));\n const models = SETUP_CURATED_MODELS.filter((m) => available.has(m.id));\n const currentModelKey = state.whatsappModel ?? SETUP_DEFAULT_MODEL_KEY;\n const currentThinkingLevel = state.whatsappThinkingLevel ?? \"off\";\n\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) closeModal();\n }}>\n <div class=\"setup-info-card\" style=\"max-width: 360px;\">\n <h3>Public Agent Settings</h3>\n <div style=\"display: flex; flex-direction: column; gap: 16px; margin-top: 12px;\">\n <label style=\"display: flex; align-items: flex-start; gap: 8px; cursor: pointer;\">\n <input\n type=\"checkbox\"\n .checked=${state.whatsappDmPolicy !== \"disabled\" && state.whatsappDmPolicy !== null}\n @change=${state.onWhatsAppDmToggle}\n style=\"accent-color: #22c55e; margin-top: 2px;\"\n />\n <div>\n <div style=\"font-size: 13px; color: var(--tasker-white);\">Enabled</div>\n <div style=\"font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;\">Agent replies to 3rd party messages</div>\n </div>\n </label>\n <div style=\"border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;\"></div>\n <label style=\"display: flex; align-items: flex-start; gap: 8px; cursor: pointer;\">\n <input\n type=\"checkbox\"\n .checked=${state.whatsappGroupPolicy === \"open\"}\n @change=${state.onWhatsAppGroupToggle}\n style=\"accent-color: #22c55e; margin-top: 2px;\"\n />\n <div>\n <div style=\"font-size: 13px; color: var(--tasker-white);\">Group chats</div>\n <div style=\"font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;\">Agent responds in WhatsApp groups</div>\n </div>\n </label>\n ${state.whatsappGroupPolicy === \"open\"\n ? html`\n <div style=\"display: flex; flex-direction: column; gap: 6px; padding-left: 24px;\">\n <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n <input\n type=\"radio\"\n name=\"wa-group-mention\"\n .checked=${state.whatsappGroupRequireMention}\n @change=${() => state.onWhatsAppGroupMentionChange(true)}\n style=\"accent-color: #22c55e;\"\n />\n <div>\n <div style=\"font-size: 13px; color: var(--tasker-white);\">When mentioned</div>\n <div style=\"font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;\">Only responds when @mentioned</div>\n </div>\n </label>\n <label style=\"display: flex; align-items: center; gap: 8px; cursor: pointer;\">\n <input\n type=\"radio\"\n name=\"wa-group-mention\"\n .checked=${!state.whatsappGroupRequireMention}\n @change=${() => state.onWhatsAppGroupMentionChange(false)}\n style=\"accent-color: #22c55e;\"\n />\n <div>\n <div style=\"font-size: 13px; color: var(--tasker-white);\">Always respond</div>\n <div style=\"font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;\">Responds to every message in groups</div>\n </div>\n </label>\n </div>\n `\n : nothing}\n <div style=\"border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;\"></div>\n ${models.length > 0\n ? html`\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <div style=\"font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;\">Model</div>\n <select\n class=\"setup-model-select\"\n style=\"flex: 1;\"\n .value=${currentModelKey}\n @change=${(e: Event) => {\n state.onWhatsAppModelChange((e.target as HTMLSelectElement).value);\n }}\n >\n ${models.map(\n (m) => html`\n <option value=${\"anthropic/\" + m.id} ?selected=${currentModelKey === \"anthropic/\" + m.id}>\n ${m.shortName}\n </option>\n `,\n )}\n </select>\n </div>\n `\n : nothing}\n <div style=\"display: flex; align-items: center; gap: 8px;\">\n <div style=\"font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;\">Thinking</div>\n <select\n class=\"setup-model-select\"\n style=\"flex: 1;\"\n .value=${currentThinkingLevel}\n @change=${(e: Event) => {\n state.onWhatsAppThinkingChange((e.target as HTMLSelectElement).value);\n }}\n >\n ${SETUP_THINKING_LEVELS.map(\n (l) => html`\n <option value=${l.value} ?selected=${currentThinkingLevel === l.value}>\n ${l.label}\n </option>\n `,\n )}\n </select>\n </div>\n </div>\n <button\n class=\"setup-button secondary\"\n style=\"margin-top: 20px; width: 100%; padding: 10px;\"\n @click=${closeModal}\n >\n Close\n </button>\n </div>\n </div>\n `;\n}\n\n/** Render iMessage status row in the dashboard */\nfunction resolveIMessageState(state: SetupViewState) {\n const selectedWs = getSelectedWorkspace(state);\n const ownerWs = state.imessageOwnerWorkspace;\n const thisWsOwns = Boolean(selectedWs && ownerWs === selectedWs.name);\n const anotherWsOwns = Boolean(ownerWs && selectedWs && ownerWs !== selectedWs.name);\n return { selectedWs, ownerWs, thisWsOwns, anotherWsOwns };\n}\n\nfunction renderIMessageStatusRow(state: SetupViewState) {\n const { ownerWs, thisWsOwns, anotherWsOwns } = resolveIMessageState(state);\n\n // \"Connected\" requires this business to own iMessage via bindings.\n let status: \"good\" | \"bad\" | \"partial\" | \"unknown\";\n let statusText: string;\n if (anotherWsOwns) {\n status = \"partial\";\n statusText = `Connected to ${ownerWs}`;\n } else if (thisWsOwns && state.imessageConnected) {\n status = \"good\";\n statusText = \"Connected\";\n } else if (thisWsOwns && state.imessageRunning) {\n status = \"partial\";\n statusText = \"Running, not connected\";\n } else if (thisWsOwns) {\n status = \"bad\";\n statusText = \"Not running\";\n } else if (state.imessageConfigured) {\n status = \"unknown\";\n statusText = \"Not connected\";\n } else {\n status = \"bad\";\n statusText = \"Not configured\";\n }\n\n return html`\n <div class=\"setup-status-item\" style=\"flex-wrap: wrap;\">\n ${renderStatusLight(status)}\n <div class=\"setup-status-info\">\n <strong>iMessage</strong>\n <span>${statusText}</span>\n </div>\n ${renderInfoButton(\"imessage\", state)}\n <button\n class=\"setup-status-action ${state.imessageEnabling ? \"spinning\" : \"\"}\"\n ?disabled=${state.imessageEnabling}\n @click=${state.onIMessageEnable}\n title=\"${thisWsOwns ? \"Manage iMessage\" : \"Connect iMessage\"}\"\n >\n ${icons.rotateCw}\n </button>\n ${nothing}\n </div>\n `;\n}\n\nfunction renderIMessageActionModal(state: SetupViewState) {\n if (!state.imessageEnableConfirm) return nothing;\n const { ownerWs, thisWsOwns, anotherWsOwns } = resolveIMessageState(state);\n\n const closeModal = () => { state.onIMessageEnableCancel(); };\n\n // --- Connected to THIS business: show manage/disconnect ---\n if (thisWsOwns) {\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) closeModal();\n }}>\n <div class=\"setup-info-card\" style=\"text-align: center;\">\n <h3>iMessage</h3>\n <p style=\"color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;\">\n iMessage is connected to this business.\n </p>\n <p style=\"font-size: 12px; color: var(--tasker-text-grey); opacity: 0.6; margin-bottom: 16px;\">\n Self-chat only. Third-party iMessage DMs are not processed.\n </p>\n <button\n class=\"setup-button secondary\"\n style=\"width: 100%; padding: 10px; color: #ef4444; border-color: #ef4444;\"\n ?disabled=${state.imessageEnabling}\n @click=${() => { state.onIMessageDisconnect(); }}\n >\n ${state.imessageEnabling ? \"Disconnecting\\u2026\" : \"Disconnect iMessage\"}\n </button>\n <button\n class=\"setup-button secondary\"\n style=\"width: 100%; padding: 10px; margin-top: 8px;\"\n @click=${closeModal}\n >\n Close\n </button>\n </div>\n </div>\n `;\n }\n\n // --- Connected to ANOTHER business: offer to reassign ---\n if (anotherWsOwns) {\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) closeModal();\n }}>\n <div class=\"setup-info-card\" style=\"text-align: center;\">\n <h3>Connect iMessage</h3>\n <p style=\"color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;\">\n iMessage is currently connected to <strong style=\"text-transform: capitalize;\">${ownerWs}</strong>.\n Move it to this business?\n </p>\n <button\n class=\"setup-button primary\"\n style=\"width: 100%; padding: 10px;\"\n ?disabled=${state.imessageEnabling}\n @click=${() => { state.onIMessageReassign(); }}\n >\n ${state.imessageEnabling ? \"Connecting\\u2026\" : \"Connect to This Business\"}\n </button>\n <button\n class=\"setup-button secondary\"\n style=\"width: 100%; padding: 10px; margin-top: 8px;\"\n @click=${closeModal}\n >\n Cancel\n </button>\n </div>\n </div>\n `;\n }\n\n // --- Not connected: offer to connect ---\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) closeModal();\n }}>\n <div class=\"setup-info-card\" style=\"text-align: center;\">\n <h3>Enable iMessage</h3>\n <p style=\"color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;\">\n ${resolveBrand().name} will respond to messages in Messages.app for this business.\n </p>\n <button\n class=\"setup-button primary\"\n style=\"width: 100%; padding: 10px;\"\n ?disabled=${state.imessageEnabling}\n @click=${() => { state.onIMessageEnableConfirm(); }}\n >\n ${state.imessageEnabling ? \"Connecting\\u2026\" : \"Connect\"}\n </button>\n <button\n class=\"setup-button secondary\"\n style=\"width: 100%; padding: 10px; margin-top: 8px;\"\n @click=${closeModal}\n >\n Cancel\n </button>\n </div>\n </div>\n `;\n}\n\n/** Render the Account PIN status row with Set/Change action */\n/** Global admin section showing API key management (below account dashboard) */\nfunction renderApiKeysSection(state: SetupViewState) {\n if (!state.isMaster) return nothing;\n\n const providers = state.apiKeyProviders;\n const configured = providers.filter((p) => p.hasKey).length;\n const total = providers.length;\n\n return html`\n <div style=\"margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;\">\n <div class=\"setup-status-item\">\n ${renderStatusLight(configured > 0 ? \"good\" : \"bad\")}\n <div class=\"setup-status-info\">\n <strong>API Keys</strong>\n <span>${configured} of ${total} configured</span>\n </div>\n <button\n class=\"setup-link-btn\"\n @click=${() => state.onApiKeyModalOpen()}\n >Manage</button>\n </div>\n </div>\n ${renderApiKeysModal(state)}\n `;\n}\n\n/** Modal for managing API keys across all providers */\nfunction renderApiKeysModal(state: SetupViewState) {\n if (!state.apiKeyModalOpen) return nothing;\n\n const providers = state.apiKeyProviders;\n\n // Build a map of stored key values for comparison\n const storedKeys: Record<string, string> = {};\n for (const p of providers) if (p.key) storedKeys[p.id] = p.key;\n\n const handleSave = (providerId: string, el?: HTMLElement) => {\n const row = el?.closest(\".setup-apikey-input\") as HTMLElement | null;\n const input = row?.querySelector(\"input\") as HTMLInputElement | null;\n const value = input?.value.trim();\n if (!value || value === storedKeys[providerId]) return;\n state.onApiKeySave(providerId, value);\n };\n\n const toggleVisibility = (e: Event) => {\n const btn = (e.currentTarget as HTMLElement);\n const row = btn.closest(\".setup-apikey-input\") as HTMLElement;\n const input = row?.querySelector(\"input\") as HTMLInputElement | null;\n if (!input) return;\n const visible = input.type === \"text\";\n input.type = visible ? \"password\" : \"text\";\n btn.classList.toggle(\"active\", !visible);\n };\n\n const handleInput = (providerId: string, e: Event) => {\n const input = e.target as HTMLInputElement;\n const row = input.closest(\".setup-apikey-input\") as HTMLElement;\n const value = input.value.trim();\n const changed = value.length > 0 && value !== storedKeys[providerId];\n // Save only appears when value differs from stored\n const saveBtn = row?.querySelector(\".setup-apikey-save\") as HTMLElement | null;\n if (saveBtn) saveBtn.style.display = changed ? \"\" : \"none\";\n // Eye appears when there's any text in the input\n const eyeBtn = row?.querySelector(\".setup-apikey-eye\") as HTMLElement | null;\n if (eyeBtn) eyeBtn.style.display = value.length > 0 ? \"\" : \"none\";\n };\n\n return html`\n <div class=\"setup-info-overlay\" style=\"align-items: flex-start; padding-top: 72px;\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) {\n state.onApiKeyModalClose();\n }\n }}>\n <div class=\"setup-info-card\" style=\"max-width: 480px;\">\n <h3 style=\"margin: 0 0 4px; text-align: center;\">API Keys</h3>\n <div class=\"setup-apikey-list\">\n ${state.apiKeyError ? html`<p class=\"setup-error\" style=\"margin: 0;\">${state.apiKeyError}</p>` : nothing}\n ${state.apiKeySuccess ? html`<p class=\"login-success\" style=\"margin: 0;\">${state.apiKeySuccess}</p>` : nothing}\n ${providers.map((p) => html`\n <div class=\"setup-apikey-row\">\n <div class=\"setup-apikey-info\">\n <strong>${p.name}</strong>\n <span class=\"setup-apikey-category\">${p.category}</span>\n </div>\n <div class=\"setup-apikey-input\">\n <input\n type=\"password\"\n .value=${p.key ?? \"\"}\n placeholder=\"Enter key\"\n ?disabled=${state.apiKeyBusy}\n @input=${(e: Event) => handleInput(p.id, e)}\n @keydown=${(e: KeyboardEvent) => { if (e.key === \"Enter\") handleSave(p.id, e.target as HTMLElement); }}\n />\n <button\n class=\"setup-apikey-icon-btn setup-apikey-eye\"\n style=${p.hasKey ? \"\" : \"display: none;\"}\n title=\"Toggle visibility\"\n @click=${toggleVisibility}\n >${icons.eye}</button>\n <button\n class=\"setup-apikey-save setup-button\"\n style=\"display: none;\"\n ?disabled=${state.apiKeyBusy}\n @click=${(e: Event) => handleSave(p.id, e.currentTarget as HTMLElement)}\n >Save</button>\n ${p.hasKey ? html`\n <button\n class=\"setup-apikey-icon-btn danger\"\n title=\"Remove key\"\n ?disabled=${state.apiKeyBusy}\n @click=${() => state.onApiKeyRemove(p.id)}\n >${icons.trash}</button>\n ` : nothing}\n </div>\n </div>\n `)}\n </div>\n </div>\n </div>\n `;\n}\n\n/** Render software update status row in the dashboard */\nfunction renderUpdateRow(state: SetupViewState) {\n const statusLight: \"good\" | \"partial\" | \"unknown\" =\n state.updateAvailable === null\n ? \"unknown\"\n : state.updateAvailable\n ? \"partial\"\n : \"good\";\n\n const versionText =\n state.updateAvailable && state.latestVersion\n ? `v${state.currentVersion} → v${state.latestVersion}`\n : state.currentVersion\n ? `v${state.currentVersion}`\n : \"Unknown\";\n\n const isBusy = state.updateChecking || state.updateRunning;\n\n return html`\n <div class=\"setup-status-item\">\n ${renderStatusLight(statusLight)}\n <div class=\"setup-status-info\">\n <strong>Software</strong>\n <span>${versionText}</span>\n </div>\n ${renderInfoButton(\"update\", state)}\n ${state.updateAvailable\n ? html`\n <button\n class=\"setup-status-action ${isBusy ? \"spinning\" : \"\"}\"\n ?disabled=${isBusy}\n @click=${state.onUpdateRun}\n title=\"Update Now\"\n >\n ${icons.download}\n </button>\n `\n : html`\n <button\n class=\"setup-status-action ${isBusy ? \"spinning\" : \"\"}\"\n ?disabled=${isBusy}\n @click=${state.onUpdateCheck}\n title=\"Check for Updates\"\n >\n ${icons.rotateCw}\n </button>\n `}\n </div>\n `;\n}\n\nfunction renderAccountPinRow(state: SetupViewState) {\n const hasPin = state.accountHasPin;\n const status: \"good\" | \"bad\" = hasPin ? \"good\" : \"bad\";\n\n return html`\n <div class=\"setup-status-item\">\n ${renderStatusLight(status)}\n <div class=\"setup-status-info\">\n <strong>Account PIN</strong>\n <span>${hasPin ? \"Set\" : \"Not set\"}</span>\n </div>\n <button\n class=\"setup-link-btn\"\n @click=${() => state.onAccountPinModalOpen()}\n >${hasPin ? \"Change\" : \"Set PIN\"}</button>\n </div>\n `;\n}\n\n/** Modal for setting or changing an account PIN */\nfunction renderAccountPinModal(state: SetupViewState) {\n if (!state.accountPinModalOpen) return nothing;\n\n const hasPin = state.accountHasPin;\n const busy = state.accountPinBusy;\n\n let oldPin = \"\";\n let newPin = \"\";\n let confirmPin = \"\";\n\n const pinInputHandler = (setter: (v: string) => void) => (e: Event) => {\n const input = e.target as HTMLInputElement;\n input.value = input.value.replace(/\\D/g, \"\").slice(0, 6);\n setter(input.value);\n };\n\n const showValidationError = (form: HTMLFormElement, msg: string) => {\n let el = form.querySelector(\".pin-modal-validation\") as HTMLElement | null;\n if (!el) {\n el = document.createElement(\"p\");\n el.className = \"login-error pin-modal-validation\";\n form.querySelector(\"button[type=submit]\")?.before(el);\n }\n el.textContent = msg;\n };\n\n const handleSubmit = (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n if (busy) return;\n if (hasPin && !oldPin) { showValidationError(form, \"Enter your current PIN\"); return; }\n if (!newPin) { showValidationError(form, \"Enter a new PIN\"); return; }\n if (!confirmPin) { showValidationError(form, \"Confirm your new PIN\"); return; }\n if (newPin !== confirmPin) { showValidationError(form, \"PINs do not match\"); return; }\n if (newPin.length < 4) { showValidationError(form, \"PIN must be 4–6 digits\"); return; }\n state.onAccountPinSave(hasPin ? oldPin : null, newPin);\n };\n\n return html`\n <div class=\"setup-info-overlay\" @click=${(e: Event) => {\n if ((e.target as HTMLElement).classList.contains(\"setup-info-overlay\")) {\n state.onAccountPinModalClose();\n }\n }}>\n <div class=\"setup-info-card\" style=\"max-width: 340px;\">\n <div class=\"setup-info-header\">\n <h3>${hasPin ? \"Change Account PIN\" : \"Set Account PIN\"}</h3>\n <button class=\"setup-info-close\" @click=${() => state.onAccountPinModalClose()}>\n ${icons.close}\n </button>\n </div>\n <form @submit=${handleSubmit} style=\"display: flex; flex-direction: column; gap: 12px; padding: 16px 0 8px;\">\n ${hasPin ? html`\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"Current PIN\"\n ?disabled=${busy}\n @input=${pinInputHandler((v: string) => { oldPin = v; })}\n autofocus\n />\n ` : nothing}\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"New PIN (4–6 digits)\"\n ?disabled=${busy}\n @input=${pinInputHandler((v: string) => { newPin = v; })}\n ${hasPin ? nothing : html`autofocus`}\n />\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"Confirm PIN\"\n ?disabled=${busy}\n @input=${pinInputHandler((v: string) => { confirmPin = v; })}\n />\n ${state.accountPinError\n ? html`<p class=\"login-error\">${state.accountPinError}</p>`\n : nothing}\n ${state.accountPinSuccess\n ? html`<p class=\"login-success\">${state.accountPinSuccess}</p>`\n : nothing}\n <button\n class=\"login-submit\"\n type=\"submit\"\n ?disabled=${busy}\n >${busy ? html`<span class=\"login-spinner\"></span>` : hasPin ? \"Change PIN\" : \"Set PIN\"}</button>\n </form>\n </div>\n </div>\n `;\n}\n\n/** Render the add-account form (triggered from dropdown \"Add Account\") */\nfunction renderAddAccountForm(state: SetupViewState) {\n if (!state.addingWorkspace) return nothing;\n const { workspaceSaving } = state;\n return html`\n <div style=\"margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;\">\n <div class=\"setup-add-account\">\n <strong>New Account</strong>\n <input\n type=\"text\"\n class=\"setup-add-account-input\"\n placeholder=\"\"\n .value=${state.newWorkspaceName}\n @input=${(e: Event) => state.onSetNewWorkspaceName((e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\" && state.newWorkspaceName.trim() && state.newWorkspacePin.match(/^\\d{4,6}$/)) {\n state.onWorkspaceCreate(\n state.newWorkspaceName,\n state.newWorkspacePath || undefined,\n );\n }\n }}\n />\n <input\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n class=\"setup-add-account-input\"\n placeholder=\"PIN for this account (4-6 digits)\"\n .value=${state.newWorkspacePin}\n @input=${(e: Event) => {\n const input = e.target as HTMLInputElement;\n input.value = input.value.replace(/\\D/g, \"\").slice(0, 6);\n state.onSetNewWorkspacePin(input.value);\n }}\n />\n <details style=\"margin-top: 8px;\">\n <summary style=\"cursor: pointer; font-size: 12px; color: var(--tasker-text-grey);\">\n Use existing workspace (advanced)\n </summary>\n <input\n type=\"text\"\n class=\"setup-add-account-input\"\n placeholder=\"/path/to/workspace\"\n style=\"margin-top: 8px;\"\n .value=${state.newWorkspacePath}\n @input=${(e: Event) => state.onSetNewWorkspacePath((e.target as HTMLInputElement).value)}\n />\n </details>\n <div class=\"setup-add-account-actions\" style=\"margin-top: 8px;\">\n <button\n class=\"setup-button primary\"\n ?disabled=${workspaceSaving || !state.newWorkspaceName.trim() || !state.newWorkspacePin.match(/^\\d{4,6}$/)}\n @click=${() => state.onWorkspaceCreate(\n state.newWorkspaceName,\n state.newWorkspacePath || undefined,\n )}\n >\n ${workspaceSaving ? \"Creating\\u2026\" : \"Create\"}\n </button>\n <button\n class=\"setup-button secondary\"\n @click=${() => {\n state.onSetAddingWorkspace(false);\n state.onSetNewWorkspaceName(\"\");\n state.onSetNewWorkspacePath(\"\");\n state.onSetNewWorkspacePin(\"\");\n }}\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\n/** Render the remove-account confirmation (shown for non-default workspaces) */\nfunction renderRemoveAccountSection(state: SetupViewState) {\n const ws = getSelectedWorkspace(state);\n if (!ws || ws.isDefault) return nothing;\n\n const isRemoveConfirm = state.workspaceRemoveConfirm === ws.name;\n if (isRemoveConfirm) {\n return html`\n <div style=\"margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 12px;\">\n <div style=\"font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;\">\n <span style=\"color: var(--tasker-danger, #ef4444);\">Remove \"${ws.displayName ?? ws.name}\" and its WhatsApp account?</span>\n <button\n class=\"setup-button danger\"\n style=\"font-size: 12px; padding: 4px 12px;\"\n ?disabled=${state.workspaceSaving}\n @click=${() => state.onWorkspaceRemove(ws.name)}\n >\n ${state.workspaceSaving ? \"Removing\\u2026\" : \"Remove\"}\n </button>\n <button\n class=\"setup-button secondary\"\n style=\"font-size: 12px; padding: 4px 12px;\"\n @click=${() => state.onSetWorkspaceRemoveConfirm(null)}\n >\n Cancel\n </button>\n </div>\n </div>\n `;\n }\n\n return html`\n <p class=\"setup-hint\" style=\"margin-top: 12px;\">\n <a\n href=\"#\"\n class=\"setup-link-danger\"\n @click=${(e: Event) => {\n e.preventDefault();\n state.onSetWorkspaceRemoveConfirm(ws.name);\n }}\n >Remove Account</a>\n </p>\n `;\n}\n\nfunction renderWhatsAppStep(state: SetupViewState) {\n const {\n whatsappBusy,\n whatsappLoginMessage,\n whatsappLoginQrDataUrl,\n whatsappLoginConnected,\n whatsappChannelStatus,\n } = state;\n\n // PRIORITY 1: Show QR code if we have one (user clicked Link WhatsApp)\n if (whatsappLoginQrDataUrl) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <h1>Scan with WhatsApp</h1>\n <p>\n On your phone: WhatsApp → Settings → Linked Devices → Link a Device\n </p>\n <div class=\"setup-qr\">\n <img src=${whatsappLoginQrDataUrl} alt=\"WhatsApp QR Code\" />\n </div>\n ${whatsappBusy\n ? html`<p class=\"setup-waiting\">Waiting for scan...</p>`\n : html`<p class=\"setup-hint\">\n Scan the code above with your phone\n </p>`}\n <p class=\"setup-hint\" style=\"margin-top: 16px;\">\n <strong>Important:</strong> If you see \"${resolveBrand().name}\" in your Linked\n Devices, remove it first before scanning.\n </p>\n <div class=\"setup-actions\" style=\"margin-top: 24px;\">\n <button\n class=\"setup-button secondary\"\n @click=${state.onWhatsAppBack}\n >\n ← Back\n </button>\n </div>\n </div>\n </div>\n `;\n }\n\n // PRIORITY 2: Show loading state\n if (whatsappBusy) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>${whatsappLoginMessage || \"Connecting to WhatsApp...\"}</p>\n </div>\n </div>\n `;\n }\n\n // Determine the REAL WhatsApp status\n const isReallyConnected =\n whatsappChannelStatus?.running && whatsappChannelStatus?.connected;\n\n // PRIORITY 3: Show status dashboard when we have channel status\n if (whatsappChannelStatus) {\n const hasMultipleAccounts = state.whatsappAccounts.length > 1;\n\n // For multi-account: overall status is \"good\" if ALL baileys accounts are connected\n const allConnected = hasMultipleAccounts\n ? state.whatsappAccounts.every((a) => a.running && a.connected)\n : isReallyConnected;\n\n // Everything working - show success\n if (allConnected && state.authConnected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card setup-success\">\n ${renderDashboardHeader(state)}\n <div class=\"setup-status-dashboard\">\n ${renderGatewayStatusRow(state)}\n ${renderClaudeStatusRow(state)}\n ${renderLicenseStatusRow(state)}\n ${renderWhatsAppStatusRow(state)}\n ${renderIMessageStatusRow(state)}\n ${renderAccountPinRow(state)}\n ${renderUpdateRow(state)}\n </div>\n\n ${renderAccountPinModal(state)}\n ${renderApiKeysSection(state)}\n ${renderAddAccountForm(state)}\n ${renderRemoveAccountSection(state)}\n ${state.workspacesError\n ? html`<p class=\"setup-error\" style=\"margin-top: 8px;\">${state.workspacesError}</p>`\n : nothing}\n </div>\n </div>\n `;\n }\n\n // Something is wrong - show status with actions\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderDashboardHeader(state)}\n <div class=\"setup-status-dashboard\">\n ${renderGatewayStatusRow(state)}\n ${renderClaudeStatusRow(state)}\n ${renderLicenseStatusRow(state)}\n ${renderWhatsAppStatusRow(state)}\n ${renderIMessageStatusRow(state)}\n ${renderUpdateRow(state)}\n </div>\n\n ${renderApiKeysSection(state)}\n ${renderAddAccountForm(state)}\n ${renderRemoveAccountSection(state)}\n ${state.workspacesError\n ? html`<p class=\"setup-error\" style=\"margin-top: 8px;\">${state.workspacesError}</p>`\n : nothing}\n </div>\n </div>\n `;\n }\n\n // No channel status yet - need to fetch it\n // Don't show success without real channel confirmation\n if (!whatsappChannelStatus) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"whatsapp\")}\n <div class=\"setup-spinner\"></div>\n <p>Checking connection status...</p>\n <button\n class=\"setup-button secondary\"\n style=\"margin-top: 16px;\"\n @click=${state.onRefreshStatus}\n >\n Refresh Status\n </button>\n </div>\n </div>\n `;\n }\n\n // Error state - login failed\n const isError =\n whatsappLoginConnected === false && whatsappLoginMessage && !whatsappBusy;\n if (isError) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"whatsapp\")}\n <div class=\"setup-status-row\">\n ${renderStatusLight(\"bad\")}\n <span>Connection Failed</span>\n </div>\n <p class=\"setup-error\">${whatsappLoginMessage}</p>\n <button\n class=\"setup-button primary\"\n ?disabled=${whatsappBusy}\n @click=${state.onWhatsAppRelink}\n >\n Try Again\n </button>\n </div>\n </div>\n `;\n }\n\n // QR code and loading states are now handled at the top of the function\n\n // Initial/waiting state\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n ${renderStepIndicator(\"whatsapp\")}\n ${whatsappLoginMessage\n ? html`<p class=\"setup-error\">${whatsappLoginMessage}</p>`\n : html`<div class=\"setup-spinner\"></div>\n <p>Preparing...</p>`}\n </div>\n </div>\n `;\n}\n\nexport function renderSetup(state: SetupViewState) {\n const { connected, currentStep } = state;\n\n // Not connected to gateway\n if (!connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n // Render current step\n let stepContent;\n switch (currentStep) {\n case \"license\":\n stepContent = renderLicenseStep(state);\n break;\n case \"auth\":\n stepContent = renderAuthStep(state);\n break;\n case \"whatsapp\":\n case \"complete\":\n stepContent = renderWhatsAppStep(state);\n break;\n default:\n stepContent = renderLicenseStep(state);\n }\n\n const pageNav = renderPageNav(\"Setup\", state.wsProps);\n return html`${stepContent}${renderInfoModal(state)}${renderIMessageActionModal(state)}${renderWhatsAppSettingsModal(state)}${pageNav}`;\n}\n","import { html, nothing } from \"lit\";\nimport type { AdminPhoneEntry } from \"../types.admins\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\n\nexport type { AdminPhoneEntry } from \"../types.admins\";\n\nexport type AdminsProps = {\n connected?: boolean;\n loading: boolean;\n saving: boolean;\n phones: AdminPhoneEntry[];\n error: string | null;\n newPhone: string;\n wsProps?: WorkspaceNavProps;\n onRefresh: () => void;\n onAdd: (phone: string) => void;\n onRemove: (phone: string) => void;\n onNewPhoneChange: (value: string) => void;\n};\n\nfunction renderPhoneEntry(entry: AdminPhoneEntry, props: AdminsProps) {\n const subtitle = entry.paired\n ? \"Paired phone (used to link WhatsApp)\"\n : \"Admin access via WhatsApp DM\";\n\n return html`\n <div class=\"sp-list-item\">\n <div class=\"sp-list-item-main\">\n <div class=\"sp-list-item-title\">${entry.phone}</div>\n <div class=\"sp-list-item-sub\">${subtitle}</div>\n </div>\n ${entry.paired\n ? html`<span style=\"color: var(--tasker-orange); font-size: 13px; padding: 8px 16px;\">Primary</span>`\n : html`<button\n class=\"setup-button danger\"\n style=\"padding: 8px 16px; font-size: 13px;\"\n ?disabled=${props.saving}\n @click=${() => props.onRemove(entry.phone)}\n >\n Remove\n </button>`}\n </div>\n `;\n}\n\n/**\n * Render admins page as a standalone dark-themed page (like Setup/Files/Browser).\n */\nexport function renderAdminsPage(props: AdminsProps) {\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n const handleSubmit = (e: Event) => {\n e.preventDefault();\n if (props.newPhone.trim()) {\n props.onAdd(props.newPhone);\n }\n };\n\n return html`\n <div class=\"setup-container\">\n ${renderPageNav(\"Admins\", props.wsProps)}\n <div class=\"setup-card\" style=\"max-width: 520px;\">\n <h1>Admin Phones</h1>\n <p style=\"margin-bottom: 16px;\">\n Phone numbers that route to the admin agent instead of the public agent.\n </p>\n\n <div class=\"sp-toolbar\">\n <button\n class=\"setup-button secondary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.loading}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading...\" : \"Refresh\"}\n </button>\n </div>\n\n ${props.error\n ? html`<div class=\"setup-error\" style=\"margin-top: 16px;\">${props.error}</div>`\n : nothing}\n\n <form style=\"display: flex; flex-direction: row; gap: 12px; margin-top: 20px; align-items: stretch;\" @submit=${handleSubmit}>\n <input\n type=\"tel\"\n style=\"flex: 1; padding: 10px 14px; font-size: 14px; border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.15); background: rgba(0, 0, 0, 0.3); color: var(--tasker-white); font-family: inherit;\"\n placeholder=\"+44...\"\n .value=${props.newPhone}\n @input=${(e: Event) => props.onNewPhoneChange((e.target as HTMLInputElement).value)}\n ?disabled=${props.saving}\n />\n <button\n type=\"submit\"\n class=\"setup-button primary\"\n style=\"padding: 10px 20px; font-size: 14px; flex-shrink: 0;\"\n ?disabled=${props.saving || !props.newPhone.trim()}\n >\n ${props.saving ? \"Saving...\" : \"Add\"}\n </button>\n </form>\n\n <div class=\"sp-list\" style=\"margin-top: 20px;\">\n ${props.phones.length === 0\n ? html`<div class=\"sp-list-empty\">No admin phones configured yet.</div>`\n : props.phones.map((entry) => renderPhoneEntry(entry, props))}\n </div>\n\n <div class=\"setup-hint\" style=\"margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;\">\n <strong style=\"color: var(--tasker-white);\">How it works:</strong><br/>\n Messages from admin phones route to the <code style=\"background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);\">admin</code> agent with full tool access.\n All other numbers go to <code style=\"background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);\">public</code> with restricted access.\n </div>\n\n </div>\n </div>\n `;\n}\n\n/**\n * Render admins as an embedded card (for use in the main dashboard).\n */\nexport function renderAdmins(props: AdminsProps) {\n const handleSubmit = (e: Event) => {\n e.preventDefault();\n if (props.newPhone.trim()) {\n props.onAdd(props.newPhone);\n }\n };\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Admin Phone Numbers</div>\n <div class=\"card-sub\">\n Phone numbers that route to the admin agent instead of the public agent.\n </div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading...\" : \"Refresh\"}\n </button>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.error}\n </div>`\n : nothing}\n\n <form class=\"row\" style=\"margin-top: 16px; gap: 8px;\" @submit=${handleSubmit}>\n <input\n type=\"tel\"\n class=\"input\"\n placeholder=\"+44...\"\n .value=${props.newPhone}\n @input=${(e: Event) => props.onNewPhoneChange((e.target as HTMLInputElement).value)}\n style=\"flex: 1; min-width: 180px;\"\n ?disabled=${props.saving}\n />\n <button\n type=\"submit\"\n class=\"btn primary\"\n ?disabled=${props.saving || !props.newPhone.trim()}\n >\n ${props.saving ? \"Saving...\" : \"Add Admin\"}\n </button>\n </form>\n\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.phones.length === 0\n ? html`<div class=\"muted\">No admin phones configured yet.</div>`\n : props.phones.map((entry) => renderPhoneEntryDashboard(entry, props))}\n </div>\n\n <div class=\"callout\" style=\"margin-top: 16px;\">\n <strong>How it works:</strong> Messages from admin phone numbers are routed to the\n <code>admin</code> agent, which has full access to all tools. All other numbers\n go to the <code>public</code> agent with restricted access.\n </div>\n </section>\n `;\n}\n\nfunction renderPhoneEntryDashboard(entry: AdminPhoneEntry, props: AdminsProps) {\n const subtitle = entry.paired\n ? \"Paired phone (used to link WhatsApp)\"\n : \"Admin access via WhatsApp DM\";\n\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.phone}</div>\n <div class=\"list-sub\">${subtitle}</div>\n </div>\n <div class=\"list-actions\">\n ${entry.paired\n ? html`<span class=\"muted\" style=\"font-size: 13px;\">Primary</span>`\n : html`<button\n class=\"btn small danger\"\n ?disabled=${props.saving}\n @click=${() => props.onRemove(entry.phone)}\n >\n Remove\n </button>`}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport type { CustomerRecord } from \"../controllers/customers\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\n\nexport type CustomersProps = {\n connected: boolean;\n wsProps?: WorkspaceNavProps;\n loading: boolean;\n saving: boolean;\n records: CustomerRecord[];\n error: string | null;\n searchQuery: string;\n editingId: string | null;\n showAddForm: boolean;\n newRecordPhone: string;\n newRecordName: string;\n onSearch: (query: string) => void;\n onSearchSubmit: () => void;\n onAdd: (phone: string, name: string) => void;\n onDelete: (id: string) => void;\n onSetField: (id: string, key: string, value: string) => void;\n onDeleteField: (id: string, key: string) => void;\n onToggleExpand: (id: string) => void;\n onShowAddForm: () => void;\n onCancelAddForm: () => void;\n onNewRecordPhoneChange: (value: string) => void;\n onNewRecordNameChange: (value: string) => void;\n onRefresh: () => void;\n};\n\nfunction fieldCount(record: CustomerRecord): number {\n return Object.keys(record.fields).length;\n}\n\nfunction renderFieldEditor(record: CustomerRecord, props: CustomersProps) {\n const entries = Object.entries(record.fields);\n\n return html`\n <div class=\"customers-record-fields\">\n ${entries.length === 0\n ? html`<div style=\"color: rgba(255,255,255,0.4); font-size: 13px; margin-top: 12px;\">No fields yet. Add one below.</div>`\n : entries.map(\n ([key, value]) => html`\n <div class=\"customers-field-row\">\n <input\n class=\"field-key\"\n type=\"text\"\n .value=${key}\n disabled\n title=\"Field name\"\n />\n <input\n class=\"field-value\"\n type=\"text\"\n .value=${value}\n @change=${(e: Event) =>\n props.onSetField(record.id, key, (e.target as HTMLInputElement).value)}\n ?disabled=${props.saving}\n title=\"Field value\"\n />\n <button\n class=\"setup-button danger field-delete\"\n ?disabled=${props.saving}\n @click=${() => props.onDeleteField(record.id, key)}\n >\n ×\n </button>\n </div>\n `,\n )}\n <div class=\"customers-record-actions\">\n <button\n class=\"setup-button secondary\"\n style=\"font-size: 13px; padding: 8px 14px;\"\n ?disabled=${props.saving}\n @click=${() => {\n const key = prompt(\"Field name (e.g. status, plan, notes):\");\n if (!key?.trim()) return;\n const value = prompt(`Value for \"${key.trim()}\":`);\n if (value === null) return;\n props.onSetField(record.id, key.trim(), value);\n }}\n >\n + Add Field\n </button>\n <button\n class=\"setup-button danger\"\n style=\"font-size: 13px; padding: 8px 14px;\"\n ?disabled=${props.saving}\n @click=${() => {\n if (confirm(`Delete customer \"${record.name}\" (${record.id})?`)) {\n props.onDelete(record.id);\n }\n }}\n >\n Delete Customer\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderRecord(record: CustomerRecord, props: CustomersProps) {\n const expanded = props.editingId === record.id;\n const fields = fieldCount(record);\n const fieldLabel = fields === 0 ? \"No fields\" : `${fields} field${fields > 1 ? \"s\" : \"\"}`;\n\n return html`\n <div class=\"customers-record\">\n <div\n class=\"customers-record-header\"\n @click=${() => props.onToggleExpand(record.id)}\n >\n <div class=\"customers-record-info\">\n <span class=\"customers-record-name\">${record.name}</span>\n <span class=\"customers-record-phone\">${record.id}</span>\n </div>\n <span class=\"customers-record-meta\">${fieldLabel}</span>\n </div>\n ${expanded ? renderFieldEditor(record, props) : nothing}\n </div>\n `;\n}\n\nexport function renderCustomersPage(props: CustomersProps) {\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n const handleSearchSubmit = (e: Event) => {\n e.preventDefault();\n props.onSearchSubmit();\n };\n\n const handleAddSubmit = (e: Event) => {\n e.preventDefault();\n if (props.newRecordPhone.trim() && props.newRecordName.trim()) {\n props.onAdd(props.newRecordPhone, props.newRecordName);\n }\n };\n\n return html`\n <div class=\"setup-container\">\n ${renderPageNav(\"Customers\", props.wsProps)}\n <div class=\"setup-card\" style=\"max-width: 620px;\">\n <h1>Customer Records</h1>\n <p style=\"margin-bottom: 16px;\">\n Verified customer data managed by the business owner. Agents can read these records but cannot modify them.\n </p>\n\n <div class=\"sp-toolbar\" style=\"display: flex; gap: 8px;\">\n <button\n class=\"setup-button secondary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.loading}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading...\" : \"Refresh\"}\n </button>\n <button\n class=\"setup-button primary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n @click=${props.onShowAddForm}\n >\n + Add Customer\n </button>\n </div>\n\n ${props.error\n ? html`<div class=\"setup-error\" style=\"margin-top: 16px;\">${props.error}</div>`\n : nothing}\n\n ${props.showAddForm\n ? html`\n <form class=\"customers-add-form\" @submit=${handleAddSubmit}>\n <input\n type=\"tel\"\n placeholder=\"+447490553305\"\n .value=${props.newRecordPhone}\n @input=${(e: Event) =>\n props.onNewRecordPhoneChange((e.target as HTMLInputElement).value)}\n ?disabled=${props.saving}\n />\n <input\n type=\"text\"\n placeholder=\"Customer name\"\n .value=${props.newRecordName}\n @input=${(e: Event) =>\n props.onNewRecordNameChange((e.target as HTMLInputElement).value)}\n ?disabled=${props.saving}\n />\n <div class=\"customers-add-form-buttons\">\n <button\n type=\"submit\"\n class=\"setup-button primary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n ?disabled=${props.saving || !props.newRecordPhone.trim() || !props.newRecordName.trim()}\n >\n ${props.saving ? \"Saving...\" : \"Add\"}\n </button>\n <button\n type=\"button\"\n class=\"setup-button secondary\"\n style=\"padding: 10px 20px; font-size: 14px;\"\n @click=${props.onCancelAddForm}\n >\n Cancel\n </button>\n </div>\n </form>\n `\n : nothing}\n\n <form\n class=\"customers-search\"\n style=\"margin-top: 16px;\"\n @submit=${handleSearchSubmit}\n >\n <input\n type=\"text\"\n placeholder=\"Search by name or phone...\"\n .value=${props.searchQuery}\n @input=${(e: Event) => props.onSearch((e.target as HTMLInputElement).value)}\n />\n <button\n type=\"submit\"\n class=\"setup-button secondary\"\n style=\"padding: 10px 20px; font-size: 14px; flex-shrink: 0;\"\n >\n Search\n </button>\n </form>\n\n <div style=\"margin-top: 16px;\">\n ${props.records.length === 0\n ? html`<div class=\"customers-empty\">\n ${props.searchQuery.trim()\n ? `No records matching \"${props.searchQuery}\".`\n : \"No customer records yet. Add one to get started.\"}\n </div>`\n : props.records.map((record) => renderRecord(record, props))}\n </div>\n\n <div class=\"setup-hint\" style=\"margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;\">\n <strong style=\"color: var(--tasker-white);\">How it works:</strong><br/>\n Records stored here are <strong>read-only for agents</strong> — they use the\n <code style=\"background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);\">customer_lookup</code>\n tool to check payment status and account details, but cannot modify them. This prevents prompt injection from altering sensitive data.\n </div>\n </div>\n </div>\n `;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with <html>... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via <svg>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either <annotation-xml> or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via <math>. If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // <math> and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '<remove></remove>' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '<!-->';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('<!---->');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * marked v17.0.1 - a markdown parser\n * Copyright (c) 2018-2025, MarkedJS. (MIT License)\n * Copyright (c) 2011-2018, Christopher Jeffrey. (MIT License)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\nfunction L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var T=L();function Z(u){T=u}var C={exec:()=>null};function k(u,e=\"\"){let t=typeof u==\"string\"?u:u.source,n={replace:(r,i)=>{let s=typeof i==\"string\"?i:i.source;return s=s.replace(m.caret,\"$1\"),t=t.replace(r,s),n},getRegex:()=>new RegExp(t,e)};return n}var me=(()=>{try{return!!new RegExp(\"(?<=1)(?<!1)\")}catch{return!1}})(),m={codeRemoveIndent:/^(?: {1,4}| {0,3}\\t)/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,listReplaceTabs:/^\\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,unescapeTest:/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:u=>new RegExp(`^( {0,3}${u})((?:[\t ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \t][^\\\\n]*)?(?:\\\\n|$))`),hrRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`),fencesBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}(?:\\`\\`\\`|~~~)`),headingBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}#`),htmlBeginRegex:u=>new RegExp(`^ {0,${Math.min(3,u-1)}}<(?:[a-z].*>|!--)`,\"i\")},xe=/^(?:[ \\t]*(?:\\n|$))+/,be=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,I=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,Te=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,N=/(?:[*+-]|\\d{1,9}[.)])/,re=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,se=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,\"\").getRegex(),Oe=k(re).replace(/bull/g,N).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),Q=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,we=/^[^\\n]+/,F=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,ye=k(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(\"label\",F).replace(\"title\",/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),Pe=k(/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/).replace(/bull/g,N).getRegex(),v=\"address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",j=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Se=k(\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ \t]*)+\\\\n|$))\",\"i\").replace(\"comment\",j).replace(\"tag\",v).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),ie=k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),$e=k(/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/).replace(\"paragraph\",ie).getRegex(),U={blockquote:$e,code:be,def:ye,fences:Re,heading:Te,hr:I,html:Se,lheading:se,list:Pe,newline:xe,paragraph:ie,table:C,text:we},te=k(\"^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\").replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\"(?: {4}| {0,3}\t)[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex(),_e={...U,lheading:Oe,table:te,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",\" {0,3}#{1,6}(?:\\\\s|$)\").replace(\"|lheading\",\"\").replace(\"table\",te).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",v).getRegex()},Le={...U,html:k(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",j).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:C,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:k(Q).replace(\"hr\",I).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",se).replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").replace(\"|tag\",\"\").getRegex()},Me=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,oe=/^( {2,}|\\\\)\\n(?!\\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,D=/[\\p{P}\\p{S}]/u,K=/[\\s\\p{P}\\p{S}]/u,ae=/[^\\s\\p{P}\\p{S}]/u,Ce=k(/^((?![*_])punctSpace)/,\"u\").replace(/punctSpace/g,K).getRegex(),le=/(?!~)[\\p{P}\\p{S}]/u,Ie=/(?!~)[\\s\\p{P}\\p{S}]/u,Ee=/(?:[^\\s\\p{P}\\p{S}]|~)/u,Be=k(/link|precode-code|html/,\"g\").replace(\"link\",/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(\"precode-\",me?\"(?<!`)()\":\"(^^|[^`])\").replace(\"code\",/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(\"html\",/<(?! )[^<>]*?>/).getRegex(),ue=/^(?:\\*+(?:((?!\\*)punct)|[^\\s*]))|^_+(?:((?!_)punct)|([^\\s_]))/,qe=k(ue,\"u\").replace(/punct/g,D).getRegex(),ve=k(ue,\"u\").replace(/punct/g,le).getRegex(),pe=\"^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)\",De=k(pe,\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),He=k(pe,\"gu\").replace(/notPunctSpace/g,Ee).replace(/punctSpace/g,Ie).replace(/punct/g,le).getRegex(),Ze=k(\"^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)\",\"gu\").replace(/notPunctSpace/g,ae).replace(/punctSpace/g,K).replace(/punct/g,D).getRegex(),Ge=k(/\\\\(punct)/,\"gu\").replace(/punct/g,D).getRegex(),Ne=k(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(\"scheme\",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(\"email\",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Qe=k(j).replace(\"(?:-->|$)\",\"-->\").getRegex(),Fe=k(\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\").replace(\"comment\",Qe).replace(\"attribute\",/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),q=/(?:\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+[^`]*?`+(?!`)|[^\\[\\]\\\\`])*?/,je=k(/^!?\\[(label)\\]\\(\\s*(href)(?:(?:[ \\t]*(?:\\n[ \\t]*)?)(title))?\\s*\\)/).replace(\"label\",q).replace(\"href\",/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]*/).replace(\"title\",/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),ce=k(/^!?\\[(label)\\]\\[(ref)\\]/).replace(\"label\",q).replace(\"ref\",F).getRegex(),he=k(/^!?\\[(ref)\\](?:\\[\\])?/).replace(\"ref\",F).getRegex(),Ue=k(\"reflink|nolink(?!\\\\()\",\"g\").replace(\"reflink\",ce).replace(\"nolink\",he).getRegex(),ne=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,W={_backpedal:C,anyPunctuation:Ge,autolink:Ne,blockSkip:Be,br:oe,code:ze,del:C,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ze,escape:Me,link:je,nolink:he,punctuation:Ce,reflink:ce,reflinkSearch:Ue,tag:Fe,text:Ae,url:C},Ke={...W,link:k(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",q).getRegex(),reflink:k(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",q).getRegex()},G={...W,emStrongRDelimAst:He,emStrongLDelim:ve,url:k(/^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(\"protocol\",ne).replace(\"email\",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:k(/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/).replace(\"protocol\",ne).getRegex()},We={...G,br:k(oe).replace(\"{2,}\",\"*\").getRegex(),text:k(G.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()},E={normal:U,gfm:_e,pedantic:Le},M={normal:W,gfm:G,breaks:We,pedantic:Ke};var Xe={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},ke=u=>Xe[u];function w(u,e){if(e){if(m.escapeTest.test(u))return u.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(u))return u.replace(m.escapeReplaceNoEncode,ke);return u}function X(u){try{u=encodeURI(u).replace(m.percentDecode,\"%\")}catch{return null}return u}function J(u,e){let t=u.replace(m.findPipe,(i,s,a)=>{let o=!1,l=s;for(;--l>=0&&a[l]===\"\\\\\";)o=!o;return o?\"|\":\" |\"}),n=t.split(m.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(\"\");for(;r<n.length;r++)n[r]=n[r].trim().replace(m.slashPipe,\"|\");return n}function z(u,e,t){let n=u.length;if(n===0)return\"\";let r=0;for(;r<n;){let i=u.charAt(n-r-1);if(i===e&&!t)r++;else if(i!==e&&t)r++;else break}return u.slice(0,n-r)}function de(u,e){if(u.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<u.length;n++)if(u[n]===\"\\\\\")n++;else if(u[n]===e[0])t++;else if(u[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function ge(u,e,t,n,r){let i=e.href,s=e.title||null,a=u[1].replace(r.other.outputLinkReplace,\"$1\");n.state.inLink=!0;let o={type:u[0].charAt(0)===\"!\"?\"image\":\"link\",raw:t,href:i,title:s,text:a,tokens:n.inlineTokens(a)};return n.state.inLink=!1,o}function Je(u,e,t){let n=u.match(t.other.indentCodeCompensation);if(n===null)return e;let r=n[1];return e.split(`\n`).map(i=>{let s=i.match(t.other.beginningSpace);if(s===null)return i;let[a]=s;return a.length>=r.length?i.slice(r.length):i}).join(`\n`)}var y=class{options;rules;lexer;constructor(e){this.options=e||T}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:\"space\",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=t[0].replace(this.rules.other.codeRemoveIndent,\"\");return{type:\"code\",raw:t[0],codeBlockStyle:\"indented\",text:this.options.pedantic?n:z(n,`\n`)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],r=Je(n,t[3]||\"\",this.rules);return{type:\"code\",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,\"$1\"):t[2],text:r}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let r=z(n,\"#\");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(n=r.trim())}return{type:\"heading\",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:\"hr\",raw:z(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=z(t[0],`\n`).split(`\n`),r=\"\",i=\"\",s=[];for(;n.length>0;){let a=!1,o=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))o.push(n[l]),a=!0;else if(!a)o.push(n[l]);else break;n=n.slice(l);let p=o.join(`\n`),c=p.replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,\"\");r=r?`${r}\n${p}`:p,i=i?`${i}\n${c}`:c;let g=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,s,!0),this.lexer.state.top=g,n.length===0)break;let h=s.at(-1);if(h?.type===\"code\")break;if(h?.type===\"blockquote\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.blockquote(f);s[s.length-1]=O,r=r.substring(0,r.length-R.raw.length)+O.raw,i=i.substring(0,i.length-R.text.length)+O.text;break}else if(h?.type===\"list\"){let R=h,f=R.raw+`\n`+n.join(`\n`),O=this.list(f);s[s.length-1]=O,r=r.substring(0,r.length-h.raw.length)+O.raw,i=i.substring(0,i.length-R.raw.length)+O.raw,n=f.substring(s.at(-1).raw.length).split(`\n`);continue}}return{type:\"blockquote\",raw:r,tokens:s,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,i={type:\"list\",raw:\"\",ordered:r,start:r?+n.slice(0,-1):\"\",loose:!1,items:[]};n=r?`\\\\d{1,9}\\\\${n.slice(-1)}`:`\\\\${n}`,this.options.pedantic&&(n=r?n:\"[*+-]\");let s=this.rules.other.listItemRegex(n),a=!1;for(;e;){let l=!1,p=\"\",c=\"\";if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let g=t[2].split(`\n`,1)[0].replace(this.rules.other.listReplaceTabs,O=>\" \".repeat(3*O.length)),h=e.split(`\n`,1)[0],R=!g.trim(),f=0;if(this.options.pedantic?(f=2,c=g.trimStart()):R?f=t[1].length+1:(f=t[2].search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=g.slice(f),f+=t[1].length),R&&this.rules.other.blankLine.test(h)&&(p+=h+`\n`,e=e.substring(h.length+1),l=!0),!l){let O=this.rules.other.nextBulletRegex(f),V=this.rules.other.hrRegex(f),Y=this.rules.other.fencesBeginRegex(f),ee=this.rules.other.headingBeginRegex(f),fe=this.rules.other.htmlBeginRegex(f);for(;e;){let H=e.split(`\n`,1)[0],A;if(h=H,this.options.pedantic?(h=h.replace(this.rules.other.listReplaceNesting,\" \"),A=h):A=h.replace(this.rules.other.tabCharGlobal,\" \"),Y.test(h)||ee.test(h)||fe.test(h)||O.test(h)||V.test(h))break;if(A.search(this.rules.other.nonSpaceChar)>=f||!h.trim())c+=`\n`+A.slice(f);else{if(R||g.replace(this.rules.other.tabCharGlobal,\" \").search(this.rules.other.nonSpaceChar)>=4||Y.test(g)||ee.test(g)||V.test(g))break;c+=`\n`+h}!R&&!h.trim()&&(R=!0),p+=H+`\n`,e=e.substring(H.length+1),g=A.slice(f)}}i.loose||(a?i.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(a=!0)),i.items.push({type:\"list_item\",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),i.raw+=p}let o=i.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let l of i.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0]?.type===\"text\"||l.tokens[0]?.type===\"paragraph\"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,\"\"),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,\"\");for(let c=this.lexer.inlineQueue.length-1;c>=0;c--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)){this.lexer.inlineQueue[c].src=this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask,\"\");break}}let p=this.rules.other.listTaskCheckbox.exec(l.raw);if(p){let c={type:\"checkbox\",raw:p[0]+\" \",checked:p[0]!==\"[ ]\"};l.checked=c.checked,i.loose?l.tokens[0]&&[\"paragraph\",\"text\"].includes(l.tokens[0].type)&&\"tokens\"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=c.raw+l.tokens[0].raw,l.tokens[0].text=c.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(c)):l.tokens.unshift({type:\"paragraph\",raw:c.raw,text:c.raw,tokens:[c]}):l.tokens.unshift(c)}}if(!i.loose){let p=l.tokens.filter(g=>g.type===\"space\"),c=p.length>0&&p.some(g=>this.rules.other.anyLine.test(g.raw));i.loose=c}}if(i.loose)for(let l of i.items){l.loose=!0;for(let p of l.tokens)p.type===\"text\"&&(p.type=\"paragraph\")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:\"html\",block:!0,raw:t[0],pre:t[1]===\"pre\"||t[1]===\"script\"||t[1]===\"style\",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,\" \"),r=t[2]?t[2].replace(this.rules.other.hrefBrackets,\"$1\").replace(this.rules.inline.anyPunctuation,\"$1\"):\"\",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,\"$1\"):t[3];return{type:\"def\",tag:n,raw:t[0],href:r,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=J(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,\"\").split(\"|\"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,\"\").split(`\n`):[],s={type:\"table\",raw:t[0],header:[],align:[],rows:[]};if(n.length===r.length){for(let a of r)this.rules.other.tableAlignRight.test(a)?s.align.push(\"right\"):this.rules.other.tableAlignCenter.test(a)?s.align.push(\"center\"):this.rules.other.tableAlignLeft.test(a)?s.align.push(\"left\"):s.align.push(null);for(let a=0;a<n.length;a++)s.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:s.align[a]});for(let a of i)s.rows.push(J(a,s.header.length).map((o,l)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:s.align[l]})));return s}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:\"heading\",raw:t[0],depth:t[2].charAt(0)===\"=\"?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:\"paragraph\",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:\"text\",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:\"escape\",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:\"html\",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let s=z(n.slice(0,-1),\"\\\\\");if((n.length-s.length)%2===0)return}else{let s=de(t[2],\"()\");if(s===-2)return;if(s>-1){let o=(t[0].indexOf(\"!\")===0?5:4)+t[1].length+s;t[2]=t[2].substring(0,s),t[0]=t[0].substring(0,o).trim(),t[3]=\"\"}}let r=t[2],i=\"\";if(this.options.pedantic){let s=this.rules.other.pedanticHrefTitle.exec(r);s&&(r=s[1],i=s[3])}else i=t[3]?t[3].slice(1,-1):\"\";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?r=r.slice(1):r=r.slice(1,-1)),ge(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,\"$1\"),title:i&&i.replace(this.rules.inline.anyPunctuation,\"$1\")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,\" \"),i=t[r.toLowerCase()];if(!i){let s=n[0].charAt(0);return{type:\"text\",raw:s,text:s}}return ge(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=\"\"){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||r[3]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(r[1]||r[2]||\"\")||!n||this.rules.inline.punctuation.exec(n)){let s=[...r[0]].length-1,a,o,l=s,p=0,c=r[0][0]===\"*\"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(r=c.exec(t))!=null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){l+=o;continue}else if((r[5]||r[6])&&s%3&&!((s+o)%3)){p+=o;continue}if(l-=o,l>0)continue;o=Math.min(o,o+l+p);let g=[...r[0]][0].length,h=e.slice(0,s+r.index+g+o);if(Math.min(s,o)%2){let f=h.slice(1,-1);return{type:\"em\",raw:h,text:f,tokens:this.lexer.inlineTokens(f)}}let R=h.slice(2,-2);return{type:\"strong\",raw:h,text:R,tokens:this.lexer.inlineTokens(R)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,\" \"),r=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return r&&i&&(n=n.substring(1,n.length-1)),{type:\"codespan\",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:\"br\",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:\"del\",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,r;return t[2]===\"@\"?(n=t[1],r=\"mailto:\"+n):(n=t[1],r=n),{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,r;if(t[2]===\"@\")n=t[0],r=\"mailto:\"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??\"\";while(i!==t[0]);n=t[0],t[1]===\"www.\"?r=\"http://\"+t[0]:r=t[0]}return{type:\"link\",raw:t[0],text:n,href:r,tokens:[{type:\"text\",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:\"text\",raw:t[0],text:t[0],escaped:n}}}};var x=class u{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||T,this.options.tokenizer=this.options.tokenizer||new y,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let t={other:m,block:E.normal,inline:M.normal};this.options.pedantic?(t.block=E.pedantic,t.inline=M.pedantic):this.options.gfm&&(t.block=E.gfm,this.options.breaks?t.inline=M.breaks:t.inline=M.gfm),this.tokenizer.rules=t}static get rules(){return{block:E,inline:M}}static lex(e,t){return new u(t).lex(e)}static lexInline(e,t){return new u(t).inlineTokens(e)}lex(e){e=e.replace(m.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){for(this.options.pedantic&&(e=e.replace(m.tabCharGlobal,\" \").replace(m.spaceLine,\"\"));e;){let r;if(this.options.extensions?.block?.some(s=>(r=s.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let s=t.at(-1);r.raw.length===1&&s!==void 0?s.raw+=`\n`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"paragraph\"||s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let i=e;if(this.options.extensions?.startBlock){let s=1/0,a=e.slice(1),o;this.options.extensions.startBlock.forEach(l=>{o=l.call({lexer:this},a),typeof o==\"number\"&&o>=0&&(s=Math.min(s,o))}),s<1/0&&s>=0&&(i=e.substring(0,s+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let s=t.at(-1);n&&s?.type===\"paragraph\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r),n=i.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let s=t.at(-1);s?.type===\"text\"?(s.raw+=(s.raw.endsWith(`\n`)?\"\":`\n`)+r.raw,s.text+=`\n`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):t.push(r);continue}if(e){let s=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n=e,r=null;if(this.tokens.links){let o=Object.keys(this.tokens.links);if(o.length>0)for(;(r=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)o.includes(r[0].slice(r[0].lastIndexOf(\"[\")+1,-1))&&(n=n.slice(0,r.index)+\"[\"+\"a\".repeat(r[0].length-2)+\"]\"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(r=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,r.index)+\"++\"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let i;for(;(r=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)i=r[2]?r[2].length:0,n=n.slice(0,r.index+i)+\"[\"+\"a\".repeat(r[0].length-i-2)+\"]\"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,a=\"\";for(;e;){s||(a=\"\"),s=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type===\"text\"&&p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),g;this.options.extensions.startInline.forEach(h=>{g=h.call({lexer:this},c),typeof g==\"number\"&&g>=0&&(p=Math.min(p,g))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(l)){e=e.substring(o.raw.length),o.raw.slice(-1)!==\"_\"&&(a=o.raw.slice(-1)),s=!0;let p=t.at(-1);p?.type===\"text\"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){let p=\"Infinite loop on byte: \"+e.charCodeAt(0);if(this.options.silent){console.error(p);break}else throw new Error(p)}}return t}};var P=class{options;parser;constructor(e){this.options=e||T}space(e){return\"\"}code({text:e,lang:t,escaped:n}){let r=(t||\"\").match(m.notSpaceStart)?.[0],i=e.replace(m.endingNewline,\"\")+`\n`;return r?'<pre><code class=\"language-'+w(r)+'\">'+(n?i:w(i,!0))+`</code></pre>\n`:\"<pre><code>\"+(n?i:w(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return\"\"}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=\"\";for(let a=0;a<e.items.length;a++){let o=e.items[a];r+=this.listitem(o)}let i=t?\"ol\":\"ul\",s=t&&n!==1?' start=\"'+n+'\"':\"\";return\"<\"+i+s+`>\n`+r+\"</\"+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return\"<input \"+(e?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=\"\",n=\"\";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let r=\"\";for(let i=0;i<e.rows.length;i++){let s=e.rows[i];n=\"\";for(let a=0;a<s.length;a++)n+=this.tablecell(s[a]);r+=this.tablerow({text:n})}return r&&(r=`<tbody>${r}</tbody>`),`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?\"th\":\"td\";return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${w(e,!0)}</code>`}br(e){return\"<br>\"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let r=this.parser.parseInline(n),i=X(e);if(i===null)return r;e=i;let s='<a href=\"'+e+'\"';return t&&(s+=' title=\"'+w(t)+'\"'),s+=\">\"+r+\"</a>\",s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=X(e);if(i===null)return w(n);e=i;let s=`<img src=\"${e}\" alt=\"${n}\"`;return t&&(s+=` title=\"${w(t)}\"`),s+=\">\",s}text(e){return\"tokens\"in e&&e.tokens?this.parser.parseInline(e.tokens):\"escaped\"in e&&e.escaped?e.text:w(e.text)}};var $=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return\"\"+e}image({text:e}){return\"\"+e}br(){return\"\"}checkbox({raw:e}){return e}};var b=class u{options;renderer;textRenderer;constructor(e){this.options=e||T,this.options.renderer=this.options.renderer||new P,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new $}static parse(e,t){return new u(t).parse(e)}static parseInline(e,t){return new u(t).parseInline(e)}parse(e){let t=\"\";for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let s=r,a=this.options.extensions.renderers[s.type].call({parser:this},s);if(a!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"def\",\"paragraph\",\"text\"].includes(s.type)){t+=a||\"\";continue}}let i=r;switch(i.type){case\"space\":{t+=this.renderer.space(i);break}case\"hr\":{t+=this.renderer.hr(i);break}case\"heading\":{t+=this.renderer.heading(i);break}case\"code\":{t+=this.renderer.code(i);break}case\"table\":{t+=this.renderer.table(i);break}case\"blockquote\":{t+=this.renderer.blockquote(i);break}case\"list\":{t+=this.renderer.list(i);break}case\"checkbox\":{t+=this.renderer.checkbox(i);break}case\"html\":{t+=this.renderer.html(i);break}case\"def\":{t+=this.renderer.def(i);break}case\"paragraph\":{t+=this.renderer.paragraph(i);break}case\"text\":{t+=this.renderer.text(i);break}default:{let s='Token with \"'+i.type+'\" type was not found.';if(this.options.silent)return console.error(s),\"\";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){let n=\"\";for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let a=this.options.extensions.renderers[i.type].call({parser:this},i);if(a!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(i.type)){n+=a||\"\";continue}}let s=i;switch(s.type){case\"escape\":{n+=t.text(s);break}case\"html\":{n+=t.html(s);break}case\"link\":{n+=t.link(s);break}case\"image\":{n+=t.image(s);break}case\"checkbox\":{n+=t.checkbox(s);break}case\"strong\":{n+=t.strong(s);break}case\"em\":{n+=t.em(s);break}case\"codespan\":{n+=t.codespan(s);break}case\"br\":{n+=t.br(s);break}case\"del\":{n+=t.del(s);break}case\"text\":{n+=t.text(s);break}default:{let a='Token with \"'+s.type+'\" type was not found.';if(this.options.silent)return console.error(a),\"\";throw new Error(a)}}}return n}};var S=class{options;block;constructor(e){this.options=e||T}static passThroughHooks=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\",\"emStrongMask\"]);static passThroughHooksRespectAsync=new Set([\"preprocess\",\"postprocess\",\"processAllTokens\"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?x.lex:x.lexInline}provideParser(){return this.block?b.parse:b.parseInline}};var B=class{defaults=L();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=b;Renderer=P;TextRenderer=$;Lexer=x;Tokenizer=y;Hooks=S;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case\"table\":{let i=r;for(let s of i.header)n=n.concat(this.walkTokens(s.tokens,t));for(let s of i.rows)for(let a of s)n=n.concat(this.walkTokens(a.tokens,t));break}case\"list\":{let i=r;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=r;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(s=>{let a=i[s].flat(1/0);n=n.concat(this.walkTokens(a,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let r={...n};if(r.async=this.defaults.async||r.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error(\"extension name required\");if(\"renderer\"in i){let s=t.renderers[i.name];s?t.renderers[i.name]=function(...a){let o=i.renderer.apply(this,a);return o===!1&&(o=s.apply(this,a)),o}:t.renderers[i.name]=i.renderer}if(\"tokenizer\"in i){if(!i.level||i.level!==\"block\"&&i.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");let s=t[i.level];s?s.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level===\"block\"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level===\"inline\"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}\"childTokens\"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),r.extensions=t),n.renderer){let i=this.defaults.renderer||new P(this.defaults);for(let s in n.renderer){if(!(s in i))throw new Error(`renderer '${s}' does not exist`);if([\"options\",\"parser\"].includes(s))continue;let a=s,o=n.renderer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c||\"\"}}r.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new y(this.defaults);for(let s in n.tokenizer){if(!(s in i))throw new Error(`tokenizer '${s}' does not exist`);if([\"options\",\"rules\",\"lexer\"].includes(s))continue;let a=s,o=n.tokenizer[a],l=i[a];i[a]=(...p)=>{let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new S;for(let s in n.hooks){if(!(s in i))throw new Error(`hook '${s}' does not exist`);if([\"options\",\"block\"].includes(s))continue;let a=s,o=n.hooks[a],l=i[a];S.passThroughHooks.has(s)?i[a]=p=>{if(this.defaults.async&&S.passThroughHooksRespectAsync.has(s))return(async()=>{let g=await o.call(i,p);return l.call(i,g)})();let c=o.call(i,p);return l.call(i,c)}:i[a]=(...p)=>{if(this.defaults.async)return(async()=>{let g=await o.apply(i,p);return g===!1&&(g=await l.apply(i,p)),g})();let c=o.apply(i,p);return c===!1&&(c=l.apply(i,p)),c}}r.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,s=n.walkTokens;r.walkTokens=function(a){let o=[];return o.push(s.call(this,a)),i&&(o=o.concat(i.call(this,a))),o}}this.defaults={...this.defaults,...r}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return x.lex(e,t??this.defaults)}parser(e,t){return b.parse(e,t??this.defaults)}parseMarkdown(e){return(n,r)=>{let i={...r},s={...this.defaults,...i},a=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error(\"marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.\"));if(typeof n>\"u\"||n===null)return a(new Error(\"marked(): input parameter is undefined or null\"));if(typeof n!=\"string\")return a(new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(n)+\", string expected\"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let o=s.hooks?await s.hooks.preprocess(n):n,p=await(s.hooks?await s.hooks.provideLexer():e?x.lex:x.lexInline)(o,s),c=s.hooks?await s.hooks.processAllTokens(p):p;s.walkTokens&&await Promise.all(this.walkTokens(c,s.walkTokens));let h=await(s.hooks?await s.hooks.provideParser():e?b.parse:b.parseInline)(c,s);return s.hooks?await s.hooks.postprocess(h):h})().catch(a);try{s.hooks&&(n=s.hooks.preprocess(n));let l=(s.hooks?s.hooks.provideLexer():e?x.lex:x.lexInline)(n,s);s.hooks&&(l=s.hooks.processAllTokens(l)),s.walkTokens&&this.walkTokens(l,s.walkTokens);let c=(s.hooks?s.hooks.provideParser():e?b.parse:b.parseInline)(l,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(o){return a(o)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let r=\"<p>An error occurred:</p><pre>\"+w(n.message+\"\",!0)+\"</pre>\";return t?Promise.resolve(r):r}if(t)return Promise.reject(n);throw n}}};var _=new B;function d(u,e){return _.parse(u,e)}d.options=d.setOptions=function(u){return _.setOptions(u),d.defaults=_.defaults,Z(d.defaults),d};d.getDefaults=L;d.defaults=T;d.use=function(...u){return _.use(...u),d.defaults=_.defaults,Z(d.defaults),d};d.walkTokens=function(u,e){return _.walkTokens(u,e)};d.parseInline=_.parseInline;d.Parser=b;d.parser=b.parse;d.Renderer=P;d.TextRenderer=$;d.Lexer=x;d.lexer=x.lex;d.Tokenizer=y;d.Hooks=S;d.parse=d;var Dt=d.options,Ht=d.setOptions,Zt=d.use,Gt=d.walkTokens,Nt=d.parseInline,Qt=d,Ft=b.parse,jt=x.lex;export{S as Hooks,x as Lexer,B as Marked,b as Parser,P as Renderer,$ as TextRenderer,y as Tokenizer,T as defaults,L as getDefaults,jt as lexer,d as marked,Dt as options,Qt as parse,Nt as parseInline,Ft as parser,Ht as setOptions,Zt as use,Gt as walkTokens};\n//# sourceMappingURL=marked.esm.js.map\n","import DOMPurify from \"dompurify\";\nimport { marked } from \"marked\";\nimport { truncateText } from \"./format\";\n\nmarked.setOptions({\n gfm: true,\n breaks: true,\n mangle: false,\n});\n\nconst allowedTags = [\n \"a\",\n \"b\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"del\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"hr\",\n \"i\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"strong\",\n \"table\",\n \"tbody\",\n \"td\",\n \"th\",\n \"thead\",\n \"tr\",\n \"ul\",\n];\n\nconst allowedAttrs = [\"class\", \"href\", \"rel\", \"target\", \"title\", \"start\"];\n\nlet hooksInstalled = false;\nconst MARKDOWN_CHAR_LIMIT = 140_000;\nconst MARKDOWN_PARSE_LIMIT = 40_000;\nconst MARKDOWN_CACHE_LIMIT = 200;\nconst MARKDOWN_CACHE_MAX_CHARS = 50_000;\nconst markdownCache = new Map<string, string>();\n\nfunction getCachedMarkdown(key: string): string | null {\n const cached = markdownCache.get(key);\n if (cached === undefined) return null;\n markdownCache.delete(key);\n markdownCache.set(key, cached);\n return cached;\n}\n\nfunction setCachedMarkdown(key: string, value: string) {\n markdownCache.set(key, value);\n if (markdownCache.size <= MARKDOWN_CACHE_LIMIT) return;\n const oldest = markdownCache.keys().next().value;\n if (oldest) markdownCache.delete(oldest);\n}\n\nfunction installHooks() {\n if (hooksInstalled) return;\n hooksInstalled = true;\n\n DOMPurify.addHook(\"afterSanitizeAttributes\", (node) => {\n if (!(node instanceof HTMLAnchorElement)) return;\n const href = node.getAttribute(\"href\");\n if (!href) return;\n node.setAttribute(\"rel\", \"noreferrer noopener\");\n node.setAttribute(\"target\", \"_blank\");\n });\n}\n\nexport function toSanitizedMarkdownHtml(markdown: string): string {\n const input = markdown.trim();\n if (!input) return \"\";\n installHooks();\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n const cached = getCachedMarkdown(input);\n if (cached !== null) return cached;\n }\n const truncated = truncateText(input, MARKDOWN_CHAR_LIMIT);\n const suffix = truncated.truncated\n ? `\\n\\n… truncated (${truncated.total} chars, showing first ${truncated.text.length}).`\n : \"\";\n if (truncated.text.length > MARKDOWN_PARSE_LIMIT) {\n const escaped = escapeHtml(`${truncated.text}${suffix}`);\n const html = `<pre class=\"code-block\">${escaped}</pre>`;\n const sanitized = DOMPurify.sanitize(html, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n }\n const rendered = marked.parse(`${truncated.text}${suffix}`) as string;\n const sanitized = DOMPurify.sanitize(rendered, {\n ALLOWED_TAGS: allowedTags,\n ALLOWED_ATTR: allowedAttrs,\n });\n if (input.length <= MARKDOWN_CACHE_MAX_CHARS) {\n setCachedMarkdown(input, sanitized);\n }\n return sanitized;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { html, type TemplateResult } from \"lit\";\nimport { icons } from \"../icons\";\n\nconst COPIED_FOR_MS = 1500;\nconst ERROR_FOR_MS = 2000;\nconst COPY_LABEL = \"Copy as markdown\";\nconst COPIED_LABEL = \"Copied\";\nconst ERROR_LABEL = \"Copy failed\";\n\ntype CopyButtonOptions = {\n text: () => string;\n label?: string;\n};\n\nasync function copyTextToClipboard(text: string): Promise<boolean> {\n if (!text) return false;\n\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback for non-HTTPS (e.g. http://taskmaster.local on Pi)\n try {\n const el = document.createElement(\"textarea\");\n el.value = text;\n el.style.position = \"fixed\";\n el.style.opacity = \"0\";\n document.body.appendChild(el);\n el.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(el);\n return ok;\n } catch {\n return false;\n }\n }\n}\n\nfunction setButtonLabel(button: HTMLButtonElement, label: string) {\n button.title = label;\n button.setAttribute(\"aria-label\", label);\n}\n\nfunction createCopyButton(options: CopyButtonOptions): TemplateResult {\n const idleLabel = options.label ?? COPY_LABEL;\n return html`\n <button\n class=\"chat-copy-btn\"\n type=\"button\"\n title=${idleLabel}\n aria-label=${idleLabel}\n @click=${async (e: Event) => {\n const btn = e.currentTarget as HTMLButtonElement | null;\n const iconContainer = btn?.querySelector(\n \".chat-copy-btn__icon\",\n ) as HTMLElement | null;\n\n if (!btn || btn.dataset.copying === \"1\") return;\n\n btn.dataset.copying = \"1\";\n btn.setAttribute(\"aria-busy\", \"true\");\n btn.disabled = true;\n\n const copied = await copyTextToClipboard(options.text());\n if (!btn.isConnected) return;\n\n delete btn.dataset.copying;\n btn.removeAttribute(\"aria-busy\");\n btn.disabled = false;\n\n if (!copied) {\n btn.dataset.error = \"1\";\n setButtonLabel(btn, ERROR_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.error;\n setButtonLabel(btn, idleLabel);\n }, ERROR_FOR_MS);\n return;\n }\n\n btn.dataset.copied = \"1\";\n setButtonLabel(btn, COPIED_LABEL);\n\n window.setTimeout(() => {\n if (!btn.isConnected) return;\n delete btn.dataset.copied;\n setButtonLabel(btn, idleLabel);\n }, COPIED_FOR_MS);\n }}\n >\n <span class=\"chat-copy-btn__icon\" aria-hidden=\"true\">\n <span class=\"chat-copy-btn__icon-copy\">${icons.copy}</span>\n <span class=\"chat-copy-btn__icon-check\">${icons.check}</span>\n </span>\n </button>\n `;\n}\n\nexport function renderCopyAsMarkdownButton(markdown: string): TemplateResult {\n return createCopyButton({ text: () => markdown, label: COPY_LABEL });\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatToolDetail, resolveToolDisplay } from \"../tool-display\";\nimport { icons } from \"../icons\";\nimport type { ToolCard } from \"../types/chat-types\";\nimport { TOOL_INLINE_THRESHOLD } from \"./constants\";\nimport {\n formatToolOutputForSidebar,\n getTruncatedPreview,\n} from \"./tool-helpers\";\nimport { isToolResultMessage } from \"./message-normalizer\";\nimport { extractTextCached } from \"./message-extract\";\n\nexport function extractToolCards(message: unknown): ToolCard[] {\n const m = message as Record<string, unknown>;\n const content = normalizeContent(m.content);\n const cards: ToolCard[] = [];\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n const isToolCall =\n [\"toolcall\", \"tool_call\", \"tooluse\", \"tool_use\"].includes(kind) ||\n (typeof item.name === \"string\" && item.arguments != null);\n if (isToolCall) {\n cards.push({\n kind: \"call\",\n name: (item.name as string) ?? \"tool\",\n args: coerceArgs(item.arguments ?? item.args),\n });\n }\n }\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n if (kind !== \"toolresult\" && kind !== \"tool_result\") continue;\n const text = extractToolText(item);\n const name = typeof item.name === \"string\" ? item.name : \"tool\";\n cards.push({ kind: \"result\", name, text });\n }\n\n if (\n isToolResultMessage(message) &&\n !cards.some((card) => card.kind === \"result\")\n ) {\n const name =\n (typeof m.toolName === \"string\" && m.toolName) ||\n (typeof m.tool_name === \"string\" && m.tool_name) ||\n \"tool\";\n const text = extractTextCached(message) ?? undefined;\n cards.push({ kind: \"result\", name, text });\n }\n\n return cards;\n}\n\nexport function renderToolCardSidebar(\n card: ToolCard,\n onOpenSidebar?: (content: string) => void,\n) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const detail = formatToolDetail(display);\n const hasText = Boolean(card.text?.trim());\n\n const canClick = Boolean(onOpenSidebar);\n const handleClick = canClick\n ? () => {\n if (hasText) {\n onOpenSidebar!(formatToolOutputForSidebar(card.text!));\n return;\n }\n const info = `## ${display.label}\\n\\n${\n detail ? `**Command:** \\`${detail}\\`\\n\\n` : \"\"\n }*No output — tool completed successfully.*`;\n onOpenSidebar!(info);\n }\n : undefined;\n\n const isShort = hasText && (card.text?.length ?? 0) <= TOOL_INLINE_THRESHOLD;\n const showCollapsed = hasText && !isShort;\n const showInline = hasText && isShort;\n const isEmpty = !hasText;\n\n return html`\n <div\n class=\"chat-tool-card ${canClick ? \"chat-tool-card--clickable\" : \"\"}\"\n @click=${handleClick}\n role=${canClick ? \"button\" : nothing}\n tabindex=${canClick ? \"0\" : nothing}\n @keydown=${canClick\n ? (e: KeyboardEvent) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n handleClick?.();\n }\n : nothing}\n >\n <div class=\"chat-tool-card__header\">\n <div class=\"chat-tool-card__title\">\n <span class=\"chat-tool-card__icon\">${icons[display.icon]}</span>\n <span>${display.label}</span>\n </div>\n ${canClick\n ? html`<span class=\"chat-tool-card__action\">${hasText ? \"View\" : \"\"} ${icons.check}</span>`\n : nothing}\n ${isEmpty && !canClick ? html`<span class=\"chat-tool-card__status\">${icons.check}</span>` : nothing}\n </div>\n ${detail\n ? html`<div class=\"chat-tool-card__detail\">${detail}</div>`\n : nothing}\n ${isEmpty\n ? html`<div class=\"chat-tool-card__status-text muted\">Completed</div>`\n : nothing}\n ${showCollapsed\n ? html`<div class=\"chat-tool-card__preview mono\">${getTruncatedPreview(card.text!)}</div>`\n : nothing}\n ${showInline\n ? html`<div class=\"chat-tool-card__inline mono\">${card.text}</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction normalizeContent(content: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(content)) return [];\n return content.filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nfunction coerceArgs(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed) return value;\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n return JSON.parse(trimmed);\n } catch {\n return value;\n }\n}\n\nfunction extractToolText(item: Record<string, unknown>): string | undefined {\n if (typeof item.text === \"string\") return item.text;\n if (typeof item.content === \"string\") return item.content;\n return undefined;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport type { AssistantIdentity } from \"../assistant-identity\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\nimport type { MessageGroup } from \"../types/chat-types\";\nimport { renderCopyAsMarkdownButton } from \"./copy-as-markdown\";\nimport { isToolResultMessage, normalizeRoleForGrouping } from \"./message-normalizer\";\nimport {\n extractTextCached,\n extractThinkingCached,\n formatReasoningMarkdown,\n} from \"./message-extract\";\nimport { extractToolCards, renderToolCardSidebar } from \"./tool-cards\";\n\ntype ImageBlock = {\n url: string;\n alt?: string;\n};\n\nfunction extractImages(message: unknown): ImageBlock[] {\n const m = message as Record<string, unknown>;\n const content = m.content;\n const images: ImageBlock[] = [];\n\n if (Array.isArray(content)) {\n for (const block of content) {\n if (typeof block !== \"object\" || block === null) continue;\n const b = block as Record<string, unknown>;\n\n if (b.type === \"image\") {\n // Handle source object format (from sendChatMessage)\n const source = b.source as Record<string, unknown> | undefined;\n if (source?.type === \"base64\" && typeof source.data === \"string\") {\n const data = source.data as string;\n const mediaType = (source.media_type as string) || \"image/png\";\n // If data is already a data URL, use it directly\n const url = data.startsWith(\"data:\")\n ? data\n : `data:${mediaType};base64,${data}`;\n images.push({ url });\n } else if (typeof b.url === \"string\") {\n images.push({ url: b.url });\n }\n } else if (b.type === \"image_url\") {\n // OpenAI format\n const imageUrl = b.image_url as Record<string, unknown> | undefined;\n if (typeof imageUrl?.url === \"string\") {\n images.push({ url: imageUrl.url });\n }\n }\n }\n }\n\n return images;\n}\n\nexport function renderReadingIndicatorGroup(_assistant?: AssistantIdentity) {\n return html`\n <div class=\"chat-group assistant\">\n <div class=\"chat-group-messages\">\n <div class=\"chat-bubble chat-reading-indicator\" aria-hidden=\"true\">\n <span class=\"chat-reading-indicator__dots\">\n <span></span><span></span><span></span>\n </span>\n </div>\n </div>\n </div>\n `;\n}\n\nexport function renderStreamingGroup(\n text: string,\n startedAt: number,\n onOpenSidebar?: (content: string) => void,\n _assistant?: AssistantIdentity,\n) {\n return html`\n <div class=\"chat-group assistant\">\n <div class=\"chat-group-messages\">\n ${renderGroupedMessage(\n {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n timestamp: startedAt,\n },\n { isStreaming: false, showReasoning: false },\n onOpenSidebar,\n )}\n </div>\n </div>\n `;\n}\n\nexport function renderMessageGroup(\n group: MessageGroup,\n opts: {\n onOpenSidebar?: (content: string) => void;\n showReasoning: boolean;\n assistantName?: string;\n assistantAvatar?: string | null;\n },\n) {\n const normalizedRole = normalizeRoleForGrouping(group.role);\n const roleClass =\n normalizedRole === \"user\"\n ? \"user\"\n : normalizedRole === \"assistant\"\n ? \"assistant\"\n : \"other\";\n const timestamp = new Date(group.timestamp).toLocaleTimeString([], {\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n\n return html`\n <div class=\"chat-group ${roleClass}\">\n <div class=\"chat-group-messages\">\n ${group.messages.map((item, index) =>\n renderGroupedMessage(\n item.message,\n {\n isStreaming:\n group.isStreaming && index === group.messages.length - 1,\n showReasoning: opts.showReasoning,\n },\n opts.onOpenSidebar,\n ),\n )}\n <div class=\"chat-group-footer\">\n <span class=\"chat-group-timestamp\">${timestamp}</span>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderMessageImages(images: ImageBlock[]) {\n if (images.length === 0) return nothing;\n\n return html`\n <div class=\"chat-message-images\">\n ${images.map(\n (img) => html`\n <img\n src=${img.url}\n alt=${img.alt ?? \"Attached image\"}\n class=\"chat-message-image\"\n @click=${() => window.open(img.url, \"_blank\")}\n />\n `,\n )}\n </div>\n `;\n}\n\nfunction renderGroupedMessage(\n message: unknown,\n opts: { isStreaming: boolean; showReasoning: boolean },\n onOpenSidebar?: (content: string) => void,\n) {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n const isToolResult =\n isToolResultMessage(message) ||\n role.toLowerCase() === \"toolresult\" ||\n role.toLowerCase() === \"tool_result\" ||\n typeof m.toolCallId === \"string\" ||\n typeof m.tool_call_id === \"string\";\n\n const toolCards = extractToolCards(message);\n const hasToolCards = toolCards.length > 0;\n const images = extractImages(message);\n const hasImages = images.length > 0;\n\n const extractedText = extractTextCached(message);\n const extractedThinking =\n opts.showReasoning && role === \"assistant\"\n ? extractThinkingCached(message)\n : null;\n const markdownBase = extractedText?.trim() ? extractedText : null;\n const reasoningMarkdown = extractedThinking\n ? formatReasoningMarkdown(extractedThinking)\n : null;\n const markdown = markdownBase;\n const canCopyMarkdown = (role === \"assistant\" || role === \"user\") && Boolean(markdown?.trim());\n\n const bubbleClasses = [\n \"chat-bubble\",\n canCopyMarkdown ? \"has-copy\" : \"\",\n opts.isStreaming ? \"streaming\" : \"\",\n \"fade-in\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n // Hide tool-only messages (tool results, tool calls with no text)\n if (!markdown && (hasToolCards || isToolResult)) return nothing;\n\n if (!markdown && !hasImages) return nothing;\n\n return html`\n <div class=\"${bubbleClasses}\">\n ${canCopyMarkdown ? renderCopyAsMarkdownButton(markdown!) : nothing}\n ${renderMessageImages(images)}\n ${reasoningMarkdown\n ? html`<div class=\"chat-thinking\">${unsafeHTML(\n toSanitizedMarkdownHtml(reasoningMarkdown),\n )}</div>`\n : nothing}\n ${markdown\n ? html`<div class=\"chat-text\">${unsafeHTML(toSanitizedMarkdownHtml(markdown))}</div>`\n : nothing}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\n\nimport { icons } from \"../icons\";\nimport { toSanitizedMarkdownHtml } from \"../markdown\";\n\nexport type MarkdownSidebarProps = {\n content: string | null;\n error: string | null;\n onClose: () => void;\n onViewRawText: () => void;\n};\n\nexport function renderMarkdownSidebar(props: MarkdownSidebarProps) {\n return html`\n <div class=\"sidebar-panel\">\n <div class=\"sidebar-header\">\n <div class=\"sidebar-title\">Tool Output</div>\n <button @click=${props.onClose} class=\"btn\" title=\"Close sidebar\">\n ${icons.x}\n </button>\n </div>\n <div class=\"sidebar-content\">\n ${props.error\n ? html`\n <div class=\"callout danger\">${props.error}</div>\n <button @click=${props.onViewRawText} class=\"btn\" style=\"margin-top: 12px;\">\n View Raw Text\n </button>\n `\n : props.content\n ? html`<div class=\"sidebar-markdown\">${unsafeHTML(toSanitizedMarkdownHtml(props.content))}</div>`\n : html`<div class=\"muted\">No content available</div>`}\n </div>\n </div>\n `;\n}\n","import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * A draggable divider for resizable split views.\n * Dispatches 'resize' events with { splitRatio: number } detail.\n */\n@customElement(\"resizable-divider\")\nexport class ResizableDivider extends LitElement {\n @property({ type: Number }) splitRatio = 0.6;\n @property({ type: Number }) minRatio = 0.4;\n @property({ type: Number }) maxRatio = 0.7;\n\n private isDragging = false;\n private startX = 0;\n private startRatio = 0;\n\n static styles = css`\n :host {\n width: 4px;\n cursor: col-resize;\n background: var(--border, #333);\n transition: background 150ms ease-out;\n flex-shrink: 0;\n position: relative;\n }\n\n :host::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -4px;\n right: -4px;\n bottom: 0;\n }\n\n :host(:hover) {\n background: var(--accent, #007bff);\n }\n\n :host(.dragging) {\n background: var(--accent, #007bff);\n }\n `;\n\n render() {\n return html``;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener(\"mousedown\", this.handleMouseDown);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"mousedown\", this.handleMouseDown);\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n }\n\n private handleMouseDown = (e: MouseEvent) => {\n this.isDragging = true;\n this.startX = e.clientX;\n this.startRatio = this.splitRatio;\n this.classList.add(\"dragging\");\n\n document.addEventListener(\"mousemove\", this.handleMouseMove);\n document.addEventListener(\"mouseup\", this.handleMouseUp);\n\n e.preventDefault();\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n\n const container = this.parentElement;\n if (!container) return;\n\n const containerWidth = container.getBoundingClientRect().width;\n const deltaX = e.clientX - this.startX;\n const deltaRatio = deltaX / containerWidth;\n\n let newRatio = this.startRatio + deltaRatio;\n newRatio = Math.max(this.minRatio, Math.min(this.maxRatio, newRatio));\n\n this.dispatchEvent(\n new CustomEvent(\"resize\", {\n detail: { splitRatio: newRatio },\n bubbles: true,\n composed: true,\n })\n );\n };\n\n private handleMouseUp = () => {\n this.isDragging = false;\n this.classList.remove(\"dragging\");\n\n document.removeEventListener(\"mousemove\", this.handleMouseMove);\n document.removeEventListener(\"mouseup\", this.handleMouseUp);\n };\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"resizable-divider\": ResizableDivider;\n }\n}\n","function assertNonEmptyString (str) {\n if (typeof str !== 'string' || !str) {\n throw new Error('expected a non-empty string, got: ' + str)\n }\n}\n\nfunction assertNumber (number) {\n if (typeof number !== 'number') {\n throw new Error('expected a number, got: ' + number)\n }\n}\n\nconst DB_VERSION_CURRENT = 1;\nconst DB_VERSION_INITIAL = 1;\nconst STORE_EMOJI = 'emoji';\nconst STORE_KEYVALUE = 'keyvalue';\nconst STORE_FAVORITES = 'favorites';\nconst FIELD_TOKENS = 'tokens';\nconst INDEX_TOKENS = 'tokens';\nconst FIELD_UNICODE = 'unicode';\nconst INDEX_COUNT = 'count';\nconst FIELD_GROUP = 'group';\nconst FIELD_ORDER = 'order';\nconst INDEX_GROUP_AND_ORDER = 'group-order';\nconst KEY_ETAG = 'eTag';\nconst KEY_URL = 'url';\nconst KEY_PREFERRED_SKINTONE = 'skinTone';\nconst MODE_READONLY = 'readonly';\nconst MODE_READWRITE = 'readwrite';\nconst INDEX_SKIN_UNICODE = 'skinUnicodes';\nconst FIELD_SKIN_UNICODE = 'skinUnicodes';\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\nfunction uniqEmoji (emojis) {\n return uniqBy(emojis, _ => _.unicode)\n}\n\nfunction initialMigration (db) {\n function createObjectStore (name, keyPath, indexes) {\n const store = keyPath\n ? db.createObjectStore(name, { keyPath })\n : db.createObjectStore(name);\n if (indexes) {\n for (const [indexName, [keyPath, multiEntry]] of Object.entries(indexes)) {\n store.createIndex(indexName, keyPath, { multiEntry });\n }\n }\n return store\n }\n\n createObjectStore(STORE_KEYVALUE);\n createObjectStore(STORE_EMOJI, /* keyPath */ FIELD_UNICODE, {\n [INDEX_TOKENS]: [FIELD_TOKENS, /* multiEntry */ true],\n [INDEX_GROUP_AND_ORDER]: [[FIELD_GROUP, FIELD_ORDER]],\n [INDEX_SKIN_UNICODE]: [FIELD_SKIN_UNICODE, /* multiEntry */ true]\n });\n createObjectStore(STORE_FAVORITES, undefined, {\n [INDEX_COUNT]: ['']\n });\n}\n\nconst openIndexedDBRequests = {};\nconst databaseCache = {};\nconst onCloseListeners = {};\n\nfunction handleOpenOrDeleteReq (resolve, reject, req) {\n // These things are almost impossible to test with fakeIndexedDB sadly\n /* istanbul ignore next */\n req.onerror = () => reject(req.error);\n /* istanbul ignore next */\n req.onblocked = () => reject(new Error('IDB blocked'));\n req.onsuccess = () => resolve(req.result);\n}\n\nasync function createDatabase (dbName) {\n const db = await new Promise((resolve, reject) => {\n const req = indexedDB.open(dbName, DB_VERSION_CURRENT);\n openIndexedDBRequests[dbName] = req;\n req.onupgradeneeded = e => {\n // Technically there is only one version, so we don't need this `if` check\n // But if an old version of the JS is in another browser tab\n // and it gets upgraded in the future and we have a new DB version, well...\n // better safe than sorry.\n /* istanbul ignore else */\n if (e.oldVersion < DB_VERSION_INITIAL) {\n initialMigration(req.result);\n }\n };\n handleOpenOrDeleteReq(resolve, reject, req);\n });\n // Handle abnormal closes, e.g. \"delete database\" in chrome dev tools.\n // No need for removeEventListener, because once the DB can no longer\n // fire \"close\" events, it will auto-GC.\n db.onclose = () => closeDatabase(dbName);\n return db\n}\n\nfunction openDatabase (dbName) {\n if (!databaseCache[dbName]) {\n databaseCache[dbName] = createDatabase(dbName);\n }\n return databaseCache[dbName]\n}\n\nfunction dbPromise (db, storeName, readOnlyOrReadWrite, cb) {\n return new Promise((resolve, reject) => {\n // Use relaxed durability because neither the emoji data nor the favorites/preferred skin tone\n // are really irreplaceable data. IndexedDB is just a cache in this case.\n const txn = db.transaction(storeName, readOnlyOrReadWrite, { durability: 'relaxed' });\n const store = typeof storeName === 'string'\n ? txn.objectStore(storeName)\n : storeName.map(name => txn.objectStore(name));\n let res;\n cb(store, txn, (result) => {\n res = result;\n });\n\n txn.oncomplete = () => resolve(res);\n /* istanbul ignore next */\n txn.onerror = () => reject(txn.error);\n })\n}\n\nfunction closeDatabase (dbName) {\n // close any open requests\n const req = openIndexedDBRequests[dbName];\n const db = req && req.result;\n if (db) {\n db.close();\n const listeners = onCloseListeners[dbName];\n /* istanbul ignore else */\n if (listeners) {\n for (const listener of listeners) {\n listener();\n }\n }\n }\n delete openIndexedDBRequests[dbName];\n delete databaseCache[dbName];\n delete onCloseListeners[dbName];\n}\n\nfunction deleteDatabase (dbName) {\n return new Promise((resolve, reject) => {\n // close any open requests\n closeDatabase(dbName);\n const req = indexedDB.deleteDatabase(dbName);\n handleOpenOrDeleteReq(resolve, reject, req);\n })\n}\n\n// The \"close\" event occurs during an abnormal shutdown, e.g. a user clearing their browser data.\n// However, it doesn't occur with the normal \"close\" event, so we handle that separately.\n// https://www.w3.org/TR/IndexedDB/#close-a-database-connection\nfunction addOnCloseListener (dbName, listener) {\n let listeners = onCloseListeners[dbName];\n if (!listeners) {\n listeners = onCloseListeners[dbName] = [];\n }\n listeners.push(listener);\n}\n\n// list of emoticons that don't match a simple \\W+ regex\n// extracted using:\n// require('emoji-picker-element-data/en/emojibase/data.json').map(_ => _.emoticon).filter(Boolean).filter(_ => !/^\\W+$/.test(_))\nconst irregularEmoticons = new Set([\n ':D', 'XD', \":'D\", 'O:)',\n ':X', ':P', ';P', 'XP',\n ':L', ':Z', ':j', '8D',\n 'XO', '8)', ':B', ':O',\n ':S', \":'o\", 'Dx', 'X(',\n 'D:', ':C', '>0)', ':3',\n '</3', '<3', '\\\\M/', ':E',\n '8#'\n]);\n\nfunction extractTokens (str) {\n return str\n .split(/[\\s_]+/)\n .map(word => {\n if (!word.match(/\\w/) || irregularEmoticons.has(word)) {\n // for pure emoticons like :) or :-), just leave them as-is\n return word.toLowerCase()\n }\n\n return word\n .replace(/[)(:,]/g, '')\n .replace(/’/g, \"'\")\n .toLowerCase()\n }).filter(Boolean)\n}\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\n\n// This is an extra step in addition to extractTokens(). The difference here is that we expect\n// the input to have already been run through extractTokens(). This is useful for cases like\n// emoticons, where we don't want to do any tokenization (because it makes no sense to split up\n// \">:)\" by the colon) but we do want to lowercase it to have consistent search results, so that\n// the user can type ':P' or ':p' and still get the same result.\nfunction normalizeTokens (str) {\n return str\n .filter(Boolean)\n .map(_ => _.toLowerCase())\n .filter(_ => _.length >= MIN_SEARCH_TEXT_LENGTH)\n}\n\n// Transform emoji data for storage in IDB\nfunction transformEmojiData (emojiData) {\n const res = emojiData.map(({ annotation, emoticon, group, order, shortcodes, skins, tags, emoji, version }) => {\n const tokens = [...new Set(\n normalizeTokens([\n ...(shortcodes || []).map(extractTokens).flat(),\n ...(tags || []).map(extractTokens).flat(),\n ...extractTokens(annotation),\n emoticon\n ])\n )].sort();\n const res = {\n annotation,\n group,\n order,\n tags,\n tokens,\n unicode: emoji,\n version\n };\n if (emoticon) {\n res.emoticon = emoticon;\n }\n if (shortcodes) {\n res.shortcodes = shortcodes;\n }\n if (skins) {\n res.skinTones = [];\n res.skinUnicodes = [];\n res.skinVersions = [];\n for (const { tone, emoji, version } of skins) {\n res.skinTones.push(tone);\n res.skinUnicodes.push(emoji);\n res.skinVersions.push(version);\n }\n }\n return res\n });\n return res\n}\n\n// helper functions that help compress the code better\n\nfunction callStore (store, method, key, cb) {\n store[method](key).onsuccess = e => (cb && cb(e.target.result));\n}\n\nfunction getIDB (store, key, cb) {\n callStore(store, 'get', key, cb);\n}\n\nfunction getAllIDB (store, key, cb) {\n callStore(store, 'getAll', key, cb);\n}\n\nfunction commit (txn) {\n /* istanbul ignore else */\n if (txn.commit) {\n txn.commit();\n }\n}\n\n// like lodash's minBy\nfunction minBy (array, func) {\n let minItem = array[0];\n for (let i = 1; i < array.length; i++) {\n const item = array[i];\n if (func(minItem) > func(item)) {\n minItem = item;\n }\n }\n return minItem\n}\n\n// return an array of results representing all items that are found in each one of the arrays\n//\n\nfunction findCommonMembers (arrays, uniqByFunc) {\n const shortestArray = minBy(arrays, _ => _.length);\n const results = [];\n for (const item of shortestArray) {\n // if this item is included in every array in the intermediate results, add it to the final results\n if (!arrays.some(array => array.findIndex(_ => uniqByFunc(_) === uniqByFunc(item)) === -1)) {\n results.push(item);\n }\n }\n return results\n}\n\nasync function isEmpty (db) {\n return !(await get(db, STORE_KEYVALUE, KEY_URL))\n}\n\nasync function hasData (db, url, eTag) {\n const [oldETag, oldUrl] = await Promise.all([KEY_ETAG, KEY_URL]\n .map(key => get(db, STORE_KEYVALUE, key)));\n return (oldETag === eTag && oldUrl === url)\n}\n\nasync function doFullDatabaseScanForSingleResult (db, predicate) {\n // This batching algorithm is just a perf improvement over a basic\n // cursor. The BATCH_SIZE is an estimate of what would give the best\n // perf for doing a full DB scan (worst case).\n //\n // Mini-benchmark for determining the best batch size:\n //\n // PERF=1 pnpm build:rollup && pnpm test:adhoc\n //\n // (async () => {\n // performance.mark('start')\n // await $('emoji-picker').database.getEmojiByShortcode('doesnotexist')\n // performance.measure('total', 'start')\n // console.log(performance.getEntriesByName('total').slice(-1)[0].duration)\n // })()\n const BATCH_SIZE = 50; // Typically around 150ms for 6x slowdown in Chrome for above benchmark\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n let lastKey;\n\n const processNextBatch = () => {\n emojiStore.getAll(lastKey && IDBKeyRange.lowerBound(lastKey, true), BATCH_SIZE).onsuccess = e => {\n const results = e.target.result;\n for (const result of results) {\n lastKey = result.unicode;\n if (predicate(result)) {\n return cb(result)\n }\n }\n if (results.length < BATCH_SIZE) {\n return cb()\n }\n processNextBatch();\n };\n };\n processNextBatch();\n })\n}\n\nasync function loadData (db, emojiData, url, eTag) {\n try {\n const transformedData = transformEmojiData(emojiData);\n await dbPromise(db, [STORE_EMOJI, STORE_KEYVALUE], MODE_READWRITE, ([emojiStore, metaStore], txn) => {\n let oldETag;\n let oldUrl;\n let todo = 0;\n\n function checkFetched () {\n if (++todo === 2) { // 2 requests made\n onFetched();\n }\n }\n\n function onFetched () {\n if (oldETag === eTag && oldUrl === url) {\n // check again within the transaction to guard against concurrency, e.g. multiple browser tabs\n return\n }\n // delete old data\n emojiStore.clear();\n // insert new data\n for (const data of transformedData) {\n emojiStore.put(data);\n }\n metaStore.put(eTag, KEY_ETAG);\n metaStore.put(url, KEY_URL);\n commit(txn);\n }\n\n getIDB(metaStore, KEY_ETAG, result => {\n oldETag = result;\n checkFetched();\n });\n\n getIDB(metaStore, KEY_URL, result => {\n oldUrl = result;\n checkFetched();\n });\n });\n } finally {\n }\n}\n\nasync function getEmojiByGroup (db, group) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n const range = IDBKeyRange.bound([group, 0], [group + 1, 0], false, true);\n getAllIDB(emojiStore.index(INDEX_GROUP_AND_ORDER), range, cb);\n })\n}\n\nasync function getEmojiBySearchQuery (db, query) {\n const tokens = normalizeTokens(extractTokens(query));\n\n if (!tokens.length) {\n return []\n }\n\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => {\n // get all results that contain all tokens (i.e. an AND query)\n const intermediateResults = [];\n\n const checkDone = () => {\n if (intermediateResults.length === tokens.length) {\n onDone();\n }\n };\n\n const onDone = () => {\n const results = findCommonMembers(intermediateResults, _ => _.unicode);\n cb(results.sort((a, b) => a.order < b.order ? -1 : 1));\n };\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const range = i === tokens.length - 1\n ? IDBKeyRange.bound(token, token + '\\uffff', false, true) // treat last token as a prefix search\n : IDBKeyRange.only(token); // treat all other tokens as an exact match\n getAllIDB(emojiStore.index(INDEX_TOKENS), range, result => {\n intermediateResults.push(result);\n checkDone();\n });\n }\n })\n}\n\n// This could have been implemented as an IDB index on shortcodes, but it seemed wasteful to do that\n// when we can already query by tokens and this will give us what we're looking for 99.9% of the time\nasync function getEmojiByShortcode (db, shortcode) {\n const emojis = await getEmojiBySearchQuery(db, shortcode);\n\n // In very rare cases (e.g. the shortcode \"v\" as in \"v for victory\"), we cannot search because\n // there are no usable tokens (too short in this case). In that case, we have to do an inefficient\n // full-database scan, which I believe is an acceptable tradeoff for not having to have an extra\n // index on shortcodes.\n\n if (!emojis.length) {\n const predicate = _ => ((_.shortcodes || []).includes(shortcode.toLowerCase()));\n return (await doFullDatabaseScanForSingleResult(db, predicate)) || null\n }\n\n return emojis.filter(_ => {\n const lowerShortcodes = (_.shortcodes || []).map(_ => _.toLowerCase());\n return lowerShortcodes.includes(shortcode.toLowerCase())\n })[0] || null\n}\n\nasync function getEmojiByUnicode (db, unicode) {\n return dbPromise(db, STORE_EMOJI, MODE_READONLY, (emojiStore, txn, cb) => (\n getIDB(emojiStore, unicode, result => {\n if (result) {\n return cb(result)\n }\n getIDB(emojiStore.index(INDEX_SKIN_UNICODE), unicode, result => cb(result || null));\n })\n ))\n}\n\nfunction get (db, storeName, key) {\n return dbPromise(db, storeName, MODE_READONLY, (store, txn, cb) => (\n getIDB(store, key, cb)\n ))\n}\n\nfunction set (db, storeName, key, value) {\n return dbPromise(db, storeName, MODE_READWRITE, (store, txn) => {\n store.put(value, key);\n commit(txn);\n })\n}\n\nfunction incrementFavoriteEmojiCount (db, unicode) {\n return dbPromise(db, STORE_FAVORITES, MODE_READWRITE, (store, txn) => (\n getIDB(store, unicode, result => {\n store.put((result || 0) + 1, unicode);\n commit(txn);\n })\n ))\n}\n\nfunction getTopFavoriteEmoji (db, customEmojiIndex, limit) {\n if (limit === 0) {\n return []\n }\n return dbPromise(db, [STORE_FAVORITES, STORE_EMOJI], MODE_READONLY, ([favoritesStore, emojiStore], txn, cb) => {\n const results = [];\n favoritesStore.index(INDEX_COUNT).openCursor(undefined, 'prev').onsuccess = e => {\n const cursor = e.target.result;\n if (!cursor) { // no more results\n return cb(results)\n }\n\n function addResult (result) {\n results.push(result);\n if (results.length === limit) {\n return cb(results) // done, reached the limit\n }\n cursor.continue();\n }\n\n const unicodeOrName = cursor.primaryKey;\n const custom = customEmojiIndex.byName(unicodeOrName);\n if (custom) {\n return addResult(custom)\n }\n // This could be done in parallel (i.e. make the cursor and the get()s parallelized),\n // but my testing suggests it's not actually faster.\n getIDB(emojiStore, unicodeOrName, emoji => {\n if (emoji) {\n return addResult(emoji)\n }\n // emoji not found somehow, ignore (may happen if custom emoji change)\n cursor.continue();\n });\n };\n })\n}\n\n// trie data structure for prefix searches\n// loosely based on https://github.com/nolanlawson/substring-trie\n\nconst CODA_MARKER = ''; // marks the end of the string\n\nfunction trie (arr, itemToTokens) {\n const map = new Map();\n for (const item of arr) {\n const tokens = itemToTokens(item);\n for (const token of tokens) {\n let currentMap = map;\n for (let i = 0; i < token.length; i++) {\n const char = token.charAt(i);\n let nextMap = currentMap.get(char);\n if (!nextMap) {\n nextMap = new Map();\n currentMap.set(char, nextMap);\n }\n currentMap = nextMap;\n }\n let valuesAtCoda = currentMap.get(CODA_MARKER);\n if (!valuesAtCoda) {\n valuesAtCoda = [];\n currentMap.set(CODA_MARKER, valuesAtCoda);\n }\n valuesAtCoda.push(item);\n }\n }\n\n const search = (query, exact) => {\n let currentMap = map;\n for (let i = 0; i < query.length; i++) {\n const char = query.charAt(i);\n const nextMap = currentMap.get(char);\n if (nextMap) {\n currentMap = nextMap;\n } else {\n return []\n }\n }\n\n if (exact) {\n const results = currentMap.get(CODA_MARKER);\n return results || []\n }\n\n const results = [];\n // traverse\n const queue = [currentMap];\n while (queue.length) {\n const currentMap = queue.shift();\n const entriesSortedByKey = [...currentMap.entries()].sort((a, b) => a[0] < b[0] ? -1 : 1);\n for (const [key, value] of entriesSortedByKey) {\n if (key === CODA_MARKER) { // CODA_MARKER always comes first; it's the empty string\n results.push(...value);\n } else {\n queue.push(value);\n }\n }\n }\n return results\n };\n\n return search\n}\n\nconst requiredKeys$1 = [\n 'name',\n 'url'\n];\n\nfunction assertCustomEmojis (customEmojis) {\n const isArray = customEmojis && Array.isArray(customEmojis);\n const firstItemIsFaulty = isArray &&\n customEmojis.length &&\n (!customEmojis[0] || requiredKeys$1.some(key => !(key in customEmojis[0])));\n if (!isArray || firstItemIsFaulty) {\n throw new Error('Custom emojis are in the wrong format')\n }\n}\n\nfunction customEmojiIndex (customEmojis) {\n assertCustomEmojis(customEmojis);\n\n const sortByName = (a, b) => a.name.toLowerCase() < b.name.toLowerCase() ? -1 : 1;\n\n //\n // all()\n //\n const all = customEmojis.sort(sortByName);\n\n //\n // search()\n //\n const emojiToTokens = emoji => {\n const set = new Set();\n if (emoji.shortcodes) {\n for (const shortcode of emoji.shortcodes) {\n for (const token of extractTokens(shortcode)) {\n set.add(token);\n }\n }\n }\n return set\n };\n const searchTrie = trie(customEmojis, emojiToTokens);\n const searchByExactMatch = _ => searchTrie(_, true);\n const searchByPrefix = _ => searchTrie(_, false);\n\n // Search by query for custom emoji. Similar to how we do this in IDB, the last token\n // is treated as a prefix search, but every other one is treated as an exact match.\n // Then we AND the results together\n const search = query => {\n const tokens = extractTokens(query);\n const intermediateResults = tokens.map((token, i) => (\n (i < tokens.length - 1 ? searchByExactMatch : searchByPrefix)(token)\n ));\n return findCommonMembers(intermediateResults, _ => _.name).sort(sortByName)\n };\n\n //\n // byShortcode, byName\n //\n const shortcodeToEmoji = new Map();\n const nameToEmoji = new Map();\n for (const customEmoji of customEmojis) {\n nameToEmoji.set(customEmoji.name.toLowerCase(), customEmoji);\n for (const shortcode of (customEmoji.shortcodes || [])) {\n shortcodeToEmoji.set(shortcode.toLowerCase(), customEmoji);\n }\n }\n\n const byShortcode = shortcode => shortcodeToEmoji.get(shortcode.toLowerCase());\n const byName = name => nameToEmoji.get(name.toLowerCase());\n\n return {\n all,\n search,\n byShortcode,\n byName\n }\n}\n\nconst isFirefoxContentScript = typeof wrappedJSObject !== 'undefined';\n\n// remove some internal implementation details, i.e. the \"tokens\" array on the emoji object\n// essentially, convert the emoji from the version stored in IDB to the version used in-memory\nfunction cleanEmoji (emoji) {\n if (!emoji) {\n return emoji\n }\n // if inside a Firefox content script, need to clone the emoji object to prevent Firefox from complaining about\n // cross-origin object. See: https://github.com/nolanlawson/emoji-picker-element/issues/356\n /* istanbul ignore if */\n if (isFirefoxContentScript) {\n emoji = structuredClone(emoji);\n }\n delete emoji.tokens;\n if (emoji.skinTones) {\n const len = emoji.skinTones.length;\n emoji.skins = Array(len);\n for (let i = 0; i < len; i++) {\n emoji.skins[i] = {\n tone: emoji.skinTones[i],\n unicode: emoji.skinUnicodes[i],\n version: emoji.skinVersions[i]\n };\n }\n delete emoji.skinTones;\n delete emoji.skinUnicodes;\n delete emoji.skinVersions;\n }\n return emoji\n}\n\nfunction warnETag (eTag) {\n if (!eTag) {\n console.warn('emoji-picker-element is more efficient if the dataSource server exposes an ETag header.');\n }\n}\n\nconst requiredKeys = [\n 'annotation',\n 'emoji',\n 'group',\n 'order',\n 'version'\n];\n\nfunction assertEmojiData (emojiData) {\n if (!emojiData ||\n !Array.isArray(emojiData) ||\n !emojiData[0] ||\n (typeof emojiData[0] !== 'object') ||\n requiredKeys.some(key => (!(key in emojiData[0])))) {\n throw new Error('Emoji data is in the wrong format')\n }\n}\n\nfunction assertStatus (response, dataSource) {\n if (Math.floor(response.status / 100) !== 2) {\n throw new Error('Failed to fetch: ' + dataSource + ': ' + response.status)\n }\n}\n\nasync function getETag (dataSource) {\n const response = await fetch(dataSource, { method: 'HEAD' });\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n return eTag\n}\n\nasync function getETagAndData (dataSource) {\n const response = await fetch(dataSource);\n assertStatus(response, dataSource);\n const eTag = response.headers.get('etag');\n warnETag(eTag);\n const emojiData = await response.json();\n assertEmojiData(emojiData);\n return [eTag, emojiData]\n}\n\n// TODO: including these in blob-util.ts causes typedoc to generate docs for them,\n// even with --excludePrivate ¯\\_(ツ)_/¯\n/** @private */\n/**\n * Convert an `ArrayBuffer` to a binary string.\n *\n * Example:\n *\n * ```js\n * var myString = blobUtil.arrayBufferToBinaryString(arrayBuff)\n * ```\n *\n * @param buffer - array buffer\n * @returns binary string\n */\nfunction arrayBufferToBinaryString(buffer) {\n var binary = '';\n var bytes = new Uint8Array(buffer);\n var length = bytes.byteLength;\n var i = -1;\n while (++i < length) {\n binary += String.fromCharCode(bytes[i]);\n }\n return binary;\n}\n/**\n * Convert a binary string to an `ArrayBuffer`.\n *\n * ```js\n * var myBuffer = blobUtil.binaryStringToArrayBuffer(binaryString)\n * ```\n *\n * @param binary - binary string\n * @returns array buffer\n */\nfunction binaryStringToArrayBuffer(binary) {\n var length = binary.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n var i = -1;\n while (++i < length) {\n arr[i] = binary.charCodeAt(i);\n }\n return buf;\n}\n\n// generate a checksum based on the stringified JSON\nasync function jsonChecksum (object) {\n const inString = JSON.stringify(object);\n let inBuffer = binaryStringToArrayBuffer(inString);\n\n // this does not need to be cryptographically secure, SHA-1 is fine\n const outBuffer = await crypto.subtle.digest('SHA-1', inBuffer);\n const outBinString = arrayBufferToBinaryString(outBuffer);\n const res = btoa(outBinString);\n return res\n}\n\nasync function doCheckForUpdates (db, dataSource) {\n // just do a simple HEAD request first to see if the eTags match\n let emojiData;\n let eTag = await getETag(dataSource);\n if (!eTag) { // work around lack of ETag/Access-Control-Expose-Headers\n const eTagAndData = await getETagAndData(dataSource);\n eTag = eTagAndData[0];\n emojiData = eTagAndData[1];\n if (!eTag) {\n eTag = await jsonChecksum(emojiData);\n }\n }\n if (await hasData(db, dataSource, eTag)) ; else {\n if (!emojiData) {\n const eTagAndData = await getETagAndData(dataSource);\n emojiData = eTagAndData[1];\n }\n await loadData(db, emojiData, dataSource, eTag);\n }\n}\n\nasync function loadDataForFirstTime (db, dataSource) {\n let [eTag, emojiData] = await getETagAndData(dataSource);\n if (!eTag) {\n // Handle lack of support for ETag or Access-Control-Expose-Headers\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers#Browser_compatibility\n eTag = await jsonChecksum(emojiData);\n }\n\n await loadData(db, emojiData, dataSource, eTag);\n}\n\nasync function checkForUpdates (db, dataSource) {\n try {\n await doCheckForUpdates(db, dataSource);\n } catch (err) {\n // Checking for updates is not a critical operation, and it can fail if e.g. the picker is quickly removed and\n // re-added to the DOM. In those cases, we may get an IndexedDB InvalidStateError because we are attempting to close\n // the database connection, possibly while another request is inflight. So there's effectively no way to prevent\n // InvalidStateErrors unless we were to carefully sequence our IndexedDB operations. Much more simply, we can just\n // ignore IndexedDB InvalidStateErrors here and give users one less useless error message in their console.\n if (err.name !== 'InvalidStateError') {\n throw err\n }\n }\n}\n\nclass Database {\n constructor ({ dataSource = DEFAULT_DATA_SOURCE, locale = DEFAULT_LOCALE, customEmoji = [] } = {}) {\n this.dataSource = dataSource;\n this.locale = locale;\n this._dbName = `emoji-picker-element-${this.locale}`;\n this._db = undefined;\n this._lazyUpdate = undefined;\n this._custom = customEmojiIndex(customEmoji);\n\n this._clear = this._clear.bind(this);\n this._ready = this._init();\n }\n\n async _init () {\n const db = this._db = await openDatabase(this._dbName);\n\n addOnCloseListener(this._dbName, this._clear);\n const dataSource = this.dataSource;\n const empty = await isEmpty(db);\n\n if (empty) {\n await loadDataForFirstTime(db, dataSource);\n } else { // offline-first - do an update asynchronously\n this._lazyUpdate = checkForUpdates(db, dataSource);\n }\n }\n\n async ready () {\n const checkReady = async () => {\n if (!this._ready) {\n this._ready = this._init();\n }\n return this._ready\n };\n await checkReady();\n // There's a possibility of a race condition where the element gets added, removed, and then added again\n // with a particular timing, which would set the _db to undefined.\n // We *could* do a while loop here, but that seems excessive and could lead to an infinite loop.\n if (!this._db) {\n await checkReady();\n }\n }\n\n async getEmojiByGroup (group) {\n assertNumber(group);\n await this.ready();\n return uniqEmoji(await getEmojiByGroup(this._db, group)).map(cleanEmoji)\n }\n\n async getEmojiBySearchQuery (query) {\n assertNonEmptyString(query);\n await this.ready();\n const customs = this._custom.search(query);\n const natives = uniqEmoji(await getEmojiBySearchQuery(this._db, query)).map(cleanEmoji);\n return [\n ...customs,\n ...natives\n ]\n }\n\n async getEmojiByShortcode (shortcode) {\n assertNonEmptyString(shortcode);\n await this.ready();\n const custom = this._custom.byShortcode(shortcode);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByShortcode(this._db, shortcode))\n }\n\n async getEmojiByUnicodeOrName (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n const custom = this._custom.byName(unicodeOrName);\n if (custom) {\n return custom\n }\n return cleanEmoji(await getEmojiByUnicode(this._db, unicodeOrName))\n }\n\n async getPreferredSkinTone () {\n await this.ready();\n return (await get(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE)) || 0\n }\n\n async setPreferredSkinTone (skinTone) {\n assertNumber(skinTone);\n await this.ready();\n return set(this._db, STORE_KEYVALUE, KEY_PREFERRED_SKINTONE, skinTone)\n }\n\n async incrementFavoriteEmojiCount (unicodeOrName) {\n assertNonEmptyString(unicodeOrName);\n await this.ready();\n return incrementFavoriteEmojiCount(this._db, unicodeOrName)\n }\n\n async getTopFavoriteEmoji (limit) {\n assertNumber(limit);\n await this.ready();\n return (await getTopFavoriteEmoji(this._db, this._custom, limit)).map(cleanEmoji)\n }\n\n set customEmoji (customEmojis) {\n this._custom = customEmojiIndex(customEmojis);\n }\n\n get customEmoji () {\n return this._custom.all\n }\n\n async _shutdown () {\n await this.ready(); // reopen if we've already been closed/deleted\n try {\n await this._lazyUpdate; // allow any lazy updates to process before closing/deleting\n } catch (err) { /* ignore network errors (offline-first) */ }\n }\n\n // clear references to IDB, e.g. during a close event\n _clear () {\n // We don't need to call removeEventListener or remove the manual \"close\" listeners.\n // The memory leak tests prove this is unnecessary. It's because:\n // 1) IDBDatabases that can no longer fire \"close\" automatically have listeners GCed\n // 2) we clear the manual close listeners in databaseLifecycle.js.\n this._db = this._ready = this._lazyUpdate = undefined;\n }\n\n async close () {\n await this._shutdown();\n await closeDatabase(this._dbName);\n }\n\n async delete () {\n await this._shutdown();\n await deleteDatabase(this._dbName);\n }\n}\n\nexport { Database as default };\n","import Database from './database.js';\n\n// via https://unpkg.com/browse/emojibase-data@6.0.0/meta/groups.json\nconst allGroups = [\n [-1, '✨', 'custom'],\n [0, '😀', 'smileys-emotion'],\n [1, '👋', 'people-body'],\n [3, '🐱', 'animals-nature'],\n [4, '🍎', 'food-drink'],\n [5, '🏠️', 'travel-places'],\n [6, '⚽', 'activities'],\n [7, '📝', 'objects'],\n [8, '⛔️', 'symbols'],\n [9, '🏁', 'flags']\n].map(([id, emoji, name]) => ({ id, emoji, name }));\n\nconst groups = allGroups.slice(1);\n\nconst MIN_SEARCH_TEXT_LENGTH = 2;\nconst NUM_SKIN_TONES = 6;\n\n/* istanbul ignore next */\nconst rIC = typeof requestIdleCallback === 'function' ? requestIdleCallback : setTimeout;\n\n// check for ZWJ (zero width joiner) character\nfunction hasZwj (emoji) {\n return emoji.unicode.includes('\\u200d')\n}\n\n// Find one good representative emoji from each version to test by checking its color.\n// Ideally it should have color in the center. For some inspiration, see:\n// https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n//\n// Note that for certain versions (12.1, 13.1), there is no point in testing them explicitly, because\n// all the emoji from this version are compound-emoji from previous versions. So they would pass a color\n// test, even in browsers that display them as double emoji. (E.g. \"face in clouds\" might render as\n// \"face without mouth\" plus \"fog\".) These emoji can only be filtered using the width test,\n// which happens in checkZwjSupport.js.\nconst versionsAndTestEmoji = {\n '🫪': 17, // distorted face\n '🫩': 16, // face with bags under eyes\n '🫨': 15.1, // shaking head, technically from v15 but see note above\n '🫠': 14,\n '🥲': 13.1, // smiling face with tear, technically from v13 but see note above\n '🥻': 12.1, // sari, technically from v12 but see note above\n '🥰': 11,\n '🤩': 5,\n '👱‍♀️': 4,\n '🤣': 3,\n '👁️‍🗨️': 2,\n '😀': 1,\n '😐️': 0.7,\n '😃': 0.6\n};\n\nconst TIMEOUT_BEFORE_LOADING_MESSAGE = 1000; // 1 second\nconst DEFAULT_SKIN_TONE_EMOJI = '🖐️';\nconst DEFAULT_NUM_COLUMNS = 8;\n\n// Based on https://fivethirtyeight.com/features/the-100-most-used-emojis/ and\n// https://blog.emojipedia.org/facebook-reveals-most-and-least-used-emojis/ with\n// a bit of my own curation. (E.g. avoid the \"OK\" gesture because of connotations:\n// https://emojipedia.org/ok-hand/)\nconst MOST_COMMONLY_USED_EMOJI = [\n '😊',\n '😒',\n '❤️',\n '👍️',\n '😍',\n '😂',\n '😭',\n '☺️',\n '😔',\n '😩',\n '😏',\n '💕',\n '🙌',\n '😘'\n];\n\n// It's important to list Twemoji Mozilla before everything else, because Mozilla bundles their\n// own font on some platforms (notably Windows and Linux as of this writing). Typically, Mozilla\n// updates faster than the underlying OS, and we don't want to render older emoji in one font and\n// newer emoji in another font:\n// https://github.com/nolanlawson/emoji-picker-element/pull/268#issuecomment-1073347283\nconst FONT_FAMILY = '\"Twemoji Mozilla\",\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\",' +\n '\"Noto Color Emoji\",\"EmojiOne Color\",\"Android Emoji\",sans-serif';\n\n/* istanbul ignore next */\nconst DEFAULT_CATEGORY_SORTING = (a, b) => a < b ? -1 : a > b ? 1 : 0;\n\n// Test if an emoji is supported by rendering it to canvas and checking that the color is not black\n// See https://about.gitlab.com/blog/2018/05/30/journey-in-native-unicode-emoji/\n// and https://www.npmjs.com/package/if-emoji for inspiration\n// This implementation is largely borrowed from if-emoji, adding the font-family\n\n\nconst getTextFeature = (text, color) => {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = 1;\n\n const ctx = canvas.getContext('2d', {\n // Improves the performance of `getImageData()`\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/getContextAttributes#willreadfrequently\n willReadFrequently: true\n });\n ctx.textBaseline = 'top';\n ctx.font = `100px ${FONT_FAMILY}`;\n ctx.fillStyle = color;\n ctx.scale(0.01, 0.01);\n ctx.fillText(text, 0, 0);\n\n return ctx.getImageData(0, 0, 1, 1).data\n};\n\nconst compareFeatures = (feature1, feature2) => {\n const feature1Str = [...feature1].join(',');\n const feature2Str = [...feature2].join(',');\n // This is RGBA, so for 0,0,0, we are checking that the first RGB is not all zeroes.\n // Most of the time when unsupported this is 0,0,0,0, but on Chrome on Mac it is\n // 0,0,0,61 - there is a transparency here.\n return feature1Str === feature2Str && !feature1Str.startsWith('0,0,0,')\n};\n\nfunction testColorEmojiSupported (text) {\n // Render white and black and then compare them to each other and ensure they're the same\n // color, and neither one is black. This shows that the emoji was rendered in color.\n const feature1 = getTextFeature(text, '#000');\n const feature2 = getTextFeature(text, '#fff');\n return feature1 && feature2 && compareFeatures(feature1, feature2)\n}\n\n// rather than check every emoji ever, which would be expensive, just check some representatives from the\n// different emoji releases to determine what the font supports\n\nfunction determineEmojiSupportLevel () {\n const entries = Object.entries(versionsAndTestEmoji);\n try {\n // start with latest emoji and work backwards\n for (const [emoji, version] of entries) {\n if (testColorEmojiSupported(emoji)) {\n return version\n }\n }\n } catch (e) { // canvas error\n } finally {\n }\n // In case of an error, be generous and just assume all emoji are supported (e.g. for canvas errors\n // due to anti-fingerprinting add-ons). Better to show some gray boxes than nothing at all.\n return entries[0][1] // first one in the list is the most recent version\n}\n\n// Check which emojis we know for sure aren't supported, based on Unicode version level\nlet promise;\nconst detectEmojiSupportLevel = () => {\n if (!promise) {\n // Delay so it can run while the IDB database is being created by the browser (on another thread).\n // This helps especially with first load – we want to start pre-populating the database on the main thread,\n // and then wait for IDB to commit everything, and while waiting we run this check.\n promise = new Promise(resolve => (\n rIC(() => (\n resolve(determineEmojiSupportLevel()) // delay so ideally this can run while IDB is first populating\n ))\n ));\n }\n return promise\n};\n// determine which emojis containing ZWJ (zero width joiner) characters\n// are supported (rendered as one glyph) rather than unsupported (rendered as two or more glyphs)\nconst supportedZwjEmojis = new Map();\n\nconst VARIATION_SELECTOR = '\\ufe0f';\nconst SKINTONE_MODIFIER = '\\ud83c';\nconst ZWJ = '\\u200d';\nconst LIGHT_SKIN_TONE = 0x1F3FB;\nconst LIGHT_SKIN_TONE_MODIFIER = 0xdffb;\n\n// TODO: this is a naive implementation, we can improve it later\n// It's only used for the skintone picker, so as long as people don't customize with\n// really exotic emoji then it should work fine\nfunction applySkinTone (str, skinTone) {\n if (skinTone === 0) {\n return str\n }\n const zwjIndex = str.indexOf(ZWJ);\n if (zwjIndex !== -1) {\n return str.substring(0, zwjIndex) +\n String.fromCodePoint(LIGHT_SKIN_TONE + skinTone - 1) +\n str.substring(zwjIndex)\n }\n if (str.endsWith(VARIATION_SELECTOR)) {\n str = str.substring(0, str.length - 1);\n }\n return str + SKINTONE_MODIFIER + String.fromCodePoint(LIGHT_SKIN_TONE_MODIFIER + skinTone - 1)\n}\n\nfunction halt (event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\n// Implementation left/right or up/down navigation, circling back when you\n// reach the start/end of the list\nfunction incrementOrDecrement (decrement, val, arr) {\n val += (decrement ? -1 : 1);\n if (val < 0) {\n val = arr.length - 1;\n } else if (val >= arr.length) {\n val = 0;\n }\n return val\n}\n\n// like lodash's uniqBy but much smaller\nfunction uniqBy (arr, func) {\n const set = new Set();\n const res = [];\n for (const item of arr) {\n const key = func(item);\n if (!set.has(key)) {\n set.add(key);\n res.push(item);\n }\n }\n return res\n}\n\n// We don't need all the data on every emoji, and there are specific things we need\n// for the UI, so build a \"view model\" from the emoji object we got from the database\n\nfunction summarizeEmojisForUI (emojis, emojiSupportLevel) {\n const toSimpleSkinsMap = skins => {\n const res = {};\n for (const skin of skins) {\n // ignore arrays like [1, 2] with multiple skin tones\n // also ignore variants that are in an unsupported emoji version\n // (these do exist - variants from a different version than their base emoji)\n if (typeof skin.tone === 'number' && skin.version <= emojiSupportLevel) {\n res[skin.tone] = skin.unicode;\n }\n }\n return res\n };\n\n return emojis.map(({ unicode, skins, shortcodes, url, name, category, annotation }) => ({\n unicode,\n name,\n shortcodes,\n url,\n category,\n annotation,\n id: unicode || name,\n skins: skins && toSimpleSkinsMap(skins)\n }))\n}\n\n// import rAF from one place so that the bundle size is a bit smaller\nconst rAF = requestAnimationFrame;\n\n// \"Svelte action\"-like utility to detect layout changes via ResizeObserver.\n// If ResizeObserver is unsupported, we just use rAF once and don't bother to update.\n\n\nlet resizeObserverSupported = typeof ResizeObserver === 'function';\n\nfunction resizeObserverAction (node, abortSignal, onUpdate) {\n let resizeObserver;\n if (resizeObserverSupported) {\n resizeObserver = new ResizeObserver(onUpdate);\n resizeObserver.observe(node);\n } else { // just run once, don't bother trying to track it\n rAF(onUpdate);\n }\n\n // cleanup function (called on destroy)\n abortSignal.addEventListener('abort', () => {\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n });\n}\n\n// get the width of the text inside of a DOM node, via https://stackoverflow.com/a/59525891/680742\nfunction calculateTextWidth (node) {\n // skip running this in jest/vitest because we don't need to check for emoji support in that environment\n /* istanbul ignore else */\n {\n const range = document.createRange();\n range.selectNode(node.firstChild);\n return range.getBoundingClientRect().width\n }\n}\n\nlet baselineEmojiWidth;\n\n/**\n * Check if the given emojis containing ZWJ characters are supported by the current browser (don't render\n * as double characters) and return true if all are supported.\n * @param zwjEmojisToCheck\n * @param baselineEmoji\n * @param emojiToDomNode\n */\nfunction checkZwjSupport (zwjEmojisToCheck, baselineEmoji, emojiToDomNode) {\n let allSupported = true;\n let shouldWarn = false;\n for (const emoji of zwjEmojisToCheck) {\n const domNode = emojiToDomNode(emoji);\n // sanity check to make sure the node is defined properly\n /* istanbul ignore if */\n if (!domNode) {\n // This is a race condition that can occur when the component is unmounted/remounted\n // It doesn't really matter what we do here since the old context is not going to render anymore.\n // Just bail out of emoji support detection and return `allSupported=true` since the rendering context is gone\n continue\n }\n const emojiWidth = calculateTextWidth(domNode);\n /* istanbul ignore if */\n if (emojiWidth === 0) {\n shouldWarn = true;\n }\n if (typeof baselineEmojiWidth === 'undefined') { // calculate the baseline emoji width only once\n baselineEmojiWidth = calculateTextWidth(baselineEmoji);\n }\n // On Windows, some supported emoji are ~50% bigger than the baseline emoji, but what we really want to guard\n // against are the ones that are 2x the size, because those are truly broken (person with red hair = person with\n // floating red wig, black cat = cat with black square, polar bear = bear with snowflake, etc.)\n // So here we set the threshold at 1.8 times the size of the baseline emoji.\n const supported = emojiWidth / 1.8 < baselineEmojiWidth;\n supportedZwjEmojis.set(emoji.unicode, supported);\n\n if (!supported) {\n allSupported = false;\n }\n }\n // Warn exactly once since we don't want to spam the console\n /* istanbul ignore if */\n if (shouldWarn) {\n console.warn('Emoji support detection failed - emoji character is 0 width.\\n' +\n 'This is likely due to using `display:none` which is unsupported.\\n' +\n 'If this is a Jest/Vitest environment, you can ignore this warning.\\n' +\n 'For details see: https://github.com/nolanlawson/emoji-picker-element/issues/514'\n );\n }\n return allSupported\n}\n\n// like lodash's uniq\n\nfunction uniq (arr) {\n return uniqBy(arr, _ => _)\n}\n\n// Note we put this in its own function outside Picker.js to avoid Svelte doing an invalidation on the \"setter\" here.\n// At best the invalidation is useless, at worst it can cause infinite loops:\n// https://github.com/nolanlawson/emoji-picker-element/pull/180\n// https://github.com/sveltejs/svelte/issues/6521\n// Also note tabpanelElement can be null if the element is disconnected immediately after connected\nfunction resetScrollTopIfPossible (element) {\n /* istanbul ignore else */\n if (element) { // Makes me nervous not to have this `if` guard\n element.scrollTop = 0;\n }\n}\n\nfunction getFromMap (cache, key, func) {\n let cached = cache.get(key);\n if (!cached) {\n cached = func();\n cache.set(key, cached);\n }\n return cached\n}\n\nfunction toString (value) {\n return '' + value\n}\n\nfunction parseTemplate (htmlString) {\n const template = document.createElement('template');\n template.innerHTML = htmlString;\n return template\n}\n\nconst parseCache = new WeakMap();\nconst domInstancesCache = new WeakMap();\n// This needs to be a symbol because it needs to be different from any possible output of a key function\nconst unkeyedSymbol = Symbol('un-keyed');\n\n// Not supported in Safari <=13\nconst hasReplaceChildren = 'replaceChildren' in Element.prototype;\nfunction replaceChildren (parentNode, newChildren) {\n /* istanbul ignore else */\n if (hasReplaceChildren) {\n parentNode.replaceChildren(...newChildren);\n } else { // minimal polyfill for Element.prototype.replaceChildren\n parentNode.innerHTML = '';\n parentNode.append(...newChildren);\n }\n}\n\nfunction doChildrenNeedRerender (parentNode, newChildren) {\n let oldChild = parentNode.firstChild;\n let oldChildrenCount = 0;\n // iterate using firstChild/nextSibling because browsers use a linked list under the hood\n while (oldChild) {\n const newChild = newChildren[oldChildrenCount];\n // check if the old child and new child are the same\n if (newChild !== oldChild) {\n return true\n }\n oldChild = oldChild.nextSibling;\n oldChildrenCount++;\n }\n // if new children length is different from old, we must re-render\n return oldChildrenCount !== newChildren.length\n}\n\nfunction patchChildren (newChildren, instanceBinding) {\n const { targetNode } = instanceBinding;\n let { targetParentNode } = instanceBinding;\n\n let needsRerender = false;\n\n if (targetParentNode) { // already rendered once\n needsRerender = doChildrenNeedRerender(targetParentNode, newChildren);\n } else { // first render of list\n needsRerender = true;\n instanceBinding.targetNode = undefined; // placeholder node not needed anymore, free memory\n instanceBinding.targetParentNode = targetParentNode = targetNode.parentNode;\n }\n // avoid re-rendering list if the dom nodes are exactly the same before and after\n if (needsRerender) {\n replaceChildren(targetParentNode, newChildren);\n }\n}\n\nfunction patch (expressions, instanceBindings) {\n for (const instanceBinding of instanceBindings) {\n const {\n targetNode,\n currentExpression,\n binding: {\n expressionIndex,\n attributeName,\n attributeValuePre,\n attributeValuePost\n }\n } = instanceBinding;\n\n const expression = expressions[expressionIndex];\n\n if (currentExpression === expression) {\n // no need to update, same as before\n continue\n }\n\n instanceBinding.currentExpression = expression;\n\n if (attributeName) { // attribute replacement\n if (expression === null) {\n // null is treated as a special case by the framework - we don't render an attribute at all in this case\n targetNode.removeAttribute(attributeName);\n } else {\n // attribute value is not null; set a new attribute\n const newValue = attributeValuePre + toString(expression) + attributeValuePost;\n targetNode.setAttribute(attributeName, newValue);\n }\n } else { // text node / child element / children replacement\n let newNode;\n if (Array.isArray(expression)) { // array of DOM elements produced by tag template literals\n patchChildren(expression, instanceBinding);\n } else if (expression instanceof Element) { // html tag template returning a DOM element\n newNode = expression;\n targetNode.replaceWith(newNode);\n } else { // primitive - string, number, etc\n // nodeValue is faster than textContent supposedly https://www.youtube.com/watch?v=LY6y3HbDVmg\n // note we may be replacing the value in a placeholder text node\n targetNode.nodeValue = toString(expression);\n }\n if (newNode) {\n instanceBinding.targetNode = newNode;\n }\n }\n }\n}\n\nfunction parse (tokens) {\n let htmlString = '';\n\n let withinTag = false;\n let withinAttribute = false;\n let elementIndexCounter = -1; // depth-first traversal order\n\n const elementsToBindings = new Map();\n const elementIndexes = [];\n\n let skipTokenChars = 0;\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n htmlString += token.slice(skipTokenChars);\n\n if (i === len - 1) {\n break // no need to process characters - no more expressions to be found\n }\n\n for (let j = 0; j < token.length; j++) {\n const char = token.charAt(j);\n switch (char) {\n case '<': {\n const nextChar = token.charAt(j + 1);\n if (nextChar === '/') { // closing tag\n // leaving an element\n elementIndexes.pop();\n } else { // not a closing tag\n withinTag = true;\n elementIndexes.push(++elementIndexCounter);\n }\n break\n }\n case '>': {\n withinTag = false;\n withinAttribute = false;\n break\n }\n case '=': {\n withinAttribute = true;\n break\n }\n }\n }\n\n const elementIndex = elementIndexes[elementIndexes.length - 1];\n const bindings = getFromMap(elementsToBindings, elementIndex, () => []);\n\n let attributeName;\n let attributeValuePre;\n let attributeValuePost;\n if (withinAttribute) {\n // I never use single-quotes for attribute values in HTML, so just support double-quotes or no-quotes\n const attributePreMatch = /(\\S+)=\"?([^\"=]*)$/.exec(token);\n attributeName = attributePreMatch[1];\n attributeValuePre = attributePreMatch[2];\n const attributePostMatch = /^([^\">]*)(\"?)/.exec(tokens[i + 1]);\n attributeValuePost = attributePostMatch[1];\n // Optimization: remove the attribute itself, so we don't create a default attribute which is either empty or just\n // the \"pre\" text, e.g. `<div foo>` or `<div foo=\"prefix\">`. It will be replaced by the expression anyway.\n htmlString = htmlString.slice(0, -1 * attributePreMatch[0].length);\n skipTokenChars = attributePostMatch[0].length;\n } else {\n skipTokenChars = 0;\n }\n\n const binding = {\n attributeName,\n attributeValuePre,\n attributeValuePost,\n expressionIndex: i\n };\n\n bindings.push(binding);\n\n if (!withinTag && !withinAttribute) {\n // Add a placeholder text node, so we can find it later. Note we only support one dynamic child text node\n htmlString += ' ';\n }\n }\n\n const template = parseTemplate(htmlString);\n\n return {\n template,\n elementsToBindings\n }\n}\n\nfunction applyBindings (bindings, element, instanceBindings) {\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n\n const targetNode = binding.attributeName\n ? element // attribute binding, just use the element itself\n : element.firstChild; // not an attribute binding, so has a placeholder text node\n\n const instanceBinding = {\n binding,\n targetNode,\n targetParentNode: undefined,\n currentExpression: undefined\n };\n\n instanceBindings.push(instanceBinding);\n }\n}\n\nfunction traverseAndSetupBindings (rootElement, elementsToBindings) {\n const instanceBindings = [];\n\n let topLevelBindings;\n if (elementsToBindings.size === 1 && (topLevelBindings = elementsToBindings.get(0))) {\n // Optimization for the common case where there's only one element and one binding\n // Skip creating a TreeWalker entirely and just handle the root DOM element\n applyBindings(topLevelBindings, rootElement, instanceBindings);\n } else {\n // traverse dom\n const treeWalker = document.createTreeWalker(rootElement, NodeFilter.SHOW_ELEMENT);\n\n let element = rootElement;\n let elementIndex = -1;\n do {\n const bindings = elementsToBindings.get(++elementIndex);\n if (bindings) {\n applyBindings(bindings, element, instanceBindings);\n }\n } while ((element = treeWalker.nextNode()))\n }\n\n return instanceBindings\n}\n\nfunction parseHtml (tokens) {\n // All templates and bound expressions are unique per tokens array\n const { template, elementsToBindings } = getFromMap(parseCache, tokens, () => parse(tokens));\n\n // When we parseHtml, we always return a fresh DOM instance ready to be updated\n const dom = template.cloneNode(true).content.firstElementChild;\n const instanceBindings = traverseAndSetupBindings(dom, elementsToBindings);\n\n return function updateDomInstance (expressions) {\n patch(expressions, instanceBindings);\n return dom\n }\n}\n\nfunction createFramework (state) {\n const domInstances = getFromMap(domInstancesCache, state, () => new Map());\n let domInstanceCacheKey = unkeyedSymbol;\n\n function html (tokens, ...expressions) {\n // Each unique lexical usage of map() is considered unique due to the html`` tagged template call it makes,\n // which has lexically unique tokens. The unkeyed symbol is just used for html`` usage outside of a map().\n const domInstancesForTokens = getFromMap(domInstances, tokens, () => new Map());\n const updateDomInstance = getFromMap(domInstancesForTokens, domInstanceCacheKey, () => parseHtml(tokens));\n\n return updateDomInstance(expressions) // update with expressions\n }\n\n function map (array, callback, keyFunction) {\n return array.map((item, index) => {\n const originalCacheKey = domInstanceCacheKey;\n domInstanceCacheKey = keyFunction(item);\n try {\n return callback(item, index)\n } finally {\n domInstanceCacheKey = originalCacheKey;\n }\n })\n }\n\n return { map, html }\n}\n\nfunction render (container, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender) {\n const { labelWithSkin, titleForEmoji, unicodeWithSkin } = helpers;\n const { html, map } = createFramework(state);\n\n function emojiList (emojis, searchMode, prefix) {\n return map(emojis, (emoji, i) => {\n return html`<button role=\"${searchMode ? 'option' : 'menuitem'}\" aria-selected=\"${searchMode ? i === state.activeSearchItem : null}\" aria-label=\"${labelWithSkin(emoji, state.currentSkinTone)}\" title=\"${titleForEmoji(emoji)}\" class=\"${\n 'emoji' +\n (searchMode && i === state.activeSearchItem ? ' active' : '') +\n (emoji.unicode ? '' : ' custom-emoji')\n }\" id=\"${`${prefix}-${emoji.id}`}\" style=\"${emoji.unicode ? null : `--custom-emoji-background: url(${JSON.stringify(emoji.url)})`}\">${\n emoji.unicode\n ? unicodeWithSkin(emoji, state.currentSkinTone)\n : ''\n }</button>`\n // It's important for the cache key to be unique based on the prefix, because the framework caches based on the\n // unique tokens + cache key, and the same emoji may be used in the tab as well as in the fav bar\n }, emoji => `${prefix}-${emoji.id}`)\n }\n\n const section = () => {\n return html`<section data-ref=\"rootElement\" class=\"picker\" aria-label=\"${state.i18n.regionLabel}\" style=\"${state.pickerStyle || ''}\"><div class=\"pad-top\"></div><div class=\"search-row\"><div class=\"search-wrapper\"><input id=\"search\" class=\"search\" type=\"search\" role=\"combobox\" enterkeyhint=\"search\" placeholder=\"${state.i18n.searchLabel}\" autocapitalize=\"none\" autocomplete=\"off\" spellcheck=\"true\" aria-expanded=\"${!!(state.searchMode && state.currentEmojis.length)}\" aria-controls=\"search-results\" aria-describedby=\"search-description\" aria-autocomplete=\"list\" aria-activedescendant=\"${state.activeSearchItemId ? `emo-${state.activeSearchItemId}` : null}\" data-ref=\"searchElement\" data-on-input=\"onSearchInput\" data-on-keydown=\"onSearchKeydown\"><label class=\"sr-only\" for=\"search\">${state.i18n.searchLabel}</label> <span id=\"search-description\" class=\"sr-only\">${state.i18n.searchDescription}</span></div><div class=\"skintone-button-wrapper ${state.skinTonePickerExpandedAfterAnimation ? 'expanded' : ''}\"><button id=\"skintone-button\" class=\"emoji ${state.skinTonePickerExpanded ? 'hide-focus' : ''}\" aria-label=\"${state.skinToneButtonLabel}\" title=\"${state.skinToneButtonLabel}\" aria-describedby=\"skintone-description\" aria-haspopup=\"listbox\" aria-expanded=\"${state.skinTonePickerExpanded}\" aria-controls=\"skintone-list\" data-on-click=\"onClickSkinToneButton\">${state.skinToneButtonText || ''}</button></div><span id=\"skintone-description\" class=\"sr-only\">${state.i18n.skinToneDescription}</span><div data-ref=\"skinToneDropdown\" id=\"skintone-list\" class=\"skintone-list hide-focus ${state.skinTonePickerExpanded ? '' : 'hidden no-animate'}\" style=\"transform:translateY(${state.skinTonePickerExpanded ? 0 : 'calc(-1 * var(--num-skintones) * var(--total-emoji-size))'})\" role=\"listbox\" aria-label=\"${state.i18n.skinTonesLabel}\" aria-activedescendant=\"skintone-${state.activeSkinTone}\" aria-hidden=\"${!state.skinTonePickerExpanded}\" tabIndex=\"-1\" data-on-focusout=\"onSkinToneOptionsFocusOut\" data-on-click=\"onSkinToneOptionsClick\" data-on-keydown=\"onSkinToneOptionsKeydown\" data-on-keyup=\"onSkinToneOptionsKeyup\">${\n map(state.skinTones, (skinTone, i) => {\n return html`<div id=\"skintone-${i}\" class=\"emoji ${i === state.activeSkinTone ? 'active' : ''}\" aria-selected=\"${i === state.activeSkinTone}\" role=\"option\" title=\"${state.i18n.skinTones[i]}\" aria-label=\"${state.i18n.skinTones[i]}\">${skinTone}</div>`\n }, skinTone => skinTone)\n }</div></div><div class=\"nav\" role=\"tablist\" style=\"grid-template-columns:repeat(${state.groups.length},1fr)\" aria-label=\"${state.i18n.categoriesLabel}\" data-on-keydown=\"onNavKeydown\" data-on-click=\"onNavClick\">${\n map(state.groups, (group) => {\n return html`<button role=\"tab\" class=\"nav-button\" aria-controls=\"tab-${group.id}\" aria-label=\"${state.i18n.categories[group.name]}\" aria-selected=\"${!state.searchMode && state.currentGroup.id === group.id}\" title=\"${state.i18n.categories[group.name]}\" data-group-id=\"${group.id}\"><div class=\"nav-emoji emoji\">${group.emoji}</div></button>`\n }, group => group.id)\n }</div><div class=\"indicator-wrapper\"><div class=\"indicator\" style=\"transform:translateX(${(/* istanbul ignore next */ (state.isRtl ? -1 : 1)) * state.currentGroupIndex * 100}%)\"></div></div><div class=\"message ${state.message ? '' : 'gone'}\" role=\"alert\" aria-live=\"polite\">${state.message || ''}</div><div data-ref=\"tabpanelElement\" class=\"tabpanel ${(!state.databaseLoaded || state.message) ? 'gone' : ''}\" role=\"${state.searchMode ? 'region' : 'tabpanel'}\" aria-label=\"${state.searchMode ? state.i18n.searchResultsLabel : state.i18n.categories[state.currentGroup.name]}\" id=\"${state.searchMode ? null : `tab-${state.currentGroup.id}`}\" tabIndex=\"0\" data-on-click=\"onEmojiClick\"><div data-action=\"calculateEmojiGridStyle\">${\n map(state.currentEmojisWithCategories, (emojiWithCategory, i) => {\n return html`<div><div id=\"menu-label-${i}\" class=\"category ${state.currentEmojisWithCategories.length === 1 && state.currentEmojisWithCategories[0].category === '' ? 'gone' : ''}\" aria-hidden=\"true\">${\n state.searchMode\n ? state.i18n.searchResultsLabel\n : (\n emojiWithCategory.category\n ? emojiWithCategory.category\n : (\n state.currentEmojisWithCategories.length > 1\n ? state.i18n.categories.custom\n : state.i18n.categories[state.currentGroup.name]\n )\n )\n }</div><div class=\"emoji-menu ${i !== 0 && !state.searchMode && state.currentGroup.id === -1 ? 'visibility-auto' : ''}\" style=\"${`--num-rows: ${Math.ceil(emojiWithCategory.emojis.length / state.numColumns)}`}\" data-action=\"updateOnIntersection\" role=\"${state.searchMode ? 'listbox' : 'menu'}\" aria-labelledby=\"menu-label-${i}\" id=\"${state.searchMode ? 'search-results' : null}\">${\n emojiList(emojiWithCategory.emojis, state.searchMode, /* prefix */ 'emo')\n }</div></div>`\n }, emojiWithCategory => emojiWithCategory.category)\n }</div></div><div class=\"favorites onscreen emoji-menu ${state.message ? 'gone' : ''}\" role=\"menu\" aria-label=\"${state.i18n.favoritesLabel}\" data-on-click=\"onEmojiClick\">${\n emojiList(state.currentFavorites, /* searchMode */ false, /* prefix */ 'fav')\n }</div><button data-ref=\"baselineEmoji\" aria-hidden=\"true\" tabindex=\"-1\" class=\"abs-pos hidden emoji baseline-emoji\">😀</button></section>`\n };\n\n const rootDom = section();\n\n // helper for traversing the dom, finding elements by an attribute, and getting the attribute value\n const forElementWithAttribute = (attributeName, callback) => {\n for (const element of container.querySelectorAll(`[${attributeName}]`)) {\n callback(element, element.getAttribute(attributeName));\n }\n };\n\n if (firstRender) { // not a re-render\n container.appendChild(rootDom);\n\n // we only bind events/refs once - there is no need to find them again given this component structure\n\n // bind events\n for (const eventName of ['click', 'focusout', 'input', 'keydown', 'keyup']) {\n forElementWithAttribute(`data-on-${eventName}`, (element, listenerName) => {\n element.addEventListener(eventName, events[listenerName]);\n });\n }\n\n // find refs\n forElementWithAttribute('data-ref', (element, ref) => {\n refs[ref] = element;\n });\n\n // destroy/abort logic\n abortSignal.addEventListener('abort', () => {\n container.removeChild(rootDom);\n });\n }\n\n // set up actions - these are re-bound on every render\n forElementWithAttribute('data-action', (element, action) => {\n let boundActions = actionContext.get(action);\n if (!boundActions) {\n actionContext.set(action, (boundActions = new WeakSet()));\n }\n\n // avoid applying the same action to the same element multiple times\n if (!boundActions.has(element)) {\n boundActions.add(element);\n actions[action](element);\n }\n });\n}\n\n/* istanbul ignore next */\nconst qM = typeof queueMicrotask === 'function' ? queueMicrotask : callback => Promise.resolve().then(callback);\n\nfunction createState (abortSignal) {\n let destroyed = false;\n let currentObserver;\n\n const propsToObservers = new Map();\n const dirtyObservers = new Set();\n\n let queued;\n\n const flush = () => {\n if (destroyed) {\n return\n }\n const observersToRun = [...dirtyObservers];\n dirtyObservers.clear(); // clear before running to force any new updates to run in another tick of the loop\n try {\n for (const observer of observersToRun) {\n observer();\n }\n } finally {\n queued = false;\n if (dirtyObservers.size) { // new updates, queue another one\n queued = true;\n qM(flush);\n }\n }\n };\n\n const state = new Proxy({}, {\n get (target, prop) {\n if (currentObserver) {\n let observers = propsToObservers.get(prop);\n if (!observers) {\n observers = new Set();\n propsToObservers.set(prop, observers);\n }\n observers.add(currentObserver);\n }\n return target[prop]\n },\n set (target, prop, newValue) {\n if (target[prop] !== newValue) {\n target[prop] = newValue;\n const observers = propsToObservers.get(prop);\n if (observers) {\n for (const observer of observers) {\n dirtyObservers.add(observer);\n }\n if (!queued) {\n queued = true;\n qM(flush);\n }\n }\n }\n return true\n }\n });\n\n const createEffect = (callback) => {\n const runnable = () => {\n const oldObserver = currentObserver;\n currentObserver = runnable;\n try {\n return callback()\n } finally {\n currentObserver = oldObserver;\n }\n };\n return runnable()\n };\n\n // destroy logic\n abortSignal.addEventListener('abort', () => {\n destroyed = true;\n });\n\n return {\n state,\n createEffect\n }\n}\n\n// Compare two arrays, with a function called on each item in the two arrays that returns true if the items are equal\nfunction arraysAreEqualByFunction (left, right, areEqualFunc) {\n if (left.length !== right.length) {\n return false\n }\n for (let i = 0; i < left.length; i++) {\n if (!areEqualFunc(left[i], right[i])) {\n return false\n }\n }\n return true\n}\n\nconst intersectionObserverCache = new WeakMap();\n\nfunction intersectionObserverAction (node, abortSignal, listener) {\n /* istanbul ignore else */\n {\n // The scroll root is always `.tabpanel`\n const root = node.closest('.tabpanel');\n\n let observer = intersectionObserverCache.get(root);\n if (!observer) {\n // TODO: replace this with the contentvisibilityautostatechange event when all supported browsers support it.\n // For now we use IntersectionObserver because it has better cross-browser support, and it would be bad for\n // old Safari versions if they eagerly downloaded all custom emoji all at once.\n observer = new IntersectionObserver(listener, {\n root,\n // trigger if we are 1/2 scroll container height away so that the images load a bit quicker while scrolling\n rootMargin: '50% 0px 50% 0px',\n // trigger if any part of the emoji grid is intersecting\n threshold: 0\n });\n\n // avoid creating a new IntersectionObserver for every category; just use one for the whole root\n intersectionObserverCache.set(root, observer);\n\n // assume that the abortSignal is always the same for this root node; just add one event listener\n abortSignal.addEventListener('abort', () => {\n observer.disconnect();\n });\n }\n\n observer.observe(node);\n }\n}\n\n/* eslint-disable prefer-const,no-labels,no-inner-declarations */\n\n// constants\nconst EMPTY_ARRAY = [];\n\nconst { assign } = Object;\n\nfunction createRoot (shadowRoot, props) {\n const refs = {};\n const abortController = new AbortController();\n const abortSignal = abortController.signal;\n const { state, createEffect } = createState(abortSignal);\n const actionContext = new Map();\n\n // initial state\n assign(state, {\n skinToneEmoji: undefined,\n i18n: undefined,\n database: undefined,\n customEmoji: undefined,\n customCategorySorting: undefined,\n emojiVersion: undefined\n });\n\n // public props\n assign(state, props);\n\n // private props\n assign(state, {\n initialLoad: true,\n currentEmojis: [],\n currentEmojisWithCategories: [],\n rawSearchText: '',\n searchText: '',\n searchMode: false,\n activeSearchItem: -1,\n message: undefined,\n skinTonePickerExpanded: false,\n skinTonePickerExpandedAfterAnimation: false,\n currentSkinTone: 0,\n activeSkinTone: 0,\n skinToneButtonText: undefined,\n pickerStyle: undefined,\n skinToneButtonLabel: '',\n skinTones: [],\n currentFavorites: [],\n defaultFavoriteEmojis: undefined,\n numColumns: DEFAULT_NUM_COLUMNS,\n isRtl: false,\n currentGroupIndex: 0,\n groups: groups,\n databaseLoaded: false,\n activeSearchItemId: undefined\n });\n\n //\n // Update the current group based on the currentGroupIndex\n //\n createEffect(() => {\n if (state.currentGroup !== state.groups[state.currentGroupIndex]) {\n state.currentGroup = state.groups[state.currentGroupIndex];\n }\n });\n\n //\n // Utils/helpers\n //\n\n const focus = id => {\n shadowRoot.getElementById(id).focus();\n };\n\n const emojiToDomNode = emoji => shadowRoot.getElementById(`emo-${emoji.id}`);\n\n // fire a custom event that crosses the shadow boundary\n const fireEvent = (name, detail) => {\n refs.rootElement.dispatchEvent(new CustomEvent(name, {\n detail,\n bubbles: true,\n composed: true\n }));\n };\n\n //\n // Comparison utils\n //\n\n const compareEmojiArrays = (a, b) => a.id === b.id;\n\n const compareCurrentEmojisWithCategories = (a, b) => {\n const { category: aCategory, emojis: aEmojis } = a;\n const { category: bCategory, emojis: bEmojis } = b;\n\n if (aCategory !== bCategory) {\n return false\n }\n\n return arraysAreEqualByFunction(aEmojis, bEmojis, compareEmojiArrays)\n };\n\n //\n // Update utils to avoid excessive re-renders\n //\n\n // avoid excessive re-renders by checking the value before setting\n const updateCurrentEmojis = (newEmojis) => {\n if (!arraysAreEqualByFunction(state.currentEmojis, newEmojis, compareEmojiArrays)) {\n state.currentEmojis = newEmojis;\n }\n };\n\n // avoid excessive re-renders\n const updateSearchMode = (newSearchMode) => {\n if (state.searchMode !== newSearchMode) {\n state.searchMode = newSearchMode;\n }\n };\n\n // avoid excessive re-renders\n const updateCurrentEmojisWithCategories = (newEmojisWithCategories) => {\n if (!arraysAreEqualByFunction(state.currentEmojisWithCategories, newEmojisWithCategories, compareCurrentEmojisWithCategories)) {\n state.currentEmojisWithCategories = newEmojisWithCategories;\n }\n };\n\n // Helpers used by PickerTemplate\n\n const unicodeWithSkin = (emoji, currentSkinTone) => (\n (currentSkinTone && emoji.skins && emoji.skins[currentSkinTone]) || emoji.unicode\n );\n\n const labelWithSkin = (emoji, currentSkinTone) => (\n uniq([\n (emoji.name || unicodeWithSkin(emoji, currentSkinTone)),\n emoji.annotation,\n ...(emoji.shortcodes || EMPTY_ARRAY)\n ].filter(Boolean)).join(', ')\n );\n\n const titleForEmoji = (emoji) => (\n emoji.annotation || (emoji.shortcodes || EMPTY_ARRAY).join(', ')\n );\n\n const helpers = {\n labelWithSkin, titleForEmoji, unicodeWithSkin\n };\n const events = {\n onClickSkinToneButton,\n onEmojiClick,\n onNavClick,\n onNavKeydown,\n onSearchKeydown,\n onSkinToneOptionsClick,\n onSkinToneOptionsFocusOut,\n onSkinToneOptionsKeydown,\n onSkinToneOptionsKeyup,\n onSearchInput\n };\n const actions = {\n calculateEmojiGridStyle,\n updateOnIntersection\n };\n\n let firstRender = true;\n createEffect(() => {\n render(shadowRoot, state, helpers, events, actions, refs, abortSignal, actionContext, firstRender);\n firstRender = false;\n });\n\n //\n // Determine the emoji support level (in requestIdleCallback)\n //\n\n // mount logic\n if (!state.emojiVersion) {\n detectEmojiSupportLevel().then(level => {\n // Can't actually test emoji support in Jest/Vitest/JSDom, emoji never render in color in Cairo\n /* istanbul ignore next */\n if (!level) {\n state.message = state.i18n.emojiUnsupportedMessage;\n }\n });\n }\n\n //\n // Set or update the database object\n //\n\n createEffect(() => {\n // show a Loading message if it takes a long time, or show an error if there's a network/IDB error\n async function handleDatabaseLoading () {\n let showingLoadingMessage = false;\n const timeoutHandle = setTimeout(() => {\n showingLoadingMessage = true;\n state.message = state.i18n.loadingMessage;\n }, TIMEOUT_BEFORE_LOADING_MESSAGE);\n try {\n await state.database.ready();\n state.databaseLoaded = true; // eslint-disable-line no-unused-vars\n } catch (err) {\n console.error(err);\n state.message = state.i18n.networkErrorMessage;\n } finally {\n clearTimeout(timeoutHandle);\n if (showingLoadingMessage) { // Seems safer than checking the i18n string, which may change\n showingLoadingMessage = false;\n state.message = ''; // eslint-disable-line no-unused-vars\n }\n }\n }\n\n if (state.database) {\n /* no await */\n handleDatabaseLoading();\n }\n });\n\n //\n // Global styles for the entire picker\n //\n\n createEffect(() => {\n state.pickerStyle = `\n --num-groups: ${state.groups.length}; \n --indicator-opacity: ${state.searchMode ? 0 : 1}; \n --num-skintones: ${NUM_SKIN_TONES};`;\n });\n\n //\n // Set or update the customEmoji\n //\n\n createEffect(() => {\n if (state.customEmoji && state.database) {\n updateCustomEmoji(); // re-run whenever customEmoji change\n }\n });\n\n createEffect(() => {\n if (state.customEmoji && state.customEmoji.length) {\n if (state.groups !== allGroups) { // don't update unnecessarily\n state.groups = allGroups;\n }\n } else if (state.groups !== groups) {\n if (state.currentGroupIndex) {\n // If the current group is anything other than \"custom\" (which is first), decrement.\n // This fixes the odd case where you set customEmoji, then pick a category, then unset customEmoji\n state.currentGroupIndex--;\n }\n state.groups = groups;\n }\n });\n\n //\n // Set or update the preferred skin tone\n //\n\n createEffect(() => {\n async function updatePreferredSkinTone () {\n if (state.databaseLoaded) {\n state.currentSkinTone = await state.database.getPreferredSkinTone();\n }\n }\n\n /* no await */ updatePreferredSkinTone();\n });\n\n createEffect(() => {\n state.skinTones = Array(NUM_SKIN_TONES).fill().map((_, i) => applySkinTone(state.skinToneEmoji, i));\n });\n\n createEffect(() => {\n state.skinToneButtonText = state.skinTones[state.currentSkinTone];\n });\n\n createEffect(() => {\n state.skinToneButtonLabel = state.i18n.skinToneLabel.replace('{skinTone}', state.i18n.skinTones[state.currentSkinTone]);\n });\n\n //\n // Set or update the favorites emojis\n //\n\n createEffect(() => {\n async function updateDefaultFavoriteEmojis () {\n const { database } = state;\n const favs = (await Promise.all(MOST_COMMONLY_USED_EMOJI.map(unicode => (\n database.getEmojiByUnicodeOrName(unicode)\n )))).filter(Boolean); // filter because in Jest/Vitest tests we don't have all the emoji in the DB\n state.defaultFavoriteEmojis = favs;\n }\n\n if (state.databaseLoaded) {\n /* no await */ updateDefaultFavoriteEmojis();\n }\n });\n\n function updateCustomEmoji () {\n // Certain effects have an implicit dependency on customEmoji since it affects the database\n // Getting it here on the state ensures this effect re-runs when customEmoji change.\n const { customEmoji, database } = state;\n const databaseCustomEmoji = customEmoji || EMPTY_ARRAY;\n if (database.customEmoji !== databaseCustomEmoji) {\n // Avoid setting this if the customEmoji have _not_ changed, because the setter triggers a re-computation of the\n // `customEmojiIndex`. Note we don't bother with deep object changes.\n database.customEmoji = databaseCustomEmoji;\n }\n }\n\n createEffect(() => {\n async function updateFavorites () {\n updateCustomEmoji(); // re-run whenever customEmoji change\n const { database, defaultFavoriteEmojis, numColumns } = state;\n const dbFavorites = await database.getTopFavoriteEmoji(numColumns);\n const favorites = await summarizeEmojis(uniqBy([\n ...dbFavorites,\n ...defaultFavoriteEmojis\n ], _ => (_.unicode || _.name)).slice(0, numColumns));\n state.currentFavorites = favorites;\n }\n\n if (state.databaseLoaded && state.defaultFavoriteEmojis) {\n /* no await */ updateFavorites();\n }\n });\n\n //\n // Re-run whenever the emoji grid changes size, and re-calc style/layout-related state variables:\n // 1) Re-calculate the --num-columns var because it may have changed\n // 2) Re-calculate whether we're in RTL mode or not.\n //\n // The benefit of doing this in one place is to align with rAF/ResizeObserver\n // and do all the calculations in one go. RTL vs LTR is not strictly layout-related,\n // but since we're already reading the style here, and since it's already aligned with\n // the rAF loop, this is the most appropriate place to do it perf-wise.\n //\n\n function calculateEmojiGridStyle (node) {\n resizeObserverAction(node, abortSignal, () => {\n /* istanbul ignore next */\n { // jsdom throws errors for this kind of fancy stuff\n // read all the style/layout calculations we need to make\n const style = getComputedStyle(refs.rootElement);\n const newNumColumns = parseInt(style.getPropertyValue('--num-columns'), 10);\n const newIsRtl = style.getPropertyValue('direction') === 'rtl';\n\n // write to state variables\n state.numColumns = newNumColumns;\n state.isRtl = newIsRtl;\n }\n });\n }\n\n // Re-run whenever the custom emoji in a category are shown/hidden. This is an optimization that simulates\n // what we'd get from `<img loading=lazy>` but without rendering an `<img>`.\n function updateOnIntersection (node) {\n intersectionObserverAction(node, abortSignal, (entries) => {\n for (const { target, isIntersecting } of entries) {\n target.classList.toggle('onscreen', isIntersecting);\n }\n });\n }\n\n //\n // Set or update the currentEmojis. Check for invalid ZWJ renderings\n // (i.e. double emoji).\n //\n\n createEffect(() => {\n async function updateEmojis () {\n const { searchText, currentGroup, databaseLoaded, customEmoji } = state;\n if (!databaseLoaded) {\n state.currentEmojis = [];\n state.searchMode = false;\n } else if (searchText.length >= MIN_SEARCH_TEXT_LENGTH) {\n const newEmojis = await getEmojisBySearchQuery(searchText);\n if (state.searchText === searchText) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(true);\n }\n } else { // database is loaded and we're not in search mode, so we're in normal category mode\n const { id: currentGroupId } = currentGroup;\n // avoid race condition where currentGroupId is -1 and customEmoji is undefined/empty\n if (currentGroupId !== -1 || (customEmoji && customEmoji.length)) {\n const newEmojis = await getEmojisByGroup(currentGroupId);\n if (state.currentGroup.id === currentGroupId) { // if the situation changes asynchronously, do not update\n updateCurrentEmojis(newEmojis);\n updateSearchMode(false);\n }\n }\n }\n }\n\n /* no await */ updateEmojis();\n });\n\n const resetScrollTopInRaf = () => {\n rAF(() => resetScrollTopIfPossible(refs.tabpanelElement));\n };\n\n // Some emojis have their ligatures rendered as two or more consecutive emojis\n // We want to treat these the same as unsupported emojis, so we compare their\n // widths against the baseline widths and remove them as necessary\n createEffect(() => {\n const { currentEmojis, emojiVersion } = state;\n const zwjEmojisToCheck = currentEmojis\n .filter(emoji => emoji.unicode) // filter custom emoji\n .filter(emoji => hasZwj(emoji) && !supportedZwjEmojis.has(emoji.unicode));\n if (!emojiVersion && zwjEmojisToCheck.length) {\n // render now, check their length later\n updateCurrentEmojis(currentEmojis);\n rAF(() => checkZwjSupportAndUpdate(zwjEmojisToCheck));\n } else {\n const newEmojis = emojiVersion ? currentEmojis : currentEmojis.filter(isZwjSupported);\n updateCurrentEmojis(newEmojis);\n // Reset scroll top to 0 when emojis change\n resetScrollTopInRaf();\n }\n });\n\n function checkZwjSupportAndUpdate (zwjEmojisToCheck) {\n const allSupported = checkZwjSupport(zwjEmojisToCheck, refs.baselineEmoji, emojiToDomNode);\n if (allSupported) {\n // Even if all emoji are supported, we still need to reset the scroll top to 0 when emojis change\n resetScrollTopInRaf();\n } else {\n // Force update. We only do this if there are any unsupported ZWJ characters since otherwise,\n // for browsers that support all emoji, it would be an unnecessary extra re-render.\n state.currentEmojis = [...state.currentEmojis];\n }\n }\n\n function isZwjSupported (emoji) {\n return !emoji.unicode || !hasZwj(emoji) || supportedZwjEmojis.get(emoji.unicode)\n }\n\n async function filterEmojisByVersion (emojis) {\n const emojiSupportLevel = state.emojiVersion || await detectEmojiSupportLevel();\n // !version corresponds to custom emoji\n return emojis.filter(({ version }) => !version || version <= emojiSupportLevel)\n }\n\n async function summarizeEmojis (emojis) {\n return summarizeEmojisForUI(emojis, state.emojiVersion || await detectEmojiSupportLevel())\n }\n\n async function getEmojisByGroup (group) {\n // -1 is custom emoji\n const emoji = group === -1 ? state.customEmoji : await state.database.getEmojiByGroup(group);\n return summarizeEmojis(await filterEmojisByVersion(emoji))\n }\n\n async function getEmojisBySearchQuery (query) {\n return summarizeEmojis(await filterEmojisByVersion(await state.database.getEmojiBySearchQuery(query)))\n }\n\n createEffect(() => {\n });\n\n //\n // Derive currentEmojisWithCategories from currentEmojis. This is always done even if there\n // are no categories, because it's just easier to code the HTML this way.\n //\n\n createEffect(() => {\n function calculateCurrentEmojisWithCategories () {\n const { searchMode, currentEmojis } = state;\n if (searchMode) {\n return [\n {\n category: '',\n emojis: currentEmojis\n }\n ]\n }\n const categoriesToEmoji = new Map();\n for (const emoji of currentEmojis) {\n const category = emoji.category || '';\n let emojis = categoriesToEmoji.get(category);\n if (!emojis) {\n emojis = [];\n categoriesToEmoji.set(category, emojis);\n }\n emojis.push(emoji);\n }\n return [...categoriesToEmoji.entries()]\n .map(([category, emojis]) => ({ category, emojis }))\n .sort((a, b) => state.customCategorySorting(a.category, b.category))\n }\n\n const newEmojisWithCategories = calculateCurrentEmojisWithCategories();\n updateCurrentEmojisWithCategories(newEmojisWithCategories);\n });\n\n //\n // Handle active search item (i.e. pressing up or down while searching)\n //\n\n createEffect(() => {\n state.activeSearchItemId = state.activeSearchItem !== -1 && state.currentEmojis[state.activeSearchItem].id;\n });\n\n //\n // Handle user input on the search input\n //\n\n createEffect(() => {\n const { rawSearchText } = state;\n rIC(() => {\n state.searchText = (rawSearchText || '').trim(); // defer to avoid input delays, plus we can trim here\n state.activeSearchItem = -1;\n });\n });\n\n function onSearchKeydown (event) {\n if (!state.searchMode || !state.currentEmojis.length) {\n return\n }\n\n const goToNextOrPrevious = (previous) => {\n halt(event);\n state.activeSearchItem = incrementOrDecrement(previous, state.activeSearchItem, state.currentEmojis);\n };\n\n switch (event.key) {\n case 'ArrowDown':\n return goToNextOrPrevious(false)\n case 'ArrowUp':\n return goToNextOrPrevious(true)\n case 'Enter':\n if (state.activeSearchItem === -1) {\n // focus the first option in the list since the list must be non-empty at this point (it's verified above)\n state.activeSearchItem = 0;\n } else { // there is already an active search item\n halt(event);\n return clickEmoji(state.currentEmojis[state.activeSearchItem].id)\n }\n }\n }\n\n //\n // Handle user input on nav\n //\n\n function onNavClick (event) {\n const { target } = event;\n const closestTarget = target.closest('.nav-button');\n /* istanbul ignore if */\n if (!closestTarget) {\n return // This should never happen, but makes me nervous not to have it\n }\n const groupId = parseInt(closestTarget.dataset.groupId, 10);\n refs.searchElement.value = ''; // clear search box input\n state.rawSearchText = '';\n state.searchText = '';\n state.activeSearchItem = -1;\n state.currentGroupIndex = state.groups.findIndex(_ => _.id === groupId);\n }\n\n function onNavKeydown (event) {\n const { target, key } = event;\n\n const doFocus = el => {\n if (el) {\n halt(event);\n el.focus();\n }\n };\n\n switch (key) {\n case 'ArrowLeft':\n return doFocus(target.previousElementSibling)\n case 'ArrowRight':\n return doFocus(target.nextElementSibling)\n case 'Home':\n return doFocus(target.parentElement.firstElementChild)\n case 'End':\n return doFocus(target.parentElement.lastElementChild)\n }\n }\n\n async function getDetailForClickEvent (unicodeOrName) {\n const emoji = await state.database.getEmojiByUnicodeOrName(unicodeOrName);\n const emojiSummary = [...state.currentEmojis, ...state.currentFavorites]\n .find(_ => (_.id === unicodeOrName));\n const skinTonedUnicode = emojiSummary.unicode && unicodeWithSkin(emojiSummary, state.currentSkinTone);\n await state.database.incrementFavoriteEmojiCount(unicodeOrName);\n return {\n emoji,\n skinTone: state.currentSkinTone,\n ...(skinTonedUnicode && { unicode: skinTonedUnicode }),\n ...(emojiSummary.name && { name: emojiSummary.name })\n }\n }\n\n //\n // Handle user input on an emoji\n //\n async function clickEmoji (unicodeOrName) {\n const promiseForDetail = getDetailForClickEvent(unicodeOrName);\n // sync event to work around a safari bug: https://bugs.webkit.org/show_bug.cgi?id=222262\n fireEvent('emoji-click-sync', promiseForDetail);\n // async event for most normal use cases that don't need to work around the safari bug\n fireEvent('emoji-click', await promiseForDetail);\n }\n\n function onEmojiClick (event) {\n const { target } = event;\n /* istanbul ignore if */\n if (!target.classList.contains('emoji')) {\n // This should never happen, but makes me nervous not to have it\n return\n }\n halt(event);\n const id = target.id.substring(4); // replace 'emo-' or 'fav-' prefix\n\n /* no await */ clickEmoji(id);\n }\n\n //\n // Handle user input on the skintone picker\n //\n\n function changeSkinTone (skinTone) {\n state.currentSkinTone = skinTone;\n state.skinTonePickerExpanded = false;\n focus('skintone-button');\n fireEvent('skin-tone-change', { skinTone });\n /* no await */ state.database.setPreferredSkinTone(skinTone);\n }\n\n function onSkinToneOptionsClick (event) {\n const { target: { id } } = event;\n const match = id && id.match(/^skintone-(\\d)/); // skintone option format\n /* istanbul ignore if */\n if (!match) { // not a skintone option\n return // This should never happen, but makes me nervous not to have it\n }\n halt(event);\n const skinTone = parseInt(match[1], 10); // remove 'skintone-' prefix\n changeSkinTone(skinTone);\n }\n\n function onClickSkinToneButton (event) {\n state.skinTonePickerExpanded = !state.skinTonePickerExpanded;\n state.activeSkinTone = state.currentSkinTone;\n // this should always be true, since the button is obscured by the listbox, so this `if` is just to be sure\n if (state.skinTonePickerExpanded) {\n halt(event);\n rAF(() => focus('skintone-list'));\n }\n }\n\n // To make the animation nicer, change the z-index of the skintone picker button\n // *after* the animation has played. This makes it appear that the picker box\n // is expanding \"below\" the button\n createEffect(() => {\n if (state.skinTonePickerExpanded) {\n refs.skinToneDropdown.addEventListener('transitionend', () => {\n state.skinTonePickerExpandedAfterAnimation = true; // eslint-disable-line no-unused-vars\n }, { once: true });\n } else {\n state.skinTonePickerExpandedAfterAnimation = false; // eslint-disable-line no-unused-vars\n }\n });\n\n function onSkinToneOptionsKeydown (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n const changeActiveSkinTone = async nextSkinTone => {\n halt(event);\n state.activeSkinTone = nextSkinTone;\n };\n\n switch (event.key) {\n case 'ArrowUp':\n return changeActiveSkinTone(incrementOrDecrement(true, state.activeSkinTone, state.skinTones))\n case 'ArrowDown':\n return changeActiveSkinTone(incrementOrDecrement(false, state.activeSkinTone, state.skinTones))\n case 'Home':\n return changeActiveSkinTone(0)\n case 'End':\n return changeActiveSkinTone(state.skinTones.length - 1)\n case 'Enter':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n case 'Escape':\n halt(event);\n state.skinTonePickerExpanded = false;\n return focus('skintone-button')\n }\n }\n\n function onSkinToneOptionsKeyup (event) {\n // this should never happen, but makes me nervous not to have it\n /* istanbul ignore if */\n if (!state.skinTonePickerExpanded) {\n return\n }\n switch (event.key) {\n case ' ':\n // enter on keydown, space on keyup. this is just how browsers work for buttons\n // https://lists.w3.org/Archives/Public/w3c-wai-ig/2019JanMar/0086.html\n halt(event);\n return changeSkinTone(state.activeSkinTone)\n }\n }\n\n async function onSkinToneOptionsFocusOut (event) {\n // On blur outside of the skintone listbox, collapse the skintone picker.\n const { relatedTarget } = event;\n // The `else` should never happen, but makes me nervous not to have it\n /* istanbul ignore else */\n if (!relatedTarget || relatedTarget.id !== 'skintone-list') {\n state.skinTonePickerExpanded = false;\n }\n }\n\n function onSearchInput (event) {\n state.rawSearchText = event.target.value;\n }\n\n return {\n $set (newState) {\n assign(state, newState);\n },\n $destroy () {\n abortController.abort();\n }\n }\n}\n\nconst DEFAULT_DATA_SOURCE = 'https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json';\nconst DEFAULT_LOCALE = 'en';\n\nvar enI18n = {\n categoriesLabel: 'Categories',\n emojiUnsupportedMessage: 'Your browser does not support color emoji.',\n favoritesLabel: 'Favorites',\n loadingMessage: 'Loading…',\n networkErrorMessage: 'Could not load emoji.',\n regionLabel: 'Emoji picker',\n searchDescription: 'When search results are available, press up or down to select and enter to choose.',\n searchLabel: 'Search',\n searchResultsLabel: 'Search results',\n skinToneDescription: 'When expanded, press up or down to select and enter to choose.',\n skinToneLabel: 'Choose a skin tone (currently {skinTone})',\n skinTonesLabel: 'Skin tones',\n skinTones: [\n 'Default',\n 'Light',\n 'Medium-Light',\n 'Medium',\n 'Medium-Dark',\n 'Dark'\n ],\n categories: {\n custom: 'Custom',\n 'smileys-emotion': 'Smileys and emoticons',\n 'people-body': 'People and body',\n 'animals-nature': 'Animals and nature',\n 'food-drink': 'Food and drink',\n 'travel-places': 'Travel and places',\n activities: 'Activities',\n objects: 'Objects',\n symbols: 'Symbols',\n flags: 'Flags'\n }\n};\n\nvar baseStyles = \":host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:\\\"\\\";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}\";\n\nconst PROPS = [\n 'customEmoji',\n 'customCategorySorting',\n 'database',\n 'dataSource',\n 'i18n',\n 'locale',\n 'skinToneEmoji',\n 'emojiVersion'\n];\n\n// Styles injected ourselves, so we can declare the FONT_FAMILY variable in one place\nconst EXTRA_STYLES = `:host{--emoji-font-family:${FONT_FAMILY}}`;\n\nclass PickerElement extends HTMLElement {\n constructor (props) {\n super();\n this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = baseStyles + EXTRA_STYLES;\n this.shadowRoot.appendChild(style);\n this._ctx = {\n // Set defaults\n locale: DEFAULT_LOCALE,\n dataSource: DEFAULT_DATA_SOURCE,\n skinToneEmoji: DEFAULT_SKIN_TONE_EMOJI,\n customCategorySorting: DEFAULT_CATEGORY_SORTING,\n customEmoji: null,\n i18n: enI18n,\n emojiVersion: null,\n ...props\n };\n // Handle properties set before the element was upgraded\n for (const prop of PROPS) {\n if (prop !== 'database' && Object.prototype.hasOwnProperty.call(this, prop)) {\n this._ctx[prop] = this[prop];\n delete this[prop];\n }\n }\n this._dbFlush(); // wait for a flush before creating the db, in case the user calls e.g. a setter or setAttribute\n }\n\n connectedCallback () {\n rescueElementPrototype(this);\n // The _cmp may be defined if the component was immediately disconnected and then reconnected. In that case,\n // do nothing (preserve the state)\n if (!this._cmp) {\n this._cmp = createRoot(this.shadowRoot, this._ctx);\n }\n }\n\n disconnectedCallback () {\n rescueElementPrototype(this);\n // Check in a microtask if the element is still connected. If so, treat this as a \"move\" rather than a disconnect\n // Inspired by Vue: https://vuejs.org/guide/extras/web-components.html#building-custom-elements-with-vue\n qM(() => {\n // this._cmp may be defined if connect-disconnect-connect-disconnect occurs synchronously\n if (!this.isConnected && this._cmp) {\n this._cmp.$destroy();\n this._cmp = undefined;\n\n const { database } = this._ctx;\n database.close()\n // only happens if the database failed to load in the first place, so we don't care\n .catch(err => console.error(err));\n }\n });\n }\n\n static get observedAttributes () {\n return ['locale', 'data-source', 'skin-tone-emoji', 'emoji-version'] // complex objects aren't supported, also use kebab-case\n }\n\n attributeChangedCallback (attrName, oldValue, newValue) {\n this._set(\n // convert from kebab-case to camelcase\n // see https://github.com/sveltejs/svelte/issues/3852#issuecomment-665037015\n attrName.replace(/-([a-z])/g, (_, up) => up.toUpperCase()),\n // convert string attribute to float if necessary\n attrName === 'emoji-version' ? parseFloat(newValue) : newValue\n );\n }\n\n _set (prop, newValue) {\n this._ctx[prop] = newValue;\n if (this._cmp) {\n this._cmp.$set({ [prop]: newValue });\n }\n if (['locale', 'dataSource'].includes(prop)) {\n this._dbFlush();\n }\n }\n\n _dbCreate () {\n const { locale, dataSource, database } = this._ctx;\n // only create a new database if we really need to\n if (!database || database.locale !== locale || database.dataSource !== dataSource) {\n this._set('database', new Database({ locale, dataSource }));\n }\n }\n\n // Update the Database in one microtask if the locale/dataSource change. We do one microtask\n // so we don't create two Databases if e.g. both the locale and the dataSource change\n _dbFlush () {\n qM(() => (\n this._dbCreate()\n ));\n }\n}\n\nconst definitions = {};\n\nfor (const prop of PROPS) {\n definitions[prop] = {\n get () {\n if (prop === 'database') {\n // in rare cases, the microtask may not be flushed yet, so we need to instantiate the DB\n // now if the user is asking for it\n this._dbCreate();\n }\n return this._ctx[prop]\n },\n set (val) {\n if (prop === 'database') {\n throw new Error('database is read-only')\n }\n this._set(prop, val);\n }\n };\n}\n\nObject.defineProperties(PickerElement.prototype, definitions);\n\n// See https://jakearchibald.com/2025/firefox-custom-elements-iframes-bug/\n// TODO: remove when the Firefox bug is fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=1502814\nfunction rescueElementPrototype (element) {\n /* istanbul ignore if */\n if (!(element instanceof PickerElement)) {\n Object.setPrototypeOf(element, customElements.get(element.tagName.toLowerCase()).prototype);\n }\n}\n\n/* istanbul ignore else */\nif (!customElements.get('emoji-picker')) { // if already defined, do nothing (e.g. same script imported twice)\n customElements.define('emoji-picker', PickerElement);\n}\n\nexport { PickerElement as default, rescueElementPrototype };\n","import { html, nothing } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport type { SessionsListResult } from \"../types\";\nimport type { ChatAttachment, ChatQueueItem } from \"../ui-types\";\nimport type { ChatItem, MessageGroup } from \"../types/chat-types\";\nimport { icons } from \"../icons\";\nimport {\n normalizeMessage,\n normalizeRoleForGrouping,\n} from \"../chat/message-normalizer\";\nimport {\n renderMessageGroup,\n renderReadingIndicatorGroup,\n renderStreamingGroup,\n} from \"../chat/grouped-render\";\nimport { renderMarkdownSidebar } from \"./markdown-sidebar\";\nimport \"../components/resizable-divider\";\nimport \"emoji-picker-element\";\n\n/** Auto-grow textarea to fit content, clamped by CSS min/max-height. */\nfunction autoGrow(el: HTMLTextAreaElement): void {\n // Reset to min-height so scrollHeight reflects true content size\n el.style.height = \"0\";\n const desired = Math.max(el.scrollHeight, 44);\n el.style.height = `${desired}px`;\n el.style.overflowY = el.scrollHeight > el.offsetHeight ? \"auto\" : \"hidden\";\n}\n\n/** Reset textarea to single-line height. */\nfunction resetGrow(el: HTMLTextAreaElement): void {\n el.style.height = \"44px\";\n el.style.overflowY = \"hidden\";\n}\n\nexport type CompactionIndicatorStatus = {\n active: boolean;\n startedAt: number | null;\n completedAt: number | null;\n};\n\nexport type ChatProps = {\n sessionKey: string;\n onSessionKeyChange: (next: string) => void;\n thinkingLevel: string | null;\n showThinking: boolean;\n loading: boolean;\n sending: boolean;\n canAbort?: boolean;\n compactionStatus?: CompactionIndicatorStatus | null;\n messages: unknown[];\n toolMessages: unknown[];\n stream: string | null;\n streamStartedAt: number | null;\n assistantAvatarUrl?: string | null;\n draft: string;\n queue: ChatQueueItem[];\n connected: boolean;\n canSend: boolean;\n disabledReason: string | null;\n error: string | null;\n sessions: SessionsListResult | null;\n // Focus mode\n focusMode: boolean;\n // Sidebar state\n sidebarOpen?: boolean;\n sidebarContent?: string | null;\n sidebarError?: string | null;\n splitRatio?: number;\n assistantName: string;\n assistantAvatar: string | null;\n // Model selector\n modelProvider?: string | null;\n model?: string | null;\n modelCatalog?: Array<{ id: string; name: string; provider: string; reasoning?: boolean }>;\n onModelChange?: (modelRef: string) => void;\n onThinkingLevelChange?: (level: string) => void;\n verboseLevel?: string | null;\n fillerEnabled?: boolean | null;\n onVerboseChange?: (level: string) => void;\n onFillerChange?: (enabled: boolean) => void;\n // Image attachments\n attachments?: ChatAttachment[];\n onAttachmentsChange?: (attachments: ChatAttachment[]) => void;\n // Event handlers\n onRefresh: () => void;\n onToggleFocusMode: () => void;\n onDraftChange: (next: string) => void;\n onSend: () => void;\n onAbort?: () => void;\n onQueueRemove: (id: string) => void;\n onNewSession: () => void;\n onOpenSidebar?: (content: string) => void;\n onCloseSidebar?: () => void;\n onSplitRatioChange?: (ratio: number) => void;\n onChatScroll?: (event: Event) => void;\n nearBottom?: boolean;\n};\n\nconst COMPACTION_TOAST_DURATION_MS = 5000;\n\nfunction renderCompactionIndicator(status: CompactionIndicatorStatus | null | undefined) {\n if (!status) return nothing;\n\n // Show \"compacting...\" while active\n if (status.active) {\n return html`\n <div class=\"callout info compaction-indicator compaction-indicator--active\">\n ${icons.loader} Compacting context...\n </div>\n `;\n }\n\n // Show \"compaction complete\" briefly after completion\n if (status.completedAt) {\n const elapsed = Date.now() - status.completedAt;\n if (elapsed < COMPACTION_TOAST_DURATION_MS) {\n return html`\n <div class=\"callout success compaction-indicator compaction-indicator--complete\">\n ${icons.check} Context compacted\n </div>\n `;\n }\n }\n\n return nothing;\n}\n\nconst MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024; // 5 MB — must match server limit\n\nfunction generateAttachmentId(): string {\n return `att-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction showAttachmentError(el: HTMLElement, message: string) {\n // Find or create the error toast inside the chat section\n let toast = el.closest(\".chat\")?.querySelector(\".chat-attachment-error\") as HTMLElement | null;\n if (!toast) {\n toast = document.createElement(\"div\");\n toast.className = \"callout danger chat-attachment-error\";\n toast.style.cssText = \"margin: 8px 4px; animation: fade-in 200ms ease-out;\";\n const compose = el.closest(\".chat\")?.querySelector(\".chat-compose\");\n compose?.parentElement?.insertBefore(toast, compose);\n }\n toast.textContent = message;\n setTimeout(() => toast?.remove(), 4000);\n}\n\nconst TEXT_EXTENSIONS = /\\.(md|txt|csv|json|xml|html|css|js|ts|py|sh|yaml|yml|toml|ini|cfg|log|sql)$/i;\n\nfunction isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\") ||\n /\\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(file.name);\n}\n\nfunction isTextFile(file: File): boolean {\n return file.type.startsWith(\"text/\") ||\n file.type === \"application/json\" ||\n file.type === \"application/xml\" ||\n TEXT_EXTENSIONS.test(file.name);\n}\n\nfunction isPdfFile(file: File): boolean {\n return file.type === \"application/pdf\" || /\\.pdf$/i.test(file.name);\n}\n\nfunction isVideoFile(file: File): boolean {\n return file.type.startsWith(\"video/\") ||\n /\\.(mp4|webm|mov|avi|mkv|m4v)$/i.test(file.name);\n}\n\nfunction handleDrop(e: DragEvent, props: ChatProps) {\n e.preventDefault();\n e.stopPropagation();\n const target = (e.currentTarget as HTMLElement);\n target.classList.remove(\"chat--dragover\");\n\n const files = e.dataTransfer?.files;\n if (!files || files.length === 0) return;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n\n if (isImageFile(file)) {\n if (!props.onAttachmentsChange) continue;\n if (file.size > MAX_ATTACHMENT_BYTES) {\n showAttachmentError(target, `Image too large (${(file.size / 1024 / 1024).toFixed(1)} MB). Maximum is 5 MB.`);\n continue;\n }\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: file.type,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n } else if (isTextFile(file)) {\n if (!props.onAttachmentsChange) continue;\n if (file.size > MAX_ATTACHMENT_BYTES) {\n showAttachmentError(target, `File too large (${(file.size / 1024 / 1024).toFixed(1)} MB). Maximum is 5 MB.`);\n continue;\n }\n const reader = new FileReader();\n reader.onload = () => {\n const text = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl: \"\",\n mimeType: file.type || \"text/plain\",\n fileName: file.name,\n textContent: text,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsText(file);\n } else if (isPdfFile(file)) {\n if (!props.onAttachmentsChange) continue;\n if (file.size > MAX_ATTACHMENT_BYTES) {\n showAttachmentError(target, `PDF too large (${(file.size / 1024 / 1024).toFixed(1)} MB). Maximum is 5 MB.`);\n continue;\n }\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: \"application/pdf\",\n fileName: file.name,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n } else if (isVideoFile(file)) {\n if (!props.onAttachmentsChange) continue;\n if (file.size > MAX_ATTACHMENT_BYTES) {\n showAttachmentError(target, `Video too large (${(file.size / 1024 / 1024).toFixed(1)} MB). Maximum is 5 MB.`);\n continue;\n }\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: file.type || \"video/mp4\",\n fileName: file.name,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n } else {\n showAttachmentError(target, `Unsupported file type: ${file.name}. Use the Files page to upload to workspace.`);\n }\n }\n}\n\nfunction handleDragOver(e: DragEvent) {\n e.preventDefault();\n e.stopPropagation();\n if (e.dataTransfer) e.dataTransfer.dropEffect = \"copy\";\n (e.currentTarget as HTMLElement).classList.add(\"chat--dragover\");\n}\n\nfunction handleDragLeave(e: DragEvent) {\n e.preventDefault();\n e.stopPropagation();\n const container = e.currentTarget as HTMLElement;\n // Only remove class when truly leaving the container, not entering a child\n const related = e.relatedTarget as Node | null;\n if (!related || !container.contains(related)) {\n container.classList.remove(\"chat--dragover\");\n }\n}\n\nfunction handlePaste(\n e: ClipboardEvent,\n props: ChatProps,\n) {\n const items = e.clipboardData?.items;\n if (!items || !props.onAttachmentsChange) return;\n\n const mediaItems: DataTransferItem[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith(\"image/\") || item.type.startsWith(\"video/\")) {\n mediaItems.push(item);\n }\n }\n\n if (mediaItems.length === 0) return;\n\n e.preventDefault();\n\n for (const item of mediaItems) {\n const file = item.getAsFile();\n if (!file) continue;\n const label = file.type.startsWith(\"video/\") ? \"Video\" : \"Image\";\n if (file.size > MAX_ATTACHMENT_BYTES) {\n const chatEl = (e.target as HTMLElement)?.closest?.(\".chat\") ?? document.querySelector(\".chat\");\n if (chatEl) showAttachmentError(chatEl as HTMLElement, `${label} too large (${(file.size / 1024 / 1024).toFixed(1)} MB). Maximum is 5 MB.`);\n continue;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n const isVideo = file.type.startsWith(\"video/\");\n const newAttachment: ChatAttachment = {\n id: generateAttachmentId(),\n dataUrl,\n mimeType: file.type,\n fileName: isVideo ? (file.name || \"video.mp4\") : undefined,\n };\n const current = props.attachments ?? [];\n props.onAttachmentsChange?.([...current, newAttachment]);\n };\n reader.readAsDataURL(file);\n }\n}\n\n/** Toggle emoji picker visibility via DOM class. */\nfunction toggleEmojiPicker(e: Event) {\n const btn = (e.currentTarget as HTMLElement);\n const compose = btn.closest(\".chat-compose\");\n const popup = compose?.querySelector(\".emoji-picker-popup\") as HTMLElement | null;\n if (!popup) return;\n\n const isOpen = popup.classList.toggle(\"active\");\n btn.classList.toggle(\"active\", isOpen);\n\n if (isOpen) {\n // Close on click outside — single-use listener\n const close = (ev: MouseEvent) => {\n if (popup.contains(ev.target as Node) || btn.contains(ev.target as Node)) return;\n popup.classList.remove(\"active\");\n btn.classList.remove(\"active\");\n document.removeEventListener(\"click\", close, true);\n };\n // Delay to avoid the current click immediately closing\n requestAnimationFrame(() => document.addEventListener(\"click\", close, true));\n }\n}\n\n/** Insert selected emoji at textarea cursor position. */\nfunction handleEmojiSelect(e: Event, props: ChatProps) {\n const detail = (e as CustomEvent).detail;\n const unicode: string | undefined = detail?.unicode;\n if (!unicode) return;\n\n const compose = (e.currentTarget as HTMLElement).closest(\".chat-compose\");\n const ta = compose?.querySelector(\"textarea\") as HTMLTextAreaElement | null;\n if (!ta) return;\n\n // Insert at cursor position\n const start = ta.selectionStart ?? props.draft.length;\n const end = ta.selectionEnd ?? start;\n const before = props.draft.slice(0, start);\n const after = props.draft.slice(end);\n props.onDraftChange(before + unicode + after);\n\n // Close picker\n const popup = compose?.querySelector(\".emoji-picker-popup\") as HTMLElement | null;\n const btn = compose?.querySelector(\".chat-compose__emoji\") as HTMLElement | null;\n popup?.classList.remove(\"active\");\n btn?.classList.remove(\"active\");\n\n // Restore focus to textarea after next render\n requestAnimationFrame(() => {\n ta.focus();\n const pos = start + unicode.length;\n ta.setSelectionRange(pos, pos);\n });\n}\n\nfunction renderAttachmentPreview(props: ChatProps) {\n const attachments = props.attachments ?? [];\n if (attachments.length === 0) return nothing;\n\n return html`\n <div class=\"chat-attachments\">\n ${attachments.map(\n (att) => att.fileName\n ? html`\n <div class=\"chat-attachment chat-attachment--file\">\n <span class=\"chat-attachment__icon\">${att.mimeType?.startsWith(\"video/\") ? icons.film : icons.fileText}</span>\n <span class=\"chat-attachment__name\" title=${att.fileName}>${att.fileName}</span>\n <button\n class=\"chat-attachment__remove chat-attachment__remove--file\"\n type=\"button\"\n aria-label=\"Remove attachment\"\n @click=${() => {\n const next = (props.attachments ?? []).filter(\n (a) => a.id !== att.id,\n );\n props.onAttachmentsChange?.(next);\n }}\n >\n ${icons.x}\n </button>\n </div>\n `\n : html`\n <div class=\"chat-attachment\">\n <img\n src=${att.dataUrl}\n alt=\"Attachment preview\"\n class=\"chat-attachment__img\"\n />\n <button\n class=\"chat-attachment__remove\"\n type=\"button\"\n aria-label=\"Remove attachment\"\n @click=${() => {\n const next = (props.attachments ?? []).filter(\n (a) => a.id !== att.id,\n );\n props.onAttachmentsChange?.(next);\n }}\n >\n ${icons.x}\n </button>\n </div>\n `,\n )}\n </div>\n `;\n}\n\nexport function renderChat(props: ChatProps) {\n const canCompose = props.connected;\n const isBusy = props.sending || props.stream !== null;\n const canAbort = Boolean(props.canAbort && props.onAbort);\n const activeSession = props.sessions?.sessions?.find(\n (row) => row.key === props.sessionKey,\n );\n const reasoningLevel = activeSession?.reasoningLevel ?? \"off\";\n const showReasoning = props.showThinking && reasoningLevel !== \"off\";\n const assistantIdentity = {\n name: props.assistantName,\n avatar: props.assistantAvatar ?? props.assistantAvatarUrl ?? null,\n };\n\n const hasAttachments = (props.attachments?.length ?? 0) > 0;\n const composePlaceholder = props.connected\n ? hasAttachments\n ? \"Add a message...\"\n : \"Message...\"\n : \"Connecting…\";\n\n const splitRatio = props.splitRatio ?? 0.6;\n const sidebarOpen = Boolean(props.sidebarOpen && props.onCloseSidebar);\n const thread = html`\n <div\n class=\"chat-thread\"\n role=\"log\"\n aria-live=\"polite\"\n @scroll=${props.onChatScroll}\n >\n ${props.loading ? html`<div class=\"muted\">Loading chat…</div>` : nothing}\n ${repeat(buildChatItems(props), (item) => item.key, (item) => {\n if (item.kind === \"reading-indicator\") {\n return renderReadingIndicatorGroup(assistantIdentity);\n }\n\n if (item.kind === \"stream\") {\n return renderStreamingGroup(\n item.text,\n item.startedAt,\n props.onOpenSidebar,\n assistantIdentity,\n );\n }\n\n if (item.kind === \"group\") {\n return renderMessageGroup(item, {\n onOpenSidebar: props.onOpenSidebar,\n showReasoning,\n assistantName: props.assistantName,\n assistantAvatar: assistantIdentity.avatar,\n });\n }\n\n return nothing;\n })}\n </div>\n `;\n\n return html`\n <section\n class=\"card chat\"\n @drop=${(e: DragEvent) => handleDrop(e, props)}\n @dragover=${handleDragOver}\n @dragleave=${handleDragLeave}\n >\n ${props.disabledReason\n ? html`<div class=\"callout\">${props.disabledReason}</div>`\n : nothing}\n\n ${props.error\n ? html`<div class=\"callout danger\">${props.error}</div>`\n : nothing}\n\n ${renderCompactionIndicator(props.compactionStatus)}\n\n ${props.focusMode\n ? html`\n <button\n class=\"chat-focus-exit\"\n type=\"button\"\n @click=${props.onToggleFocusMode}\n aria-label=\"Exit focus mode\"\n title=\"Exit focus mode\"\n >\n ${icons.x}\n </button>\n `\n : nothing}\n\n <div\n class=\"chat-split-container ${sidebarOpen ? \"chat-split-container--open\" : \"\"}\"\n >\n <div\n class=\"chat-main\"\n style=\"flex: ${sidebarOpen ? `0 0 ${splitRatio * 100}%` : \"1 1 100%\"}\"\n >\n ${thread}\n ${props.nearBottom === false\n ? html`\n <button\n class=\"chat-scroll-bottom\"\n type=\"button\"\n @click=${(e: Event) => {\n const main = (e.currentTarget as HTMLElement).closest(\".chat-main\");\n const container = main?.querySelector(\".chat-thread\") as HTMLElement | null;\n if (container) {\n container.scrollTo({ top: container.scrollHeight, behavior: \"smooth\" });\n }\n }}\n aria-label=\"Scroll to bottom\"\n title=\"Scroll to bottom\"\n >\n ${icons.chevronDown}\n </button>\n `\n : nothing}\n </div>\n\n ${sidebarOpen\n ? html`\n <resizable-divider\n .splitRatio=${splitRatio}\n @resize=${(e: CustomEvent) =>\n props.onSplitRatioChange?.(e.detail.splitRatio)}\n ></resizable-divider>\n <div class=\"chat-sidebar\">\n ${renderMarkdownSidebar({\n content: props.sidebarContent ?? null,\n error: props.sidebarError ?? null,\n onClose: props.onCloseSidebar!,\n onViewRawText: () => {\n if (!props.sidebarContent || !props.onOpenSidebar) return;\n props.onOpenSidebar(`\\`\\`\\`\\n${props.sidebarContent}\\n\\`\\`\\``);\n },\n })}\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"chat-compose\">\n ${renderAttachmentPreview(props)}\n <div class=\"chat-compose__row\">\n <button\n class=\"chat-compose__emoji\"\n type=\"button\"\n @click=${toggleEmojiPicker}\n aria-label=\"Emoji\"\n title=\"Emoji\"\n >\n ${icons.smile}\n </button>\n <label class=\"field chat-compose__field\">\n <span>Message</span>\n <textarea\n .value=${props.draft}\n ?disabled=${!props.connected}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n if (e.isComposing || e.keyCode === 229) return;\n if (e.shiftKey) return; // Allow Shift+Enter for line breaks\n if (!props.connected) return;\n e.preventDefault();\n if (canCompose) {\n props.onSend();\n resetGrow(e.target as HTMLTextAreaElement);\n }\n }}\n @input=${(e: Event) => {\n const ta = e.target as HTMLTextAreaElement;\n props.onDraftChange(ta.value);\n autoGrow(ta);\n }}\n @paste=${(e: ClipboardEvent) => handlePaste(e, props)}\n placeholder=${composePlaceholder}\n ></textarea>\n </label>\n ${canAbort\n ? html`\n <button\n class=\"btn btn--icon chat-compose__send\"\n @click=${props.onAbort}\n aria-label=\"Stop\"\n title=\"Stop generating\"\n >\n ${icons.square}\n </button>\n `\n : nothing}\n <button\n class=\"btn btn--icon chat-compose__send primary\"\n ?disabled=${!props.connected}\n @click=${(e: Event) => {\n props.onSend();\n const ta = (e.target as HTMLElement).closest(\".chat-compose\")?.querySelector(\"textarea\");\n if (ta) resetGrow(ta);\n }}\n aria-label=\"${isBusy ? \"Queue\" : \"Send\"}\"\n title=\"${isBusy ? \"Queue message\" : \"Send (Enter)\"}\"\n >\n ${icons.send}\n </button>\n </div>\n <div class=\"emoji-picker-popup\">\n <emoji-picker\n @emoji-click=${(e: Event) => handleEmojiSelect(e, props)}\n ></emoji-picker>\n </div>\n ${renderModelBar(props)}\n </div>\n </section>\n `;\n}\n\n// ── Model / Thinking selector bar + settings menu ─────────────────\n\n/** Only the latest generation of each tier. */\nconst CURATED_MODELS: Array<{ id: string; shortName: string; description: string }> = [\n { id: \"claude-opus-4-6\", shortName: \"Opus\", description: \"Most capable\" },\n { id: \"claude-sonnet-4-5-20250929\", shortName: \"Sonnet\", description: \"Fast & capable\" },\n { id: \"claude-haiku-4-5-20251001\", shortName: \"Haiku\", description: \"Fastest\" },\n];\n\nfunction buildModelDisplayList(\n catalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }>,\n) {\n // Match curated list against what's actually available\n const available = new Set(catalog.filter((m) => m.provider === \"anthropic\").map((m) => m.id));\n return CURATED_MODELS\n .filter((m) => available.has(m.id))\n .map((m) => ({ key: `anthropic/${m.id}`, ...m }));\n}\n\nconst THINKING_LEVELS = [\n { value: \"off\", label: \"Off\" },\n { value: \"minimal\", label: \"Minimal\" },\n { value: \"low\", label: \"Low\" },\n { value: \"medium\", label: \"Medium\" },\n { value: \"high\", label: \"High\" },\n];\n\nfunction toggleSettingsMenu(e: Event) {\n const btn = (e.currentTarget as HTMLElement);\n const menu = btn.closest(\".chat-model-bar\")?.querySelector(\".chat-settings-menu\");\n if (!menu) return;\n const isOpen = menu.classList.contains(\"active\");\n // Close all menus first\n document.querySelectorAll(\".chat-settings-menu.active\").forEach((el) => el.classList.remove(\"active\"));\n if (!isOpen) {\n menu.classList.add(\"active\");\n // Close on outside click\n const close = (ev: MouseEvent) => {\n if (!menu.contains(ev.target as Node) && ev.target !== btn && !btn.contains(ev.target as Node)) {\n menu.classList.remove(\"active\");\n document.removeEventListener(\"click\", close);\n }\n };\n requestAnimationFrame(() => document.addEventListener(\"click\", close));\n }\n}\n\nfunction renderModelBar(props: ChatProps) {\n if (!props.connected) return nothing;\n const catalog = props.modelCatalog ?? [];\n const models = buildModelDisplayList(catalog);\n if (models.length === 0) return nothing;\n\n const currentModelKey = props.modelProvider && props.model\n ? `${props.modelProvider}/${props.model}`\n : null;\n\n const thinkingLevel = props.thinkingLevel ?? \"off\";\n\n const verboseOn = props.verboseLevel === \"on\" || props.verboseLevel === \"full\";\n const fillerOn = props.fillerEnabled === true;\n\n return html`\n <div class=\"chat-model-bar\">\n <div class=\"chat-model-bar__select\">\n <select\n class=\"chat-model-bar__dropdown\"\n .value=${currentModelKey ?? \"\"}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n if (value && props.onModelChange) props.onModelChange(value);\n }}\n >\n ${models.map(\n (m) => html`\n <option value=${m.key} ?selected=${m.key === currentModelKey}>\n ${m.shortName} — ${m.description}\n </option>\n `,\n )}\n </select>\n </div>\n <div class=\"chat-model-bar__select\">\n <select\n class=\"chat-model-bar__dropdown\"\n .value=${thinkingLevel}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n if (props.onThinkingLevelChange) props.onThinkingLevelChange(value);\n }}\n >\n ${THINKING_LEVELS.map(\n (l) => html`\n <option value=${l.value} ?selected=${l.value === thinkingLevel}>\n Thinking: ${l.label}\n </option>\n `,\n )}\n </select>\n </div>\n <button\n class=\"chat-model-bar__settings-btn\"\n type=\"button\"\n @click=${toggleSettingsMenu}\n aria-label=\"Message settings\"\n title=\"Message settings\"\n >\n ${icons.slidersHorizontal}\n </button>\n <div class=\"chat-settings-menu\">\n <label class=\"chat-settings-menu__item\">\n <input\n type=\"checkbox\"\n .checked=${verboseOn}\n @change=${(e: Event) => {\n const checked = (e.target as HTMLInputElement).checked;\n if (props.onVerboseChange) props.onVerboseChange(checked ? \"on\" : \"off\");\n }}\n />\n <span>Verbose</span>\n <span class=\"chat-settings-menu__hint\">Detailed responses</span>\n </label>\n <label class=\"chat-settings-menu__item\">\n <input\n type=\"checkbox\"\n .checked=${fillerOn}\n @change=${(e: Event) => {\n const checked = (e.target as HTMLInputElement).checked;\n if (props.onFillerChange) props.onFillerChange(checked);\n }}\n />\n <span>Filler</span>\n <span class=\"chat-settings-menu__hint\">Quick acks while thinking</span>\n </label>\n </div>\n </div>\n `;\n}\n\nconst CHAT_HISTORY_RENDER_LIMIT = 200;\n\nfunction groupMessages(items: ChatItem[]): Array<ChatItem | MessageGroup> {\n const result: Array<ChatItem | MessageGroup> = [];\n let currentGroup: MessageGroup | null = null;\n\n for (const item of items) {\n if (item.kind !== \"message\") {\n if (currentGroup) {\n result.push(currentGroup);\n currentGroup = null;\n }\n result.push(item);\n continue;\n }\n\n const normalized = normalizeMessage(item.message);\n const role = normalizeRoleForGrouping(normalized.role);\n const timestamp = normalized.timestamp || Date.now();\n\n if (!currentGroup || currentGroup.role !== role) {\n if (currentGroup) result.push(currentGroup);\n currentGroup = {\n kind: \"group\",\n key: `group:${role}:${item.key}`,\n role,\n messages: [{ message: item.message, key: item.key }],\n timestamp,\n isStreaming: false,\n };\n } else {\n currentGroup.messages.push({ message: item.message, key: item.key });\n }\n }\n\n if (currentGroup) result.push(currentGroup);\n return result;\n}\n\nfunction buildChatItems(props: ChatProps): Array<ChatItem | MessageGroup> {\n const items: ChatItem[] = [];\n const history = Array.isArray(props.messages) ? props.messages : [];\n const tools = Array.isArray(props.toolMessages) ? props.toolMessages : [];\n const showToolDetail = props.showThinking || props.verboseLevel === \"on\" || props.verboseLevel === \"full\";\n const historyStart = Math.max(0, history.length - CHAT_HISTORY_RENDER_LIMIT);\n if (historyStart > 0) {\n items.push({\n kind: \"message\",\n key: \"chat:history:notice\",\n message: {\n role: \"system\",\n content: `Showing last ${CHAT_HISTORY_RENDER_LIMIT} messages (${historyStart} hidden).`,\n timestamp: Date.now(),\n },\n });\n }\n for (let i = historyStart; i < history.length; i++) {\n const msg = history[i];\n const normalized = normalizeMessage(msg);\n\n if (!showToolDetail && normalized.role.toLowerCase() === \"toolresult\") {\n continue;\n }\n\n items.push({\n kind: \"message\",\n key: messageKey(msg, i),\n message: msg,\n });\n }\n if (showToolDetail) {\n for (let i = 0; i < tools.length; i++) {\n items.push({\n kind: \"message\",\n key: messageKey(tools[i], i + history.length),\n message: tools[i],\n });\n }\n }\n\n if (props.stream !== null) {\n const key = `stream:${props.sessionKey}:${props.streamStartedAt ?? \"live\"}`;\n if (props.stream.trim().length > 0) {\n items.push({\n kind: \"stream\",\n key,\n text: props.stream,\n startedAt: props.streamStartedAt ?? Date.now(),\n });\n } else {\n items.push({ kind: \"reading-indicator\", key });\n }\n }\n\n // Render queued messages as normal user bubbles so they appear immediately\n for (const qi of props.queue) {\n const fileNames = qi.attachments?.filter((a) => a.fileName).map((a) => a.fileName) ?? [];\n const displayText = fileNames.length > 0\n ? (qi.text ? `${fileNames.join(\", \")}\\n\\n${qi.text}` : fileNames.join(\", \"))\n : qi.text;\n items.push({\n kind: \"message\",\n key: `queue:${qi.id}`,\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: displayText }],\n timestamp: qi.createdAt,\n },\n });\n }\n\n return groupMessages(items);\n}\n\nfunction messageKey(message: unknown, index: number): string {\n const m = message as Record<string, unknown>;\n const toolCallId = typeof m.toolCallId === \"string\" ? m.toolCallId : \"\";\n if (toolCallId) return `tool:${toolCallId}`;\n const id = typeof m.id === \"string\" ? m.id : \"\";\n if (id) return `msg:${id}`;\n const messageId = typeof m.messageId === \"string\" ? m.messageId : \"\";\n if (messageId) return `msg:${messageId}`;\n const timestamp = typeof m.timestamp === \"number\" ? m.timestamp : null;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n if (timestamp != null) return `msg:${role}:${timestamp}:${index}`;\n return `msg:${role}:${index}`;\n}\n","import { html } from \"lit\";\n\nimport type { ChatProps } from \"./chat\";\nimport { renderChat } from \"./chat\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\n\nexport type ChatPageProps = ChatProps & {\n /** Whether the WebSocket connection is established. */\n connected: boolean;\n wsProps?: WorkspaceNavProps;\n};\n\nexport function renderChatPage(props: ChatPageProps) {\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"setup-container setup-container--full chat-page\">\n ${renderPageNav(\"Chat\", props.wsProps)}\n <div class=\"chat-viewport\">\n ${renderChat(props)}\n </div>\n </div>\n `;\n}\n","import { formatAgo, formatDurationMs, formatMs } from \"./format\";\nimport type { CronJob, GatewaySessionRow, PresenceEntry } from \"./types\";\n\nexport function formatPresenceSummary(entry: PresenceEntry): string {\n const host = entry.host ?? \"unknown\";\n const ip = entry.ip ? `(${entry.ip})` : \"\";\n const mode = entry.mode ?? \"\";\n const version = entry.version ?? \"\";\n return `${host} ${ip} ${mode} ${version}`.trim();\n}\n\nexport function formatPresenceAge(entry: PresenceEntry): string {\n const ts = entry.ts ?? null;\n return ts ? formatAgo(ts) : \"n/a\";\n}\n\nexport function formatNextRun(ms?: number | null) {\n if (!ms) return \"n/a\";\n return `${formatMs(ms)} (${formatAgo(ms)})`;\n}\n\nexport function formatSessionTokens(row: GatewaySessionRow) {\n if (row.totalTokens == null) return \"n/a\";\n const total = row.totalTokens ?? 0;\n const ctx = row.contextTokens ?? 0;\n return ctx ? `${total} / ${ctx}` : String(total);\n}\n\nexport function formatEventPayload(payload: unknown): string {\n if (payload == null) return \"\";\n try {\n return JSON.stringify(payload, null, 2);\n } catch {\n return String(payload);\n }\n}\n\nexport function formatCronState(job: CronJob) {\n const state = job.state ?? {};\n const status = state.lastStatus ?? \"n/a\";\n const last = state.lastRunAtMs ? formatAgo(state.lastRunAtMs) : \"never\";\n return `${status} · last ${last}`;\n}\n\nexport function formatCronSchedule(job: CronJob) {\n const s = job.schedule;\n if (s.kind === \"at\") return `One-time: ${formatMs(s.atMs)}`;\n if (s.kind === \"every\") return `Every ${formatDurationMs(s.everyMs)}`;\n return `Schedule: ${s.expr}${s.tz ? ` (${s.tz})` : \"\"}`;\n}\n\nexport function formatCronPayload(job: CronJob) {\n const p = job.payload;\n if (p.kind === \"systemEvent\") {\n const text = p.text.length > 60 ? `${p.text.slice(0, 57)}\\u2026` : p.text;\n return `Task: ${text}`;\n }\n const msg = p.message.length > 60 ? `${p.message.slice(0, 57)}\\u2026` : p.message;\n return `Message: ${msg}`;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo, formatDurationMs } from \"../format\";\nimport {\n formatCronPayload,\n formatCronSchedule,\n formatCronState,\n formatNextRun,\n} from \"../presenter\";\nimport type { ChannelUiMetaEntry, CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronProps = {\n loading: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n error: string | null;\n busy: boolean;\n form: CronFormState;\n channels: string[];\n channelLabels?: Record<string, string>;\n channelMeta?: ChannelUiMetaEntry[];\n agentIds: string[];\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n newEventModalOpen: boolean;\n onNewEventModalOpen: () => void;\n onNewEventModalClose: () => void;\n detailJobId: string | null;\n onDetailOpen: (job: CronJob) => void;\n onDetailClose: () => void;\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob) => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n};\n\n/* ── Helpers ── */\n\nfunction buildChannelOptions(props: CronProps): string[] {\n const options = [\"last\", ...props.channels.filter(Boolean)];\n const current = props.form.channel?.trim();\n if (current && !options.includes(current)) {\n options.push(current);\n }\n const seen = new Set<string>();\n return options.filter((value) => {\n if (seen.has(value)) return false;\n seen.add(value);\n return true;\n });\n}\n\nfunction resolveChannelLabel(props: CronProps, channel: string): string {\n if (channel === \"last\") return \"last\";\n const meta = props.channelMeta?.find((entry) => entry.id === channel);\n if (meta?.label) return meta.label;\n return props.channelLabels?.[channel] ?? channel;\n}\n\n/** Friendly agent label: \"foo-public\" → \"foo-public\", empty → \"Default\" */\nfunction agentLabel(agentId?: string): string {\n if (!agentId) return \"Default\";\n return agentId;\n}\n\n/* ── SVG icon fragments (inline, small) ── */\n\nconst iconPlay = html`<svg viewBox=\"0 0 24 24\"><polygon points=\"5 3 19 12 5 21 5 3\"/></svg>`;\nconst iconPause = html`<svg viewBox=\"0 0 24 24\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"/><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"/></svg>`;\nconst iconTrash = html`<svg viewBox=\"0 0 24 24\"><path d=\"M3 6h18\"/><path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\"/><path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\"/></svg>`;\nconst iconX = html`<svg viewBox=\"0 0 24 24\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`;\nconst iconPlus = html`<svg viewBox=\"0 0 24 24\"><path d=\"M12 5v14\"/><path d=\"M5 12h14\"/></svg>`;\n\n/* ── Main render ── */\n\nexport function renderCron(props: CronProps) {\n const detailJob = props.detailJobId\n ? props.jobs.find((j) => j.id === props.detailJobId) ?? null\n : null;\n\n return html`\n ${renderStatusBar(props)}\n ${renderEventGrid(props)}\n ${props.newEventModalOpen ? renderNewEventModal(props) : nothing}\n ${detailJob ? renderDetailModal(detailJob, props) : nothing}\n `;\n}\n\n/* ── Status bar ── */\n\nfunction renderStatusBar(props: CronProps) {\n const s = props.status;\n const enabled = s?.enabled ?? false;\n const jobCount = s?.jobs ?? 0;\n const nextWake = s?.nextWakeAtMs;\n\n return html`\n <div class=\"event-status-bar\">\n <div class=\"event-status-bar__info\">\n <span class=\"statusDot ${enabled ? \"ok\" : \"\"}\"></span>\n <span>${enabled ? \"Active\" : \"Inactive\"}</span>\n <span class=\"event-status-bar__sep\">\\u00b7</span>\n <span>${jobCount} event${jobCount !== 1 ? \"s\" : \"\"}</span>\n ${nextWake\n ? html`\n <span class=\"event-status-bar__sep\">\\u00b7</span>\n <span>Next: ${formatAgo(nextWake)}</span>\n `\n : nothing}\n <button\n class=\"btn btn--sm\"\n ?disabled=${props.loading}\n @click=${props.onRefresh}\n style=\"margin-left: 4px;\"\n >\n ${props.loading ? \"Refreshing\\u2026\" : \"Refresh\"}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n <button class=\"btn primary btn--sm\" @click=${props.onNewEventModalOpen}>\n ${iconPlus} New Event\n </button>\n </div>\n `;\n}\n\n/* ── Event cards grid ── */\n\nfunction renderEventGrid(props: CronProps) {\n if (props.jobs.length === 0) {\n return html`<div class=\"muted\" style=\"padding: 20px 0;\">No events yet. Create one to get started.</div>`;\n }\n\n return html`\n <div class=\"event-grid\">\n ${props.jobs.map((job) => renderEventCard(job, props))}\n </div>\n `;\n}\n\nfunction renderEventCard(job: CronJob, props: CronProps) {\n return html`\n <div\n class=\"event-card ${job.enabled ? \"\" : \"disabled\"}\"\n @click=${() => props.onDetailOpen(job)}\n >\n <div class=\"event-card__header\">\n <div class=\"event-card__name\">${job.name || \"Untitled\"}</div>\n <span class=\"chip ${job.enabled ? \"chip-ok\" : \"\"}\" style=\"font-size: 11px; padding: 2px 8px;\">\n ${job.enabled ? \"On\" : \"Off\"}\n </span>\n </div>\n <div class=\"event-card__schedule\">${formatCronSchedule(job)}</div>\n ${job.agentId\n ? html`<div class=\"event-card__agent\">${agentLabel(job.agentId)}</div>`\n : nothing}\n <div class=\"event-card__footer\">\n <div class=\"event-card__status\">\n <span class=\"muted\" style=\"font-size: 11px;\">${formatCronState(job)}</span>\n </div>\n <div class=\"event-card__actions\" @click=${(e: Event) => e.stopPropagation()}>\n <button\n class=\"btn-icon\"\n title=\"${job.enabled ? \"Pause\" : \"Resume\"}\"\n ?disabled=${props.busy}\n @click=${() => props.onToggle(job, !job.enabled)}\n >\n ${job.enabled ? iconPause : iconPlay}\n </button>\n <button\n class=\"btn-icon\"\n title=\"Run now\"\n ?disabled=${props.busy}\n @click=${() => props.onRun(job)}\n >\n ${iconPlay}\n </button>\n <button\n class=\"btn-icon danger\"\n title=\"Delete\"\n ?disabled=${props.busy}\n @click=${() => props.onRemove(job)}\n >\n ${iconTrash}\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\n/* ── New Event modal ── */\n\nfunction renderNewEventModal(props: CronProps) {\n const channelOptions = buildChannelOptions(props);\n\n return html`\n <div class=\"event-modal-overlay\" @click=${props.onNewEventModalClose}>\n <div class=\"event-modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"event-modal__header\">\n <div class=\"event-modal__title\">New Event</div>\n <button class=\"event-modal__close\" @click=${props.onNewEventModalClose}>\n ${iconX}\n </button>\n </div>\n\n <div class=\"form-grid\">\n <label class=\"field\">\n <span>Name</span>\n <input\n .value=${props.form.name}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n placeholder=\"e.g. Morning briefing\"\n />\n </label>\n <label class=\"field\">\n <span>Description</span>\n <input\n .value=${props.form.description}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n placeholder=\"What does this event do?\"\n />\n </label>\n <label class=\"field\">\n <span>Agent</span>\n <select\n .value=${props.form.agentId}\n @change=${(e: Event) =>\n props.onFormChange({ agentId: (e.target as HTMLSelectElement).value })}\n >\n <option value=\"\">Default</option>\n ${props.agentIds.map(\n (id) => html`<option value=${id}>${id}</option>`,\n )}\n </select>\n </label>\n <label class=\"field checkbox\">\n <span>Enabled</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n </label>\n <label class=\"field\">\n <span>Timing</span>\n <select\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement).value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">Repeating</option>\n <option value=\"at\">One-time</option>\n <option value=\"cron\">Custom schedule</option>\n </select>\n </label>\n </div>\n\n ${renderScheduleFields(props)}\n\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Session type</span>\n <select\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement).value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">Shared session</option>\n <option value=\"isolated\">Separate session</option>\n </select>\n </label>\n <label class=\"field\">\n <span>When to run</span>\n <select\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"next-heartbeat\">Next available time</option>\n <option value=\"now\">Right away</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Action type</span>\n <select\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement).value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">Background task</option>\n <option value=\"agentTurn\">Send a message</option>\n </select>\n </label>\n </div>\n\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>${props.form.payloadKind === \"systemEvent\" ? \"Task description\" : \"Message to send\"}</span>\n <textarea\n .value=${props.form.payloadText}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n placeholder=\"${props.form.payloadKind === \"systemEvent\"\n ? \"Describe what the assistant should do\\u2026\"\n : \"Type the message to send\\u2026\"}\"\n ></textarea>\n </label>\n\n ${props.form.payloadKind === \"agentTurn\"\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field checkbox\">\n <span>Deliver response</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.deliver}\n @change=${(e: Event) =>\n props.onFormChange({\n deliver: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Channel</span>\n <select\n .value=${props.form.channel || \"last\"}\n @change=${(e: Event) =>\n props.onFormChange({\n channel: (e.target as HTMLSelectElement).value as CronFormState[\"channel\"],\n })}\n >\n ${channelOptions.map(\n (channel) =>\n html`<option value=${channel}>\n ${resolveChannelLabel(props, channel)}\n </option>`,\n )}\n </select>\n </label>\n <label class=\"field\">\n <span>Send to</span>\n <input\n .value=${props.form.to}\n @input=${(e: Event) =>\n props.onFormChange({ to: (e.target as HTMLInputElement).value })}\n placeholder=\"+1555\\u2026 or chat id\"\n />\n </label>\n <label class=\"field\">\n <span>Timeout (seconds)</span>\n <input\n .value=${props.form.timeoutSeconds}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n ${props.form.sessionTarget === \"isolated\"\n ? html`\n <label class=\"field\">\n <span>Summary prefix</span>\n <input\n .value=${props.form.postToMainPrefix}\n @input=${(e: Event) =>\n props.onFormChange({\n postToMainPrefix: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `\n : nothing}\n </div>\n `\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 16px; justify-content: flex-end;\">\n <button class=\"btn\" @click=${props.onNewEventModalClose}>Cancel</button>\n <button class=\"btn primary\" ?disabled=${props.busy} @click=${props.onAdd}>\n ${props.busy ? \"Creating\\u2026\" : \"Create Event\"}\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\n/* ── Schedule fields (shared by modal) ── */\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>Run at</span>\n <input\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Repeat every</span>\n <input\n .value=${form.everyAmount}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Unit</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">Minutes</option>\n <option value=\"hours\">Hours</option>\n <option value=\"days\">Days</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Cron expression</span>\n <input\n .value=${form.cronExpr}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n placeholder=\"e.g. 0 7 * * *\"\n />\n </label>\n <label class=\"field\">\n <span>Timezone (optional)</span>\n <input\n .value=${form.cronTz}\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n placeholder=\"e.g. America/New_York\"\n />\n </label>\n </div>\n `;\n}\n\n/* ── Detail modal ── */\n\nfunction renderDetailModal(job: CronJob, props: CronProps) {\n return html`\n <div class=\"event-modal-overlay\" @click=${props.onDetailClose}>\n <div class=\"event-modal\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"event-modal__header\">\n <div class=\"event-modal__title\">${job.name || \"Untitled Event\"}</div>\n <button class=\"event-modal__close\" @click=${props.onDetailClose}>\n ${iconX}\n </button>\n </div>\n\n ${job.description\n ? html`<div style=\"color: var(--muted); font-size: 13px; margin-bottom: 16px;\">${job.description}</div>`\n : nothing}\n\n <div class=\"event-detail-section\">\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Status</span>\n <span class=\"event-detail-value\">\n <span class=\"chip ${job.enabled ? \"chip-ok\" : \"\"}\" style=\"font-size: 11px; padding: 2px 8px;\">\n ${job.enabled ? \"Enabled\" : \"Disabled\"}\n </span>\n </span>\n </div>\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Schedule</span>\n <span class=\"event-detail-value\">${formatCronSchedule(job)}</span>\n </div>\n ${job.agentId\n ? html`\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Agent</span>\n <span class=\"event-detail-value mono\">${job.agentId}</span>\n </div>\n `\n : nothing}\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Session</span>\n <span class=\"event-detail-value\">\n ${job.sessionTarget === \"main\" ? \"Shared\" : \"Separate\"}\n </span>\n </div>\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Run mode</span>\n <span class=\"event-detail-value\">\n ${job.wakeMode === \"now\" ? \"Right away\" : \"Next available time\"}\n </span>\n </div>\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Action</span>\n <span class=\"event-detail-value\">${formatCronPayload(job)}</span>\n </div>\n </div>\n\n <div class=\"event-detail-section\">\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Last run</span>\n <span class=\"event-detail-value\">${formatCronState(job)}</span>\n </div>\n ${job.state?.nextRunAtMs\n ? html`\n <div class=\"event-detail-row\">\n <span class=\"event-detail-label\">Next run</span>\n <span class=\"event-detail-value\">${formatNextRun(job.state.nextRunAtMs)}</span>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"event-detail-section\">\n <div style=\"display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;\">\n <span class=\"event-detail-label\" style=\"font-size: 14px;\">Recent Activity</span>\n </div>\n ${props.runs.length === 0\n ? html`<div class=\"muted\" style=\"font-size: 13px;\">No runs recorded yet.</div>`\n : html`\n <div class=\"list\">\n ${[...props.runs].sort((a, b) => b.ts - a.ts).map((entry) => renderRun(entry))}\n </div>\n `}\n </div>\n\n <div class=\"row\" style=\"margin-top: 16px; gap: 8px; justify-content: flex-end;\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${() => props.onToggle(job, !job.enabled)}\n >\n ${job.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button\n class=\"btn primary\"\n ?disabled=${props.busy}\n @click=${() => props.onRun(job)}\n >\n Run Now\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${() => { props.onRemove(job); props.onDetailClose(); }}\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\n/* ── Run log entry ── */\n\nfunction runStatusClass(status: string): string {\n const s = status.toLowerCase();\n if (s === \"ok\" || s === \"success\") return \"chip chip-ok\";\n if (s === \"error\" || s === \"fail\" || s === \"failed\") return \"chip chip-warn\";\n return \"chip\";\n}\n\nfunction renderRun(entry: CronRunLogEntry) {\n return html`\n <div class=\"list-item\" style=\"grid-template-columns: 1fr; gap: 6px;\">\n <div style=\"display: flex; align-items: center; gap: 8px; flex-wrap: wrap;\">\n <span class=${runStatusClass(entry.status)} style=\"font-size: 11px; padding: 2px 8px;\">\n ${entry.status}\n </span>\n <span class=\"muted\" style=\"font-size: 12px;\">${formatAgo(entry.ts)}</span>\n <span class=\"muted\" style=\"font-size: 12px;\">${formatDurationMs(entry.durationMs)}</span>\n </div>\n ${entry.summary\n ? html`<div class=\"muted\" style=\"font-size: 12px;\">${entry.summary}</div>`\n : nothing}\n ${entry.error\n ? html`\n <details style=\"margin-top: 2px;\">\n <summary class=\"muted\" style=\"cursor: pointer; font-size: 12px;\">Error details</summary>\n <div class=\"muted\" style=\"margin-top: 4px; white-space: pre-wrap; font-size: 12px;\">${entry.error}</div>\n </details>\n `\n : nothing}\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText } from \"../format\";\nimport type { SkillStatusEntry, SkillStatusReport } from \"../types\";\nimport type { SkillMessageMap } from \"../controllers/skills\";\n\nexport type SkillsProps = {\n loading: boolean;\n report: SkillStatusReport | null;\n error: string | null;\n filter: string;\n edits: Record<string, string>;\n busyKey: string | null;\n messages: SkillMessageMap;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (skillKey: string, enabled: boolean) => void;\n onEdit: (skillKey: string, value: string) => void;\n onSaveKey: (skillKey: string) => void;\n onInstall: (skillKey: string, name: string, installId: string) => void;\n};\n\nexport function renderSkills(props: SkillsProps) {\n const skills = props.report?.skills ?? [];\n const filter = props.filter.trim().toLowerCase();\n const filtered = filter\n ? skills.filter((skill) =>\n [skill.name, skill.description, skill.source]\n .join(\" \")\n .toLowerCase()\n .includes(filter),\n )\n : skills;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Skills</div>\n <div class=\"card-sub\">Bundled, managed, and workspace skills.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>Filter</span>\n <input\n .value=${props.filter}\n @input=${(e: Event) =>\n props.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search skills\"\n />\n </label>\n <div class=\"muted\">${filtered.length} shown</div>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 16px;\">No skills found.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${filtered.map((skill) => renderSkill(skill, props))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderSkill(skill: SkillStatusEntry, props: SkillsProps) {\n const busy = props.busyKey === skill.skillKey;\n const apiKey = props.edits[skill.skillKey] ?? \"\";\n const message = props.messages[skill.skillKey] ?? null;\n const canInstall =\n skill.install.length > 0 && skill.missing.bins.length > 0;\n const missing = [\n ...skill.missing.bins.map((b) => `bin:${b}`),\n ...skill.missing.env.map((e) => `env:${e}`),\n ...skill.missing.config.map((c) => `config:${c}`),\n ...skill.missing.os.map((o) => `os:${o}`),\n ];\n const reasons: string[] = [];\n if (skill.disabled) reasons.push(\"disabled\");\n if (skill.blockedByAllowlist) reasons.push(\"blocked by allowlist\");\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n ${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}\n </div>\n <div class=\"list-sub\">${clampText(skill.description, 140)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${skill.source}</span>\n <span class=\"chip ${skill.eligible ? \"chip-ok\" : \"chip-warn\"}\">\n ${skill.eligible ? \"eligible\" : \"blocked\"}\n </span>\n ${skill.disabled ? html`<span class=\"chip chip-warn\">disabled</span>` : nothing}\n </div>\n ${missing.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Missing: ${missing.join(\", \")}\n </div>\n `\n : nothing}\n ${reasons.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Reason: ${reasons.join(\", \")}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; flex-wrap: wrap;\">\n <button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onToggle(skill.skillKey, skill.disabled)}\n >\n ${skill.disabled ? \"Enable\" : \"Disable\"}\n </button>\n ${canInstall\n ? html`<button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() =>\n props.onInstall(skill.skillKey, skill.name, skill.install[0].id)}\n >\n ${busy ? \"Installing…\" : skill.install[0].label}\n </button>`\n : nothing}\n </div>\n ${message\n ? html`<div\n class=\"muted\"\n style=\"margin-top: 8px; color: ${\n message.kind === \"error\"\n ? \"var(--danger-color, #d14343)\"\n : \"var(--success-color, #0a7f5a)\"\n };\"\n >\n ${message.message}\n </div>`\n : nothing}\n ${skill.primaryEnv\n ? html`\n <div class=\"field\" style=\"margin-top: 10px;\">\n <span>API key</span>\n <input\n type=\"password\"\n .value=${apiKey}\n @input=${(e: Event) =>\n props.onEdit(skill.skillKey, (e.target as HTMLInputElement).value)}\n />\n </div>\n <button\n class=\"btn primary\"\n style=\"margin-top: 8px;\"\n ?disabled=${busy}\n @click=${() => props.onSaveKey(skill.skillKey)}\n >\n Save key\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { SessionTranscriptEntry, SessionLogType } from \"../types\";\n\nconst TYPES: SessionLogType[] = [\"user\", \"assistant\", \"tool\", \"thinking\", \"error\"];\n\nexport type SessionLogsProps = {\n loading: boolean;\n error: string | null;\n entries: SessionTranscriptEntry[];\n agents: string[];\n filterText: string;\n typeFilters: Record<SessionLogType, boolean>;\n agentFilters: Record<string, boolean>;\n autoFollow: boolean;\n onFilterTextChange: (next: string) => void;\n onTypeToggle: (type: SessionLogType, enabled: boolean) => void;\n onAgentToggle: (agent: string, enabled: boolean) => void;\n onToggleAutoFollow: (next: boolean) => void;\n onRefresh: () => void;\n onExport: (lines: string[], label: string) => void;\n onScroll: (event: Event) => void;\n};\n\nconst TYPE_LABELS: Record<SessionLogType, string> = {\n user: \"User\",\n assistant: \"Assistant\",\n tool: \"Tool\",\n thinking: \"Thinking\",\n error: \"Error\",\n system: \"System\",\n};\n\nfunction formatTime(value?: string) {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleString();\n}\n\nfunction formatSessionLabel(key: string): string {\n // \"agent:public:dm:+447...\" → \"+447...\"\n // \"agent:admin:main\" → \"main\"\n const parts = key.split(\":\");\n return parts.slice(2).join(\":\") || key;\n}\n\nfunction matchesFilter(entry: SessionTranscriptEntry, needle: string) {\n if (!needle) return true;\n const haystack = [entry.content, entry.agentId, entry.sessionKey, entry.toolName]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n}\n\nfunction truncateContent(content: string, max = 500): string {\n if (content.length <= max) return content;\n return content.slice(0, max) + \"...\";\n}\n\nexport function renderSessionLogs(props: SessionLogsProps) {\n const needle = props.filterText.trim().toLowerCase();\n const typeFiltered = TYPES.some((t) => !props.typeFilters[t]);\n const agentFiltered = props.agents.some((a) => !props.agentFilters[a]);\n const filtered = props.entries.filter((entry) => {\n if (!props.typeFilters[entry.type]) return false;\n if (props.agents.length > 0 && !(props.agentFilters[entry.agentId] ?? true)) return false;\n return matchesFilter(entry, needle);\n });\n const exportLabel = needle || typeFiltered || agentFiltered ? \"filtered\" : \"visible\";\n\n return html`\n <div>\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"min-width: 220px;\">\n <span>Filter</span>\n <input\n .value=${props.filterText}\n @input=${(e: Event) =>\n props.onFilterTextChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search session logs\"\n />\n </label>\n </div>\n\n <div class=\"chip-row\" style=\"margin-top: 12px;\">\n ${TYPES.map(\n (type) => html`\n <label class=\"chip session-log-chip ${type}\">\n <input\n type=\"checkbox\"\n .checked=${props.typeFilters[type]}\n @change=${(e: Event) =>\n props.onTypeToggle(type, (e.target as HTMLInputElement).checked)}\n />\n <span>${TYPE_LABELS[type]}</span>\n </label>\n `,\n )}\n </div>\n\n <div class=\"chip-row\" style=\"margin-top: 8px; align-items: center;\">\n ${props.agents.map(\n (agent) => html`\n <label class=\"chip agent-chip\">\n <input\n type=\"checkbox\"\n .checked=${props.agentFilters[agent] ?? true}\n @change=${(e: Event) =>\n props.onAgentToggle(agent, (e.target as HTMLInputElement).checked)}\n />\n <span>${agent}</span>\n </label>\n `,\n )}\n <label class=\"chip\">\n <input\n type=\"checkbox\"\n .checked=${props.autoFollow}\n @change=${(e: Event) =>\n props.onToggleAutoFollow((e.target as HTMLInputElement).checked)}\n />\n <span>Auto-follow</span>\n </label>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 10px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"log-stream\" style=\"margin-top: 12px;\" @scroll=${props.onScroll}>\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"padding: 12px;\">No session log entries.</div>`\n : filtered.map(\n (entry) => html`\n <div class=\"log-row session-entry ${entry.type}\">\n <div class=\"log-row-header\">\n <span class=\"log-time mono\">${formatTime(entry.timestamp)}</span>\n <span class=\"session-log-type ${entry.type}\">${TYPE_LABELS[entry.type]}</span>\n <span class=\"log-subsystem mono\">${entry.agentId}</span>\n <span class=\"session-label mono\">${formatSessionLabel(entry.sessionKey)}</span>\n ${entry.toolName\n ? html`<span class=\"session-tool mono\">${entry.toolName}</span>`\n : nothing}\n ${entry.model\n ? html`<span class=\"session-model mono\">${entry.model}</span>`\n : nothing}\n </div>\n <div class=\"log-message mono\">${truncateContent(entry.content)}</div>\n </div>\n `,\n )}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport type { LogEntry, LogLevel } from \"../types\";\nimport { renderSessionLogs, type SessionLogsProps } from \"./session-logs\";\n\nconst LEVELS: LogLevel[] = [\"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\"];\n\nexport type LogsProps = {\n // Sub-tab state\n logsSubTab: \"system\" | \"session\";\n onSubTabChange: (tab: \"system\" | \"session\") => void;\n // Session logs props (passed through when sub-tab is \"session\")\n sessionLogsProps: SessionLogsProps;\n // Existing system logs props\n loading: boolean;\n error: string | null;\n file: string | null;\n entries: LogEntry[];\n filterText: string;\n levelFilters: Record<LogLevel, boolean>;\n autoFollow: boolean;\n truncated: boolean;\n onFilterTextChange: (next: string) => void;\n onLevelToggle: (level: LogLevel, enabled: boolean) => void;\n onToggleAutoFollow: (next: boolean) => void;\n onRefresh: () => void;\n onExport: (lines: string[], label: string) => void;\n onScroll: (event: Event) => void;\n};\n\nfunction formatTime(value?: string | null) {\n if (!value) return \"\";\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n return date.toLocaleTimeString();\n}\n\nfunction matchesFilter(entry: LogEntry, needle: string) {\n if (!needle) return true;\n const haystack = [entry.message, entry.subsystem, entry.raw]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(needle);\n}\n\nexport function renderLogs(props: LogsProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Logs</div>\n <div class=\"card-sub\">Session transcripts and system logs.</div>\n </div>\n <div class=\"row\" style=\"gap: 8px;\">\n ${props.logsSubTab === \"system\" ? html`\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading\\u2026\" : \"Refresh\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.entries.length === 0}\n @click=${() => {\n const needle = props.filterText.trim().toLowerCase();\n const levelFiltered = LEVELS.some((level) => !props.levelFilters[level]);\n const filtered = props.entries.filter((entry) => {\n if (entry.level && !props.levelFilters[entry.level]) return false;\n return matchesFilter(entry, needle);\n });\n const exportLabel = needle || levelFiltered ? \"filtered\" : \"visible\";\n props.onExport(filtered.map((entry) => entry.raw), exportLabel);\n }}\n >\n Export\n </button>\n ` : html`\n <button class=\"btn\" ?disabled=${props.sessionLogsProps.loading} @click=${props.sessionLogsProps.onRefresh}>\n ${props.sessionLogsProps.loading ? \"Loading\\u2026\" : \"Refresh\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.sessionLogsProps.entries.length === 0}\n @click=${() => {\n const sp = props.sessionLogsProps;\n const needle = sp.filterText.trim().toLowerCase();\n const filtered = sp.entries.filter((entry) => {\n if (!sp.typeFilters[entry.type]) return false;\n if (sp.agents.length > 0 && !(sp.agentFilters[entry.agentId] ?? true)) return false;\n if (!needle) return true;\n return [entry.content, entry.agentId, entry.sessionKey, entry.toolName]\n .filter(Boolean).join(\" \").toLowerCase().includes(needle);\n });\n const lines = filtered.map((e) =>\n `${e.timestamp}\\t[${e.type}]\\t${e.agentId}\\t${e.sessionKey}\\t${e.toolName ?? \"\"}\\t${e.content}`);\n sp.onExport(lines, needle ? \"filtered\" : \"visible\");\n }}\n >\n Export\n </button>\n `}\n </div>\n </div>\n\n <div class=\"sp-tabs\" style=\"margin-top: 12px;\">\n <button class=\"sp-tab ${props.logsSubTab === 'session' ? 'active' : ''}\"\n @click=${() => props.onSubTabChange('session')}>\n Session Logs\n </button>\n <button class=\"sp-tab ${props.logsSubTab === 'system' ? 'active' : ''}\"\n @click=${() => props.onSubTabChange('system')}>\n System Logs\n </button>\n </div>\n\n ${props.logsSubTab === \"session\"\n ? renderSessionLogs(props.sessionLogsProps)\n : renderSystemLogs(props)}\n </section>\n `;\n}\n\nfunction renderSystemLogs(props: LogsProps) {\n const needle = props.filterText.trim().toLowerCase();\n const levelFiltered = LEVELS.some((level) => !props.levelFilters[level]);\n const filtered = props.entries.filter((entry) => {\n if (entry.level && !props.levelFilters[entry.level]) return false;\n return matchesFilter(entry, needle);\n });\n\n return html`\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"min-width: 220px;\">\n <span>Filter</span>\n <input\n .value=${props.filterText}\n @input=${(e: Event) =>\n props.onFilterTextChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search logs\"\n />\n </label>\n <label class=\"field checkbox\">\n <span>Auto-follow</span>\n <input\n type=\"checkbox\"\n .checked=${props.autoFollow}\n @change=${(e: Event) =>\n props.onToggleAutoFollow((e.target as HTMLInputElement).checked)}\n />\n </label>\n </div>\n\n <div class=\"chip-row\" style=\"margin-top: 12px;\">\n ${LEVELS.map(\n (level) => html`\n <label class=\"chip log-chip ${level}\">\n <input\n type=\"checkbox\"\n .checked=${props.levelFilters[level]}\n @change=${(e: Event) =>\n props.onLevelToggle(level, (e.target as HTMLInputElement).checked)}\n />\n <span>${level}</span>\n </label>\n `,\n )}\n </div>\n\n ${props.file\n ? html`<div class=\"muted\" style=\"margin-top: 10px;\">File: ${props.file}</div>`\n : nothing}\n ${props.truncated\n ? html`<div class=\"callout\" style=\"margin-top: 10px;\">\n Log output truncated; showing latest chunk.\n </div>`\n : nothing}\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 10px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"log-stream\" style=\"margin-top: 12px;\" @scroll=${props.onScroll}>\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"padding: 12px;\">No log entries.</div>`\n : [...filtered].reverse().map(\n (entry) => html`\n <div class=\"log-row\">\n <div class=\"log-row-header\">\n <span class=\"log-time mono\">${formatTime(entry.time)}</span>\n <span class=\"log-level ${entry.level ?? \"\"}\">${entry.level ?? \"\"}</span>\n <span class=\"log-subsystem mono\">${entry.subsystem ?? \"\"}</span>\n </div>\n <div class=\"log-message mono\">${entry.message ?? entry.raw}</div>\n </div>\n `,\n )}\n </div>\n `;\n}\n","import { html } from \"lit\";\n\nimport type { CronProps } from \"./cron\";\nimport type { SkillsProps } from \"./skills\";\nimport type { LogsProps } from \"./logs\";\nimport { renderCron } from \"./cron\";\nimport { renderSkills } from \"./skills\";\nimport { renderLogs } from \"./logs\";\nimport { renderPageNav, type WorkspaceNavProps } from \"./page-nav\";\n\nexport type AdvancedTab = \"cron\" | \"skills\" | \"logs\";\n\nexport type AdvancedPageProps = {\n connected: boolean;\n wsProps?: WorkspaceNavProps;\n activeTab: AdvancedTab;\n onTabChange: (tab: AdvancedTab) => void;\n cronProps: CronProps;\n skillsProps: SkillsProps;\n logsProps: LogsProps;\n};\n\nconst TABS: { id: AdvancedTab; label: string }[] = [\n { id: \"cron\", label: \"Events\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"logs\", label: \"Logs\" },\n];\n\nfunction renderTabContent(props: AdvancedPageProps) {\n switch (props.activeTab) {\n case \"cron\":\n return renderCron(props.cronProps);\n case \"skills\":\n return renderSkills(props.skillsProps);\n case \"logs\":\n return renderLogs(props.logsProps);\n default:\n return renderCron(props.cronProps);\n }\n}\n\nexport function renderAdvancedPage(props: AdvancedPageProps) {\n if (!props.connected) {\n return html`\n <div class=\"setup-container\">\n <div class=\"setup-card\">\n <div class=\"setup-spinner\"></div>\n <p>Connecting to gateway...</p>\n </div>\n </div>\n `;\n }\n\n return html`\n <div class=\"setup-container\">\n ${renderPageNav(\"Advanced\", props.wsProps)}\n <div class=\"setup-card sp-card-advanced\" style=\"text-align: left;\">\n <h1>Advanced</h1>\n <div class=\"sp-tabs\">\n ${TABS.map(\n (tab) => html`\n <button\n class=\"sp-tab ${props.activeTab === tab.id ? \"active\" : \"\"}\"\n @click=${() => props.onTabChange(tab.id)}\n >\n ${tab.label}\n </button>\n `,\n )}\n </div>\n ${renderTabContent(props)}\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\nimport { resolveBrand } from \"../brand\";\nimport type { AccessAccount } from \"../controllers/access\";\n\nexport type LoginOverlayState = {\n /** Whether the login overlay should be visible. */\n show: boolean;\n /** Whether this is first-time setup (no master PIN yet). */\n isFirstTime: boolean;\n /** Available accounts for the selector. */\n accounts: AccessAccount[];\n /** Error message from last attempt. */\n error: string | null;\n /** Whether a request is in flight. */\n busy: boolean;\n /** Callback when PIN is submitted. For login: (account, pin). For first-time: (pin) only. */\n onSubmit: (accountOrPin: string, pin?: string) => void;\n /** Whether Change PIN mode is active. */\n changePinMode?: boolean;\n /** Toggle between login and change-PIN mode. */\n onToggleChangePinMode?: () => void;\n /** Whether a change-PIN request is in flight. */\n changePinBusy?: boolean;\n /** Error from the change-PIN flow. */\n changePinError?: string | null;\n /** Success message after PIN changed. */\n changePinSuccess?: string | null;\n /** Callback to change PIN: (account, oldPin, newPin). */\n onChangePin?: (account: string, oldPin: string, newPin: string) => void;\n};\n\n/**\n * Full-screen login overlay.\n * First-time: \"Set your device PIN\" (no account selector).\n * Returning: account selector + PIN input + \"Change PIN\" link.\n * Change-PIN mode: account selector + current PIN + new PIN + confirm.\n */\nexport function renderLoginOverlay(state: LoginOverlayState) {\n if (!state.show) return nothing;\n\n const brand = resolveBrand();\n const isFirstTime = state.isFirstTime;\n const isChangeMode = state.changePinMode === true && !isFirstTime;\n const changeBusy = state.changePinBusy === true;\n\n let selectedAccount = state.accounts.length > 0 ? state.accounts[0].id : \"\";\n\n const handleAccountChange = (e: Event) => {\n selectedAccount = (e.target as HTMLSelectElement).value;\n // Toggle \"Change PIN\" link visibility — only shown for admin\n const link = (e.target as HTMLElement).closest(\".login-card\")?.querySelector(\".login-change-pin\");\n if (link) (link as HTMLElement).style.display = selectedAccount === \"__master__\" ? \"\" : \"none\";\n };\n\n const pinInputHandler = (setter: (v: string) => void) => (e: Event) => {\n const input = e.target as HTMLInputElement;\n input.value = input.value.replace(/\\D/g, \"\").slice(0, 6);\n setter(input.value);\n };\n\n // Account selector (shared by login and change-PIN modes)\n const accountSelector = !isFirstTime && state.accounts.length > 1\n ? html`\n <select\n class=\"login-account-select\"\n @change=${handleAccountChange}\n ?disabled=${state.busy || changeBusy}\n >\n ${state.accounts.map(\n (acc, i) => html`\n <option value=${acc.id} ?selected=${i === 0}>\n ${acc.displayName}\n </option>\n `,\n )}\n </select>\n `\n : nothing;\n\n // ─── Change PIN Mode ───\n if (isChangeMode) {\n let oldPin = \"\";\n let newPin = \"\";\n let confirmPin = \"\";\n\n const handleChangePinSubmit = (e: Event) => {\n e.preventDefault();\n if (changeBusy) return;\n if (!oldPin || !newPin || !confirmPin) return;\n if (newPin !== confirmPin) return;\n if (!selectedAccount) return;\n state.onChangePin?.(selectedAccount, oldPin, newPin);\n };\n\n return html`\n <div class=\"login-overlay\">\n <div class=\"login-card\">\n <img class=\"login-logo\" src=\"${brand.iconUrl}\" alt=\"${brand.name}\" />\n <h2 class=\"login-title\">Change PIN</h2>\n <p class=\"login-subtitle\">Enter your current PIN, then choose a new one</p>\n <form class=\"login-form\" @submit=${handleChangePinSubmit}>\n ${accountSelector}\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"Current PIN\"\n ?disabled=${changeBusy}\n @input=${pinInputHandler((v) => { oldPin = v; })}\n autofocus\n />\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"New PIN (4-6 digits)\"\n ?disabled=${changeBusy}\n @input=${pinInputHandler((v) => { newPin = v; })}\n />\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"Confirm new PIN\"\n ?disabled=${changeBusy}\n @input=${pinInputHandler((v) => { confirmPin = v; })}\n />\n ${state.changePinError\n ? html`<p class=\"login-error\">${state.changePinError}</p>`\n : nothing}\n ${state.changePinSuccess\n ? html`<p class=\"login-success\">${state.changePinSuccess}</p>`\n : nothing}\n <button\n class=\"login-submit\"\n type=\"submit\"\n ?disabled=${changeBusy}\n >${changeBusy ? html`<span class=\"login-spinner\"></span>` : \"Change PIN\"}</button>\n </form>\n <p class=\"login-hint\" style=\"margin-top: 16px;\">\n <a\n class=\"login-link\"\n href=\"#\"\n @click=${(e: Event) => { e.preventDefault(); state.onToggleChangePinMode?.(); }}\n >Back to login</a>\n </p>\n </div>\n </div>\n `;\n }\n\n // ─── Normal Login / First-Time Setup ───\n let pinValue = \"\";\n let confirmValue = \"\";\n\n const handleSubmit = (e: Event) => {\n e.preventDefault();\n if (state.busy) return;\n if (isFirstTime) {\n if (!pinValue || !confirmValue) return;\n if (pinValue !== confirmValue) return;\n state.onSubmit(pinValue);\n } else {\n if (!pinValue || !selectedAccount) return;\n state.onSubmit(selectedAccount, pinValue);\n }\n };\n\n return html`\n <div class=\"login-overlay\">\n <div class=\"login-card\">\n <img class=\"login-logo\" src=\"${brand.iconUrl}\" alt=\"${brand.name}\" />\n <h2 class=\"login-title\">${brand.name}</h2>\n <p class=\"login-subtitle\">\n ${isFirstTime\n ? \"Set a PIN to protect this device\"\n : \"Enter your PIN to continue\"}\n </p>\n <form class=\"login-form\" @submit=${handleSubmit}>\n ${accountSelector}\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"${isFirstTime ? \"Choose a 4-6 digit PIN\" : \"PIN\"}\"\n ?disabled=${state.busy}\n @input=${pinInputHandler((v) => { pinValue = v; })}\n autofocus\n />\n ${isFirstTime\n ? html`\n <input\n class=\"login-pin-input\"\n type=\"password\"\n inputmode=\"numeric\"\n pattern=\"[0-9]*\"\n minlength=\"4\"\n maxlength=\"6\"\n placeholder=\"Confirm PIN\"\n ?disabled=${state.busy}\n @input=${pinInputHandler((v) => { confirmValue = v; })}\n />\n `\n : nothing}\n ${state.error\n ? html`<p class=\"login-error\">${state.error}</p>`\n : nothing}\n <button\n class=\"login-submit\"\n type=\"submit\"\n ?disabled=${state.busy}\n >\n ${state.busy\n ? html`<span class=\"login-spinner\"></span>`\n : isFirstTime\n ? \"Set PIN\"\n : \"Unlock\"}\n </button>\n </form>\n ${isFirstTime\n ? html`<p class=\"login-hint\">This PIN protects all accounts on this device. You'll need it every time you open the dashboard.</p>`\n : state.accounts.some((a) => a.id === \"__master__\")\n ? html`<p class=\"login-hint login-change-pin\" style=\"margin-top: 16px;${selectedAccount !== \"__master__\" ? \" display: none;\" : \"\"}\">\n <a\n class=\"login-link\"\n href=\"#\"\n @click=${(e: Event) => { e.preventDefault(); state.onToggleChangePinMode?.(); }}\n >Change PIN</a>\n </p>`\n : nothing}\n </div>\n </div>\n `;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nconst ACCESS_SESSION_KEY = \"taskmaster-access-session\";\n\nexport type AccessAccount = {\n id: string;\n displayName: string;\n};\n\nexport type AccessState = {\n /** Whether we've checked access status with the server. */\n checked: boolean;\n /** Whether PINs are configured on this device. */\n hasPins: boolean;\n /** Whether a master PIN exists (device has been set up). */\n hasMasterPin: boolean;\n /** Whether the current session is authenticated. */\n authenticated: boolean;\n /** Workspace this session is scoped to (null = master/all). */\n workspace: string | null;\n /** Whether this is a master (device owner) session. */\n master: boolean;\n /** Available accounts for the login selector. */\n accounts: AccessAccount[];\n /** Error message from last verify attempt. */\n error: string | null;\n /** Whether a verify/set request is in flight. */\n busy: boolean;\n};\n\nexport const DEFAULT_ACCESS_STATE: AccessState = {\n checked: false,\n hasPins: false,\n hasMasterPin: false,\n authenticated: false,\n workspace: null,\n master: false,\n accounts: [],\n error: null,\n busy: false,\n};\n\nexport function getStoredSessionToken(): string | null {\n try {\n return localStorage.getItem(ACCESS_SESSION_KEY);\n } catch {\n return null;\n }\n}\n\nfunction storeSessionToken(token: string): void {\n try {\n localStorage.setItem(ACCESS_SESSION_KEY, token);\n } catch {\n // localStorage unavailable\n }\n}\n\nfunction clearSessionToken(): void {\n try {\n localStorage.removeItem(ACCESS_SESSION_KEY);\n } catch {\n // localStorage unavailable\n }\n}\n\ntype AccessHost = {\n client: GatewayBrowserClient | null;\n accessState: AccessState;\n};\n\n/**\n * Check access status with the server.\n * Called after gateway connects on every page load.\n */\nexport async function checkAccessStatus(host: AccessHost): Promise<void> {\n if (!host.client) return;\n try {\n const token = getStoredSessionToken();\n const result = (await host.client.request(\"access.status\", { token })) as {\n hasMasterPin: boolean;\n hasPins: boolean;\n accounts: AccessAccount[];\n authenticated: boolean;\n workspace: string | null;\n master: boolean;\n };\n host.accessState = {\n ...host.accessState,\n checked: true,\n hasPins: result.hasPins,\n hasMasterPin: result.hasMasterPin,\n accounts: result.accounts ?? [],\n authenticated: result.authenticated,\n workspace: result.workspace,\n master: result.master,\n error: null,\n };\n } catch {\n // If access.status fails, assume no PINs configured (backwards compatible)\n host.accessState = {\n ...host.accessState,\n checked: true,\n hasPins: false,\n hasMasterPin: false,\n accounts: [],\n authenticated: true,\n error: null,\n };\n }\n}\n\n/**\n * Verify a PIN for a specific account and establish a session.\n */\nexport async function verifyPin(\n host: AccessHost,\n account: string,\n pin: string,\n): Promise<void> {\n if (!host.client) return;\n host.accessState = { ...host.accessState, busy: true, error: null };\n try {\n const result = (await host.client.request(\"access.verify\", { account, pin })) as {\n ok: boolean;\n token?: string;\n workspace?: string | null;\n master?: boolean;\n message?: string;\n };\n if (result.ok && result.token) {\n storeSessionToken(result.token);\n host.accessState = {\n ...host.accessState,\n authenticated: true,\n workspace: result.workspace ?? null,\n master: result.master ?? false,\n busy: false,\n error: null,\n };\n } else {\n host.accessState = {\n ...host.accessState,\n busy: false,\n error: result.message ?? \"Incorrect PIN\",\n };\n }\n } catch {\n host.accessState = {\n ...host.accessState,\n busy: false,\n error: \"Failed to verify PIN\",\n };\n }\n}\n\n/**\n * Set the master PIN (first-time setup).\n */\nexport async function setMasterPin(host: AccessHost, pin: string): Promise<void> {\n if (!host.client) return;\n host.accessState = { ...host.accessState, busy: true, error: null };\n try {\n const result = (await host.client.request(\"access.setMasterPin\", { pin })) as {\n ok: boolean;\n token?: string;\n };\n if (result.ok && result.token) {\n storeSessionToken(result.token);\n host.accessState = {\n ...host.accessState,\n checked: true,\n hasPins: true,\n hasMasterPin: true,\n authenticated: true,\n workspace: null,\n master: true,\n busy: false,\n error: null,\n };\n } else {\n host.accessState = { ...host.accessState, busy: false, error: \"Failed to set PIN\" };\n }\n } catch {\n host.accessState = { ...host.accessState, busy: false, error: \"Failed to set PIN\" };\n }\n}\n\n/**\n * Set a per-workspace PIN.\n */\nexport async function setAccountPin(\n host: AccessHost,\n workspace: string,\n pin: string,\n): Promise<boolean> {\n if (!host.client) return false;\n try {\n const result = (await host.client.request(\"access.setAccountPin\", { workspace, pin })) as {\n ok: boolean;\n };\n return result.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Logout — clear session.\n */\nexport async function logout(host: AccessHost): Promise<void> {\n const token = getStoredSessionToken();\n if (host.client && token) {\n try {\n await host.client.request(\"access.logout\", { token });\n } catch {\n // best-effort\n }\n }\n clearSessionToken();\n host.accessState = {\n ...DEFAULT_ACCESS_STATE,\n checked: true,\n hasPins: true,\n hasMasterPin: host.accessState.hasMasterPin,\n accounts: host.accessState.accounts,\n };\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type ApiKeyProvider = {\n id: string;\n name: string;\n category: string;\n hasKey: boolean;\n key?: string;\n};\n\nexport type ApiKeysState = {\n apiKeyProviders: ApiKeyProvider[];\n apiKeyModalOpen: boolean;\n apiKeyBusy: boolean;\n apiKeyError: string | null;\n apiKeySuccess: string | null;\n // Auth step API key fallback\n authApiKeyMode: boolean;\n authApiKeyInput: string;\n authApiKeyBusy: boolean;\n authApiKeyError: string | null;\n};\n\nexport const DEFAULT_API_KEYS_STATE: ApiKeysState = {\n apiKeyProviders: [],\n apiKeyModalOpen: false,\n apiKeyBusy: false,\n apiKeyError: null,\n apiKeySuccess: null,\n authApiKeyMode: false,\n authApiKeyInput: \"\",\n authApiKeyBusy: false,\n authApiKeyError: null,\n};\n\nexport async function loadApiKeyProviders(\n client: GatewayBrowserClient,\n): Promise<ApiKeyProvider[]> {\n const result = await client.request<{ providers: ApiKeyProvider[] }>(\"apikeys.list\");\n return result.providers ?? [];\n}\n\nexport async function saveApiKey(\n client: GatewayBrowserClient,\n provider: string,\n apiKey: string,\n): Promise<void> {\n await client.request(\"apikeys.set\", { provider, apiKey });\n}\n\nexport async function removeApiKey(\n client: GatewayBrowserClient,\n provider: string,\n): Promise<void> {\n await client.request(\"apikeys.remove\", { provider });\n}\n","/**\n * Canvas renderer for browser screencast frames.\n * Manages requestAnimationFrame batching and coordinate translation.\n */\nexport class BrowserCanvasRenderer {\n private canvas: HTMLCanvasElement | null = null;\n private ctx: CanvasRenderingContext2D | null = null;\n private img = new Image();\n private pendingFrame: string | null = null;\n private rafId: number | null = null;\n private deviceWidth = 1280;\n private deviceHeight = 720;\n private lastMouseMoveAt = 0;\n private readonly MOUSE_THROTTLE_MS = 30;\n\n attach(canvas: HTMLCanvasElement): void {\n this.canvas = canvas;\n this.ctx = canvas.getContext(\"2d\");\n }\n\n detach(): void {\n if (this.rafId != null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n this.canvas = null;\n this.ctx = null;\n this.pendingFrame = null;\n }\n\n updateFrame(\n base64Data: string,\n metadata?: { deviceWidth?: number; deviceHeight?: number },\n ): void {\n if (metadata?.deviceWidth) this.deviceWidth = metadata.deviceWidth;\n if (metadata?.deviceHeight) this.deviceHeight = metadata.deviceHeight;\n\n this.pendingFrame = base64Data;\n if (this.rafId == null) {\n this.rafId = requestAnimationFrame(() => this.renderFrame());\n }\n }\n\n private renderFrame(): void {\n this.rafId = null;\n const data = this.pendingFrame;\n if (!data || !this.canvas || !this.ctx) return;\n this.pendingFrame = null;\n\n this.img.onload = () => {\n if (!this.canvas || !this.ctx) return;\n // Resize canvas to match frame dimensions\n if (\n this.canvas.width !== this.img.width ||\n this.canvas.height !== this.img.height\n ) {\n this.canvas.width = this.img.width;\n this.canvas.height = this.img.height;\n }\n this.ctx.drawImage(this.img, 0, 0);\n };\n this.img.src = `data:image/jpeg;base64,${data}`;\n }\n\n /**\n * Translate canvas pixel coordinates to CDP viewport coordinates.\n */\n translateCoordinates(\n canvasX: number,\n canvasY: number,\n ): { x: number; y: number } {\n if (!this.canvas) return { x: canvasX, y: canvasY };\n\n const rect = this.canvas.getBoundingClientRect();\n // Scale from displayed size to actual canvas pixel size\n const scaleX = this.canvas.width / rect.width;\n const scaleY = this.canvas.height / rect.height;\n\n // Then scale from canvas pixels to device viewport\n const viewportScaleX = this.deviceWidth / this.canvas.width;\n const viewportScaleY = this.deviceHeight / this.canvas.height;\n\n return {\n x: Math.round(canvasX * scaleX * viewportScaleX),\n y: Math.round(canvasY * scaleY * viewportScaleY),\n };\n }\n\n /**\n * Check if a mouse move event should be throttled.\n */\n shouldThrottleMouseMove(): boolean {\n const now = performance.now();\n if (now - this.lastMouseMoveAt < this.MOUSE_THROTTLE_MS) {\n return true;\n }\n this.lastMouseMoveAt = now;\n return false;\n }\n\n getDeviceDimensions(): { width: number; height: number } {\n return { width: this.deviceWidth, height: this.deviceHeight };\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { BrowserCanvasRenderer } from \"../browser-canvas\";\n\nexport type BrowserViewerState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n browserScreencastActive: boolean;\n browserScreencastFrame: string | null;\n browserScreencastMetadata: { deviceWidth?: number; deviceHeight?: number } | null;\n browserHandoffPending: boolean;\n browserHandoffReason: string | null;\n browserHandoffId: string | null;\n browserInputMode: boolean;\n browserLoading: boolean;\n browserError: string | null;\n};\n\nlet canvasRenderer: BrowserCanvasRenderer | null = null;\n\nexport function getCanvasRenderer(): BrowserCanvasRenderer {\n if (!canvasRenderer) {\n canvasRenderer = new BrowserCanvasRenderer();\n }\n return canvasRenderer;\n}\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nexport async function startScreencast(state: BrowserViewerState) {\n if (!state.client || !state.connected) return;\n state.browserLoading = true;\n state.browserError = null;\n try {\n const res = (await state.client.request(\"browser.screencast.start\", {\n quality: 60,\n maxWidth: 1280,\n maxHeight: 720,\n })) as { ok?: boolean } | undefined;\n if (res?.ok) {\n state.browserScreencastActive = true;\n }\n } catch (err) {\n state.browserError = getErrorMessage(err);\n } finally {\n state.browserLoading = false;\n }\n}\n\nexport async function stopScreencast(state: BrowserViewerState) {\n if (!state.client || !state.connected) return;\n state.browserLoading = true;\n try {\n await state.client.request(\"browser.screencast.stop\", {});\n state.browserScreencastActive = false;\n state.browserScreencastFrame = null;\n state.browserScreencastMetadata = null;\n } catch (err) {\n state.browserError = getErrorMessage(err);\n } finally {\n state.browserLoading = false;\n }\n}\n\nexport async function sendMouseInput(\n state: BrowserViewerState,\n action: \"mousePressed\" | \"mouseReleased\" | \"mouseMoved\",\n x: number,\n y: number,\n button?: \"left\" | \"right\" | \"middle\",\n) {\n if (!state.client || !state.connected || !state.browserInputMode) return;\n try {\n await state.client.request(\"browser.screencast.input\", {\n type: \"mouse\",\n action,\n x,\n y,\n button: button ?? \"left\",\n clickCount: action === \"mousePressed\" ? 1 : 0,\n });\n } catch {\n // Ignore input errors to avoid disrupting the experience\n }\n}\n\nexport async function sendKeyInput(\n state: BrowserViewerState,\n action: \"keyDown\" | \"keyUp\" | \"char\",\n key: string,\n opts?: { text?: string; code?: string; modifiers?: number },\n) {\n if (!state.client || !state.connected || !state.browserInputMode) return;\n try {\n await state.client.request(\"browser.screencast.input\", {\n type: \"key\",\n action,\n key,\n ...(opts?.text ? { text: opts.text } : {}),\n ...(opts?.code ? { code: opts.code } : {}),\n ...(opts?.modifiers ? { modifiers: opts.modifiers } : {}),\n });\n } catch {\n // Ignore input errors\n }\n}\n\nexport async function completeHandoff(state: BrowserViewerState) {\n if (!state.client || !state.connected) return;\n try {\n await state.client.request(\"browser.handoff.complete\", {});\n state.browserHandoffPending = false;\n state.browserHandoffReason = null;\n state.browserHandoffId = null;\n } catch (err) {\n state.browserError = getErrorMessage(err);\n }\n}\n\nexport function toggleInputMode(state: BrowserViewerState) {\n state.browserInputMode = !state.browserInputMode;\n}\n\n/**\n * Handle incoming screencast frame from gateway event.\n */\nexport function handleScreencastFrame(\n state: BrowserViewerState,\n payload: { data?: string; metadata?: { deviceWidth?: number; deviceHeight?: number } } | undefined,\n) {\n if (!payload?.data) return;\n state.browserScreencastFrame = payload.data;\n state.browserScreencastMetadata = payload.metadata ?? null;\n\n // Update canvas renderer directly\n const renderer = getCanvasRenderer();\n renderer.updateFrame(payload.data, payload.metadata);\n}\n\n/**\n * Handle handoff event from gateway.\n */\nexport function handleHandoffEvent(\n state: BrowserViewerState,\n payload: { id?: string; reason?: string } | undefined,\n) {\n if (!payload) return;\n state.browserHandoffPending = true;\n state.browserHandoffReason = payload.reason ?? \"Action required\";\n state.browserHandoffId = payload.id ?? null;\n}\n\n/**\n * Handle handoff resolved event from gateway.\n */\nexport function handleHandoffResolved(state: BrowserViewerState) {\n state.browserHandoffPending = false;\n state.browserHandoffReason = null;\n state.browserHandoffId = null;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type FileTreeEntry = {\n name: string;\n path: string;\n type: \"file\" | \"directory\" | \"symlink\";\n size?: number;\n children?: FileTreeEntry[];\n};\n\nexport type FilesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n filesLoading: boolean;\n filesTree: FileTreeEntry[];\n filesRoot: string;\n filesError: string | null;\n filesSelectedPath: string | null;\n filesSelectedPaths: Set<string>;\n filesPreviewContent: string | null;\n filesPreviewLoading: boolean;\n filesPreviewBinary: boolean;\n filesPreviewSize: number | null;\n filesExpandedDirs: Set<string>;\n filesMessage: { kind: \"success\" | \"error\"; text: string } | null;\n filesUploadBusy: boolean;\n};\n\nfunction getErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nlet messageTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction setSuccessMessage(state: FilesState, text: string) {\n if (messageTimer) clearTimeout(messageTimer);\n state.filesMessage = { kind: \"success\", text };\n messageTimer = setTimeout(() => {\n state.filesMessage = null;\n messageTimer = null;\n }, 3000);\n}\n\nexport async function loadFileTree(state: FilesState, agentId?: string) {\n if (!state.client || !state.connected) return;\n if (!agentId) {\n // No workspace context yet — clear data and wait for workspace selection\n state.filesTree = [];\n state.filesRoot = \"\";\n return;\n }\n if (state.filesLoading) return;\n state.filesLoading = true;\n state.filesError = null;\n try {\n const params: Record<string, unknown> = {};\n if (agentId) params.agentId = agentId;\n const res = (await state.client.request(\"files.tree\", params)) as {\n root?: string;\n tree?: FileTreeEntry[];\n } | undefined;\n if (res?.tree) {\n state.filesTree = res.tree;\n state.filesRoot = res.root ?? \"\";\n }\n } catch (err) {\n state.filesError = getErrorMessage(err);\n } finally {\n state.filesLoading = false;\n }\n}\n\n/** Single-click: select one file, clear others, load preview. */\nexport async function selectFile(state: FilesState, filePath: string, agentId?: string) {\n state.filesSelectedPaths = new Set([filePath]);\n await previewFile(state, filePath, agentId);\n}\n\n/** Ctrl/Cmd+click: toggle a file in the multi-selection set. */\nexport async function toggleSelectFile(state: FilesState, filePath: string, agentId?: string) {\n const next = new Set(state.filesSelectedPaths);\n if (next.has(filePath)) {\n next.delete(filePath);\n } else {\n next.add(filePath);\n }\n state.filesSelectedPaths = next;\n // Show preview only when exactly one file is selected\n if (next.size === 1) {\n const remaining = [...next][0];\n await previewFile(state, remaining, agentId);\n } else {\n state.filesSelectedPath = null;\n state.filesPreviewContent = null;\n state.filesPreviewSize = null;\n state.filesPreviewBinary = false;\n }\n}\n\n/** Download all files in the current multi-selection. */\nexport async function bulkDownloadFiles(state: FilesState, agentId?: string) {\n if (!state.client || !state.connected) return;\n const paths = [...state.filesSelectedPaths];\n if (paths.length === 0) return;\n let successCount = 0;\n let errorMsg = \"\";\n for (const filePath of paths) {\n try {\n await downloadFile(state, filePath, agentId);\n successCount++;\n } catch (err) {\n errorMsg = getErrorMessage(err);\n }\n }\n if (errorMsg) {\n state.filesMessage = { kind: \"error\", text: `${successCount} downloaded, error: ${errorMsg}` };\n } else {\n setSuccessMessage(state, `${successCount} file${successCount !== 1 ? \"s\" : \"\"} downloaded`);\n }\n}\n\n/** Move a file into a directory (drag-and-drop). Constructs the destination path. */\nexport async function moveFileToDir(state: FilesState, filePath: string, targetDir: string, agentId?: string) {\n const fileName = filePath.split(\"/\").pop() ?? filePath;\n const dest = targetDir === \".\" ? fileName : `${targetDir}/${fileName}`;\n if (dest === filePath) return; // no-op: same location\n await moveFile(state, filePath, dest, agentId);\n}\n\nexport async function previewFile(state: FilesState, filePath: string, agentId?: string) {\n if (!state.client || !state.connected) return;\n state.filesSelectedPath = filePath;\n state.filesPreviewLoading = true;\n state.filesPreviewContent = null;\n state.filesPreviewBinary = false;\n state.filesPreviewSize = null;\n try {\n const params: Record<string, unknown> = { path: filePath };\n if (agentId) params.agentId = agentId;\n const res = (await state.client.request(\"files.read\", params)) as {\n content?: string | null;\n binary?: boolean;\n size?: number;\n } | undefined;\n state.filesPreviewContent = res?.content ?? null;\n state.filesPreviewBinary = res?.binary ?? false;\n state.filesPreviewSize = res?.size ?? null;\n } catch (err) {\n state.filesError = getErrorMessage(err);\n } finally {\n state.filesPreviewLoading = false;\n }\n}\n\nexport async function downloadFile(state: FilesState, filePath: string, agentId?: string) {\n if (!state.client || !state.connected) return;\n try {\n const params: Record<string, unknown> = { path: filePath };\n if (agentId) params.agentId = agentId;\n const res = (await state.client.request(\"files.download\", params)) as {\n base64?: string;\n name?: string;\n } | undefined;\n if (!res?.base64) {\n state.filesMessage = { kind: \"error\", text: \"Download failed: no data\" };\n return;\n }\n // Convert base64 to blob and trigger download\n const bytes = Uint8Array.from(atob(res.base64), (c) => c.charCodeAt(0));\n const blob = new Blob([bytes]);\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = res.name ?? filePath.split(\"/\").pop() ?? \"download\";\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n } catch (err) {\n state.filesMessage = { kind: \"error\", text: getErrorMessage(err) };\n }\n}\n\nexport async function uploadFiles(\n state: FilesState,\n dirPath: string,\n files: File[],\n agentId?: string,\n) {\n if (!state.client || !state.connected) return;\n state.filesUploadBusy = true;\n state.filesMessage = null;\n let successCount = 0;\n let errorMsg = \"\";\n for (const file of files) {\n try {\n const buffer = await file.arrayBuffer();\n const base64 = btoa(\n new Uint8Array(buffer).reduce((data, byte) => data + String.fromCharCode(byte), \"\"),\n );\n const params: Record<string, unknown> = {\n path: dirPath,\n name: file.name,\n data: base64,\n };\n if (agentId) params.agentId = agentId;\n await state.client.request(\"files.upload\", params);\n successCount++;\n } catch (err) {\n errorMsg = getErrorMessage(err);\n }\n }\n state.filesUploadBusy = false;\n if (errorMsg) {\n state.filesMessage = {\n kind: \"error\",\n text: successCount > 0 ? `${successCount} uploaded, error: ${errorMsg}` : errorMsg,\n };\n } else {\n setSuccessMessage(state, `${successCount} file${successCount !== 1 ? \"s\" : \"\"} uploaded`);\n }\n await loadFileTree(state, agentId);\n}\n\nexport async function deleteFile(state: FilesState, filePath: string, agentId?: string) {\n if (!state.client || !state.connected) return;\n state.filesMessage = null;\n try {\n const params: Record<string, unknown> = { path: filePath };\n if (agentId) params.agentId = agentId;\n await state.client.request(\"files.delete\", params);\n setSuccessMessage(state, \"File deleted\");\n if (state.filesSelectedPath === filePath) {\n state.filesSelectedPath = null;\n state.filesPreviewContent = null;\n }\n await loadFileTree(state, agentId);\n } catch (err) {\n state.filesMessage = { kind: \"error\", text: getErrorMessage(err) };\n }\n}\n\nexport async function moveFile(state: FilesState, from: string, to: string, agentId?: string) {\n if (!state.client || !state.connected) return;\n state.filesMessage = null;\n try {\n const params: Record<string, unknown> = { from, to };\n if (agentId) params.agentId = agentId;\n await state.client.request(\"files.move\", params);\n setSuccessMessage(state, \"File moved\");\n if (state.filesSelectedPath === from) {\n state.filesSelectedPath = to;\n }\n await loadFileTree(state, agentId);\n } catch (err) {\n state.filesMessage = { kind: \"error\", text: getErrorMessage(err) };\n }\n}\n\nexport function toggleDirectory(state: FilesState, dirPath: string) {\n const next = new Set(state.filesExpandedDirs);\n if (next.has(dirPath)) {\n next.delete(dirPath);\n } else {\n next.add(dirPath);\n }\n state.filesExpandedDirs = next;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { ConfigSnapshot } from \"../types\";\nimport { cloneConfigObject, serializeConfigForm, setPathValue } from \"./config/form-utils\";\nimport type { AdminPhoneEntry } from \"../types.admins\";\n\nexport type AdminsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n adminsLoading: boolean;\n adminPhones: AdminPhoneEntry[];\n adminsError: string | null;\n adminsSaving: boolean;\n configSnapshot: ConfigSnapshot | null;\n configForm: Record<string, unknown> | null;\n configFormDirty: boolean;\n};\n\ntype AgentBinding = {\n agentId: string;\n match: {\n channel: string;\n accountId?: string;\n peer?: { kind: string; id: string };\n guildId?: string;\n teamId?: string;\n };\n meta?: {\n paired?: boolean;\n };\n};\n\n/**\n * Extract admin phone entries from config bindings.\n * Admin phones are bindings where agentId matches the target and match.peer.kind is \"dm\".\n * Returns entries with paired status from binding metadata.\n */\nfunction extractAdminPhones(config: Record<string, unknown> | null, targetAgentId = \"admin\"): AdminPhoneEntry[] {\n if (!config) return [];\n const bindings = config.bindings as AgentBinding[] | undefined;\n if (!Array.isArray(bindings)) return [];\n\n const entries: AdminPhoneEntry[] = [];\n for (const binding of bindings) {\n if (!binding || typeof binding !== \"object\") continue;\n if (binding.agentId !== targetAgentId) continue;\n const match = binding.match;\n if (!match || typeof match !== \"object\") continue;\n const channel = (match.channel ?? \"\").toLowerCase();\n if (channel !== \"whatsapp\") continue;\n const peer = match.peer;\n if (!peer || typeof peer !== \"object\") continue;\n if (peer.kind !== \"dm\") continue;\n const id = peer.id ?? \"\";\n if (id) {\n entries.push({\n phone: id,\n paired: binding.meta?.paired === true,\n });\n }\n }\n // Sort so paired phone appears first\n entries.sort((a, b) => {\n if (a.paired && !b.paired) return -1;\n if (!a.paired && b.paired) return 1;\n return 0;\n });\n return entries;\n}\n\n/**\n * Build updated bindings array with admin phones added/removed.\n * Preserves paired metadata for existing bindings.\n */\nfunction buildBindingsWithAdmins(\n existingBindings: AgentBinding[],\n phones: AdminPhoneEntry[],\n targetAgentId = \"admin\",\n accountId?: string,\n): AgentBinding[] {\n // Build maps of existing admin whatsapp dm bindings to preserve metadata and accountId\n const existingMetaMap = new Map<string, AgentBinding[\"meta\"]>();\n const existingAccountIdMap = new Map<string, string>();\n for (const binding of existingBindings) {\n if (!binding || typeof binding !== \"object\") continue;\n if (binding.agentId !== targetAgentId) continue;\n const match = binding.match;\n if (!match || typeof match !== \"object\") continue;\n const channel = (match.channel ?? \"\").toLowerCase();\n if (channel !== \"whatsapp\") continue;\n const peer = match.peer;\n if (!peer || typeof peer !== \"object\") continue;\n if (peer.kind !== \"dm\") continue;\n const id = peer.id ?? \"\";\n if (id) {\n if (binding.meta) existingMetaMap.set(id, binding.meta);\n if (match.accountId) existingAccountIdMap.set(id, match.accountId);\n }\n }\n\n // Remove existing admin whatsapp dm bindings for this agent\n const filtered = existingBindings.filter((binding) => {\n if (!binding || typeof binding !== \"object\") return true;\n if (binding.agentId !== targetAgentId) return true;\n const match = binding.match;\n if (!match || typeof match !== \"object\") return true;\n const channel = (match.channel ?? \"\").toLowerCase();\n if (channel !== \"whatsapp\") return true;\n const peer = match.peer;\n if (!peer || typeof peer !== \"object\") return true;\n return peer.kind !== \"dm\";\n });\n\n // Add new admin bindings for each phone, preserving metadata\n const newBindings: AgentBinding[] = phones.map((entry) => {\n // Use explicit accountId: caller-provided > preserved from existing > omit\n const resolvedAccountId = accountId ?? existingAccountIdMap.get(entry.phone);\n const matchObj: AgentBinding[\"match\"] = {\n channel: \"whatsapp\",\n peer: { kind: \"dm\", id: entry.phone },\n };\n if (resolvedAccountId) matchObj.accountId = resolvedAccountId;\n const binding: AgentBinding = { agentId: targetAgentId, match: matchObj };\n // Preserve existing metadata or use entry's paired status\n const existingMeta = existingMetaMap.get(entry.phone);\n if (existingMeta) {\n binding.meta = existingMeta;\n } else if (entry.paired) {\n binding.meta = { paired: true };\n }\n return binding;\n });\n\n return [...filtered, ...newBindings];\n}\n\nexport async function loadAdmins(state: AdminsState, adminAgentId?: string) {\n if (!state.client || !state.connected) return;\n if (!adminAgentId) {\n // No workspace context yet — clear data and wait for workspace selection\n state.adminPhones = [];\n return;\n }\n if (state.adminsLoading) return;\n state.adminsLoading = true;\n state.adminsError = null;\n const agentId = adminAgentId;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = res;\n const config = res.config as Record<string, unknown> | null;\n state.configForm = cloneConfigObject(config ?? {});\n state.adminPhones = extractAdminPhones(config, agentId);\n state.configFormDirty = false;\n } catch (err) {\n state.adminsError = String(err);\n } finally {\n state.adminsLoading = false;\n }\n}\n\nexport async function addAdmin(state: AdminsState, phone: string, adminAgentId?: string, accountId?: string) {\n if (!state.client || !state.connected) return;\n if (!adminAgentId) {\n state.adminsError = \"No business selected.\";\n return;\n }\n if (state.adminsSaving) return;\n const agentId = adminAgentId;\n\n // Normalize phone number (ensure E.164 format)\n let normalized = phone.trim();\n if (!normalized) {\n state.adminsError = \"Phone number is required\";\n return;\n }\n // Add + if missing\n if (!normalized.startsWith(\"+\")) {\n normalized = \"+\" + normalized;\n }\n // Validate basic phone format\n if (!/^\\+[1-9]\\d{6,14}$/.test(normalized)) {\n state.adminsError = \"Invalid phone number format. Use E.164 format (e.g., +14155552671)\";\n return;\n }\n\n // Check if already exists\n if (state.adminPhones.some((entry) => entry.phone === normalized)) {\n state.adminsError = \"Phone number already exists\";\n return;\n }\n\n state.adminsSaving = true;\n state.adminsError = null;\n try {\n const config = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n const existingBindings = (config.bindings as AgentBinding[]) ?? [];\n const newPhones: AdminPhoneEntry[] = [...state.adminPhones, { phone: normalized }];\n const updatedBindings = buildBindingsWithAdmins(existingBindings, newPhones, agentId, accountId);\n setPathValue(config, [\"bindings\"], updatedBindings);\n\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.adminsError = \"Config hash missing; reload and retry.\";\n return;\n }\n const raw = serializeConfigForm(config);\n await state.client.request(\"config.set\", { raw, baseHash });\n\n // Reload to get fresh state\n await loadAdmins(state, adminAgentId);\n } catch (err) {\n state.adminsError = String(err);\n } finally {\n state.adminsSaving = false;\n }\n}\n\nexport async function removeAdmin(state: AdminsState, phone: string, adminAgentId?: string, accountId?: string) {\n if (!state.client || !state.connected) return;\n if (!adminAgentId) {\n state.adminsError = \"No business selected.\";\n return;\n }\n if (state.adminsSaving) return;\n const agentId = adminAgentId;\n\n // Prevent removing paired phone\n const entry = state.adminPhones.find((e) => e.phone === phone);\n if (entry?.paired) {\n state.adminsError = \"Cannot remove the paired phone. Unlink WhatsApp first.\";\n return;\n }\n\n state.adminsSaving = true;\n state.adminsError = null;\n try {\n const config = cloneConfigObject(\n state.configForm ?? state.configSnapshot?.config ?? {},\n );\n const existingBindings = (config.bindings as AgentBinding[]) ?? [];\n const newPhones = state.adminPhones.filter((e) => e.phone !== phone);\n const updatedBindings = buildBindingsWithAdmins(existingBindings, newPhones, agentId, accountId);\n setPathValue(config, [\"bindings\"], updatedBindings);\n\n const baseHash = state.configSnapshot?.hash;\n if (!baseHash) {\n state.adminsError = \"Config hash missing; reload and retry.\";\n return;\n }\n const raw = serializeConfigForm(config);\n await state.client.request(\"config.set\", { raw, baseHash });\n\n // Reload to get fresh state\n await loadAdmins(state, adminAgentId);\n } catch (err) {\n state.adminsError = String(err);\n } finally {\n state.adminsSaving = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type CustomerRecord = {\n id: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n fields: Record<string, string>;\n};\n\nexport type CustomersState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n customersLoading: boolean;\n customersSaving: boolean;\n customersRecords: CustomerRecord[];\n customersError: string | null;\n customersSearchQuery: string;\n customersEditingId: string | null;\n customersShowAddForm: boolean;\n customersNewPhone: string;\n customersNewName: string;\n};\n\nexport async function loadCustomers(state: CustomersState, workspace?: string) {\n if (!state.client || !state.connected) return;\n if (!workspace) {\n // No workspace context yet — clear data and wait for workspace selection\n state.customersRecords = [];\n return;\n }\n if (state.customersLoading) return;\n state.customersLoading = true;\n state.customersError = null;\n try {\n const query = state.customersSearchQuery.trim();\n const res = query\n ? (await state.client.request(\"records.search\", { query, workspace })) as { records: CustomerRecord[] }\n : (await state.client.request(\"records.list\", { workspace })) as { records: CustomerRecord[] };\n state.customersRecords = res.records ?? [];\n } catch (err) {\n state.customersError = String(err);\n } finally {\n state.customersLoading = false;\n }\n}\n\nexport async function addCustomer(state: CustomersState, phone: string, name: string, workspace?: string) {\n if (!state.client || !state.connected) return;\n if (state.customersSaving) return;\n\n let normalizedPhone = phone.trim();\n const trimmedName = name.trim();\n if (!normalizedPhone) {\n state.customersError = \"Phone number is required\";\n return;\n }\n if (!trimmedName) {\n state.customersError = \"Name is required\";\n return;\n }\n if (!normalizedPhone.startsWith(\"+\")) {\n normalizedPhone = \"+\" + normalizedPhone;\n }\n if (!/^\\+[1-9]\\d{6,14}$/.test(normalizedPhone)) {\n state.customersError = \"Invalid phone number format. Use E.164 (e.g. +447490553305)\";\n return;\n }\n\n state.customersSaving = true;\n state.customersError = null;\n try {\n await state.client.request(\"records.set\", {\n id: normalizedPhone,\n name: trimmedName,\n fields: {},\n workspace,\n });\n state.customersShowAddForm = false;\n state.customersNewPhone = \"\";\n state.customersNewName = \"\";\n await loadCustomers(state, workspace);\n } catch (err) {\n state.customersError = String(err);\n } finally {\n state.customersSaving = false;\n }\n}\n\nexport async function deleteCustomer(state: CustomersState, id: string, workspace?: string) {\n if (!state.client || !state.connected) return;\n if (state.customersSaving) return;\n state.customersSaving = true;\n state.customersError = null;\n try {\n await state.client.request(\"records.delete\", { id });\n if (state.customersEditingId === id) state.customersEditingId = null;\n await loadCustomers(state, workspace);\n } catch (err) {\n state.customersError = String(err);\n } finally {\n state.customersSaving = false;\n }\n}\n\nexport async function setCustomerField(\n state: CustomersState,\n id: string,\n key: string,\n value: string,\n workspace?: string,\n) {\n if (!state.client || !state.connected) return;\n if (state.customersSaving) return;\n state.customersSaving = true;\n state.customersError = null;\n try {\n await state.client.request(\"records.setField\", { id, key, value });\n await loadCustomers(state, workspace);\n } catch (err) {\n state.customersError = String(err);\n } finally {\n state.customersSaving = false;\n }\n}\n\nexport async function deleteCustomerField(state: CustomersState, id: string, key: string, workspace?: string) {\n if (!state.client || !state.connected) return;\n if (state.customersSaving) return;\n state.customersSaving = true;\n state.customersError = null;\n try {\n await state.client.request(\"records.deleteField\", { id, key });\n await loadCustomers(state, workspace);\n } catch (err) {\n state.customersError = String(err);\n } finally {\n state.customersSaving = false;\n }\n}\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport type { AppViewState } from \"./app-view-state\";\nimport { parseAgentSessionKey } from \"../../../src/routing/session-key.js\";\nimport { resolveBrand } from \"./brand\";\nimport {\n pathForTab,\n type Tab,\n} from \"./navigation\";\nimport { icons } from \"./icons\";\nimport type { UiSettings } from \"./storage\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SessionTranscriptEntry,\n SessionLogType,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport type { ChatQueueItem, CronFormState } from \"./ui-types\";\nimport { refreshChatAvatar } from \"./app-chat\";\nimport { renderBrowserViewer } from \"./views/browser-viewer\";\nimport { renderFiles } from \"./views/files\";\nimport { renderSetup } from \"./views/setup\";\nimport { renderAdminsPage } from \"./views/admins\";\nimport { renderCustomersPage } from \"./views/customers\";\nimport { renderChatPage } from \"./views/chat-page\";\nimport { renderAdvancedPage, type AdvancedTab } from \"./views/advanced\";\nimport { renderLoginOverlay } from \"./views/login\";\nimport { setAccountPin } from \"./controllers/access\";\nimport { loadApiKeyProviders as loadApiKeys, saveApiKey, removeApiKey } from \"./controllers/apikeys\";\nimport type { WorkspaceNavProps } from \"./views/page-nav\";\nimport type { WorkspaceInfo } from \"./controllers/workspaces\";\nimport { loadChannels } from \"./controllers/channels\";\nimport { patchSession } from \"./controllers/sessions\";\nimport {\n startScreencast as startBrowserScreencast,\n stopScreencast as stopBrowserScreencast,\n sendMouseInput,\n sendKeyInput,\n completeHandoff,\n toggleInputMode,\n getCanvasRenderer,\n} from \"./controllers/browser-viewer\";\nimport {\n bulkDownloadFiles,\n deleteFile,\n downloadFile,\n loadFileTree,\n moveFile,\n moveFileToDir,\n selectFile,\n toggleDirectory,\n toggleSelectFile,\n uploadFiles,\n} from \"./controllers/files\";\nimport {\n installSkill,\n loadSkills,\n saveSkillApiKey,\n updateSkillEdit,\n updateSkillEnabled,\n type SkillMessage,\n} from \"./controllers/skills\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport {\n loadConfig,\n updateConfigFormValue,\n} from \"./controllers/config\";\nimport { loadCronRuns, toggleCronJob, runCronJob, removeCronJob, addCronJob } from \"./controllers/cron\";\nimport { loadLogs } from \"./controllers/logs\";\nimport { loadSessionLogs } from \"./controllers/session-logs\";\nimport { startLogsPolling, stopLogsPolling, startSessionLogsPolling, stopSessionLogsPolling } from \"./app-polling\";\nimport { loadAdmins, addAdmin, removeAdmin } from \"./controllers/admins\";\nimport {\n loadCustomers,\n addCustomer,\n deleteCustomer,\n setCustomerField,\n deleteCustomerField,\n} from \"./controllers/customers\";\n\nfunction buildWorkspaceNavProps(state: AppViewState): WorkspaceNavProps | undefined {\n if (state.workspaces.length === 0) return undefined;\n return {\n workspaces: state.workspaces,\n selectedWorkspace: state.selectedWorkspace,\n onWorkspaceSelect: (name: string) => state.handleWorkspaceSelect(name),\n hasPins: state.accessState.hasPins,\n isMaster: state.accessState.master,\n onLogout: () => state.handleLogout(),\n };\n}\n\n/** Setup page variant: \"Add Account\" opens the add form instead of navigating */\nfunction buildSetupWorkspaceNavProps(state: AppViewState): WorkspaceNavProps | undefined {\n if (state.workspaces.length === 0) return undefined;\n return {\n workspaces: state.workspaces,\n selectedWorkspace: state.selectedWorkspace,\n onWorkspaceSelect: (name: string) => state.handleWorkspaceSelect(name),\n onAddAccount: () => { state.addingWorkspace = true; },\n hasPins: state.accessState.hasPins,\n isMaster: state.accessState.master,\n onLogout: () => state.handleLogout(),\n };\n}\n\nfunction resolveAdminAgentId(state: AppViewState): string | undefined {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return undefined;\n const adminAgent = ws.agents.find((a) => a.id.endsWith(\"-admin\") || a.id === \"admin\");\n return adminAgent?.id;\n}\n\nfunction resolveWhatsAppAccountId(state: AppViewState): string | undefined {\n const ws = getSelectedWorkspaceInfo(state);\n return ws?.whatsappAccountId ?? undefined;\n}\n\nfunction resolveFilesAgentId(state: AppViewState): string | undefined {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return undefined;\n // Use any agent from the workspace — they all share the same workspace dir\n return ws.agents[0]?.id;\n}\n\nfunction resolveWorkspaceName(state: AppViewState): string | undefined {\n return state.selectedWorkspace ?? undefined;\n}\n\nfunction getSelectedWorkspaceInfo(state: AppViewState): WorkspaceInfo | null {\n if (!state.selectedWorkspace) return null;\n return state.workspaces.find((ws) => ws.name === state.selectedWorkspace) ?? null;\n}\n\nconst AVATAR_DATA_RE = /^data:/i;\nconst AVATAR_HTTP_RE = /^https?:\\/\\//i;\n\nfunction resolveAssistantAvatarUrl(state: AppViewState): string | undefined {\n const list = state.agentsList?.agents ?? [];\n const parsed = parseAgentSessionKey(state.sessionKey);\n const agentId =\n parsed?.agentId ??\n state.agentsList?.defaultId ??\n \"main\";\n const agent = list.find((entry) => entry.id === agentId);\n const identity = agent?.identity;\n const candidate = identity?.avatarUrl ?? identity?.avatar;\n if (!candidate) return undefined;\n if (AVATAR_DATA_RE.test(candidate) || AVATAR_HTTP_RE.test(candidate)) return candidate;\n return identity?.avatarUrl;\n}\n\n// Extract WhatsApp channel status from channelsSnapshot\nfunction extractWhatsAppStatus(\n snapshot: ChannelsStatusSnapshot | null,\n): { running: boolean; connected: boolean; linked: boolean; lastError?: string | null } | null {\n if (!snapshot) return null;\n const accounts = snapshot.channelAccounts?.whatsapp;\n if (!accounts || accounts.length === 0) return null;\n const account = accounts[0];\n return {\n running: account.running ?? false,\n connected: account.connected ?? false,\n linked: account.linked ?? false,\n lastError: account.lastError,\n };\n}\n\n// Extract iMessage channel status from channelsSnapshot\nfunction extractIMessageStatus(snapshot: ChannelsStatusSnapshot | null): {\n configured: boolean;\n running: boolean;\n connected: boolean;\n lastError: string | null;\n selfChatMode: boolean;\n dmPolicy: string | null;\n cliPath: string | null;\n} {\n if (!snapshot) return { configured: false, running: false, connected: false, lastError: null, selfChatMode: false, dmPolicy: null, cliPath: null };\n const accounts = snapshot.channelAccounts?.imessage;\n if (!accounts || accounts.length === 0) {\n return { configured: false, running: false, connected: false, lastError: null, selfChatMode: false, dmPolicy: null, cliPath: null };\n }\n const account = accounts[0];\n const running = account.running ?? false;\n // Derive \"connected\" from probe result when available, fall back to running state.\n // The iMessage snapshot doesn't include a `connected` field — the probe\n // (which runs `imsg rpc` → `chats.list`) is the authoritative connectivity check.\n const probe = account.probe as { ok?: boolean } | undefined;\n const connected = probe != null ? (probe.ok === true) : running;\n return {\n configured: account.configured ?? false,\n running,\n connected,\n lastError: account.lastError ?? null,\n selfChatMode: account.mode === \"self-chat\" || Boolean((account as Record<string, unknown>).selfChatMode),\n dmPolicy: account.dmPolicy ?? null,\n cliPath: account.cliPath ?? null,\n };\n}\n\n/**\n * Determine which workspace owns iMessage by inspecting bindings.\n * Looks for any binding with `match.channel === \"imessage\"` and `meta.imessageOwner`.\n * The agentId tells us the workspace: \"tradesupport-admin\" → \"tradesupport\", \"admin\" → default.\n */\nfunction resolveIMessageOwnerWorkspace(state: AppViewState): string | null {\n const config = state.configSnapshot?.config as Record<string, unknown> | null;\n if (!config) return null;\n const bindings = config.bindings as Array<{\n agentId: string;\n match: { channel?: string };\n meta?: { imessageOwner?: boolean };\n }> | undefined;\n if (!Array.isArray(bindings)) return null;\n const imsgBinding = bindings.find(\n (b) => b.match?.channel === \"imessage\" && b.meta?.imessageOwner,\n );\n if (!imsgBinding) return null;\n const agentId = imsgBinding.agentId;\n // Map agentId back to workspace name\n for (const ws of state.workspaces) {\n if (ws.agents.some((a) => a.id === agentId)) return ws.name;\n }\n // Fallback: derive from agent naming convention\n if (agentId === \"admin\" || agentId === \"public\") {\n const defaultWs = state.workspaces.find((ws) => ws.isDefault);\n return defaultWs?.name ?? null;\n }\n const prefix = agentId.replace(/-(admin|public)$/, \"\");\n if (prefix !== agentId) {\n const ws = state.workspaces.find((ws) => ws.name === prefix);\n return ws?.name ?? null;\n }\n return null;\n}\n\nexport function renderApp(state: AppViewState) {\n // ── Access (PIN) gating ──\n // Wait for gateway connection + access check before rendering anything\n if (state.connected && state.accessState.checked) {\n const { accessState } = state;\n\n // PINs exist but session is not authenticated → show login overlay\n if (accessState.hasPins && !accessState.authenticated) {\n return renderLoginOverlay({\n show: true,\n isFirstTime: false,\n accounts: accessState.accounts,\n error: accessState.error,\n busy: accessState.busy,\n onSubmit: (accountOrPin: string, pin?: string) => {\n if (pin != null) state.handlePinSubmit(accountOrPin, pin);\n },\n changePinMode: state.loginChangePinMode,\n onToggleChangePinMode: () => state.toggleChangePinMode(),\n changePinBusy: state.changePinBusy,\n changePinError: state.changePinError,\n changePinSuccess: state.changePinSuccess,\n onChangePin: (account, oldPin, newPin) => state.handleChangePin(account, oldPin, newPin),\n });\n }\n\n // No master PIN yet + on Setup page + not authenticated → show first-time PIN setup overlay\n // (The !authenticated check prevents this from firing on fallback when access.status fails)\n if (!accessState.hasMasterPin && !accessState.authenticated && state.setup) {\n return renderLoginOverlay({\n show: true,\n isFirstTime: true,\n accounts: [],\n error: accessState.error,\n busy: accessState.busy,\n onSubmit: (pin: string) => state.handleSetMasterPin(pin),\n });\n }\n\n // No master PIN + not authenticated + NOT on Setup → redirect to Setup to set one\n if (!accessState.hasMasterPin && !accessState.authenticated && !state.setup) {\n window.location.href = \"/setup\";\n return nothing;\n }\n }\n\n // Setup mode: render multi-step setup view (auth + WhatsApp)\n if (state.setup) {\n const whatsappChannelStatus = extractWhatsAppStatus(state.channelsSnapshot);\n const whatsappAccounts = state.channelsSnapshot?.channelAccounts?.whatsapp ?? [];\n const imsg = extractIMessageStatus(state.channelsSnapshot);\n const imessageOwnerWorkspace = resolveIMessageOwnerWorkspace(state);\n return renderSetup({\n connected: state.connected,\n assistantName: state.assistantName,\n currentStep: state.setupStep,\n // License state\n licenseKey: state.licenseKey,\n licenseBusy: state.licenseBusy,\n licenseValid: state.licenseValid,\n licenseMessage: state.licenseMessage,\n licenseTier: state.licenseTier,\n licenseDeviceId: state.licenseDeviceId,\n licenseStoredKey: state.licenseStoredKey,\n onLicenseKeyChange: (key: string) => state.handleLicenseKeyChange(key),\n onLicenseActivate: () => state.handleLicenseActivate(),\n onLicenseRemove: async () => { await state.handleLicenseRemove(); state.licenseRemoveConfirm = false; },\n licenseRemoveConfirm: state.licenseRemoveConfirm,\n onLicenseRemoveConfirm: () => { state.licenseRemoveConfirm = true; },\n onLicenseRemoveCancel: () => { state.licenseRemoveConfirm = false; },\n // Auth state\n authConnected: state.authConnected,\n authBusy: state.authBusy,\n authMessage: state.authMessage,\n authUrl: state.authUrl,\n authCodeInput: state.authCodeInput,\n authExpiresIn: state.authExpiresIn,\n // WhatsApp login flow state\n whatsappBusy: state.whatsappBusy,\n whatsappLoginMessage: state.whatsappLoginMessage,\n whatsappLoginQrDataUrl: state.whatsappLoginQrDataUrl,\n whatsappLoginConnected: state.whatsappLoginConnected,\n // Real WhatsApp channel status\n whatsappChannelStatus,\n // Multi-account WhatsApp\n whatsappAccounts,\n whatsappActiveQrAccountId: state.whatsappActiveQrAccountId,\n whatsappAccountSaving: state.whatsappAccountSaving,\n // Gateway status\n gatewayHealthy: state.gatewayHealthy,\n gatewayHealthLoading: state.gatewayHealthLoading,\n gatewayHealthMessage: state.gatewayHealthMessage,\n gatewayRestartBusy: state.gatewayRestartBusy,\n // Software update\n updateAvailable: state.updateAvailable,\n currentVersion: state.currentVersion,\n latestVersion: state.latestVersion,\n updateChecking: state.updateChecking,\n updateRunning: state.updateRunning,\n updateMessage: state.updateMessage,\n onUpdateCheck: () => state.handleUpdateCheck(),\n onUpdateRun: () => state.handleUpdateRun(),\n // Callbacks\n onStartAuth: () => state.handleAuthStart(),\n onSubmitAuthCode: (code: string) => state.handleAuthSubmitCode(code),\n onAuthCodeChange: (code: string) => state.handleAuthCodeChange(code),\n onSkipToWhatsApp: () => state.handleSkipToWhatsApp(),\n onWhatsAppRelink: async (accountId?: string) => {\n await state.handleWhatsAppStart(true, accountId);\n // Automatically wait for scan after showing QR\n if (state.whatsappLoginQrDataUrl) {\n await state.handleWhatsAppWait(accountId);\n // Refresh status after connection completes\n await loadChannels(state, true);\n state.requestUpdate();\n }\n },\n onWhatsAppReset: async (accountId?: string) => {\n // Logout first to clear all state, then start fresh\n await state.handleWhatsAppLogout(accountId);\n await state.handleWhatsAppStart(true, accountId);\n // Automatically wait for scan after showing QR\n if (state.whatsappLoginQrDataUrl) {\n await state.handleWhatsAppWait(accountId);\n // Refresh status after connection completes\n await loadChannels(state, true);\n state.requestUpdate();\n }\n },\n onRefreshStatus: async () => {\n await loadChannels(state, true);\n await state.handleGatewayHealthCheck();\n },\n onWhatsAppBack: () => {\n // Clear the QR code to go back to status dashboard\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginMessage = null;\n state.whatsappLoginConnected = null;\n state.whatsappActiveQrAccountId = null;\n state.requestUpdate();\n loadChannels(state, true);\n },\n onRestartGateway: () => state.handleGatewayRestart(),\n onRemoveWhatsAppAccount: (accountId) => state.handleRemoveWhatsAppAccount(accountId),\n // Workspaces\n workspaces: state.workspaces,\n workspacesLoading: state.workspacesLoading,\n workspacesError: state.workspacesError,\n addingWorkspace: state.addingWorkspace,\n newWorkspaceName: state.newWorkspaceName,\n newWorkspacePath: state.newWorkspacePath,\n workspaceSaving: state.workspaceSaving,\n workspaceRemoveConfirm: state.workspaceRemoveConfirm,\n newWorkspacePin: state.newWorkspacePin,\n onSetNewWorkspacePin: (pin: string) => { state.newWorkspacePin = pin; },\n onWorkspaceCreate: async (name, workspacePath) => {\n const pin = state.newWorkspacePin;\n await state.handleWorkspaceCreate(name, workspacePath);\n // Set the account PIN after workspace creation\n if (pin.match(/^\\d{4,6}$/)) {\n await setAccountPin(state, name, pin);\n state.newWorkspacePin = \"\";\n }\n },\n onWorkspaceRemove: (name) => state.handleWorkspaceRemove(name),\n onSetAddingWorkspace: (adding) => { state.addingWorkspace = adding; },\n onSetNewWorkspaceName: (name) => { state.newWorkspaceName = name; },\n onSetNewWorkspacePath: (path) => { state.newWorkspacePath = path; },\n onSetWorkspaceRemoveConfirm: (name) => { state.workspaceRemoveConfirm = name; },\n // Workspace rename\n renamingWorkspace: state.renamingWorkspace,\n renameWorkspaceName: state.renameWorkspaceName,\n onWorkspaceRenameStart: () => state.handleWorkspaceRenameStart(),\n onWorkspaceRenameCancel: () => state.handleWorkspaceRenameCancel(),\n onWorkspaceRename: (name: string, displayName: string) => state.handleWorkspaceRename(name, displayName),\n // WhatsApp DM policy — read from the selected workspace's account\n whatsappDmPolicy: (() => {\n const ws = getSelectedWorkspaceInfo(state);\n const id = ws?.whatsappAccountId;\n const acct = id ? whatsappAccounts.find((a) => a.accountId === id) : whatsappAccounts[0];\n return acct?.dmPolicy ?? null;\n })(),\n onWhatsAppDmToggle: async () => {\n const ws = getSelectedWorkspaceInfo(state);\n const id = ws?.whatsappAccountId;\n const account = id ? whatsappAccounts.find((a) => a.accountId === id) : whatsappAccounts[0];\n if (!account) return;\n const isEnabled = account.dmPolicy != null && account.dmPolicy !== \"disabled\";\n const newPolicy = isEnabled ? \"disabled\" : \"open\";\n // \"open\" requires allowFrom: [\"*\"] per schema validation\n const policyFields = newPolicy === \"open\"\n ? { dmPolicy: newPolicy, allowFrom: [\"*\"] }\n : { dmPolicy: newPolicy };\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const cfg = snapshot.config as Record<string, unknown>;\n const wa = (cfg?.channels as Record<string, unknown>)?.whatsapp as Record<string, unknown> | undefined;\n const accts = (wa?.accounts ?? {}) as Record<string, Record<string, unknown>>;\n // Write to per-account path if it exists, otherwise root\n const patch = accts[account.accountId]\n ? { channels: { whatsapp: { accounts: { [account.accountId]: policyFields } } } }\n : { channels: { whatsapp: policyFields } };\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify(patch),\n baseHash: snapshot.hash,\n note: `WhatsApp DM policy → ${newPolicy}`,\n skipRestart: true,\n });\n // Refresh channel status to pick up the new dmPolicy\n await loadChannels(state, false);\n } catch (err) {\n console.error(\"DM toggle failed:\", err);\n }\n },\n // WhatsApp per-account model selector\n whatsappModel: (() => {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return null;\n const publicAgent = ws.agents.find((a) => a.id.endsWith(\"-public\") || a.id === \"public\");\n if (!publicAgent) return null;\n const config = state.configSnapshot?.config as Record<string, unknown> | null;\n const agentsList = (config?.agents as Record<string, unknown>)?.list as\n | Array<{ id: string; model?: string | { primary?: string } }>\n | undefined;\n if (!Array.isArray(agentsList)) return null;\n const entry = agentsList.find((a) => a.id === publicAgent.id);\n if (!entry?.model) return null;\n const primary = typeof entry.model === \"string\" ? entry.model : entry.model.primary;\n return primary?.trim() || null;\n })(),\n whatsappModelCatalog: (state as unknown as { chatModelCatalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }> }).chatModelCatalog ?? [],\n onWhatsAppModelChange: async (modelRef: string) => {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return;\n const publicAgent = ws.agents.find((a) => a.id.endsWith(\"-public\") || a.id === \"public\");\n if (!publicAgent) return;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const cfg = snapshot.config as Record<string, unknown>;\n const agents = (cfg?.agents ?? {}) as Record<string, unknown>;\n const list = (Array.isArray(agents.list) ? [...agents.list] : []) as Array<Record<string, unknown>>;\n\n const idx = list.findIndex((a) => a.id === publicAgent.id);\n if (modelRef) {\n // Set per-agent model override\n if (idx >= 0) {\n list[idx] = { ...list[idx], model: modelRef };\n } else {\n list.push({ id: publicAgent.id, model: modelRef });\n }\n } else {\n // Remove override (revert to default)\n if (idx >= 0) {\n const { model: _, ...rest } = list[idx];\n if (Object.keys(rest).length <= 1) {\n // Only id left — remove entry entirely\n list.splice(idx, 1);\n } else {\n list[idx] = rest;\n }\n }\n }\n\n const patch = list.length > 0\n ? { agents: { list } }\n : { agents: { list: null } };\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify(patch),\n baseHash: snapshot.hash,\n note: `Public agent model → ${modelRef || \"default\"}`,\n skipRestart: true,\n });\n // Refresh config snapshot so the selector updates\n state.configSnapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n } catch (err) {\n console.error(\"Model change failed:\", err);\n }\n },\n whatsappThinkingLevel: (() => {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return null;\n const publicAgent = ws.agents.find((a) => a.id.endsWith(\"-public\") || a.id === \"public\");\n if (!publicAgent) return null;\n const config = state.configSnapshot?.config as Record<string, unknown> | null;\n const agentsList = (config?.agents as Record<string, unknown>)?.list as\n | Array<{ id: string; thinkingLevel?: string }>\n | undefined;\n if (!Array.isArray(agentsList)) return null;\n const entry = agentsList.find((a) => a.id === publicAgent.id);\n return entry?.thinkingLevel?.trim() || null;\n })(),\n onWhatsAppThinkingChange: async (level: string) => {\n const ws = getSelectedWorkspaceInfo(state);\n if (!ws) return;\n const publicAgent = ws.agents.find((a) => a.id.endsWith(\"-public\") || a.id === \"public\");\n if (!publicAgent) return;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const cfg = snapshot.config as Record<string, unknown>;\n const agents = (cfg?.agents ?? {}) as Record<string, unknown>;\n const list = (Array.isArray(agents.list) ? [...agents.list] : []) as Array<Record<string, unknown>>;\n\n const idx = list.findIndex((a) => a.id === publicAgent.id);\n const effectiveLevel = level === \"off\" ? undefined : level;\n if (effectiveLevel) {\n if (idx >= 0) {\n list[idx] = { ...list[idx], thinkingLevel: effectiveLevel };\n } else {\n list.push({ id: publicAgent.id, thinkingLevel: effectiveLevel });\n }\n } else {\n // Remove override (revert to default)\n if (idx >= 0) {\n const { thinkingLevel: _, ...rest } = list[idx];\n if (Object.keys(rest).length <= 1) {\n list.splice(idx, 1);\n } else {\n list[idx] = rest;\n }\n }\n }\n\n const patch = list.length > 0\n ? { agents: { list } }\n : { agents: { list: null } };\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify(patch),\n baseHash: snapshot.hash,\n note: `Public agent thinking → ${effectiveLevel || \"default\"}`,\n skipRestart: true,\n });\n state.configSnapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n } catch (err) {\n console.error(\"Thinking change failed:\", err);\n }\n },\n // WhatsApp group chat — read from config snapshot\n whatsappGroupPolicy: (() => {\n const config = state.configSnapshot?.config as Record<string, unknown> | null;\n const wa = (config?.channels as Record<string, unknown>)?.whatsapp as Record<string, unknown> | undefined;\n const ws = getSelectedWorkspaceInfo(state);\n const accountId = ws?.whatsappAccountId;\n const accts = (wa?.accounts ?? {}) as Record<string, Record<string, unknown>>;\n const acctCfg = accountId ? accts[accountId] : undefined;\n const policy = (acctCfg?.groupPolicy ?? wa?.groupPolicy ?? \"allowlist\") as string;\n return policy as \"open\" | \"disabled\" | \"allowlist\";\n })(),\n whatsappGroupRequireMention: (() => {\n const config = state.configSnapshot?.config as Record<string, unknown> | null;\n const wa = (config?.channels as Record<string, unknown>)?.whatsapp as Record<string, unknown> | undefined;\n const ws = getSelectedWorkspaceInfo(state);\n const accountId = ws?.whatsappAccountId;\n const accts = (wa?.accounts ?? {}) as Record<string, Record<string, unknown>>;\n const acctCfg = accountId ? accts[accountId] : undefined;\n const groups = (acctCfg?.groups ?? wa?.groups ?? {}) as Record<string, Record<string, unknown>>;\n const wildcard = groups[\"*\"];\n return wildcard?.requireMention !== false;\n })(),\n onWhatsAppGroupToggle: async () => {\n const ws = getSelectedWorkspaceInfo(state);\n const accountId = ws?.whatsappAccountId;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const cfg = snapshot.config as Record<string, unknown>;\n const wa = ((cfg?.channels as Record<string, unknown>)?.whatsapp ?? {}) as Record<string, unknown>;\n const accts = (wa.accounts ?? {}) as Record<string, Record<string, unknown>>;\n const acctCfg = accountId ? accts[accountId] : undefined;\n const currentPolicy = (acctCfg?.groupPolicy ?? wa.groupPolicy ?? \"allowlist\") as string;\n const enabling = currentPolicy === \"disabled\" || currentPolicy === \"allowlist\";\n const newPolicy = enabling ? \"open\" : \"disabled\";\n // When enabling, ensure wildcard groups entry exists so all groups are allowed\n const groupsPatch = enabling ? { \"*\": {} } : undefined;\n const policyFields: Record<string, unknown> = { groupPolicy: newPolicy };\n if (groupsPatch) policyFields.groups = groupsPatch;\n const patch = acctCfg\n ? { channels: { whatsapp: { accounts: { [accountId!]: policyFields } } } }\n : { channels: { whatsapp: policyFields } };\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify(patch),\n baseHash: snapshot.hash,\n note: `WhatsApp groups → ${newPolicy}`,\n skipRestart: true,\n });\n state.configSnapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n } catch (err) {\n console.error(\"Group toggle failed:\", err);\n }\n },\n onWhatsAppGroupMentionChange: async (requireMention: boolean) => {\n const ws = getSelectedWorkspaceInfo(state);\n const accountId = ws?.whatsappAccountId;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const cfg = snapshot.config as Record<string, unknown>;\n const wa = ((cfg?.channels as Record<string, unknown>)?.whatsapp ?? {}) as Record<string, unknown>;\n const accts = (wa.accounts ?? {}) as Record<string, Record<string, unknown>>;\n const acctCfg = accountId ? accts[accountId] : undefined;\n const groupsField = { \"*\": { requireMention } };\n const patch = acctCfg\n ? { channels: { whatsapp: { accounts: { [accountId!]: { groups: groupsField } } } } }\n : { channels: { whatsapp: { groups: groupsField } } };\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify(patch),\n baseHash: snapshot.hash,\n note: `WhatsApp group mention → ${requireMention ? \"when mentioned\" : \"always\"}`,\n skipRestart: true,\n });\n state.configSnapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n } catch (err) {\n console.error(\"Group mention change failed:\", err);\n }\n },\n // WhatsApp settings modal\n whatsappSettingsOpen: state.whatsappSettingsOpen ?? false,\n onWhatsAppSettingsOpen: () => { state.whatsappSettingsOpen = true; },\n onWhatsAppSettingsClose: () => { state.whatsappSettingsOpen = false; },\n // iMessage state\n imessageConfigured: imsg.configured,\n imessageRunning: imsg.running,\n imessageConnected: imsg.connected,\n imessageLastError: imsg.lastError,\n imessageSelfChatMode: imsg.selfChatMode,\n imessageCliPath: imsg.cliPath,\n imessageEnabling: state.imessageEnabling,\n imessageEnableConfirm: state.imessageEnableConfirm,\n imessageOwnerWorkspace,\n onIMessageEnable: () => { state.imessageEnableConfirm = true; },\n onIMessageEnableConfirm: async () => {\n state.imessageEnabling = true;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const config = snapshot.config as Record<string, unknown> | null;\n const existingBindings = (config?.bindings ?? []) as Array<{\n agentId: string;\n match: { channel?: string; peer?: { kind: string; id: string }; accountId?: string };\n meta?: Record<string, unknown>;\n }>;\n\n // Resolve the selected workspace's agent IDs\n const ws = getSelectedWorkspaceInfo(state);\n const adminAgent = ws?.agents.find((a) => a.id.endsWith(\"-admin\") || a.id === \"admin\");\n const adminAgentId = adminAgent?.id ?? \"admin\";\n\n // Strip ALL existing iMessage bindings (only one business owns iMessage)\n const nonImessageBindings = existingBindings.filter(\n (b) => b.match?.channel !== \"imessage\",\n );\n\n // Create iMessage binding: self-chat → admin agent only.\n // No public agent binding — iMessage is self-chat only, no third-party DMs.\n const imessageBindings = [\n {\n agentId: adminAgentId,\n match: { channel: \"imessage\", peer: { kind: \"dm\", id: \"__self__\" } },\n meta: { imessageOwner: true },\n },\n ];\n\n const updatedBindings = [...nonImessageBindings, ...imessageBindings];\n\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify({\n channels: {\n imessage: {\n selfChatMode: true,\n dmPolicy: \"disabled\",\n allowFrom: [\"*\"],\n },\n },\n bindings: updatedBindings,\n }),\n baseHash: snapshot.hash,\n note: \"Enable iMessage (self-chat) for \" + (ws?.name ?? \"default\"),\n });\n state.imessageEnableConfirm = false;\n // Gateway will restart after config.patch; wait then refresh\n setTimeout(() => {\n void Promise.all([loadChannels(state, true), loadConfig(state)]).then(() => {\n state.imessageEnabling = false;\n });\n }, 3000);\n } catch {\n state.imessageEnabling = false;\n }\n },\n onIMessageEnableCancel: () => { state.imessageEnableConfirm = false; },\n onIMessageProbe: async () => {\n state.imessageEnabling = true;\n state.requestUpdate();\n try {\n await loadChannels(state, true);\n } finally {\n state.imessageEnabling = false;\n }\n },\n onIMessageDisconnect: async () => {\n state.imessageEnabling = true;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const config = snapshot.config as Record<string, unknown> | null;\n const existingBindings = (config?.bindings ?? []) as Array<{\n agentId: string;\n match: { channel?: string; peer?: { kind: string; id: string }; accountId?: string };\n meta?: Record<string, unknown>;\n }>;\n // Remove all iMessage bindings\n const nonImessageBindings = existingBindings.filter(\n (b) => b.match?.channel !== \"imessage\",\n );\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify({\n channels: {\n imessage: {\n selfChatMode: false,\n dmPolicy: \"disabled\",\n },\n },\n bindings: nonImessageBindings,\n }),\n baseHash: snapshot.hash,\n note: \"Disconnect iMessage\",\n });\n state.imessageEnableConfirm = false;\n setTimeout(() => {\n void Promise.all([loadChannels(state, true), loadConfig(state)]).then(() => {\n state.imessageEnabling = false;\n });\n }, 3000);\n } catch {\n state.imessageEnabling = false;\n }\n },\n onIMessageReassign: async () => {\n // Same as enable but explicitly for reassigning to current workspace\n state.imessageEnabling = true;\n try {\n const snapshot = await state.client!.request<ConfigSnapshot>(\"config.get\");\n const config = snapshot.config as Record<string, unknown> | null;\n const existingBindings = (config?.bindings ?? []) as Array<{\n agentId: string;\n match: { channel?: string; peer?: { kind: string; id: string }; accountId?: string };\n meta?: Record<string, unknown>;\n }>;\n const ws = getSelectedWorkspaceInfo(state);\n const adminAgent = ws?.agents.find((a) => a.id.endsWith(\"-admin\") || a.id === \"admin\");\n const adminAgentId = adminAgent?.id ?? \"admin\";\n const nonImessageBindings = existingBindings.filter(\n (b) => b.match?.channel !== \"imessage\",\n );\n const imessageBindings = [\n {\n agentId: adminAgentId,\n match: { channel: \"imessage\", peer: { kind: \"dm\", id: \"__self__\" } },\n meta: { imessageOwner: true },\n },\n ];\n await state.client!.request(\"config.patch\", {\n raw: JSON.stringify({\n channels: {\n imessage: {\n selfChatMode: true,\n dmPolicy: \"disabled\",\n allowFrom: [\"*\"],\n },\n },\n bindings: [...nonImessageBindings, ...imessageBindings],\n }),\n baseHash: snapshot.hash,\n note: \"Reassign iMessage to \" + (ws?.name ?? \"default\"),\n });\n state.imessageEnableConfirm = false;\n setTimeout(() => {\n void Promise.all([loadChannels(state, true), loadConfig(state)]).then(() => {\n state.imessageEnabling = false;\n });\n }, 3000);\n } catch {\n state.imessageEnabling = false;\n }\n },\n // Info modals\n infoModalOpen: state.infoModalOpen,\n onInfoModalOpen: (id: string) => { state.infoModalOpen = id; },\n onInfoModalClose: () => { state.infoModalOpen = null; },\n // API Keys management (global, admin-only)\n isMaster: state.accessState.master,\n apiKeyProviders: state.apiKeyProviders,\n apiKeyModalOpen: state.apiKeyModalOpen,\n apiKeyBusy: state.apiKeyBusy,\n apiKeyError: state.apiKeyError,\n apiKeySuccess: state.apiKeySuccess,\n onApiKeyModalOpen: () => { state.apiKeyModalOpen = true; state.apiKeyError = null; state.apiKeySuccess = null; },\n onApiKeyModalClose: () => { state.apiKeyModalOpen = false; state.apiKeyError = null; state.apiKeySuccess = null; },\n onApiKeySave: async (provider: string, apiKey: string) => {\n state.apiKeyBusy = true;\n state.apiKeyError = null;\n state.apiKeySuccess = null;\n try {\n await saveApiKey(state.client!, provider, apiKey);\n state.apiKeySuccess = `${provider} key saved`;\n try { state.apiKeyProviders = await loadApiKeys(state.client!); } catch { /* ignore */ }\n if (provider === \"anthropic\") {\n await state.handleAuthStatusCheck();\n }\n } catch (err) {\n state.apiKeyError = err instanceof Error ? err.message : \"Failed to save key\";\n } finally {\n state.apiKeyBusy = false;\n }\n },\n onApiKeyRemove: async (provider: string) => {\n state.apiKeyBusy = true;\n state.apiKeyError = null;\n state.apiKeySuccess = null;\n try {\n await removeApiKey(state.client!, provider);\n state.apiKeySuccess = `${provider} key removed`;\n try { state.apiKeyProviders = await loadApiKeys(state.client!); } catch { /* ignore */ }\n } catch (err) {\n state.apiKeyError = err instanceof Error ? err.message : \"Failed to remove key\";\n } finally {\n state.apiKeyBusy = false;\n }\n },\n // Auth step API key fallback\n authApiKeyMode: state.authApiKeyMode,\n authApiKeyInput: state.authApiKeyInput,\n authApiKeyBusy: state.authApiKeyBusy,\n authApiKeyError: state.authApiKeyError,\n onAuthApiKeyToggle: () => { state.authApiKeyMode = !state.authApiKeyMode; state.authApiKeyError = null; },\n onAuthApiKeyChange: (key: string) => { state.authApiKeyInput = key; },\n onAuthApiKeySubmit: async () => {\n const key = state.authApiKeyInput.trim();\n if (!key) return;\n state.authApiKeyBusy = true;\n state.authApiKeyError = null;\n try {\n await saveApiKey(state.client!, \"anthropic\", key);\n await state.handleAuthStatusCheck();\n state.authApiKeyMode = false;\n state.authApiKeyInput = \"\";\n } catch (err) {\n state.authApiKeyError = err instanceof Error ? err.message : \"Failed to save API key\";\n } finally {\n state.authApiKeyBusy = false;\n }\n },\n // Account PIN management\n accountHasPin: (() => {\n const ws = state.selectedWorkspace ?? state.workspaces[0]?.name;\n return ws ? state.accessState.accounts.some((a) => a.id === ws) : false;\n })(),\n accountPinModalOpen: state.accountPinModalOpen,\n accountPinBusy: state.accountPinBusy,\n accountPinError: state.accountPinError,\n accountPinSuccess: state.accountPinSuccess,\n onAccountPinModalOpen: () => { state.accountPinModalOpen = true; state.accountPinError = null; state.accountPinSuccess = null; },\n onAccountPinModalClose: () => { state.accountPinModalOpen = false; state.accountPinError = null; state.accountPinSuccess = null; },\n onAccountPinSave: (oldPin: string | null, newPin: string) => {\n const ws = state.selectedWorkspace ?? state.workspaces[0]?.name;\n if (ws) state.handleAccountPinSave(ws, oldPin, newPin);\n },\n // Workspace selector in the nav bar\n wsProps: buildSetupWorkspaceNavProps(state),\n });\n }\n\n // Files page: standalone dark page (same style as setup)\n if (state.filesPage) {\n const filesAgentId = resolveFilesAgentId(state);\n return renderFiles({\n connected: state.connected,\n wsProps: buildWorkspaceNavProps(state),\n loading: state.filesLoading,\n tree: state.filesTree,\n root: state.filesRoot,\n error: state.filesError,\n selectedPath: state.filesSelectedPath,\n selectedPaths: state.filesSelectedPaths,\n previewContent: state.filesPreviewContent,\n previewLoading: state.filesPreviewLoading,\n previewBinary: state.filesPreviewBinary,\n previewSize: state.filesPreviewSize,\n expandedDirs: state.filesExpandedDirs,\n message: state.filesMessage,\n uploadBusy: state.filesUploadBusy,\n onRefresh: () => loadFileTree(state, filesAgentId),\n onSelectFile: (path) => selectFile(state, path, filesAgentId),\n onToggleSelectFile: (path) => toggleSelectFile(state, path, filesAgentId),\n onToggleDir: (path) => toggleDirectory(state, path),\n onUpload: (dirPath, files) => uploadFiles(state, dirPath, files, filesAgentId),\n onDownload: (path) => downloadFile(state, path, filesAgentId),\n onBulkDownload: () => bulkDownloadFiles(state, filesAgentId),\n onDelete: (path) => deleteFile(state, path, filesAgentId),\n onMove: (from, to) => moveFile(state, from, to, filesAgentId),\n onMoveToDir: (filePath, targetDir) => moveFileToDir(state, filePath, targetDir, filesAgentId),\n });\n }\n\n // Browser page: standalone dark page (same style as setup)\n if (state.browserPage) {\n return renderBrowserViewer({\n connected: state.connected,\n active: state.browserScreencastActive,\n loading: state.browserLoading,\n error: state.browserError,\n inputMode: state.browserInputMode,\n handoffPending: state.browserHandoffPending,\n handoffReason: state.browserHandoffReason,\n onStart: () => startBrowserScreencast(state),\n onStop: () => stopBrowserScreencast(state),\n onToggleInput: () => toggleInputMode(state),\n onCompleteHandoff: () => completeHandoff(state),\n onCanvasMouseDown: (e: MouseEvent) => {\n const canvas = e.target as HTMLCanvasElement;\n const rect = canvas.getBoundingClientRect();\n const renderer = getCanvasRenderer();\n const coords = renderer.translateCoordinates(e.clientX - rect.left, e.clientY - rect.top);\n sendMouseInput(state, \"mousePressed\", coords.x, coords.y,\n e.button === 2 ? \"right\" : e.button === 1 ? \"middle\" : \"left\");\n },\n onCanvasMouseUp: (e: MouseEvent) => {\n const canvas = e.target as HTMLCanvasElement;\n const rect = canvas.getBoundingClientRect();\n const renderer = getCanvasRenderer();\n const coords = renderer.translateCoordinates(e.clientX - rect.left, e.clientY - rect.top);\n sendMouseInput(state, \"mouseReleased\", coords.x, coords.y);\n },\n onCanvasMouseMove: (e: MouseEvent) => {\n const renderer = getCanvasRenderer();\n if (renderer.shouldThrottleMouseMove()) return;\n const canvas = e.target as HTMLCanvasElement;\n const rect = canvas.getBoundingClientRect();\n const coords = renderer.translateCoordinates(e.clientX - rect.left, e.clientY - rect.top);\n sendMouseInput(state, \"mouseMoved\", coords.x, coords.y);\n },\n onCanvasKeyDown: (e: KeyboardEvent) => {\n let modifiers = 0;\n if (e.altKey) modifiers |= 1;\n if (e.ctrlKey) modifiers |= 2;\n if (e.metaKey) modifiers |= 4;\n if (e.shiftKey) modifiers |= 8;\n sendKeyInput(state, \"keyDown\", e.key, { code: e.code, modifiers: modifiers || undefined });\n if (e.key.length === 1) sendKeyInput(state, \"char\", e.key, { text: e.key });\n },\n onCanvasKeyUp: (e: KeyboardEvent) => {\n sendKeyInput(state, \"keyUp\", e.key, { code: e.code });\n },\n });\n }\n\n // Admins page: standalone dark page (same style as setup)\n if (state.adminsPage) {\n const adminAgentId = resolveAdminAgentId(state);\n const waAccountId = resolveWhatsAppAccountId(state);\n return renderAdminsPage({\n connected: state.connected,\n wsProps: buildWorkspaceNavProps(state),\n loading: state.adminsLoading,\n saving: state.adminsSaving,\n phones: state.adminPhones,\n error: state.adminsError,\n newPhone: state.adminsNewPhone,\n onRefresh: () => loadAdmins(state, adminAgentId),\n onAdd: (phone) => {\n void addAdmin(state, phone, adminAgentId, waAccountId).then(() => {\n if (!state.adminsError) state.adminsNewPhone = \"\";\n });\n },\n onRemove: (phone) => removeAdmin(state, phone, adminAgentId, waAccountId),\n onNewPhoneChange: (value) => state.handleAdminsNewPhoneChange(value),\n });\n }\n\n // Customers page: standalone dark page (same style as admins)\n if (state.customersPage) {\n const wsName = resolveWorkspaceName(state);\n return renderCustomersPage({\n connected: state.connected,\n wsProps: buildWorkspaceNavProps(state),\n loading: state.customersLoading,\n saving: state.customersSaving,\n records: state.customersRecords,\n error: state.customersError,\n searchQuery: state.customersSearchQuery,\n editingId: state.customersEditingId,\n showAddForm: state.customersShowAddForm,\n newRecordPhone: state.customersNewPhone,\n newRecordName: state.customersNewName,\n onSearch: (query) => (state.customersSearchQuery = query),\n onSearchSubmit: () => loadCustomers(state, wsName),\n onAdd: (phone, name) => addCustomer(state, phone, name, wsName),\n onDelete: (id) => deleteCustomer(state, id, wsName),\n onSetField: (id, key, value) => setCustomerField(state, id, key, value, wsName),\n onDeleteField: (id, key) => deleteCustomerField(state, id, key, wsName),\n onToggleExpand: (id) => {\n state.customersEditingId = state.customersEditingId === id ? null : id;\n },\n onShowAddForm: () => (state.customersShowAddForm = true),\n onCancelAddForm: () => {\n state.customersShowAddForm = false;\n state.customersNewPhone = \"\";\n state.customersNewName = \"\";\n },\n onNewRecordPhoneChange: (value) => state.handleCustomersNewPhoneChange(value),\n onNewRecordNameChange: (value) => state.handleCustomersNewNameChange(value),\n onRefresh: () => loadCustomers(state, wsName),\n });\n }\n\n // Chat page: standalone dark page\n if (state.chatPage) {\n const chatDisabledReason = state.connected ? null : \"Disconnected from gateway.\";\n const assistantAvatarUrl = resolveAssistantAvatarUrl(state);\n const chatAvatarUrl = state.chatAvatarUrl ?? assistantAvatarUrl ?? null;\n return renderChatPage({\n connected: state.connected,\n wsProps: buildWorkspaceNavProps(state),\n sessionKey: state.sessionKey,\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatAttachments = [];\n state.chatStream = null;\n (state as unknown as { chatStreamStartedAt: number | null }).chatStreamStartedAt = null;\n state.chatRunId = null;\n state.chatQueue = [];\n (state as unknown as { resetToolStream: () => void }).resetToolStream();\n (state as unknown as { resetChatScroll: () => void }).resetChatScroll();\n state.applySettings({\n ...state.settings,\n sessionKey: next,\n lastActiveSessionKey: next,\n });\n void state.loadAssistantIdentity();\n void loadChatHistory(state);\n void refreshChatAvatar(state);\n },\n thinkingLevel: state.chatThinkingLevel,\n showThinking: state.settings.chatShowThinking ?? false,\n modelProvider: (state as unknown as { chatModelProvider: string | null }).chatModelProvider,\n model: (state as unknown as { chatModel: string | null }).chatModel,\n modelCatalog: (state as unknown as { chatModelCatalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }> }).chatModelCatalog,\n onModelChange: (modelRef: string) => {\n void patchSession(state, state.sessionKey, { model: modelRef }).then(() => void loadChatHistory(state));\n },\n onThinkingLevelChange: (level: string) => {\n void patchSession(state, state.sessionKey, { thinkingLevel: level === \"off\" ? null : level }).then(() => void loadChatHistory(state));\n },\n verboseLevel: (state as unknown as { chatVerboseLevel: string | null }).chatVerboseLevel,\n fillerEnabled: (state as unknown as { chatFillerEnabled: boolean | null }).chatFillerEnabled,\n onVerboseChange: (level: string) => {\n void patchSession(state, state.sessionKey, { verboseLevel: level === \"off\" ? null : level }).then(() => void loadChatHistory(state));\n },\n onFillerChange: (enabled: boolean) => {\n void patchSession(state, state.sessionKey, { fillerEnabled: enabled }).then(() => void loadChatHistory(state));\n },\n loading: state.chatLoading,\n sending: state.chatSending,\n compactionStatus: (state as unknown as { compactionStatus: unknown }).compactionStatus as import(\"./views/chat\").CompactionIndicatorStatus | null,\n assistantAvatarUrl: chatAvatarUrl,\n messages: state.chatMessages,\n toolMessages: state.chatToolMessages,\n stream: state.chatStream,\n streamStartedAt: (state as unknown as { chatStreamStartedAt: number | null }).chatStreamStartedAt,\n draft: state.chatMessage,\n queue: state.chatQueue,\n canSend: state.connected,\n disabledReason: chatDisabledReason,\n error: state.lastError,\n sessions: state.sessionsResult,\n focusMode: false,\n onRefresh: () => {\n (state as unknown as { resetToolStream: () => void }).resetToolStream();\n return Promise.all([loadChatHistory(state), refreshChatAvatar(state)]);\n },\n onToggleFocusMode: () => {},\n onChatScroll: (event) => (state as unknown as { handleChatScroll: (e: Event) => void }).handleChatScroll(event),\n nearBottom: state.chatUserNearBottom,\n onDraftChange: (next) => (state.chatMessage = next),\n attachments: state.chatAttachments,\n onAttachmentsChange: (next) => (state.chatAttachments = next),\n onSend: () => (state as unknown as { handleSendChat: () => Promise<void> }).handleSendChat(),\n canAbort: Boolean(state.chatRunId),\n onAbort: () => void (state as unknown as { handleAbortChat: () => Promise<void> }).handleAbortChat(),\n onQueueRemove: (id) => (state as unknown as { removeQueuedMessage: (id: string) => void }).removeQueuedMessage(id),\n onNewSession: () =>\n (state as unknown as { handleSendChat: (msg?: string, opts?: { restoreDraft?: boolean }) => Promise<void> }).handleSendChat(\"/new\", { restoreDraft: true }),\n sidebarOpen: (state as unknown as { sidebarOpen: boolean }).sidebarOpen,\n sidebarContent: (state as unknown as { sidebarContent: string | null }).sidebarContent,\n sidebarError: (state as unknown as { sidebarError: string | null }).sidebarError,\n splitRatio: (state as unknown as { splitRatio: number }).splitRatio,\n onOpenSidebar: (content: string) => (state as unknown as { handleOpenSidebar: (c: string) => void }).handleOpenSidebar(content),\n onCloseSidebar: () => (state as unknown as { handleCloseSidebar: () => void }).handleCloseSidebar(),\n onSplitRatioChange: (ratio: number) => (state as unknown as { handleSplitRatioChange: (r: number) => void }).handleSplitRatioChange(ratio),\n assistantName: state.assistantName,\n assistantAvatar: state.assistantAvatar,\n });\n }\n\n // Advanced page: standalone dark page with tabs\n if (state.advancedPage) {\n return renderAdvancedPage({\n connected: state.connected,\n wsProps: buildWorkspaceNavProps(state),\n activeTab: state.advancedTab as AdvancedTab,\n onTabChange: (tab) => {\n (state as unknown as { advancedTab: string }).advancedTab = tab;\n // Trigger data load for newly selected tab\n if (tab === \"cron\") void state.loadCron();\n if (tab === \"skills\") void loadSkills(state, { clearMessages: true });\n if (tab === \"logs\") {\n const subTab = (state as unknown as { logsSubTab: string }).logsSubTab;\n if (subTab === \"session\") {\n void loadSessionLogs(state as unknown as Parameters<typeof loadSessionLogs>[0], { reset: true });\n } else {\n void loadLogs(state, { reset: true });\n }\n }\n },\n cronProps: {\n loading: state.cronLoading,\n status: state.cronStatus,\n jobs: state.cronJobs,\n error: state.cronError,\n busy: state.cronBusy,\n form: state.cronForm,\n channels: state.channelsSnapshot?.channelMeta?.length\n ? state.channelsSnapshot.channelMeta.map((entry) => entry.id)\n : state.channelsSnapshot?.channelOrder ?? [],\n channelLabels: state.channelsSnapshot?.channelLabels ?? {},\n channelMeta: state.channelsSnapshot?.channelMeta ?? [],\n agentIds: (() => {\n const ws = getSelectedWorkspaceInfo(state);\n return ws?.agents?.map((a) => a.id) ?? [];\n })(),\n runsJobId: state.cronRunsJobId,\n runs: state.cronRuns,\n newEventModalOpen: state.cronNewEventModal,\n onNewEventModalOpen: () => { state.cronNewEventModal = true; },\n onNewEventModalClose: () => { state.cronNewEventModal = false; },\n detailJobId: state.cronDetailJobId,\n onDetailOpen: (job) => { state.cronDetailJobId = job.id; loadCronRuns(state, job.id); },\n onDetailClose: () => { state.cronDetailJobId = null; },\n onFormChange: (patch) => (state.cronForm = { ...state.cronForm, ...patch }),\n onRefresh: () => state.loadCron(),\n onAdd: () => { void addCronJob(state).then(() => { state.cronNewEventModal = false; }); },\n onToggle: (job, enabled) => toggleCronJob(state, job, enabled),\n onRun: (job) => runCronJob(state, job),\n onRemove: (job) => removeCronJob(state, job),\n onLoadRuns: (jobId) => loadCronRuns(state, jobId),\n },\n skillsProps: {\n loading: state.skillsLoading,\n report: state.skillsReport,\n error: state.skillsError,\n filter: state.skillsFilter,\n edits: state.skillEdits,\n messages: state.skillMessages,\n busyKey: state.skillsBusyKey,\n onFilterChange: (next) => (state.skillsFilter = next),\n onRefresh: () => loadSkills(state, { clearMessages: true }),\n onToggle: (key, enabled) => updateSkillEnabled(state, key, enabled),\n onEdit: (key, value) => updateSkillEdit(state, key, value),\n onSaveKey: (key) => saveSkillApiKey(state, key),\n onInstall: (skillKey, name, installId) =>\n installSkill(state, skillKey, name, installId),\n },\n logsProps: {\n logsSubTab: (state as unknown as { logsSubTab: \"system\" | \"session\" }).logsSubTab,\n onSubTabChange: (tab) => {\n (state as unknown as { logsSubTab: \"system\" | \"session\" }).logsSubTab = tab;\n if (tab === \"session\") {\n void loadSessionLogs(state as unknown as Parameters<typeof loadSessionLogs>[0], { reset: true });\n } else {\n void loadLogs(state, { reset: true });\n }\n },\n sessionLogsProps: {\n loading: (state as unknown as { sessionLogsLoading: boolean }).sessionLogsLoading,\n error: (state as unknown as { sessionLogsError: string | null }).sessionLogsError,\n entries: (state as unknown as { sessionLogsEntries: SessionTranscriptEntry[] }).sessionLogsEntries,\n agents: (state as unknown as { sessionLogsAgents: string[] }).sessionLogsAgents,\n filterText: (state as unknown as { sessionLogsFilterText: string }).sessionLogsFilterText,\n typeFilters: (state as unknown as { sessionLogsTypeFilters: Record<SessionLogType, boolean> }).sessionLogsTypeFilters,\n agentFilters: (state as unknown as { sessionLogsAgentFilters: Record<string, boolean> }).sessionLogsAgentFilters,\n autoFollow: (state as unknown as { sessionLogsAutoFollow: boolean }).sessionLogsAutoFollow,\n onFilterTextChange: (next) => ((state as unknown as { sessionLogsFilterText: string }).sessionLogsFilterText = next),\n onTypeToggle: (type, enabled) => {\n const s = state as unknown as { sessionLogsTypeFilters: Record<string, boolean> };\n s.sessionLogsTypeFilters = { ...s.sessionLogsTypeFilters, [type]: enabled };\n },\n onAgentToggle: (agent, enabled) => {\n const s = state as unknown as { sessionLogsAgentFilters: Record<string, boolean> };\n s.sessionLogsAgentFilters = { ...s.sessionLogsAgentFilters, [agent]: enabled };\n },\n onToggleAutoFollow: (next) => ((state as unknown as { sessionLogsAutoFollow: boolean }).sessionLogsAutoFollow = next),\n onRefresh: () => void loadSessionLogs(state as unknown as Parameters<typeof loadSessionLogs>[0], { reset: true }),\n onExport: (lines, label) => (state as unknown as { exportSessionLogs: (l: string[], lb: string) => void }).exportSessionLogs(lines, label),\n onScroll: (event) => (state as unknown as { handleSessionLogsScroll: (e: Event) => void }).handleSessionLogsScroll(event),\n },\n loading: state.logsLoading,\n error: state.logsError,\n file: state.logsFile,\n entries: state.logsEntries,\n filterText: state.logsFilterText,\n levelFilters: state.logsLevelFilters,\n autoFollow: state.logsAutoFollow,\n truncated: state.logsTruncated,\n onFilterTextChange: (next) => (state.logsFilterText = next),\n onLevelToggle: (level, enabled) => {\n state.logsLevelFilters = { ...state.logsLevelFilters, [level]: enabled };\n },\n onToggleAutoFollow: (next) => (state.logsAutoFollow = next),\n onRefresh: () => loadLogs(state, { reset: true }),\n onExport: (lines, label) => (state as unknown as { exportSessionLogs: (l: string[], lb: string) => void }).exportSessionLogs(lines, label),\n onScroll: (event) => (state as unknown as { handleLogsScroll: (e: Event) => void }).handleLogsScroll(event),\n },\n });\n }\n\n // No matching standalone page — redirect to /chat\n window.location.replace(\"/chat\");\n return html``;\n}\n","import type { LogLevel } from \"./types\";\nimport type { CronFormState } from \"./ui-types\";\n\nexport const DEFAULT_LOG_LEVEL_FILTERS: Record<LogLevel, boolean> = {\n trace: true,\n debug: true,\n info: true,\n warn: true,\n error: true,\n fatal: true,\n};\n\nexport const DEFAULT_CRON_FORM: CronFormState = {\n name: \"\",\n description: \"\",\n agentId: \"\",\n enabled: true,\n scheduleKind: \"every\",\n scheduleAt: \"\",\n everyAmount: \"30\",\n everyUnit: \"minutes\",\n cronExpr: \"0 7 * * *\",\n cronTz: \"\",\n sessionTarget: \"main\",\n wakeMode: \"next-heartbeat\",\n payloadKind: \"systemEvent\",\n payloadText: \"\",\n deliver: false,\n channel: \"last\",\n to: \"\",\n timeoutSeconds: \"\",\n postToMainPrefix: \"\",\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { AgentsListResult } from \"../types\";\n\nexport type AgentsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n agentsLoading: boolean;\n agentsError: string | null;\n agentsList: AgentsListResult | null;\n};\n\nexport async function loadAgents(state: AgentsState) {\n if (!state.client || !state.connected) return;\n if (state.agentsLoading) return;\n state.agentsLoading = true;\n state.agentsError = null;\n try {\n const res = (await state.client.request(\"agents.list\", {})) as AgentsListResult | undefined;\n if (res) state.agentsList = res;\n } catch (err) {\n state.agentsError = String(err);\n } finally {\n state.agentsLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { ConfigSnapshot } from \"../types\";\nimport { cloneConfigObject, serializeConfigForm } from \"./config/form-utils\";\n\nexport type WorkspaceInfo = {\n name: string;\n displayName?: string;\n workspaceDir: string;\n isDefault: boolean;\n agents: Array<{ id: string; name?: string; isDefault: boolean }>;\n whatsappAccountId?: string;\n};\n\nexport type WorkspacesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n configSnapshot: ConfigSnapshot | null;\n workspaces: WorkspaceInfo[];\n workspacesLoading: boolean;\n workspacesError: string | null;\n addingWorkspace: boolean;\n newWorkspaceName: string;\n newWorkspacePath: string;\n workspaceSaving: boolean;\n workspaceRemoveConfirm: string | null;\n};\n\nexport async function loadWorkspaces(state: WorkspacesState): Promise<void> {\n if (!state.client || !state.connected) return;\n if (state.workspacesLoading) return;\n state.workspacesLoading = true;\n state.workspacesError = null;\n try {\n const res = (await state.client.request(\"workspaces.list\", {})) as {\n workspaces: WorkspaceInfo[];\n };\n state.workspaces = res.workspaces;\n } catch (err) {\n state.workspacesError = String(err);\n } finally {\n state.workspacesLoading = false;\n }\n}\n\nexport async function createWorkspace(\n state: WorkspacesState,\n params: {\n name: string;\n workspacePath?: string;\n onCreated?: (res: { whatsappAccountId?: string }) => void;\n },\n): Promise<void> {\n if (!state.client || !state.connected) return;\n if (state.workspaceSaving) return;\n\n const name = params.name.trim();\n if (!name) {\n state.workspacesError = \"Account name is required.\";\n return;\n }\n\n state.workspaceSaving = true;\n state.workspacesError = null;\n try {\n // Need config hash for optimistic concurrency\n const configRes = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = configRes;\n const baseHash = configRes.hash;\n if (!baseHash) {\n state.workspacesError = \"Config hash missing; reload and retry.\";\n return;\n }\n\n const rpcParams: Record<string, unknown> = {\n name,\n baseHash,\n whatsappAccountName: name,\n };\n if (params.workspacePath?.trim()) {\n rpcParams.workspaceDir = params.workspacePath.trim();\n }\n\n const res = (await state.client.request(\"workspaces.create\", rpcParams)) as {\n whatsappAccountId?: string;\n };\n\n // Reset form state\n state.addingWorkspace = false;\n state.newWorkspaceName = \"\";\n state.newWorkspacePath = \"\";\n\n // Reload workspaces to show the new one\n await loadWorkspaces(state);\n\n // Notify caller so it can start QR flow\n params.onCreated?.(res);\n } catch (err) {\n state.workspacesError = String(err);\n } finally {\n state.workspaceSaving = false;\n }\n}\n\nexport async function removeWorkspace(\n state: WorkspacesState,\n name: string,\n): Promise<void> {\n if (!state.client || !state.connected) return;\n if (state.workspaceSaving) return;\n\n state.workspaceSaving = true;\n state.workspacesError = null;\n try {\n // Need config hash for optimistic concurrency\n const configRes = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = configRes;\n const baseHash = configRes.hash;\n if (!baseHash) {\n state.workspacesError = \"Config hash missing; reload and retry.\";\n return;\n }\n\n await state.client.request(\"workspaces.remove\", { name, baseHash });\n\n state.workspaceRemoveConfirm = null;\n\n // Reload workspaces\n await loadWorkspaces(state);\n } catch (err) {\n state.workspacesError = String(err);\n } finally {\n state.workspaceSaving = false;\n }\n}\n\nexport async function renameWorkspace(\n state: WorkspacesState,\n name: string,\n displayName: string,\n): Promise<void> {\n if (!state.client || !state.connected) return;\n\n state.workspacesError = null;\n try {\n const configRes = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n state.configSnapshot = configRes;\n const baseHash = configRes.hash;\n if (!baseHash) {\n state.workspacesError = \"Config hash missing; reload and retry.\";\n return;\n }\n\n await state.client.request(\"workspaces.rename\", { name, displayName, baseHash });\n\n // Reload workspaces to reflect the new name\n await loadWorkspaces(state);\n } catch (err) {\n state.workspacesError = String(err);\n }\n}\n","export const GATEWAY_CLIENT_IDS = {\n WEBCHAT_UI: \"webchat-ui\",\n CONTROL_UI: \"taskmaster-control-ui\",\n SETUP_UI: \"setup-ui\",\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n GATEWAY_CLIENT: \"gateway-client\",\n MACOS_APP: \"taskmaster-macos\",\n IOS_APP: \"taskmaster-ios\",\n ANDROID_APP: \"taskmaster-android\",\n NODE_HOST: \"node-host\",\n TEST: \"test\",\n FINGERPRINT: \"fingerprint\",\n PROBE: \"taskmaster-probe\",\n} as const;\n\nexport type GatewayClientId = (typeof GATEWAY_CLIENT_IDS)[keyof typeof GATEWAY_CLIENT_IDS];\n\n// Back-compat naming (internal): these values are IDs, not display names.\nexport const GATEWAY_CLIENT_NAMES = GATEWAY_CLIENT_IDS;\nexport type GatewayClientName = GatewayClientId;\n\nexport const GATEWAY_CLIENT_MODES = {\n WEBCHAT: \"webchat\",\n CLI: \"cli\",\n UI: \"ui\",\n BACKEND: \"backend\",\n NODE: \"node\",\n PROBE: \"probe\",\n TEST: \"test\",\n} as const;\n\nexport type GatewayClientMode = (typeof GATEWAY_CLIENT_MODES)[keyof typeof GATEWAY_CLIENT_MODES];\n\nexport type GatewayClientInfo = {\n id: GatewayClientId;\n displayName?: string;\n version: string;\n platform: string;\n deviceFamily?: string;\n modelIdentifier?: string;\n mode: GatewayClientMode;\n instanceId?: string;\n};\n\nconst GATEWAY_CLIENT_ID_SET = new Set<GatewayClientId>(Object.values(GATEWAY_CLIENT_IDS));\nconst GATEWAY_CLIENT_MODE_SET = new Set<GatewayClientMode>(Object.values(GATEWAY_CLIENT_MODES));\n\nexport function normalizeGatewayClientId(raw?: string | null): GatewayClientId | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_ID_SET.has(normalized as GatewayClientId)\n ? (normalized as GatewayClientId)\n : undefined;\n}\n\nexport function normalizeGatewayClientName(raw?: string | null): GatewayClientName | undefined {\n return normalizeGatewayClientId(raw);\n}\n\nexport function normalizeGatewayClientMode(raw?: string | null): GatewayClientMode | undefined {\n const normalized = raw?.trim().toLowerCase();\n if (!normalized) return undefined;\n return GATEWAY_CLIENT_MODE_SET.has(normalized as GatewayClientMode)\n ? (normalized as GatewayClientMode)\n : undefined;\n}\n","export type DeviceAuthPayloadParams = {\n deviceId: string;\n clientId: string;\n clientMode: string;\n role: string;\n scopes: string[];\n signedAtMs: number;\n token?: string | null;\n nonce?: string | null;\n version?: \"v1\" | \"v2\";\n};\n\nexport function buildDeviceAuthPayload(params: DeviceAuthPayloadParams): string {\n const version = params.version ?? (params.nonce ? \"v2\" : \"v1\");\n const scopes = params.scopes.join(\",\");\n const token = params.token ?? \"\";\n const base = [\n version,\n params.deviceId,\n params.clientId,\n params.clientMode,\n params.role,\n scopes,\n String(params.signedAtMs),\n token,\n ];\n if (version === \"v2\") {\n base.push(params.nonce ?? \"\");\n }\n return base.join(\"|\");\n}\n","import { generateUUID } from \"./uuid\";\nimport {\n GATEWAY_CLIENT_MODES,\n GATEWAY_CLIENT_NAMES,\n type GatewayClientMode,\n type GatewayClientName,\n} from \"../../../src/gateway/protocol/client-info.js\";\nimport { buildDeviceAuthPayload } from \"../../../src/gateway/device-auth.js\";\nimport { loadOrCreateDeviceIdentity, signDevicePayload } from \"./device-identity\";\nimport { clearDeviceAuthToken, loadDeviceAuthToken, storeDeviceAuthToken } from \"./device-auth\";\n\nexport type GatewayEventFrame = {\n type: \"event\";\n event: string;\n payload?: unknown;\n seq?: number;\n stateVersion?: { presence: number; health: number };\n};\n\nexport type GatewayResponseFrame = {\n type: \"res\";\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; details?: unknown };\n};\n\nexport type GatewayHelloOk = {\n type: \"hello-ok\";\n protocol: number;\n features?: { methods?: string[]; events?: string[] };\n snapshot?: unknown;\n auth?: {\n deviceToken?: string;\n role?: string;\n scopes?: string[];\n issuedAtMs?: number;\n };\n policy?: { tickIntervalMs?: number };\n};\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n};\n\nexport type GatewayBrowserClientOptions = {\n url: string;\n token?: string;\n password?: string;\n clientName?: GatewayClientName;\n clientVersion?: string;\n platform?: string;\n mode?: GatewayClientMode;\n instanceId?: string;\n onHello?: (hello: GatewayHelloOk) => void;\n onEvent?: (evt: GatewayEventFrame) => void;\n onClose?: (info: { code: number; reason: string }) => void;\n onGap?: (info: { expected: number; received: number }) => void;\n};\n\n// 4008 = application-defined code (browser rejects 1008 \"Policy Violation\")\nconst CONNECT_FAILED_CLOSE_CODE = 4008;\n\nexport class GatewayBrowserClient {\n private ws: WebSocket | null = null;\n private pending = new Map<string, Pending>();\n private closed = false;\n private lastSeq: number | null = null;\n private connectNonce: string | null = null;\n private connectSent = false;\n private connectTimer: number | null = null;\n private backoffMs = 800;\n\n constructor(private opts: GatewayBrowserClientOptions) {}\n\n start() {\n this.closed = false;\n this.connect();\n }\n\n stop() {\n this.closed = true;\n this.ws?.close();\n this.ws = null;\n this.flushPending(new Error(\"gateway client stopped\"));\n }\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private connect() {\n if (this.closed) return;\n this.ws = new WebSocket(this.opts.url);\n this.ws.onopen = () => this.queueConnect();\n this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? \"\"));\n this.ws.onclose = (ev) => {\n const reason = String(ev.reason ?? \"\");\n this.ws = null;\n this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));\n this.opts.onClose?.({ code: ev.code, reason });\n this.scheduleReconnect();\n };\n this.ws.onerror = () => {\n // ignored; close handler will fire\n };\n }\n\n private scheduleReconnect() {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);\n window.setTimeout(() => this.connect(), delay);\n }\n\n private flushPending(err: Error) {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n private async sendConnect() {\n if (this.connectSent) return;\n this.connectSent = true;\n if (this.connectTimer !== null) {\n window.clearTimeout(this.connectTimer);\n this.connectTimer = null;\n }\n\n // crypto.subtle is only available in secure contexts (HTTPS, localhost).\n // Over plain HTTP, we skip device identity and fall back to token-only auth.\n // Gateways may reject this unless gateway.controlUi.allowInsecureAuth is enabled.\n const isSecureContext = typeof crypto !== \"undefined\" && !!crypto.subtle;\n\n const scopes = [\"operator.admin\", \"operator.approvals\", \"operator.pairing\"];\n const role = \"operator\";\n let deviceIdentity: Awaited<ReturnType<typeof loadOrCreateDeviceIdentity>> | null = null;\n let canFallbackToShared = false;\n let authToken = this.opts.token;\n\n if (isSecureContext) {\n deviceIdentity = await loadOrCreateDeviceIdentity();\n const storedToken = loadDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role,\n })?.token;\n authToken = storedToken ?? this.opts.token;\n canFallbackToShared = Boolean(storedToken && this.opts.token);\n }\n const auth =\n authToken || this.opts.password\n ? {\n token: authToken,\n password: this.opts.password,\n }\n : undefined;\n\n let device:\n | {\n id: string;\n publicKey: string;\n signature: string;\n signedAt: number;\n nonce: string | undefined;\n }\n | undefined;\n\n if (isSecureContext && deviceIdentity) {\n const signedAtMs = Date.now();\n const nonce = this.connectNonce ?? undefined;\n const payload = buildDeviceAuthPayload({\n deviceId: deviceIdentity.deviceId,\n clientId: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n clientMode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n role,\n scopes,\n signedAtMs,\n token: authToken ?? null,\n nonce,\n });\n const signature = await signDevicePayload(deviceIdentity.privateKey, payload);\n device = {\n id: deviceIdentity.deviceId,\n publicKey: deviceIdentity.publicKey,\n signature,\n signedAt: signedAtMs,\n nonce,\n };\n }\n const params = {\n minProtocol: 3,\n maxProtocol: 3,\n client: {\n id: this.opts.clientName ?? GATEWAY_CLIENT_NAMES.CONTROL_UI,\n version: this.opts.clientVersion ?? \"dev\",\n platform: this.opts.platform ?? navigator.platform ?? \"web\",\n mode: this.opts.mode ?? GATEWAY_CLIENT_MODES.WEBCHAT,\n instanceId: this.opts.instanceId,\n },\n role,\n scopes,\n device,\n caps: [],\n auth,\n userAgent: navigator.userAgent,\n locale: navigator.language,\n };\n\n void this.request<GatewayHelloOk>(\"connect\", params)\n .then((hello) => {\n if (hello?.auth?.deviceToken && deviceIdentity) {\n storeDeviceAuthToken({\n deviceId: deviceIdentity.deviceId,\n role: hello.auth.role ?? role,\n token: hello.auth.deviceToken,\n scopes: hello.auth.scopes ?? [],\n });\n }\n this.backoffMs = 800;\n this.opts.onHello?.(hello);\n })\n .catch(() => {\n if (canFallbackToShared && deviceIdentity) {\n clearDeviceAuthToken({ deviceId: deviceIdentity.deviceId, role });\n }\n this.ws?.close(CONNECT_FAILED_CLOSE_CODE, \"connect failed\");\n });\n }\n\n private handleMessage(raw: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n\n const frame = parsed as { type?: unknown };\n if (frame.type === \"event\") {\n const evt = parsed as GatewayEventFrame;\n if (evt.event === \"connect.challenge\") {\n const payload = evt.payload as { nonce?: unknown } | undefined;\n const nonce = payload && typeof payload.nonce === \"string\" ? payload.nonce : null;\n if (nonce) {\n this.connectNonce = nonce;\n void this.sendConnect();\n }\n return;\n }\n const seq = typeof evt.seq === \"number\" ? evt.seq : null;\n if (seq !== null) {\n if (this.lastSeq !== null && seq > this.lastSeq + 1) {\n this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });\n }\n this.lastSeq = seq;\n }\n try {\n this.opts.onEvent?.(evt);\n } catch (err) {\n console.error(\"[gateway] event handler error:\", err);\n }\n return;\n }\n\n if (frame.type === \"res\") {\n const res = parsed as GatewayResponseFrame;\n const pending = this.pending.get(res.id);\n if (!pending) return;\n this.pending.delete(res.id);\n if (res.ok) pending.resolve(res.payload);\n else pending.reject(new Error(res.error?.message ?? \"request failed\"));\n return;\n }\n }\n\n request<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"gateway not connected\"));\n }\n const id = generateUUID();\n const frame = { type: \"req\", id, method, params };\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.ws.send(JSON.stringify(frame));\n return p;\n }\n\n private queueConnect() {\n this.connectNonce = null;\n this.connectSent = false;\n if (this.connectTimer !== null) window.clearTimeout(this.connectTimer);\n this.connectTimer = window.setTimeout(() => {\n void this.sendConnect();\n }, 750);\n }\n}\n","export type ExecApprovalRequestPayload = {\n command: string;\n cwd?: string | null;\n host?: string | null;\n security?: string | null;\n ask?: string | null;\n agentId?: string | null;\n resolvedPath?: string | null;\n sessionKey?: string | null;\n};\n\nexport type ExecApprovalRequest = {\n id: string;\n request: ExecApprovalRequestPayload;\n createdAtMs: number;\n expiresAtMs: number;\n};\n\nexport type ExecApprovalResolved = {\n id: string;\n decision?: string | null;\n resolvedBy?: string | null;\n ts?: number | null;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport function parseExecApprovalRequested(payload: unknown): ExecApprovalRequest | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n const request = payload.request;\n if (!id || !isRecord(request)) return null;\n const command = typeof request.command === \"string\" ? request.command.trim() : \"\";\n if (!command) return null;\n const createdAtMs = typeof payload.createdAtMs === \"number\" ? payload.createdAtMs : 0;\n const expiresAtMs = typeof payload.expiresAtMs === \"number\" ? payload.expiresAtMs : 0;\n if (!createdAtMs || !expiresAtMs) return null;\n return {\n id,\n request: {\n command,\n cwd: typeof request.cwd === \"string\" ? request.cwd : null,\n host: typeof request.host === \"string\" ? request.host : null,\n security: typeof request.security === \"string\" ? request.security : null,\n ask: typeof request.ask === \"string\" ? request.ask : null,\n agentId: typeof request.agentId === \"string\" ? request.agentId : null,\n resolvedPath: typeof request.resolvedPath === \"string\" ? request.resolvedPath : null,\n sessionKey: typeof request.sessionKey === \"string\" ? request.sessionKey : null,\n },\n createdAtMs,\n expiresAtMs,\n };\n}\n\nexport function parseExecApprovalResolved(payload: unknown): ExecApprovalResolved | null {\n if (!isRecord(payload)) return null;\n const id = typeof payload.id === \"string\" ? payload.id.trim() : \"\";\n if (!id) return null;\n return {\n id,\n decision: typeof payload.decision === \"string\" ? payload.decision : null,\n resolvedBy: typeof payload.resolvedBy === \"string\" ? payload.resolvedBy : null,\n ts: typeof payload.ts === \"number\" ? payload.ts : null,\n };\n}\n\nexport function pruneExecApprovalQueue(queue: ExecApprovalRequest[]): ExecApprovalRequest[] {\n const now = Date.now();\n return queue.filter((entry) => entry.expiresAtMs > now);\n}\n\nexport function addExecApproval(\n queue: ExecApprovalRequest[],\n entry: ExecApprovalRequest,\n): ExecApprovalRequest[] {\n const next = pruneExecApprovalQueue(queue).filter((item) => item.id !== entry.id);\n next.push(entry);\n return next;\n}\n\nexport function removeExecApproval(queue: ExecApprovalRequest[], id: string): ExecApprovalRequest[] {\n return pruneExecApprovalQueue(queue).filter((entry) => entry.id !== id);\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport {\n normalizeAssistantIdentity,\n type AssistantIdentity,\n} from \"../assistant-identity\";\n\nexport type AssistantIdentityState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n};\n\nexport async function loadAssistantIdentity(\n state: AssistantIdentityState,\n opts?: { sessionKey?: string },\n) {\n if (!state.client || !state.connected) return;\n const sessionKey = opts?.sessionKey?.trim() || state.sessionKey.trim();\n const params = sessionKey ? { sessionKey } : {};\n try {\n const res = (await state.client.request(\"agent.identity.get\", params)) as\n | Partial<AssistantIdentity>\n | undefined;\n if (!res) return;\n const normalized = normalizeAssistantIdentity(res);\n state.assistantName = normalized.name;\n state.assistantAvatar = normalized.avatar;\n state.assistantAgentId = normalized.agentId ?? null;\n } catch {\n // Ignore errors; keep last known identity.\n }\n}\n","import { loadChatHistory } from \"./controllers/chat\";\nimport { loadConfig } from \"./controllers/config\";\nimport { loadDevices } from \"./controllers/devices\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadAgents } from \"./controllers/agents\";\nimport { loadWorkspaces } from \"./controllers/workspaces\";\nimport type { GatewayEventFrame, GatewayHelloOk } from \"./gateway\";\nimport { GatewayBrowserClient } from \"./gateway\";\nimport type { EventLogEntry } from \"./app-events\";\nimport type { AgentsListResult, PresenceEntry, HealthSnapshot, StatusSummary } from \"./types\";\nimport type { Tab } from \"./navigation\";\nimport type { UiSettings } from \"./storage\";\nimport { handleAgentEvent, resetToolStream, type AgentEventPayload } from \"./app-tool-stream\";\nimport { flushChatQueueForEvent } from \"./app-chat\";\nimport {\n applySettings,\n loadCron,\n refreshActiveTab,\n setLastActiveSessionKey,\n} from \"./app-settings\";\nimport { handleChatEvent, type ChatEventPayload } from \"./controllers/chat\";\nimport {\n addExecApproval,\n parseExecApprovalRequested,\n parseExecApprovalResolved,\n removeExecApproval,\n} from \"./controllers/exec-approval\";\nimport type { TaskmasterApp } from \"./app\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport {\n handleScreencastFrame,\n handleHandoffEvent,\n handleHandoffResolved,\n} from \"./controllers/browser-viewer\";\nimport { loadAssistantIdentity } from \"./controllers/assistant-identity\";\nimport { loadApiKeyProviders as fetchApiKeyProviders } from \"./controllers/apikeys\";\n\ntype GatewayHost = {\n settings: UiSettings;\n password: string;\n client: GatewayBrowserClient | null;\n connected: boolean;\n hello: GatewayHelloOk | null;\n lastError: string | null;\n onboarding?: boolean;\n setup?: boolean;\n filesPage?: boolean;\n browserPage?: boolean;\n chatPage?: boolean;\n advancedPage?: boolean;\n eventLogBuffer: EventLogEntry[];\n eventLog: EventLogEntry[];\n tab: Tab;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: StatusSummary | null;\n agentsLoading: boolean;\n agentsList: AgentsListResult | null;\n agentsError: string | null;\n debugHealth: HealthSnapshot | null;\n assistantName: string;\n assistantAvatar: string | null;\n assistantAgentId: string | null;\n sessionKey: string;\n chatRunId: string | null;\n chatModelCatalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }>;\n execApprovalQueue: ExecApprovalRequest[];\n execApprovalError: string | null;\n};\n\ntype SessionDefaultsSnapshot = {\n defaultAgentId?: string;\n mainKey?: string;\n mainSessionKey?: string;\n scope?: string;\n};\n\nfunction normalizeSessionKeyForDefaults(\n value: string | undefined,\n defaults: SessionDefaultsSnapshot,\n): string {\n const raw = (value ?? \"\").trim();\n const mainSessionKey = defaults.mainSessionKey?.trim();\n if (!mainSessionKey) return raw;\n if (!raw) return mainSessionKey;\n const mainKey = defaults.mainKey?.trim() || \"main\";\n const defaultAgentId = defaults.defaultAgentId?.trim();\n const isAlias =\n raw === \"main\" ||\n raw === mainKey ||\n (defaultAgentId &&\n (raw === `agent:${defaultAgentId}:main` ||\n raw === `agent:${defaultAgentId}:${mainKey}`));\n return isAlias ? mainSessionKey : raw;\n}\n\nfunction applySessionDefaults(host: GatewayHost, defaults?: SessionDefaultsSnapshot) {\n if (!defaults?.mainSessionKey) return;\n const resolvedSessionKey = normalizeSessionKeyForDefaults(host.sessionKey, defaults);\n const resolvedSettingsSessionKey = normalizeSessionKeyForDefaults(\n host.settings.sessionKey,\n defaults,\n );\n const resolvedLastActiveSessionKey = normalizeSessionKeyForDefaults(\n host.settings.lastActiveSessionKey,\n defaults,\n );\n const nextSessionKey = resolvedSessionKey || resolvedSettingsSessionKey || host.sessionKey;\n const nextSettings = {\n ...host.settings,\n sessionKey: resolvedSettingsSessionKey || nextSessionKey,\n lastActiveSessionKey: resolvedLastActiveSessionKey || nextSessionKey,\n };\n const shouldUpdateSettings =\n nextSettings.sessionKey !== host.settings.sessionKey ||\n nextSettings.lastActiveSessionKey !== host.settings.lastActiveSessionKey;\n if (nextSessionKey !== host.sessionKey) {\n host.sessionKey = nextSessionKey;\n }\n if (shouldUpdateSettings) {\n applySettings(host as unknown as Parameters<typeof applySettings>[0], nextSettings);\n }\n}\n\nexport function connectGateway(host: GatewayHost) {\n host.lastError = null;\n host.hello = null;\n host.connected = false;\n host.execApprovalQueue = [];\n host.execApprovalError = null;\n\n // Setup/files/browser modes use a special client ID that allows unauthenticated connections\n const clientName = (host.setup || host.filesPage || host.browserPage) ? \"setup-ui\" : \"taskmaster-control-ui\";\n // Note: customersPage uses \"taskmaster-control-ui\" (authenticated) — same as admins/chat/advanced\n\n host.client?.stop();\n host.client = new GatewayBrowserClient({\n url: host.settings.gatewayUrl,\n token: host.settings.token.trim() ? host.settings.token : undefined,\n password: host.password.trim() ? host.password : undefined,\n clientName,\n mode: \"webchat\",\n onHello: (hello) => {\n host.connected = true;\n host.lastError = null;\n host.hello = hello;\n applySnapshot(host, hello);\n // Check access (PIN) status before loading page data\n void (host as unknown as TaskmasterApp).handleAccessCheck();\n void loadAssistantIdentity(host as unknown as TaskmasterApp);\n void loadAgents(host as unknown as TaskmasterApp);\n // Load model catalog for chat model selector and setup model selector\n if (host.chatPage || host.setup) {\n void loadModelCatalog(host);\n }\n void loadNodes(host as unknown as TaskmasterApp, { quiet: true });\n void loadDevices(host as unknown as TaskmasterApp, { quiet: true });\n void loadWorkspaces(host as unknown as TaskmasterApp).then(() => {\n (host as unknown as TaskmasterApp).initWorkspaceSelection();\n });\n // Setup page needs config snapshot for iMessage per-account binding info\n if (host.setup) {\n void loadConfig(host as unknown as TaskmasterApp);\n void loadApiKeyProviders(host as unknown as TaskmasterApp);\n }\n void refreshActiveTab(host as unknown as Parameters<typeof refreshActiveTab>[0]);\n },\n onClose: ({ code, reason }) => {\n host.connected = false;\n // Code 1012 = Service Restart (expected during config saves, don't show as error)\n if (code !== 1012) {\n host.lastError = `disconnected (${code}): ${reason || \"no reason\"}`;\n }\n },\n onEvent: (evt) => handleGatewayEvent(host, evt),\n onGap: ({ expected, received }) => {\n host.lastError = `event gap detected (expected seq ${expected}, got ${received}); refresh recommended`;\n },\n });\n host.client.start();\n}\n\nexport function handleGatewayEvent(host: GatewayHost, evt: GatewayEventFrame) {\n try {\n handleGatewayEventUnsafe(host, evt);\n } catch (err) {\n console.error(\"[gateway] handleGatewayEvent error:\", evt.event, err);\n }\n}\n\nfunction handleGatewayEventUnsafe(host: GatewayHost, evt: GatewayEventFrame) {\n host.eventLogBuffer = [\n { ts: Date.now(), event: evt.event, payload: evt.payload },\n ...host.eventLogBuffer,\n ].slice(0, 250);\n if (host.tab === \"debug\") {\n host.eventLog = host.eventLogBuffer;\n }\n\n if (evt.event === \"agent\") {\n if (host.onboarding) return;\n handleAgentEvent(\n host as unknown as Parameters<typeof handleAgentEvent>[0],\n evt.payload as AgentEventPayload | undefined,\n );\n return;\n }\n\n if (evt.event === \"chat\") {\n const payload = evt.payload as ChatEventPayload | undefined;\n if (payload?.sessionKey) {\n setLastActiveSessionKey(\n host as unknown as Parameters<typeof setLastActiveSessionKey>[0],\n payload.sessionKey,\n );\n }\n const state = handleChatEvent(host as unknown as TaskmasterApp, payload);\n if (state === \"final\" || state === \"error\" || state === \"aborted\") {\n resetToolStream(host as unknown as Parameters<typeof resetToolStream>[0]);\n void flushChatQueueForEvent(\n host as unknown as Parameters<typeof flushChatQueueForEvent>[0],\n );\n }\n if (state === \"final\") void loadChatHistory(host as unknown as TaskmasterApp);\n return;\n }\n\n if (evt.event === \"presence\") {\n const payload = evt.payload as { presence?: PresenceEntry[] } | undefined;\n if (payload?.presence && Array.isArray(payload.presence)) {\n host.presenceEntries = payload.presence;\n host.presenceError = null;\n host.presenceStatus = null;\n }\n return;\n }\n\n if (evt.event === \"cron\" && host.tab === \"cron\") {\n void loadCron(host as unknown as Parameters<typeof loadCron>[0]);\n }\n\n if (evt.event === \"device.pair.requested\" || evt.event === \"device.pair.resolved\") {\n void loadDevices(host as unknown as TaskmasterApp, { quiet: true });\n }\n\n if (evt.event === \"exec.approval.requested\") {\n const entry = parseExecApprovalRequested(evt.payload);\n if (entry) {\n host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry);\n host.execApprovalError = null;\n const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500);\n window.setTimeout(() => {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id);\n }, delay);\n }\n return;\n }\n\n if (evt.event === \"browser.screencast.frame\") {\n handleScreencastFrame(\n host as unknown as TaskmasterApp,\n evt.payload as { data?: string; metadata?: { deviceWidth?: number; deviceHeight?: number } } | undefined,\n );\n return;\n }\n\n if (evt.event === \"browser.handoff\") {\n handleHandoffEvent(\n host as unknown as TaskmasterApp,\n evt.payload as { id?: string; reason?: string } | undefined,\n );\n // Navigate to browser page when handoff is requested\n if (!host.browserPage) {\n window.location.href = \"/browser\";\n }\n return;\n }\n\n if (evt.event === \"browser.handoff.resolved\") {\n handleHandoffResolved(host as unknown as TaskmasterApp);\n return;\n }\n\n if (evt.event === \"exec.approval.resolved\") {\n const resolved = parseExecApprovalResolved(evt.payload);\n if (resolved) {\n host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id);\n }\n }\n}\n\nexport function applySnapshot(host: GatewayHost, hello: GatewayHelloOk) {\n const snapshot = hello.snapshot as\n | {\n presence?: PresenceEntry[];\n health?: HealthSnapshot;\n sessionDefaults?: SessionDefaultsSnapshot;\n }\n | undefined;\n if (snapshot?.presence && Array.isArray(snapshot.presence)) {\n host.presenceEntries = snapshot.presence;\n }\n if (snapshot?.health) {\n host.debugHealth = snapshot.health;\n }\n if (snapshot?.sessionDefaults) {\n applySessionDefaults(host, snapshot.sessionDefaults);\n }\n}\n\nasync function loadModelCatalog(host: GatewayHost) {\n if (!host.client || !host.connected) return;\n try {\n const res = (await host.client.request(\"models.list\", {})) as {\n models?: Array<{ id: string; name: string; provider: string; reasoning?: boolean }>;\n };\n if (Array.isArray(res?.models)) {\n host.chatModelCatalog = res.models;\n }\n } catch {\n // Non-critical — selector will just be hidden\n }\n}\n\nasync function loadApiKeyProviders(host: TaskmasterApp) {\n if (!host.client || !host.connected) return;\n try {\n host.apiKeyProviders = await fetchApiKeyProviders(host.client);\n } catch {\n // Non-critical — modal will show empty state\n }\n}\n","import type { Tab } from \"./navigation\";\nimport { connectGateway } from \"./app-gateway\";\nimport {\n applySettingsFromUrl,\n attachThemeListener,\n detachThemeListener,\n inferBasePath,\n syncTabWithLocation,\n syncThemeWithSettings,\n} from \"./app-settings\";\nimport { observeTopbar, scheduleChatScroll, scheduleLogsScroll } from \"./app-scroll\";\nimport {\n startLogsPolling,\n startNodesPolling,\n stopLogsPolling,\n stopNodesPolling,\n startDebugPolling,\n stopDebugPolling,\n startSessionLogsPolling,\n stopSessionLogsPolling,\n} from \"./app-polling\";\nimport { resolveBrand, applyBrandAccentColor } from \"./brand\";\n\ntype LifecycleHost = {\n basePath: string;\n tab: Tab;\n chatHasAutoScrolled: boolean;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatToolMessages: unknown[];\n chatStream: string;\n logsAutoFollow: boolean;\n logsAtBottom: boolean;\n logsEntries: unknown[];\n popStateHandler: () => void;\n topbarObserver: ResizeObserver | null;\n // Standalone page mode fields\n setup?: boolean;\n filesPage?: boolean;\n browserPage?: boolean;\n adminsPage?: boolean;\n customersPage?: boolean;\n chatPage?: boolean;\n advancedPage?: boolean;\n connected?: boolean;\n whatsappBusy?: boolean;\n whatsappLoginQrDataUrl?: string | null;\n whatsappLoginConnected?: boolean | null;\n whatsappLoginMessage?: string | null;\n handleWhatsAppStart?: (force: boolean) => Promise<void>;\n handleWhatsAppWait?: () => Promise<void>;\n // License setup fields\n licenseValid?: boolean | null;\n licenseBusy?: boolean;\n handleLicenseStatusCheck?: () => Promise<void>;\n // Auth setup fields\n setupStep?: \"license\" | \"auth\" | \"whatsapp\" | \"complete\";\n authConnected?: boolean | null;\n authBusy?: boolean;\n handleAuthStatusCheck?: () => Promise<void>;\n // Channel status\n channelsLoading?: boolean;\n channelsSnapshot?: {\n channelAccounts?: {\n whatsapp?: Array<{\n running?: boolean | null;\n connected?: boolean | null;\n linked?: boolean | null;\n }>;\n };\n } | null;\n client?: {\n request: (method: string, params: Record<string, unknown>) => Promise<unknown>;\n } | null;\n // Files page callback\n handleFilesLoad?: () => void;\n // Admins page callback\n handleAdminsLoad?: () => void;\n // Customers page callback\n handleCustomersLoad?: () => void;\n // Chat page callback\n handleChatLoad?: () => void;\n // Advanced page callback\n handleAdvancedLoad?: () => void;\n // Software update callback\n handleUpdateCheck?: () => Promise<void>;\n};\n\nexport function handleConnected(host: LifecycleHost) {\n host.basePath = inferBasePath();\n\n // Apply brand accent color before any rendering\n const brand = resolveBrand();\n applyBrandAccentColor(brand.accentColor);\n\n // Scroll to top on page load (standalone pages are full navigations)\n window.scrollTo(0, 0);\n\n // Setup mode: set page title and skip normal navigation\n if (host.setup) {\n document.title = `${brand.name} Setup`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Files page: standalone mode\n if (host.filesPage) {\n document.title = `${brand.name} Files`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Browser page: standalone mode\n if (host.browserPage) {\n document.title = `${brand.name} Browser`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Admins page: standalone mode\n if (host.adminsPage) {\n document.title = `${brand.name} Admins`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Customers page: standalone mode\n if (host.customersPage) {\n document.title = `${brand.name} Customers`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Chat page: standalone mode\n if (host.chatPage) {\n document.title = `${brand.name} Chat`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n // Advanced page: standalone mode\n if (host.advancedPage) {\n document.title = `${brand.name} Advanced`;\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n return;\n }\n\n syncTabWithLocation(\n host as unknown as Parameters<typeof syncTabWithLocation>[0],\n true,\n );\n syncThemeWithSettings(\n host as unknown as Parameters<typeof syncThemeWithSettings>[0],\n );\n attachThemeListener(\n host as unknown as Parameters<typeof attachThemeListener>[0],\n );\n window.addEventListener(\"popstate\", host.popStateHandler);\n applySettingsFromUrl(\n host as unknown as Parameters<typeof applySettingsFromUrl>[0],\n );\n connectGateway(host as unknown as Parameters<typeof connectGateway>[0]);\n startNodesPolling(host as unknown as Parameters<typeof startNodesPolling>[0]);\n if (host.tab === \"logs\") {\n const subTab = (host as unknown as { logsSubTab?: string }).logsSubTab;\n if (subTab === \"session\") {\n startSessionLogsPolling(host as unknown as Parameters<typeof startSessionLogsPolling>[0]);\n } else {\n startLogsPolling(host as unknown as Parameters<typeof startLogsPolling>[0]);\n }\n }\n if (host.tab === \"debug\") {\n startDebugPolling(host as unknown as Parameters<typeof startDebugPolling>[0]);\n }\n}\n\nexport function handleFirstUpdated(host: LifecycleHost) {\n observeTopbar(host as unknown as Parameters<typeof observeTopbar>[0]);\n}\n\nexport function handleDisconnected(host: LifecycleHost) {\n window.removeEventListener(\"popstate\", host.popStateHandler);\n stopNodesPolling(host as unknown as Parameters<typeof stopNodesPolling>[0]);\n stopLogsPolling(host as unknown as Parameters<typeof stopLogsPolling>[0]);\n stopSessionLogsPolling(host as unknown as Parameters<typeof stopSessionLogsPolling>[0]);\n stopDebugPolling(host as unknown as Parameters<typeof stopDebugPolling>[0]);\n detachThemeListener(\n host as unknown as Parameters<typeof detachThemeListener>[0],\n );\n host.topbarObserver?.disconnect();\n host.topbarObserver = null;\n}\n\nexport function handleUpdated(\n host: LifecycleHost,\n changed: Map<PropertyKey, unknown>,\n) {\n // Files page: auto-load file tree when first connected\n if (host.filesPage && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n if (justConnected && host.handleFilesLoad) {\n host.handleFilesLoad();\n }\n }\n\n // Admins page: auto-load admin phones when first connected\n if (host.adminsPage && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n if (justConnected && host.handleAdminsLoad) {\n host.handleAdminsLoad();\n }\n }\n\n // Customers page: auto-load customer records when first connected\n if (host.customersPage && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n if (justConnected && host.handleCustomersLoad) {\n host.handleCustomersLoad();\n }\n }\n\n // Chat page: auto-load chat history when first connected\n if (host.chatPage && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n if (justConnected && host.handleChatLoad) {\n host.handleChatLoad();\n }\n }\n\n // Advanced page: auto-load default tab data when first connected\n if (host.advancedPage && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n if (justConnected && host.handleAdvancedLoad) {\n host.handleAdvancedLoad();\n }\n }\n\n // Setup mode: check license → auth → WhatsApp\n if (host.setup && host.connected) {\n const justConnected = changed.has(\"connected\") && changed.get(\"connected\") === false;\n\n // Step 0: Check license status when first connected\n if (justConnected && host.handleLicenseStatusCheck && host.licenseValid === null && !host.licenseBusy) {\n host.handleLicenseStatusCheck();\n }\n\n // Auto-check for software updates on connect\n if (justConnected && host.handleUpdateCheck) {\n host.handleUpdateCheck();\n }\n\n // Step 1: Check auth status when license is valid and entering auth step\n const justEnteredAuth = changed.has(\"setupStep\") && host.setupStep === \"auth\";\n if ((justConnected || justEnteredAuth) && host.setupStep === \"auth\") {\n // If auth is already known to be connected (e.g. license re-activation), skip ahead\n if (host.authConnected === true) {\n host.setupStep = \"whatsapp\";\n } else if (host.handleAuthStatusCheck && host.authConnected === null && !host.authBusy) {\n host.handleAuthStatusCheck();\n }\n }\n\n // Step 2: Load channels status when moving to WhatsApp step (don't auto-login)\n if (host.setupStep === \"whatsapp\") {\n const stepJustChanged = changed.has(\"setupStep\");\n\n // Load channels status when entering WhatsApp step to show real status\n if (stepJustChanged && host.client && !host.channelsLoading) {\n host.channelsLoading = true;\n host.client.request(\"channels.status\", { probe: true, timeoutMs: 8000 })\n .then((res) => {\n host.channelsSnapshot = res as typeof host.channelsSnapshot;\n host.channelsLoading = false;\n })\n .catch(() => {\n host.channelsLoading = false;\n });\n }\n }\n\n // After WhatsApp login completes (QR scan), refresh channel status\n if (changed.has(\"whatsappLoginConnected\") && host.whatsappLoginConnected === true) {\n if (host.client && !host.channelsLoading) {\n host.channelsLoading = true;\n host.client.request(\"channels.status\", { probe: true, timeoutMs: 8000 })\n .then((res) => {\n host.channelsSnapshot = res as typeof host.channelsSnapshot;\n host.channelsLoading = false;\n })\n .catch(() => {\n host.channelsLoading = false;\n });\n }\n }\n }\n\n if (\n host.tab === \"chat\" &&\n !host.advancedPage &&\n (changed.has(\"chatMessages\") ||\n changed.has(\"chatToolMessages\") ||\n changed.has(\"chatStream\") ||\n changed.has(\"chatLoading\") ||\n changed.has(\"tab\"))\n ) {\n const forcedByTab = changed.has(\"tab\");\n const forcedByLoad =\n changed.has(\"chatLoading\") &&\n changed.get(\"chatLoading\") === true &&\n host.chatLoading === false;\n scheduleChatScroll(\n host as unknown as Parameters<typeof scheduleChatScroll>[0],\n forcedByTab || forcedByLoad || !host.chatHasAutoScrolled,\n );\n }\n if (\n host.tab === \"logs\" &&\n !host.advancedPage &&\n (changed.has(\"logsEntries\") || changed.has(\"logsAutoFollow\") || changed.has(\"tab\"))\n ) {\n if (host.logsAutoFollow && host.logsAtBottom) {\n scheduleLogsScroll(\n host as unknown as Parameters<typeof scheduleLogsScroll>[0],\n changed.has(\"tab\") || changed.has(\"logsAutoFollow\"),\n );\n }\n }\n}\n","/**\n * Nostr Profile Edit Form\n *\n * Provides UI for editing and publishing Nostr profile (kind:0).\n */\n\nimport { html, nothing, type TemplateResult } from \"lit\";\n\nimport type { NostrProfile as NostrProfileType } from \"../types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface NostrProfileFormState {\n /** Current form values */\n values: NostrProfileType;\n /** Original values for dirty detection */\n original: NostrProfileType;\n /** Whether the form is currently submitting */\n saving: boolean;\n /** Whether import is in progress */\n importing: boolean;\n /** Last error message */\n error: string | null;\n /** Last success message */\n success: string | null;\n /** Validation errors per field */\n fieldErrors: Record<string, string>;\n /** Whether to show advanced fields */\n showAdvanced: boolean;\n}\n\nexport interface NostrProfileFormCallbacks {\n /** Called when a field value changes */\n onFieldChange: (field: keyof NostrProfileType, value: string) => void;\n /** Called when save is clicked */\n onSave: () => void;\n /** Called when import is clicked */\n onImport: () => void;\n /** Called when cancel is clicked */\n onCancel: () => void;\n /** Called when toggle advanced is clicked */\n onToggleAdvanced: () => void;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction isFormDirty(state: NostrProfileFormState): boolean {\n const { values, original } = state;\n return (\n values.name !== original.name ||\n values.displayName !== original.displayName ||\n values.about !== original.about ||\n values.picture !== original.picture ||\n values.banner !== original.banner ||\n values.website !== original.website ||\n values.nip05 !== original.nip05 ||\n values.lud16 !== original.lud16\n );\n}\n\n// ============================================================================\n// Form Rendering\n// ============================================================================\n\nexport function renderNostrProfileForm(params: {\n state: NostrProfileFormState;\n callbacks: NostrProfileFormCallbacks;\n accountId: string;\n}): TemplateResult {\n const { state, callbacks, accountId } = params;\n const isDirty = isFormDirty(state);\n\n const renderField = (\n field: keyof NostrProfileType,\n label: string,\n opts: {\n type?: \"text\" | \"url\" | \"textarea\";\n placeholder?: string;\n maxLength?: number;\n help?: string;\n } = {}\n ) => {\n const { type = \"text\", placeholder, maxLength, help } = opts;\n const value = state.values[field] ?? \"\";\n const error = state.fieldErrors[field];\n\n const inputId = `nostr-profile-${field}`;\n\n if (type === \"textarea\") {\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <textarea\n id=\"${inputId}\"\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 2000}\n rows=\"3\"\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px; resize: vertical; font-family: inherit;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLTextAreaElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n ></textarea>\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n }\n\n return html`\n <div class=\"form-field\" style=\"margin-bottom: 12px;\">\n <label for=\"${inputId}\" style=\"display: block; margin-bottom: 4px; font-weight: 500;\">\n ${label}\n </label>\n <input\n id=\"${inputId}\"\n type=${type}\n .value=${value}\n placeholder=${placeholder ?? \"\"}\n maxlength=${maxLength ?? 256}\n style=\"width: 100%; padding: 8px; border: 1px solid var(--border-color); border-radius: 4px;\"\n @input=${(e: InputEvent) => {\n const target = e.target as HTMLInputElement;\n callbacks.onFieldChange(field, target.value);\n }}\n ?disabled=${state.saving}\n />\n ${help ? html`<div style=\"font-size: 12px; color: var(--text-muted); margin-top: 2px;\">${help}</div>` : nothing}\n ${error ? html`<div style=\"font-size: 12px; color: var(--danger-color); margin-top: 2px;\">${error}</div>` : nothing}\n </div>\n `;\n };\n\n const renderPicturePreview = () => {\n const picture = state.values.picture;\n if (!picture) return nothing;\n\n return html`\n <div style=\"margin-bottom: 12px;\">\n <img\n src=${picture}\n alt=\"Profile picture preview\"\n style=\"max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover; border: 2px solid var(--border-color);\"\n @error=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"none\";\n }}\n @load=${(e: Event) => {\n const img = e.target as HTMLImageElement;\n img.style.display = \"block\";\n }}\n />\n </div>\n `;\n };\n\n return html`\n <div class=\"nostr-profile-form\" style=\"padding: 16px; background: var(--bg-secondary); border-radius: 8px; margin-top: 12px;\">\n <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;\">\n <div style=\"font-weight: 600; font-size: 16px;\">Edit Profile</div>\n <div style=\"font-size: 12px; color: var(--text-muted);\">Account: ${accountId}</div>\n </div>\n\n ${state.error\n ? html`<div class=\"callout danger\" style=\"margin-bottom: 12px;\">${state.error}</div>`\n : nothing}\n\n ${state.success\n ? html`<div class=\"callout success\" style=\"margin-bottom: 12px;\">${state.success}</div>`\n : nothing}\n\n ${renderPicturePreview()}\n\n ${renderField(\"name\", \"Username\", {\n placeholder: \"satoshi\",\n maxLength: 256,\n help: \"Short username (e.g., satoshi)\",\n })}\n\n ${renderField(\"displayName\", \"Display Name\", {\n placeholder: \"Satoshi Nakamoto\",\n maxLength: 256,\n help: \"Your full display name\",\n })}\n\n ${renderField(\"about\", \"Bio\", {\n type: \"textarea\",\n placeholder: \"Tell people about yourself...\",\n maxLength: 2000,\n help: \"A brief bio or description\",\n })}\n\n ${renderField(\"picture\", \"Avatar URL\", {\n type: \"url\",\n placeholder: \"https://example.com/avatar.jpg\",\n help: \"HTTPS URL to your profile picture\",\n })}\n\n ${state.showAdvanced\n ? html`\n <div style=\"border-top: 1px solid var(--border-color); padding-top: 12px; margin-top: 12px;\">\n <div style=\"font-weight: 500; margin-bottom: 12px; color: var(--text-muted);\">Advanced</div>\n\n ${renderField(\"banner\", \"Banner URL\", {\n type: \"url\",\n placeholder: \"https://example.com/banner.jpg\",\n help: \"HTTPS URL to a banner image\",\n })}\n\n ${renderField(\"website\", \"Website\", {\n type: \"url\",\n placeholder: \"https://example.com\",\n help: \"Your personal website\",\n })}\n\n ${renderField(\"nip05\", \"NIP-05 Identifier\", {\n placeholder: \"you@example.com\",\n help: \"Verifiable identifier (e.g., you@domain.com)\",\n })}\n\n ${renderField(\"lud16\", \"Lightning Address\", {\n placeholder: \"you@getalby.com\",\n help: \"Lightning address for tips (LUD-16)\",\n })}\n </div>\n `\n : nothing}\n\n <div style=\"display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n @click=${callbacks.onSave}\n ?disabled=${state.saving || !isDirty}\n >\n ${state.saving ? \"Saving...\" : \"Save & Publish\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onImport}\n ?disabled=${state.importing || state.saving}\n >\n ${state.importing ? \"Importing...\" : \"Import from Relays\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onToggleAdvanced}\n >\n ${state.showAdvanced ? \"Hide Advanced\" : \"Show Advanced\"}\n </button>\n\n <button\n class=\"btn\"\n @click=${callbacks.onCancel}\n ?disabled=${state.saving}\n >\n Cancel\n </button>\n </div>\n\n ${isDirty\n ? html`<div style=\"font-size: 12px; color: var(--warning-color); margin-top: 8px;\">\n You have unsaved changes\n </div>`\n : nothing}\n </div>\n `;\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create initial form state from existing profile\n */\nexport function createNostrProfileFormState(\n profile: NostrProfileType | undefined\n): NostrProfileFormState {\n const values: NostrProfileType = {\n name: profile?.name ?? \"\",\n displayName: profile?.displayName ?? \"\",\n about: profile?.about ?? \"\",\n picture: profile?.picture ?? \"\",\n banner: profile?.banner ?? \"\",\n website: profile?.website ?? \"\",\n nip05: profile?.nip05 ?? \"\",\n lud16: profile?.lud16 ?? \"\",\n };\n\n return {\n values,\n original: { ...values },\n saving: false,\n importing: false,\n error: null,\n success: null,\n fieldErrors: {},\n showAdvanced: Boolean(\n profile?.banner || profile?.website || profile?.nip05 || profile?.lud16\n ),\n };\n}\n","import {\n addWhatsAppAccount,\n loadChannels,\n logoutWhatsApp,\n removeWhatsAppAccount,\n startWhatsAppLogin,\n waitWhatsAppLogin,\n} from \"./controllers/channels\";\nimport { loadConfig, saveConfig } from \"./controllers/config\";\nimport type { TaskmasterApp } from \"./app\";\nimport type { NostrProfile } from \"./types\";\nimport { createNostrProfileFormState } from \"./views/channels.nostr-profile-form\";\n\nexport async function handleWhatsAppStart(host: TaskmasterApp, force: boolean, accountId?: string) {\n await startWhatsAppLogin(host, force, accountId);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppWait(host: TaskmasterApp, accountId?: string) {\n await waitWhatsAppLogin(host, accountId);\n await loadChannels(host, true);\n}\n\nexport async function handleWhatsAppLogout(host: TaskmasterApp, accountId?: string) {\n await logoutWhatsApp(host, accountId);\n await loadChannels(host, true);\n}\n\nexport async function handleAddWhatsAppAccount(host: TaskmasterApp, name: string) {\n await addWhatsAppAccount(host, name);\n}\n\nexport async function handleRemoveWhatsAppAccount(host: TaskmasterApp, accountId: string) {\n await removeWhatsAppAccount(host, accountId);\n}\n\nexport async function handleChannelConfigSave(host: TaskmasterApp) {\n await saveConfig(host);\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nexport async function handleChannelConfigReload(host: TaskmasterApp) {\n await loadConfig(host);\n await loadChannels(host, true);\n}\n\nfunction parseValidationErrors(details: unknown): Record<string, string> {\n if (!Array.isArray(details)) return {};\n const errors: Record<string, string> = {};\n for (const entry of details) {\n if (typeof entry !== \"string\") continue;\n const [rawField, ...rest] = entry.split(\":\");\n if (!rawField || rest.length === 0) continue;\n const field = rawField.trim();\n const message = rest.join(\":\").trim();\n if (field && message) errors[field] = message;\n }\n return errors;\n}\n\nfunction resolveNostrAccountId(host: TaskmasterApp): string {\n const accounts = host.channelsSnapshot?.channelAccounts?.nostr ?? [];\n return accounts[0]?.accountId ?? host.nostrProfileAccountId ?? \"default\";\n}\n\nfunction buildNostrProfileUrl(accountId: string, suffix = \"\"): string {\n return `/api/channels/nostr/${encodeURIComponent(accountId)}/profile${suffix}`;\n}\n\nexport function handleNostrProfileEdit(\n host: TaskmasterApp,\n accountId: string,\n profile: NostrProfile | null,\n) {\n host.nostrProfileAccountId = accountId;\n host.nostrProfileFormState = createNostrProfileFormState(profile ?? undefined);\n}\n\nexport function handleNostrProfileCancel(host: TaskmasterApp) {\n host.nostrProfileFormState = null;\n host.nostrProfileAccountId = null;\n}\n\nexport function handleNostrProfileFieldChange(\n host: TaskmasterApp,\n field: keyof NostrProfile,\n value: string,\n) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n values: {\n ...state.values,\n [field]: value,\n },\n fieldErrors: {\n ...state.fieldErrors,\n [field]: \"\",\n },\n };\n}\n\nexport function handleNostrProfileToggleAdvanced(host: TaskmasterApp) {\n const state = host.nostrProfileFormState;\n if (!state) return;\n host.nostrProfileFormState = {\n ...state,\n showAdvanced: !state.showAdvanced,\n };\n}\n\nexport async function handleNostrProfileSave(host: TaskmasterApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.saving) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n saving: true,\n error: null,\n success: null,\n fieldErrors: {},\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId), {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(state.values),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; details?: unknown; persisted?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile update failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: errorMessage,\n success: null,\n fieldErrors: parseValidationErrors(data?.details),\n };\n return;\n }\n\n if (!data.persisted) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: \"Profile publish failed on all relays.\",\n success: null,\n };\n return;\n }\n\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: null,\n success: \"Profile published to relays.\",\n fieldErrors: {},\n original: { ...state.values },\n };\n await loadChannels(host, true);\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n saving: false,\n error: `Profile update failed: ${String(err)}`,\n success: null,\n };\n }\n}\n\nexport async function handleNostrProfileImport(host: TaskmasterApp) {\n const state = host.nostrProfileFormState;\n if (!state || state.importing) return;\n const accountId = resolveNostrAccountId(host);\n\n host.nostrProfileFormState = {\n ...state,\n importing: true,\n error: null,\n success: null,\n };\n\n try {\n const response = await fetch(buildNostrProfileUrl(accountId, \"/import\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ autoMerge: true }),\n });\n const data = (await response.json().catch(() => null)) as\n | { ok?: boolean; error?: string; imported?: NostrProfile; merged?: NostrProfile; saved?: boolean }\n | null;\n\n if (!response.ok || data?.ok === false || !data) {\n const errorMessage = data?.error ?? `Profile import failed (${response.status})`;\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: errorMessage,\n success: null,\n };\n return;\n }\n\n const merged = data.merged ?? data.imported ?? null;\n const nextValues = merged ? { ...state.values, ...merged } : state.values;\n const showAdvanced = Boolean(\n nextValues.banner || nextValues.website || nextValues.nip05 || nextValues.lud16,\n );\n\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n values: nextValues,\n error: null,\n success: data.saved\n ? \"Profile imported from relays. Review and publish.\"\n : \"Profile imported. Review and publish.\",\n showAdvanced,\n };\n\n if (data.saved) {\n await loadChannels(host, true);\n }\n } catch (err) {\n host.nostrProfileFormState = {\n ...state,\n importing: false,\n error: `Profile import failed: ${String(err)}`,\n success: null,\n };\n }\n}\n","/**\n * Auth controller for setup flow\n *\n * Handles Claude OAuth authentication via the Control UI\n */\n\nimport type { GatewayBrowserClient } from \"../gateway\";\n\nexport type AuthState = {\n authConnected: boolean | null;\n authBusy: boolean;\n authMessage: string | null;\n authUrl: string | null;\n authCodeInput: string;\n authExpiresIn: number | null;\n setupStep: \"license\" | \"auth\" | \"whatsapp\" | \"complete\";\n client: GatewayBrowserClient | null;\n};\n\nexport type AuthStatusResponse = {\n connected: boolean;\n provider: string;\n email?: string;\n expiresIn?: number;\n expiresAt?: number;\n message?: string;\n};\n\nexport type AuthStartResponse = {\n authUrl: string;\n message?: string;\n};\n\nexport type AuthCodeResponse = {\n message?: string;\n};\n\nexport type AuthWaitResponse = {\n connected: boolean;\n email?: string;\n message?: string;\n};\n\n/**\n * Check current auth status\n */\nexport async function checkAuthStatus(state: AuthState): Promise<void> {\n if (!state.client) return;\n\n state.authBusy = true;\n state.authMessage = null;\n\n try {\n const res = (await state.client.request(\"auth.status\", {})) as AuthStatusResponse;\n\n state.authConnected = res.connected;\n state.authExpiresIn = res.expiresIn ?? null;\n state.authMessage = res.message ?? null;\n\n // If already connected, skip to WhatsApp step\n if (res.connected) {\n state.setupStep = \"whatsapp\";\n }\n } catch (err) {\n state.authConnected = false;\n state.authMessage = err instanceof Error ? err.message : \"Failed to check auth status\";\n } finally {\n state.authBusy = false;\n }\n}\n\n/**\n * Start OAuth flow\n */\nexport async function startAuth(state: AuthState): Promise<void> {\n if (!state.client) return;\n\n state.authBusy = true;\n state.authMessage = null;\n state.authUrl = null;\n state.authConnected = null;\n\n try {\n const res = (await state.client.request(\"auth.oauth.start\", {\n provider: \"anthropic\",\n })) as AuthStartResponse;\n\n state.authUrl = res.authUrl;\n state.authMessage = res.message ?? \"Sign in with your Claude Pro account\";\n } catch (err) {\n state.authConnected = false;\n state.authMessage = err instanceof Error ? err.message : \"Failed to start auth flow\";\n } finally {\n state.authBusy = false;\n }\n}\n\n/**\n * Submit authorization code\n */\nexport async function submitAuthCode(state: AuthState, code: string): Promise<void> {\n if (!state.client) return;\n\n state.authBusy = true;\n state.authMessage = \"Verifying code...\";\n\n try {\n // Submit the code\n await state.client.request(\"auth.oauth.code\", { code });\n\n // Wait for completion\n const res = (await state.client.request(\"auth.oauth.wait\", {\n timeoutMs: 30000,\n })) as AuthWaitResponse;\n\n if (res.connected) {\n state.authConnected = true;\n state.authMessage = res.message ?? \"Connected to Claude!\";\n state.authUrl = null;\n state.authCodeInput = \"\";\n // Move to WhatsApp step after a brief delay\n setTimeout(() => {\n state.setupStep = \"whatsapp\";\n }, 1500);\n } else {\n state.authMessage = res.message ?? \"Still waiting for authorization...\";\n }\n } catch (err) {\n state.authConnected = false;\n state.authMessage = err instanceof Error ? err.message : \"Verification failed\";\n } finally {\n state.authBusy = false;\n }\n}\n\n/**\n * Update code input\n */\nexport function updateAuthCodeInput(state: AuthState, code: string): void {\n state.authCodeInput = code;\n}\n\n/**\n * Skip to WhatsApp step (when already connected)\n */\nexport function skipToWhatsApp(state: AuthState): void {\n state.setupStep = \"whatsapp\";\n}\n\n/**\n * Initialize auth state\n */\nexport function initAuthState(): Partial<AuthState> {\n return {\n authConnected: null,\n authBusy: false,\n authMessage: null,\n authUrl: null,\n authCodeInput: \"\",\n authExpiresIn: null,\n setupStep: \"auth\",\n };\n}\n","/**\n * License controller for setup flow\n *\n * Handles license key activation via the Setup UI.\n */\n\nimport type { GatewayBrowserClient } from \"../gateway\";\n\nexport type LicenseState = {\n licenseKey: string;\n licenseBusy: boolean;\n licenseValid: boolean | null;\n licenseMessage: string | null;\n licenseTier: string | null;\n licenseDeviceId: string | null;\n licenseStoredKey: string | null;\n setupStep: \"license\" | \"auth\" | \"whatsapp\" | \"complete\";\n client: GatewayBrowserClient | null;\n};\n\nexport type LicenseStatusResponse = {\n licensed: boolean;\n deviceId?: string;\n tier?: string;\n expiresAt?: string;\n key?: string;\n};\n\nexport type LicenseActivateResponse = {\n valid: boolean;\n message?: string;\n tier?: string;\n expiresAt?: string;\n};\n\n/**\n * Check current license status.\n * If already licensed, skip to the auth step.\n */\nexport async function checkLicenseStatus(state: LicenseState): Promise<void> {\n if (!state.client) return;\n\n state.licenseBusy = true;\n state.licenseMessage = null;\n\n try {\n const res = (await state.client.request(\"license.status\", {})) as LicenseStatusResponse;\n\n state.licenseDeviceId = res.deviceId ?? null;\n state.licenseStoredKey = res.key ?? null;\n\n if (res.licensed) {\n state.licenseValid = true;\n state.licenseTier = res.tier ?? null;\n state.setupStep = \"auth\";\n } else {\n state.licenseValid = null;\n state.setupStep = \"license\";\n }\n } catch (err) {\n // If the method is unknown (older gateway), skip the license step\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"unknown method\")) {\n state.licenseValid = true;\n state.setupStep = \"auth\";\n } else {\n state.licenseValid = null;\n state.licenseMessage = msg;\n state.setupStep = \"license\";\n }\n } finally {\n state.licenseBusy = false;\n }\n}\n\n/**\n * Activate a license key via the gateway.\n */\nexport async function activateLicense(state: LicenseState): Promise<void> {\n if (!state.client) return;\n if (!state.licenseKey.trim()) return;\n\n state.licenseBusy = true;\n state.licenseMessage = null;\n state.licenseValid = null;\n\n try {\n const res = (await state.client.request(\"license.activate\", {\n key: state.licenseKey.trim(),\n })) as LicenseActivateResponse;\n\n if (res.valid) {\n state.licenseValid = true;\n state.licenseMessage = res.message ?? \"License activated\";\n state.licenseTier = res.tier ?? null;\n // Move to auth step after a brief delay\n setTimeout(() => {\n state.setupStep = \"auth\";\n }, 1500);\n } else {\n state.licenseValid = false;\n state.licenseMessage = res.message ?? \"Invalid license key\";\n }\n } catch (err) {\n state.licenseValid = false;\n state.licenseMessage = err instanceof Error ? err.message : \"Activation failed\";\n } finally {\n state.licenseBusy = false;\n }\n}\n\n/**\n * Remove the stored license. Drops back to the license step.\n */\nexport async function removeLicense(state: LicenseState): Promise<void> {\n if (!state.client) return;\n\n state.licenseBusy = true;\n try {\n await state.client.request(\"license.remove\", {});\n state.licenseValid = null;\n state.licenseKey = \"\";\n state.licenseTier = null;\n state.licenseMessage = null;\n state.setupStep = \"license\";\n } catch (err) {\n state.licenseMessage = err instanceof Error ? err.message : \"Failed to remove license\";\n } finally {\n state.licenseBusy = false;\n }\n}\n\n/**\n * Update the license key input.\n */\nexport function updateLicenseKey(state: LicenseState, key: string): void {\n state.licenseKey = key;\n}\n\n/**\n * Initialize license state.\n */\nexport function initLicenseState(): Partial<LicenseState> {\n return {\n licenseKey: \"\",\n licenseBusy: false,\n licenseValid: null,\n licenseMessage: null,\n licenseTier: null,\n licenseDeviceId: null,\n licenseStoredKey: null,\n setupStep: \"license\",\n };\n}\n","/**\n * Gateway status and restart controller for setup page\n */\n\nexport interface GatewayState {\n client: { request: (method: string, params: unknown) => Promise<unknown> } | null;\n connected: boolean;\n gatewayHealthy: boolean | null;\n gatewayHealthLoading: boolean;\n gatewayHealthMessage: string | null;\n gatewayRestartBusy: boolean;\n requestUpdate?: () => void;\n}\n\ninterface HealthResponse {\n ok: boolean;\n durationMs?: number;\n}\n\ninterface RestartResponse {\n ok: boolean;\n restart?: {\n ok: boolean;\n delayMs?: number;\n };\n}\n\nexport async function loadGatewayHealth(state: GatewayState): Promise<void> {\n if (!state.client || !state.connected) return;\n if (state.gatewayHealthLoading) return;\n\n state.gatewayHealthLoading = true;\n state.requestUpdate?.();\n\n try {\n const res = (await state.client.request(\"health\", {\n probe: true,\n })) as HealthResponse;\n\n state.gatewayHealthy = res.ok === true;\n state.gatewayHealthMessage = res.ok\n ? `Healthy${res.durationMs ? ` (${res.durationMs}ms)` : \"\"}`\n : \"Unhealthy\";\n } catch (err) {\n state.gatewayHealthy = false;\n state.gatewayHealthMessage = `Error: ${String(err)}`;\n } finally {\n state.gatewayHealthLoading = false;\n state.requestUpdate?.();\n }\n}\n\nexport async function restartGateway(state: GatewayState): Promise<void> {\n if (!state.client || state.gatewayRestartBusy) return;\n\n state.gatewayRestartBusy = true;\n state.gatewayHealthMessage = \"Restarting...\";\n state.requestUpdate?.();\n\n try {\n const res = (await state.client.request(\"gateway.restart\", {\n reason: \"Manual restart from setup page\",\n delayMs: 1000,\n })) as RestartResponse;\n\n if (res.ok && res.restart?.ok) {\n state.gatewayHealthMessage = \"Restarting...\";\n // The gateway will restart and we'll lose connection\n // Wait a bit then reload the page\n setTimeout(() => {\n window.location.reload();\n }, 3000);\n } else {\n throw new Error(\"Restart not scheduled\");\n }\n } catch (err) {\n state.gatewayHealthMessage = `Restart failed: ${String(err)}`;\n state.gatewayRestartBusy = false;\n state.requestUpdate?.();\n }\n}\n","/**\n * Software update controller for setup page\n */\n\nexport interface UpdateState {\n client: { request: (method: string, params: unknown) => Promise<unknown> } | null;\n connected: boolean;\n updateAvailable: boolean | null;\n currentVersion: string | null;\n latestVersion: string | null;\n updateChecking: boolean;\n updateRunning: boolean;\n updateMessage: string | null;\n requestUpdate?: () => void;\n}\n\ninterface UpdateStatusResponse {\n ok: boolean;\n current: string;\n latest: string | null;\n updateAvailable: boolean;\n installKind: string;\n channel: string;\n error?: string;\n}\n\ninterface UpdateRunResponse {\n ok: boolean;\n result: {\n status: string;\n mode: string;\n reason?: string;\n before?: string;\n after?: string;\n };\n restart: {\n ok: boolean;\n delayMs?: number;\n };\n}\n\nexport async function checkForUpdates(state: UpdateState): Promise<void> {\n if (!state.client || !state.connected) return;\n if (state.updateChecking) return;\n\n state.updateChecking = true;\n state.updateMessage = null;\n state.requestUpdate?.();\n\n try {\n const res = (await state.client.request(\"update.status\", {})) as UpdateStatusResponse;\n state.currentVersion = res.current;\n state.latestVersion = res.latest;\n state.updateAvailable = res.updateAvailable;\n state.updateMessage = res.updateAvailable\n ? `v${res.latest} available`\n : \"Up to date\";\n } catch (err) {\n state.updateMessage = `Check failed: ${String(err)}`;\n state.updateAvailable = null;\n } finally {\n state.updateChecking = false;\n state.requestUpdate?.();\n }\n}\n\nexport async function runUpdate(state: UpdateState): Promise<void> {\n if (!state.client || state.updateRunning) return;\n\n state.updateRunning = true;\n state.updateMessage = \"Updating...\";\n state.requestUpdate?.();\n\n try {\n const res = (await state.client.request(\"update.run\", {\n restartDelayMs: 2000,\n note: \"Update from setup page\",\n })) as UpdateRunResponse;\n\n if (res.ok && res.result.status === \"ok\") {\n state.updateMessage = \"Updated — restarting...\";\n state.requestUpdate?.();\n // Gateway will restart, wait then reload\n setTimeout(() => {\n window.location.reload();\n }, 5000);\n } else {\n throw new Error(res.result.reason || \"Update failed\");\n }\n } catch (err) {\n state.updateMessage = `Update failed: ${String(err)}`;\n state.updateRunning = false;\n state.requestUpdate?.();\n }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport { resolveInjectedAssistantIdentity } from \"./assistant-identity\";\nimport { loadSettings, setActiveWorkspace, type UiSettings } from \"./storage\";\nimport { renderApp } from \"./app-render\";\nimport type { Tab } from \"./navigation\";\nimport type { ResolvedTheme, ThemeMode } from \"./theme\";\nimport type {\n AgentsListResult,\n ConfigSnapshot,\n ConfigUiHints,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n LogEntry,\n LogLevel,\n PresenceEntry,\n ChannelsStatusSnapshot,\n SessionsListResult,\n SessionTranscriptEntry,\n SessionLogType,\n SkillStatusReport,\n StatusSummary,\n NostrProfile,\n} from \"./types\";\nimport { type ChatAttachment, type ChatQueueItem, type CronFormState } from \"./ui-types\";\nimport type { EventLogEntry } from \"./app-events\";\nimport { DEFAULT_CRON_FORM, DEFAULT_LOG_LEVEL_FILTERS } from \"./app-defaults\";\nimport type {\n ExecApprovalsFile,\n ExecApprovalsSnapshot,\n} from \"./controllers/exec-approvals\";\nimport type { DevicePairingList } from \"./controllers/devices\";\nimport type { ExecApprovalRequest } from \"./controllers/exec-approval\";\nimport type { AdminPhoneEntry } from \"./types.admins\";\nimport {\n resetToolStream as resetToolStreamInternal,\n type ToolStreamEntry,\n} from \"./app-tool-stream\";\nimport {\n exportLogs as exportLogsInternal,\n exportSessionLogs as exportSessionLogsInternal,\n handleChatScroll as handleChatScrollInternal,\n handleLogsScroll as handleLogsScrollInternal,\n handleSessionLogsScroll as handleSessionLogsScrollInternal,\n resetChatScroll as resetChatScrollInternal,\n} from \"./app-scroll\";\nimport { connectGateway as connectGatewayInternal } from \"./app-gateway\";\nimport {\n handleConnected,\n handleDisconnected,\n handleFirstUpdated,\n handleUpdated,\n} from \"./app-lifecycle\";\nimport {\n applySettings as applySettingsInternal,\n loadCron as loadCronInternal,\n loadOverview as loadOverviewInternal,\n setTab as setTabInternal,\n setTheme as setThemeInternal,\n onPopState as onPopStateInternal,\n} from \"./app-settings\";\nimport {\n handleAbortChat as handleAbortChatInternal,\n handleSendChat as handleSendChatInternal,\n removeQueuedMessage as removeQueuedMessageInternal,\n} from \"./app-chat\";\nimport {\n handleChannelConfigReload as handleChannelConfigReloadInternal,\n handleChannelConfigSave as handleChannelConfigSaveInternal,\n handleNostrProfileCancel as handleNostrProfileCancelInternal,\n handleNostrProfileEdit as handleNostrProfileEditInternal,\n handleNostrProfileFieldChange as handleNostrProfileFieldChangeInternal,\n handleNostrProfileImport as handleNostrProfileImportInternal,\n handleNostrProfileSave as handleNostrProfileSaveInternal,\n handleNostrProfileToggleAdvanced as handleNostrProfileToggleAdvancedInternal,\n handleAddWhatsAppAccount as handleAddWhatsAppAccountInternal,\n handleRemoveWhatsAppAccount as handleRemoveWhatsAppAccountInternal,\n handleWhatsAppLogout as handleWhatsAppLogoutInternal,\n handleWhatsAppStart as handleWhatsAppStartInternal,\n handleWhatsAppWait as handleWhatsAppWaitInternal,\n} from \"./app-channels\";\nimport type { NostrProfileFormState } from \"./views/channels.nostr-profile-form\";\nimport { loadAssistantIdentity as loadAssistantIdentityInternal } from \"./controllers/assistant-identity\";\nimport {\n checkAuthStatus as checkAuthStatusInternal,\n startAuth as startAuthInternal,\n submitAuthCode as submitAuthCodeInternal,\n updateAuthCodeInput as updateAuthCodeInputInternal,\n skipToWhatsApp as skipToWhatsAppInternal,\n} from \"./controllers/auth\";\nimport {\n checkLicenseStatus as checkLicenseStatusInternal,\n activateLicense as activateLicenseInternal,\n removeLicense as removeLicenseInternal,\n updateLicenseKey as updateLicenseKeyInternal,\n} from \"./controllers/license\";\nimport {\n loadGatewayHealth as loadGatewayHealthInternal,\n restartGateway as restartGatewayInternal,\n} from \"./controllers/gateway\";\nimport {\n checkForUpdates as checkForUpdatesInternal,\n runUpdate as runUpdateInternal,\n} from \"./controllers/update\";\nimport { loadFileTree as loadFileTreeInternal } from \"./controllers/files\";\nimport {\n type AccessState,\n DEFAULT_ACCESS_STATE,\n checkAccessStatus as checkAccessStatusInternal,\n verifyPin as verifyPinInternal,\n setMasterPin as setMasterPinInternal,\n logout as logoutInternal,\n} from \"./controllers/access\";\n\ndeclare global {\n interface Window {\n __TASKMASTER_CONTROL_UI_BASE_PATH__?: string;\n }\n}\n\nconst injectedAssistantIdentity = resolveInjectedAssistantIdentity();\n\nfunction resolveOnboardingMode(): boolean {\n if (!window.location.search) return false;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(\"onboarding\");\n if (!raw) return false;\n const normalized = raw.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nfunction resolveSetupMode(): boolean {\n // Check for /setup path\n const pathname = window.location.pathname;\n if (pathname === \"/setup\" || pathname.endsWith(\"/setup\")) {\n return true;\n }\n // Check for ?setup= query parameter\n if (!window.location.search) return false;\n const params = new URLSearchParams(window.location.search);\n const raw = params.get(\"setup\");\n if (!raw) return false;\n const normalized = raw.trim().toLowerCase();\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\";\n}\n\nfunction resolveFilesPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/files\" || pathname.endsWith(\"/files\");\n}\n\nfunction resolveBrowserPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/browser\" || pathname.endsWith(\"/browser\");\n}\n\nfunction resolveAdminsPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/admins\" || pathname.endsWith(\"/admins\");\n}\n\nfunction resolveCustomersPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/customers\" || pathname.endsWith(\"/customers\");\n}\n\nfunction resolveChatPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/chat\" || pathname.endsWith(\"/chat\");\n}\n\nfunction resolveAdvancedPageMode(): boolean {\n const pathname = window.location.pathname;\n return pathname === \"/advanced\" || pathname.endsWith(\"/advanced\");\n}\n\n@customElement(\"taskmaster-app\")\nexport class TaskmasterApp extends LitElement {\n @state() settings: UiSettings = loadSettings();\n @state() password = \"\";\n @state() tab: Tab = \"chat\";\n @state() onboarding = resolveOnboardingMode();\n @state() setup = resolveSetupMode();\n @state() filesPage = resolveFilesPageMode();\n @state() browserPage = resolveBrowserPageMode();\n @state() adminsPage = resolveAdminsPageMode();\n @state() customersPage = resolveCustomersPageMode();\n @state() chatPage = resolveChatPageMode();\n @state() advancedPage = resolveAdvancedPageMode();\n @state() advancedTab: \"cron\" | \"skills\" | \"logs\" = \"cron\";\n @state() connected = false;\n @state() accessState: AccessState = DEFAULT_ACCESS_STATE;\n @state() theme: ThemeMode = this.settings.theme ?? \"system\";\n @state() themeResolved: ResolvedTheme = \"dark\";\n @state() hello: GatewayHelloOk | null = null;\n @state() lastError: string | null = null;\n @state() eventLog: EventLogEntry[] = [];\n private eventLogBuffer: EventLogEntry[] = [];\n private toolStreamSyncTimer: number | null = null;\n private sidebarCloseTimer: number | null = null;\n\n @state() assistantName = injectedAssistantIdentity.name;\n @state() assistantAvatar = injectedAssistantIdentity.avatar;\n @state() assistantAgentId = injectedAssistantIdentity.agentId ?? null;\n\n @state() sessionKey = this.settings.sessionKey;\n @state() chatLoading = false;\n @state() chatSending = false;\n @state() chatMessage = \"\";\n @state() chatMessages: unknown[] = [];\n @state() chatToolMessages: unknown[] = [];\n @state() chatStream: string | null = null;\n @state() chatStreamStartedAt: number | null = null;\n @state() chatRunId: string | null = null;\n @state() compactionStatus: import(\"./app-tool-stream\").CompactionStatus | null = null;\n @state() chatAvatarUrl: string | null = null;\n @state() chatThinkingLevel: string | null = null;\n @state() chatModelProvider: string | null = null;\n @state() chatModel: string | null = null;\n @state() chatModelCatalog: Array<{ id: string; name: string; provider: string; reasoning?: boolean }> = [];\n @state() chatVerboseLevel: string | null = null;\n @state() chatFillerEnabled: boolean | null = null;\n @state() chatQueue: ChatQueueItem[] = [];\n @state() chatAttachments: ChatAttachment[] = [];\n // Sidebar state for tool output viewing\n @state() sidebarOpen = false;\n @state() sidebarContent: string | null = null;\n @state() sidebarError: string | null = null;\n @state() splitRatio = this.settings.splitRatio;\n\n @state() nodesLoading = false;\n @state() nodes: Array<Record<string, unknown>> = [];\n @state() devicesLoading = false;\n @state() devicesError: string | null = null;\n @state() devicesList: DevicePairingList | null = null;\n @state() execApprovalsLoading = false;\n @state() execApprovalsSaving = false;\n @state() execApprovalsDirty = false;\n @state() execApprovalsSnapshot: ExecApprovalsSnapshot | null = null;\n @state() execApprovalsForm: ExecApprovalsFile | null = null;\n @state() execApprovalsSelectedAgent: string | null = null;\n @state() execApprovalsTarget: \"gateway\" | \"node\" = \"gateway\";\n @state() execApprovalsTargetNodeId: string | null = null;\n @state() execApprovalQueue: ExecApprovalRequest[] = [];\n @state() execApprovalBusy = false;\n @state() execApprovalError: string | null = null;\n\n @state() configLoading = false;\n @state() configRaw = \"{\\n}\\n\";\n @state() configRawOriginal = \"\";\n @state() configValid: boolean | null = null;\n @state() configIssues: unknown[] = [];\n @state() configSaving = false;\n @state() configApplying = false;\n @state() updateRunning = false;\n @state() applySessionKey = this.settings.lastActiveSessionKey;\n @state() configSnapshot: ConfigSnapshot | null = null;\n @state() configSchema: unknown | null = null;\n @state() configSchemaVersion: string | null = null;\n @state() configSchemaLoading = false;\n @state() configUiHints: ConfigUiHints = {};\n @state() configForm: Record<string, unknown> | null = null;\n @state() configFormOriginal: Record<string, unknown> | null = null;\n @state() configFormDirty = false;\n @state() configFormMode: \"form\" | \"raw\" = \"form\";\n @state() configSearchQuery = \"\";\n @state() configActiveSection: string | null = null;\n @state() configActiveSubsection: string | null = null;\n\n @state() channelsLoading = false;\n @state() channelsSnapshot: ChannelsStatusSnapshot | null = null;\n @state() channelsError: string | null = null;\n @state() channelsLastSuccess: number | null = null;\n @state() whatsappLoginMessage: string | null = null;\n @state() whatsappLoginQrDataUrl: string | null = null;\n @state() whatsappLoginConnected: boolean | null = null;\n @state() whatsappBusy = false;\n @state() whatsappActiveQrAccountId: string | null = null;\n @state() whatsappPairedPhone: string | null = null;\n @state() addingWhatsAppAccount = false;\n @state() newWhatsAppAccountName = \"\";\n @state() whatsappAccountError: string | null = null;\n @state() whatsappAccountSaving = false;\n @state() whatsappSettingsOpen = false;\n // License state for setup flow\n @state() licenseKey = \"\";\n @state() licenseBusy = false;\n @state() licenseValid: boolean | null = null;\n @state() licenseMessage: string | null = null;\n @state() licenseTier: string | null = null;\n @state() licenseDeviceId: string | null = null;\n @state() licenseStoredKey: string | null = null;\n @state() licenseRemoveConfirm = false;\n // Auth state for setup flow\n @state() authConnected: boolean | null = null;\n @state() authBusy = false;\n @state() authMessage: string | null = null;\n @state() authUrl: string | null = null;\n @state() authCodeInput = \"\";\n @state() authExpiresIn: number | null = null;\n @state() setupStep: \"license\" | \"auth\" | \"whatsapp\" | \"complete\" = \"license\";\n // Gateway status for setup page\n @state() gatewayHealthy: boolean | null = null;\n @state() gatewayHealthLoading = false;\n @state() gatewayHealthMessage: string | null = null;\n @state() gatewayRestartBusy = false;\n // Software update state\n @state() updateAvailable: boolean | null = null;\n @state() currentVersion: string | null = null;\n @state() latestVersion: string | null = null;\n @state() updateChecking = false;\n // updateRunning is declared above (shared with config controller)\n @state() updateMessage: string | null = null;\n @state() nostrProfileFormState: NostrProfileFormState | null = null;\n @state() nostrProfileAccountId: string | null = null;\n\n @state() presenceLoading = false;\n @state() presenceEntries: PresenceEntry[] = [];\n @state() presenceError: string | null = null;\n @state() presenceStatus: string | null = null;\n\n @state() agentsLoading = false;\n @state() agentsList: AgentsListResult | null = null;\n @state() agentsError: string | null = null;\n\n @state() sessionsLoading = false;\n @state() sessionsResult: SessionsListResult | null = null;\n @state() sessionsError: string | null = null;\n\n @state() cronLoading = false;\n @state() cronJobs: CronJob[] = [];\n @state() cronStatus: CronStatus | null = null;\n @state() cronError: string | null = null;\n @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };\n @state() cronRunsJobId: string | null = null;\n @state() cronRuns: CronRunLogEntry[] = [];\n @state() cronBusy = false;\n @state() cronNewEventModal = false;\n @state() cronDetailJobId: string | null = null;\n workspaceAgentIds?: string[];\n\n @state() browserScreencastActive = false;\n @state() browserScreencastFrame: string | null = null;\n @state() browserScreencastMetadata: { deviceWidth?: number; deviceHeight?: number } | null = null;\n @state() browserHandoffPending = false;\n @state() browserHandoffReason: string | null = null;\n @state() browserHandoffId: string | null = null;\n @state() browserInputMode = false;\n @state() browserLoading = false;\n @state() browserError: string | null = null;\n\n @state() filesLoading = false;\n @state() filesTree: Array<import(\"./controllers/files\").FileTreeEntry> = [];\n @state() filesRoot = \"\";\n @state() filesError: string | null = null;\n @state() filesSelectedPath: string | null = null;\n @state() filesSelectedPaths: Set<string> = new Set();\n @state() filesPreviewContent: string | null = null;\n @state() filesPreviewLoading = false;\n @state() filesPreviewBinary = false;\n @state() filesPreviewSize: number | null = null;\n @state() filesExpandedDirs: Set<string> = new Set();\n @state() filesMessage: { kind: \"success\" | \"error\"; text: string } | null = null;\n @state() filesUploadBusy = false;\n\n @state() skillsLoading = false;\n @state() skillsReport: SkillStatusReport | null = null;\n @state() skillsError: string | null = null;\n @state() skillsFilter = \"\";\n @state() skillEdits: Record<string, string> = {};\n @state() skillsBusyKey: string | null = null;\n @state() skillMessages: Record<string, SkillMessage> = {};\n\n @state() adminsLoading = false;\n @state() adminPhones: AdminPhoneEntry[] = [];\n @state() adminsError: string | null = null;\n @state() adminsSaving = false;\n @state() adminsNewPhone = \"\";\n\n @state() customersLoading = false;\n @state() customersSaving = false;\n @state() customersRecords: Array<import(\"./controllers/customers\").CustomerRecord> = [];\n @state() customersError: string | null = null;\n @state() customersSearchQuery = \"\";\n @state() customersEditingId: string | null = null;\n @state() customersShowAddForm = false;\n @state() customersNewPhone = \"\";\n @state() customersNewName = \"\";\n\n // Workspaces state\n // iMessage UI state\n @state() imessageEnableConfirm = false;\n @state() imessageEnabling = false;\n // Info modal\n @state() infoModalOpen: string | null = null;\n\n @state() workspaces: import(\"./controllers/workspaces\").WorkspaceInfo[] = [];\n @state() workspacesLoading = false;\n @state() workspacesError: string | null = null;\n @state() selectedWorkspace: string | null = null;\n @state() addingWorkspace = false;\n @state() newWorkspaceName = \"\";\n @state() newWorkspacePath = \"\";\n @state() newWorkspacePin = \"\";\n @state() accountPinModalOpen = false;\n @state() accountPinBusy = false;\n @state() accountPinError: string | null = null;\n @state() accountPinSuccess: string | null = null;\n // API Keys management\n @state() apiKeyProviders: import(\"./controllers/apikeys\").ApiKeyProvider[] = [];\n @state() apiKeyModalOpen = false;\n @state() apiKeyBusy = false;\n @state() apiKeyError: string | null = null;\n @state() apiKeySuccess: string | null = null;\n @state() authApiKeyMode = false;\n @state() authApiKeyInput = \"\";\n @state() authApiKeyBusy = false;\n @state() authApiKeyError: string | null = null;\n @state() pinChanging: \"master\" | \"account\" | null = null;\n @state() pinChangeBusy = false;\n @state() pinChangeError: string | null = null;\n @state() loginChangePinMode = false;\n @state() changePinBusy = false;\n @state() changePinError: string | null = null;\n @state() changePinSuccess: string | null = null;\n @state() workspaceSaving = false;\n @state() workspaceRemoveConfirm: string | null = null;\n @state() renamingWorkspace = false;\n @state() renameWorkspaceName = \"\";\n\n @state() debugLoading = false;\n @state() debugStatus: StatusSummary | null = null;\n @state() debugHealth: HealthSnapshot | null = null;\n @state() debugModels: unknown[] = [];\n @state() debugHeartbeat: unknown | null = null;\n @state() debugCallMethod = \"\";\n @state() debugCallParams = \"{}\";\n @state() debugCallResult: string | null = null;\n @state() debugCallError: string | null = null;\n\n @state() logsLoading = false;\n @state() logsError: string | null = null;\n @state() logsFile: string | null = null;\n @state() logsEntries: LogEntry[] = [];\n @state() logsFilterText = \"\";\n @state() logsLevelFilters: Record<LogLevel, boolean> = {\n ...DEFAULT_LOG_LEVEL_FILTERS,\n };\n @state() logsAutoFollow = true;\n @state() logsTruncated = false;\n @state() logsCursor: number | null = null;\n @state() logsLastFetchAt: number | null = null;\n @state() logsLimit = 500;\n @state() logsMaxBytes = 250_000;\n @state() logsAtBottom = true;\n\n @state() logsSubTab: \"system\" | \"session\" = \"session\";\n @state() sessionLogsLoading = false;\n @state() sessionLogsError: string | null = null;\n @state() sessionLogsEntries: SessionTranscriptEntry[] = [];\n @state() sessionLogsFilterText = \"\";\n @state() sessionLogsTypeFilters: Record<SessionLogType, boolean> = {\n user: true,\n assistant: true,\n tool: true,\n thinking: true,\n error: true,\n system: true,\n };\n @state() sessionLogsAgentFilters: Record<string, boolean> = {};\n @state() sessionLogsAgents: string[] = [];\n @state() sessionLogsAutoFollow = true;\n @state() sessionLogsCursors: Record<string, number> = {};\n @state() sessionLogsLastFetchAt: number | null = null;\n @state() sessionLogsAtBottom = true;\n\n client: GatewayBrowserClient | null = null;\n private chatScrollFrame: number | null = null;\n private chatScrollTimeout: number | null = null;\n private chatHasAutoScrolled = false;\n @state() chatUserNearBottom = true;\n private nodesPollInterval: number | null = null;\n private logsPollInterval: number | null = null;\n private sessionLogsPollInterval: number | null = null;\n private debugPollInterval: number | null = null;\n private logsScrollFrame: number | null = null;\n private toolStreamById = new Map<string, ToolStreamEntry>();\n private toolStreamOrder: string[] = [];\n basePath = \"\";\n private popStateHandler = () =>\n onPopStateInternal(\n this as unknown as Parameters<typeof onPopStateInternal>[0],\n );\n private themeMedia: MediaQueryList | null = null;\n private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;\n private topbarObserver: ResizeObserver | null = null;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n handleConnected(this as unknown as Parameters<typeof handleConnected>[0]);\n }\n\n protected firstUpdated() {\n handleFirstUpdated(this as unknown as Parameters<typeof handleFirstUpdated>[0]);\n }\n\n disconnectedCallback() {\n handleDisconnected(this as unknown as Parameters<typeof handleDisconnected>[0]);\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<PropertyKey, unknown>) {\n handleUpdated(\n this as unknown as Parameters<typeof handleUpdated>[0],\n changed,\n );\n }\n\n connect() {\n connectGatewayInternal(\n this as unknown as Parameters<typeof connectGatewayInternal>[0],\n );\n }\n\n handleChatScroll(event: Event) {\n handleChatScrollInternal(\n this as unknown as Parameters<typeof handleChatScrollInternal>[0],\n event,\n );\n }\n\n handleLogsScroll(event: Event) {\n handleLogsScrollInternal(\n this as unknown as Parameters<typeof handleLogsScrollInternal>[0],\n event,\n );\n }\n\n handleSessionLogsScroll(event: Event) {\n handleSessionLogsScrollInternal(\n this as unknown as Parameters<typeof handleSessionLogsScrollInternal>[0],\n event,\n );\n }\n\n exportLogs(lines: string[], label: string) {\n exportLogsInternal(lines, label);\n }\n\n exportSessionLogs(lines: string[], label: string) {\n exportSessionLogsInternal(lines, label);\n }\n\n resetToolStream() {\n resetToolStreamInternal(\n this as unknown as Parameters<typeof resetToolStreamInternal>[0],\n );\n }\n\n resetChatScroll() {\n resetChatScrollInternal(\n this as unknown as Parameters<typeof resetChatScrollInternal>[0],\n );\n }\n\n async loadAssistantIdentity() {\n await loadAssistantIdentityInternal(this);\n }\n\n applySettings(next: UiSettings) {\n applySettingsInternal(\n this as unknown as Parameters<typeof applySettingsInternal>[0],\n next,\n );\n }\n\n setTab(next: Tab) {\n setTabInternal(this as unknown as Parameters<typeof setTabInternal>[0], next);\n }\n\n setTheme(next: ThemeMode, context?: Parameters<typeof setThemeInternal>[2]) {\n setThemeInternal(\n this as unknown as Parameters<typeof setThemeInternal>[0],\n next,\n context,\n );\n }\n\n async loadOverview() {\n await loadOverviewInternal(\n this as unknown as Parameters<typeof loadOverviewInternal>[0],\n );\n }\n\n async loadCron() {\n const wsInfo = this.getSelectedWorkspaceInfo();\n this.workspaceAgentIds = wsInfo?.agents?.map((a) => a.id) ?? undefined;\n this.cronForm = {\n ...this.cronForm,\n accountId: wsInfo?.whatsappAccountId ?? undefined,\n };\n await loadCronInternal(\n this as unknown as Parameters<typeof loadCronInternal>[0],\n );\n }\n\n async handleAbortChat() {\n await handleAbortChatInternal(\n this as unknown as Parameters<typeof handleAbortChatInternal>[0],\n );\n }\n\n removeQueuedMessage(id: string) {\n removeQueuedMessageInternal(\n this as unknown as Parameters<typeof removeQueuedMessageInternal>[0],\n id,\n );\n }\n\n async handleSendChat(\n messageOverride?: string,\n opts?: Parameters<typeof handleSendChatInternal>[2],\n ) {\n await handleSendChatInternal(\n this as unknown as Parameters<typeof handleSendChatInternal>[0],\n messageOverride,\n opts,\n );\n }\n\n async handleWhatsAppStart(force: boolean, accountId?: string) {\n await handleWhatsAppStartInternal(this, force, accountId);\n }\n\n async handleWhatsAppWait(accountId?: string) {\n await handleWhatsAppWaitInternal(this, accountId);\n }\n\n async handleWhatsAppLogout(accountId?: string) {\n await handleWhatsAppLogoutInternal(this, accountId);\n }\n\n async handleAddWhatsAppAccount(name: string) {\n await handleAddWhatsAppAccountInternal(this, name);\n }\n\n async handleRemoveWhatsAppAccount(accountId: string) {\n await handleRemoveWhatsAppAccountInternal(this, accountId);\n }\n\n // Access (PIN) handlers\n async handleAccessCheck() {\n await checkAccessStatusInternal(this);\n }\n\n async handlePinSubmit(account: string, pin: string) {\n await verifyPinInternal(this, account, pin);\n // Auto-scope to workspace if this is an account-level PIN (not master)\n if (this.accessState.authenticated && this.accessState.workspace) {\n this.handleWorkspaceSelect(this.accessState.workspace);\n }\n }\n\n async handleSetMasterPin(pin: string) {\n await setMasterPinInternal(this, pin);\n }\n\n async handleLogout() {\n await logoutInternal(this);\n }\n\n toggleChangePinMode() {\n this.loginChangePinMode = !this.loginChangePinMode;\n this.changePinError = null;\n this.changePinSuccess = null;\n }\n\n async handleChangePin(account: string, oldPin: string, newPin: string) {\n if (!this.client) return;\n this.changePinBusy = true;\n this.changePinError = null;\n this.changePinSuccess = null;\n try {\n // Step 1: Verify the current PIN\n const verifyResult = (await this.client.request(\"access.verify\", { account, pin: oldPin })) as {\n ok: boolean;\n message?: string;\n };\n if (!verifyResult.ok) {\n this.changePinError = verifyResult.message ?? \"Incorrect current PIN\";\n this.changePinBusy = false;\n return;\n }\n // Step 2: Set the new PIN\n if (account === \"__master__\") {\n await this.client.request(\"access.setMasterPin\", { pin: newPin });\n } else {\n await this.client.request(\"access.setAccountPin\", { workspace: account, pin: newPin });\n }\n this.changePinSuccess = \"PIN changed successfully\";\n this.changePinBusy = false;\n // Return to login mode after a short delay\n setTimeout(() => {\n this.loginChangePinMode = false;\n this.changePinSuccess = null;\n }, 2000);\n } catch {\n this.changePinError = \"Failed to change PIN\";\n this.changePinBusy = false;\n }\n }\n\n async handleAccountPinSave(workspace: string, oldPin: string | null, newPin: string) {\n if (!this.client) return;\n this.accountPinBusy = true;\n this.accountPinError = null;\n this.accountPinSuccess = null;\n try {\n // If changing existing PIN, verify the old one first\n if (oldPin !== null) {\n const verifyResult = (await this.client.request(\"access.verify\", { account: workspace, pin: oldPin })) as {\n ok: boolean; message?: string;\n };\n if (!verifyResult.ok) {\n this.accountPinError = verifyResult.message ?? \"Incorrect current PIN\";\n this.accountPinBusy = false;\n return;\n }\n }\n // Set the new PIN\n await this.client.request(\"access.setAccountPin\", { workspace, pin: newPin });\n this.accountPinSuccess = \"PIN saved\";\n this.accountPinBusy = false;\n // Refresh access state so the accounts list updates\n await checkAccessStatusInternal(this);\n // Close modal after a short delay\n setTimeout(() => {\n this.accountPinModalOpen = false;\n this.accountPinSuccess = null;\n this.accountPinError = null;\n }, 1500);\n } catch {\n this.accountPinError = \"Failed to save PIN\";\n this.accountPinBusy = false;\n }\n }\n\n // License handlers for setup flow\n async handleLicenseStatusCheck() {\n await checkLicenseStatusInternal(this);\n }\n\n async handleLicenseActivate() {\n await activateLicenseInternal(this);\n }\n\n async handleLicenseRemove() {\n await removeLicenseInternal(this);\n }\n\n handleLicenseKeyChange(key: string) {\n updateLicenseKeyInternal(this, key);\n }\n\n // Auth handlers for setup flow\n async handleAuthStatusCheck() {\n await checkAuthStatusInternal(this);\n }\n\n async handleAuthStart() {\n await startAuthInternal(this);\n }\n\n async handleAuthSubmitCode(code: string) {\n await submitAuthCodeInternal(this, code);\n }\n\n handleAuthCodeChange(code: string) {\n updateAuthCodeInputInternal(this, code);\n }\n\n handleSkipToWhatsApp() {\n skipToWhatsAppInternal(this);\n }\n\n // Gateway handlers for setup page\n async handleGatewayHealthCheck() {\n await loadGatewayHealthInternal(this);\n }\n\n async handleGatewayRestart() {\n await restartGatewayInternal(this);\n }\n\n // Software update handlers for setup page\n async handleUpdateCheck() {\n await checkForUpdatesInternal(this);\n }\n\n async handleUpdateRun() {\n await runUpdateInternal(this);\n }\n\n // Files page: auto-load file tree on connect\n handleFilesLoad() {\n const filesAgentId = this.resolveFilesAgentId();\n void loadFileTreeInternal(this, filesAgentId);\n }\n\n // Admins page: auto-load admin phones on connect\n handleAdminsLoad() {\n const adminAgentId = this.resolveAdminAgentId();\n void import(\"./controllers/admins\").then(({ loadAdmins }) => {\n loadAdmins(this, adminAgentId);\n });\n }\n\n private resolveAdminAgentId(): string | undefined {\n const ws = this.getSelectedWorkspaceInfo();\n if (!ws) return undefined;\n const adminAgent = ws.agents.find((a) => a.id.endsWith(\"-admin\") || a.id === \"admin\");\n return adminAgent?.id;\n }\n\n private resolveFilesAgentId(): string | undefined {\n const ws = this.getSelectedWorkspaceInfo();\n if (!ws) return undefined;\n return ws.agents[0]?.id;\n }\n\n // Chat page: auto-load chat history on connect\n // Derives session key from the selected workspace's admin agent\n // so switching businesses in the header selector routes to the correct agent.\n handleChatLoad() {\n const adminAgentId = this.resolveAdminAgentId();\n if (adminAgentId) {\n const newSessionKey = `agent:${adminAgentId}:main`;\n if (newSessionKey !== this.sessionKey) {\n this.sessionKey = newSessionKey;\n this.chatMessages = [];\n this.chatStream = null;\n this.chatRunId = null;\n this.applySettings({\n ...this.settings,\n sessionKey: newSessionKey,\n lastActiveSessionKey: newSessionKey,\n });\n void this.loadAssistantIdentity();\n }\n }\n void import(\"./controllers/chat\").then(({ loadChatHistory }) => {\n loadChatHistory(this);\n });\n }\n\n // Advanced page: auto-load default tab data on connect\n handleAdvancedLoad() {\n void this.loadCron();\n }\n\n async handleChannelConfigSave() {\n await handleChannelConfigSaveInternal(this);\n }\n\n async handleChannelConfigReload() {\n await handleChannelConfigReloadInternal(this);\n }\n\n handleNostrProfileEdit(accountId: string, profile: NostrProfile | null) {\n handleNostrProfileEditInternal(this, accountId, profile);\n }\n\n handleNostrProfileCancel() {\n handleNostrProfileCancelInternal(this);\n }\n\n handleNostrProfileFieldChange(field: keyof NostrProfile, value: string) {\n handleNostrProfileFieldChangeInternal(this, field, value);\n }\n\n async handleNostrProfileSave() {\n await handleNostrProfileSaveInternal(this);\n }\n\n async handleNostrProfileImport() {\n await handleNostrProfileImportInternal(this);\n }\n\n handleNostrProfileToggleAdvanced() {\n handleNostrProfileToggleAdvancedInternal(this);\n }\n\n async handleExecApprovalDecision(decision: \"allow-once\" | \"allow-always\" | \"deny\") {\n const active = this.execApprovalQueue[0];\n if (!active || !this.client || this.execApprovalBusy) return;\n this.execApprovalBusy = true;\n this.execApprovalError = null;\n try {\n await this.client.request(\"exec.approval.resolve\", {\n id: active.id,\n decision,\n });\n this.execApprovalQueue = this.execApprovalQueue.filter((entry) => entry.id !== active.id);\n } catch (err) {\n this.execApprovalError = `Exec approval failed: ${String(err)}`;\n } finally {\n this.execApprovalBusy = false;\n }\n }\n\n // Sidebar handlers for tool output viewing\n handleOpenSidebar(content: string) {\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n this.sidebarCloseTimer = null;\n }\n this.sidebarContent = content;\n this.sidebarError = null;\n this.sidebarOpen = true;\n }\n\n handleCloseSidebar() {\n this.sidebarOpen = false;\n // Clear content after transition\n if (this.sidebarCloseTimer != null) {\n window.clearTimeout(this.sidebarCloseTimer);\n }\n this.sidebarCloseTimer = window.setTimeout(() => {\n if (this.sidebarOpen) return;\n this.sidebarContent = null;\n this.sidebarError = null;\n this.sidebarCloseTimer = null;\n }, 200);\n }\n\n handleSplitRatioChange(ratio: number) {\n const newRatio = Math.max(0.4, Math.min(0.7, ratio));\n this.splitRatio = newRatio;\n this.applySettings({ ...this.settings, splitRatio: newRatio });\n }\n\n // Admins handlers\n handleAdminsNewPhoneChange(value: string) {\n this.adminsNewPhone = value;\n // Clear error when user starts typing\n if (this.adminsError) this.adminsError = null;\n }\n\n // Customers handlers\n handleCustomersLoad() {\n const workspace = this.selectedWorkspace ?? undefined;\n void import(\"./controllers/customers\").then(({ loadCustomers }) => {\n loadCustomers(this, workspace);\n });\n }\n\n handleCustomersNewPhoneChange(value: string) {\n this.customersNewPhone = value;\n if (this.customersError) this.customersError = null;\n }\n\n handleCustomersNewNameChange(value: string) {\n this.customersNewName = value;\n if (this.customersError) this.customersError = null;\n }\n\n // Workspaces handlers\n async handleWorkspacesLoad() {\n const { loadWorkspaces } = await import(\"./controllers/workspaces\");\n await loadWorkspaces(this);\n }\n\n async handleWorkspaceCreate(name: string, workspacePath?: string) {\n const { createWorkspace } = await import(\"./controllers/workspaces\");\n const { loadChannels } = await import(\"./controllers/channels\");\n await createWorkspace(this, {\n name,\n workspacePath,\n onCreated: (res) => {\n if (!res.whatsappAccountId) return;\n const accountId = res.whatsappAccountId;\n // Switch the dropdown to the new business immediately\n this.handleWorkspaceSelect(name);\n // Backend schedules SIGUSR1 restart with ~2s delay.\n // Wait for it, then reload channels and start QR flow.\n setTimeout(async () => {\n try {\n await loadChannels(this, true);\n await this.handleWhatsAppStart(true, accountId);\n if (this.whatsappLoginQrDataUrl) {\n await this.handleWhatsAppWait(accountId);\n await loadChannels(this, true);\n await this.handleWorkspacesLoad();\n }\n } catch {\n // Non-fatal — user can relink manually from the card\n }\n this.requestUpdate();\n }, 3000);\n },\n });\n }\n\n async handleWorkspaceRemove(name: string) {\n const { removeWorkspace } = await import(\"./controllers/workspaces\");\n await removeWorkspace(this, name);\n }\n\n handleWorkspaceRenameStart() {\n const ws = this.getSelectedWorkspaceInfo();\n this.renameWorkspaceName = ws?.displayName ?? ws?.name ?? \"\";\n this.renamingWorkspace = true;\n }\n\n handleWorkspaceRenameCancel() {\n this.renamingWorkspace = false;\n this.renameWorkspaceName = \"\";\n }\n\n async handleWorkspaceRename(name: string, displayName: string) {\n const { renameWorkspace } = await import(\"./controllers/workspaces\");\n await renameWorkspace(this, name, displayName);\n this.renamingWorkspace = false;\n this.renameWorkspaceName = \"\";\n }\n\n handleWorkspaceSelect(name: string) {\n this.selectedWorkspace = name;\n localStorage.setItem(\"taskmaster-selected-workspace\", name);\n // Switch per-account settings to the new workspace\n setActiveWorkspace(name);\n this.settings = loadSettings();\n // Clear chat draft state — it belongs to the previous account\n this.chatMessage = \"\";\n this.chatAttachments = [];\n this.chatStream = null;\n this.chatStreamStartedAt = null;\n this.chatRunId = null;\n this.chatQueue = [];\n this.lastError = null;\n this.reloadCurrentPageData();\n }\n\n getSelectedWorkspaceInfo(): import(\"./controllers/workspaces\").WorkspaceInfo | null {\n if (!this.selectedWorkspace) return null;\n return this.workspaces.find((ws) => ws.name === this.selectedWorkspace) ?? null;\n }\n\n private reloadCurrentPageData() {\n if (this.adminsPage) this.handleAdminsLoad();\n else if (this.customersPage) this.handleCustomersLoad();\n else if (this.filesPage) this.handleFilesLoad();\n else if (this.chatPage) this.handleChatLoad();\n else if (this.advancedPage) this.handleAdvancedLoad();\n }\n\n /** Called after workspaces are loaded to restore or auto-select workspace. */\n initWorkspaceSelection() {\n if (this.workspaces.length === 0) return;\n const stored = localStorage.getItem(\"taskmaster-selected-workspace\");\n const match = stored ? this.workspaces.find((ws) => ws.name === stored) : null;\n if (match) {\n this.selectedWorkspace = match.name;\n } else {\n // Auto-select default workspace\n const defaultWs = this.workspaces.find((ws) => ws.isDefault) ?? this.workspaces[0];\n this.selectedWorkspace = defaultWs.name;\n localStorage.setItem(\"taskmaster-selected-workspace\", defaultWs.name);\n }\n // Activate per-account settings for the selected workspace\n setActiveWorkspace(this.selectedWorkspace);\n this.settings = loadSettings();\n // Reload page data now that workspace context is available\n this.reloadCurrentPageData();\n }\n\n render() {\n return renderApp(this);\n }\n}\n"],"file":"index-Dcwiyz6o.js"}