@songsid/agend 2.3.2 → 2.3.3-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 (393) hide show
  1. package/dist/agent-cli-instructions.md +2 -2
  2. package/dist/agent-cli.js +13 -112
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.d.ts +0 -1
  5. package/dist/agent-endpoint.js +1 -9
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-whats-new.d.ts +23 -5
  8. package/dist/agent-whats-new.js +58 -40
  9. package/dist/agent-whats-new.js.map +1 -1
  10. package/dist/auth-api.d.ts +0 -7
  11. package/dist/auth-api.js +1 -15
  12. package/dist/auth-api.js.map +1 -1
  13. package/dist/authority/authority-state.js +1 -1
  14. package/dist/authority/authority-state.js.map +1 -1
  15. package/dist/authority/web-authority.d.ts +9 -4
  16. package/dist/authority/web-authority.js +10 -5
  17. package/dist/authority/web-authority.js.map +1 -1
  18. package/dist/backend/antigravity.js +6 -1
  19. package/dist/backend/antigravity.js.map +1 -1
  20. package/dist/backend/claude-code.d.ts +20 -1
  21. package/dist/backend/claude-code.js +54 -29
  22. package/dist/backend/claude-code.js.map +1 -1
  23. package/dist/backend/claude-transcript-errors.d.ts +18 -0
  24. package/dist/backend/claude-transcript-errors.js +19 -0
  25. package/dist/backend/claude-transcript-errors.js.map +1 -0
  26. package/dist/backend/codex-session-lookup.d.ts +16 -3
  27. package/dist/backend/codex-session-lookup.js +45 -11
  28. package/dist/backend/codex-session-lookup.js.map +1 -1
  29. package/dist/backend/codex.d.ts +16 -0
  30. package/dist/backend/codex.js +184 -35
  31. package/dist/backend/codex.js.map +1 -1
  32. package/dist/backend/grok.js +58 -12
  33. package/dist/backend/grok.js.map +1 -1
  34. package/dist/backend/kiro-reconcile-store.js +8 -1
  35. package/dist/backend/kiro-reconcile-store.js.map +1 -1
  36. package/dist/backend/kiro.d.ts +0 -5
  37. package/dist/backend/kiro.js +2 -10
  38. package/dist/backend/kiro.js.map +1 -1
  39. package/dist/backend/muse.js +2 -1
  40. package/dist/backend/muse.js.map +1 -1
  41. package/dist/backend/types.d.ts +53 -4
  42. package/dist/backend/types.js.map +1 -1
  43. package/dist/bundled-skills.d.ts +4 -6
  44. package/dist/bundled-skills.js +10 -14
  45. package/dist/bundled-skills.js.map +1 -1
  46. package/dist/channel/adapters/discord.js +60 -17
  47. package/dist/channel/adapters/discord.js.map +1 -1
  48. package/dist/channel/mcp-server.js +5 -5
  49. package/dist/channel/mcp-server.js.map +1 -1
  50. package/dist/channel/mcp-tools.d.ts +1 -3
  51. package/dist/channel/mcp-tools.js +4 -58
  52. package/dist/channel/mcp-tools.js.map +1 -1
  53. package/dist/classic-channel-manager.d.ts +4 -1
  54. package/dist/classic-channel-manager.js +21 -7
  55. package/dist/classic-channel-manager.js.map +1 -1
  56. package/dist/cli.js +23 -6
  57. package/dist/cli.js.map +1 -1
  58. package/dist/config-history.d.ts +50 -0
  59. package/dist/config-history.js +263 -0
  60. package/dist/config-history.js.map +1 -0
  61. package/dist/config-validator.js +10 -8
  62. package/dist/config-validator.js.map +1 -1
  63. package/dist/config.d.ts +3 -0
  64. package/dist/config.js +11 -4
  65. package/dist/config.js.map +1 -1
  66. package/dist/cross-instance-envelope.d.ts +10 -5
  67. package/dist/cross-instance-envelope.js +20 -17
  68. package/dist/cross-instance-envelope.js.map +1 -1
  69. package/dist/daemon.d.ts +130 -64
  70. package/dist/daemon.js +603 -428
  71. package/dist/daemon.js.map +1 -1
  72. package/dist/daily-summary.d.ts +8 -1
  73. package/dist/daily-summary.js +8 -5
  74. package/dist/daily-summary.js.map +1 -1
  75. package/dist/dashboard-live.d.ts +1 -1
  76. package/dist/dashboard-live.js +3 -3
  77. package/dist/dashboard-live.js.map +1 -1
  78. package/dist/dashboard-permissions.d.ts +1 -1
  79. package/dist/dashboard-permissions.js +1 -3
  80. package/dist/dashboard-permissions.js.map +1 -1
  81. package/dist/delivery-outbox.d.ts +31 -22
  82. package/dist/delivery-outbox.js +119 -161
  83. package/dist/delivery-outbox.js.map +1 -1
  84. package/dist/delivery-outbox.test.js +10 -25
  85. package/dist/delivery-outbox.test.js.map +1 -1
  86. package/dist/doctor.d.ts +4 -0
  87. package/dist/doctor.js +16 -1
  88. package/dist/doctor.js.map +1 -1
  89. package/dist/fleet-level-config.js +1 -1
  90. package/dist/fleet-level-config.js.map +1 -1
  91. package/dist/fleet-manager.d.ts +74 -66
  92. package/dist/fleet-manager.js +285 -414
  93. package/dist/fleet-manager.js.map +1 -1
  94. package/dist/fleet-process-handlers.d.ts +5 -0
  95. package/dist/fleet-process-handlers.js +21 -0
  96. package/dist/fleet-process-handlers.js.map +1 -1
  97. package/dist/fleet-service-owner.d.ts +11 -0
  98. package/dist/fleet-service-owner.js +3 -0
  99. package/dist/fleet-service-owner.js.map +1 -0
  100. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +11 -1
  101. package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +1 -1
  102. package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
  103. package/dist/general-knowledge/skills/session-management/SKILL.md +7 -1
  104. package/dist/general-knowledge/skills/web-appearance/SKILL.md +13 -204
  105. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +30 -68
  106. package/dist/instance-lifecycle.d.ts +19 -0
  107. package/dist/instance-lifecycle.js +73 -15
  108. package/dist/instance-lifecycle.js.map +1 -1
  109. package/dist/instructions.js +6 -7
  110. package/dist/instructions.js.map +1 -1
  111. package/dist/kiro-reconcile.js +3 -3
  112. package/dist/kiro-reconcile.js.map +1 -1
  113. package/dist/locale.js +96 -58
  114. package/dist/locale.js.map +1 -1
  115. package/dist/log-service.js +1 -1
  116. package/dist/log-service.js.map +1 -1
  117. package/dist/needs-you-hub.d.ts +1 -0
  118. package/dist/needs-you-hub.js +6 -3
  119. package/dist/needs-you-hub.js.map +1 -1
  120. package/dist/needs-you-live.d.ts +3 -1
  121. package/dist/needs-you-live.js +24 -2
  122. package/dist/needs-you-live.js.map +1 -1
  123. package/dist/needs-you.d.ts +13 -2
  124. package/dist/needs-you.js +11 -1
  125. package/dist/needs-you.js.map +1 -1
  126. package/dist/notify-socket.d.ts +10 -0
  127. package/dist/notify-socket.js +45 -0
  128. package/dist/notify-socket.js.map +1 -0
  129. package/dist/outbound-handlers.js +20 -8
  130. package/dist/outbound-handlers.js.map +1 -1
  131. package/dist/outbound-schemas.d.ts +0 -62
  132. package/dist/outbound-schemas.js +4 -43
  133. package/dist/outbound-schemas.js.map +1 -1
  134. package/dist/parked-notices.d.ts +87 -0
  135. package/dist/parked-notices.js +194 -0
  136. package/dist/parked-notices.js.map +1 -0
  137. package/dist/public-link-progress.d.ts +5 -2
  138. package/dist/public-link-progress.js +4 -3
  139. package/dist/public-link-progress.js.map +1 -1
  140. package/dist/public-web-gateway.js +0 -9
  141. package/dist/public-web-gateway.js.map +1 -1
  142. package/dist/public-web-link.d.ts +12 -0
  143. package/dist/public-web-link.js +29 -5
  144. package/dist/public-web-link.js.map +1 -1
  145. package/dist/quota-notice.d.ts +23 -0
  146. package/dist/quota-notice.js +22 -0
  147. package/dist/quota-notice.js.map +1 -0
  148. package/dist/scheduler/task-board.d.ts +17 -25
  149. package/dist/scheduler/task-board.js +29 -39
  150. package/dist/scheduler/task-board.js.map +1 -1
  151. package/dist/sd-notify.d.ts +23 -15
  152. package/dist/sd-notify.js +88 -29
  153. package/dist/sd-notify.js.map +1 -1
  154. package/dist/search/search-docs.d.ts +1 -1
  155. package/dist/search/search-docs.js +2 -2
  156. package/dist/search/search-docs.js.map +1 -1
  157. package/dist/settings-api.d.ts +16 -1
  158. package/dist/settings-api.js +56 -16
  159. package/dist/settings-api.js.map +1 -1
  160. package/dist/settings-change.js +3 -1
  161. package/dist/settings-change.js.map +1 -1
  162. package/dist/settings-confirmation.d.ts +17 -3
  163. package/dist/settings-confirmation.js +8 -5
  164. package/dist/settings-confirmation.js.map +1 -1
  165. package/dist/settings-effect.js +0 -2
  166. package/dist/settings-effect.js.map +1 -1
  167. package/dist/settings-http-confirmation.js +31 -1
  168. package/dist/settings-http-confirmation.js.map +1 -1
  169. package/dist/setup-wizard.d.ts +3 -0
  170. package/dist/setup-wizard.js +4 -2
  171. package/dist/setup-wizard.js.map +1 -1
  172. package/dist/task-board-waker.d.ts +43 -1
  173. package/dist/task-board-waker.js +121 -9
  174. package/dist/task-board-waker.js.map +1 -1
  175. package/dist/tmux-control.d.ts +1 -1
  176. package/dist/tmux-control.js +3 -2
  177. package/dist/tmux-control.js.map +1 -1
  178. package/dist/tmux-manager.js +18 -16
  179. package/dist/tmux-manager.js.map +1 -1
  180. package/dist/tmux-read.d.ts +2 -0
  181. package/dist/tmux-read.js +7 -1
  182. package/dist/tmux-read.js.map +1 -1
  183. package/dist/tool-permissions.js +3 -10
  184. package/dist/tool-permissions.js.map +1 -1
  185. package/dist/topic-commands.d.ts +29 -7
  186. package/dist/topic-commands.js +97 -37
  187. package/dist/topic-commands.js.map +1 -1
  188. package/dist/transcript-monitor.d.ts +7 -0
  189. package/dist/transcript-monitor.js +48 -3
  190. package/dist/transcript-monitor.js.map +1 -1
  191. package/dist/tunnel/cloudflared.d.ts +5 -0
  192. package/dist/tunnel/cloudflared.js +32 -1
  193. package/dist/tunnel/cloudflared.js.map +1 -1
  194. package/dist/tunnel/named-diagnostics.d.ts +2 -1
  195. package/dist/tunnel/named-diagnostics.js +4 -1
  196. package/dist/tunnel/named-diagnostics.js.map +1 -1
  197. package/dist/tunnel/named-link-test.d.ts +90 -0
  198. package/dist/tunnel/named-link-test.js +270 -0
  199. package/dist/tunnel/named-link-test.js.map +1 -0
  200. package/dist/tunnel/purpose-lane.d.ts +3 -1
  201. package/dist/tunnel/purpose-lane.js +2 -0
  202. package/dist/tunnel/purpose-lane.js.map +1 -1
  203. package/dist/types.d.ts +9 -11
  204. package/dist/ui/chat-ambient.js +4 -4
  205. package/dist/ui/chat-commands.js +3 -2
  206. package/dist/ui/chat-store.js +4 -1
  207. package/dist/ui/chat-strings.js +12 -46
  208. package/dist/ui/chat-thread.js +51 -59
  209. package/dist/ui/fleet-office-skin.js +37 -14
  210. package/dist/ui/fleet-office.js +31 -7
  211. package/dist/ui/html-attachment.js +22 -8
  212. package/dist/ui/panel-chat.js +21 -50
  213. package/dist/ui/panel-log.js +2 -2
  214. package/dist/ui/panel-needs.js +11 -9
  215. package/dist/ui/panel-settings.js +5 -3
  216. package/dist/ui/preview-panel.js +12 -21
  217. package/dist/ui/preview.js +10 -3
  218. package/dist/ui/search-dialog.js +30 -14
  219. package/dist/ui/settings-appearance.js +3 -37
  220. package/dist/ui/settings-confirm.js +18 -0
  221. package/dist/ui/settings-guests.js +13 -4
  222. package/dist/ui/settings-learn.js +1 -1
  223. package/dist/ui/settings-mods.js +5 -12
  224. package/dist/ui/settings-named-test.js +144 -0
  225. package/dist/ui/settings-registry.js +0 -2
  226. package/dist/ui/settings-strings.js +16 -16
  227. package/dist/ui/settings-web-authority.js +4 -3
  228. package/dist/ui/shared/app-i18n.js +15 -4
  229. package/dist/ui/shared/app-needs.js +5 -1
  230. package/dist/ui/shared/app-prefs.js +17 -17
  231. package/dist/ui/shared/app-shell.js +47 -9
  232. package/dist/ui/shared/app-store.js +6 -2
  233. package/dist/ui/shared/app.css +33 -39
  234. package/dist/ui/shared/app.js +5 -4
  235. package/dist/ui/shared/instance-nav.js +9 -9
  236. package/dist/ui/shared/instance-switch.js +8 -2
  237. package/dist/ui/shared/panel-view.js +22 -8
  238. package/dist/ui/shared/view-strings.js +6 -0
  239. package/dist/ui/shared/web-authorize.js +35 -13
  240. package/dist/update-check.d.ts +13 -4
  241. package/dist/update-check.js +17 -4
  242. package/dist/update-check.js.map +1 -1
  243. package/dist/usage/usage-api.d.ts +3 -0
  244. package/dist/usage/usage-api.js +5 -1
  245. package/dist/usage/usage-api.js.map +1 -1
  246. package/dist/view-api.d.ts +2 -0
  247. package/dist/view-api.js +64 -0
  248. package/dist/view-api.js.map +1 -1
  249. package/dist/web-api.d.ts +9 -17
  250. package/dist/web-api.js +257 -371
  251. package/dist/web-api.js.map +1 -1
  252. package/dist/web-appearance-tools.d.ts +0 -2
  253. package/dist/web-appearance-tools.js +2 -5
  254. package/dist/web-appearance-tools.js.map +1 -1
  255. package/dist/web-appearance-view.d.ts +0 -6
  256. package/dist/web-appearance-view.js +0 -1
  257. package/dist/web-appearance-view.js.map +1 -1
  258. package/dist/web-appearance.d.ts +14 -7
  259. package/dist/web-appearance.js +5 -6
  260. package/dist/web-appearance.js.map +1 -1
  261. package/dist/web-asset-parts.d.ts +1 -17
  262. package/dist/web-asset-parts.js +1 -15
  263. package/dist/web-asset-parts.js.map +1 -1
  264. package/dist/web-auth.js +1 -7
  265. package/dist/web-auth.js.map +1 -1
  266. package/dist/web-chat-history.d.ts +3 -7
  267. package/dist/web-chat-history.js +10 -17
  268. package/dist/web-chat-history.js.map +1 -1
  269. package/dist/web-commands.d.ts +9 -1
  270. package/dist/web-commands.js +13 -0
  271. package/dist/web-commands.js.map +1 -1
  272. package/dist/web-experimental.d.ts +3 -8
  273. package/dist/web-experimental.js +9 -33
  274. package/dist/web-experimental.js.map +1 -1
  275. package/dist/web-guest-access.d.ts +40 -2
  276. package/dist/web-guest-access.js +50 -14
  277. package/dist/web-guest-access.js.map +1 -1
  278. package/dist/web-mod-bundle.d.ts +2 -45
  279. package/dist/web-mod-bundle.js +15 -63
  280. package/dist/web-mod-bundle.js.map +1 -1
  281. package/dist/web-mod-store.d.ts +3 -48
  282. package/dist/web-mod-store.js +30 -97
  283. package/dist/web-mod-store.js.map +1 -1
  284. package/dist/web-prefs.d.ts +13 -0
  285. package/dist/web-prefs.js +38 -0
  286. package/dist/web-prefs.js.map +1 -1
  287. package/dist/web-preview.d.ts +6 -13
  288. package/dist/web-preview.js +12 -23
  289. package/dist/web-preview.js.map +1 -1
  290. package/dist/web-session.d.ts +11 -3
  291. package/dist/web-session.js +22 -11
  292. package/dist/web-session.js.map +1 -1
  293. package/dist/web-settings-patch.d.ts +1 -1
  294. package/dist/web-settings-patch.js +9 -7
  295. package/dist/web-settings-patch.js.map +1 -1
  296. package/dist/web-settings-tools.d.ts +0 -13
  297. package/dist/web-settings-tools.js +12 -84
  298. package/dist/web-settings-tools.js.map +1 -1
  299. package/dist/workflow-templates/default.md +2 -2
  300. package/dist/working-recovery.d.ts +0 -2
  301. package/dist/working-recovery.js +2 -23
  302. package/dist/working-recovery.js.map +1 -1
  303. package/launcher/agend-install.cjs +7 -1
  304. package/launcher/fleet-service-owner.cjs +150 -0
  305. package/package.json +1 -1
  306. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +0 -376
  307. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +0 -673
  308. package/dist/task-board-summary.d.ts +0 -101
  309. package/dist/task-board-summary.js +0 -177
  310. package/dist/task-board-summary.js.map +0 -1
  311. package/dist/ui/app-effects.js +0 -251
  312. package/dist/ui/chat-effect-posters.js +0 -42
  313. package/dist/ui/chat-effects.js +0 -167
  314. package/dist/ui/effect-trial-controller.js +0 -124
  315. package/dist/ui/effect-trial-offer.js +0 -2
  316. package/dist/ui/effect-trial-panel.js +0 -40
  317. package/dist/ui/effects-waker.js +0 -2
  318. package/dist/ui/settings-effects.js +0 -202
  319. package/dist/ui/settings-owner-effects.js +0 -82
  320. package/dist/ui/shared/effect-app-runtime.js +0 -299
  321. package/dist/ui/shared/effect-baseline.js +0 -64
  322. package/dist/ui/shared/effect-chat-runtime.js +0 -162
  323. package/dist/ui/shared/effect-cursor.js +0 -126
  324. package/dist/ui/shared/effect-display-metadata.js +0 -39
  325. package/dist/ui/shared/effect-frame.js +0 -146
  326. package/dist/ui/shared/effect-geometry.js +0 -137
  327. package/dist/ui/shared/effect-host-style.js +0 -10
  328. package/dist/ui/shared/effect-owner-regions.js +0 -74
  329. package/dist/ui/shared/effect-owner-source.js +0 -122
  330. package/dist/ui/shared/effect-policy.js +0 -151
  331. package/dist/ui/shared/effect-poster-reader.js +0 -98
  332. package/dist/ui/shared/effect-posters.js +0 -117
  333. package/dist/ui/shared/effect-profiler.js +0 -184
  334. package/dist/ui/shared/effect-profiles.js +0 -65
  335. package/dist/ui/shared/effect-registry.js +0 -545
  336. package/dist/ui/shared/effect-runtime-loader.js +0 -236
  337. package/dist/ui/shared/effect-safety.js +0 -153
  338. package/dist/ui/shared/effect-stock-snapshot.js +0 -43
  339. package/dist/ui/shared/effect-stock-trust.js +0 -217
  340. package/dist/ui/shared/effect-trial-shadow.js +0 -62
  341. package/dist/ui/shared/effect-trial-source.js +0 -103
  342. package/dist/ui/shared/effect-trial-stage.js +0 -170
  343. package/dist/ui/shared/effect-trial.css +0 -40
  344. package/dist/ui/shared/feature-flags.js +0 -127
  345. package/dist/ui/shared/owner-effect-prefs.js +0 -117
  346. package/dist/upgrade-notices.d.ts +0 -17
  347. package/dist/upgrade-notices.js +0 -93
  348. package/dist/upgrade-notices.js.map +0 -1
  349. package/dist/web-effect-bootstrap.d.ts +0 -12
  350. package/dist/web-effect-bootstrap.js +0 -49
  351. package/dist/web-effect-bootstrap.js.map +0 -1
  352. package/dist/web-effect-bundle.d.ts +0 -28
  353. package/dist/web-effect-bundle.js +0 -171
  354. package/dist/web-effect-bundle.js.map +0 -1
  355. package/dist/web-effect-canonical.d.ts +0 -8
  356. package/dist/web-effect-canonical.js +0 -27
  357. package/dist/web-effect-canonical.js.map +0 -1
  358. package/dist/web-effect-library.d.ts +0 -114
  359. package/dist/web-effect-library.js +0 -530
  360. package/dist/web-effect-library.js.map +0 -1
  361. package/dist/web-effect-playback.d.ts +0 -30
  362. package/dist/web-effect-playback.js +0 -71
  363. package/dist/web-effect-playback.js.map +0 -1
  364. package/dist/web-effect-poster.d.ts +0 -8
  365. package/dist/web-effect-poster.js +0 -52
  366. package/dist/web-effect-poster.js.map +0 -1
  367. package/dist/web-effect-profiles.d.ts +0 -118
  368. package/dist/web-effect-profiles.js +0 -181
  369. package/dist/web-effect-profiles.js.map +0 -1
  370. package/dist/web-effect-service.d.ts +0 -93
  371. package/dist/web-effect-service.js +0 -335
  372. package/dist/web-effect-service.js.map +0 -1
  373. package/dist/web-effect-tools.d.ts +0 -48
  374. package/dist/web-effect-tools.js +0 -129
  375. package/dist/web-effect-tools.js.map +0 -1
  376. package/dist/web-effect-trials.d.ts +0 -86
  377. package/dist/web-effect-trials.js +0 -204
  378. package/dist/web-effect-trials.js.map +0 -1
  379. package/dist/web-effect-upload.d.ts +0 -27
  380. package/dist/web-effect-upload.js +0 -185
  381. package/dist/web-effect-upload.js.map +0 -1
  382. package/dist/web-effect-worker.d.ts +0 -8
  383. package/dist/web-effect-worker.js +0 -170
  384. package/dist/web-effect-worker.js.map +0 -1
  385. package/dist/web-effect.d.ts +0 -103
  386. package/dist/web-effect.js +0 -153
  387. package/dist/web-effect.js.map +0 -1
  388. package/dist/web-experimental-http.d.ts +0 -2
  389. package/dist/web-experimental-http.js +0 -12
  390. package/dist/web-experimental-http.js.map +0 -1
  391. package/dist/web-mod-agent.d.ts +0 -50
  392. package/dist/web-mod-agent.js +0 -207
  393. package/dist/web-mod-agent.js.map +0 -1
