@songsid/agend 2.2.0-beta.9 → 2.3.0-beta.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 (422) hide show
  1. package/README.md +40 -24
  2. package/README.zh-TW.md +40 -24
  3. package/dist/agent-cli.js +248 -2
  4. package/dist/agent-cli.js.map +1 -1
  5. package/dist/agent-endpoint.d.ts +2 -0
  6. package/dist/agent-endpoint.js +28 -0
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-file-read.d.ts +30 -0
  9. package/dist/agent-file-read.js +129 -0
  10. package/dist/agent-file-read.js.map +1 -0
  11. package/dist/agent-whats-new.js +20 -1
  12. package/dist/agent-whats-new.js.map +1 -1
  13. package/dist/atomic-write.js +9 -1
  14. package/dist/atomic-write.js.map +1 -1
  15. package/dist/auth-api.d.ts +3 -1
  16. package/dist/auth-api.js +32 -1
  17. package/dist/auth-api.js.map +1 -1
  18. package/dist/backend/antigravity.d.ts +33 -0
  19. package/dist/backend/antigravity.js +129 -21
  20. package/dist/backend/antigravity.js.map +1 -1
  21. package/dist/backend/claude-code.d.ts +3 -0
  22. package/dist/backend/claude-code.js +9 -0
  23. package/dist/backend/claude-code.js.map +1 -1
  24. package/dist/backend/codex-metadata.d.ts +33 -0
  25. package/dist/backend/codex-metadata.js +122 -18
  26. package/dist/backend/codex-metadata.js.map +1 -1
  27. package/dist/backend/codex.d.ts +3 -0
  28. package/dist/backend/codex.js +17 -1
  29. package/dist/backend/codex.js.map +1 -1
  30. package/dist/backend/effort-metadata.d.ts +37 -1
  31. package/dist/backend/effort-metadata.js +86 -15
  32. package/dist/backend/effort-metadata.js.map +1 -1
  33. package/dist/backend/grok.d.ts +3 -0
  34. package/dist/backend/grok.js +9 -0
  35. package/dist/backend/grok.js.map +1 -1
  36. package/dist/backend/kiro.d.ts +3 -1
  37. package/dist/backend/kiro.js +7 -3
  38. package/dist/backend/kiro.js.map +1 -1
  39. package/dist/backend/launch-effort.d.ts +61 -0
  40. package/dist/backend/launch-effort.js +170 -0
  41. package/dist/backend/launch-effort.js.map +1 -0
  42. package/dist/backend/muse.js +10 -2
  43. package/dist/backend/muse.js.map +1 -1
  44. package/dist/backend/types.d.ts +24 -0
  45. package/dist/backend/types.js +12 -1
  46. package/dist/backend/types.js.map +1 -1
  47. package/dist/backend-command.d.ts +91 -0
  48. package/dist/backend-command.js +122 -0
  49. package/dist/backend-command.js.map +1 -0
  50. package/dist/channel/adapters/discord.d.ts +14 -0
  51. package/dist/channel/adapters/discord.js +66 -4
  52. package/dist/channel/adapters/discord.js.map +1 -1
  53. package/dist/channel/adapters/telegram.d.ts +26 -1
  54. package/dist/channel/adapters/telegram.js +98 -7
  55. package/dist/channel/adapters/telegram.js.map +1 -1
  56. package/dist/channel/mcp-tools.js +36 -0
  57. package/dist/channel/mcp-tools.js.map +1 -1
  58. package/dist/channel/tool-router.d.ts +2 -0
  59. package/dist/channel/tool-router.js +1 -1
  60. package/dist/channel/tool-router.js.map +1 -1
  61. package/dist/channel/types.d.ts +31 -0
  62. package/dist/cli.js +124 -24
  63. package/dist/cli.js.map +1 -1
  64. package/dist/command-table.d.ts +2 -2
  65. package/dist/command-table.js +5 -2
  66. package/dist/command-table.js.map +1 -1
  67. package/dist/compact-watch.d.ts +86 -0
  68. package/dist/compact-watch.js +288 -0
  69. package/dist/compact-watch.js.map +1 -0
  70. package/dist/config-validator.js +55 -0
  71. package/dist/config-validator.js.map +1 -1
  72. package/dist/config.d.ts +1 -0
  73. package/dist/config.js +2 -1
  74. package/dist/config.js.map +1 -1
  75. package/dist/daemon.d.ts +9 -0
  76. package/dist/daemon.js +394 -29
  77. package/dist/daemon.js.map +1 -1
  78. package/dist/delivery-outbox.d.ts +8 -1
  79. package/dist/delivery-outbox.js +6 -2
  80. package/dist/delivery-outbox.js.map +1 -1
  81. package/dist/doctor.js +7 -0
  82. package/dist/doctor.js.map +1 -1
  83. package/dist/fleet-context.d.ts +12 -0
  84. package/dist/fleet-manager.d.ts +247 -9
  85. package/dist/fleet-manager.js +1227 -142
  86. package/dist/fleet-manager.js.map +1 -1
  87. package/dist/forged-envelope-scan.d.ts +4 -3
  88. package/dist/forged-envelope-scan.js +4 -3
  89. package/dist/forged-envelope-scan.js.map +1 -1
  90. package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
  91. package/dist/general-knowledge/skills/web-appearance/SKILL.md +258 -0
  92. package/dist/install-lock.d.ts +18 -1
  93. package/dist/install-lock.js +30 -3
  94. package/dist/install-lock.js.map +1 -1
  95. package/dist/instance-avatar.d.ts +5 -4
  96. package/dist/instance-avatar.js +15 -8
  97. package/dist/instance-avatar.js.map +1 -1
  98. package/dist/instance-config-impact.js +3 -0
  99. package/dist/instance-config-impact.js.map +1 -1
  100. package/dist/instance-lifecycle.js +9 -4
  101. package/dist/instance-lifecycle.js.map +1 -1
  102. package/dist/instructions.js +2 -2
  103. package/dist/instructions.js.map +1 -1
  104. package/dist/kiro-compact-pane.d.ts +38 -0
  105. package/dist/kiro-compact-pane.js +57 -0
  106. package/dist/kiro-compact-pane.js.map +1 -0
  107. package/dist/launchd-handoff.d.ts +43 -0
  108. package/dist/launchd-handoff.js +56 -0
  109. package/dist/launchd-handoff.js.map +1 -0
  110. package/dist/locale.js +202 -30
  111. package/dist/locale.js.map +1 -1
  112. package/dist/log-service.js +10 -2
  113. package/dist/log-service.js.map +1 -1
  114. package/dist/login-shell.d.ts +21 -0
  115. package/dist/login-shell.js +98 -0
  116. package/dist/login-shell.js.map +1 -0
  117. package/dist/needs-you-hub.d.ts +4 -0
  118. package/dist/needs-you-hub.js +31 -6
  119. package/dist/needs-you-hub.js.map +1 -1
  120. package/dist/needs-you.d.ts +1 -13
  121. package/dist/needs-you.js +3 -37
  122. package/dist/needs-you.js.map +1 -1
  123. package/dist/outbound-handlers.d.ts +32 -0
  124. package/dist/outbound-handlers.js +150 -45
  125. package/dist/outbound-handlers.js.map +1 -1
  126. package/dist/outbound-schemas.d.ts +76 -0
  127. package/dist/outbound-schemas.js +65 -4
  128. package/dist/outbound-schemas.js.map +1 -1
  129. package/dist/provider-probe.d.ts +29 -0
  130. package/dist/provider-probe.js +198 -2
  131. package/dist/provider-probe.js.map +1 -1
  132. package/dist/public-web-gateway.d.ts +2 -0
  133. package/dist/public-web-gateway.js +25 -1
  134. package/dist/public-web-gateway.js.map +1 -1
  135. package/dist/quickstart-api.d.ts +1 -1
  136. package/dist/quickstart-api.js +8 -6
  137. package/dist/quickstart-api.js.map +1 -1
  138. package/dist/quickstart.d.ts +12 -0
  139. package/dist/quickstart.js +36 -6
  140. package/dist/quickstart.js.map +1 -1
  141. package/dist/reply-buttons-controller.d.ts +86 -5
  142. package/dist/reply-buttons-controller.js +271 -7
  143. package/dist/reply-buttons-controller.js.map +1 -1
  144. package/dist/reply-buttons.d.ts +48 -3
  145. package/dist/reply-buttons.js +105 -10
  146. package/dist/reply-buttons.js.map +1 -1
  147. package/dist/reply-polls.d.ts +85 -0
  148. package/dist/reply-polls.js +154 -0
  149. package/dist/reply-polls.js.map +1 -0
  150. package/dist/repo-worktree-guard.d.ts +36 -0
  151. package/dist/repo-worktree-guard.js +143 -0
  152. package/dist/repo-worktree-guard.js.map +1 -0
  153. package/dist/restart-guard.d.ts +6 -3
  154. package/dist/restart-guard.js +6 -3
  155. package/dist/restart-guard.js.map +1 -1
  156. package/dist/restart-progress.d.ts +0 -2
  157. package/dist/restart-progress.js +0 -2
  158. package/dist/restart-progress.js.map +1 -1
  159. package/dist/scheduler/scheduler.d.ts +58 -1
  160. package/dist/scheduler/scheduler.js +176 -10
  161. package/dist/scheduler/scheduler.js.map +1 -1
  162. package/dist/sd-notify.d.ts +22 -1
  163. package/dist/sd-notify.js +63 -10
  164. package/dist/sd-notify.js.map +1 -1
  165. package/dist/service-activation.d.ts +15 -7
  166. package/dist/service-activation.js +42 -26
  167. package/dist/service-activation.js.map +1 -1
  168. package/dist/service-installer.d.ts +24 -0
  169. package/dist/service-installer.js +49 -1
  170. package/dist/service-installer.js.map +1 -1
  171. package/dist/service-plan.d.ts +11 -0
  172. package/dist/service-plan.js +23 -0
  173. package/dist/service-plan.js.map +1 -1
  174. package/dist/settings-api.js +74 -1
  175. package/dist/settings-api.js.map +1 -1
  176. package/dist/settings-change.js +8 -0
  177. package/dist/settings-change.js.map +1 -1
  178. package/dist/settings-effect.js +16 -2
  179. package/dist/settings-effect.js.map +1 -1
  180. package/dist/settings-http-confirmation.js +5 -0
  181. package/dist/settings-http-confirmation.js.map +1 -1
  182. package/dist/systemd-peer-bus.d.ts +95 -0
  183. package/dist/systemd-peer-bus.js +430 -0
  184. package/dist/systemd-peer-bus.js.map +1 -0
  185. package/dist/systemd-runtime.d.ts +27 -1
  186. package/dist/systemd-runtime.js +69 -7
  187. package/dist/systemd-runtime.js.map +1 -1
  188. package/dist/tool-permissions.js +53 -3
  189. package/dist/tool-permissions.js.map +1 -1
  190. package/dist/topic-commands.d.ts +72 -2
  191. package/dist/topic-commands.js +156 -38
  192. package/dist/topic-commands.js.map +1 -1
  193. package/dist/topic-link.d.ts +128 -0
  194. package/dist/topic-link.js +269 -0
  195. package/dist/topic-link.js.map +1 -0
  196. package/dist/transcript-jsonl.d.ts +7 -2
  197. package/dist/transcript-jsonl.js +13 -7
  198. package/dist/transcript-jsonl.js.map +1 -1
  199. package/dist/transcript-sources.js +6 -1
  200. package/dist/transcript-sources.js.map +1 -1
  201. package/dist/types.d.ts +21 -0
  202. package/dist/ui/app-effects.js +187 -0
  203. package/dist/ui/chat-commands.js +1 -0
  204. package/dist/ui/chat-effect-posters.js +42 -0
  205. package/dist/ui/chat-effects.js +72 -0
  206. package/dist/ui/chat-live-replies.js +58 -0
  207. package/dist/ui/chat-render.js +59 -14
  208. package/dist/ui/chat-store.js +78 -8
  209. package/dist/ui/chat-strings.js +43 -16
  210. package/dist/ui/chat-thread.js +175 -31
  211. package/dist/ui/chat-tour.js +18 -15
  212. package/dist/ui/effect-trial-controller.js +119 -0
  213. package/dist/ui/effect-trial-offer.js +31 -0
  214. package/dist/ui/effect-trial-panel.js +37 -0
  215. package/dist/ui/image-lightbox.js +1 -1
  216. package/dist/ui/panel-chat.js +101 -27
  217. package/dist/ui/panel-details.js +18 -5
  218. package/dist/ui/panel-fleet.js +18 -5
  219. package/dist/ui/panel-log.js +10 -10
  220. package/dist/ui/panel-needs.js +13 -10
  221. package/dist/ui/panel-settings.js +66 -12
  222. package/dist/ui/preview-panel.js +25 -9
  223. package/dist/ui/settings-appearance.js +325 -0
  224. package/dist/ui/settings-dialogs.js +11 -6
  225. package/dist/ui/settings-effects.js +201 -0
  226. package/dist/ui/settings-model.js +3 -1
  227. package/dist/ui/settings-mods.js +257 -0
  228. package/dist/ui/settings-owner-effects.js +80 -0
  229. package/dist/ui/settings-strings.js +269 -10
  230. package/dist/ui/settings-token.js +7 -0
  231. package/dist/ui/settings-wizard.js +5 -3
  232. package/dist/ui/shared/agend-auth.js +27 -3
  233. package/dist/ui/shared/agent-widget.js +248 -0
  234. package/dist/ui/shared/app-i18n.js +3 -1
  235. package/dist/ui/shared/app-prefs.js +30 -10
  236. package/dist/ui/shared/app-route.js +23 -1
  237. package/dist/ui/shared/app-session.js +1 -1
  238. package/dist/ui/shared/app-shell.js +29 -16
  239. package/dist/ui/shared/app-store.js +2 -0
  240. package/dist/ui/shared/app-stream.js +15 -7
  241. package/dist/ui/shared/app-themes.js +188 -0
  242. package/dist/ui/shared/app.css +266 -11
  243. package/dist/ui/shared/app.js +6 -0
  244. package/dist/ui/shared/card-strings.js +28 -0
  245. package/dist/ui/shared/effect-app-runtime.js +248 -0
  246. package/dist/ui/shared/effect-baseline.js +64 -0
  247. package/dist/ui/shared/effect-chat-runtime.js +154 -0
  248. package/dist/ui/shared/effect-cursor.js +125 -0
  249. package/dist/ui/shared/effect-frame.js +127 -0
  250. package/dist/ui/shared/effect-geometry.js +122 -0
  251. package/dist/ui/shared/effect-host-style.js +10 -0
  252. package/dist/ui/shared/effect-owner-regions.js +74 -0
  253. package/dist/ui/shared/effect-owner-source.js +115 -0
  254. package/dist/ui/shared/effect-policy.js +137 -0
  255. package/dist/ui/shared/effect-poster-reader.js +98 -0
  256. package/dist/ui/shared/effect-posters.js +117 -0
  257. package/dist/ui/shared/effect-profiler.js +162 -0
  258. package/dist/ui/shared/effect-profiles.js +65 -0
  259. package/dist/ui/shared/effect-registry.js +496 -0
  260. package/dist/ui/shared/effect-runtime-loader.js +234 -0
  261. package/dist/ui/shared/effect-safety.js +153 -0
  262. package/dist/ui/shared/effect-stock-snapshot.js +34 -0
  263. package/dist/ui/shared/effect-stock-trust.js +165 -0
  264. package/dist/ui/shared/effect-trial-source.js +103 -0
  265. package/dist/ui/shared/effect-trial-stage.js +147 -0
  266. package/dist/ui/shared/header-tools.js +35 -15
  267. package/dist/ui/shared/identity-card.js +202 -0
  268. package/dist/ui/shared/identity-color.js +261 -0
  269. package/dist/ui/shared/instance-nav.js +22 -14
  270. package/dist/ui/shared/instance-switch.js +5 -2
  271. package/dist/ui/shared/owner-css.js +221 -0
  272. package/dist/ui/shared/owner-effect-prefs.js +117 -0
  273. package/dist/ui/shared/panel-view.js +96 -12
  274. package/dist/ui/shared/signin.js +17 -9
  275. package/dist/ui/shared/ui-dialog.js +1 -1
  276. package/dist/ui/shared/ui-icons.js +3 -0
  277. package/dist/ui/shared/ui-menu.js +1 -1
  278. package/dist/ui/shared/ui-toast.js +1 -1
  279. package/dist/ui/shared/view-strings.js +40 -2
  280. package/dist/ui/signin.html +9 -3
  281. package/dist/update-check.d.ts +31 -0
  282. package/dist/update-check.js +47 -0
  283. package/dist/update-check.js.map +1 -1
  284. package/dist/update-launch.d.ts +48 -1
  285. package/dist/update-launch.js +159 -5
  286. package/dist/update-launch.js.map +1 -1
  287. package/dist/usage/providers.d.ts +28 -8
  288. package/dist/usage/providers.js +96 -41
  289. package/dist/usage/providers.js.map +1 -1
  290. package/dist/view-api.d.ts +29 -0
  291. package/dist/view-api.js +214 -17
  292. package/dist/view-api.js.map +1 -1
  293. package/dist/web-api.d.ts +86 -2
  294. package/dist/web-api.js +1160 -92
  295. package/dist/web-api.js.map +1 -1
  296. package/dist/web-appearance-limits.d.ts +82 -0
  297. package/dist/web-appearance-limits.js +83 -0
  298. package/dist/web-appearance-limits.js.map +1 -0
  299. package/dist/web-appearance-policy.d.ts +66 -0
  300. package/dist/web-appearance-policy.js +94 -0
  301. package/dist/web-appearance-policy.js.map +1 -0
  302. package/dist/web-appearance-tools.d.ts +50 -0
  303. package/dist/web-appearance-tools.js +105 -0
  304. package/dist/web-appearance-tools.js.map +1 -0
  305. package/dist/web-appearance-view.d.ts +99 -0
  306. package/dist/web-appearance-view.js +163 -0
  307. package/dist/web-appearance-view.js.map +1 -0
  308. package/dist/web-appearance.d.ts +79 -0
  309. package/dist/web-appearance.js +298 -0
  310. package/dist/web-appearance.js.map +1 -0
  311. package/dist/web-asset-parts.d.ts +98 -0
  312. package/dist/web-asset-parts.js +133 -0
  313. package/dist/web-asset-parts.js.map +1 -0
  314. package/dist/web-auth.js +17 -1
  315. package/dist/web-auth.js.map +1 -1
  316. package/dist/web-card.d.ts +96 -0
  317. package/dist/web-card.js +232 -0
  318. package/dist/web-card.js.map +1 -0
  319. package/dist/web-chat-history.d.ts +39 -1
  320. package/dist/web-chat-history.js +69 -9
  321. package/dist/web-chat-history.js.map +1 -1
  322. package/dist/web-commands.d.ts +39 -3
  323. package/dist/web-commands.js +22 -5
  324. package/dist/web-commands.js.map +1 -1
  325. package/dist/web-effect-bundle.d.ts +28 -0
  326. package/dist/web-effect-bundle.js +126 -0
  327. package/dist/web-effect-bundle.js.map +1 -0
  328. package/dist/web-effect-canonical.d.ts +8 -0
  329. package/dist/web-effect-canonical.js +27 -0
  330. package/dist/web-effect-canonical.js.map +1 -0
  331. package/dist/web-effect-library.d.ts +114 -0
  332. package/dist/web-effect-library.js +530 -0
  333. package/dist/web-effect-library.js.map +1 -0
  334. package/dist/web-effect-poster.d.ts +8 -0
  335. package/dist/web-effect-poster.js +52 -0
  336. package/dist/web-effect-poster.js.map +1 -0
  337. package/dist/web-effect-profiles.d.ts +118 -0
  338. package/dist/web-effect-profiles.js +180 -0
  339. package/dist/web-effect-profiles.js.map +1 -0
  340. package/dist/web-effect-service.d.ts +86 -0
  341. package/dist/web-effect-service.js +312 -0
  342. package/dist/web-effect-service.js.map +1 -0
  343. package/dist/web-effect-tools.d.ts +47 -0
  344. package/dist/web-effect-tools.js +126 -0
  345. package/dist/web-effect-tools.js.map +1 -0
  346. package/dist/web-effect-trials.d.ts +86 -0
  347. package/dist/web-effect-trials.js +204 -0
  348. package/dist/web-effect-trials.js.map +1 -0
  349. package/dist/web-effect-upload.d.ts +29 -0
  350. package/dist/web-effect-upload.js +190 -0
  351. package/dist/web-effect-upload.js.map +1 -0
  352. package/dist/web-effect-worker.d.ts +8 -0
  353. package/dist/web-effect-worker.js +170 -0
  354. package/dist/web-effect-worker.js.map +1 -0
  355. package/dist/web-effect.d.ts +89 -0
  356. package/dist/web-effect.js +132 -0
  357. package/dist/web-effect.js.map +1 -0
  358. package/dist/web-identity-color.d.ts +87 -0
  359. package/dist/web-identity-color.js +209 -0
  360. package/dist/web-identity-color.js.map +1 -0
  361. package/dist/web-identity-palette.d.ts +113 -0
  362. package/dist/web-identity-palette.js +84 -0
  363. package/dist/web-identity-palette.js.map +1 -0
  364. package/dist/web-image-meta.d.ts +25 -0
  365. package/dist/web-image-meta.js +200 -0
  366. package/dist/web-image-meta.js.map +1 -0
  367. package/dist/web-login.d.ts +14 -0
  368. package/dist/web-login.js +4 -2
  369. package/dist/web-login.js.map +1 -1
  370. package/dist/web-mod-agent.d.ts +50 -0
  371. package/dist/web-mod-agent.js +203 -0
  372. package/dist/web-mod-agent.js.map +1 -0
  373. package/dist/web-mod-bundle.d.ts +144 -0
  374. package/dist/web-mod-bundle.js +464 -0
  375. package/dist/web-mod-bundle.js.map +1 -0
  376. package/dist/web-mod-export.d.ts +59 -0
  377. package/dist/web-mod-export.js +79 -0
  378. package/dist/web-mod-export.js.map +1 -0
  379. package/dist/web-mod-store.d.ts +283 -0
  380. package/dist/web-mod-store.js +624 -0
  381. package/dist/web-mod-store.js.map +1 -0
  382. package/dist/web-org.d.ts +3 -3
  383. package/dist/web-org.js +11 -17
  384. package/dist/web-org.js.map +1 -1
  385. package/dist/web-owner-css-store.d.ts +180 -0
  386. package/dist/web-owner-css-store.js +384 -0
  387. package/dist/web-owner-css-store.js.map +1 -0
  388. package/dist/web-owner-css.d.ts +58 -0
  389. package/dist/web-owner-css.js +552 -0
  390. package/dist/web-owner-css.js.map +1 -0
  391. package/dist/web-prefs.d.ts +66 -0
  392. package/dist/web-prefs.js +243 -35
  393. package/dist/web-prefs.js.map +1 -1
  394. package/dist/web-preview.d.ts +9 -1
  395. package/dist/web-preview.js +24 -7
  396. package/dist/web-preview.js.map +1 -1
  397. package/dist/web-profile.d.ts +32 -0
  398. package/dist/web-profile.js +132 -0
  399. package/dist/web-profile.js.map +1 -0
  400. package/dist/web-session.d.ts +14 -0
  401. package/dist/web-session.js +10 -0
  402. package/dist/web-session.js.map +1 -1
  403. package/dist/web-settings-patch.d.ts +18 -0
  404. package/dist/web-settings-patch.js +51 -0
  405. package/dist/web-settings-patch.js.map +1 -1
  406. package/dist/web-shell-routes.d.ts +1 -1
  407. package/dist/web-shell-routes.js +1 -1
  408. package/dist/web-shell-routes.js.map +1 -1
  409. package/dist/web-theme-store.d.ts +218 -0
  410. package/dist/web-theme-store.js +516 -0
  411. package/dist/web-theme-store.js.map +1 -0
  412. package/dist/web-theme.d.ts +121 -0
  413. package/dist/web-theme.js +407 -0
  414. package/dist/web-theme.js.map +1 -0
  415. package/dist/web-upload.d.ts +119 -4
  416. package/dist/web-upload.js +252 -39
  417. package/dist/web-upload.js.map +1 -1
  418. package/dist/web-widget.d.ts +72 -0
  419. package/dist/web-widget.js +245 -0
  420. package/dist/web-widget.js.map +1 -0
  421. package/launcher/install-admission.cjs +61 -6
  422. package/package.json +3 -3
