@songsid/agend 2.3.0-beta.1 → 2.3.0-beta.10

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 (351) hide show
  1. package/dist/agent-cli-instructions.md +5 -2
  2. package/dist/agent-cli.js +43 -7
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.js +4 -0
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/agent-file-read.d.ts +14 -6
  7. package/dist/agent-file-read.js +207 -19
  8. package/dist/agent-file-read.js.map +1 -1
  9. package/dist/agent-whats-new.d.ts +11 -0
  10. package/dist/agent-whats-new.js +29 -15
  11. package/dist/agent-whats-new.js.map +1 -1
  12. package/dist/auth-api.d.ts +30 -1
  13. package/dist/auth-api.js +45 -13
  14. package/dist/auth-api.js.map +1 -1
  15. package/dist/authority/authority-state.d.ts +38 -0
  16. package/dist/authority/authority-state.js +114 -0
  17. package/dist/authority/authority-state.js.map +1 -0
  18. package/dist/authority/session-authorizations.d.ts +43 -0
  19. package/dist/authority/session-authorizations.js +102 -0
  20. package/dist/authority/session-authorizations.js.map +1 -0
  21. package/dist/authority/web-authority.d.ts +120 -0
  22. package/dist/authority/web-authority.js +157 -0
  23. package/dist/authority/web-authority.js.map +1 -0
  24. package/dist/backend/claude-code.d.ts +2 -2
  25. package/dist/backend/claude-code.js +10 -5
  26. package/dist/backend/claude-code.js.map +1 -1
  27. package/dist/backend/types.d.ts +14 -0
  28. package/dist/backend/types.js +25 -0
  29. package/dist/backend/types.js.map +1 -1
  30. package/dist/backend-availability.d.ts +120 -0
  31. package/dist/backend-availability.js +396 -0
  32. package/dist/backend-availability.js.map +1 -0
  33. package/dist/backend-command.d.ts +21 -3
  34. package/dist/backend-command.js +23 -4
  35. package/dist/backend-command.js.map +1 -1
  36. package/dist/bundled-skills.d.ts +14 -0
  37. package/dist/bundled-skills.js +29 -0
  38. package/dist/bundled-skills.js.map +1 -0
  39. package/dist/cache-analysis.d.ts +47 -1
  40. package/dist/cache-analysis.js +68 -8
  41. package/dist/cache-analysis.js.map +1 -1
  42. package/dist/cache-ledger.d.ts +16 -3
  43. package/dist/cache-ledger.js +33 -13
  44. package/dist/cache-ledger.js.map +1 -1
  45. package/dist/cache-report-tool.d.ts +17 -0
  46. package/dist/cache-report-tool.js +40 -0
  47. package/dist/cache-report-tool.js.map +1 -0
  48. package/dist/cache-service.d.ts +70 -3
  49. package/dist/cache-service.js +178 -17
  50. package/dist/cache-service.js.map +1 -1
  51. package/dist/channel/adapters/discord.d.ts +7 -0
  52. package/dist/channel/adapters/discord.js +35 -0
  53. package/dist/channel/adapters/discord.js.map +1 -1
  54. package/dist/channel/mcp-tools.js +22 -10
  55. package/dist/channel/mcp-tools.js.map +1 -1
  56. package/dist/channel/types.d.ts +6 -0
  57. package/dist/classic-channel-manager.d.ts +10 -5
  58. package/dist/classic-channel-manager.js +12 -9
  59. package/dist/classic-channel-manager.js.map +1 -1
  60. package/dist/cli.js +130 -31
  61. package/dist/cli.js.map +1 -1
  62. package/dist/config-validator.js +103 -4
  63. package/dist/config-validator.js.map +1 -1
  64. package/dist/daemon.d.ts +7 -0
  65. package/dist/daemon.js +63 -16
  66. package/dist/daemon.js.map +1 -1
  67. package/dist/decision-list.d.ts +25 -0
  68. package/dist/decision-list.js +30 -0
  69. package/dist/decision-list.js.map +1 -0
  70. package/dist/delivery-outbox.d.ts +10 -0
  71. package/dist/delivery-outbox.js +12 -1
  72. package/dist/delivery-outbox.js.map +1 -1
  73. package/dist/fleet-context.d.ts +10 -0
  74. package/dist/fleet-manager.d.ts +417 -11
  75. package/dist/fleet-manager.js +1387 -109
  76. package/dist/fleet-manager.js.map +1 -1
  77. package/dist/fleet-traffic.d.ts +74 -0
  78. package/dist/fleet-traffic.js +196 -0
  79. package/dist/fleet-traffic.js.map +1 -0
  80. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
  81. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
  82. package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
  83. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
  84. package/dist/general-knowledge/skills/web-appearance/SKILL.md +257 -23
  85. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +476 -0
  86. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  87. package/dist/human-delivery-receipts.d.ts +24 -1
  88. package/dist/human-delivery-receipts.js +64 -11
  89. package/dist/human-delivery-receipts.js.map +1 -1
  90. package/dist/instance-config-impact.js +3 -1
  91. package/dist/instance-config-impact.js.map +1 -1
  92. package/dist/instance-names.d.ts +4 -0
  93. package/dist/instance-names.js +12 -0
  94. package/dist/instance-names.js.map +1 -0
  95. package/dist/instructions.d.ts +12 -1
  96. package/dist/instructions.js +13 -2
  97. package/dist/instructions.js.map +1 -1
  98. package/dist/locale.js +100 -8
  99. package/dist/locale.js.map +1 -1
  100. package/dist/ls-attach-resolve.d.ts +95 -0
  101. package/dist/ls-attach-resolve.js +174 -0
  102. package/dist/ls-attach-resolve.js.map +1 -0
  103. package/dist/memory-hogs.d.ts +27 -0
  104. package/dist/memory-hogs.js +124 -0
  105. package/dist/memory-hogs.js.map +1 -0
  106. package/dist/outbound-handlers.d.ts +10 -0
  107. package/dist/outbound-handlers.js +122 -2
  108. package/dist/outbound-handlers.js.map +1 -1
  109. package/dist/outbound-schemas.d.ts +164 -4
  110. package/dist/outbound-schemas.js +99 -3
  111. package/dist/outbound-schemas.js.map +1 -1
  112. package/dist/public-web-gateway.js +8 -2
  113. package/dist/public-web-gateway.js.map +1 -1
  114. package/dist/public-web-link.d.ts +9 -0
  115. package/dist/public-web-link.js +8 -0
  116. package/dist/public-web-link.js.map +1 -1
  117. package/dist/quickstart-api.d.ts +10 -1
  118. package/dist/quickstart-api.js +12 -4
  119. package/dist/quickstart-api.js.map +1 -1
  120. package/dist/reply-buttons-controller.d.ts +4 -0
  121. package/dist/reply-buttons-controller.js +2 -2
  122. package/dist/reply-buttons-controller.js.map +1 -1
  123. package/dist/restart-progress.d.ts +65 -1
  124. package/dist/restart-progress.js +236 -10
  125. package/dist/restart-progress.js.map +1 -1
  126. package/dist/rollout-index.d.ts +5 -0
  127. package/dist/rollout-index.js +26 -5
  128. package/dist/rollout-index.js.map +1 -1
  129. package/dist/scheduler/scheduler.d.ts +12 -0
  130. package/dist/scheduler/scheduler.js +83 -10
  131. package/dist/scheduler/scheduler.js.map +1 -1
  132. package/dist/service-installer.d.ts +2 -1
  133. package/dist/service-installer.js +18 -3
  134. package/dist/service-installer.js.map +1 -1
  135. package/dist/settings-api.d.ts +19 -0
  136. package/dist/settings-api.js +137 -2
  137. package/dist/settings-api.js.map +1 -1
  138. package/dist/settings-change.js +104 -0
  139. package/dist/settings-change.js.map +1 -1
  140. package/dist/settings-effect.js +17 -1
  141. package/dist/settings-effect.js.map +1 -1
  142. package/dist/tmux-manager.d.ts +5 -0
  143. package/dist/tmux-manager.js +16 -0
  144. package/dist/tmux-manager.js.map +1 -1
  145. package/dist/tool-permissions.d.ts +4 -6
  146. package/dist/tool-permissions.js +53 -5
  147. package/dist/tool-permissions.js.map +1 -1
  148. package/dist/topic-commands.d.ts +7 -1
  149. package/dist/topic-commands.js +18 -4
  150. package/dist/topic-commands.js.map +1 -1
  151. package/dist/types.d.ts +48 -1
  152. package/dist/ui/app-effects.js +77 -31
  153. package/dist/ui/chat-ambient.js +307 -0
  154. package/dist/ui/chat-effect-posters.js +8 -8
  155. package/dist/ui/chat-effects.js +101 -13
  156. package/dist/ui/chat-render.js +5 -2
  157. package/dist/ui/chat-strings.js +59 -6
  158. package/dist/ui/chat-thread.js +149 -21
  159. package/dist/ui/effect-trial-controller.js +13 -8
  160. package/dist/ui/effect-trial-panel.js +19 -16
  161. package/dist/ui/fleet-cache.js +23 -1
  162. package/dist/ui/fleet-canvas-layout.js +111 -0
  163. package/dist/ui/fleet-canvas.js +525 -0
  164. package/dist/ui/fleet-org.js +27 -12
  165. package/dist/ui/fleet-traffic.js +343 -0
  166. package/dist/ui/fleet-usage.js +401 -0
  167. package/dist/ui/panel-chat.js +127 -49
  168. package/dist/ui/panel-details.js +2 -1
  169. package/dist/ui/panel-fleet.js +41 -16
  170. package/dist/ui/panel-settings.js +26 -8
  171. package/dist/ui/preview.js +3 -2
  172. package/dist/ui/settings-appearance.js +42 -18
  173. package/dist/ui/settings-catalog.js +92 -0
  174. package/dist/ui/settings-dialogs.js +40 -12
  175. package/dist/ui/settings-effects.js +4 -3
  176. package/dist/ui/settings-guests.js +117 -0
  177. package/dist/ui/settings-learn.js +25 -0
  178. package/dist/ui/settings-model.js +15 -6
  179. package/dist/ui/settings-mods.js +23 -9
  180. package/dist/ui/settings-owner-effects.js +9 -9
  181. package/dist/ui/settings-strings.js +120 -42
  182. package/dist/ui/settings-web-authority.js +91 -0
  183. package/dist/ui/shared/agend-auth.js +1 -1
  184. package/dist/ui/shared/app-i18n.js +4 -2
  185. package/dist/ui/shared/app-prefs.js +5 -4
  186. package/dist/ui/shared/app-route.js +1 -1
  187. package/dist/ui/shared/app-session.js +2 -0
  188. package/dist/ui/shared/app-shell.js +75 -9
  189. package/dist/ui/shared/app-store.js +26 -1
  190. package/dist/ui/shared/app-stream.js +3 -1
  191. package/dist/ui/shared/app-themes.js +24 -6
  192. package/dist/ui/shared/app.css +364 -16
  193. package/dist/ui/shared/app.js +21 -14
  194. package/dist/ui/shared/card-strings.js +4 -0
  195. package/dist/ui/shared/effect-app-runtime.js +68 -19
  196. package/dist/ui/shared/effect-chat-runtime.js +16 -3
  197. package/dist/ui/shared/effect-frame.js +26 -7
  198. package/dist/ui/shared/effect-geometry.js +24 -9
  199. package/dist/ui/shared/effect-policy.js +21 -7
  200. package/dist/ui/shared/effect-profiler.js +31 -9
  201. package/dist/ui/shared/effect-registry.js +87 -48
  202. package/dist/ui/shared/effect-stock-snapshot.js +9 -0
  203. package/dist/ui/shared/effect-stock-trust.js +62 -10
  204. package/dist/ui/shared/effect-trial-shadow.js +62 -0
  205. package/dist/ui/shared/effect-trial-source.js +1 -1
  206. package/dist/ui/shared/effect-trial-stage.js +54 -31
  207. package/dist/ui/shared/effect-trial.css +40 -0
  208. package/dist/ui/shared/fx-motion.js +67 -0
  209. package/dist/ui/shared/identity-card.js +75 -4
  210. package/dist/ui/shared/identity-color.js +3 -3
  211. package/dist/ui/shared/instance-nav.js +194 -28
  212. package/dist/ui/shared/panel-view.js +24 -4
  213. package/dist/ui/shared/tokens.css +9 -3
  214. package/dist/ui/shared/ui-icons.js +1 -0
  215. package/dist/ui/shared/usage-dialog.js +22 -2
  216. package/dist/ui/shared/view-strings.js +68 -2
  217. package/dist/ui/shared/web-authorize.js +151 -0
  218. package/dist/ui/signin.html +1 -1
  219. package/dist/ui/web-terminal/terminal.css +4 -4
  220. package/dist/usage/providers.d.ts +28 -0
  221. package/dist/usage/providers.js +126 -36
  222. package/dist/usage/providers.js.map +1 -1
  223. package/dist/usage-report.d.ts +158 -0
  224. package/dist/usage-report.js +226 -0
  225. package/dist/usage-report.js.map +1 -0
  226. package/dist/usage-rollup.d.ts +51 -0
  227. package/dist/usage-rollup.js +168 -0
  228. package/dist/usage-rollup.js.map +1 -0
  229. package/dist/view-api.d.ts +39 -0
  230. package/dist/view-api.js +65 -4
  231. package/dist/view-api.js.map +1 -1
  232. package/dist/web-ambient.d.ts +72 -0
  233. package/dist/web-ambient.js +161 -0
  234. package/dist/web-ambient.js.map +1 -0
  235. package/dist/web-api.d.ts +69 -5
  236. package/dist/web-api.js +362 -45
  237. package/dist/web-api.js.map +1 -1
  238. package/dist/web-appearance-policy.d.ts +4 -6
  239. package/dist/web-appearance-policy.js +5 -12
  240. package/dist/web-appearance-policy.js.map +1 -1
  241. package/dist/web-appearance-tools.d.ts +3 -0
  242. package/dist/web-appearance-tools.js +22 -3
  243. package/dist/web-appearance-tools.js.map +1 -1
  244. package/dist/web-appearance-view.d.ts +27 -2
  245. package/dist/web-appearance-view.js +129 -14
  246. package/dist/web-appearance-view.js.map +1 -1
  247. package/dist/web-appearance.d.ts +17 -3
  248. package/dist/web-appearance.js +82 -7
  249. package/dist/web-appearance.js.map +1 -1
  250. package/dist/web-asset-parts.d.ts +5 -10
  251. package/dist/web-asset-parts.js +3 -3
  252. package/dist/web-asset-parts.js.map +1 -1
  253. package/dist/web-auth.js +3 -1
  254. package/dist/web-auth.js.map +1 -1
  255. package/dist/web-card.d.ts +14 -0
  256. package/dist/web-card.js +40 -6
  257. package/dist/web-card.js.map +1 -1
  258. package/dist/web-channel-echo.d.ts +7 -1
  259. package/dist/web-channel-echo.js +6 -2
  260. package/dist/web-channel-echo.js.map +1 -1
  261. package/dist/web-chat-history.d.ts +46 -0
  262. package/dist/web-chat-history.js +80 -3
  263. package/dist/web-chat-history.js.map +1 -1
  264. package/dist/web-commands.d.ts +1 -0
  265. package/dist/web-effect-bootstrap.d.ts +12 -0
  266. package/dist/web-effect-bootstrap.js +49 -0
  267. package/dist/web-effect-bootstrap.js.map +1 -0
  268. package/dist/web-effect-bundle.js +46 -1
  269. package/dist/web-effect-bundle.js.map +1 -1
  270. package/dist/web-effect-playback.d.ts +30 -0
  271. package/dist/web-effect-playback.js +71 -0
  272. package/dist/web-effect-playback.js.map +1 -0
  273. package/dist/web-effect-profiles.d.ts +4 -4
  274. package/dist/web-effect-service.d.ts +11 -4
  275. package/dist/web-effect-service.js +28 -5
  276. package/dist/web-effect-service.js.map +1 -1
  277. package/dist/web-effect-tools.d.ts +1 -0
  278. package/dist/web-effect-tools.js +8 -5
  279. package/dist/web-effect-tools.js.map +1 -1
  280. package/dist/web-effect-trials.d.ts +4 -4
  281. package/dist/web-effect-trials.js +6 -6
  282. package/dist/web-effect-trials.js.map +1 -1
  283. package/dist/web-effect-upload.d.ts +2 -4
  284. package/dist/web-effect-upload.js +3 -8
  285. package/dist/web-effect-upload.js.map +1 -1
  286. package/dist/web-effect-worker.d.ts +1 -1
  287. package/dist/web-effect-worker.js +2 -2
  288. package/dist/web-effect-worker.js.map +1 -1
  289. package/dist/web-effect.d.ts +14 -0
  290. package/dist/web-effect.js +21 -0
  291. package/dist/web-effect.js.map +1 -1
  292. package/dist/web-guest-access.d.ts +125 -0
  293. package/dist/web-guest-access.js +234 -0
  294. package/dist/web-guest-access.js.map +1 -0
  295. package/dist/web-guest-rooms.d.ts +82 -0
  296. package/dist/web-guest-rooms.js +135 -0
  297. package/dist/web-guest-rooms.js.map +1 -0
  298. package/dist/web-identity-color.d.ts +1 -1
  299. package/dist/web-identity-color.js +2 -2
  300. package/dist/web-identity-color.js.map +1 -1
  301. package/dist/web-identity-palette.d.ts +1 -1
  302. package/dist/web-identity-palette.js +2 -2
  303. package/dist/web-identity-palette.js.map +1 -1
  304. package/dist/web-login.d.ts +47 -0
  305. package/dist/web-login.js +115 -0
  306. package/dist/web-login.js.map +1 -1
  307. package/dist/web-mod-agent.d.ts +1 -1
  308. package/dist/web-mod-agent.js +12 -8
  309. package/dist/web-mod-agent.js.map +1 -1
  310. package/dist/web-mod-bundle.d.ts +14 -1
  311. package/dist/web-mod-bundle.js +68 -3
  312. package/dist/web-mod-bundle.js.map +1 -1
  313. package/dist/web-mod-export.d.ts +9 -0
  314. package/dist/web-mod-export.js +21 -0
  315. package/dist/web-mod-export.js.map +1 -1
  316. package/dist/web-mod-store.d.ts +7 -1
  317. package/dist/web-mod-store.js +21 -7
  318. package/dist/web-mod-store.js.map +1 -1
  319. package/dist/web-prefs.d.ts +14 -0
  320. package/dist/web-prefs.js +24 -4
  321. package/dist/web-prefs.js.map +1 -1
  322. package/dist/web-preview.d.ts +6 -2
  323. package/dist/web-preview.js +4 -2
  324. package/dist/web-preview.js.map +1 -1
  325. package/dist/web-returning-device.d.ts +41 -0
  326. package/dist/web-returning-device.js +57 -5
  327. package/dist/web-returning-device.js.map +1 -1
  328. package/dist/web-session-authorization.d.ts +132 -0
  329. package/dist/web-session-authorization.js +193 -0
  330. package/dist/web-session-authorization.js.map +1 -0
  331. package/dist/web-session.d.ts +70 -10
  332. package/dist/web-session.js +137 -22
  333. package/dist/web-session.js.map +1 -1
  334. package/dist/web-settings-patch.d.ts +49 -2
  335. package/dist/web-settings-patch.js +145 -1
  336. package/dist/web-settings-patch.js.map +1 -1
  337. package/dist/web-settings-tools.d.ts +89 -0
  338. package/dist/web-settings-tools.js +270 -0
  339. package/dist/web-settings-tools.js.map +1 -0
  340. package/dist/web-shell-routes.d.ts +1 -1
  341. package/dist/web-shell-routes.js +1 -1
  342. package/dist/web-shell-routes.js.map +1 -1
  343. package/dist/web-theme-store.d.ts +39 -0
  344. package/dist/web-theme-store.js +122 -11
  345. package/dist/web-theme-store.js.map +1 -1
  346. package/dist/web-theme.d.ts +2 -0
  347. package/dist/web-theme.js +10 -1
  348. package/dist/web-theme.js.map +1 -1
  349. package/dist/workflow-templates/default.md +1 -1
  350. package/package.json +1 -1
  351. package/templates/systemd.service.ejs +8 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * #1920 §3.2: a guest's ClassicBot group or guild rooms — in scope only while its membership is verified.
