@songsid/agend 2.2.0-beta.10 → 2.2.0-beta.12

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 (105) hide show
  1. package/dist/agent-endpoint.js +3 -0
  2. package/dist/agent-endpoint.js.map +1 -1
  3. package/dist/agent-whats-new.js +4 -0
  4. package/dist/agent-whats-new.js.map +1 -1
  5. package/dist/auth-api.d.ts +3 -1
  6. package/dist/auth-api.js +15 -1
  7. package/dist/auth-api.js.map +1 -1
  8. package/dist/backend/antigravity.d.ts +5 -0
  9. package/dist/backend/antigravity.js +27 -13
  10. package/dist/backend/antigravity.js.map +1 -1
  11. package/dist/backend/effort-metadata.d.ts +36 -0
  12. package/dist/backend/effort-metadata.js +83 -13
  13. package/dist/backend/effort-metadata.js.map +1 -1
  14. package/dist/backend/launch-effort.d.ts +29 -1
  15. package/dist/backend/launch-effort.js +53 -6
  16. package/dist/backend/launch-effort.js.map +1 -1
  17. package/dist/backend/types.d.ts +14 -0
  18. package/dist/backend/types.js +10 -0
  19. package/dist/backend/types.js.map +1 -1
  20. package/dist/channel/adapters/discord.d.ts +12 -0
  21. package/dist/channel/adapters/discord.js +39 -2
  22. package/dist/channel/adapters/discord.js.map +1 -1
  23. package/dist/channel/adapters/telegram.d.ts +18 -0
  24. package/dist/channel/adapters/telegram.js +24 -3
  25. package/dist/channel/adapters/telegram.js.map +1 -1
  26. package/dist/channel/mcp-tools.js +2 -0
  27. package/dist/channel/mcp-tools.js.map +1 -1
  28. package/dist/channel/tool-router.d.ts +2 -0
  29. package/dist/channel/tool-router.js +1 -1
  30. package/dist/channel/tool-router.js.map +1 -1
  31. package/dist/channel/types.d.ts +16 -0
  32. package/dist/cli.js +34 -11
  33. package/dist/cli.js.map +1 -1
  34. package/dist/daemon.js +9 -0
  35. package/dist/daemon.js.map +1 -1
  36. package/dist/delivery-outbox.d.ts +8 -1
  37. package/dist/delivery-outbox.js +6 -2
  38. package/dist/delivery-outbox.js.map +1 -1
  39. package/dist/fleet-manager.d.ts +59 -3
  40. package/dist/fleet-manager.js +157 -22
  41. package/dist/fleet-manager.js.map +1 -1
  42. package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
  43. package/dist/instructions.js +2 -2
  44. package/dist/instructions.js.map +1 -1
  45. package/dist/locale.js +26 -0
  46. package/dist/locale.js.map +1 -1
  47. package/dist/outbound-handlers.js +21 -1
  48. package/dist/outbound-handlers.js.map +1 -1
  49. package/dist/outbound-schemas.d.ts +12 -0
  50. package/dist/outbound-schemas.js +12 -1
  51. package/dist/outbound-schemas.js.map +1 -1
  52. package/dist/public-web-gateway.js +3 -0
  53. package/dist/public-web-gateway.js.map +1 -1
  54. package/dist/reply-buttons-controller.d.ts +86 -5
  55. package/dist/reply-buttons-controller.js +271 -7
  56. package/dist/reply-buttons-controller.js.map +1 -1
  57. package/dist/reply-buttons.d.ts +48 -3
  58. package/dist/reply-buttons.js +105 -10
  59. package/dist/reply-buttons.js.map +1 -1
  60. package/dist/reply-polls.d.ts +85 -0
  61. package/dist/reply-polls.js +154 -0
  62. package/dist/reply-polls.js.map +1 -0
  63. package/dist/tool-permissions.js +3 -3
  64. package/dist/tool-permissions.js.map +1 -1
  65. package/dist/topic-commands.js +9 -4
  66. package/dist/topic-commands.js.map +1 -1
  67. package/dist/ui/chat-render.js +19 -2
  68. package/dist/ui/chat-store.js +35 -1
  69. package/dist/ui/chat-strings.js +2 -0
  70. package/dist/ui/chat-thread.js +42 -0
  71. package/dist/ui/panel-chat.js +2 -0
  72. package/dist/ui/panel-log.js +2 -2
  73. package/dist/ui/panel-settings.js +48 -1
  74. package/dist/ui/settings-strings.js +10 -0
  75. package/dist/ui/shared/app-i18n.js +1 -1
  76. package/dist/ui/shared/app-stream.js +4 -1
  77. package/dist/ui/shared/app.css +28 -5
  78. package/dist/ui/shared/header-tools.js +12 -4
  79. package/dist/ui/shared/instance-switch.js +5 -2
  80. package/dist/ui/shared/view-strings.js +2 -2
  81. package/dist/update-check.d.ts +31 -0
  82. package/dist/update-check.js +47 -0
  83. package/dist/update-check.js.map +1 -1
  84. package/dist/update-launch.d.ts +46 -1
  85. package/dist/update-launch.js +146 -3
  86. package/dist/update-launch.js.map +1 -1
  87. package/dist/web-api.d.ts +40 -2
  88. package/dist/web-api.js +130 -14
  89. package/dist/web-api.js.map +1 -1
  90. package/dist/web-chat-history.d.ts +12 -1
  91. package/dist/web-chat-history.js +29 -7
  92. package/dist/web-chat-history.js.map +1 -1
  93. package/dist/web-login.d.ts +14 -0
  94. package/dist/web-login.js +4 -2
  95. package/dist/web-login.js.map +1 -1
  96. package/dist/web-prefs.d.ts +18 -0
  97. package/dist/web-prefs.js +36 -4
  98. package/dist/web-prefs.js.map +1 -1
  99. package/dist/web-profile.d.ts +32 -0
  100. package/dist/web-profile.js +132 -0
  101. package/dist/web-profile.js.map +1 -0
  102. package/dist/web-session.d.ts +14 -0
  103. package/dist/web-session.js +10 -0
  104. package/dist/web-session.js.map +1 -1
  105. package/package.json +1 -1
