@songsid/agend 2.3.0-beta.2 → 2.3.0-beta.20

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 (502) hide show
  1. package/README.md +7 -1
  2. package/README.zh-TW.md +7 -1
  3. package/dist/agent-cli-instructions.md +9 -2
  4. package/dist/agent-cli.js +63 -2
  5. package/dist/agent-cli.js.map +1 -1
  6. package/dist/agent-endpoint.js +4 -0
  7. package/dist/agent-endpoint.js.map +1 -1
  8. package/dist/agent-file-read.d.ts +4 -1
  9. package/dist/agent-file-read.js +189 -16
  10. package/dist/agent-file-read.js.map +1 -1
  11. package/dist/agent-whats-new.d.ts +11 -0
  12. package/dist/agent-whats-new.js +29 -5
  13. package/dist/agent-whats-new.js.map +1 -1
  14. package/dist/auth-api.d.ts +30 -1
  15. package/dist/auth-api.js +45 -13
  16. package/dist/auth-api.js.map +1 -1
  17. package/dist/authority/authority-state.d.ts +38 -0
  18. package/dist/authority/authority-state.js +114 -0
  19. package/dist/authority/authority-state.js.map +1 -0
  20. package/dist/authority/session-authorizations.d.ts +43 -0
  21. package/dist/authority/session-authorizations.js +102 -0
  22. package/dist/authority/session-authorizations.js.map +1 -0
  23. package/dist/authority/web-authority.d.ts +120 -0
  24. package/dist/authority/web-authority.js +157 -0
  25. package/dist/authority/web-authority.js.map +1 -0
  26. package/dist/backend/claude-code.d.ts +2 -2
  27. package/dist/backend/claude-code.js +18 -8
  28. package/dist/backend/claude-code.js.map +1 -1
  29. package/dist/backend/codex-metadata.d.ts +8 -0
  30. package/dist/backend/codex-metadata.js +74 -17
  31. package/dist/backend/codex-metadata.js.map +1 -1
  32. package/dist/backend/codex.js +15 -2
  33. package/dist/backend/codex.js.map +1 -1
  34. package/dist/backend/credential-profile.d.ts +2 -0
  35. package/dist/backend/credential-profile.js +2 -0
  36. package/dist/backend/credential-profile.js.map +1 -1
  37. package/dist/backend/types.d.ts +6 -0
  38. package/dist/backend/types.js +15 -0
  39. package/dist/backend/types.js.map +1 -1
  40. package/dist/backend-availability.d.ts +120 -0
  41. package/dist/backend-availability.js +396 -0
  42. package/dist/backend-availability.js.map +1 -0
  43. package/dist/backend-command.d.ts +23 -3
  44. package/dist/backend-command.js +25 -4
  45. package/dist/backend-command.js.map +1 -1
  46. package/dist/bug-report-cli.d.ts +30 -0
  47. package/dist/bug-report-cli.js +138 -0
  48. package/dist/bug-report-cli.js.map +1 -0
  49. package/dist/bug-report.d.ts +47 -0
  50. package/dist/bug-report.js +136 -0
  51. package/dist/bug-report.js.map +1 -0
  52. package/dist/bundled-skills.d.ts +14 -0
  53. package/dist/bundled-skills.js +29 -0
  54. package/dist/bundled-skills.js.map +1 -0
  55. package/dist/cache-ledger.d.ts +16 -3
  56. package/dist/cache-ledger.js +33 -13
  57. package/dist/cache-ledger.js.map +1 -1
  58. package/dist/cache-service.d.ts +55 -3
  59. package/dist/cache-service.js +152 -16
  60. package/dist/cache-service.js.map +1 -1
  61. package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
  62. package/dist/channel/adapters/discord-client-retirement.js +57 -0
  63. package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
  64. package/dist/channel/adapters/discord.d.ts +9 -0
  65. package/dist/channel/adapters/discord.js +49 -4
  66. package/dist/channel/adapters/discord.js.map +1 -1
  67. package/dist/channel/mcp-tools.js +22 -11
  68. package/dist/channel/mcp-tools.js.map +1 -1
  69. package/dist/channel/types.d.ts +6 -0
  70. package/dist/classic-channel-manager.d.ts +10 -5
  71. package/dist/classic-channel-manager.js +12 -9
  72. package/dist/classic-channel-manager.js.map +1 -1
  73. package/dist/cli.js +224 -111
  74. package/dist/cli.js.map +1 -1
  75. package/dist/config-validator.d.ts +6 -0
  76. package/dist/config-validator.js +129 -3
  77. package/dist/config-validator.js.map +1 -1
  78. package/dist/config.d.ts +13 -1
  79. package/dist/config.js +14 -5
  80. package/dist/config.js.map +1 -1
  81. package/dist/cross-instance-notice.d.ts +7 -0
  82. package/dist/cross-instance-notice.js +10 -0
  83. package/dist/cross-instance-notice.js.map +1 -1
  84. package/dist/daemon.d.ts +24 -1
  85. package/dist/daemon.js +151 -19
  86. package/dist/daemon.js.map +1 -1
  87. package/dist/decision-list.d.ts +25 -0
  88. package/dist/decision-list.js +30 -0
  89. package/dist/decision-list.js.map +1 -0
  90. package/dist/delivery-outbox.d.ts +10 -0
  91. package/dist/delivery-outbox.js +17 -1
  92. package/dist/delivery-outbox.js.map +1 -1
  93. package/dist/diagnostic-redaction.d.ts +10 -0
  94. package/dist/diagnostic-redaction.js +167 -0
  95. package/dist/diagnostic-redaction.js.map +1 -0
  96. package/dist/fleet-context.d.ts +10 -0
  97. package/dist/fleet-manager.d.ts +505 -15
  98. package/dist/fleet-manager.js +1870 -204
  99. package/dist/fleet-manager.js.map +1 -1
  100. package/dist/fleet-process-handlers.d.ts +18 -0
  101. package/dist/fleet-process-handlers.js +69 -0
  102. package/dist/fleet-process-handlers.js.map +1 -0
  103. package/dist/fleet-traffic.d.ts +74 -0
  104. package/dist/fleet-traffic.js +196 -0
  105. package/dist/fleet-traffic.js.map +1 -0
  106. package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
  107. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +17 -6
  108. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
  109. package/dist/general-knowledge/skills/fleet-config/SKILL.md +2 -0
  110. package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
  111. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
  112. package/dist/general-knowledge/skills/scheduling/SKILL.md +4 -0
  113. package/dist/general-knowledge/skills/web-appearance/SKILL.md +190 -47
  114. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +545 -0
  115. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  116. package/dist/human-delivery-receipts.d.ts +24 -1
  117. package/dist/human-delivery-receipts.js +64 -11
  118. package/dist/human-delivery-receipts.js.map +1 -1
  119. package/dist/instance-config-impact.js +7 -1
  120. package/dist/instance-config-impact.js.map +1 -1
  121. package/dist/instance-lifecycle.d.ts +10 -1
  122. package/dist/instance-lifecycle.js +79 -18
  123. package/dist/instance-lifecycle.js.map +1 -1
  124. package/dist/instance-names.d.ts +4 -0
  125. package/dist/instance-names.js +12 -0
  126. package/dist/instance-names.js.map +1 -0
  127. package/dist/instructions.d.ts +12 -1
  128. package/dist/instructions.js +13 -2
  129. package/dist/instructions.js.map +1 -1
  130. package/dist/locale.js +173 -12
  131. package/dist/locale.js.map +1 -1
  132. package/dist/log-steps.d.ts +1 -0
  133. package/dist/log-steps.js +15 -0
  134. package/dist/log-steps.js.map +1 -1
  135. package/dist/login-controller.d.ts +45 -0
  136. package/dist/login-controller.js +101 -5
  137. package/dist/login-controller.js.map +1 -1
  138. package/dist/ls-attach-resolve.d.ts +96 -0
  139. package/dist/ls-attach-resolve.js +180 -0
  140. package/dist/ls-attach-resolve.js.map +1 -0
  141. package/dist/ls-rows.d.ts +12 -0
  142. package/dist/ls-rows.js +82 -3
  143. package/dist/ls-rows.js.map +1 -1
  144. package/dist/memory-hogs.d.ts +27 -0
  145. package/dist/memory-hogs.js +124 -0
  146. package/dist/memory-hogs.js.map +1 -0
  147. package/dist/needs-you.d.ts +10 -0
  148. package/dist/needs-you.js +2 -1
  149. package/dist/needs-you.js.map +1 -1
  150. package/dist/outbound-handlers.d.ts +11 -0
  151. package/dist/outbound-handlers.js +139 -11
  152. package/dist/outbound-handlers.js.map +1 -1
  153. package/dist/outbound-schemas.d.ts +200 -4
  154. package/dist/outbound-schemas.js +124 -11
  155. package/dist/outbound-schemas.js.map +1 -1
  156. package/dist/public-web-gateway.js +17 -4
  157. package/dist/public-web-gateway.js.map +1 -1
  158. package/dist/public-web-link.d.ts +9 -0
  159. package/dist/public-web-link.js +8 -0
  160. package/dist/public-web-link.js.map +1 -1
  161. package/dist/quickstart-api.d.ts +19 -1
  162. package/dist/quickstart-api.js +94 -4
  163. package/dist/quickstart-api.js.map +1 -1
  164. package/dist/reply-buttons-controller.d.ts +4 -0
  165. package/dist/reply-buttons-controller.js +2 -2
  166. package/dist/reply-buttons-controller.js.map +1 -1
  167. package/dist/restart-progress.d.ts +80 -1
  168. package/dist/restart-progress.js +306 -21
  169. package/dist/restart-progress.js.map +1 -1
  170. package/dist/rollout-index.d.ts +5 -0
  171. package/dist/rollout-index.js +26 -5
  172. package/dist/rollout-index.js.map +1 -1
  173. package/dist/scheduler/db.d.ts +40 -13
  174. package/dist/scheduler/db.js +123 -89
  175. package/dist/scheduler/db.js.map +1 -1
  176. package/dist/scheduler/task-board-text.d.ts +26 -0
  177. package/dist/scheduler/task-board-text.js +135 -0
  178. package/dist/scheduler/task-board-text.js.map +1 -0
  179. package/dist/scheduler/task-board.d.ts +650 -0
  180. package/dist/scheduler/task-board.js +1938 -0
  181. package/dist/scheduler/task-board.js.map +1 -0
  182. package/dist/scheduler/types.d.ts +6 -1
  183. package/dist/search/search-docs.d.ts +58 -0
  184. package/dist/search/search-docs.js +63 -0
  185. package/dist/search/search-docs.js.map +1 -0
  186. package/dist/search/search-index.d.ts +141 -0
  187. package/dist/search/search-index.js +440 -0
  188. package/dist/search/search-index.js.map +1 -0
  189. package/dist/search/search-store.d.ts +122 -0
  190. package/dist/search/search-store.js +236 -0
  191. package/dist/search/search-store.js.map +1 -0
  192. package/dist/search/search-worker.d.ts +1 -0
  193. package/dist/search/search-worker.js +163 -0
  194. package/dist/search/search-worker.js.map +1 -0
  195. package/dist/service-installer.js +12 -0
  196. package/dist/service-installer.js.map +1 -1
  197. package/dist/settings-api.d.ts +23 -0
  198. package/dist/settings-api.js +164 -3
  199. package/dist/settings-api.js.map +1 -1
  200. package/dist/settings-change.js +104 -0
  201. package/dist/settings-change.js.map +1 -1
  202. package/dist/settings-confirmation.d.ts +3 -1
  203. package/dist/settings-confirmation.js +2 -0
  204. package/dist/settings-confirmation.js.map +1 -1
  205. package/dist/settings-effect.js +34 -3
  206. package/dist/settings-effect.js.map +1 -1
  207. package/dist/settings-http-confirmation.d.ts +11 -0
  208. package/dist/settings-http-confirmation.js +10 -0
  209. package/dist/settings-http-confirmation.js.map +1 -1
  210. package/dist/setup-form.d.ts +1 -1
  211. package/dist/setup-form.js +23 -7
  212. package/dist/setup-form.js.map +1 -1
  213. package/dist/spawn-gate.d.ts +1 -0
  214. package/dist/spawn-gate.js +13 -3
  215. package/dist/spawn-gate.js.map +1 -1
  216. package/dist/task-board-tool.d.ts +25 -0
  217. package/dist/task-board-tool.js +154 -0
  218. package/dist/task-board-tool.js.map +1 -0
  219. package/dist/task-board-waker.d.ts +44 -0
  220. package/dist/task-board-waker.js +128 -0
  221. package/dist/task-board-waker.js.map +1 -0
  222. package/dist/tmux-exec-helper.d.ts +94 -0
  223. package/dist/tmux-exec-helper.js +407 -0
  224. package/dist/tmux-exec-helper.js.map +1 -0
  225. package/dist/tmux-manager.d.ts +5 -0
  226. package/dist/tmux-manager.js +42 -11
  227. package/dist/tmux-manager.js.map +1 -1
  228. package/dist/tool-permissions.d.ts +0 -7
  229. package/dist/tool-permissions.js +44 -5
  230. package/dist/tool-permissions.js.map +1 -1
  231. package/dist/topic-commands.d.ts +17 -1
  232. package/dist/topic-commands.js +45 -19
  233. package/dist/topic-commands.js.map +1 -1
  234. package/dist/tunnel/cloudflared.js +37 -2
  235. package/dist/tunnel/cloudflared.js.map +1 -1
  236. package/dist/tunnel/types.d.ts +3 -1
  237. package/dist/tunnel/types.js.map +1 -1
  238. package/dist/types.d.ts +63 -1
  239. package/dist/ui/app-effects.js +90 -32
  240. package/dist/ui/backend-signin.js +297 -0
  241. package/dist/ui/chat-ambient.js +307 -0
  242. package/dist/ui/chat-effect-posters.js +8 -8
  243. package/dist/ui/chat-effects.js +110 -15
  244. package/dist/ui/chat-msg-actions.js +176 -0
  245. package/dist/ui/chat-render.js +21 -3
  246. package/dist/ui/chat-store.js +64 -12
  247. package/dist/ui/chat-strings.js +85 -8
  248. package/dist/ui/chat-thread.js +204 -21
  249. package/dist/ui/effect-trial-controller.js +13 -8
  250. package/dist/ui/effect-trial-panel.js +19 -16
  251. package/dist/ui/effects-waker.js +70 -0
  252. package/dist/ui/fleet-canvas-layout.js +117 -0
  253. package/dist/ui/fleet-canvas.js +555 -0
  254. package/dist/ui/fleet-org.js +27 -12
  255. package/dist/ui/fleet-route-scene.js +207 -0
  256. package/dist/ui/fleet-route-worker.js +21 -0
  257. package/dist/ui/fleet-route.js +88 -0
  258. package/dist/ui/fleet-task-card.js +436 -0
  259. package/dist/ui/fleet-task-common.js +448 -0
  260. package/dist/ui/fleet-tasks.js +535 -0
  261. package/dist/ui/fleet-traffic.js +359 -0
  262. package/dist/ui/fleet-usage.js +435 -0
  263. package/dist/ui/panel-chat.js +264 -66
  264. package/dist/ui/panel-details.js +2 -1
  265. package/dist/ui/panel-fleet.js +65 -83
  266. package/dist/ui/panel-needs.js +4 -2
  267. package/dist/ui/panel-settings.js +56 -11
  268. package/dist/ui/preview.js +3 -2
  269. package/dist/ui/search-dialog.js +349 -0
  270. package/dist/ui/settings-appearance.js +44 -19
  271. package/dist/ui/settings-apply.js +3 -3
  272. package/dist/ui/settings-catalog.js +92 -0
  273. package/dist/ui/settings-confirm.js +7 -2
  274. package/dist/ui/settings-dialogs.js +40 -12
  275. package/dist/ui/settings-effects.js +4 -3
  276. package/dist/ui/settings-guests.js +117 -0
  277. package/dist/ui/settings-learn.js +25 -0
  278. package/dist/ui/settings-model.js +15 -6
  279. package/dist/ui/settings-mods.js +23 -9
  280. package/dist/ui/settings-owner-effects.js +15 -13
  281. package/dist/ui/settings-strings.js +122 -42
  282. package/dist/ui/settings-web-authority.js +91 -0
  283. package/dist/ui/shared/agend-auth.js +1 -1
  284. package/dist/ui/shared/app-i18n.js +11 -2
  285. package/dist/ui/shared/app-prefs.js +17 -4
  286. package/dist/ui/shared/app-route.js +19 -1
  287. package/dist/ui/shared/app-session.js +2 -0
  288. package/dist/ui/shared/app-shell.js +174 -30
  289. package/dist/ui/shared/app-store.js +26 -1
  290. package/dist/ui/shared/app-stream.js +5 -1
  291. package/dist/ui/shared/app-themes.js +140 -7
  292. package/dist/ui/shared/app.css +704 -20
  293. package/dist/ui/shared/app.js +26 -15
  294. package/dist/ui/shared/card-strings.js +8 -0
  295. package/dist/ui/shared/effect-app-runtime.js +68 -19
  296. package/dist/ui/shared/effect-chat-runtime.js +16 -3
  297. package/dist/ui/shared/effect-frame.js +26 -7
  298. package/dist/ui/shared/effect-geometry.js +24 -9
  299. package/dist/ui/shared/effect-owner-source.js +8 -1
  300. package/dist/ui/shared/effect-policy.js +21 -7
  301. package/dist/ui/shared/effect-profiler.js +31 -9
  302. package/dist/ui/shared/effect-registry.js +97 -50
  303. package/dist/ui/shared/effect-stock-snapshot.js +9 -0
  304. package/dist/ui/shared/effect-stock-trust.js +62 -10
  305. package/dist/ui/shared/effect-trial-shadow.js +62 -0
  306. package/dist/ui/shared/effect-trial-source.js +1 -1
  307. package/dist/ui/shared/effect-trial-stage.js +54 -31
  308. package/dist/ui/shared/effect-trial.css +40 -0
  309. package/dist/ui/shared/fx-motion.js +67 -0
  310. package/dist/ui/shared/identity-card.js +100 -11
  311. package/dist/ui/shared/identity-color.js +14 -10
  312. package/dist/ui/shared/instance-nav.js +179 -23
  313. package/dist/ui/shared/owner-css.js +30 -1
  314. package/dist/ui/shared/panel-view.js +24 -4
  315. package/dist/ui/shared/tokens.css +9 -3
  316. package/dist/ui/shared/ui-icons.js +2 -0
  317. package/dist/ui/shared/ui-menu.js +20 -7
  318. package/dist/ui/shared/ui-toast.js +16 -3
  319. package/dist/ui/shared/usage-dialog.js +34 -3
  320. package/dist/ui/shared/view-strings.js +72 -0
  321. package/dist/ui/shared/web-authorize.js +198 -0
  322. package/dist/ui/web-terminal/terminal.css +4 -4
  323. package/dist/ui/web-terminal/terminal.html +1 -1
  324. package/dist/update-launch.d.ts +9 -0
  325. package/dist/update-launch.js +38 -12
  326. package/dist/update-launch.js.map +1 -1
  327. package/dist/usage/format-rich.js +6 -3
  328. package/dist/usage/format-rich.js.map +1 -1
  329. package/dist/usage/i18n-keys.d.ts +1 -1
  330. package/dist/usage/i18n-keys.js +2 -1
  331. package/dist/usage/i18n-keys.js.map +1 -1
  332. package/dist/usage/i18n.d.ts +13 -1
  333. package/dist/usage/i18n.js +29 -0
  334. package/dist/usage/i18n.js.map +1 -1
  335. package/dist/usage/providers.d.ts +81 -2
  336. package/dist/usage/providers.js +240 -38
  337. package/dist/usage/providers.js.map +1 -1
  338. package/dist/usage/usage-api.d.ts +5 -1
  339. package/dist/usage/usage-api.js +184 -58
  340. package/dist/usage/usage-api.js.map +1 -1
  341. package/dist/usage-report.d.ts +158 -0
  342. package/dist/usage-report.js +226 -0
  343. package/dist/usage-report.js.map +1 -0
  344. package/dist/usage-rollup.d.ts +51 -0
  345. package/dist/usage-rollup.js +168 -0
  346. package/dist/usage-rollup.js.map +1 -0
  347. package/dist/user-systemd.d.ts +24 -0
  348. package/dist/user-systemd.js +75 -0
  349. package/dist/user-systemd.js.map +1 -0
  350. package/dist/view-api.d.ts +39 -0
  351. package/dist/view-api.js +69 -6
  352. package/dist/view-api.js.map +1 -1
  353. package/dist/web-ambient.d.ts +72 -0
  354. package/dist/web-ambient.js +161 -0
  355. package/dist/web-ambient.js.map +1 -0
  356. package/dist/web-api.d.ts +98 -14
  357. package/dist/web-api.js +1027 -83
  358. package/dist/web-api.js.map +1 -1
  359. package/dist/web-appearance-policy.d.ts +4 -6
  360. package/dist/web-appearance-policy.js +5 -12
  361. package/dist/web-appearance-policy.js.map +1 -1
  362. package/dist/web-appearance-tools.d.ts +3 -0
  363. package/dist/web-appearance-tools.js +22 -3
  364. package/dist/web-appearance-tools.js.map +1 -1
  365. package/dist/web-appearance-view.d.ts +27 -2
  366. package/dist/web-appearance-view.js +129 -14
  367. package/dist/web-appearance-view.js.map +1 -1
  368. package/dist/web-appearance.d.ts +17 -3
  369. package/dist/web-appearance.js +85 -8
  370. package/dist/web-appearance.js.map +1 -1
  371. package/dist/web-asset-parts.d.ts +2 -2
  372. package/dist/web-asset-parts.js +3 -3
  373. package/dist/web-asset-parts.js.map +1 -1
  374. package/dist/web-auth.js +3 -1
  375. package/dist/web-auth.js.map +1 -1
  376. package/dist/web-backend-login.d.ts +130 -0
  377. package/dist/web-backend-login.js +225 -0
  378. package/dist/web-backend-login.js.map +1 -0
  379. package/dist/web-card.d.ts +14 -0
  380. package/dist/web-card.js +40 -6
  381. package/dist/web-card.js.map +1 -1
  382. package/dist/web-channel-echo.d.ts +7 -1
  383. package/dist/web-channel-echo.js +6 -2
  384. package/dist/web-channel-echo.js.map +1 -1
  385. package/dist/web-chat-history.d.ts +83 -0
  386. package/dist/web-chat-history.js +137 -5
  387. package/dist/web-chat-history.js.map +1 -1
  388. package/dist/web-commands.d.ts +6 -1
  389. package/dist/web-commands.js +1 -1
  390. package/dist/web-commands.js.map +1 -1
  391. package/dist/web-effect-bootstrap.d.ts +12 -0
  392. package/dist/web-effect-bootstrap.js +49 -0
  393. package/dist/web-effect-bootstrap.js.map +1 -0
  394. package/dist/web-effect-bundle.js +46 -1
  395. package/dist/web-effect-bundle.js.map +1 -1
  396. package/dist/web-effect-playback.d.ts +30 -0
  397. package/dist/web-effect-playback.js +71 -0
  398. package/dist/web-effect-playback.js.map +1 -0
  399. package/dist/web-effect-profiles.d.ts +4 -4
  400. package/dist/web-effect-service.d.ts +11 -4
  401. package/dist/web-effect-service.js +25 -4
  402. package/dist/web-effect-service.js.map +1 -1
  403. package/dist/web-effect-tools.d.ts +1 -0
  404. package/dist/web-effect-tools.js +4 -4
  405. package/dist/web-effect-tools.js.map +1 -1
  406. package/dist/web-effect-trials.d.ts +2 -2
  407. package/dist/web-effect-trials.js +3 -3
  408. package/dist/web-effect-trials.js.map +1 -1
  409. package/dist/web-effect-upload.js +1 -1
  410. package/dist/web-effect-upload.js.map +1 -1
  411. package/dist/web-effect-worker.d.ts +1 -1
  412. package/dist/web-effect-worker.js +2 -2
  413. package/dist/web-effect-worker.js.map +1 -1
  414. package/dist/web-effect.d.ts +1 -1
  415. package/dist/web-guest-access.d.ts +126 -0
  416. package/dist/web-guest-access.js +238 -0
  417. package/dist/web-guest-access.js.map +1 -0
  418. package/dist/web-guest-rooms.d.ts +82 -0
  419. package/dist/web-guest-rooms.js +135 -0
  420. package/dist/web-guest-rooms.js.map +1 -0
  421. package/dist/web-host-guard.d.ts +11 -0
  422. package/dist/web-host-guard.js +11 -0
  423. package/dist/web-host-guard.js.map +1 -1
  424. package/dist/web-identity-color.d.ts +1 -1
  425. package/dist/web-identity-color.js +2 -2
  426. package/dist/web-identity-color.js.map +1 -1
  427. package/dist/web-identity-palette.d.ts +1 -1
  428. package/dist/web-identity-palette.js +2 -2
  429. package/dist/web-identity-palette.js.map +1 -1
  430. package/dist/web-image-meta.d.ts +13 -0
  431. package/dist/web-image-meta.js +62 -0
  432. package/dist/web-image-meta.js.map +1 -1
  433. package/dist/web-libavoid.d.ts +14 -0
  434. package/dist/web-libavoid.js +46 -0
  435. package/dist/web-libavoid.js.map +1 -0
  436. package/dist/web-login.d.ts +47 -0
  437. package/dist/web-login.js +115 -0
  438. package/dist/web-login.js.map +1 -1
  439. package/dist/web-mod-agent.d.ts +1 -1
  440. package/dist/web-mod-agent.js +7 -5
  441. package/dist/web-mod-agent.js.map +1 -1
  442. package/dist/web-mod-bundle.d.ts +9 -1
  443. package/dist/web-mod-bundle.js +62 -3
  444. package/dist/web-mod-bundle.js.map +1 -1
  445. package/dist/web-mod-export.d.ts +9 -0
  446. package/dist/web-mod-export.js +21 -0
  447. package/dist/web-mod-export.js.map +1 -1
  448. package/dist/web-mod-store.d.ts +7 -1
  449. package/dist/web-mod-store.js +19 -6
  450. package/dist/web-mod-store.js.map +1 -1
  451. package/dist/web-owner-css-store.d.ts +44 -1
  452. package/dist/web-owner-css-store.js +70 -9
  453. package/dist/web-owner-css-store.js.map +1 -1
  454. package/dist/web-prefs.d.ts +14 -0
  455. package/dist/web-prefs.js +37 -4
  456. package/dist/web-prefs.js.map +1 -1
  457. package/dist/web-preview.d.ts +6 -2
  458. package/dist/web-preview.js +4 -2
  459. package/dist/web-preview.js.map +1 -1
  460. package/dist/web-returning-device.d.ts +41 -0
  461. package/dist/web-returning-device.js +57 -5
  462. package/dist/web-returning-device.js.map +1 -1
  463. package/dist/web-session-authorization.d.ts +132 -0
  464. package/dist/web-session-authorization.js +193 -0
  465. package/dist/web-session-authorization.js.map +1 -0
  466. package/dist/web-session.d.ts +70 -10
  467. package/dist/web-session.js +137 -22
  468. package/dist/web-session.js.map +1 -1
  469. package/dist/web-settings-patch.d.ts +49 -2
  470. package/dist/web-settings-patch.js +145 -1
  471. package/dist/web-settings-patch.js.map +1 -1
  472. package/dist/web-settings-tools.d.ts +94 -0
  473. package/dist/web-settings-tools.js +301 -0
  474. package/dist/web-settings-tools.js.map +1 -0
  475. package/dist/web-shell-routes.d.ts +1 -1
  476. package/dist/web-shell-routes.js +1 -1
  477. package/dist/web-shell-routes.js.map +1 -1
  478. package/dist/web-terminal-http.js +15 -2
  479. package/dist/web-terminal-http.js.map +1 -1
  480. package/dist/web-theme-store.d.ts +39 -0
  481. package/dist/web-theme-store.js +122 -11
  482. package/dist/web-theme-store.js.map +1 -1
  483. package/dist/web-theme.d.ts +31 -0
  484. package/dist/web-theme.js +99 -2
  485. package/dist/web-theme.js.map +1 -1
  486. package/dist/web-upload.d.ts +13 -0
  487. package/dist/web-upload.js +39 -3
  488. package/dist/web-upload.js.map +1 -1
  489. package/dist/windows-shortcuts.d.ts +78 -0
  490. package/dist/windows-shortcuts.js +203 -0
  491. package/dist/windows-shortcuts.js.map +1 -0
  492. package/dist/workflow-templates/default.md +4 -1
  493. package/dist/yaml-shared-nodes.d.ts +25 -0
  494. package/dist/yaml-shared-nodes.js +185 -0
  495. package/dist/yaml-shared-nodes.js.map +1 -0
  496. package/launcher/agend-install.cjs +553 -0
  497. package/launcher/install-admission.cjs +4 -39
  498. package/launcher/postinstall.cjs +14 -12
  499. package/package.json +4 -2
  500. package/scripts/preinstall-guard.cjs +2 -5
  501. package/templates/windows-shortcuts.ps1 +181 -0
  502. package/launcher/old-updater-note.cjs +0 -48
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: web-appearance
3
- description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, play Canvas Worker effects in your chat (and offer a Try), preview the result, share it as a mod
4
- roles: [worker]
3
+ description: How you look on the AgEnD web dashboard — check it, change your own theme, identity card, identity colour and widgets, set an ambient effect (falling petals, click stars), play Canvas Worker effects in your chat (and offer a Try), preview the result, share it as a mod; and, for General, changing Settings → Web appearance for the user
4
+ roles: [general, worker, classic]
5
5
  ---