@@ -0,0 +1,121 @@
1
+ /**
2
+ * #1629 (first design §1, §8; r2 §8): an agent's web theme — a small, closed, typed object. One module validates and
3
+ * canonicalises it; the store keeps only what this returns, and the page applies only canonical values (colours as
4
+ * "#rrggbb", choices as fixed tokens, numbers in range). Nothing here is CSS text.
5
+ *
6
+ * The theme is the look only. Where an agent's effects and widgets are placed is the store's (web-theme-store.ts
7
+ * placements): `set_web_theme` never places anything.
8
+ */
9
+ import { type IdentityColor, type Placement } from "./web-identity-palette.js";
10
+ export type Color = string;
11
+ export type AssetId = string;
12
+ export interface Palette {
13
+ bg?: Color;
14
+ surface?: Color;
15
+ text?: Color;
16
+ text2?: Color;
17
+ accent?: Color;
18
+ userBubble?: Color;
19
+ agentBubble?: Color;
20
+ }
21
+ export type ThemeMode = "light" | "dark";
22
+ export interface Theme {
23
+ v: 1;
24
+ colors?: {
25
+ light?: Palette;
26
+ dark?: Palette;
27
+ };
28
+ accent?: Color;
29
+ bubble?: {
30
+ radius?: number;
31
+ border?: "none" | "thin" | "accent";
32
+ };
33
+ font?: "inter" | "system" | "mono";
34
+ background?: {
35
+ image: AssetId;
36
+ fit: "cover" | "contain";
37
+ opacity: number;
38
+ };
39
+ avatar?: AssetId;
40
+ workingLabel?: string;
41
+ /** r4 §1: the agent's identity card. A person's card fields (View's Edit profile) win field by field. */
42
+ card?: ThemeCard;
43
+ /**
44
+ * #1958: the agent's identity colour (a preset or #rrggbb; without it, its accent) and where it shows. A person's
45
+ * choice for this instance wins, field by field.
46
+ */
47
+ identity?: ThemeIdentity;
48
+ }
49
+ export interface ThemeIdentity {
50
+ color?: IdentityColor;
51
+ show?: Placement[];
52
+ }
53
+ export interface ThemeCard {
54
+ portrait?: AssetId;
55
+ banner?: AssetId;
56
+ tagline?: string;
57
+ bio?: string;
58
+ }
59
+ export interface ThemeProblem {
60
+ path: string;
61
+ problem: string;
62
+ }
63
+ export declare const THEME_MAX_BYTES = 4096;
64
+ export declare const PALETTE_KEYS: readonly ["bg", "surface", "text", "text2", "accent", "userBubble", "agentBubble"];
65
+ /**
66
+ * The token defaults (src/ui/shared/tokens.css) the contrast check measures a theme against — a test pins these equal
67
+ * to the stylesheet. An agent message has no bubble of its own: its "bubble" is the page background.
68
+ */
69
+ export declare const THEME_DEFAULTS: Record<ThemeMode, Required<Palette>>;
70
+ /** WCAG AA: [foreground, background, minimum ratio]. */
71
+ export declare const CONTRAST_PAIRS: ReadonlyArray<readonly [keyof Palette, keyof Palette, number]>;
72
+ /** "#rgb" | "#rrggbb", any case → "#rrggbb" lowercase; anything else (names, alpha, functions, text after it) → null. */
73
+ export declare function canonicalColor(v: unknown): Color | null;
74
+ /** A card's bio (r4 §1): NFC, 1..280 graphemes, at most 3 line breaks ("\n" only), otherwise as one line. */
75
+ export declare const BIO_MAX_GRAPHEMES = 280;
76
+ export declare const BIO_MAX_BREAKS = 3;
77
+ export declare const TAGLINE_MAX_GRAPHEMES = 60;
78
+ /**
79
+ * #1889 review: one explicit bound in UTF-16 units too, for the host and the page alike — a grapheme may be many units
80
+ * (an emoji family is 8), so 10 per grapheme keeps every ordinary text and still bounds what is stored.
81
+ */
82
+ export declare const TAGLINE_MAX_UNITS: number;
83
+ export declare const BIO_MAX_UNITS = 2800;
84
+ /** A card's tagline: one line of 1..60 graphemes, at most TAGLINE_MAX_UNITS units. */
85
+ export declare function canonicalTagline(v: unknown): string | null;
86
+ export declare function canonicalBio(v: unknown): string | null;
87
+ /** One line of text: NFC, `min..max` graphemes, nothing invisible or directional. */
88
+ export declare function canonicalText(v: unknown, min: number, max: number): string | null;
89
+ export declare function contrastRatio(a: Color, b: Color): number;
90
+ /** The palette a mode renders with: the theme's colours over the defaults (a mode's accent, else the theme's). */
91
+ export declare function effectivePalette(theme: Theme, mode: ThemeMode): Required<Palette>;
92
+ export interface ThemeContext {
93
+ /** The asset ids this instance has (background and avatar must name one). */
94
+ assets: ReadonlySet<string>;
95
+ /** r4 §1: each asset's slot — a card's portrait and banner must name a picture uploaded for that slot. */
96
+ slotOf?: (id: string) => string | undefined;
97
+ }
98
+ /**
99
+ * The whole theme, checked and canonicalised: closed schema at every level, types never coerced, integers and steps,
100
+ * colours re-serialised, text NFC and counted in graphemes, asset ids this instance has, contrast per mode, ≤ 4 KiB.
101
+ */
102
+ export declare function checkTheme(input: unknown, ctx: ThemeContext): {
103
+ ok: true;
104
+ theme: Theme;
105
+ } | {
106
+ ok: false;
107
+ errors: ThemeProblem[];
108
+ };
109
+ /** One key order, so the stored, served and tool-returned JSON are the same bytes for the same theme. */
110
+ export declare function canonicalTheme(t: Theme): Theme;
111
+ /**
112
+ * set_web_theme's patch on the current theme: `set` merges (objects by key, values replace), then `clear` removes
113
+ * dotted paths ("colors.dark.bg", "bubble", …). The result is checked whole: all or nothing.
114
+ */
115
+ export declare function applyThemePatch(current: Theme, patch: unknown, ctx: ThemeContext): {
116
+ ok: true;
117
+ theme: Theme;
118
+ } | {
119
+ ok: false;
120
+ errors: ThemeProblem[];
121
+ };
@@ -0,0 +1,407 @@
1
+ /**
2
+ * #1629 (first design §1, §8; r2 §8): an agent's web theme — a small, closed, typed object. One module validates and
3
+ * canonicalises it; the store keeps only what this returns, and the page applies only canonical values (colours as
4
+ * "#rrggbb", choices as fixed tokens, numbers in range). Nothing here is CSS text.
5
+ *
6
+ * The theme is the look only. Where an agent's effects and widgets are placed is the store's (web-theme-store.ts
7
+ * placements): `set_web_theme` never places anything.
8
+ */
9
+ import { canonicalIdentityColor, canonicalPlacements } from "./web-identity-palette.js";
10
+ export const THEME_MAX_BYTES = 4096;
11
+ export const PALETTE_KEYS = ["bg", "surface", "text", "text2", "accent", "userBubble", "agentBubble"];
12
+ const MODES = ["light", "dark"];
13
+ const BORDERS = ["none", "thin", "accent"];
14
+ const FONTS = ["inter", "system", "mono"];
15
+ const FITS = ["cover", "contain"];
16
+ const ASSET_ID = /^[0-9a-f]{32}$/;
17
+ /**
18
+ * The token defaults (src/ui/shared/tokens.css) the contrast check measures a theme against — a test pins these equal
19
+ * to the stylesheet. An agent message has no bubble of its own: its "bubble" is the page background.
20
+ */
21
+ export const THEME_DEFAULTS = {
22
+ dark: { bg: "#212121", surface: "#2f2f2f", text: "#ececec", text2: "#b4b4b4", accent: "#7ab7ff", userBubble: "#2f2f2f", agentBubble: "#212121" },
23
+ light: { bg: "#ffffff", surface: "#f4f4f4", text: "#0d0d0d", text2: "#5d5d5d", accent: "#0a62c2", userBubble: "#f4f4f4", agentBubble: "#ffffff" },
24
+ };
25
+ /** WCAG AA: [foreground, background, minimum ratio]. */
26
+ export const CONTRAST_PAIRS = [
27
+ ["text", "bg", 4.5], ["text", "surface", 4.5], ["text", "agentBubble", 4.5], ["text", "userBubble", 4.5],
28
+ ["text2", "bg", 4.5], ["text2", "surface", 4.5],
29
+ ["accent", "bg", 3],
30
+ ];
31
+ const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v) && Object.getPrototypeOf(v) === Object.prototype;
32
+ /** "#rgb" | "#rrggbb", any case → "#rrggbb" lowercase; anything else (names, alpha, functions, text after it) → null. */
33
+ export function canonicalColor(v) {
34
+ if (typeof v !== "string")
35
+ return null;
36
+ const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);
37
+ if (!m)
38
+ return null;
39
+ const h = m[1].toLowerCase();
40
+ return h.length === 3 ? `#${h[0]}${h[0]}${h[1]}${h[1]}${h[2]}${h[2]}` : `#${h}`;
41
+ }
42
+ const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: "grapheme" });
43
+ /**
44
+ * Control, format (incl. bidi overrides, zero-width space), line/paragraph separators: never in a label — except the
45
+ * zero-width joiner, which emoji sequences (👨‍👩‍👧) are made of.
46
+ */
47
+ const FORBIDDEN_TEXT = /(?!\u200d)[\p{Cc}\p{Cf}\p{Zl}\p{Zp}]/u;
48
+ /**
49
+ * At least one character that draws something: not a mark, control, format or separator, nor a blank that renders as
50
+ * nothing (Hangul fillers, braille blank) — so a lone joiner, variation selector or filler is not a label (#1887 P3).
51
+ */
52
+ const VISIBLE = /[^\p{M}\p{C}\p{Z}\u115f\u1160\u3164\uffa0\u2800]/u;
53
+ /** A card's bio (r4 §1): NFC, 1..280 graphemes, at most 3 line breaks ("\n" only), otherwise as one line. */
54
+ export const BIO_MAX_GRAPHEMES = 280;
55
+ export const BIO_MAX_BREAKS = 3;
56
+ export const TAGLINE_MAX_GRAPHEMES = 60;
57
+ /**
58
+ * #1889 review: one explicit bound in UTF-16 units too, for the host and the page alike — a grapheme may be many units
59
+ * (an emoji family is 8), so 10 per grapheme keeps every ordinary text and still bounds what is stored.
60
+ */
61
+ export const TAGLINE_MAX_UNITS = TAGLINE_MAX_GRAPHEMES * 10;
62
+ export const BIO_MAX_UNITS = 2800;
63
+ /** A card's tagline: one line of 1..60 graphemes, at most TAGLINE_MAX_UNITS units. */
64
+ export function canonicalTagline(v) {
65
+ const t = canonicalText(v, 1, TAGLINE_MAX_GRAPHEMES);
66
+ return t !== null && t.length <= TAGLINE_MAX_UNITS ? t : null;
67
+ }
68
+ export function canonicalBio(v) {
69
+ if (typeof v !== "string")
70
+ return null;
71
+ const s = v.normalize("NFC");
72
+ const lines = s.split("\n");
73
+ if (s.length > BIO_MAX_UNITS || lines.length > BIO_MAX_BREAKS + 1 || s.trim() !== s || !VISIBLE.test(s))
74
+ return null;
75
+ if (lines.some(l => FORBIDDEN_TEXT.test(l)))
76
+ return null;
77
+ const n = [...GRAPHEMES.segment(s)].length;
78
+ return n >= 1 && n <= BIO_MAX_GRAPHEMES ? s : null;
79
+ }
80
+ /** One line of text: NFC, `min..max` graphemes, nothing invisible or directional. */
81
+ export function canonicalText(v, min, max) {
82
+ if (typeof v !== "string")
83
+ return null;
84
+ const s = v.normalize("NFC");
85
+ if (FORBIDDEN_TEXT.test(s) || s.trim() !== s || !VISIBLE.test(s))
86
+ return null;
87
+ const n = [...GRAPHEMES.segment(s)].length;
88
+ return n >= min && n <= max ? s : null;
89
+ }
90
+ function relLuminance(hex) {
91
+ const c = [1, 3, 5].map(i => parseInt(hex.slice(i, i + 2), 16) / 255).map(x => (x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4));
92
+ return 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];
93
+ }
94
+ export function contrastRatio(a, b) {
95
+ const [l1, l2] = [relLuminance(a), relLuminance(b)].sort((x, y) => y - x);
96
+ return (l1 + 0.05) / (l2 + 0.05);
97
+ }
98
+ /** The palette a mode renders with: the theme's colours over the defaults (a mode's accent, else the theme's). */
99
+ export function effectivePalette(theme, mode) {
100
+ return { ...THEME_DEFAULTS[mode], ...(theme.accent ? { accent: theme.accent } : {}), ...(theme.colors?.[mode] ?? {}) };
101
+ }
102
+ /**
103
+ * The whole theme, checked and canonicalised: closed schema at every level, types never coerced, integers and steps,
104
+ * colours re-serialised, text NFC and counted in graphemes, asset ids this instance has, contrast per mode, ≤ 4 KiB.
105
+ */
106
+ export function checkTheme(input, ctx) {
107
+ const errors = [];
108
+ const bad = (path, problem) => { errors.push({ path, problem }); };
109
+ if (!isObj(input))
110
+ return { ok: false, errors: [{ path: "", problem: "must be an object" }] };
111
+ const out = { v: 1 };
112
+ const known = new Set(["v", "colors", "accent", "bubble", "font", "background", "avatar", "workingLabel", "card", "identity"]);
113
+ for (const k of Object.keys(input))
114
+ if (!known.has(k))
115
+ bad(k, "unknown key");
116
+ if (input.v !== undefined && input.v !== 1)
117
+ bad("v", "must be 1");
118
+ if (input.colors !== undefined) {
119
+ if (!isObj(input.colors))
120
+ bad("colors", "must be an object");
121
+ else {
122
+ const colors = {};
123
+ for (const k of Object.keys(input.colors))
124
+ if (!MODES.includes(k))
125
+ bad(`colors.${k}`, "unknown key (light or dark)");
126
+ for (const mode of MODES) {
127
+ const pal = input.colors[mode];
128
+ if (pal === undefined)
129
+ continue;
130
+ if (!isObj(pal)) {
131
+ bad(`colors.${mode}`, "must be an object");
132
+ continue;
133
+ }
134
+ const p = {};
135
+ for (const k of Object.keys(pal)) {
136
+ if (!PALETTE_KEYS.includes(k)) {
137
+ bad(`colors.${mode}.${k}`, "unknown key");
138
+ continue;
139
+ }
140
+ const c = canonicalColor(pal[k]);
141
+ if (!c)
142
+ bad(`colors.${mode}.${k}`, "must be a colour #rgb or #rrggbb");
143
+ else
144
+ p[k] = c;
145
+ }
146
+ if (Object.keys(p).length)
147
+ colors[mode] = sortPalette(p);
148
+ }
149
+ if (Object.keys(colors).length)
150
+ out.colors = colors;
151
+ }
152
+ }
153
+ if (input.accent !== undefined) {
154
+ const c = canonicalColor(input.accent);
155
+ if (!c)
156
+ bad("accent", "must be a colour #rgb or #rrggbb");
157
+ else
158
+ out.accent = c;
159
+ }
160
+ if (input.bubble !== undefined) {
161
+ if (!isObj(input.bubble))
162
+ bad("bubble", "must be an object");
163
+ else {
164
+ const b = {};
165
+ for (const k of Object.keys(input.bubble))
166
+ if (k !== "radius" && k !== "border")
167
+ bad(`bubble.${k}`, "unknown key");
168
+ const r = input.bubble.radius;
169
+ if (r !== undefined) {
170
+ if (!Number.isInteger(r) || r < 0 || r > 24)
171
+ bad("bubble.radius", "a whole number of px, 0..24");
172
+ else
173
+ b.radius = r;
174
+ }
175
+ const bd = input.bubble.border;
176
+ if (bd !== undefined) {
177
+ if (!BORDERS.includes(bd))
178
+ bad("bubble.border", "none, thin or accent");
179
+ else
180
+ b.border = bd;
181
+ }
182
+ if (Object.keys(b).length)
183
+ out.bubble = b;
184
+ }
185
+ }
186
+ if (input.font !== undefined) {
187
+ if (!FONTS.includes(input.font))
188
+ bad("font", "inter, system or mono");
189
+ else
190
+ out.font = input.font;
191
+ }
192
+ if (input.background !== undefined) {
193
+ const bg = input.background;
194
+ if (!isObj(bg))
195
+ bad("background", "must be an object");
196
+ else {
197
+ for (const k of Object.keys(bg))
198
+ if (!["image", "fit", "opacity"].includes(k))
199
+ bad(`background.${k}`, "unknown key");
200
+ const okImage = typeof bg.image === "string" && ASSET_ID.test(bg.image) && ctx.assets.has(bg.image);
201
+ if (!okImage)
202
+ bad("background.image", typeof bg.image === "string" && ASSET_ID.test(bg.image) ? "no such asset of this instance" : "an asset id");
203
+ const okFit = FITS.includes(bg.fit);
204
+ if (!okFit)
205
+ bad("background.fit", "cover or contain");
206
+ const op = bg.opacity;
207
+ const okOp = typeof op === "number" && Number.isFinite(op) && op >= 0.05 && op <= 1;
208
+ if (!okOp)
209
+ bad("background.opacity", "a number 0.05..1");
210
+ if (okImage && okFit && okOp)
211
+ out.background = { image: bg.image, fit: bg.fit, opacity: Math.round(op * 20) / 20 };
212
+ }
213
+ }
214
+ if (input.avatar !== undefined) {
215
+ const a = input.avatar;
216
+ if (typeof a !== "string" || !ASSET_ID.test(a))
217
+ bad("avatar", "an asset id");
218
+ else if (!ctx.assets.has(a))
219
+ bad("avatar", "no such asset of this instance");
220
+ else
221
+ out.avatar = a;
222
+ }
223
+ if (input.workingLabel !== undefined) {
224
+ const t = canonicalText(input.workingLabel, 1, 24);
225
+ if (t === null)
226
+ bad("workingLabel", "1..24 characters on one line, no control or direction characters");
227
+ else
228
+ out.workingLabel = t;
229
+ }
230
+ if (input.card !== undefined) {
231
+ const c = input.card;
232
+ if (!isObj(c))
233
+ bad("card", "must be an object");
234
+ else {
235
+ const card = {};
236
+ for (const k of Object.keys(c))
237
+ if (!["portrait", "banner", "tagline", "bio"].includes(k))
238
+ bad(`card.${k}`, "unknown key");
239
+ for (const slot of ["portrait", "banner"]) {
240
+ const id = c[slot];
241
+ if (id === undefined)
242
+ continue;
243
+ if (typeof id !== "string" || !ASSET_ID.test(id))
244
+ bad(`card.${slot}`, "an asset id");
245
+ else if (!ctx.assets.has(id))
246
+ bad(`card.${slot}`, "no such asset of this instance");
247
+ else if (ctx.slotOf && ctx.slotOf(id) !== slot)
248
+ bad(`card.${slot}`, `a picture uploaded for the ${slot} slot`);
249
+ else
250
+ card[slot] = id;
251
+ }
252
+ if (c.tagline !== undefined) {
253
+ const t = canonicalTagline(c.tagline);
254
+ if (t === null)
255
+ bad("card.tagline", `1..${TAGLINE_MAX_GRAPHEMES} characters on one line, no control or direction characters`);
256
+ else
257
+ card.tagline = t;
258
+ }
259
+ if (c.bio !== undefined) {
260
+ const b = canonicalBio(c.bio);
261
+ if (b === null)
262
+ bad("card.bio", `1..${BIO_MAX_GRAPHEMES} characters, at most ${BIO_MAX_BREAKS} line breaks, no control or direction characters`);
263
+ else
264
+ card.bio = b;
265
+ }
266
+ if (Object.keys(card).length)
267
+ out.card = card;
268
+ }
269
+ }
270
+ if (input.identity !== undefined) {
271
+ const id = input.identity;
272
+ if (!isObj(id))
273
+ bad("identity", "must be an object");
274
+ else {
275
+ const identity = {};
276
+ for (const k of Object.keys(id))
277
+ if (k !== "color" && k !== "show")
278
+ bad(`identity.${k}`, "unknown key");
279
+ if (id.color !== undefined) {
280
+ const c = canonicalIdentityColor(id.color);
281
+ if (!c)
282
+ bad("identity.color", "a preset (red, orange, amber, lime, green, teal, cyan, blue, indigo, violet, pink, slate) or a colour #rrggbb");
283
+ else
284
+ identity.color = c;
285
+ }
286
+ if (id.show !== undefined) {
287
+ const s = canonicalPlacements(id.show);
288
+ if (!s)
289
+ bad("identity.show", "a list of where the colour shows: name, bar, ring (each once; [] for nowhere)");
290
+ else
291
+ identity.show = s;
292
+ }
293
+ if (Object.keys(identity).length)
294
+ out.identity = identity;
295
+ }
296
+ }
297
+ if (errors.length)
298
+ return { ok: false, errors };
299
+ for (const mode of MODES) {
300
+ const pal = effectivePalette(out, mode);
301
+ for (const [fg, bgKey, min] of CONTRAST_PAIRS) {
302
+ const ratio = contrastRatio(pal[fg], pal[bgKey]);
303
+ if (ratio + 1e-9 < min)
304
+ bad(`colors.${mode}.${fg}`, `contrast ${fg} on ${bgKey} is ${ratio.toFixed(2)}:1, at least ${min}:1 is needed`);
305
+ }
306
+ }
307
+ if (errors.length)
308
+ return { ok: false, errors };
309
+ const canonical = canonicalTheme(out);
310
+ if (Buffer.byteLength(JSON.stringify(canonical), "utf8") > THEME_MAX_BYTES)
311
+ return { ok: false, errors: [{ path: "", problem: `larger than ${THEME_MAX_BYTES} bytes` }] };
312
+ return { ok: true, theme: canonical };
313
+ }
314
+ function sortPalette(p) {
315
+ const out = {};
316
+ for (const k of PALETTE_KEYS)
317
+ if (p[k] !== undefined)
318
+ out[k] = p[k];
319
+ return out;
320
+ }
321
+ /** One key order, so the stored, served and tool-returned JSON are the same bytes for the same theme. */
322
+ export function canonicalTheme(t) {
323
+ const out = { v: 1 };
324
+ if (t.colors) {
325
+ const c = {};
326
+ for (const m of MODES)
327
+ if (t.colors[m])
328
+ c[m] = sortPalette(t.colors[m]);
329
+ out.colors = c;
330
+ }
331
+ if (t.accent)
332
+ out.accent = t.accent;
333
+ if (t.bubble)
334
+ out.bubble = { ...(t.bubble.radius !== undefined ? { radius: t.bubble.radius } : {}), ...(t.bubble.border ? { border: t.bubble.border } : {}) };
335
+ if (t.font)
336
+ out.font = t.font;
337
+ if (t.background)
338
+ out.background = { image: t.background.image, fit: t.background.fit, opacity: t.background.opacity };
339
+ if (t.avatar)
340
+ out.avatar = t.avatar;
341
+ if (t.workingLabel)
342
+ out.workingLabel = t.workingLabel;
343
+ if (t.card) {
344
+ const c = {};
345
+ for (const k of ["portrait", "banner", "tagline", "bio"])
346
+ if (t.card[k])
347
+ c[k] = t.card[k];
348
+ if (Object.keys(c).length)
349
+ out.card = c;
350
+ }
351
+ if (t.identity && (t.identity.color || t.identity.show)) {
352
+ out.identity = { ...(t.identity.color ? { color: t.identity.color } : {}), ...(t.identity.show ? { show: [...t.identity.show] } : {}) };
353
+ }
354
+ return out;
355
+ }
356
+ /**
357
+ * set_web_theme's patch on the current theme: `set` merges (objects by key, values replace), then `clear` removes
358
+ * dotted paths ("colors.dark.bg", "bubble", …). The result is checked whole: all or nothing.
359
+ */
360
+ export function applyThemePatch(current, patch, ctx) {
361
+ if (!isObj(patch))
362
+ return { ok: false, errors: [{ path: "", problem: "a patch { set?, clear? }" }] };
363
+ for (const k of Object.keys(patch))
364
+ if (k !== "set" && k !== "clear")
365
+ return { ok: false, errors: [{ path: k, problem: "unknown key (set or clear)" }] };
366
+ const next = JSON.parse(JSON.stringify(current));
367
+ if (patch.set !== undefined) {
368
+ if (!isObj(patch.set))
369
+ return { ok: false, errors: [{ path: "set", problem: "must be an object" }] };
370
+ mergeInto(next, patch.set);
371
+ }
372
+ if (patch.clear !== undefined) {
373
+ if (!Array.isArray(patch.clear) || patch.clear.length > 32 || !patch.clear.every(p => typeof p === "string" && /^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){0,2}$/.test(p))) {
374
+ return { ok: false, errors: [{ path: "clear", problem: "a list of dotted paths such as colors.dark.bg" }] };
375
+ }
376
+ for (const path of patch.clear)
377
+ clearPath(next, path.split("."));
378
+ }
379
+ return checkTheme(next, ctx);
380
+ }
381
+ function mergeInto(target, src) {
382
+ for (const k of Object.keys(src)) {
383
+ const v = src[k];
384
+ if (Object.hasOwn(target, k) && isObj(v) && isObj(target[k])) {
385
+ mergeInto(target[k], v);
386
+ continue;
387
+ }
388
+ // An own property, whatever the name ("__proto__" included): the closed-schema check then reports it, never a prototype.
389
+ Object.defineProperty(target, k, { value: isObj(v) ? JSON.parse(JSON.stringify(v)) : v, enumerable: true, writable: true, configurable: true });
390
+ }
391
+ }
392
+ function clearPath(target, parts) {
393
+ const [head, ...rest] = parts;
394
+ if (!head || !Object.hasOwn(target, head))
395
+ return;
396
+ if (!rest.length) {
397
+ delete target[head];
398
+ return;
399
+ }
400
+ const child = target[head];
401
+ if (!isObj(child))
402
+ return;
403
+ clearPath(child, rest);
404
+ if (!Object.keys(child).length)
405
+ delete target[head];
406
+ }
407
+ //# sourceMappingURL=web-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-theme.js","sourceRoot":"","sources":["../src/web-theme.ts"],"names":[],"mappings":"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"}