@songsid/agend 2.2.0-beta.8 → 2.2.0

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 (239) hide show
  1. package/README.md +40 -24
  2. package/README.zh-TW.md +40 -24
  3. package/dist/agent-endpoint.js +3 -0
  4. package/dist/agent-endpoint.js.map +1 -1
  5. package/dist/agent-whats-new.js +7 -1
  6. package/dist/agent-whats-new.js.map +1 -1
  7. package/dist/auth-api.d.ts +3 -1
  8. package/dist/auth-api.js +15 -1
  9. package/dist/auth-api.js.map +1 -1
  10. package/dist/backend/antigravity.d.ts +33 -0
  11. package/dist/backend/antigravity.js +126 -18
  12. package/dist/backend/antigravity.js.map +1 -1
  13. package/dist/backend/claude-code.d.ts +3 -0
  14. package/dist/backend/claude-code.js +9 -0
  15. package/dist/backend/claude-code.js.map +1 -1
  16. package/dist/backend/codex-metadata.d.ts +33 -0
  17. package/dist/backend/codex-metadata.js +122 -18
  18. package/dist/backend/codex-metadata.js.map +1 -1
  19. package/dist/backend/codex.d.ts +3 -0
  20. package/dist/backend/codex.js +17 -1
  21. package/dist/backend/codex.js.map +1 -1
  22. package/dist/backend/effort-metadata.d.ts +37 -1
  23. package/dist/backend/effort-metadata.js +86 -15
  24. package/dist/backend/effort-metadata.js.map +1 -1
  25. package/dist/backend/grok.d.ts +4 -0
  26. package/dist/backend/grok.js +14 -0
  27. package/dist/backend/grok.js.map +1 -1
  28. package/dist/backend/kiro.d.ts +18 -1
  29. package/dist/backend/kiro.js +35 -8
  30. package/dist/backend/kiro.js.map +1 -1
  31. package/dist/backend/launch-effort.d.ts +61 -0
  32. package/dist/backend/launch-effort.js +170 -0
  33. package/dist/backend/launch-effort.js.map +1 -0
  34. package/dist/backend/muse.d.ts +17 -0
  35. package/dist/backend/muse.js +86 -16
  36. package/dist/backend/muse.js.map +1 -1
  37. package/dist/backend/types.d.ts +40 -1
  38. package/dist/backend/types.js +12 -1
  39. package/dist/backend/types.js.map +1 -1
  40. package/dist/backend-command.d.ts +91 -0
  41. package/dist/backend-command.js +122 -0
  42. package/dist/backend-command.js.map +1 -0
  43. package/dist/channel/adapters/discord.d.ts +12 -0
  44. package/dist/channel/adapters/discord.js +49 -2
  45. package/dist/channel/adapters/discord.js.map +1 -1
  46. package/dist/channel/adapters/telegram.d.ts +18 -0
  47. package/dist/channel/adapters/telegram.js +24 -3
  48. package/dist/channel/adapters/telegram.js.map +1 -1
  49. package/dist/channel/mcp-tools.js +2 -0
  50. package/dist/channel/mcp-tools.js.map +1 -1
  51. package/dist/channel/tool-router.d.ts +2 -0
  52. package/dist/channel/tool-router.js +1 -1
  53. package/dist/channel/tool-router.js.map +1 -1
  54. package/dist/channel/types.d.ts +16 -0
  55. package/dist/cli.js +124 -24
  56. package/dist/cli.js.map +1 -1
  57. package/dist/command-table.d.ts +2 -2
  58. package/dist/command-table.js +5 -2
  59. package/dist/command-table.js.map +1 -1
  60. package/dist/compact-watch.d.ts +86 -0
  61. package/dist/compact-watch.js +288 -0
  62. package/dist/compact-watch.js.map +1 -0
  63. package/dist/config-validator.js +39 -0
  64. package/dist/config-validator.js.map +1 -1
  65. package/dist/config.d.ts +1 -0
  66. package/dist/config.js +2 -1
  67. package/dist/config.js.map +1 -1
  68. package/dist/daemon.d.ts +13 -1
  69. package/dist/daemon.js +160 -13
  70. package/dist/daemon.js.map +1 -1
  71. package/dist/delivery-outbox.d.ts +8 -1
  72. package/dist/delivery-outbox.js +6 -2
  73. package/dist/delivery-outbox.js.map +1 -1
  74. package/dist/doctor.js +7 -0
  75. package/dist/doctor.js.map +1 -1
  76. package/dist/fleet-context.d.ts +7 -0
  77. package/dist/fleet-manager.d.ts +160 -10
  78. package/dist/fleet-manager.js +837 -121
  79. package/dist/fleet-manager.js.map +1 -1
  80. package/dist/forged-envelope-scan.d.ts +4 -3
  81. package/dist/forged-envelope-scan.js +4 -3
  82. package/dist/forged-envelope-scan.js.map +1 -1
  83. package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
  84. package/dist/install-lock.d.ts +18 -1
  85. package/dist/install-lock.js +30 -3
  86. package/dist/install-lock.js.map +1 -1
  87. package/dist/instance-avatar.d.ts +5 -4
  88. package/dist/instance-avatar.js +12 -8
  89. package/dist/instance-avatar.js.map +1 -1
  90. package/dist/instance-lifecycle.js +3 -1
  91. package/dist/instance-lifecycle.js.map +1 -1
  92. package/dist/instructions.js +2 -2
  93. package/dist/instructions.js.map +1 -1
  94. package/dist/kiro-compact-pane.d.ts +38 -0
  95. package/dist/kiro-compact-pane.js +57 -0
  96. package/dist/kiro-compact-pane.js.map +1 -0
  97. package/dist/kiro-log-gate.d.ts +42 -0
  98. package/dist/kiro-log-gate.js +39 -0
  99. package/dist/kiro-log-gate.js.map +1 -0
  100. package/dist/launchd-handoff.d.ts +43 -0
  101. package/dist/launchd-handoff.js +56 -0
  102. package/dist/launchd-handoff.js.map +1 -0
  103. package/dist/locale.js +202 -30
  104. package/dist/locale.js.map +1 -1
  105. package/dist/log-service.js +10 -2
  106. package/dist/log-service.js.map +1 -1
  107. package/dist/log-steps.d.ts +26 -0
  108. package/dist/log-steps.js +215 -3
  109. package/dist/log-steps.js.map +1 -1
  110. package/dist/login-shell.d.ts +21 -0
  111. package/dist/login-shell.js +98 -0
  112. package/dist/login-shell.js.map +1 -0
  113. package/dist/outbound-handlers.d.ts +27 -0
  114. package/dist/outbound-handlers.js +120 -36
  115. package/dist/outbound-handlers.js.map +1 -1
  116. package/dist/outbound-schemas.d.ts +12 -0
  117. package/dist/outbound-schemas.js +15 -4
  118. package/dist/outbound-schemas.js.map +1 -1
  119. package/dist/provider-probe.d.ts +29 -0
  120. package/dist/provider-probe.js +198 -2
  121. package/dist/provider-probe.js.map +1 -1
  122. package/dist/public-web-gateway.d.ts +2 -0
  123. package/dist/public-web-gateway.js +11 -1
  124. package/dist/public-web-gateway.js.map +1 -1
  125. package/dist/quickstart-api.d.ts +1 -1
  126. package/dist/quickstart-api.js +8 -6
  127. package/dist/quickstart-api.js.map +1 -1
  128. package/dist/quickstart.d.ts +12 -0
  129. package/dist/quickstart.js +36 -6
  130. package/dist/quickstart.js.map +1 -1
  131. package/dist/reply-buttons-controller.d.ts +86 -5
  132. package/dist/reply-buttons-controller.js +271 -7
  133. package/dist/reply-buttons-controller.js.map +1 -1
  134. package/dist/reply-buttons.d.ts +48 -3
  135. package/dist/reply-buttons.js +105 -10
  136. package/dist/reply-buttons.js.map +1 -1
  137. package/dist/reply-polls.d.ts +85 -0
  138. package/dist/reply-polls.js +154 -0
  139. package/dist/reply-polls.js.map +1 -0
  140. package/dist/restart-guard.d.ts +6 -3
  141. package/dist/restart-guard.js +6 -3
  142. package/dist/restart-guard.js.map +1 -1
  143. package/dist/restart-progress.d.ts +0 -2
  144. package/dist/restart-progress.js +0 -2
  145. package/dist/restart-progress.js.map +1 -1
  146. package/dist/sd-notify.d.ts +22 -1
  147. package/dist/sd-notify.js +63 -10
  148. package/dist/sd-notify.js.map +1 -1
  149. package/dist/service-activation.d.ts +15 -7
  150. package/dist/service-activation.js +42 -26
  151. package/dist/service-activation.js.map +1 -1
  152. package/dist/service-installer.d.ts +24 -0
  153. package/dist/service-installer.js +49 -1
  154. package/dist/service-installer.js.map +1 -1
  155. package/dist/service-plan.d.ts +11 -0
  156. package/dist/service-plan.js +23 -0
  157. package/dist/service-plan.js.map +1 -1
  158. package/dist/systemd-peer-bus.d.ts +95 -0
  159. package/dist/systemd-peer-bus.js +430 -0
  160. package/dist/systemd-peer-bus.js.map +1 -0
  161. package/dist/systemd-runtime.d.ts +27 -1
  162. package/dist/systemd-runtime.js +69 -7
  163. package/dist/systemd-runtime.js.map +1 -1
  164. package/dist/tool-permissions.js +3 -3
  165. package/dist/tool-permissions.js.map +1 -1
  166. package/dist/topic-commands.d.ts +68 -2
  167. package/dist/topic-commands.js +141 -27
  168. package/dist/topic-commands.js.map +1 -1
  169. package/dist/transcript-jsonl.d.ts +7 -2
  170. package/dist/transcript-jsonl.js +13 -7
  171. package/dist/transcript-jsonl.js.map +1 -1
  172. package/dist/transcript-sources.js +6 -1
  173. package/dist/transcript-sources.js.map +1 -1
  174. package/dist/types.d.ts +8 -0
  175. package/dist/ui/chat-commands.js +1 -0
  176. package/dist/ui/chat-render.js +55 -10
  177. package/dist/ui/chat-store.js +69 -5
  178. package/dist/ui/chat-strings.js +28 -16
  179. package/dist/ui/chat-thread.js +132 -14
  180. package/dist/ui/chat-tour.js +17 -14
  181. package/dist/ui/panel-chat.js +16 -10
  182. package/dist/ui/panel-fleet.js +15 -2
  183. package/dist/ui/panel-log.js +55 -15
  184. package/dist/ui/panel-needs.js +10 -7
  185. package/dist/ui/panel-settings.js +58 -7
  186. package/dist/ui/settings-dialogs.js +11 -6
  187. package/dist/ui/settings-model.js +3 -1
  188. package/dist/ui/settings-strings.js +24 -10
  189. package/dist/ui/settings-token.js +7 -0
  190. package/dist/ui/settings-wizard.js +5 -3
  191. package/dist/ui/shared/app-i18n.js +1 -1
  192. package/dist/ui/shared/app-stream.js +4 -1
  193. package/dist/ui/shared/app.css +52 -10
  194. package/dist/ui/shared/header-tools.js +34 -14
  195. package/dist/ui/shared/instance-switch.js +5 -2
  196. package/dist/ui/shared/panel-view.js +15 -4
  197. package/dist/ui/shared/signin.js +15 -9
  198. package/dist/ui/shared/ui-icons.js +1 -0
  199. package/dist/ui/shared/view-strings.js +10 -2
  200. package/dist/ui/signin.html +8 -3
  201. package/dist/unrecognised-prompt.js +2 -2
  202. package/dist/unrecognised-prompt.js.map +1 -1
  203. package/dist/update-check.d.ts +31 -0
  204. package/dist/update-check.js +47 -0
  205. package/dist/update-check.js.map +1 -1
  206. package/dist/update-launch.d.ts +48 -1
  207. package/dist/update-launch.js +159 -5
  208. package/dist/update-launch.js.map +1 -1
  209. package/dist/usage/providers.d.ts +28 -8
  210. package/dist/usage/providers.js +96 -41
  211. package/dist/usage/providers.js.map +1 -1
  212. package/dist/view-api.js +26 -9
  213. package/dist/view-api.js.map +1 -1
  214. package/dist/web-api.d.ts +44 -2
  215. package/dist/web-api.js +265 -57
  216. package/dist/web-api.js.map +1 -1
  217. package/dist/web-chat-history.d.ts +26 -1
  218. package/dist/web-chat-history.js +47 -8
  219. package/dist/web-chat-history.js.map +1 -1
  220. package/dist/web-commands.d.ts +39 -3
  221. package/dist/web-commands.js +22 -5
  222. package/dist/web-commands.js.map +1 -1
  223. package/dist/web-login.d.ts +14 -0
  224. package/dist/web-login.js +4 -2
  225. package/dist/web-login.js.map +1 -1
  226. package/dist/web-prefs.d.ts +18 -0
  227. package/dist/web-prefs.js +36 -4
  228. package/dist/web-prefs.js.map +1 -1
  229. package/dist/web-profile.d.ts +32 -0
  230. package/dist/web-profile.js +132 -0
  231. package/dist/web-profile.js.map +1 -0
  232. package/dist/web-session.d.ts +14 -0
  233. package/dist/web-session.js +10 -0
  234. package/dist/web-session.js.map +1 -1
  235. package/dist/web-upload.d.ts +119 -4
  236. package/dist/web-upload.js +252 -39
  237. package/dist/web-upload.js.map +1 -1
  238. package/launcher/install-admission.cjs +61 -6
  239. package/package.json +3 -3