3
+ *
4
+ * The answers are read in the background (at sign-in, every ten minutes, and when the guest's stream connects) and
5
+ * kept in memory; a request only reads them, never the platform. A room is shown only on a "member" answer at most
6
+ * 15 minutes old; an unknown, failed or stale answer hides it (fail closed).
7
+ *
8
+ * Revocation needs more than "hidden": a scope that becomes empty ends the session, and an answer not read yet (a
9
+ * restart, a room just created) must not end it. A key with no answer is pending for at most the stale window from
10
+ * when it was first wanted; after that, and after a "not a member" answer, it is settled.
11
+ */
12
+ import type { ClassicChannel } from "./classic-channel-manager.js";
13
+ export interface GuestOwner {
14
+ readonly adapterId: string;
15
+ readonly userId: string;
16
+ }
17
+ /** A ClassicBot room a guest may be a member of: a Telegram group or a Discord channel, on the guest's connection. */
18
+ export interface GuestRoom {
19
+ readonly instance: string;
20
+ readonly adapterId: string;
21
+ readonly channelId: string;
22
+ readonly kind: "telegram" | "discord";
23
+ }
24
+ /** The adapter's read: true a member, false not (a definite answer); a rejection or anything else is no answer. */
25
+ export type RoomMemberRead = (room: GuestRoom, userId: string) => Promise<boolean> | undefined;
26
+ export declare const GUEST_ROOM_RECHECK_MS: number;
27
+ export declare const GUEST_ROOM_STALE_MS: number;
28
+ export declare const GUEST_ROOM_FORCE_FLOOR_MS = 60000;
29
+ /** A read a request started (a pending guest polling or retrying): at most one per key in this long, whatever the volume. */
30
+ export declare const GUEST_ROOM_TRIGGER_FLOOR_MS = 30000;
31
+ /** Failed reads back off — a minute, then 2, 4, 8 … — up to ten minutes (a bot without the permission, or removed). */
32
+ export declare const GUEST_ROOM_RETRY_MS = 60000;
33
+ export declare const GUEST_ROOM_RETRY_MAX_MS: number;
34
+ /** Consecutive failures after which a key's failure is persistent: said once (onPersistentFailure), not every attempt. */
35
+ export declare const GUEST_ROOM_PERSISTENT_FAILURES = 3;
36
+ /** The background tick runs this often and reads only what is due. */
37
+ export declare const GUEST_ROOM_TICK_MS = 60000;
38
+ /**
39
+ * The group rooms on this guest's own connection. A Telegram private room (a positive id) is not here: it is the
40
+ * account's own room or someone else's, never a membership question.
41
+ */
42
+ export declare function guestGroupRooms(rooms: readonly ClassicChannel[], owner: GuestOwner): GuestRoom[];
43
+ /** Who reads: the background pass (what is due), a request of a pending guest (rate-limited), a stream connecting. */
44
+ export type GuestRoomReadMode = "scheduled" | "triggered" | "force";
45
+ export declare class GuestRoomMembership {
46
+ private readonly opts;
47
+ private readonly entries;
48
+ private readonly reads;
49
+ constructor(opts: {
50
+ now: () => number;
51
+ read: RoomMemberRead;
52
+ deadlineMs?: number;
53
+ staleMs?: number;
54
+ recheckMs?: number;
55
+ /** A key's reads keep failing (said once, until an answer); and when it answers again after that. */
56
+ onPersistentFailure?: (room: GuestRoom, failures: number) => void;
57
+ onRecovered?: (room: GuestRoom) => void;
58
+ });
59
+ private key;
60
+ private get staleMs();
61
+ /** Shown: a "member" answer no older than the stale window. */
62
+ verified(room: GuestRoom, userId: string): boolean;
63
+ /**
64
+ * Not settled yet: no definite answer, and first wanted less than the stale window ago (or never — a key nobody
65
+ * asked about yet is pending, and starts its window here). A pending room keeps an emptied scope from ending the
66
+ * session; it never shows the room.
67
+ */
68
+ pending(room: GuestRoom, userId: string): boolean;
69
+ /**
70
+ * Read this guest's rooms, one at a time; never rejects. One read per key at a time.
71
+ * - "scheduled": what is due (never asked; ten minutes after an answer; a failure's backoff).
72
+ * - "triggered" (a pending guest's request): the same, and never within 30 s of the key's last read, so a guest that
73
+ * polls or retries is not platform traffic.
74
+ * - "force" (its stream connected): a minute after the key's last read — but a failing key keeps its backoff.
75
+ */
76
+ refresh(owner: GuestOwner, rooms: readonly GuestRoom[], opts?: {
77
+ mode?: GuestRoomReadMode;
78
+ }): Promise<void>;
79
+ private ask;
80
+ private readBounded;
81
+ private put;
82
+ }
@@ -0,0 +1,135 @@
1
+ import { inferClassicChannelType } from "./classic-channel-manager.js";
2
+ export const GUEST_ROOM_RECHECK_MS = 10 * 60_000;
3
+ export const GUEST_ROOM_STALE_MS = 15 * 60_000;
4
+ export const GUEST_ROOM_FORCE_FLOOR_MS = 60_000;
5
+ /** A read a request started (a pending guest polling or retrying): at most one per key in this long, whatever the volume. */
6
+ export const GUEST_ROOM_TRIGGER_FLOOR_MS = 30_000;
7
+ /** Failed reads back off — a minute, then 2, 4, 8 … — up to ten minutes (a bot without the permission, or removed). */
8
+ export const GUEST_ROOM_RETRY_MS = 60_000;
9
+ export const GUEST_ROOM_RETRY_MAX_MS = 10 * 60_000;
10
+ /** Consecutive failures after which a key's failure is persistent: said once (onPersistentFailure), not every attempt. */
11
+ export const GUEST_ROOM_PERSISTENT_FAILURES = 3;
12
+ /** The background tick runs this often and reads only what is due. */
13
+ export const GUEST_ROOM_TICK_MS = 60_000;
14
+ const READ_DEADLINE_MS = 5_000;
15
+ /** The guest caps (4 per account, 64 in all) bound the owners; this bounds a fleet with very many rooms. */
16
+ const MAX_ENTRIES = 8192;
17
+ /**
18
+ * The group rooms on this guest's own connection. A Telegram private room (a positive id) is not here: it is the
19
+ * account's own room or someone else's, never a membership question.
20
+ */
21
+ export function guestGroupRooms(rooms, owner) {
22
+ const out = [];
23
+ for (const room of rooms) {
24
+ if (room.adapterId !== owner.adapterId)
25
+ continue;
26
+ const kind = inferClassicChannelType(room.channelId);
27
+ if (kind === "telegram" && room.channelId.trim().startsWith("-"))
28
+ out.push({ instance: room.instanceName, adapterId: room.adapterId, channelId: room.channelId, kind });
29
+ else if (kind === "discord")
30
+ out.push({ instance: room.instanceName, adapterId: room.adapterId, channelId: room.channelId, kind });
31
+ }
32
+ return out;
33
+ }
34
+ export class GuestRoomMembership {
35
+ opts;
36
+ entries = new Map();
37
+ reads = new Map();
38
+ constructor(opts) {
39
+ this.opts = opts;
40
+ }
41
+ key(room, userId) { return `${room.adapterId}\u0000${room.channelId}\u0000${userId}`; }
42
+ get staleMs() { return this.opts.staleMs ?? GUEST_ROOM_STALE_MS; }
43
+ /** Shown: a "member" answer no older than the stale window. */
44
+ verified(room, userId) {
45
+ const e = this.entries.get(this.key(room, userId));
46
+ return !!e && e.member === true && this.opts.now() - e.at <= this.staleMs;
47
+ }
48
+ /**
49
+ * Not settled yet: no definite answer, and first wanted less than the stale window ago (or never — a key nobody
50
+ * asked about yet is pending, and starts its window here). A pending room keeps an emptied scope from ending the
51
+ * session; it never shows the room.
52
+ */
53
+ pending(room, userId) {
54
+ const k = this.key(room, userId), now = this.opts.now();
55
+ let e = this.entries.get(k);
56
+ if (!e) {
57
+ e = { member: null, at: now, asked: Number.NEGATIVE_INFINITY, due: Number.NEGATIVE_INFINITY, failures: 0, reported: false };
58
+ this.put(k, e);
59
+ }
60
+ return e.member === null && now - e.at < this.staleMs;
61
+ }
62
+ /**
63
+ * Read this guest's rooms, one at a time; never rejects. One read per key at a time.
64
+ * - "scheduled": what is due (never asked; ten minutes after an answer; a failure's backoff).
65
+ * - "triggered" (a pending guest's request): the same, and never within 30 s of the key's last read, so a guest that
66
+ * polls or retries is not platform traffic.
67
+ * - "force" (its stream connected): a minute after the key's last read — but a failing key keeps its backoff.
68
+ */
69
+ async refresh(owner, rooms, opts = {}) {
70
+ const mode = opts.mode ?? "scheduled";
71
+ for (const room of rooms) {
72
+ const k = this.key(room, owner.userId), now = this.opts.now();
73
+ const e = this.entries.get(k);
74
+ // A read in flight is never repeated: a scheduled refresh waits for it; the others skip it (asked just now).
75
+ if (e) {
76
+ const sinceAsked = now - e.asked;
77
+ if (mode === "force" ? sinceAsked < GUEST_ROOM_FORCE_FLOOR_MS || (e.failures > 0 && now < e.due)
78
+ : now < e.due || (mode === "triggered" && sinceAsked < GUEST_ROOM_TRIGGER_FLOOR_MS))
79
+ continue;
80
+ }
81
+ await (this.reads.get(k) ?? this.ask(k, room, owner.userId));
82
+ }
83
+ }
84
+ ask(k, room, userId) {
85
+ const started = this.opts.now();
86
+ const existing = this.entries.get(k);
87
+ const recheck = this.opts.recheckMs ?? GUEST_ROOM_RECHECK_MS;
88
+ const fresh = { member: null, at: started, asked: started, due: started, failures: 0, reported: false };
89
+ this.put(k, existing ? { ...existing, asked: started } : fresh);
90
+ const read = this.readBounded(room, userId).then((member) => {
91
+ const e = this.entries.get(k) ?? fresh;
92
+ const now = this.opts.now();
93
+ if (member === undefined) {
94
+ // A failure leaves the last answer to age (and hide the room when stale), and backs off: 1, 2, 4 … 10 min.
95
+ const failures = e.failures + 1;
96
+ const reported = failures >= GUEST_ROOM_PERSISTENT_FAILURES; // an answer resets both
97
+ this.put(k, { ...e, failures, reported, due: now + Math.min(GUEST_ROOM_RETRY_MAX_MS, GUEST_ROOM_RETRY_MS * 2 ** (failures - 1)) });
98
+ if (reported && !e.reported)
99
+ this.opts.onPersistentFailure?.(room, failures);
100
+ return;
101
+ }
102
+ this.put(k, { member, at: now, asked: e.asked, due: now + recheck, failures: 0, reported: false });
103
+ if (e.reported)
104
+ this.opts.onRecovered?.(room);
105
+ }).finally(() => this.reads.delete(k));
106
+ this.reads.set(k, read);
107
+ return read;
108
+ }
109
+ readBounded(room, userId) {
110
+ return new Promise((resolve) => {
111
+ const timer = setTimeout(() => resolve(undefined), this.opts.deadlineMs ?? READ_DEADLINE_MS);
112
+ timer.unref?.();
113
+ let asked;
114
+ try {
115
+ asked = this.opts.read(room, userId);
116
+ }
117
+ catch {
118
+ asked = undefined;
119
+ }
120
+ if (!asked) {
121
+ clearTimeout(timer);
122
+ resolve(undefined);
123
+ return;
124
+ }
125
+ asked.then((m) => { clearTimeout(timer); resolve(m === true ? true : m === false ? false : undefined); }, () => { clearTimeout(timer); resolve(undefined); });
126
+ });
127
+ }
128
+ put(k, e) {
129
+ this.entries.delete(k); // re-insert: the map's order is its age, for the bound below
130
+ this.entries.set(k, e);
131
+ while (this.entries.size > MAX_ENTRIES)
132
+ this.entries.delete(this.entries.keys().next().value);
133
+ }
134
+ }
135
+ //# sourceMappingURL=web-guest-rooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-guest-rooms.js","sourceRoot":"","sources":["../src/web-guest-rooms.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ export declare function resolveIdentityColor(t: IdentityColorTiers, opts: {
33
33
  color: IdentityColor;
34
34
  source: IdentityColorSource;
35
35
  };