6
6
 
7
7
  ## What it is
@@ -14,15 +14,52 @@ can shape how you look there — **only your own look, and only on the surfaces
14
14
  | Your name and role line | display name, description | `set_display_name`, `set_description` |
15
15
  | Your status stamp | persona emoji | `set_persona_emoji` (see the `persona-emoji` skill) |
16
16
  | Your chat | theme: colours, accent, bubbles, font, background picture, working label | `set_web_theme`, `set_web_theme_asset` |
17
+ | The whole page, while your chat is open | your theme's colours on the sidebar, the header, the usage rail (a phone: the drawer, the header, the tabs) — colours only | `set_web_theme` (`page`) |
17
18
  | Your face and ring | theme picture and accent | `set_web_theme`, `set_web_theme_asset` |
18
19
  | Your identity card | portrait, banner, tagline, bio | `set_web_theme` (`card.*`), `set_web_theme_asset` |
19
20
  | Your identity colour | the colour people find you by in the sidebar, and where it shows (name, bar, ring) | `set_web_theme` (`identity`) |
20
21
  | Your chat header strip and Details page | widgets: small panels of facts the dashboard draws | `set_web_widget`, `remove_web_widget` |
22
+ | An ambient effect in your chat | falling petals, snow, rising lanterns, twinkles, stars where a person clicks — data only, drawn by the dashboard | `set_web_ambient`, `clear_web_ambient` |
21
23
  | A file of your look | a mod: export yours, or propose one for a person | `export_web_mod`, `propose_web_mod` |