@@ -57,6 +57,8 @@ import { type LogAnswer, type LogQuery } from "./log-service.js";
57
57
  import { WebChatHistory } from "./web-chat-history.js";
58
58
  import { SeenUsers, type MentionNames, type MentionQuery } from "./web-mentions.js";
59
59
  import { WebPrefsStore } from "./web-prefs.js";
60
+ import { type WebAccount } from "./web-profile.js";
61
+ import type { WebPerson as WebPersonView } from "./web-api.js";
60
62
  import { ReplyButtonsController } from "./reply-buttons-controller.js";
61
63
  import { WebFileLedger } from "./web-upload.js";
62
64
  import { type CachedImage } from "./web-images.js";
@@ -359,6 +361,8 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
359
361
  /** In-flight /effort selections, same coordinator shape as pendingModelSelects. */
360
362
  private pendingEffortSelects;
361
363
  private pendingModelSelects;
364
+ /** #1806: in-flight /backend steps, keyed by nonce (see handleBackendSelection). */
365
+ private pendingBackendSelects;
362
366
  /** nonce → pending button prompt (hang restart, interactive assist, clean-exit restart). */
363
367
  private pendingNonceButtons;
364
368
  /** #1386 "Needs you": the list, its live chat messages and Acknowledge. Started with the fleet (finishStartup). */
