@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
package/dist/daemon.d.ts CHANGED
@@ -233,6 +233,12 @@ export declare class PendingWorkTracker {
233
233
  }
234
234
  /** #1690: after AgEnD's own `/model`, how long the pane is read for claude's "Switch model?" or its result. */
235
235
  export declare const OWN_SWITCH_WAIT_MS = 6000;
236
+ /** Admission and revalidation for pausing one exhausted recovery episode. */
237
+ export interface CapacityNudgePauseGuard {
238
+ current(): boolean;
239
+ accepts(pane: string): boolean;
240
+ revalidate(): Promise<boolean>;
241
+ }
236
242
  /** #1690: what AgEnD's own runtime switch came to — sent back to the fleet (IPC runtime_switch_result). */
237
243
  export type OwnSwitchOutcome = {
238
244
  outcome: "switched";
@@ -772,6 +778,8 @@ export declare class Daemon extends EventEmitter {
772
778
  private pendingInstructionsNotice;
773
779
  /** #1633: the one-time "what's new for you" notice, pasted before the next real delivery; recorded once pasted. */
774
780
  private pendingWhatsNew;
781
+ /** #2140: deliveries tried for the pending what's-new notice that never reached the pane (capped: never before every message). */
782
+ private whatsNewUnwritten;
775
783
  private warmupNeeded;
776
784
  private lastBuiltInstructions;
777
785
  private pasteQueueDepth;
@@ -836,6 +844,7 @@ export declare class Daemon extends EventEmitter {
836
844
  private windowQueryFailureTicks;
837
845
  private mcpRestartPending;
838
846
  private mcpRestartStaleTimer;
847
+ private mcpRestartCooldownTimer;
839
848
  /** In-flight replacement grace; also the guard against three triggers stacking. */
840
849
  private mcpRestartGraceTimer;
841
850
  /**
@@ -1062,6 +1071,8 @@ export declare class Daemon extends EventEmitter {
1062
1071
  * force-restarted: see that constant for why staying mute costs more.
1063
1072
  */
1064
1073
  private armMcpRestartWhenIdle;
1074
+ /** Keep a cooldown-suppressed revival alive without bypassing the idle gate. */
1075
+ deferMcpRestart(delayMs: number): void;
1065
1076
  /**
1066
1077
  * Single chokepoint for all three revival triggers (already_idle, idle_edge,
1067
1078
  * stale_timeout) — and therefore the one place worth re-checking reality.
@@ -1322,7 +1333,7 @@ export declare class Daemon extends EventEmitter {
1322
1333
  private static readonly AUTH_RECONFIRM_ROWS;
1323
1334
  /** Why the deferred pause was requested; what its marker records (Phase 2a). */
1324
1335
  private pendingPauseReason;
1325
- pause(reason?: PauseReason): Promise<void>;
1336
+ pause(reason?: PauseReason, admission?: CapacityNudgePauseGuard): Promise<void>;
1326
1337
  /** Respawn the CLI in the preserved window and block until its prompt is ready. */
1327
1338
  wake(timeoutMs?: number): Promise<void>;
1328
1339
  /** A reset baseline must settle before a launch admits new work. */
@@ -1673,6 +1684,13 @@ export declare class Daemon extends EventEmitter {
1673
1684
  * and only if nothing has changed by then — see {@link tickCapacityNudge}. Returns false when there is nothing to arm.
1674
1685
  */
1675
1686
  armCapacityNudge(pattern: RegExp, delayMs: number): boolean;
1687
+ /**
1688
+ * Consume an exhausted nudge only if its failed turn still owns an empty,
1689
+ * idle pane. Unlike arming, this verifies all input/work gates before pause.
1690
+ * The returned owner survives pause's own monitor freeze (which advances the
1691
+ * launch fence), but never another spawn/launch, cancel, delivery or episode.
1692
+ */
1693
+ prepareCapacityNudgePause(): Promise<CapacityNudgePauseGuard | null>;
1676
1694
  /** Drop an armed nudge (the user stopped / paused the instance, or the lifecycle gave up on it). */
1677
1695
  cancelCapacityNudge(reason: string): void;
1678
1696
  /** The first live composer of a spawn fixes what is history (see {@link nudgeBaselines}). */
@@ -2288,6 +2306,11 @@ export declare class Daemon extends EventEmitter {
2288
2306
  * entries recorded meanwhile are dropped from it; none left → nothing.
2289
2307
  */
2290
2308
  private currentWhatsNew;
2309
+ /**
2310
+ * #2163: who this instance is to the what's-new notices — a ClassicBot room's agent, General, or a fleet worker (with
2311
+ * `coordinator` too when its tool set is coordinator or full, the ones that carry get_/set_web_settings).
2312
+ */
2313
+ private whatsNewRoles;
2291
2314
  /** #1633: what this instance has not been told about its AgEnD version yet (see agent-whats-new.ts). */
2292
2315
  private prepareWhatsNew;
2293
2316
  private trySpawnInsideGate;
package/dist/daemon.js CHANGED
@@ -56,6 +56,8 @@ import { codexLiveRowMatches } from "./backend/codex.js";
56
56
  import { claudeConfigDirFor, claudeProfileConfigDir, claudeSwitchDialog, claudeSwitchTargetMatches } from "./backend/claude-code.js";
57
57
  import { InteractionObservation, INTERACTION_CONFIRM_MS, sameInteractionOwner } from "./interaction-observation.js";
58
58
  import { unrecognisedPromptShape } from "./unrecognised-prompt.js";
59
+ /** #2140: deliveries that may carry an unwritten what's-new notice before it is recorded anyway. */
60
+ const WHATS_NEW_MAX_UNWRITTEN = 3;
59
61
  const __filename = fileURLToPath(import.meta.url);
60
62
  const __dirname = dirname(__filename);
61
63
  // Tool routing sets — module-level to avoid re-creation on every handleToolCall
@@ -67,6 +69,8 @@ const WEB_THEME_IPC = Object.freeze({
67
69
  get_web_appearance: "fleet_get_web_appearance", preview_web_appearance: "fleet_preview_web_appearance",
68
70
  // r4-4: its own declarative widgets.
69
71
  set_web_widget: "fleet_set_web_widget", remove_web_widget: "fleet_remove_web_widget",
72
+ // #2117: its own declarative ambient.
73
+ set_web_ambient: "fleet_set_web_ambient", clear_web_ambient: "fleet_clear_web_ambient",
70
74
  // r4-5b: mods — an export's file is written here, a proposal's file read here (on the agent's side).
71
75
  export_web_mod: "fleet_export_web_mod", propose_web_mod: "fleet_propose_web_mod",
72
76
  upload_web_effect: "fleet_upload_web_effect",
@@ -1490,6 +1494,8 @@ export class Daemon extends EventEmitter {
1490
1494
  pendingInstructionsNotice = false;
1491
1495
  /** #1633: the one-time "what's new for you" notice, pasted before the next real delivery; recorded once pasted. */
1492
1496
  pendingWhatsNew = null;
1497
+ /** #2140: deliveries tried for the pending what's-new notice that never reached the pane (capped: never before every message). */
1498
+ whatsNewUnwritten = 0;
1493
1499
  // Whether the warmup steering-reload notice should be injected after spawn.
1494
1500
  // Set in trySpawn by comparing the freshly-built instructions against the
1495
1501
  // last value the agent was told about (prev-instructions). Skipped when
@@ -1559,6 +1565,7 @@ export class Daemon extends EventEmitter {
1559
1565
  windowQueryFailureTicks = 0;
1560
1566
  mcpRestartPending = false;
1561
1567
  mcpRestartStaleTimer = null;
1568
+ mcpRestartCooldownTimer = null;
1562
1569
  /** In-flight replacement grace; also the guard against three triggers stacking. */
1563
1570
  mcpRestartGraceTimer = null;
1564
1571
  /**
@@ -2577,6 +2584,24 @@ export class Daemon extends EventEmitter {
2577
2584
  this.fireMcpRestartRequest("already_idle");
2578
2585
  }
2579
2586
  }
2587
+ /** Keep a cooldown-suppressed revival alive without bypassing the idle gate. */
2588
+ deferMcpRestart(delayMs) {
2589
+ this.clearMcpRestartRequest();
2590
+ if (this.config.mcp_auto_restart === false || this.authFailureUnresolved
2591
+ || this.mcpRestartCancelledByRecovery("cooldown"))
2592
+ return;
2593
+ this.mcpRestartPending = true;
2594
+ this.mcpRestartCooldownTimer = setTimeout(() => {
2595
+ this.mcpRestartCooldownTimer = null;
2596
+ if (this.mcpRestartCancelledByRecovery("cooldown_expired"))
2597
+ return;
2598
+ this.clearMcpRestartRequest();
2599
+ if (this.config.mcp_auto_restart === false || this.authFailureUnresolved || this.mcpServerAlive().alive)
2600
+ return;
2601
+ this.armMcpRestartWhenIdle();
2602
+ }, Math.max(0, delayMs));
2603
+ this.mcpRestartCooldownTimer.unref?.();
2604
+ }
2580
2605
  /**
2581
2606
  * Single chokepoint for all three revival triggers (already_idle, idle_edge,
2582
2607
  * stale_timeout) — and therefore the one place worth re-checking reality.
@@ -2594,6 +2619,8 @@ export class Daemon extends EventEmitter {
2594
2619
  fireMcpRestartRequest(trigger) {
2595
2620
  if (this.mcpRestartCancelledByRecovery(trigger))
2596
2621
  return;
2622
+ if (this.mcpRestartCooldownTimer)
2623
+ return;
2597
2624
  // Authoritative re-read — the CLI may have replaced the server since the
2598
2625
  // health tick that armed this.
2599
2626
  if (this.mcpServerAlive().alive) {
@@ -2788,6 +2815,10 @@ export class Daemon extends EventEmitter {
2788
2815
  }
2789
2816
  clearMcpRestartRequest() {
2790
2817
  this.mcpRestartPending = false;
2818
+ if (this.mcpRestartCooldownTimer) {
2819
+ clearTimeout(this.mcpRestartCooldownTimer);
2820
+ this.mcpRestartCooldownTimer = null;
2821
+ }
2791
2822
  if (this.mcpRestartStaleTimer) {
2792
2823
  clearTimeout(this.mcpRestartStaleTimer);
2793
2824
  this.mcpRestartStaleTimer = null;
@@ -3645,6 +3676,17 @@ export class Daemon extends EventEmitter {
3645
3676
  const key = Daemon.errorPatternKey(ep);
3646
3677
  const count = countMatches(ep.pattern);
3647
3678
  const seen = this.lastErrorCount.get(key) ?? 0;
3679
+ // #2282: a resumed exhausted429 row is history, not even a new
3680
+ // notification/failover incident. Wait for the first live composer to
3681
+ // establish its baseline; later appended occurrences remain eligible.
3682
+ if (ep.type === "rate_limit" && ep.action === "nudge_continue") {
3683
+ const baseline = this.nudgeBaselines?.get(key);
3684
+ if (baseline === undefined || count <= baseline) {
3685
+ if (baseline !== undefined)
3686
+ this.lastErrorCount.set(key, count);
3687
+ continue;
3688
+ }
3689
+ }
3648
3690
  // The generic Codex usage-limit line remains in scrollback after the
3649
3691
  // user selects Luna Reserve. What proves that is NOT a live composer —
3650
3692
  // codex paints one after a plain hit too, and the old live-composer guard
@@ -4671,7 +4713,9 @@ export class Daemon extends EventEmitter {
4671
4713
  static AUTH_RECONFIRM_ROWS = 15;
4672
4714
  /** Why the deferred pause was requested; what its marker records (Phase 2a). */
4673
4715
  pendingPauseReason = "auth";
4674
- async pause(reason = "operator") {
4716
+ async pause(reason = "operator", admission) {
4717
+ if (admission && !admission.current())
4718
+ return;
4675
4719
  if (this.pauseWakeState === "paused")
4676
4720
  return;
4677
4721
  if (this.pauseWakeState === "pausing" || this.pauseWakeState === "waking") {
@@ -4679,6 +4723,8 @@ export class Daemon extends EventEmitter {
4679
4723
  if (this.getPauseWakeState() !== "active")
4680
4724
  return;
4681
4725
  }
4726
+ if (admission && !admission.current())
4727
+ return;
4682
4728
  // `pauseAllowStuck` is consumed here, not merely read: it authorises exactly
4683
4729
  // one pause from a stuck pane (the auth-deferred one) and must never leak
4684
4730
  // into an ordinary idle-timeout pause of a busy instance.
@@ -4698,7 +4744,7 @@ export class Daemon extends EventEmitter {
4698
4744
  // this cycle while the backend reports background work; the next idle
4699
4745
  // tick retries once the task ends. A pane-capture failure proceeds (the
4700
4746
  // quit-menu handler below stays the backstop), never wedges unpaused.
4701
- if (this.backend?.backgroundWorkRunning && this.tmux) {
4747
+ if ((admission || this.backend?.backgroundWorkRunning) && this.tmux) {
4702
4748
  const tmux = this.tmux;
4703
4749
  const windowId = tmux.getWindowId?.();
4704
4750
  const generation = this.spawnGeneration;
@@ -4710,7 +4756,8 @@ export class Daemon extends EventEmitter {
4710
4756
  // #1730 P2-2: the await yields — the pane read is only valid for the
4711
4757
  // world it was taken from. Revalidate owner, phase, state and queue
4712
4758
  // before acting on it; anything that moved defers this cycle.
4713
- if (this.tmux !== tmux
4759
+ if ((admission && (!admission.current() || pane === null || !admission.accepts(pane)))
4760
+ || this.tmux !== tmux
4714
4761
  || this.tmux?.getWindowId?.() !== windowId
4715
4762
  || this.spawnGeneration !== generation
4716
4763
  || this.getPauseWakeState() !== "active"
@@ -6347,6 +6394,10 @@ export class Daemon extends EventEmitter {
6347
6394
  this.config.cross_instance_visibility = update.cross_instance_visibility;
6348
6395
  else if (update.cross_instance_visibility === null)
6349
6396
  delete this.config.cross_instance_visibility;
6397
+ if (Number.isInteger(update.board_cards_at_once) && update.board_cards_at_once >= 1)
6398
+ this.config.board_cards_at_once = update.board_cards_at_once;
6399
+ else if (update.board_cards_at_once === null)
6400
+ delete this.config.board_cards_at_once;
6350
6401
  if (["trace", "debug", "info", "warn", "error"].includes(String(update.log_level))) {
6351
6402
  const level = update.log_level;
6352
6403
  if (this.config.log_level !== level) {
@@ -6794,15 +6845,30 @@ export class Daemon extends EventEmitter {
6794
6845
  const whatsNew = this.pendingWhatsNew ? this.currentWhatsNew(this.pendingWhatsNew) : null;
6795
6846
  if (whatsNew) {
6796
6847
  // #1633: here, inside the delivery lock and ahead of a real delivery — never into a busy turn, never to an
6797
- // instance nobody writes to. Recorded only once pasted: a failed or cancelled paste stays pending.
6798
- const pasted = await this.deliverMessage(whatsNew.notice, undefined, { deliveryEpoch });
6799
- if (pasted && this.pendingWhatsNew === whatsNew) {
6800
- this.pendingWhatsNew = null;
6801
- try {
6802
- recordWhatsNew(this.instanceDir, whatsNew.ids, whatsNew.version);
6803
- }
6804
- catch (err) {
6805
- this.logger.warn({ err }, "what's-new record not written — the notice may repeat once");
6848
+ // instance nobody writes to. #2140: told at most once. Once its paste reached the pane it is recorded, proven
6849
+ // submitted or not. A system paste has no unique id: its only pane proof is its opening line on the screen, and
6850
+ // a long notice (every entry since an old session began) scrolls that line above the captured rows once Claude
6851
+ // paints it — unproven, though the agent read it. One that never reached the pane (cancelled, never idle) is
6852
+ // tried again, at most WHATS_NEW_MAX_UNWRITTEN times, then recorded with a warning.
6853
+ const attempt = { reached: false };
6854
+ const pasted = await this.deliverMessage(whatsNew.notice, undefined, { deliveryEpoch, verdict: attempt });
6855
+ if (this.pendingWhatsNew === whatsNew) {
6856
+ const written = pasted || attempt.paneWriteStarted === true;
6857
+ if (!written)
6858
+ this.whatsNewUnwritten++;
6859
+ if (written || this.whatsNewUnwritten >= WHATS_NEW_MAX_UNWRITTEN) {
6860
+ if (!pasted) {
6861
+ this.logger.warn({ entries: whatsNew.ids, written, attempts: this.whatsNewUnwritten, phase: attempt.phase, proof: attempt.proof }, written ? "what's-new notice pasted but its submission could not be proven — recorded so it is not sent again"
6862
+ : "what's-new notice did not reach the pane after several deliveries — recorded so it is not sent again");
6863
+ }
6864
+ this.pendingWhatsNew = null;
6865
+ this.whatsNewUnwritten = 0;
6866
+ try {
6867
+ recordWhatsNew(this.instanceDir, whatsNew.ids, whatsNew.version);
6868
+ }
6869
+ catch (err) {
6870
+ this.logger.warn({ err }, "what's-new record not written — the notice may repeat once");
6871
+ }
6806
6872
  }
6807
6873
  }
6808
6874
  if (!this.isDeliveryEpochCurrent(deliveryEpoch))
@@ -7591,6 +7657,46 @@ export class Daemon extends EventEmitter {
7591
7657
  this.logger.info({ delayMs }, "Model-capacity nudge armed");
7592
7658
  return true;
7593
7659
  }
7660
+ /**
7661
+ * Consume an exhausted nudge only if its failed turn still owns an empty,
7662
+ * idle pane. Unlike arming, this verifies all input/work gates before pause.
7663
+ * The returned owner survives pause's own monitor freeze (which advances the
7664
+ * launch fence), but never another spawn/launch, cancel, delivery or episode.
7665
+ */
7666
+ async prepareCapacityNudgePause() {
7667
+ const nudge = this.capacityNudge, episode = this.lastErrorEpisode;
7668
+ const tmux = this.tmux, attempt = this.launchAttempt, boot = this.bootId;
7669
+ this.cancelCapacityNudge("retries exhausted");
7670
+ if (!nudge || !episode || !tmux)
7671
+ return null;
7672
+ const window = tmux.getWindowId?.();
7673
+ const current = () => this.tmux === tmux && tmux.getWindowId?.() === window
7674
+ && boot === this.bootId && nudge.spawn === this.spawnGeneration && attempt === this.launchAttempt
7675
+ && episode === this.lastErrorEpisode && this.isDeliveryEpochCurrent(nudge.epoch)
7676
+ && !this.startupAborted && !this.spawning && !this.isPaused
7677
+ && this.getProcessStatus() === "running" && this.instanceState === "idle" && this.pasteQueueDepth === 0;
7678
+ const accepts = (pane) => pane === nudge.pane && this.paneAuthoritativelyIdle(pane)
7679
+ && this.backend?.isPeriodicRedrawIdlePane?.(pane) === true
7680
+ && codexLiveRowMatches(pane, nudge.pattern) && !this.backend?.backgroundWorkRunning?.(pane);
7681
+ const revalidate = () => this.paneWriteLock.run(async () => {
7682
+ if (!current())
7683
+ return false;
7684
+ try {
7685
+ const pane = await tmux.capturePane();
7686
+ return current() && accepts(pane);
7687
+ }
7688
+ catch {
7689
+ return false;
7690
+ }
7691
+ });
7692
+ // Initial admission must also respect the captured monitor fence. Later
7693
+ // revalidation deliberately tolerates only pause's own fence advancement.
7694
+ if (nudge.fence !== this.launchFenceEpoch || this.healthCheckPaused || this.runtimeMonitorsFrozen)
7695
+ return null;
7696
+ if (!await revalidate() || nudge.fence !== this.launchFenceEpoch || this.healthCheckPaused || this.runtimeMonitorsFrozen)
7697
+ return null;
7698
+ return { current, accepts, revalidate };
7699
+ }
7594
7700
  /** Drop an armed nudge (the user stopped / paused the instance, or the lifecycle gave up on it). */
7595
7701
  cancelCapacityNudge(reason) {
7596
7702
  if (!this.capacityNudge)
@@ -10014,7 +10120,7 @@ export class Daemon extends EventEmitter {
10014
10120
  reply(got, undefined);
10015
10121
  return;
10016
10122
  }
10017
- const written = await writePreview(got.files, { workspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10123
+ const written = await writePreview(got.files, { workspace: this.config.working_directory, configuredWorkspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10018
10124
  if ("error" in written) {
10019
10125
  reply(null, `preview_web_appearance: ${written.error}`);
10020
10126
  return;
@@ -10047,7 +10153,7 @@ export class Daemon extends EventEmitter {
10047
10153
  reply(got, undefined);
10048
10154
  return;
10049
10155
  }
10050
- const written = await writeModFile(got.files, { workspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10156
+ const written = await writeModFile(got.files, { workspace: this.config.working_directory, configuredWorkspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10051
10157
  if ("error" in written) {
10052
10158
  reply(null, `export_web_mod: ${written.error}`);
10053
10159
  return;
@@ -10056,7 +10162,7 @@ export class Daemon extends EventEmitter {
10056
10162
  return;
10057
10163
  }
10058
10164
  if (tool === "propose_web_mod") {
10059
- const read = await readAgentFile(args.file, { workspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name, maxBytes: MOD_UPLOAD_MAX_BYTES });
10165
+ const read = await readAgentFile(args.file, { workspace: this.config.working_directory, configuredWorkspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name, maxBytes: MOD_UPLOAD_MAX_BYTES });
10060
10166
  const named = typeof args.file === "string" ? args.file.slice(0, 200) : "the file argument";
10061
10167
  if (!read.ok) {
10062
10168
  reply(null, `propose_web_mod: ${named} — ${read.reason}`);
@@ -10081,7 +10187,7 @@ export class Daemon extends EventEmitter {
10081
10187
  reply(null, "upload_web_effect: launch no longer current");
10082
10188
  return;
10083
10189
  }
10084
- const read = await readAgentEffect(args.dir, { workspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10190
+ const read = await readAgentEffect(args.dir, { workspace: this.config.working_directory, configuredWorkspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name });
10085
10191
  if (!current()) {
10086
10192
  reply(null, "upload_web_effect: launch no longer current");
10087
10193
  return;
@@ -10111,7 +10217,7 @@ export class Daemon extends EventEmitter {
10111
10217
  reply(r.result, r.error);
10112
10218
  return;
10113
10219
  }
10114
- const read = await readAgentFile(args.file, { workspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name, maxBytes: WEB_THEME_ASSET_MAX_BYTES });
10220
+ const read = await readAgentFile(args.file, { workspace: this.config.working_directory, configuredWorkspace: this.config.working_directory, stateDir: getAgendHome(), instance: this.name, maxBytes: WEB_THEME_ASSET_MAX_BYTES });
10115
10221
  // The path as the agent gave it — only a string is shown (an object from raw JSON args is never coerced).
10116
10222
  const named = typeof args.file === "string" ? args.file.slice(0, 200) : "the file argument";
10117
10223
  if (!read.ok) {
@@ -11385,14 +11491,39 @@ export class Daemon extends EventEmitter {
11385
11491
  }
11386
11492
  if (ids.length === pending.ids.length)
11387
11493
  return pending;
11388
- const narrowed = { notice: whatsNewNotice(pending.version, AGENT_WHATS_NEW.filter(e => ids.includes(e.id))), ids, version: pending.version };
11494
+ // #2163: rebuilt as planned — only the entries this instance's roles are told; the rest are recorded with them.
11495
+ const roles = this.whatsNewRoles();
11496
+ const shown = AGENT_WHATS_NEW.filter(e => ids.includes(e.id) && (!e.audience || e.audience.some(r => roles.includes(r))));
11497
+ if (!shown.length) {
11498
+ this.pendingWhatsNew = null;
11499
+ try {
11500
+ recordWhatsNew(this.instanceDir, ids, pending.version);
11501
+ }
11502
+ catch (err) {
11503
+ this.logger.warn({ err }, "what's-new record not written — the notice may repeat once");
11504
+ }
11505
+ return null;
11506
+ }
11507
+ const narrowed = { notice: whatsNewNotice(pending.version, shown), ids, version: pending.version };
11389
11508
  this.pendingWhatsNew = narrowed;
11390
11509
  return narrowed;
11391
11510
  }
11511
+ /**
11512
+ * #2163: who this instance is to the what's-new notices — a ClassicBot room's agent, General, or a fleet worker (with
11513
+ * `coordinator` too when its tool set is coordinator or full, the ones that carry get_/set_web_settings).
11514
+ */
11515
+ whatsNewRoles() {
11516
+ if (this.runtimeIdentity?.kind === "classic")
11517
+ return ["classic"];
11518
+ if (this.config.general_topic === true || this.name === "general")
11519
+ return ["general"];
11520
+ const set = resolveToolSet(this.config, this.name);
11521
+ return set === "coordinator" || set === "full" ? ["worker", "coordinator"] : ["worker"];
11522
+ }
11392
11523
  /** #1633: what this instance has not been told about its AgEnD version yet (see agent-whats-new.ts). */
11393
11524
  prepareWhatsNew(fresh, version = agendVersion()) {
11394
11525
  try {
11395
- const plan = planWhatsNew({ record: readWhatsNewRecord(this.instanceDir), fresh, version });
11526
+ const plan = planWhatsNew({ record: readWhatsNewRecord(this.instanceDir), fresh, version, roles: this.whatsNewRoles() });
11396
11527
  if (!plan) {
11397
11528
  this.pendingWhatsNew = null;
11398
11529
  return;
@@ -11403,6 +11534,7 @@ export class Daemon extends EventEmitter {
11403
11534
  return;
11404
11535
  }
11405
11536
  this.pendingWhatsNew = plan;
11537
+ this.whatsNewUnwritten = 0;
11406
11538
  this.logger.info({ entries: plan.ids }, "what's-new notice pending for the next delivery");
11407
11539
  }
11408
11540
  catch (err) {