22
- | Effects in your chat | Canvas Worker animations, and Try cards a local admin may start | `upload_web_effect`, `apply_web_effect`, `preview_web_effect`, … (see Effects) |
24
+ | Effects in your chat | Canvas Worker animations, and Try cards an admin outside the public link may start | `upload_web_effect`, `apply_web_effect`, `preview_web_effect`, … (see Effects) |
23
25
 
24
26
  None of these tools takes a target: they always act on you. You can't change another instance, the dashboard's own
25
- chrome, a person's sidebar widget, or a person's custom CSS.
27
+ chrome (beyond your colours on it while your chat is open), a person's sidebar widget, or a person's custom CSS.
28
+
29
+ ## For the user: Settings → Web appearance (General, coordinators, full)
30
+
31
+ If you are General (or a coordinator or full profile), you can change the user's **Settings → Web appearance** for
32
+ them, exactly as the page changes it: the same checks, the same refusals. Custom CSS keeps its safe rules: no remote
33
+ URLs, assets only as `url("asset:<id>")`, at most 64 KiB. Other instances can't; they shape only their own look (the rest
34
+ of this skill).
35
+
36
+ 1. **Read first:** `get_web_settings` returns a `summary` in plain words (tell the user from it), the values, and
37
+ `people`: the host operator and everyone who has signed in. Host settings are everyone's on this host. Custom CSS and
38
+ effect slots are one person's own: pass `person` as the entry whose id is the user's (`person:<adapter>:<their id>`),
39
+ else the host operator's are changed.
40
+ 2. **One change per call:** `set_web_settings({ person?, change })`, where `change.what` is one of:
41
+
42
+ | `what` | Changes | Example |
43
+ |---|---|---|
44
+ | `host` | `themes_shown`, `card_size` (s/m/l), `card_sizes` ({instance: s/m/l}), `page_colours` ({instance: page/chat}), `colour_places` (name/bar/ring), `colours_off`, `sidebar_widget` ({spec, data}) — null puts one back to its default | `{ what: "host", set: { colour_places: ["name","ring"] } }` |
45
+ | `agent_colour` | one agent's colour (`preset:<name>` or `#rrggbb`) and places; null resets each | `{ what: "agent_colour", instance: "atlas", colour: "preset:teal" }` |
46
+ | `page_colours` | where one agent's theme colours go: `page` (the whole page), `chat` (only its chat) or `agent` (its own `page.on`) — as ⋯ → Page colours sets it | `{ what: "page_colours", instance: "atlas", choice: "chat" }` |
47
+ | `banner_focus` | which part of one agent's cropped card banner stays in view: `focus` 0 (top) … 100 (bottom), 50 the centre; it wins over the agent's own `card.bannerFocus`; null follows the agent's again | `{ what: "banner_focus", instance: "atlas", focus: 20 }` |
48
+ | `custom_css` | `save` (with `text`): goes **on trial**. It waits until they open the dashboard (up to 10 minutes; never opened, it goes back unseen), then goes back by itself 20 s after it is on their screen unless kept (#2198). `keep` (with `trial`: the id `save` returned — a different trial on now, say one they saved on their page since, is refused with `trial_mismatch`, never kept instead; or, kept after that 20 s ran out, it is put back in force as `use` of it), `revert` (the trial), `use` (with `version`: an earlier saved one, at once), `off` | `{ what: "custom_css", action: "save", text: "…" }`; tell them to open the dashboard and look, then `keep` (with that `trial`) only when they say so — a `keep` that comes too late (`not_on_trial`) means use `use` with the version from `get_web_settings` |
49
+ | `mod` | an agent's proposal: `review` (instance → `stage`, `plan`, `plan_hash`), then `install` (stage, plan_hash, `include`: the parts, `target`: the agent); `cancel`, `dismiss`, `uninstall` (id) | review, show the user the plan, install only what they asked for — never custom CSS unasked. A person has one review open at a time: while theirs is open (`mod_review_open`) ask them to finish it; a mod they imported from a file is theirs to install (`mod_not_from_an_agent`) |
50
+ | `effect` | `apply` (instance, id, params?) or `remove` (instance, id?) an effect on a chat | |
51
+ | `ambient` | one agent's ambient effect, set for the user: `ambient` is the same spec as `set_web_ambient`'s (it replaces the one of its kind, and the agent can't change it after); `ambient: null` clears (`which`: `loop` or `click`, default both) | `{ what: "ambient", instance: "atlas", ambient: { preset: "fall", glyphs: ["🌸","❀","✿"] } }` |
52
+ | `effect_slot` | a person's `sidebar` / `header` / `page` / `box` / `cursor` effect (an id, or null) | |
53
+ | `restore_defaults` | the host settings back to their defaults, and the person's custom CSS off | |
54
+
55
+ 3. **Say what changed** in the user's words (read again if unsure). A refusal says why: the same words the page would
56
+ show.
57
+
58
+ **Only the person can do these, on the page:**
59
+ - choose a file from their computer: import a mod file, upload an effect folder, add a CSS asset or a card picture;
60
+ - this browser's own switches: custom CSS off on this device, pausing effect playback;
61
+ - download an export;
62
+ - the card upload limits (fleet configuration; a raise waits for an admin's confirmation).
26
63
 
27
64
  ## Look first
28
65
 
@@ -39,7 +76,7 @@ chrome, a person's sidebar widget, or a person's custom CSS.
39
76
  (`avatar.png`, `portrait.png`, …), and returns both lists of paths. Read the SVGs for exact colours, geometry and
40
77
  text, and the pictures as images. Only your own pictures are there.
41
78
  - `get_web_theme` — your stored theme, the token defaults it is drawn over, your uploaded pictures (`id`, `slot`), and
42
- `limits` (changes and uploads left, each picture slot's size limits, your picture quota).
79
+ `limits` (changes left, each picture slot's size limits, your picture quota).
43
80
 
44
81
  ## What wins over what
45
82
 
@@ -69,15 +106,26 @@ Typed values only; anything else is refused with `{ errors: [{ path, problem }]
69
106
  - `identity`: `{ color?, show? }`: your identity colour and where it shows.
70
107
  - `color` is a preset (`red`, `orange`, `amber`, `lime`, `green`, `teal`, `cyan`, `blue`, `indigo`, `violet`, `pink`,
71
108
  `slate`, each readable in light and dark) or `#rrggbb`.
72
- - `show` is a list of `name`, `bar` and `ring` (`[]` for nowhere). Left out, the host's default applies (ring and bar).
109
+ - `show` is a list of `name`, `bar` and `ring` (`[]` for nowhere). Left out, the host's default applies (name, bar and ring).
73
110
  - A person's choice for you in the dashboard always wins, field by field, and their Reset brings yours back.
74
111
  `get_web_appearance` says which is in force.
112
+ - `page` (#2196): `{ on?: true | false, sidebar?: { light?, dark? } }` — `on: true` puts your colours (bg, surface, text,
113
+ text2, accent; the sidebar's own colour per mode in `sidebar`, else your `bg`) on **the whole page while your chat,
114
+ View, Log or Details is open**: the sidebar, the header, the usage rail; on a phone the drawer, the header and the
115
+ tabs. Colours only: never fonts, pictures or layout, and **AgEnD's status colours** (the Needs you count, the state
116
+ dots, errors, the focus ring — `get_web_theme`'s `status_colors`) are never yours to change. With `on: true` the
117
+ contrast check adds: `text` and `text2` 4.5:1 and `accent` 3:1 on the sidebar, and every status colour 3:1 on the
118
+ sidebar and on `bg`. A person's choice for you (⋯ → **Page colours**: your choice, the whole page, only your chat)
119
+ wins; viewers with agents' themes off or `?safe=1` see the page's own look.
120
+ - For a person's **custom CSS** (#2199): while an agent's Chat, View, Log or Details is open, `<body>` has
121
+ `data-agent="<instance name>"` (none elsewhere), set in the same render as the page — so a person's stylesheet can
122
+ follow the open agent: `body[data-agent="atlas"] { --bg-sidebar: … }`. It is the person's, not yours to set.
75
123
  - `bubble`: `{ radius: 0..24, border: "none" | "thin" | "accent" }`.
76
124
  - `font`: `"inter"`, `"system"` or `"mono"`.
77
125
  - `background`: `{ image: <asset id>, fit: "cover" | "contain", opacity: 0.05..1 }`.
78
126
  - `avatar`: an asset id — your face (below a person's upload).
79
127
  - `workingLabel`: 1..24 characters on one line, shown while you work instead of "is working…".
80
- - `card`: `{ portrait?, banner?, tagline?, bio? }` — see below.
128
+ - `card`: `{ portrait?, banner?, tagline?, bio?, bannerFocus? }` — see below.
81
129
 
82
130
  Example:
83
131
 
@@ -100,6 +148,7 @@ the id is the hash of what is kept, so the same picture is the same id.
100
148
  | `avatar` | png, jpeg, webp, gif | 256 KiB, 4096 px a side |
101
149
  | `portrait` | png, jpeg, webp | set by the fleet (default 1024×1536, 1.5 MiB) |
102
150
  | `banner` | png, jpeg, webp | set by the fleet (default 1600×600, 768 KiB) |
151
+ | `glyph` | png, webp, gif | 64 KiB, 128 px a side; at most 4 (for `set_web_ambient`'s `glyphs`) |
103
152
 
104
153
  A picture holds one slot: upload it again for another slot only if it is a different picture. `get_web_theme`'s
105
154
  `limits.asset_slots` has the limits in force and `limits.asset_quota` how many pictures you may keep. A picture your
@@ -114,6 +163,18 @@ their own version of any field; theirs is shown instead of yours.
114
163
  The card goes **inside `set`**: `set_web_theme({ set: { card: { tagline, bio, portrait, banner } } })` (a top-level
115
164
  `card` argument is refused).
116
165
 
166
+ **Your banner is cropped: never drawn wider than 5 : 1** (on a wider screen it is centred over a blurred copy) **nor
167
+ narrower than 9 : 4** (which crops the sides). Make it **1600×600** (the default limit) and keep faces and text
168
+ inside the **safe area: the middle 84% of the width × 53% of the height — 1350×320** — which every card shows on every
169
+ screen and layout. `card.bannerFocus` (0 top … 100 bottom; default 50, the centre) moves that area up or down: put a face
170
+ near the top at `bannerFocus: 0`. A person's focus (Edit profile, or General's `set_web_settings { what: "banner_focus" }`)
171
+ wins over yours. `preview_web_appearance` draws the banner cropped at its focus, as the page does (an M card).
172
+
173
+ **In your chat** the card is hidden until the person shows it (the card menu in the chat header: Show card, Show picture
174
+ and bio). Shown, the banner sits right under the header and they can fold your portrait, tagline and bio away, keeping
175
+ only the banner. Their choice,
176
+ kept on their device; you cannot change it. So a banner that says who you are on its own reads well in your chat too.
177
+
117
178
  ## Your identity colour
118
179
 
119
180
  The colour people find you by in the sidebar, drawn on your name, a bar at your row's left edge and/or the ring around
@@ -124,7 +185,7 @@ your picture. Set yours with `set_web_theme({ set: { identity: { color, show } }
124
185
  themes) > your own bot's Discord **role** colour > an **automatic** soft colour chosen from your name (two instances
125
186
  may share one).
126
187
  - **Where it shows**: a person's choice for you > yours (`identity.show`; again only while themes are shown) > the
127
- host's default (Settings → Web appearance; ring and bar unless changed).
188
+ host's default (Settings → Web appearance; name, bar and ring unless changed).
128
189
  - The host can **turn colours off** for everyone: nothing is drawn, and every pick, yours included, is kept for when
129
190
  they come back.
130
191
  - `get_web_appearance`'s `identity_color` shows what is in force: `color`, `source` (`person`, `agent`, `role`, `auto`),
@@ -174,6 +235,42 @@ in it can be clicked or focused.
174
235
 
175
236
  Then, as you go: `set_web_widget { "slot": "chat_header", "data": { "tests": 75 } }`.
176
237
 
238
+ ## Ambient effects
239
+
240
+ An ambient effect is **data only**: you choose a preset and its glyphs, the dashboard draws them. No code runs, so it
241
+ needs no Try, no preview consent and no measurement — use it for petals, snow, lanterns, sparkles and stars on a click.
242
+ Use a Canvas Worker effect (below) only for what a preset can't express.
243
+
244
+ `set_web_ambient { preset, glyphs, colors?, count?, duration?, size?, sway?, spread?, rotate?, opacity? }`:
245
+
246
+ | `preset` | What it draws | `count` | `duration` (seconds, [min, max]) |
247
+ |---|---|---|---|
248
+ | `fall` | glyphs drifting down behind your chat, endlessly | 1..24 particles (default 12) | 4..30 (default [9, 19]) |
249
+ | `rise` | the same, drifting up | 1..24 (12) | 4..30 ([9, 19]) |
250
+ | `twinkle` | glyphs pulsing in place | 1..24 (12) | 1..10 ([2, 5]) |
251
+ | `burst-on-click` | glyphs scattering from where a person clicks or taps in your chat | 4..16 per click (10) | 0.3..2 ([0.5, 0.9]) |
252
+
253
+ - `glyphs`: 1..4, picked at random per particle — a string of 1..2 characters (an emoji, `✦`, `❀`), or `{ "asset": id }`,
254
+ a picture you uploaded with `set_web_theme_asset` to the `glyph` slot.
255
+ - `colors`: 0..5 `#rrggbb` for text glyphs (default: your accent). `size`: [min, max] px, 10..40 (default [14, 22]).
256
+ `sway`: sideways drift for fall and rise, 0..80 px (40). `spread`: how far a burst scatters, [min, max] 20..120 px
257
+ ([34, 90]). `rotate`: 0..720 degrees over a run (300). `opacity`: [start, peak, end], each 0..1 ([0, 0.85, 0.15]).
258
+ - Your chat holds **one looping ambient** (`fall`, `rise` or `twinkle`) **and one `burst-on-click`**: setting one
259
+ replaces only its own kind. `clear_web_ambient { which? }` clears `loop`, `click`, or both.
260
+ - It is drawn **behind your messages** and never takes a click (a burst shows over them for a moment, then is gone).
261
+ - Who sees it: everyone who shows agents' looks, the public link included. Not with "Show agents' themes, effects and
262
+ widgets" off, `?safe=1`, or on a device that chose to follow the system's reduced-motion setting while
263
+ the system asks for it. A hidden tab pauses it.
264
+ - Like a theme: a change for the rate limit, refused while a person locked your look; one a person set is theirs
265
+ (`person_placed`). A person's Reset of your theme clears it. `get_web_appearance` shows it, and
266
+ `preview_web_appearance` draws the looping one, still, behind the bubbles.
267
+
268
+ ```json
269
+ { "preset": "fall", "glyphs": ["🌸", "❀", "✿"], "colors": ["#f4a7b9", "#ffd1dc"], "count": 12, "duration": [9, 19] }
270
+ ```
271
+
272
+ Then stars on a click, alongside: `set_web_ambient { "preset": "burst-on-click", "glyphs": ["✦", "✧"] }`.
273
+
177
274
  ## Mods
178
275
 
179
276
  A mod is one file, `<name>-<version>.agendmod.json`, that carries a look: a theme with its pictures, card text,
@@ -183,29 +280,33 @@ everything in a mod and ticks what to apply.
183
280
  - `export_web_mod { name, version, title? }` writes **your own** look to `.agend/mods/<name>-<version>.agendmod.json`
184
281
  in your working directory and returns `{ path, bytes }`. It carries your theme with its pictures, the effects your
185
282
  theme places (with their params) when they are yours or shared with you, your own card text (not a person's card
186
- fields), and the widgets you placed. A person's private effect placed on you stays out (`effects_omitted` counts it).
283
+ fields), the widgets and ambient effects you set yourself. A person's private effect placed on you stays out (`effects_omitted` counts it).
187
284
  It never carries custom CSS or the sidebar widget, which are a person's. `name` is a-z, 0-9 and -, `version` is
188
285
  MAJOR.MINOR.PATCH.
189
286
  - `propose_web_mod { file }` sends a mod file from your working directory (at most 8 MiB) for a person to review. It
190
287
  is checked whole and answers with its problems if it isn't valid. **A mod carrying custom CSS is refused**
191
288
  (`owner_css_not_from_agent`). A muted line in your chat says it was proposed. Nothing changes until a person
192
- installs it. One proposal at a time: a new one replaces yours. It counts as an upload.
289
+ installs it. One proposal at a time: a new one replaces yours.
193
290
  - A widget a person placed from a mod is theirs: you may give it values (`set_web_widget` with `data`), but not replace
194
291
  or remove it (`person_placed`).
195
292
 
196
293
  The file format: `{ "format": "agend-mod", "v": 1, "manifest": { name, version, title, description?, author?,
197
- requires?: { agend: ">=X.Y.Z" }, contents: { theme?, identity?, widgets?: { chat_header?, details? }, effects? } },
294
+ requires?: { agend: ">=X.Y.Z" }, contents: { theme?, identity?, widgets?: { chat_header?, details? }, ambient?, effects? } },
198
295
  "files": { "<path>": { "sha256", "b64" } } }`. Every file is listed with its sha256 and used by exactly one part, paths
199
- are lowercase with no `..`, and a theme names its pictures by path. The easiest way to get one right is to set your look
296
+ are lowercase with no `..`, and a theme names its pictures by path (an ambient's glyph pictures too: `{ "asset": "<path>" }`). The easiest way to get one right is to set your look
200
297
  with the tools above, then `export_web_mod`.
201
298
 
202
299
  ## Limits
203
300
 
204
- - At least **30 s** between changes, at most **10 changes an hour**, at most **3 picture uploads an hour** — refused
205
- with `rate_limited` and `retry_after_s`. Only an accepted change counts; a refused or invalid one costs nothing.
301
+ - At least **30 s** between changes, at most **10 changes an hour** — refused with `rate_limited` and
302
+ `retry_after_s`. Only an accepted change counts; a refused or invalid one costs nothing.
303
+ - Uploads (pictures, effects, proposed mods) are not counted. Each picture slot's size limits, your picture quota and
304
+ each file's own caps still apply; using a picture in your theme is a change.
206
305
  - Widget values (`set_web_widget` with `data` only): at least **10 s** apart, at most **180 an hour**, apart from the
207
306
  above.
208
- - Effects: `apply_web_effect` and `remove_web_effect` are changes; `upload_web_effect` and `propose_web_mod` are uploads.
307
+ - `set_web_ambient` and `clear_web_ambient` are changes.
308
+ - Effects: `apply_web_effect` and `remove_web_effect` are changes; `upload_web_effect` and `propose_web_mod` are not
309
+ counted.
209
310
  At most 10 effects and 8 MiB of your own, at most two placed in your chat.
210
311
  - Plan the whole look, check it in one `set_web_theme`, then preview — don't iterate change by change.
211
312
 
@@ -218,25 +319,47 @@ with the tools above, then `export_web_mod`.
218
319
 
219
320
  From a shell: `agend-agent theme get|set key=value…|set --json '<patch>'|clear <path>…|asset <slot> <file>|reset`,
220
321
  `agend-agent appearance`, `agend-agent appearance preview [light|dark]`, and
221
- `agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`, and
322
+ `agend-agent widget set <slot> '<spec json>' ['<data json>']|data <slot> '<data json>'|remove [slot]`,
323
+ `agend-agent ambient set '<spec json>'|clear [loop|click]`, and
222
324
  `agend-agent mod export <name> <version> [title]|propose <file>`.
223
325
 
224
326
  ## Files in your working directory
225
327
 
226
- Asset uploads, effect directories and mod proposals must be inside your working directory. This includes your own
227
- AgEnD-managed workspace (`~/.agend/workspaces/<your-instance-name>`), used by ClassicBot and instances without a
228
- project directory. `web-assets/` and `web-effects/` are convenient staging folders, not required names. Paths are
229
- checked after resolving symlinks: for the supplied caller identity, another instance's workspace and all other AgEnD
230
- state remain forbidden, including
231
- `.env`, databases, `instances/`, `credential-profiles/` and `inbox/`. Symlinks cannot grant access outside your working
232
- directory or into protected state; uploaded files themselves must not be symlinks. Generated appearance previews and
233
- mod exports follow the same workspace boundary. The CLI takes its caller name from `AGEND_INSTANCE_NAME` and its
234
- working directory from the shell; these local checks do not isolate shells running as the same OS user.
328
+ Asset uploads, effect directories and mod proposals must be inside your working directory. For an external project,
329
+ use files there as before. For your own AgEnD-managed workspace under `~/.agend/workspaces/`, ordinary files there
330
+ also work; no staging folder is required. This includes the standard `<your-instance-name>` folder (ClassicBot and
331
+ instances without a project directory) and an exclusively configured folder with another name, such as instance
332
+ `alpha` with `working_directory: ~/.agend/workspaces/alpha-home` in `fleet.yaml`. Its canonical configured path must
333
+ not overlap another instance's configured or standard workspace, including persisted ClassicBot peers that are
334
+ stopped or paused. The `workspaces/` root itself is not a workspace.
335
+
336
+ General, adapter-specific General (such as `general-telegram`), and other configured working directories elsewhere
337
+ inside the AgEnD state directory must stage inputs under **`web-assets/` or `web-effects/`**. For example, put a banner at
338
+ `web-assets/banner.png` or an effect package at `web-effects/sparks/`, relative to that working directory. Its root
339
+ and backend configuration folders are not upload areas. Generated previews and exported mods still use the fixed
340
+ `.agend/appearance/` and `.agend/mods/` directories and can be read back or proposed there.
341
+
342
+ The daemon uses its launch identity and configuration; the CLI resolves `AGEND_INSTANCE_NAME` against `fleet.yaml`.
343
+ These checks require a canonical, exclusively owned directory: the state root, shared or overlapping configured
344
+ working directories, another instance's directory, and the host's state stores never qualify. No tool argument can
345
+ select an identity or working directory. Missing or unreadable ownership evidence refuses in-state access.
346
+
347
+ Inside all admitted in-state areas, `.env`, databases and their WAL/SHM/journal files, `instances/`,
348
+ `credential-profiles/`, `inbox/`, `web-files/`, `web-chat.json`, `chat-logs/`, backend credential/session/config files,
349
+ and hidden files or folders are refused. The only hidden-directory exception is the two generated `.agend/`
350
+ output directories above; their contents still undergo the sensitive-name checks. Hard-linked state files are also
351
+ refused. Copy an intended asset into staging as a new regular file; do not link a private state file there.
352
+
353
+ Paths are checked after resolving symlinks. A symlink named after General or a workspace, or in its managed parent
354
+ path, cannot widen access; uploaded files themselves must not be symlinks. Containment still applies to relative and
355
+ absolute paths and to each file in an effect package. The CLI name and current directory are controlled by its shell:
356
+ these local checks prevent accidental uploads, but do not isolate shells running as the same OS user.
235
357
 
236
358
  ## Effects
237
359
 
238
360
  A Canvas Worker effect is a small animation drawn by code that runs in an isolated Worker: no page, no DOM, no
239
- network. You place effects **only in your own chat**; a person can place them in the regions an effect's manifest
361
+ network. For petals, snow or stars on a click, an ambient effect (above) is simpler and plays without a Try. You place
362
+ effects **only in your own chat**; a person can place them in the regions an effect's manifest
240
363
  allows. None of these tools takes a target.
241
364
 
242
365
  **The package** (CW1): a directory in your working directory with `effect.json` and `worker.js`, optionally
@@ -266,12 +389,18 @@ smallest valid `effect.json`:
266
389
  at most 4096 px a side, and **8,388,608 pixels in total** across the assets, poster and cursor together. A cursor is
267
390
  a square PNG of at most 64 px and 32 KiB (after metadata is stripped).
268
391
 
392
+ **Reusable pointer example:** [`docs/examples/click-sparks`](https://github.com/songsid/AgEnD/blob/main/docs/examples/click-sparks.md) has a small two-file CW1 package: click for a burst, hold the primary button and move for a trail. Copy it into your working directory before uploading. Protected controls receive no pointer input; samples are coalesced (up to 60 Hz, 30 at reduced quality), so do not use it as a required click or drag control.
393
+
269
394
  **The tools:**
270
395
 
271
- - `upload_web_effect { dir }` → `{ id, warnings }`. It counts as an upload (3 an hour, shared with pictures and mods).
396
+ - `upload_web_effect { dir }` → `{ id, warnings }`. Uploads are not counted; the effect's own size caps apply.
272
397
  **Your own** copies are at most **10 effects and 8 MiB**; effects a person shared with you don't count.
273
398
  - `list_web_effects` — your own effects and those a person shared with you: `id`, `name`, `title`, `regions`, `layer`,
274
- `bytes`, `latest_profile`.
399
+ `bytes`, `latest_profile`. A currently placed effect also has `playback`: `status: "reported_blocked"` with closed
400
+ `reasons`, or `status: "unknown"`. `get_web_appearance.effects` lists your current placements with the same projection.
401
+ This means **some recent viewers reported blocked**, not all viewers and not a live permission or health check.
402
+ Observations expire after five minutes and stay in memory. Agents receive no viewer identifiers, counts, device/OS,
403
+ text, URLs or observation timestamps. Unknown means unknown; do not keep reapplying to bypass a viewer's choice.
275
404
  - `apply_web_effect { id, params? }` places one in your chat, **at most two at a time**, with the declared `params`
276
405
  (unknown or out of range → `effect_params`; regions without `chat` → `effect_region`). `remove_web_effect { id? }`
277
406
  takes one out, or all of them. Both are changes (30 s apart, 10 an hour), and are refused while a person has locked
@@ -293,14 +422,26 @@ smallest valid `effect.json`:
293
422
 
294
423
  - At most **3** effects play at once, at most **2** of them `front` (1 and 1 on a constrained device); the rest wait
295
424
  (`frame_limit`, `front_limit`).
296
- - Nothing plays in safe mode, over a temporary public link, with reduced motion or save-data, on a hidden page, while
297
- the viewer has effects off, or before they consent to previews. A `poster.png` may then show behind the chat (see
298
- Static Chat fallback). A visible menu or dialog stops `front` effects; these stops lift by themselves.
299
- - **Safety pause** — it measures the page's responsiveness, not your Worker's CPU. The page's frame-rate floor is
300
- 90% of what it measured before the effect started, capped at 55 fps (50 on a constrained device), so a 30 Hz screen
301
- has a 27 fps floor. Where the browser reports them, long tasks may take at most 50 ms a second (25 ms constrained);
302
- unknown timing doesn't count as free. Overlapping 2-second windows are judged at most once a second after a warm-up,
303
- and three bad judgements in a row pause the effect (`host_budget`).
425
+ - CW uses an opaque isolated document on the dashboard listener: no HTML-preview consent, separate preview port or
426
+ localhost requirement. Signed-in public/guest viewers may read and play only current effects in chats they can see;
427
+ this grants no library management, personal-slot, private-image, Trial or profile access. Their Chat header has a
428
+ browser-local show/off switch, including on phones, and an inline recovery action. It never writes host preferences.
429
+ - Playback starts without an empty-page FPS calibration. Safe mode, hidden tabs and the viewer's show switch still
430
+ stop it. **Effects: follow the system's reduced-motion setting** is device-local and **off by default**, shared with
431
+ ambient effects. The OS request alone does not block playback; data saver is informational. A one-time chat note
432
+ offers to follow reduced motion, and a motion refusal offers **Play effects anyway** right there, including public/guest
433
+ viewers. Safe mode offers **Leave safe mode**. A poster may replace unsupported playback or a chosen motion block
434
+ (see Static Chat fallback). Menus/dialogs stop `front` effects temporarily.
435
+ - A layout refusal keeps its local code in the Chat notice and Effects dialog (for example `stock_order_unknown`);
436
+ the browser console also names it. Report that code rather than repeatedly applying the effect. A failed Try leaves
437
+ its stop code on the offer card. Pointer-leave does not stop Try; window blur, closing, navigation or lost stage proof do.
438
+ Agent playback summaries still contain only the closed reporting reasons, never raw local diagnostics.
439
+ - **Safety pause** — it measures the page's responsiveness, not your Worker's CPU. Host rAF observations learn a live
440
+ cadence during warm-up, then fix the mount's floor at 90% of a faster observed cadence, capped at 55 fps (50 on a
441
+ constrained device). A steady 30 Hz display has a 27 fps floor. This is not an empty-page health certificate; uniformly
442
+ slow startup can look like a low-refresh display. Where reported, long tasks may take at most 50 ms a second (25 ms
443
+ constrained); unknown observations never count as free. Overlapping 2-second windows are judged at most once a second
444
+ after warm-up, and three bad judgements in a row pause the effect (`host_budget`).
304
445
  - Only a viewer's explicit **Resume** restarts a safety-paused effect, and it doesn't clear the history: three such
305
446
  pauses within 24 hours turn the effect **off** for that viewer's browser and device class, across tabs and reloads,
306
447
  and Resume then refuses. It doesn't come back by itself after 24 hours.
@@ -321,25 +462,27 @@ from being collected until cleared. This is deliberately stricter than chat plac
321
462
  a personal choice keeps following its person's current own/shared access, while a chat preserves the exact effect
322
463
  placed there. A reference is not a sharing or export grant. Do not keep retrying a denied personal selection.
323
464
 
324
- Owner selectors are available in Settings → Web appearance. With effects and preview consent enabled, personal
325
- page/header/sidebar/box choices play across supported stock pages in the same pool as local signed-in Chat.
326
- Web appearance offers slot Pause/Resume and unavailable/Clear controls. The personal cursor uses a static PNG on the host shell after the same consent: no Worker/code read or frame slot. It preserves explicit pointer/text/resize cursors, falls back while dragging or on failure, and has status/Clear rather than Worker Pause/Resume. Before revealing paint, the host must prove stock content
465
+ Owner selectors are available in Settings → Web appearance. With effects enabled, personal page/header/sidebar/box choices play across supported stock pages in the same pool
466
+ as signed-in Chat. HTML-preview consent and its service are not involved.
467
+ Web appearance offers slot Pause/Resume and unavailable/Clear controls. The personal cursor uses a static PNG on the host shell without HTML-preview consent: no Worker/code read or frame slot. It preserves explicit pointer/text/resize cursors, falls back while dragging or on failure, and has status/Clear rather than Worker Pause/Resume. Before revealing paint, the host must prove stock content
327
468
  ordering and trust paint coverage. Agent front effects must remain paused when custom CSS is active, loading or
328
469
  unknown; a person sees the reason and can open the causing setting. Human placements retain their exemption from
329
470
  that agent restriction, and behind effects still require proven ordering. Saving a placement alone is not proof of
330
471
  playback.
331
472
 
332
- Visible menus, dialogs, Keep/tour notices and focused inputs suppress all foreground effects; a human placement
333
- does not bypass those host safety gates. Unknown stock layout refuses admission. A trusted foreground plane is
473
+ Visible menus, dialogs and Keep/tour notices suppress foreground effects; a human placement does not bypass them.
474
+ Editable focus suppresses pointer signals, not unrelated drawing. Protected controls stay clipped out of front paint;
475
+ keyboard events never enter the Worker. Unknown stock layout refuses admission. A trusted foreground plane is
334
476
  deferred to #1940; do not keep reapplying an agent front while custom CSS is on, loading or unknown.
335
477
 
336
- ### Try: offer first, local admin click to start
478
+ ### Try: offer first, signed-in admin click to start
337
479
 
338
480
  `preview_web_effect({id})` posts a volatile Try card in your own web chat, using your current own/shared read rights. It starts nothing and changes no appearance. The sample is physically clipped inside its own host panel or sheet. Only an explicit
339
- click by a signed-in **local admin** may start it; never an agent, public link, header token or automatic action.
481
+ click by a signed-in **admin outside the public link** may start it (localhost is not required); never an agent, public link, header token or automatic action.
340
482
  The host owns a visible Trial label and Stop control. Closing the panel/sheet, navigating, window blur, or another
341
- menu/dialog stops it. Custom CSS must be off (on/loading/unknown denies), and the same caps, profiler and safety
342
- stops apply. Ordinary foreground effects stay suppressed. A volatile offer lasts at most ten minutes (offering the same effect again keeps that offer and its expiry; a different effect replaces it); every read
483
+ menu/dialog stops it. The explicit Try click consents to this sample only; no global HTML-preview opt-in is needed or changed.
484
+ The host isolates the Trial controls and clipped stage in a closed Shadow DOM with fixed styles and reset typography.
485
+ Custom CSS stays active elsewhere. The same caps, profiler and safety stops apply. Ordinary foreground effects stay suppressed. A volatile offer lasts at most ten minutes (offering the same effect again keeps that offer and its expiry; a different effect replaces it); every read
343
486
  rechecks the originating agent's current own/shared access, with the trial bound to the admin's session and epoch.
344
487
  There is no saved placement, claim, share, export or new saved profile record. Cards are memory-only and become inert when expired; a restart never restores them. Try uses manifest defaults and the existing app pool, not a second runtime. Do not treat an offer id or ordinary reply button
345
488
  as permission to run or fetch an effect, and do not keep retrying an unavailable Try.
@@ -347,12 +490,12 @@ as permission to run or fetch an effect, and do not keep retrying an unavailable
347
490
 
348
491
  ## Static Chat fallback
349
492
 
350
- When preview is unavailable, consent is missing, motion/data settings prevent playback, or the page is a public link,
493
+ When Worker/transport support is unavailable, the chosen motion preference prevents playback, or the page has no playback session,
351
494
  a current chat placement with a poster can show its static PNG **behind** the content; a front declaration does not
352
495
  make its poster foreground. No poster means nothing is drawn. Safe mode and the viewer's show switch hide posters
353
496
  too; unknown stock ordering refuses paint. Explicit Pause, queued effects and a failed live read are not replaced by
354
497
  this surface fallback. A failed static read/decode stops its poster pool until a changed revision or page reload;
355
- there is no automatic network retry. The public link offers no Effects playback controls or Worker code.
498
+ there is no automatic network retry. Public viewers can read current Chat Worker code, with fresh session/exposure/placement checks; they acquire no library or personal-slot grant. They have no placement-management or Try controls.
356
499
 
357
500
  The public-link show switch is this browser's choice, kept separately from boot-cached host defaults; it never writes
358
501
  a host preference. The ordinary signed-in switch keeps its existing host preference. Do not depend on decoration to