@@ -435,7 +439,6 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
435
439
  private updateProgressTimer;
436
440
  private updateProgressEditRunning;
437
441
  private lastUpdateProgressText;
438
- private updateCompletionTipText;
439
442
  /**
440
443
  * #1660: an adopted update whose retire outcome is still owed. The
441
444
  * completion summary was (or will be) posted; this watch appends the
@@ -481,6 +484,34 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
481
484
  readonly seenUsers: SeenUsers;
482
485
  private webPrefsStore?;
483
486
  /** #1665: the web preferences kept on the host (<home>/web-prefs.json), read on first use. */
487
+ /**
488
+ * #1827: a web person as agents and chats see them. Signed in as an account (a sign-in code DMed to it): that
489
+ * account's user id — still `via web`, and only for recognition — and the name they chose, else their account's name
490
+ * at sign-in (made safe). Otherwise (an `agend web` session): "web-user", as before, under a name the operator may set.
491
+ * Names are checked again now: one an instance or bot has taken since reads as the next choice down.
492
+ */
493
+ webPerson(owner?: WebAccount): WebPersonView;
494
+ /** #1827: set (null: clear — back to their account's name) a web person's own name; validated in full. */
495
+ setWebPersonName(owner: WebAccount | undefined, raw: unknown): {
496
+ ok: true;
497
+ person: WebPersonView;
498
+ } | {
499
+ ok: false;
500
+ status: number;
501
+ error: string;
502
+ };
503
+ /** #1827 (auth-api): a sign-in as this account — its display name then is the web name it starts with. */
504
+ noteWebSignIn(account: {
505
+ adapterId: string;
506
+ userId: string;
507
+ username?: string;
508
+ }): void;
509
+ /**
510
+ * #1827: a name that belongs to something here — an instance (or ClassicBot room), its display name, a bot. On the web
511
+ * send path: it never throws (a lookup that fails reserves nothing; the name was checked in full when it was set).
512
+ */
513
+ private webNameReserved;
514
+ private webNameTaken;
484
515
  get webPrefs(): WebPrefsStore;