package/dist/sd-notify.js CHANGED
@@ -3,6 +3,8 @@ import { execFile } from "./child-process.js";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { getAgendHome } from "./paths.js";
6
+ import { notifySocketProblem } from "./notify-socket.js";
7
+ export { notifySocketProblem };
6
8
  /**
7
9
  * Keep systemd's notification socket private to the fleet process. The socket
8
10
  * path is a capability: any child that inherits it can send READY/WATCHDOG/
@@ -51,64 +53,106 @@ export function sendSystemdNotificationAsync(state, socket, environment, execute
51
53
  catch { /* reporting must never throw out of a child callback */ } });
52
54
  }
53
55
  /**
54
- * Send a notification without blocking the event loop.
55
- *
56
- * The watchdog ping exists to prove this process is still turning its event
57
- * loop. Proving it with `execFileSync` stopped the loop for as long as the fork
58
- * took — up to the 5s timeout — every 30 seconds, and forking is slowest exactly
59
- * when the machine is loaded, i.e. when the ping matters. A fire-and-forget spawn
60
- * says the same thing about liveness (the timer fired, the call was made) without
61
- * contradicting itself.
62
- *
63
- * Still a subprocess: Node does not expose AF_UNIX datagram sockets, so
64
- * systemd-notify remains the only way to reach NOTIFY_SOCKET from here.
56
+ * Wait for the notify child asynchronously. execFile still has a synchronous
57
+ * fork cost under host pressure; the shorter heartbeat interval and bounded
58
+ * retry restore margin without an independent heartbeat or changing barriers.
65
59
  */