36
- /** Where the colour shows: a person's choice, else the agent's (themes shown), else the host's default, else ring + bar. */
36
+ /** Where the colour shows: a person's choice, else the agent's (themes shown), else the host's default, else all three (DEFAULT_PLACEMENTS). */
37
37
  export declare function resolvePlacements(t: PlacementTiers, opts: {
38
38
  showThemes: boolean;
39
39
  hostDefault?: unknown;
@@ -10,7 +10,7 @@
10
10
  * 3. role — the own bot's colour from its highest coloured Discord role (never a shared bot's);
11
11
  * 4. auto — one of a few soft colours, chosen by a stable hash of the name (two instances may share one).
12
12
  * The placements, likewise: a person's choice for this instance > the agent's (theme.identity.show, while themes are
13
- * shown) > the host's default (web prefs `color.show`, else ring + bar). The host may turn colours off altogether
13
+ * shown) > the host's default (web prefs `color.show`, else name, bar and ring — #2056). The host may turn colours off altogether
14
14
  * (`color.off`): nothing is drawn, and every pick is kept for when they come back.
15
15
  *
16
16
  * A colour is kept and sent as `preset:<id>`, `auto:<id>` (both drawn with their light or dark value, readable on the
@@ -59,7 +59,7 @@ export function resolveIdentityColor(t, opts) {
59
59
  return { color: role, source: "role" };
60
60
  return { color: t.auto, source: "auto" };
61
61
  }
62
- /** Where the colour shows: a person's choice, else the agent's (themes shown), else the host's default, else ring + bar. */
62
+ /** Where the colour shows: a person's choice, else the agent's (themes shown), else the host's default, else all three (DEFAULT_PLACEMENTS). */
63
63
  export function resolvePlacements(t, opts) {
64
64
  const person = canonicalPlacements(t.person);
65
65
  if (person)
@@ -1 +1 @@
1
- {"version":3,"file":"web-identity-color.js","sourceRoot":"","sources":["../src/web-identity-color.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-identity-color.js","sourceRoot":"","sources":["../src/web-identity-color.ts"],"names":[],"mappings":"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"}
@@ -107,7 +107,7 @@ export declare function autoIdentityColor(name: string): IdentityColor;
107
107
  /** Where the colour shows (the user's decision 2): the name, a bar at the row's left edge, the avatar's ring. */
108
108
  export declare const PLACEMENTS: readonly ["name", "bar", "ring"];
109
109
  export type Placement = (typeof PLACEMENTS)[number];
110
- /** The host's default where nobody chose (decision 1): ring and bar. */
110
+ /** The host's default where nobody chose: all three (#2056, the user 2026-10-17; it was ring and bar, #1958 decision 1). */
111
111
  export declare const DEFAULT_PLACEMENTS: readonly Placement[];
112
112
  /** A set of places, in PLACEMENTS order, no repeats; [] is "nowhere". null for anything else. */
113
113
  export declare function canonicalPlacements(v: unknown): Placement[] | null;
@@ -71,8 +71,8 @@ export function autoIdentityColor(name) {
71
71
  }
72
72
  /** Where the colour shows (the user's decision 2): the name, a bar at the row's left edge, the avatar's ring. */
73
73
  export const PLACEMENTS = ["name", "bar", "ring"];
74
- /** The host's default where nobody chose (decision 1): ring and bar. */
75
- export const DEFAULT_PLACEMENTS = ["bar", "ring"];
74
+ /** The host's default where nobody chose: all three (#2056, the user 2026-10-17; it was ring and bar, #1958 decision 1). */
75
+ export const DEFAULT_PLACEMENTS = ["name", "bar", "ring"];
76
76
  /** A set of places, in PLACEMENTS order, no repeats; [] is "nowhere". null for anything else. */
77
77
  export function canonicalPlacements(v) {
78
78
  if (!Array.isArray(v) || v.length > PLACEMENTS.length || !v.every(p => PLACEMENTS.includes(p)))
@@ -1 +1 @@
1
- {"version":3,"file":"web-identity-palette.js","sourceRoot":"","sources":["../src/web-identity-palette.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-identity-palette.js","sourceRoot":"","sources":["../src/web-identity-palette.ts"],"names":[],"mappings":"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"}
@@ -86,3 +86,50 @@ export declare class WebLoginCodes {
86
86
  private activeCode;
87
87
  private recordFailure;
88
88
  }
89
+ /** #1920 step 4: at most this many guest codes outstanding at once; past it a new one is refused, never someone's evicted. */
90
+ export declare const MAX_GUEST_LOGIN_CODES = 32;
91
+ export declare class GuestLoginCodes {
92
+ private readonly outstanding;
93
+ private failures;
94
+ private pausedUntil;
95
+ private readonly now;
96
+ private readonly generate;
97
+ private readonly onEvent;
98
+ constructor(opts?: WebLoginCodesOptions);
99
+ private key;
100
+ /** A code for this account, replacing its own outstanding one; null when MAX_GUEST_LOGIN_CODES others are outstanding. */
101
+ issue(opts: {
102
+ epoch: string;
103
+ recipient: LoginCodeRecipient;
104
+ audiences?: readonly string[];
105
+ }): IssuedLoginCode | null;
106
+ pausedForMs(): number;
107
+ /** This account's code is outstanding. */
108
+ hasCodeFor(r: {
109
+ adapterId: string;
110
+ userId: string;
111
+ }): boolean;
112
+ get size(): number;
113
+ revokeAll(): void;
114
+ /** A guest's own `/web revoke`: its code only. */
115
+ revokeRecipient(r: {
116
+ adapterId: string;
117
+ userId: string;
118
+ }): void;
119
+ revokeIfCurrent(issuanceId: string): void;
120
+ /** A public link closed: its codes no longer work through it (still on the other listeners they were for). */
121
+ revokeAudience(audience: string): void;
122
+ /**
123
+ * The guest code `input` is, spent — or null (no count: the caller asks the admins' codes next, and reports a code
124
+ * neither knows with recordWrong). Every outstanding code is compared, in constant time each. Paused: nothing matches.
125
+ */
126
+ match(input: string, currentEpoch: string, audience?: string): LoginRedeemResult | null;
127
+ /**
128
+ * A code that was neither a guest's nor an admin's: one wrong try against every outstanding guest code, and the
129
+ * breaker. As WebLoginCodes: nothing typed is not a guess, and with no guest code outstanding there is nothing to
130
+ * guess — it counts against nothing (#2093 review: else wrong codes could open this breaker, which pauses the admins'
131
+ * sign-in too, before any code exists). The breaker's history stays across codes.
132
+ */
133
+ recordWrong(input: string): void;
134
+ private prune;
135
+ }
package/dist/web-login.js CHANGED
@@ -135,4 +135,119 @@ export class WebLoginCodes {
135
135
  }
136
136
  }
137
137
  }
138
+ /** #1920 step 4: at most this many guest codes outstanding at once; past it a new one is refused, never someone's evicted. */
139
+ export const MAX_GUEST_LOGIN_CODES = 32;
140
+ export class GuestLoginCodes {
141
+ outstanding = new Map();
142
+ failures = [];
143
+ pausedUntil = 0;
144
+ now;
145
+ generate;
146
+ onEvent;
147
+ constructor(opts = {}) {
148
+ this.now = opts.now ?? Date.now;
149
+ this.generate = opts.generate ?? generateOneTimeCode;
150
+ this.onEvent = opts.onEvent ?? (() => { });
151
+ }
152
+ key(r) { return `${r.adapterId}\u0000${r.userId}`; }
153
+ /** A code for this account, replacing its own outstanding one; null when MAX_GUEST_LOGIN_CODES others are outstanding. */
154
+ issue(opts) {
155
+ this.prune();
156
+ const k = this.key(opts.recipient);
157
+ if (!this.outstanding.has(k) && this.outstanding.size >= MAX_GUEST_LOGIN_CODES)
158
+ return null;
159
+ const code = this.generate();
160
+ const expiresAt = this.now() + LOGIN_CODE_TTL_MS;
161
+ const issuanceId = randomBytes(16).toString("hex");
162
+ const audiences = opts.audiences?.length ? [...opts.audiences] : ["local"];
163
+ this.outstanding.set(k, { code, expiresAt, tier: "guest", epoch: opts.epoch, failures: 0, issuanceId, audience: audiences[0], audiences, recipient: opts.recipient });
164
+ this.onEvent("issued");
165
+ return { display: formatOneTimeCode(code), expiresAt, tier: "guest", issuanceId };
166
+ }
167
+ pausedForMs() { return Math.max(0, this.pausedUntil - this.now()); }
168
+ /** This account's code is outstanding. */
169
+ hasCodeFor(r) { this.prune(); return this.outstanding.has(this.key(r)); }
170
+ get size() { this.prune(); return this.outstanding.size; }
171
+ revokeAll() { this.outstanding.clear(); }
172
+ /** A guest's own `/web revoke`: its code only. */
173
+ revokeRecipient(r) { this.outstanding.delete(this.key(r)); }
174
+ revokeIfCurrent(issuanceId) {
175
+ for (const [k, o] of this.outstanding)
176
+ if (o.issuanceId === issuanceId)
177
+ this.outstanding.delete(k);
178
+ }
179
+ /** A public link closed: its codes no longer work through it (still on the other listeners they were for). */
180
+ revokeAudience(audience) {
181
+ for (const [k, o] of this.outstanding) {
182
+ if (!o.audiences.includes(audience))
183
+ continue;
184
+ const rest = o.audiences.filter(a => a !== audience);
185
+ if (rest.length)
186
+ this.outstanding.set(k, { ...o, audiences: rest, audience: rest[0] });
187
+ else
188
+ this.outstanding.delete(k);
189
+ }
190
+ }
191
+ /**
192
+ * The guest code `input` is, spent — or null (no count: the caller asks the admins' codes next, and reports a code
193
+ * neither knows with recordWrong). Every outstanding code is compared, in constant time each. Paused: nothing matches.
194
+ */
195
+ match(input, currentEpoch, audience = "local") {
196
+ if (this.now() < this.pausedUntil)
197
+ return null;
198
+ const provided = normalizeOneTimeCode(input);
199
+ if (!provided)
200
+ return null;
201
+ this.prune();
202
+ let hit = null;
203
+ for (const entry of this.outstanding) {
204
+ if (entry[1].epoch !== currentEpoch) {
205
+ this.outstanding.delete(entry[0]);
206
+ continue;
207
+ } // the token was rotated
208
+ if (constantTimeMatches(provided, entry[1].code) && entry[1].audiences.includes(audience))
209
+ hit = entry;
210
+ }
211
+ if (!hit)
212
+ return null;
213
+ this.outstanding.delete(hit[0]);
214
+ this.onEvent("spent");
215
+ return { kind: "ok", tier: "guest", recipient: hit[1].recipient };
216
+ }
217
+ /**
218
+ * A code that was neither a guest's nor an admin's: one wrong try against every outstanding guest code, and the
219
+ * breaker. As WebLoginCodes: nothing typed is not a guess, and with no guest code outstanding there is nothing to
220
+ * guess — it counts against nothing (#2093 review: else wrong codes could open this breaker, which pauses the admins'
221
+ * sign-in too, before any code exists). The breaker's history stays across codes.
222
+ */
223
+ recordWrong(input) {
224
+ if (!normalizeOneTimeCode(input))
225
+ return;
226
+ this.prune();
227
+ if (!this.outstanding.size)
228
+ return;
229
+ const now = this.now();
230
+ for (const [k, o] of this.outstanding) {
231
+ o.failures += 1;
232
+ if (o.failures >= MAX_LOGIN_CODE_ATTEMPTS) {
233
+ this.outstanding.delete(k);
234
+ this.onEvent("burned");
235
+ }
236
+ }
237
+ this.failures.push(now);
238
+ const cutoff = now - LOGIN_BREAKER_WINDOW_MS;
239
+ this.failures = this.failures.filter(t => t > cutoff);
240
+ if (this.failures.length >= LOGIN_BREAKER_THRESHOLD) {
241
+ this.pausedUntil = now + LOGIN_BREAKER_PAUSE_MS;
242
+ this.failures = [];
243
+ this.onEvent("breaker-open");
244
+ }
245
+ }
246
+ prune() {
247
+ const now = this.now();
248
+ for (const [k, o] of this.outstanding)
249
+ if (now >= o.expiresAt)
250
+ this.outstanding.delete(k);
251
+ }
252
+ }
138
253
  //# sourceMappingURL=web-login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web-login.js","sourceRoot":"","sources":["../src/web-login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web-login.js","sourceRoot":"","sources":["../src/web-login.ts"],"names":[],"mappings":"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"}
@@ -39,7 +39,7 @@ export declare class AgentMods {
39
39
  /** export_web_mod: the caller's own look, as a bundle file. */
40
40
  private exportMod;
41
41
  private exportPart;
42
- /** Why the caller may not propose now, or null: the fleet switch, a person's lock, the upload limit. */
42
+ /** Why the caller may not propose now, or null: the fleet switch, a person's lock (uploads are not counted: the user's decision). */
43
43
  private refusal;
44
44
  /** propose_web_mod: the bytes the daemon or agend-agent read on the agent's side — whole, or in parts. */
45
45
  private propose;
@@ -18,6 +18,7 @@ import { checkModBundle } from "./web-mod-bundle.js";
18
18
  import { buildModBundle } from "./web-mod-export.js";
19
19
  import { AGENT_WIDGET_SLOTS } from "./web-widget.js";
20
20
  import { canonicalText } from "./web-theme.js";
21
+ import { filesPlayInChat } from "./web-effect.js";
21
22
  /** An exported mod that fits one message is sent whole; a larger one is fetched in parts (as a preview is). */
22
23
  export const MOD_INLINE_BYTES = 600 * 1024;
23
24
  export const MOD_IDLE_MS = 60_000;
@@ -60,7 +61,8 @@ export class AgentMods {
60
61
  const { card, ...look } = rec.theme;
61
62
  let omitted = 0;
62
63
  if (Object.keys(look).length > 1 || rec.placements.effects.length) {
63
- const effects = rec.placements.effects.flatMap(p => { const e = this.deps.readOwnEffect?.(instance, p.id); if (!e) {
64
+ // #2017: an older placement of an effect that doesn't play in chat stays out (a mod can't place it): counted.
65
+ const effects = rec.placements.effects.flatMap(p => { const e = this.deps.readOwnEffect?.(instance, p.id); if (!e || !filesPlayInChat(e.files)) {
64
66
  omitted++;
65
67
  return [];
66
68
  } return [{ name: e.name, files: e.files, params: p.params ?? {} }]; });
@@ -76,9 +78,13 @@ export class AgentMods {
76
78
  if (w && w.by === "agent")
77
79
  (parts.widgets ??= {})[slot] = { spec: w.spec, data: w.data };
78
80
  }
81
+ // #2117: the ambients it set itself (one a person set is theirs).
82
+ const ambient = Object.fromEntries(Object.entries(rec.placements.ambient).flatMap(([k, a]) => a && a.by === "agent" ? [[k, a.spec]] : []));
83
+ if (Object.keys(ambient).length)
84
+ parts.ambient = { specs: ambient, picture: id => { const a = rec.assets.find(x => x.id === id); const b = this.deps.themes.asset(instance, id); return a && b ? { bytes: b.bytes, kind: a.kind } : null; } };
79
85
  const built = buildModBundle({ name: args.name, version: args.version, title }, parts);
80
86
  if (!built.ok)
81
- return { error: built.error, message: built.error === "nothing_to_export" ? "You have no theme, card text or widgets of your own to export." : "A picture your theme names is missing.", ...(omitted ? { effects_omitted: omitted } : {}) };
87
+ return { error: built.error, message: built.error === "nothing_to_export" ? "You have no theme, card text, widgets or ambient effect of your own to export." : "A picture your theme names is missing.", ...(omitted ? { effects_omitted: omitted } : {}) };
82
88
  const data = Buffer.from(built.text, "utf8");
83
89
  const sha256 = createHash("sha256").update(data).digest("hex");
84
90
  const omittedNote = omitted ? { effects_omitted: omitted } : {};
@@ -100,14 +106,13 @@ export class AgentMods {
100
106
  const i = p.index;
101
107
  return { data_b64: b.data.subarray(i * ASSET_PART_BYTES, (i + 1) * ASSET_PART_BYTES).toString("base64") };
102
108
  }
103
- /** Why the caller may not propose now, or null: the fleet switch, a person's lock, the upload limit. */
109
+ /** Why the caller may not propose now, or null: the fleet switch, a person's lock (uploads are not counted: the user's decision). */
104
110
  refusal(instance) {
105
111
  if (!agentAppearanceEditAllowed(this.deps.webConfig()))
106
112
  return { error: "theme_editing_off", message: "Agent theme and effect changes are turned off for this fleet (web.themes.agent_edit: false)." };
107
113
  if (this.deps.themes.get(instance).locked)
108
114
  return { error: "locked", message: "Theme and effects are locked by a person." };
109
- const limit = this.deps.limiter.check(instance, ["upload"]);
110
- return limit.ok ? null : { ...limit, message: `Too many uploads; try again in ${limit.retry_after_s} s.` };
115
+ return null;
111
116
  }
112
117
  /** propose_web_mod: the bytes the daemon or agend-agent read on the agent's side — whole, or in parts. */
113
118
  propose(instance, args, now) {
@@ -191,11 +196,10 @@ export class AgentMods {
191
196
  const w = this.deps.mods.propose(instance, text, checked.mod);
192
197
  if (!w.ok)
193
198
  return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
194
- this.deps.limiter.record(instance, ["upload"]);
195
199
  const m = checked.mod.manifest;
196
- this.deps.notice(instance, `Proposed a mod: ${m.title} (${m.name} ${m.version}). A person can review it in Settings → Appearance → Mods.`);
200
+ this.deps.notice(instance, `Proposed a mod: ${m.title} (${m.name} ${m.version}). A person can review it in Settings → Web appearance → Mods.`);
197
201
  this.deps.changed();
198
- return { proposed: { id: checked.mod.id, name: m.name, version: m.version, title: m.title, bytes: checked.mod.bytes }, message: "A person reviews it in Settings → Appearance → Mods; nothing changes until they install it." };
202
+ return { proposed: { id: checked.mod.id, name: m.name, version: m.version, title: m.title, bytes: checked.mod.bytes }, message: "A person reviews it in Settings → Web appearance → Mods; nothing changes until they install it." };
199
203
  }
200
204
  /** An instance was removed. */
201
205
  forget(instance) { this.built.delete(instance); this.uploads.delete(instance); }