485
516
  /**
486
517
  * Read from disk on every access rather than cached at startup: `agend
@@ -543,6 +574,12 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
543
574
  */
544
575
  replyButtons(): ReplyButtonsController | null;
545
576
  private replyButtonsStore;
577
+ /**
578
+ * #1823: a closed poll's results go to its instance through the delivery outbox, as a system notice keyed by the
579
+ * poll: durable (held until the instance can take it) and admitted once, however often this is asked. Addressed to
580
+ * the poll's chat, so the instance's answer (the right option, the scores) goes there.
581
+ */
582
+ private admitPollResults;
546
583
  /**
547
584
  * #1266: who may answer a reply's buttons on a platform — whoever may message that instance there: in a ClassicBot
548
585
  * room anyone there (as a typed message), elsewhere someone the sending connection lets speak (#754/#1148), never a
@@ -818,12 +855,16 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
818
855
  /** #1218: the Log tab's on-demand service — made on first use; with `web.log_tab` off it answers off and does nothing. */
819
856
  private logService;
820
857
  private get log();
858
+ /** Board 003648ac: a web /compact followed to its end, from the transcript the Log reads (none: nothing to follow). */
859
+ private compactWatchService;
860
+ private get compactWatch();
821
861
  /** #1218: GET /ui/steps — an instance's steps, read on demand (null: no such instance). */