66
60
  export function sdNotify(state) {
67
61
  defaultNotifier(state);
68
62
  }
69
63
  let warnSink = null;
70
- export function setSdNotifyWarn(sink) { warnSink = sink; }
71
- /** At most one warning per kind in this window: a ping is every 30 s, the log must not be. */
64
+ let startChecked = false;
65
+ /** The fleet sets this as it starts: the first time, a socket that is already gone is said once (log only). */
66
+ export function setSdNotifyWarn(sink) {
67
+ warnSink = sink;
68
+ if (sink && !startChecked) {
69
+ startChecked = true;
70
+ reportNotifySocketAtStart(sink);
71
+ }
72
+ }
73
+ /** Repeated unchanged ownership skips may coalesce; delivery failures never do. */
72
74
  export const SD_NOTIFY_WARN_INTERVAL_MS = 10 * 60_000;
75
+ /** More opportunities within WatchdogSec=60, still driven by the main loop. */
76
+ export const SD_WATCHDOG_INTERVAL_MS = 10_000;
77
+ export const SD_NOTIFY_RETRY_MS = 1_000;
78
+ /** Liveness is sampled only by the fleet's main loop, never an independent sender. */
79
+ export function startSdWatchdog(notify = sdNotify) {
80
+ return setInterval(() => notify("WATCHDOG=1"), SD_WATCHDOG_INTERVAL_MS);
81
+ }
73
82
  /**
74
83
  * The notification path, with what it depends on passed in (tests). A skipped notification used to be silent: a
75
84
  * fleet.pid naming another process, or a systemd-notify that failed, stopped the watchdog being fed with nothing in
76
- * the log, and the abort that followed looked like a hang. Now each says so, rate-limited per kind.
85
+ * the log, and the abort that followed looked like a hang. Delivery failures include the child outcome on every attempt; ownership skips coalesce.
77
86
  */