@@ -2,7 +2,7 @@ import { codexMetadataHomes, readCodexEffortLevels } from "./codex-metadata.js";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { getAgendHome } from "../paths.js";
5
- import { CLI_ENV_TTL_MS } from "./types.js";
5
+ import { CLI_ENV_TTL_MS, cliBinaryIdentity } from "./types.js";
6
6
  /** Capability data shared with backend getters; resolving it never launches a CLI. */
7
7
  export const EFFORT_CAPABILITIES = {
8
8
  "claude-code": { strategy: "runtime", levels: ["low", "medium", "high", "xhigh", "max"] },
@@ -19,8 +19,9 @@ export function readEffortMetadata(backend, instanceDir, model) {
19
19
  return { strategy: EFFORT_CAPABILITIES.codex.strategy, levels: readCodexEffortLevels({ ...codexMetadataHomes(instanceDir), model: model ?? null }) };
20
20
  }
21
21
  if (backend === "antigravity") {
22
- // From the binary's own --help, via the CLI env probe's cache (agyEffortLevels); three levels until then.
23
- return { strategy: EFFORT_CAPABILITIES.antigravity.strategy, levels: agyEffortLevels() };
22
+ // The model's own levels (#1825: one catalog model per level) that the binary's --help takes, via the CLI env
23
+ // probe's cache; three levels until then.
24
+ return { strategy: EFFORT_CAPABILITIES.antigravity.strategy, levels: agyModelEffortLevels(model ?? null) };
24
25
  }
25
26
  if (!Object.hasOwn(EFFORT_CAPABILITIES, backend))
26
27
  return { strategy: "unsupported", levels: [] };
@@ -30,22 +31,91 @@ export function readEffortMetadata(backend, instanceDir, model) {
30
31
  /** The effort levels agy accepts when its `--help` does not list them (agy before 1.3, or an unreadable help). */
31
32
  export const AGY_FALLBACK_EFFORT_LEVELS = ["low", "medium", "high"];
32
33
  export const CANONICAL_EFFORT = ["low", "medium", "high", "xhigh", "max"];
34
+ /**
35
+ * Valid: within the CLI env TTL, or — past it — while the binary the probe ran is the one installed: the file it
36
+ * recorded (`binary`) is still at `binaryPath` (default: its own path) with the same size and mtime (#1825 review: the
37
+ * fleet probes only at start, in the background, so a fleet up for a day, or one cold-started after a day, would
38
+ * otherwise launch without the catalog). A stat, never a CLI run.
39
+ */
40
+ export function readAgyCliEnv(agendHome = getAgendHome(), binaryPath) {
41
+ try {
42
+ const env = JSON.parse(readFileSync(join(agendHome, "cli-env", "antigravity.json"), "utf-8"));
43
+ if (typeof env?.probedAt !== "number")
44
+ return null;
45
+ if (Date.now() - env.probedAt >= CLI_ENV_TTL_MS && !sameBinary(env.binary, binaryPath))
46
+ return null;
47
+ const models = Array.isArray(env.models)
48
+ ? env.models.filter((m) => typeof m?.id === "string" && typeof m?.label === "string")
49
+ : [];
50
+ return {
51
+ models,
52
+ currentModel: typeof env.currentModel === "string" && env.currentModel.trim() ? env.currentModel.trim() : null,
53
+ effortLevels: Array.isArray(env.effortLevels) ? env.effortLevels : null,
54
+ };
55
+ }
56
+ catch {
57
+ return null;
58
+ } // no probe yet, or unreadable
59
+ }
60
+ /** Whether the recorded binary is the file now at `binaryPath` (default: the recorded path): same size and mtime. */
61
+ function sameBinary(recorded, binaryPath) {
62
+ const r = recorded;
63
+ if (!r || typeof r.path !== "string" || typeof r.size !== "number" || typeof r.mtimeMs !== "number")
64
+ return false;
65
+ if (binaryPath !== undefined && binaryPath !== r.path)
66
+ return false;
67
+ const now = cliBinaryIdentity(r.path);
68
+ return now !== null && now.size === r.size && now.mtimeMs === r.mtimeMs;
69
+ }
33
70
  /**
34
71
  * The effort levels the installed agy takes: the `effortLevels` the CLI env probe read from its `--help` and cached
35
72
  * in `<AGEND_HOME>/cli-env/antigravity.json` (#1328), else the fallback. The cache counts only while it is valid
36
73
  * (CLI_ENV_TTL_MS, the same bound the fleet's own reader uses). A pure file read; never runs the CLI.
37
74
  */
38
75
  export function agyEffortLevels(agendHome = getAgendHome()) {
39
- try {
40
- const env = JSON.parse(readFileSync(join(agendHome, "cli-env", "antigravity.json"), "utf-8"));
41
- const valid = typeof env.probedAt === "number" && Date.now() - env.probedAt < CLI_ENV_TTL_MS;
42
- const levels = valid && Array.isArray(env.effortLevels)
43
- ? CANONICAL_EFFORT.filter(level => env.effortLevels.includes(level))
44
- : [];
45
- if (levels.length > 0)
46
- return levels;
76
+ const listed = readAgyCliEnv(agendHome)?.effortLevels ?? [];
77
+ const levels = CANONICAL_EFFORT.filter(level => listed.includes(level));
78
+ return levels.length > 0 ? levels : [...AGY_FALLBACK_EFFORT_LEVELS];
79
+ }
80
+ /**
81
+ * #1825: agy's catalog (`agy models`) has one model per effort level — `gemini-3.8-flash-high` "Gemini 3.8 Flash
82
+ * (High)", `…-medium`, `…-low` — and its /model picker shows them as one base with an Effort gauge. A model's family:
83
+ * its base slug and the catalog's variants of it by level. `name` may be a variant's slug, its label (what agy's
84
+ * settings.json and older configs hold), or the base slug itself. Null when the catalog has no variant of it (a model
85
+ * with no levels, or one it does not list).
86
+ */
87
+ export function agyModelFamily(name, catalog) {
88
+ const variant = (id) => {
89
+ const at = id.lastIndexOf("-");
90
+ return at > 0 && CANONICAL_EFFORT.includes(id.slice(at + 1)) ? { base: id.slice(0, at), level: id.slice(at + 1) } : null;
91
+ };
92
+ const entry = catalog.find(m => m.id === name) ?? catalog.find(m => m.label === name);
93
+ const base = entry ? variant(entry.id)?.base : name;
94
+ if (!base)
95
+ return null;
96
+ const variants = new Map();
97
+ for (const level of CANONICAL_EFFORT) {
98
+ const id = catalog.find(m => m.id === `${base}-${level}`)?.id;
99
+ if (id)
100
+ variants.set(level, id);
47
101
  }
48
- catch { /* no probe yet, or unreadable */ }
49
- return [...AGY_FALLBACK_EFFORT_LEVELS];
102
+ return variants.size > 0 ? { base, variants } : null;
103
+ }
104
+ /**
105
+ * The levels agy offers for `model` (else the model agy's settings select, as the probe cached it): its family's
106
+ * levels this binary takes. A model the catalog lists without levels has none; with no catalog, or a model it does
107
+ * not list, the binary's levels (agyEffortLevels), as before.
108
+ */
109
+ export function agyModelEffortLevels(model, agendHome = getAgendHome()) {
110
+ const env = readAgyCliEnv(agendHome);
111
+ const takes = agyEffortLevels(agendHome);
112
+ const name = model ?? env?.currentModel ?? null;
113
+ if (!env || !name)
114
+ return takes;
115
+ const family = agyModelFamily(name, env.models);
116
+ if (family)
117
+ return takes.filter(level => family.variants.has(level));
118
+ const listed = env.models.some(m => m.id === name || m.label === name);
119
+ return listed ? [] : takes;
50
120
  }
51
121
  //# sourceMappingURL=effort-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"effort-metadata.js","sourceRoot":"","sources":["../../src/backend/effort-metadata.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"effort-metadata.js","sourceRoot":"","sources":["../../src/backend/effort-metadata.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
1
- /** What a launch does with a configured effort: the argument to append (with its leading space), or why none. */
1
+ /** What a launch does with a configured effort: the argument to append (with its leading space) and its level, or why none. */
2
2
  export interface LaunchEffort {
3
3
  arg: string | null;
4
4
  note: string | null;
5
+ level?: string;
5
6
  }
6
7
  export type HelpRunner = (binary: string, args: string[]) => string;
8
+ /**
9
+ * A CLI's help text: its stdout, or its stderr when stdout is empty — agy (a Go CLI) prints its usage to stderr
10
+ * (#1825: 1.3.4 and 1.3.5 write nothing to stdout, so reading stdout alone saw no `--effort` at all). Throws when the
11
+ * CLI cannot run or exits non-zero.
12
+ */
13
+ export declare function readHelpText(binary: string, args?: string[]): string;
7
14
  /** The binary's `--help`, read once per binary file; null when it cannot be read (then no flag is passed). */
8
15
  export declare function cliHelp(binaryPath: string, run?: HelpRunner): string | null;
9
16
  /** For tests: forget what was read. */
@@ -22,6 +29,27 @@ export declare function helpOption(help: string, flag: string): {
22
29
  * lists it and the level is one it takes.
23
30
  */
24
31
  export declare function flagEffort(backend: "claude-code" | "grok" | "antigravity", effort: string | undefined, binaryPath: string, run?: HelpRunner): LaunchEffort;
32
+ /** agy's model and effort for one launch: `--model` (absent: none), `--effort` (null: none), and why, quietly. */
33
+ export interface AgyLaunch {
34
+ model: string | undefined;
35
+ effort: string | null;
36
+ note: string | null;
37
+ }
38
+ /**
39
+ * #1825: agy's catalog has one model per effort level (`gemini-3.8-flash-medium`, `…-high`, …), and agy 1.3.4/1.3.5
40
+ * resolve `--model` and `--effort` together: a variant with another level ("conflicts with --effort=high"), a label
41
+ * with any `--effort`, a level the model does not have, or a model it does not list each make agy run ANOTHER model,
42
+ * with only a warning row in the pane (verified offline against the real binaries). So the effort picks the exact
43
+ * variant — `gemini-3.8-flash-medium` + high launches `--model gemini-3.8-flash-high`, no `--effort` — and anything
44
+ * else launches the configured model without `--effort`. `--model` alone (a variant's slug or its label) and a bare
45
+ * `--effort` on agy's own model are what agy resolves exactly. fleet.yaml is never rewritten; the note says what ran.
46
+ *
47
+ * `catalog`/`current`: the CLI env probe's cached `agy models` and settings model (null: none cached).
48
+ */
49
+ export declare function resolveAgyLaunch(model: string | undefined, level: string | null, catalog: readonly {
50
+ id: string;
51
+ label: string;
52
+ }[] | null, current?: string | null): AgyLaunch;
25
53
  /**
26
54
  * codex: `-c model_reasoning_effort="<level>"` when the model's own catalog entry lists the level. `-c` is in every
27
55
  * codex AgEnD runs; what it does not check is the value, so the catalog is the gate.
@@ -13,15 +13,26 @@
13
13
  * notice. A resumed session gets the flag too (verified: claude `--continue`/`--resume` with `--effort`, codex
14
14
  * `resume <id>` with `-c`). The runtime `/effort` paste is unchanged.
15
15
  */
16
- import { execFileSync } from "node:child_process";
16
+ import { spawnSync } from "node:child_process";
17
17
  import { statSync } from "node:fs";
18
18
  import { measureSyncWork } from "../sync-work-attribution.js";
19
- import { EFFORT_CAPABILITIES, CANONICAL_EFFORT } from "./effort-metadata.js";
19
+ import { EFFORT_CAPABILITIES, CANONICAL_EFFORT, agyModelFamily } from "./effort-metadata.js";
20
20
  import { t } from "../locale.js";
21
21
  import { shellQuote } from "./types.js";
22
- const defaultRun = (binary, args) => execFileSync(binary, args, {
23
- encoding: "utf-8", timeout: 5000, stdio: ["ignore", "pipe", "pipe"],
24
- });
22
+ /**
23
+ * A CLI's help text: its stdout, or its stderr when stdout is empty — agy (a Go CLI) prints its usage to stderr
24
+ * (#1825: 1.3.4 and 1.3.5 write nothing to stdout, so reading stdout alone saw no `--effort` at all). Throws when the
25
+ * CLI cannot run or exits non-zero.
26
+ */
27
+ export function readHelpText(binary, args = ["--help"]) {
28
+ const run = spawnSync(binary, args, { encoding: "utf-8", timeout: 5000, stdio: ["ignore", "pipe", "pipe"] });
29
+ if (run.error)
30
+ throw run.error;
31
+ if (run.status !== 0)
32
+ throw new Error(`${binary} ${args.join(" ")} exited ${run.status ?? run.signal}`);
33
+ return run.stdout || run.stderr;
34
+ }
35
+ const defaultRun = (binary, args) => readHelpText(binary, args);
25
36
  /** `--help` per binary FILE: the path and what is there (size, mtime) — an update gives a new answer. */
26
37
  const helpCache = new Map();
27
38
  /** The binary's `--help`, read once per binary file; null when it cannot be read (then no flag is passed). */
@@ -100,7 +111,43 @@ export function flagEffort(backend, effort, binaryPath, run) {
100
111
  return skip(backend, level, t("effort.launch_no_levels", flag));
101
112
  if (!levels.includes(level))
102
113
  return skip(backend, level, t("effort.launch_level_not_offered", levels.join(", ")));
103
- return { arg: ` ${flag} ${level}`, note: null };
114
+ return { arg: ` ${flag} ${level}`, note: null, level };
115
+ }
116
+ /**
117
+ * #1825: agy's catalog has one model per effort level (`gemini-3.8-flash-medium`, `…-high`, …), and agy 1.3.4/1.3.5
118
+ * resolve `--model` and `--effort` together: a variant with another level ("conflicts with --effort=high"), a label
119
+ * with any `--effort`, a level the model does not have, or a model it does not list each make agy run ANOTHER model,
120
+ * with only a warning row in the pane (verified offline against the real binaries). So the effort picks the exact
121
+ * variant — `gemini-3.8-flash-medium` + high launches `--model gemini-3.8-flash-high`, no `--effort` — and anything
122
+ * else launches the configured model without `--effort`. `--model` alone (a variant's slug or its label) and a bare
123
+ * `--effort` on agy's own model are what agy resolves exactly. fleet.yaml is never rewritten; the note says what ran.
124
+ *
125
+ * `catalog`/`current`: the CLI env probe's cached `agy models` and settings model (null: none cached).
126
+ */
127
+ export function resolveAgyLaunch(model, level, catalog, current = null) {
128
+ if (!level)
129
+ return { model, effort: null, note: null };
130
+ const skipped = (why) => ({ model, effort: null, note: t("effort.launch_skipped", level, "antigravity", why) });
131
+ const listed = (name) => !!catalog?.some(m => m.id === name || m.label === name);
132
+ if (!model) {
133
+ // A bare --effort applies to agy's own model; one it knows to lack the level would make agy run another.
134
+ const family = current && catalog ? agyModelFamily(current, catalog) : null;
135
+ if (family && !family.variants.has(level)) {
136
+ return skipped(t("effort.launch_level_not_offered", [...family.variants.keys()].join(", ")));
137
+ }
138
+ if (!family && current && listed(current))
139
+ return skipped(t("effort.launch_agy_model_no_levels", current));
140
+ return { model, effort: level, note: null };
141
+ }
142
+ if (!catalog?.length)
143
+ return skipped(t("effort.launch_agy_no_catalog", model));
144
+ const family = agyModelFamily(model, catalog);
145
+ if (!family)
146
+ return skipped(t(listed(model) ? "effort.launch_agy_model_no_levels" : "effort.launch_agy_model_not_listed", model));
147
+ const variant = family.variants.get(level);
148
+ if (!variant)
149
+ return skipped(t("effort.launch_level_not_offered", [...family.variants.keys()].join(", ")));
150
+ return { model: variant, effort: null, note: variant === model ? null : t("effort.launch_agy_variant", level, variant, model) };
104
151
  }
105
152
  /**
106
153
  * codex: `-c model_reasoning_effort="<level>"` when the model's own catalog entry lists the level. `-c` is in every
@@ -1 +1 @@
1
- {"version":3,"file":"launch-effort.js","sourceRoot":"","sources":["../../src/backend/launch-effort.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch-effort.js","sourceRoot":"","sources":["../../src/backend/launch-effort.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAOxC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAAiB,CAAC,QAAQ,CAAC;IACtE,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7G,IAAI,GAAG,CAAC,KAAK;QAAE,MAAM,GAAG,CAAC,KAAK,CAAC;IAC/B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAe,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE5E,yGAAyG;AACzG,MAAM,SAAS,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEnD,8GAA8G;AAC9G,MAAM,UAAU,OAAO,CAAC,UAAkB,EAAE,MAAkB,UAAU;IACtE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QAChC,GAAG,GAAG,GAAG,UAAU,SAAS,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC,CAAyC,0CAA0C;IAC3G,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;IACnD,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,CAAC;QAAC,IAAI,GAAG,eAAe,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC;IAAC,CAAC;IAC/G,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,iBAAiB,KAAW,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAEhE;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,sBAAsB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7H,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,EAAE,CAAE,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,CAA4B,kBAAkB;QACnF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,iFAAiF;AACjF,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,MAAc,EAAE,GAAW,EAAgB,EAAE,CAC1E,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,uBAAuB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,OAA+C,EAAE,MAA0B,EAAE,UAAkB,EAAE,GAAgB;IAEjH,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC;IAClF,6FAA6F;IAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnG,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClH,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzD,CAAC;AAKD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAyB,EAAE,KAAoB,EAC/C,OAAwD,EAAE,UAAyB,IAAI;IAEvF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,OAAO,GAAG,CAAC,GAAW,EAAa,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnI,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IACzF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,yGAAyG;QACzG,MAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC,CAAC,CAAC,iCAAiC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3G,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClI,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,iCAAiC,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3G,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;AAClI,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,MAA0B,EAAE,OAA8E;IAE1G,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtG,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAC3F,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,mCAAmC,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/G,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,iCAAiC,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClI,OAAO,EAAE,GAAG,EAAE,OAAO,UAAU,CAAC,2BAA2B,KAAK,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvF,CAAC"}
@@ -182,9 +182,22 @@ export interface CliEnv {
182
182
  * read and lists none (the fallback applies); absent: the help could not be read.
183
183
  */
184
184
  effortLevels?: string[];
185
+ /**
186
+ * The binary file the probe ran (antigravity, #1825): what is at `path`, by size and mtime. While that same file is
187
+ * installed, its catalog and levels still describe it past the TTL — the launch and /effort read them by it.
188
+ */
189
+ binary?: CliBinaryIdentity;
185
190
  /** Epoch ms the probe ran (drives the cache TTL). */
186
191
  probedAt: number;
187
192
  }
193
+ /** A binary file, as `stat` sees it (no CLI runs): its path, size and mtime. */
194
+ export interface CliBinaryIdentity {
195
+ path: string;
196
+ size: number;
197
+ mtimeMs: number;
198
+ }
199
+ /** The identity of the file at `path`, or null when it cannot be stat'ed. */
200
+ export declare function cliBinaryIdentity(path: string): CliBinaryIdentity | null;
188
201
  /** Backends whose installed CLI versions are surfaced by `/sysinfo`. */
189
202
  export declare const SYSINFO_BACKEND_IDS: readonly ["claude-code", "codex", "kiro-cli", "grok", "antigravity", "muse"];
190
203
  export type SysInfoBackendId = typeof SYSINFO_BACKEND_IDS[number];
@@ -754,6 +767,7 @@ export interface CliBackend {
754
767
  currentModel?: string;
755
768
  models: ModelOption[];
756
769
  effortLevels?: string[];
770
+ binary?: CliBinaryIdentity;
757
771
  }>;
758
772
  /**
759
773
  * Ask the CLI to refresh its OWN model catalog before the next probe reads it.
@@ -18,6 +18,16 @@ export class UnsupportedCliError extends Error {
18
18
  }
19
19
  /** How long a cached CLI env (`<AGEND_HOME>/cli-env/<backend>.json`) is valid; after that nothing may read it. */
20
20
  export const CLI_ENV_TTL_MS = 24 * 60 * 60 * 1000;
21
+ /** The identity of the file at `path`, or null when it cannot be stat'ed. */
22
+ export function cliBinaryIdentity(path) {
23
+ try {
24
+ const st = statSync(path);
25
+ return st.isFile() ? { path, size: st.size, mtimeMs: st.mtimeMs } : null;
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
21
31
  /** Backends whose installed CLI versions are surfaced by `/sysinfo`. */
22
32
  export const SYSINFO_BACKEND_IDS = ["claude-code", "codex", "kiro-cli", "grok", "antigravity", "muse"];
23
33
  /** Timeout on the `<binary> --version` step of a CLI env probe. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { EventEmitter } from "node:events";
2
2
  import { Client, ActionRowBuilder, ButtonBuilder } from "discord.js";
3
3
  import type { ChannelAdapter, ApprovalHandle, SendOpts, ReplyButtonsOutcome, SentMessage, PermissionPrompt, Choice, AlertData, AdapterHealthSnapshot, TopicPresence, StickerInfo, StickerList, StickerPreview, StickerTarget } from "../types.js";
4
4
  import type { AccessManager } from "../access-manager.js";
5
+ import { type PollRender } from "../../reply-polls.js";
5
6
  /** Curated ClassicBot backends for Discord's native slash-option dropdown. */
6
7
  export declare const DISCORD_START_BACKEND_CHOICES: readonly [{
7
8
  readonly name: "Claude Code";
@@ -53,6 +54,11 @@ export declare function buttonRows(choices: ReadonlyArray<{
53
54
  id: string;
54
55
  label: string;
55
56
  }>): ActionRowBuilder<ButtonBuilder>[];
57
+ /**
58
+ * #1823: a poll's components — its options (disabled once closed, each with its count then), and a last row holding
59
+ * one disabled status button ("N answered"; at close the closed line).
60
+ */
61
+ export declare function discordPollRows(poll: PollRender): ActionRowBuilder<ButtonBuilder>[];
56
62
  /**
57
63
  * #1235 part 2: the discord.js REST connection survives idle gaps.
58
64
  * undici's default keepAliveTimeout is 4 s, so the first deferReply after any
@@ -200,6 +206,12 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
200
206
  get supportsReplyButtons(): boolean;
201
207
  /** #1266: the same buttons, all disabled; the chosen one is marked and names who chose it. */
202
208
  settleReplyButtons(chatId: string, messageId: string, threadId: string | undefined, labels: readonly string[], outcome: ReplyButtonsOutcome): Promise<void>;
209
+ /** #1823: polls — the options as buttons, a disabled status button, and a deadline line Discord counts down itself. */
210
+ get supportsPolls(): boolean;
211
+ /** #1823: at most one poll redraw per channel every 2 s: inside Discord's 5 edits per 5 s. */
212
+ get pollEditIntervalMs(): number;
213
+ /** #1823: redraw a poll's buttons; at close, also its deadline line, which becomes "closed". */
214
+ renderPoll(chatId: string, messageId: string, threadId: string | undefined, poll: PollRender): Promise<void>;
203
215
  sendFile(chatId: string, filePath: string, opts?: SendOpts): Promise<SentMessage>;
204
216
  /** #1651: `_opts.format` changes nothing here — Discord always renders Markdown (as sendText ignores it too). */
205
217
  editMessage(chatId: string, messageId: string, text: string, threadId?: string, _opts?: {
@@ -15,6 +15,7 @@ import { downloadStickerImage } from "../sticker-download.js";
15
15
  import { MessageQueue } from "../message-queue.js";
16
16
  import { splitTextFenceAware, truncatePreview, fenceBlock } from "../markdown-chunk.js";
17
17
  import { CROSS_INSTANCE_VISIBILITY_MODES } from "../../cross-instance-notice.js";
18
+ import { POLL_STATUS_CALLBACK } from "../../reply-polls.js";
18
19
  const DISCORD_MAX_LENGTH = 2000;
19
20
  const GATEWAY_WATCHDOG_INTERVAL_MS = 30_000;
20
21
  const GATEWAY_STALE_MIN_MS = 180_000;
@@ -53,6 +54,26 @@ export function buttonRows(choices) {
53
54
  }
54
55
  return rows;
55
56
  }
57
+ /** #1823: the deadline line under a poll's text, and how a closed poll's line is found again. */
58
+ function discordPollLine(deadline) {
59
+ return `\n\n⏳ ${t("poll.closes")} <t:${Math.ceil(deadline / 1000)}:R>`;
60
+ }
61
+ const DISCORD_POLL_LINE = /\n\n⏳ [^\n]*<t:\d+:R>$/;
62
+ /**
63
+ * #1823: a poll's components — its options (disabled once closed, each with its count then), and a last row holding
64
+ * one disabled status button ("N answered"; at close the closed line).
65
+ */
66
+ export function discordPollRows(poll) {
67
+ const rows = [];
68
+ for (let i = 0; i < poll.options.length; i += BUTTONS_PER_ROW) {
69
+ rows.push(new ActionRowBuilder().addComponents(poll.options.slice(i, i + BUTTONS_PER_ROW).map(o => new ButtonBuilder()
70
+ .setCustomId(o.id).setLabel(o.label.length > 80 ? `${o.label.slice(0, 79)}…` : o.label)
71
+ .setStyle(ButtonStyle.Secondary).setDisabled(poll.closed))));
72
+ }
73
+ rows.push(new ActionRowBuilder().addComponents(new ButtonBuilder()
74
+ .setCustomId(POLL_STATUS_CALLBACK).setLabel(poll.status.slice(0, 80)).setStyle(ButtonStyle.Secondary).setDisabled(true)));
75
+ return rows;
76
+ }
56
77
  /**
57
78
  * The click's acknowledgement (#1133). The click itself was acknowledged on
58
79
  * arrival (deferUpdate, inside Discord's 3 s window); a notice — why nothing
@@ -1396,7 +1417,8 @@ export class DiscordAdapter extends EventEmitter {
1396
1417
  const channelId = opts?.threadId ?? chatId;
1397
1418
  const channel = await this._fetchTextChannel(channelId);
1398
1419
  const chunkLimit = opts?.chunkLimit ?? DISCORD_MAX_LENGTH;
1399
- const chunks = splitTextFenceAware(text, chunkLimit);
1420
+ // #1823: a poll's deadline as a line Discord counts down by itself, on every client.
1421
+ const chunks = splitTextFenceAware(opts?.replyPoll ? `${text}${discordPollLine(opts.replyPoll.deadline)}` : text, chunkLimit);
1400
1422
  if (chunks.length === 0)
1401
1423
  throw new Error("Empty text");
1402
1424
  // Await every platform POST before reporting success. Previously only the
@@ -1405,7 +1427,7 @@ export class DiscordAdapter extends EventEmitter {
1405
1427
  let first;
1406
1428
  let last;
1407
1429
  // #1266: a reply's buttons go on the last part (built first: too many buttons is an error before anything is sent).
1408
- const replyRows = opts?.replyButtons?.length ? buttonRows(opts.replyButtons) : null;
1430
+ const replyRows = opts?.replyPoll ? discordPollRows(opts.replyPoll) : opts?.replyButtons?.length ? buttonRows(opts.replyButtons) : null;
1409
1431
  for (const [i, chunk] of chunks.entries()) {
1410
1432
  const components = replyRows && i === chunks.length - 1 ? { components: replyRows } : {};
1411
1433
  const sent = await channel.send(opts?.disablePreview || opts?.allowedMentions || replyRows
@@ -1438,6 +1460,21 @@ export class DiscordAdapter extends EventEmitter {
1438
1460
  }
1439
1461
  await msg.edit({ components: rows });
1440
1462
  }
1463
+ /** #1823: polls — the options as buttons, a disabled status button, and a deadline line Discord counts down itself. */
1464
+ get supportsPolls() { return true; }
1465
+ /** #1823: at most one poll redraw per channel every 2 s: inside Discord's 5 edits per 5 s. */
1466
+ get pollEditIntervalMs() { return 2_000; }
1467
+ /** #1823: redraw a poll's buttons; at close, also its deadline line, which becomes "closed". */
1468
+ async renderPoll(chatId, messageId, threadId, poll) {
1469
+ const channel = await this._fetchTextChannel(threadId ?? chatId);
1470
+ if (!poll.closed) {
1471
+ await channel.messages.edit(messageId, { components: discordPollRows(poll) });
1472
+ return;
1473
+ }
1474
+ const msg = await channel.messages.fetch(messageId);
1475
+ const content = msg.content.replace(DISCORD_POLL_LINE, `\n\n${t("poll.closed_line")}`);
1476
+ await msg.edit({ components: discordPollRows(poll), ...(content !== msg.content ? { content } : {}) });
1477
+ }
1441
1478
  async sendFile(chatId, filePath, opts) {
1442
1479
  const channelId = opts?.threadId ?? chatId;
1443
1480
  const channel = await this._fetchTextChannel(channelId);