822
862
  logSteps(name: string, q: LogQuery): Promise<LogAnswer | null>;
823
863
  /**
824
864
  * #1218: where an instance's steps are read from, resolved only when its Log asks: the transcript its daemon follows
825
865
  * now; for claude-code, also the path its statusline last named (so a stopped instance's Log still shows its last
826
- * work). kiro comes with its own reader later in phase 1; other backends have no transcript AgEnD can read.
866
+ * work). kiro: fleet events with the reason its history is not read (kiro-log-gate.ts); other backends have no
867
+ * transcript AgEnD can read.
827
868
  */
828
869
  private logSource;
829
870
  classicRoomFor(name: string): {
@@ -900,7 +941,8 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
900
941
  * or a rebound adapter is never posted through a stale route. A copy
901
942
  * already in flight may still land late — the contract permits that.
902
943
  */
903
- sendClassicWebEcho(instance: string, text: string): Promise<number>;
944
+ /** `sender` (#1827): the web person's name, as the room log records them ("web-user" when none). */
945
+ sendClassicWebEcho(instance: string, text: string, sender?: string): Promise<number>;
904
946
  /**
905
947
  * #1666: a delivered web chat message starts the same cancel/progress lifecycle in the instance's topic as a platform
906
948
  * inbound (afterUserInboundDelivered): the same bubble, ticker and retire rules. Not its ✅ tracking — the web message
@@ -953,6 +995,12 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
953
995
  isFleetAdmin(userId: string, adapterId?: string): boolean;
954
996
  /** Whether this adapter has any fleet admin at all (an empty allowlist means the admin commands are off). */
955
997
  hasFleetAdmins(adapterId?: string): boolean;
998
+ /**
999
+ * Where this adapter's fleet-admin list is in fleet.yaml, as the operator wrote it, for the "disabled" replies:
1000
+ * `channel.access.allowed_users` (the single-channel form), else the `channels:` entry — by its `id:`, or its
1001
+ * `type:` when it has none. Read from the raw file: loading turns `channel:` into `channels` and fills in ids.
1002
+ */
1003
+ adminListKey(adapterId?: string): string;
956
1004
  /**
957
1005
  * The one question the privileged commands (/update, /doctor, /dashboard, /collab) ask: may THIS caller,
958
1006
  * through THIS adapter, run it. `disabled` is "nobody can" — an empty list — and is told apart from
@@ -1781,6 +1829,11 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
1781
1829
  saveFleetConfig(explicitPatches?: RawConfigPatch[]): void;
1782
1830
  /** Why the config written to `candidate` must not replace fleet.yaml, or null: it does not load, or it adds errors. */
1783
1831
  private savedFleetConfigProblem;
1832
+ /**
1833
+ * #1874 follow-up: the validator's warnings, once per start, in daemon.log — a setting fleet.yaml has that AgEnD
1834
+ * ignores (e.g. `web.access`) is otherwise silent unless someone runs `agend validate`.
1835
+ */
1836
+ private logConfigWarningsAtStartup;
1784
1837
  /** One-time upgrade migration; invalid YAML is never rewritten. */
1785
1838
  private slimFleetConfigAtStartup;
1786
1839
  private writeFleetConfigBackup;
@@ -1864,9 +1917,13 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
1864
1917
  private webImageCaches;
1865
1918
  private webImageCache;
1866
1919
  /**
1867
- * instance → the connection that is its own bot: configured now (a connection removed from fleet.yaml is nobody's,
1868
- * whatever an instance still names — #1635 review), not the primary, and answering for it alone.
1920
+ * The bots instances and ClassicBot rooms speak through, by connections configured now (a connection removed from
1921
+ * fleet.yaml is nobody's, whatever an instance still names — #1635 review). `own`: instance → its own bot (answering
1922
+ * for it alone; the primary too, when it serves one instance only). `speaking` (#1867): instance → the bot it speaks through — its own, a shared one,
1923
+ * or, with none configured for it, the primary.
1869
1924
  */
1925
+ private webBots;
1926
+ /** instance → the connection that is its own bot (see webBots). */
1870
1927
  private ownBots;
1871
1928
  /**
1872
1929
  * The bot a connection is now: its running adapter and that bot's own user id. Everything cached for an own bot is
@@ -1882,9 +1939,15 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
1882
1939
  private webAccent;
1883
1940
  /** The cache key of an own bot's avatar, and its loader (which refuses an answer from a bot no longer there). */
1884
1941
  private botAvatarSource;
1885
- /** One instance's avatar and ring for the status frame. Synchronous: what is cached now; fetches run behind. */
1942
+ /**
1943
+ * One instance's avatar and ring for the status frame. Synchronous: what is cached now; fetches run behind. The bot
1944
+ * is its own, else the one it speaks through (#1867) — one cache entry per bot, so a shared bot is fetched once.
1945
+ */
1886
1946
  private webIdentityImage;
1887
- /** GET /ui/img/bot|avatar/<key>: what is cached, never a fetch. Only an own-bot connection, or a known instance's upload. */
1947
+ /**
1948
+ * GET /ui/img/bot|avatar/<key>: what is cached, never a fetch. Only a connection some instance or room speaks
1949
+ * through (#1867), or a known instance's upload.
1950
+ */
1888
1951
  webImage(kind: "bot" | "avatar", key: string): CachedImage | null;
1889
1952
  /**
1890
1953
  * #1682 GET /ui/mentions: names for the mention ids a page found in what it rendered — never a Discord request; in order:
@@ -2255,10 +2318,26 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2255
2318
  * The caller has passed the /ui gate (session, same origin, CSRF). Here: the prompt must be one offered
2256
2319
  * on the dashboard, about the instance the page named, and the action one of its own buttons.
2257
2320
  */
2258
- /** #1266: a click on a reply's button in the web chat (the /ui gate is passed: a session, or the public link). */
2259
- clickWebReplyButton(instance: string, id: string, index: number): Promise<{
2321
+ /** #1823: close_poll — `instance` closes one of its own polls before the deadline. */
2322
+ closePollEarly(instance: string, id: string): Promise<{
2323
+ ok: true;
2324
+ voted: number;
2325
+ } | {
2326
+ ok: false;
2327
+ error: string;
2328
+ }>;
2329
+ /**
2330
+ * #1266: a click on a reply's button in the web chat (the /ui gate is passed: a session, or the public link). On a
2331
+ * poll (#1823) it is `voter`'s vote: the page's session.
2332
+ */
2333
+ clickWebReplyButton(instance: string, id: string, index: number, voter?: {
2334
+ key: string;
2335
+ userId: string;
2336
+ name: string;
2337
+ }): Promise<{
2260
2338
  status: 200 | 400 | 403 | 409;
2261
2339
  error?: string;
2340
+ options?: number[];
2262
2341
  }>;
2263
2342
  clickWebPrompt(instance: string, nonce: string, action: string): Promise<{
2264
2343
  status: 200 | 400 | 403 | 409;
@@ -2288,6 +2367,8 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2288
2367
  * synchronous; they never probe the pane.
2289
2368
  */
2290
2369
  private clearTargetFence;
2370
+ /** #1806: the web's /backend confirmations — one per question, used once, for the arguments and backend asked about. */
2371
+ private readonly webBackendTokens;
2291
2372
  /** #1269: the web's /clear confirmations — one token per question, used once, for the instance as it was asked about. */
2292
2373
  private readonly webClearTokens;
2293
2374
  /** #1269: an instance's chat command from the web chat (web-commands.ts); `publicLink`: a gateway request. */
@@ -2298,6 +2379,7 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2298
2379
  confirm?: string;
2299
2380
  }, opts: {
2300
2381
  publicLink: boolean;
2382
+ person?: Pick<WebPersonView, "userId" | "name">;
2301
2383
  }): Promise<WebCommandResult>;
2302
2384
  /** Consume `/clear` Confirm/Cancel exactly once; only Confirm reaches IPC. */
2303
2385
  private handleClearConfirmation;
@@ -2640,9 +2722,9 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2640
2722
  * The absolute path a fresh login shell resolves `binary` to, or null. Only
2641
2723
  * a real executable file counts: `command -v` also answers with an alias
2642
2724
  * definition or a function name, neither of which a spawn could run.
2725
+ * Async (runOnLoginShell): a login file that backgrounds a process holding the shell's output once froze the fleet loop here.
2643
2726
  */
2644
2727
  private locateBinaryOnLoginShell;
2645
- private locateBinaryOnLoginShellSync;
2646
2728
  /**
2647
2729
  * #1092: the binary in one of the directories its own installer installs to,
2648
2730
  * when no login shell can see it (the installer recorded its PATH in an
@@ -2902,6 +2984,8 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2902
2984
  effortStrategyFor(instanceName: string): "runtime" | "restart" | "unsupported";
2903
2985
  /** Effort levels this instance's backend actually accepts (empty = unsupported). */
2904
2986
  effortLevelsFor(instanceName: string): string[];
2987
+ /** The instance's backend's effort metadata; agy's levels are its model's (#1825), the one the instance runs. */
2988
+ private instanceEffortMetadata;
2905
2989
  /** Configured effort for an instance: per-instance, else fleet default, else none. */
2906
2990
  resolveInstanceEffort(instanceName: string): {
2907
2991
  effort: string | null;
@@ -2935,6 +3019,72 @@ export declare class FleetManager implements FleetContext, LifecycleContext, Arc
2935
3019
  * a switch saves the round trip of asking. Empty when the backend has none.
2936
3020
  */
2937
3021
  private effortSuffix;
3022
+ /** The steps' view of this fleet (backend-command.ts). `live`: a missing or stale model list may be probed (not on the web). */
3023
+ private backendCommandDeps;
3024
+ /**
3025
+ * `/effort`'s levels for a backend this instance may move to, for the model that will run there (codex's levels are
3026
+ * per model; null: its configured default). Empty: it has no effort setting. A file read, never a CLI.
3027
+ */
3028
+ backendEffortLevels(instanceName: string, backend: string, model?: string | null): string[];
3029
+ /**
3030
+ * #1808: whether a backend takes this model name — the one rule for /backend and update_instance_config's switch.
3031
+ * The name must be one its launch line can carry (modelNameCarried); then its offered list (the cached CLI env), and
3032
+ * claude-code's known names (without this instance's configured model, which belongs to the backend being left).
3033
+ * With no list known, the backend's usual name pattern decides.
3034
+ */
3035
+ backendModelVerdict(instanceName: string, backend: string, model: string,
3036
+ /** The provider the backend will run on (default: this instance's own, else the fleet's). */
3037
+ opts?: {
3038
+ provider: string | null;
3039
+ }): {
3040
+ ok: true;
3041
+ } | {
3042
+ ok: false;
3043
+ choices: string[];
3044
+ };
3045
+ /**
3046
+ * #1807 review r2: the model codex's next launch of this instance runs. Every launch's writeConfig copies the SHARED
3047
+ * config.toml into the instance's codex home first, so that source decides — not the home's copy from an earlier
3048
+ * launch. Read-only; a model chosen here (`-c model=…`) outranks it; a project file that could change it, unproven.
3049
+ */
3050
+ private prospectiveCodexModel;
3051
+ /** #1811: whether a launch of `backend` here would pass a level: the same gate its builder applies. */
3052
+ private launchEffortGate;
3053
+ /** Installed the way the launch finds a CLI (resolveBinary): on PATH or in a known install directory. */
3054
+ private backendInstalledHere;
3055
+ /** The models `/model` would offer on a backend: the cached CLI env, else (live) a bounded probe. Never throws. */
3056
+ private backendModelOptions;
3057
+ /**
3058
+ * #1806 review: the instance a `/backend` was asked about is still this config entry — not one deleted and created
3059
+ * again under the same name, or replaced by a Settings edit (both put a new object there), stopped or not.
3060
+ */
3061
+ private backendTargetIs;
3062
+ /** `/backend` is for fleet.yaml instances: update_instance_config does not manage a ClassicBot agent. */
3063
+ private backendCommandRefusal;
3064
+ /**
3065
+ * Apply a confirmed `/backend`: judged again first (a menu lives a minute — the backend may have moved, a CLI been
3066
+ * removed), then update_instance_config's write: backend, model and effort at once, refused and rolled back whole
3067
+ * (its credential-profile login gate included), then one fresh relaunch of a running instance.
3068
+ */
3069
+ applyBackendSwitch(instanceName: string, args: readonly string[], from: string, stillCurrent: () => boolean): Promise<string>;
3070
+ /** A step's buttons: index callbacks (a model id can be longer than Telegram's 64-byte callback data allows). */
3071
+ private backendStepButtons;
3072
+ /**
3073
+ * Show a `/backend` step (a choice, or the confirmation) where the command was given: Discord edits its interaction
3074
+ * reply; Telegram retires the previous step's keyboard and posts the next. One pending entry per step, under a fresh
3075
+ * nonce: a click on an older step finds nothing.
3076
+ */
3077
+ private presentBackendStep;
3078
+ /** Close a `/backend` menu with a last word: its buttons go (Telegram edits them away), the text stays. Returns where it was said. */
3079
+ private endBackendMenu;
3080
+ /** Start `/backend` for a fleet instance from Discord or Telegram; the caller has checked the channel admin. */
3081
+ private beginBackendCommand;
3082
+ /** `/backend` slash handler: channel admin, as `/model`. Options or typed text give the direct form. */
3083
+ private handleBackendSlash;
3084
+ /** Telegram `/backend` in a fleet topic (topic-commands) or a ClassicBot chat; the caller has checked the admin. */
3085
+ runBackendCommand(instanceName: string, text: string, userId: string, channelId: string, adapter: ChannelAdapter, chatId: string, threadId?: string, adapterId?: string): Promise<void>;
3086
+ /** Consume a `/backend` click: the next step, or on the confirmation the switch itself. True for every backend-select id. */
3087
+ private handleBackendSelection;
2938
3088
  /** Read recent chat log for agent context */
2939
3089
  private getRecentChatLog;
2940
3090
  /**