78
87
  export function createSdNotifier(deps) {
79
88
  const now = deps.now ?? (() => performance.now());
80
89
  const lastWarnAt = new Map();
81
- const warn = (kind, fields, message) => {
82
- const sink = deps.warn();
83
- if (!sink)
84
- return;
85
- const at = now(), last = lastWarnAt.get(kind);
90
+ let retryTimer = null;
91
+ let generation = 0;
92
+ const cancelRetry = () => {
93
+ generation++;
94
+ if (retryTimer)
95
+ clearTimeout(retryTimer);
96
+ retryTimer = null;
97
+ };
98
+ const warnOwner = (fields) => {
99
+ const at = now(), last = lastWarnAt.get("not_owner");
86
100
  if (last !== undefined && at - last < SD_NOTIFY_WARN_INTERVAL_MS)
87
101
  return;
88
- lastWarnAt.set(kind, at);
102
+ lastWarnAt.set("not_owner", at);
89
103
  try {
90
- sink(fields, message);
104
+ deps.warn()?.(fields, "systemd notification not sent: fleet.pid does not name this process, so systemd's watchdog is not being fed");
91
105
  }
92
106
  catch { /* reporting must never break the ping */ }
93
107
  };
94
- return (state) => {
95
- if (!deps.socket)
108
+ const attempt = (state, retry, epoch) => {
109
+ if (!deps.socket || epoch !== generation)
96
110
  return;
97
111
  const pid = deps.pid(), recorded = deps.recordedPid();
98
112
  if (recorded !== pid) {
99
- warn("not_owner", { state, pid, recordedPid: recorded }, "systemd notification not sent: fleet.pid does not name this process, so systemd's watchdog is not being fed");
113
+ warnOwner({ state, pid, recordedPid: recorded });
100
114
  return;
101
115
  }
116
+ const startedAt = now();
117
+ let completed = false;
118
+ const done = (error) => {
119
+ if (completed)
120
+ return;
121
+ completed = true;
122
+ if (!error)
123
+ return;
124
+ const detail = error;
125
+ // Every failed attempt is visible, including a failed retry. A later
126
+ // successful ping needs no warning; only unchanged ownership skips coalesce.
127
+ try {
128
+ const why = deps.socket ? (deps.socketProblem ?? notifySocketProblem)(deps.socket) : null;
129
+ deps.warn()?.({ state, retry, error: error.message, code: detail.code ?? null,
130
+ signal: detail.signal ?? null, killed: detail.killed ?? false,
131
+ elapsedMs: Math.max(0, Math.round(now() - startedAt)), ...why }, "systemd-notify failed; systemd's watchdog may not be fed");
132
+ }
133
+ catch { /* reporting must never break the ping */ }
134
+ if (state === "WATCHDOG=1" && !retry && epoch === generation) {
135
+ retryTimer = setTimeout(() => {
136
+ retryTimer = null;
137
+ attempt(state, true, epoch); // owner is checked again, and a retry never retries itself
138
+ }, SD_NOTIFY_RETRY_MS);
139
+ retryTimer.unref?.();
140
+ }
141
+ };
102
142
  try {
103
- deps.send(state, deps.socket, error => {
104
- if (error)
105
- warn("notify_failed", { state, error: error.message, code: error.code }, "systemd-notify failed; systemd's watchdog may not be fed");
106
- });
143
+ deps.send(state, deps.socket, done);
107
144
  }
108
145
  catch (error) {
109
- warn("notify_failed", { state, error: error.message }, "systemd-notify could not be started; systemd's watchdog may not be fed");
146
+ done(error instanceof Error ? error : new Error(String(error)));
110
147
  }
111
148
  };
149
+ const notify = (state) => {
150
+ // A regular ping supersedes an older retry; STOPPING/READY also fence any
151
+ // in-flight failure callback from rearming a heartbeat after lifecycle changes.
152
+ cancelRetry();
153
+ attempt(state, false, generation);
154
+ };
155
+ return Object.assign(notify, { cancelRetry });
112
156
  }
113
157
  const defaultNotifier = createSdNotifier({
114
158
  socket: notifySocket,
@@ -117,6 +161,20 @@ const defaultNotifier = createSdNotifier({
117
161
  send: (state, socket, onDone) => sendSystemdNotificationAsync(state, socket, process.env, undefined, onDone),
118
162
  warn: () => warnSink,
119
163
  });
164
+ /**
165
+ * Once at startup (log only): the socket systemd gave this process is already gone, so READY will not arrive either.
166
+ * Returns whether it said so.
167
+ */
168
+ export function reportNotifySocketAtStart(warn, socket = notifySocket, problem = notifySocketProblem) {
169
+ const why = problem(socket);
170
+ if (!why)
171
+ return false;
172
+ try {
173
+ warn(why, "systemd's notify socket is missing; READY and WATCHDOG cannot reach systemd");
174
+ }
175
+ catch { /* best effort */ }
176
+ return true;
177
+ }
120
178
  /**
121
179
  * Blocking variant, for the one case where the process is about to exit.
122
180
  *
@@ -125,6 +183,7 @@ const defaultNotifier = createSdNotifier({
125
183
  * should use this.
126
184
  */
127
185
  export function sdNotifyBlocking(state) {
186
+ defaultNotifier.cancelRetry();
128
187
  if (!notifySocket || !isFleetOwner())
129
188
  return;
130
189
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"sd-notify.js","sourceRoot":"","sources":["../src/sd-notify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-notify.js","sourceRoot":"","sources":["../src/sd-notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAA8B;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC;IACzC,OAAO,WAAW,CAAC,aAAa,CAAC;IACjC,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,WAA8B,EAC9B,MAAc;IAEd,OAAO,EAAE,GAAG,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEtD,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAC1B,OAAO,GAAG,YAAY,EAAE,EACxB,GAAG,GAAG,OAAO,CAAC,GAAG;IAEjB,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC;AAC3C,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAAG,YAAY,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAC9B,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EACvD,EAAE,CACH,CAAC;QACF,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD,mEAAmE;AACnE,MAAM,UAAU,uBAAuB,CACrC,KAAa,EACb,MAAc,EACd,WAA8B,EAC9B,OAAO,GAAmB,YAAY;IAEtC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE;QACjC,GAAG,EAAE,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC;QAChD,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;AACL,CAAC;AASD,6EAA6E;AAC7E,MAAM,UAAU,4BAA4B,CAC1C,KAAa,EACb,MAAc,EACd,WAA8B,EAC9B,OAAO,GAAwB,QAA0C,EACzE,MAAM,GAAkC,GAAG,EAAE,GAA8D,CAAC;IAE5G,OAAO,CACL,gBAAgB,EAChB,CAAC,KAAK,CAAC,EACP,EAAE,GAAG,EAAE,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EACnE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,CAAC,CACvG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,eAAe,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAID,IAAI,QAAQ,GAAwB,IAAI,CAAC;AACzC,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,+GAA+G;AAC/G,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,QAAQ,GAAG,IAAI,CAAC;IAChB,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,YAAY,GAAG,IAAI,CAAC;QAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;AACtF,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,MAAM,CAAC;AACtD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAExC,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,MAAM,GAA4B,QAAQ;IACxE,OAAO,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC,CAAC;AAC1E,CAAC;AAaD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,IAAI,UAAU,GAAyC,IAAI,CAAC;IAC5D,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,UAAU,EAAE,CAAC;QACb,IAAI,UAAU;YAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QACzC,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,MAA+B,EAAQ,EAAE;QAC1D,MAAM,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,0BAA0B;YAAE,OAAO;QACzE,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC;YAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EACxB,6GAA6G,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;IACzK,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAc,EAAE,KAAa,EAAQ,EAAE;QACrE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;QACxB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,IAAI,GAAG,CAAC,KAAmB,EAAQ,EAAE;YACzC,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,MAAM,GAAG,KAAuE,CAAC;YACvF,qEAAqE;YACrE,6EAA6E;YAC7E,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,mBAAmB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC1F,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;oBAC3E,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;oBAC7D,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAC/D,0DAA0D,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,YAAY,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC7D,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC3B,UAAU,GAAG,IAAI,CAAC;oBAClB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,2DAA2D;gBAC1F,CAAC,EAAE,kBAAkB,CAAC,CAAC;gBACvB,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;QAC5C,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;IACpF,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE;QACrC,0EAA0E;QAC1E,gFAAgF;QAChF,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,eAAe,GAAG,gBAAgB,CAAC;IACvC,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG;IACtB,WAAW,EAAE,GAAG,EAAE,CAAC,gBAAgB,EAAE;IACrC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC;IAC5G,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ;CACrB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAkB,EAAE,MAAM,GAAuB,YAAY,EACrG,OAAO,GAAmE,mBAAmB;IAC7F,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC;QAAC,IAAI,CAAC,GAAG,EAAE,6EAA6E,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC7H,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,eAAe,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE;QAAE,OAAO;IAC7C,IAAI,CAAC;QACH,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC"}
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import type { WebChatMessage } from "../web-chat-history.js";
10
10
  import type { SearchDoc } from "./search-store.js";
11
- /** A chat row's doc, or null when it is not searched (a status line, an effect offer, nothing to find). */
11
+ /** A chat row's doc, or null when it is not searched (a status line, nothing to find). */
12
12
  export declare function chatDoc(m: WebChatMessage): SearchDoc | null;
13
13
  export interface CrossInstanceRecord {
14
14
  messageId: string;
@@ -1,7 +1,7 @@
1
1
  const time = (iso, fallback = Date.now()) => { const t = typeof iso === "string" ? Date.parse(iso) : NaN; return Number.isFinite(t) ? t : fallback; };
2
- /** A chat row's doc, or null when it is not searched (a status line, an effect offer, nothing to find). */
2
+ /** A chat row's doc, or null when it is not searched (a status line, nothing to find). */
3
3
  export function chatDoc(m) {
4
- if ((m.role !== "user" && m.role !== "agent") || m.effectTrial)
4
+ if (m.role !== "user" && m.role !== "agent")
5
5
  return null;
6
6
  const words = m.click?.label ?? m.text ?? "";
7
7
  const files = (m.attachments ?? []).map(a => a.name).filter(Boolean).join(" ");
@@ -1 +1 @@
1
- {"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/search/search-docs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-docs.js","sourceRoot":"","sources":["../../src/search/search-docs.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,16 @@ export interface SettingsApiContext extends AppShellContext {
40
40
  queued: boolean;
41
41
  already_running?: boolean;
42
42
  };
43
+ /** #2906: the fixed address's Test connection (closed step codes only; never the token). */
44
+ testNamedLink?(input: {
45
+ hostname: unknown;
46
+ port: unknown;
47
+ protocol: unknown;
48
+ token?: unknown;
49
+ current?: () => boolean;
50
+ }): Promise<import("./tunnel/named-link-test.js").NamedTestResult | {
51
+ busy: true;
52
+ }>;
43
53
  /** #1920 phase 3: Settings → Web sign-ins → Guests. */
44
54
  guestOverview?(): unknown;
45
55
  /** #2667: the ClassicBot rooms' instance names — a guest grant may name one, so a save's validation knows them. */
@@ -51,6 +61,11 @@ export interface SettingsApiContext extends AppShellContext {
51
61
  count: number;
52
62
  durable: boolean;
53
63
  };
64
+ /** #2855: a removed guest's own preferences go with it. */
65
+ forgetGuestPrefs?(owner: {
66
+ adapterId: string;
67
+ userId: string;
68
+ }): void;
54
69
  /** #2348 delta §5: one audit entry per person whose granted agents changed with a save (event log, the Log tab). */
55
70
  noteGuestGrantChange?(change: {
56
71
  by: string | null;
@@ -59,6 +74,7 @@ export interface SettingsApiContext extends AppShellContext {
59
74
  added: string[];
60
75
  removed: string[];
61
76
  endedSessions: number;
77
+ level?: "chat" | "trusted";
62
78
  }): void;
63
79
  /** #2348: the people AgEnD has seen in chat (the Guests picker), never a fleet admin or a bot. */
64
80
  guestPeople?(): unknown;
@@ -87,7 +103,6 @@ export interface SettingsApiContext extends AppShellContext {
87
103
  getRawFleetConfig(): RawFleetConfig;
88
104
  saveFleetConfig(explicitPatches?: RawConfigPatch[]): void;
89
105
  /** Refresh managed guidance and web clients after a committed experimental setting change. */
90
- canvasWorkerSettingChanged?(): void;
91
106
  lifecycle: {
92
107
  isPaused(name: string): boolean;
93
108
  pause(name: string): Promise<void>;
@@ -4,7 +4,7 @@ import { DEFAULT_REPLY_TRIGGERS } from "./reply-triggers.js";
4
4
  import { PUBLIC_TUNNEL_SECRET_ID, PUBLIC_TUNNEL_TOKEN_HINT } from "./public-tunnel-config.js";
5
5
  import { withSpawnHoldReply } from "./spawn-hold-reply.js";
6
6
  import { normalizeSettingsInstancePatch, removesInstanceOverride } from "./settings-instance-patch.js";
7
- import { isSettingsReplay, settingsRequestExecution, settingsRequestLocalAdmin, settingsWrite } from "./settings-request-capability.js";
7
+ import { isSettingsReplay, settingsRequestExecution, settingsWrite } from "./settings-request-capability.js";
8
8
  import { noteSettingsWrite, settingsUndo, undoSettingsPaths } from "./settings-transaction.js";
9
9
  import { readBoundedWebBody } from "./web-body.js";
10
10
  import { gatewayRequestContext } from "./web-request-context.js";
@@ -346,6 +346,47 @@ export function handleSettingsRequest(req, res, url, ctx) {
346
346
  }
347
347
  return true;
348
348
  }
349
+ // #2906 (the user, 2026-11-01): Settings → Access → Test connection, on the fixed-address values as filled in. Admin
350
+ // only and never over the public link, like the rest of Access; the typed token is read from the body once, used
351
+ // only in the test connector's environment, and never echoed — the answer is closed step codes.
352
+ if (method === "POST" && path === "/api/settings/public-link/test") {
353
+ if (gatewayRequestContext(req)) {
354
+ json(res, 403, { error: "web_settings_not_over_public_link" }, true);
355
+ return true;
356
+ }
357
+ const caller = guestSettingsCaller(req, url, ctx);
358
+ if (!caller) {
359
+ json(res, 403, { error: "An admin sign-in is required" }, true);
360
+ return true;
361
+ }
362
+ if (!ctx.testNamedLink) {
363
+ json(res, 501, { error: "test unavailable" }, true);
364
+ return true;
365
+ }
366
+ // #2907 review: the same admin, still current, after the body's await — and again before anything is started.
367
+ const current = () => guestSettingsCaller(req, url, ctx) === caller;
368
+ readBody(req, 16 * 1024).then(async (buf) => {
369
+ if (!permitWebContinuation(req, res, ctx))
370
+ return;
371
+ if (!current())
372
+ return json(res, 401, { error: "no longer authorized" }, true);
373
+ let body;
374
+ try {
375
+ body = JSON.parse(buf.toString("utf-8") || "{}");
376
+ }
377
+ catch {
378
+ return json(res, 400, { error: "invalid JSON" }, true);
379
+ }
380
+ if (!body || typeof body !== "object" || Array.isArray(body))
381
+ return json(res, 400, { error: "invalid body" }, true);
382
+ const result = await ctx.testNamedLink({ hostname: body.hostname, port: body.origin_port, protocol: body.protocol, token: body.token, current });
383
+ if ("busy" in result)
384
+ return json(res, 409, { error: "test_running" }, true);
385
+ json(res, 200, { steps: result.steps, hostname: result.hostname, port: result.port, ...(result.cleanup ? { cleanup: result.cleanup } : {}) }, true);
386
+ }).catch(() => { if (!res.headersSent)
387
+ json(res, 400, { error: "bad request" }, true); });
388
+ return true;
389
+ }
349
390
  // Generic provider API-key registry. Unlike the legacy connection token
350
391
  // routes, this endpoint accepts a code-owned spec id only; env key, origin,
351
392
  // auth header and verifier are resolved server-side. The body is consumed
@@ -894,12 +935,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
894
935
  const parsed = parseWebSettingsBody(body);
895
936
  if ("error" in parsed)
896
937
  return json(res, 400, { error: parsed.error });
897
- if (parsed.canvasWorker !== undefined && !settingsRequestLocalAdmin(req)) {
898
- const actor = evaluateWebRequest(req, url, ctx.webToken ?? null, ctx.webSessions, { touch: false });
899
- if (actor.kind !== "allow" || actor.via !== "session" || actor.session.tier !== "admin" || actor.session.surface !== "local") {
900
- return json(res, 403, { error: "canvas_worker_setting_needs_local_admin" });
901
- }
902
- }
903
938
  const { session: sessionPatch, terminal: terminalPatch } = parsed;
904
939
  // #2499 review: who is saving, asked now, before the save — a session policy saved with it can end this very session
905
940
  // (a shorter sign-in time), and the audit must still name who did it. A confirmation's replay is no one's: null.
@@ -907,10 +942,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
907
942
  const changes = [];
908
943
  let web = { ...cfg.web };
909
944
  let webTerminal = cfg.web_terminal;
910
- if (parsed.canvasWorker !== undefined) {
911
- web.experimental = { ...web.experimental, canvas_worker: parsed.canvasWorker };
912
- changes.push({ path: ["web", "experimental", "canvas_worker"], value: parsed.canvasWorker });
913
- }
914
945
  if (parsed.notifyLogin !== undefined) {
915
946
  const holder = { defaults: cfg.defaults, web };
916
947
  setNoticeMode(holder, "login", parsed.notifyLogin);
@@ -1020,9 +1051,6 @@ export function handleSettingsRequest(req, res, url, ctx) {
1020
1051
  ctx.logger.warn({ err }, "settings: web save refused");
1021
1052
  return json(res, 500, { ok: false, error: err.message });
1022
1053
  }
1023
- if (parsed.canvasWorker !== undefined && (previous.web?.experimental?.canvas_worker === true) !== parsed.canvasWorker) {
1024
- ctx.canvasWorkerSettingChanged?.();
1025
- }
1026
1054
  // #2348: a grant taken away (or emptied) ends that person's guest access now — sessions, an outstanding code, and
1027
1055
  // remembered browsers — not at their next request. A narrowed grant keeps its sessions; they see less from now on.
1028
1056
  const ended = new Map();
@@ -1036,6 +1064,15 @@ export function handleSettingsRequest(req, res, url, ctx) {
1036
1064
  catch (err) {
1037
1065
  ctx.logger.warn({ err }, "settings: could not end a removed guest's sessions");
1038
1066
  }
1067
+ // #2855: removed (not just emptied): the guest's own preferences go too. Its name stays for its past messages.
1068
+ if (grant === null) {
1069
+ try {
1070
+ ctx.forgetGuestPrefs?.({ adapterId: key.slice(0, at), userId: key.slice(at + 1) });
1071
+ }
1072
+ catch (err) {
1073
+ ctx.logger.warn({ err }, "settings: could not delete a removed guest's preferences");
1074
+ }
1075
+ }
1039
1076
  }
1040
1077
  // #2348 delta §5: every grant change is audited, widening (confirmed in General, replayed here) or narrowing (at
1041
1078
  // once) alike: who, how, the agents added and taken away. Agent names only; never message content. Shown under
@@ -1046,10 +1083,13 @@ export function handleSettingsRequest(req, res, url, ctx) {
1046
1083
  for (const key of new Set([...Object.keys(was), ...Object.keys(now)])) {
1047
1084
  const a = new Set(Object.hasOwn(was, key) ? was[key].instances : []), b = new Set(Object.hasOwn(now, key) ? now[key].instances : []);
1048
1085
  const added = [...b].filter((n) => !a.has(n)), removed = [...a].filter((n) => !b.has(n));
1049
- if (!added.length && !removed.length)
1086
+ // #2855: a kept grant's level, when it changed (Chat ↔ Trusted).
1087
+ const levelOf = (g) => (g?.level === "trusted" ? "trusted" : "chat");
1088
+ const level = Object.hasOwn(was, key) && Object.hasOwn(now, key) && levelOf(was[key]) !== levelOf(now[key]) ? levelOf(now[key]) : undefined;
1089
+ if (!added.length && !removed.length && !level)
1050
1090
  continue;
1051
1091
  try {
1052
- ctx.noteGuestGrantChange({ by, via, account: key, added, removed, endedSessions: ended.get(key) ?? 0 });
1092
+ ctx.noteGuestGrantChange({ by, via, account: key, added, removed, endedSessions: ended.get(key) ?? 0, ...(level ? { level } : {}) });
1053
1093
  }
1054
1094
  catch (err) {
1055
1095
  ctx.logger.warn({ err }, "settings: could not audit a guest grant change");