@songsid/agend 2.2.0-beta.10 → 2.2.0-beta.11
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.
- package/dist/agent-endpoint.js +3 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/auth-api.d.ts +3 -1
- package/dist/auth-api.js +15 -1
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/antigravity.d.ts +5 -0
- package/dist/backend/antigravity.js +27 -13
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/effort-metadata.d.ts +36 -0
- package/dist/backend/effort-metadata.js +83 -13
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/launch-effort.d.ts +29 -1
- package/dist/backend/launch-effort.js +53 -6
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/types.d.ts +14 -0
- package/dist/backend/types.js +10 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +12 -0
- package/dist/channel/adapters/discord.js +39 -2
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +18 -0
- package/dist/channel/adapters/telegram.js +24 -3
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +2 -0
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/tool-router.d.ts +2 -0
- package/dist/channel/tool-router.js +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/channel/types.d.ts +16 -0
- package/dist/cli.js +34 -11
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +9 -0
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-outbox.d.ts +8 -1
- package/dist/delivery-outbox.js +6 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-manager.d.ts +59 -3
- package/dist/fleet-manager.js +157 -22
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +4 -1
- package/dist/instructions.js +2 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +26 -0
- package/dist/locale.js.map +1 -1
- package/dist/outbound-handlers.js +21 -1
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +12 -0
- package/dist/outbound-schemas.js +12 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +3 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +86 -5
- package/dist/reply-buttons-controller.js +271 -7
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-buttons.d.ts +48 -3
- package/dist/reply-buttons.js +105 -10
- package/dist/reply-buttons.js.map +1 -1
- package/dist/reply-polls.d.ts +85 -0
- package/dist/reply-polls.js +154 -0
- package/dist/reply-polls.js.map +1 -0
- package/dist/tool-permissions.js +3 -3
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.js +9 -4
- package/dist/topic-commands.js.map +1 -1
- package/dist/ui/chat-render.js +19 -2
- package/dist/ui/chat-store.js +35 -1
- package/dist/ui/chat-strings.js +2 -0
- package/dist/ui/chat-thread.js +42 -0
- package/dist/ui/panel-chat.js +2 -0
- package/dist/ui/panel-settings.js +48 -1
- package/dist/ui/settings-strings.js +10 -0
- package/dist/ui/shared/app-stream.js +4 -1
- package/dist/ui/shared/app.css +8 -0
- package/dist/update-check.d.ts +31 -0
- package/dist/update-check.js +47 -0
- package/dist/update-check.js.map +1 -1
- package/dist/update-launch.d.ts +46 -1
- package/dist/update-launch.js +146 -3
- package/dist/update-launch.js.map +1 -1
- package/dist/web-api.d.ts +40 -2
- package/dist/web-api.js +130 -14
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +12 -1
- package/dist/web-chat-history.js +29 -7
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-login.d.ts +14 -0
- package/dist/web-login.js +4 -2
- package/dist/web-login.js.map +1 -1
- package/dist/web-prefs.d.ts +18 -0
- package/dist/web-prefs.js +36 -4
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-profile.d.ts +32 -0
- package/dist/web-profile.js +132 -0
- package/dist/web-profile.js.map +1 -0
- package/dist/web-session.d.ts +14 -0
- package/dist/web-session.js +10 -0
- package/dist/web-session.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 {
|
|
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
|
-
|
|
23
|
-
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"launch-effort.js","sourceRoot":"","sources":["../../src/backend/launch-effort.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/types.d.ts
CHANGED
|
@@ -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.
|
package/dist/backend/types.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA8C1C;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAwGD,kHAAkH;AAClH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;
|
|
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
|
-
|
|
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);
|