@songsid/agend 2.3.0-beta.11 → 2.3.0-beta.13
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/README.md +6 -0
- package/README.zh-TW.md +6 -0
- package/dist/agent-whats-new.js +14 -9
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +2 -0
- package/dist/channel/adapters/discord.js +14 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/cli.js +12 -79
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.js +13 -4
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.js +25 -0
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +44 -2
- package/dist/fleet-manager.js +229 -63
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +69 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +2 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +20 -3
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +27 -5
- package/dist/instance-lifecycle.d.ts +2 -0
- package/dist/instance-lifecycle.js +11 -6
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/outbound-schemas.d.ts +14 -1
- package/dist/outbound-schemas.js +8 -2
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +4 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/restart-progress.d.ts +16 -1
- package/dist/restart-progress.js +74 -15
- package/dist/restart-progress.js.map +1 -1
- package/dist/settings-api.d.ts +4 -0
- package/dist/settings-api.js +27 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-confirmation.d.ts +3 -1
- package/dist/settings-confirmation.js +2 -0
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.js +2 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +11 -0
- package/dist/settings-http-confirmation.js +10 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/ui/app-effects.js +13 -1
- package/dist/ui/chat-effects.js +10 -3
- package/dist/ui/chat-store.js +32 -10
- package/dist/ui/chat-strings.js +18 -0
- package/dist/ui/chat-thread.js +5 -2
- package/dist/ui/effects-waker.js +70 -0
- package/dist/ui/fleet-canvas-layout.js +10 -4
- package/dist/ui/fleet-canvas.js +32 -2
- package/dist/ui/fleet-route-scene.js +207 -0
- package/dist/ui/fleet-route-worker.js +21 -0
- package/dist/ui/fleet-route.js +88 -0
- package/dist/ui/fleet-traffic.js +27 -11
- package/dist/ui/fleet-usage.js +35 -1
- package/dist/ui/panel-chat.js +67 -26
- package/dist/ui/panel-fleet.js +3 -3
- package/dist/ui/panel-settings.js +24 -0
- package/dist/ui/settings-appearance.js +2 -1
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-owner-effects.js +6 -4
- package/dist/ui/settings-strings.js +2 -0
- package/dist/ui/shared/app-i18n.js +4 -0
- package/dist/ui/shared/app-prefs.js +12 -0
- package/dist/ui/shared/app-shell.js +38 -2
- package/dist/ui/shared/app-themes.js +116 -1
- package/dist/ui/shared/app.css +47 -3
- package/dist/ui/shared/card-strings.js +4 -0
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-registry.js +10 -2
- package/dist/ui/shared/identity-card.js +24 -6
- package/dist/ui/shared/identity-color.js +11 -7
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/ui-icons.js +2 -0
- package/dist/ui/shared/ui-menu.js +9 -3
- package/dist/ui/shared/web-authorize.js +47 -0
- package/dist/web-api.d.ts +6 -2
- package/dist/web-api.js +68 -15
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance.js +3 -1
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-effect.d.ts +1 -1
- package/dist/web-host-guard.d.ts +11 -0
- package/dist/web-host-guard.js +11 -0
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-libavoid.d.ts +14 -0
- package/dist/web-libavoid.js +46 -0
- package/dist/web-libavoid.js.map +1 -0
- package/dist/web-owner-css-store.d.ts +44 -1
- package/dist/web-owner-css-store.js +70 -9
- package/dist/web-owner-css-store.js.map +1 -1
- package/dist/web-prefs.js +13 -0
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-settings-tools.d.ts +5 -0
- package/dist/web-settings-tools.js +38 -7
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/web-theme.d.ts +29 -0
- package/dist/web-theme.js +89 -1
- package/dist/web-theme.js.map +1 -1
- package/dist/yaml-shared-nodes.d.ts +25 -0
- package/dist/yaml-shared-nodes.js +185 -0
- package/dist/yaml-shared-nodes.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -112,6 +112,12 @@ One-liner (macOS / Linux — installs Node.js via nvm + tmux + agend, then runs
|
|
|
112
112
|
curl -fsSL https://songsid.github.io/AgEnD/install.sh | bash
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
+
One-liner (Windows — in PowerShell; sets up WSL 2 + Ubuntu, your AI backend and AgEnD inside it, then your bot. It asks once for Administrator approval; after a restart, run the same line again and it resumes. See the [Windows installation guide](https://songsid.github.io/AgEnD/install-windows/)):
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
powershell -ExecutionPolicy ByPass -c "irm https://songsid.github.io/AgEnD/install.ps1 | iex"
|
|
119
|
+
```
|
|
120
|
+
|
|
115
121
|
Or install manually:
|
|
116
122
|
|
|
117
123
|
```bash
|
package/README.zh-TW.md
CHANGED
|
@@ -112,6 +112,12 @@ AgEnD 是住在 Discord、Telegram 和你的瀏覽器裡的 AI 個人助理,
|
|
|
112
112
|
curl -fsSL https://songsid.github.io/AgEnD/install.sh | bash
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
+
一行安裝(Windows — 在 PowerShell 執行;裝好 WSL 2 + Ubuntu,在裡面裝 AI 後端和 AgEnD,再串接 bot。會詢問一次系統管理員權限;重新開機後再執行同一行即可接續。詳見 [Windows 安裝指南](https://songsid.github.io/AgEnD/zh-tw/install-windows/)):
|
|
116
|
+
|
|
117
|
+
```powershell
|
|
118
|
+
powershell -ExecutionPolicy ByPass -c "irm https://songsid.github.io/AgEnD/install.ps1 | iex"
|
|
119
|
+
```
|
|
120
|
+
|
|
115
121
|
或手動安裝:
|
|
116
122
|
|
|
117
123
|
```bash
|
package/dist/agent-whats-new.js
CHANGED
|
@@ -42,19 +42,24 @@ export const AGENT_WHATS_NEW = [
|
|
|
42
42
|
// detailed 2.3.0-alpha.1 entries (2.3-owner-effect-policy, -web-theme, -web-card, -web-appearance, -web-mod,
|
|
43
43
|
// -web-widget) were folded into the web-appearance skill and the first line here: an instance told them on
|
|
44
44
|
// 2.3.0-beta.1 hears this short line once more on its next update.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
//
|
|
46
|
+
// 2.2.5 stable is published from a 2.3.0 beta's SHA (the user's decision, 2026-10-19), so everything below ships in
|
|
47
|
+
// 2.2.5: `since` is 2.2.5, not the beta that brought it — 2.2.5 < 2.3.0-beta.N, so with a beta's `since` a 2.2.5
|
|
48
|
+
// install would never be told. The ids keep their 2.3- names: the record is by id, so an instance already told on a
|
|
49
|
+
// 2.3.0 beta is not told again. An entry added before 2.2.5 is cut takes `since: "2.2.5"` too.
|
|
50
|
+
{ id: "2.3-web-appearance-topic", since: "2.2.5",
|
|
51
|
+
text: "Web appearance — your own look on the web dashboard: theme, identity card and identity colour, widgets and mods, and Canvas Worker effects with Try, which are still beta (2.3) (`get_web_appearance`, `set_web_theme`, `set_web_widget`, `export_web_mod`, `upload_web_effect`, …). Load the `web-appearance` skill before using these tools: it has their parameters, limits and rules." },
|
|
52
|
+
{ id: "2.3-web-settings-for-the-user", since: "2.2.5", audience: ["general", "coordinator"],
|
|
53
|
+
text: "General (and coordinators): `get_web_settings` / `set_web_settings` read and change the user's Settings → Web appearance the way the page does — host settings, an agent's colour, custom CSS, proposed mods, Canvas Worker effects (still beta (2.3)), Restore defaults. Load the `web-appearance` skill first." },
|
|
54
|
+
{ id: "2.3-web-ambient", since: "2.2.5",
|
|
50
55
|
text: "Ambient effects: `set_web_ambient` puts falling petals, snow, rising lanterns, twinkles or stars on a click in your web chat — data only, drawn by the dashboard, no Try needed (`clear_web_ambient` removes it). Load the `web-appearance` skill." },
|
|
51
|
-
{ id: "2.3-repo-tools", since: "2.
|
|
56
|
+
{ id: "2.3-repo-tools", since: "2.2.5",
|
|
52
57
|
text: "Repo tools: `checkout_repo` works with branch names again and records each checkout; `release_repo` releases only your own checkout under your `repos/` and refuses any other path." },
|
|
53
|
-
{ id: "2.3-web-verified", since: "2.
|
|
58
|
+
{ id: "2.3-web-verified", since: "2.2.5",
|
|
54
59
|
text: "Web messages can now carry the person's authority (#1939): when their Discord or Telegram account has authorized that browser, they arrive as `[user:<name> via web (verified), id:<their user id>]`. The label is a hint — before acting on it as the person, read its receipt with `delivery_status`: `authority.kind: web-verified` names them in `authority.actor`, and it is checked and forwarded (`forwards`) like a Discord or Telegram message. The full rule is in the cross-instance-messaging skill." },
|
|
55
|
-
{ id: "2.3-decision-titles", since: "2.
|
|
60
|
+
{ id: "2.3-decision-titles", since: "2.2.5",
|
|
56
61
|
text: "`list_decisions` now answers titles by default (id, title, scope, date, tags). Read a decision's full text with `list_decisions { id }`, or all of them with `{ full: true }` (large). CLI mode: `agend-agent decision-get <id>`." },
|
|
57
|
-
{ id: "2.3-web-ordinary-requests", since: "2.
|
|
62
|
+
{ id: "2.3-web-ordinary-requests", since: "2.2.5",
|
|
58
63
|
text: "The web-chat rule is reworded (#1939): a plain `via web` message is the signed-in person — answer it and do what it asks within your work (questions, reading, analysis, changes in your own scope). Only a go-ahead action — a release or publish, anything destructive or irreversible beyond your own work files and branches, spending beyond normal work, credentials or secrets, granting authority to another instance — needs their account behind it: a Discord or Telegram receipt, or `via web (verified)` with its receipt read (`delivery_status`). A guest only chats. The full text is in your instructions and the cross-instance-messaging skill." },
|
|
59
64
|
];
|
|
60
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-whats-new.js","sourceRoot":"","sources":["../src/agent-whats-new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiBzC,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc;QAC9C,IAAI,EAAE,yMAAyM,EAAE;IACnN,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc;QAC/C,IAAI,EAAE,qIAAqI,EAAE;IAC/I,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;QACzC,IAAI,EAAE,6PAA6P,EAAE;IACvQ,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc;QAChD,IAAI,EAAE,qSAAqS,EAAE;IAC/S,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc;QAC1C,IAAI,EAAE,4IAA4I,EAAE;IACtJ,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc;QAChD,IAAI,EAAE,iLAAiL,EAAE;IAC3L,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;QACzC,IAAI,EAAE,4WAA4W,EAAE;IACtX,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe;QACvC,IAAI,EAAE,6aAA6a,EAAE;IACvb,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe;QAC9C,IAAI,EAAE,kRAAkR,EAAE;IAC5R,EAAE,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,OAAO;QAClD,IAAI,EAAE,wOAAwO,EAAE;IAClP,qHAAqH;IACrH,6GAA6G;IAC7G,2GAA2G;IAC3G,mEAAmE;IACnE,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-whats-new.js","sourceRoot":"","sources":["../src/agent-whats-new.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAiBzC,MAAM,CAAC,MAAM,eAAe,GAA6B;IACvD,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc;QAC9C,IAAI,EAAE,yMAAyM,EAAE;IACnN,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,cAAc;QAC/C,IAAI,EAAE,qIAAqI,EAAE;IAC/I,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;QACzC,IAAI,EAAE,6PAA6P,EAAE;IACvQ,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc;QAChD,IAAI,EAAE,qSAAqS,EAAE;IAC/S,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc;QAC1C,IAAI,EAAE,4IAA4I,EAAE;IACtJ,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,cAAc;QAChD,IAAI,EAAE,iLAAiL,EAAE;IAC3L,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc;QACzC,IAAI,EAAE,4WAA4W,EAAE;IACtX,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe;QACvC,IAAI,EAAE,6aAA6a,EAAE;IACvb,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,eAAe;QAC9C,IAAI,EAAE,kRAAkR,EAAE;IAC5R,EAAE,EAAE,EAAE,8BAA8B,EAAE,KAAK,EAAE,OAAO;QAClD,IAAI,EAAE,wOAAwO,EAAE;IAClP,qHAAqH;IACrH,6GAA6G;IAC7G,2GAA2G;IAC3G,mEAAmE;IACnE,EAAE;IACF,oHAAoH;IACpH,iHAAiH;IACjH,oHAAoH;IACpH,+FAA+F;IAC/F,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,OAAO;QAC9C,IAAI,EAAE,2XAA2X,EAAE;IACrY,EAAE,EAAE,EAAE,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;QACzF,IAAI,EAAE,kTAAkT,EAAE;IAC5T,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO;QACrC,IAAI,EAAE,oPAAoP,EAAE;IAC9P,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO;QACpC,IAAI,EAAE,qLAAqL,EAAE;IAC/L,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO;QACtC,IAAI,EAAE,kfAAkf,EAAE;IAC5f,EAAE,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;QACzC,IAAI,EAAE,mOAAmO,EAAE;IAC7O,EAAE,EAAE,EAAE,2BAA2B,EAAE,KAAK,EAAE,OAAO;QAC/C,IAAI,EAAE,ooBAAooB,EAAE;CAC/oB,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAmB;IACvD,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAA2B,CAAC,OAAO,CAAC;QACxH,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC;AACD,sFAAsF;AACtF,MAAM,UAAU,YAAY;IAC1B,OAAO,qBAAqB,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,wDAAwD,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACnG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,qCAAqC;IACnG,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACxF,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAGD,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAEhC,qHAAqH;AACrH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAC/D,OAAO,GAAG,EAAE,CAAC;QAAC,OAAQ,GAA6B,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC;IAAC,CAAC;IAC/F,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC1C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,MAAyB,CAAC,SAAS,CAAC;eAC5F,CAAE,MAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC;YAAE,OAAO,YAAY,CAAC;QACpG,OAAO,MAAwB,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,YAAY,CAAC;IAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,GAAsB,EAAE,OAAe;IACzF,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IAC3E,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,2GAA2G;AAC3G,MAAM,CAAC,MAAM,eAAe,GAAG,iHAAiH,CAAC;AAEjJ,8GAA8G;AAC9G,MAAM,aAAa,GAAG,iFAAiF,CAAC;AAExG,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,OAAiC;IAC/E,OAAO;QACL,mCAAmC,OAAO,yCAAyC;QACnF,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,gOAAgO;KACjO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAI5B;IAIC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACzC,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9I,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;IACxE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACzG,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Client } from "discord.js";
|
|
2
|
+
/** Client.login() also calls this.destroy() internally when gateway startup fails. */
|
|
3
|
+
export declare function protectDiscordClientRetirement(client: Client, report: (error: Error) => void): void;
|
|
4
|
+
/** Contain a retired gateway's errors until its underlying socket actually closes. */
|
|
5
|
+
export declare function retireDiscordClient(client: Client, report: (error: Error) => void): Promise<void>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const retirements = new WeakMap();
|
|
2
|
+
const destroyers = new WeakMap();
|
|
3
|
+
/** Client.login() also calls this.destroy() internally when gateway startup fails. */
|
|
4
|
+
export function protectDiscordClientRetirement(client, report) {
|
|
5
|
+
if (destroyers.has(client))
|
|
6
|
+
return;
|
|
7
|
+
destroyers.set(client, client.destroy.bind(client));
|
|
8
|
+
client.destroy = () => retireDiscordClient(client, report);
|
|
9
|
+
}
|
|
10
|
+
/** Contain a retired gateway's errors until its underlying socket actually closes. */
|
|
11
|
+
export function retireDiscordClient(client, report) {
|
|
12
|
+
const pending = retirements.get(client);
|
|
13
|
+
if (pending)
|
|
14
|
+
return pending;
|
|
15
|
+
// discord.js 14 / @discordjs/ws 1.2.3 destroy() clears connection.onerror,
|
|
16
|
+
// but leaves CONNECTING sockets and their ws handshake timers running. Their
|
|
17
|
+
// later timeout then emits an unhandled EventEmitter error in the fleet.
|
|
18
|
+
// These are deliberately scoped private internals of the default in-process
|
|
19
|
+
// strategy; a Client without a gateway (including before login) has no sockets.
|
|
20
|
+
const strategy = client.ws?._ws?.strategy;
|
|
21
|
+
// A pending GET gateway/bot can resume Client.login after destroy has finished.
|
|
22
|
+
// Fence the strategy permanently before our first await: spawning/connecting
|
|
23
|
+
// after retirement would create sockets outside the snapshot below. A spawn
|
|
24
|
+
// already awaiting gateway info may still finish, but cannot connect them.
|
|
25
|
+
if (strategy) {
|
|
26
|
+
strategy.spawn = async () => { };
|
|
27
|
+
strategy.connect = async () => { };
|
|
28
|
+
}
|
|
29
|
+
const shards = strategy?.shards;
|
|
30
|
+
for (const shard of shards?.values() ?? []) {
|
|
31
|
+
// A HELLO timeout can already have scheduled native recovery in 1.2.3's
|
|
32
|
+
// 500ms backoff. A retired shard must never open another socket after the
|
|
33
|
+
// manager has forgotten it. This instance is never reused.
|
|
34
|
+
if (typeof shard.internalConnect === "function")
|
|
35
|
+
shard.internalConnect = async () => { };
|
|
36
|
+
}
|
|
37
|
+
const sockets = [...(shards?.values() ?? [])].flatMap(shard => shard.connection ? [shard.connection] : []);
|
|
38
|
+
for (const socket of sockets) {
|
|
39
|
+
socket.on("error", report);
|
|
40
|
+
socket.once("close", () => socket.removeListener("error", report));
|
|
41
|
+
}
|
|
42
|
+
const retirement = (async () => {
|
|
43
|
+
try {
|
|
44
|
+
await (destroyers.get(client) ?? client.destroy.bind(client))();
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
// Destroy first: it disconnects shard callbacks, so terminating a pending
|
|
48
|
+
// handshake cannot start the retired shard's native reconnect loop.
|
|
49
|
+
for (const socket of sockets)
|
|
50
|
+
if (socket.readyState === 0)
|
|
51
|
+
socket.terminate();
|
|
52
|
+
}
|
|
53
|
+
})();
|
|
54
|
+
retirements.set(client, retirement);
|
|
55
|
+
return retirement;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=discord-client-retirement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-client-retirement.js","sourceRoot":"","sources":["../../../src/channel/adapters/discord-client-retirement.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG,IAAI,OAAO,EAAyB,CAAC;AACzD,MAAM,UAAU,GAAG,IAAI,OAAO,EAAyB,CAAC;AAExD,sFAAsF;AACtF,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,MAA8B;IAC3F,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO;IACnC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,MAA8B;IAChF,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,6EAA6E;IAC7E,yEAAyE;IACzE,4EAA4E;IAC5E,gFAAgF;IAChF,MAAM,QAAQ,GAAI,MAAM,CAAC,EAMvB,EAAE,GAAG,EAAE,QAAQ,CAAC;IAClB,gFAAgF;IAChF,6EAA6E;IAC7E,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;QAChC,QAAQ,CAAC,OAAO,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,wEAAwE;QACxE,0EAA0E;QAC1E,2DAA2D;QAC3D,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,UAAU;YAAE,KAAK,CAAC,eAAe,GAAG,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,0EAA0E;YAC1E,oEAAoE;YACpE,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;oBAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAChF,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -142,6 +142,8 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
142
142
|
private emitFromClient;
|
|
143
143
|
private emitHealthChanged;
|
|
144
144
|
private loginFreshClient;
|
|
145
|
+
private retireClient;
|
|
146
|
+
private reportRetiredSocketError;
|
|
145
147
|
/** Rebuild just this bot's gateway Client. Calls coalesce into one generation. */
|
|
146
148
|
reconnectGateway(reason: string): Promise<void>;
|
|
147
149
|
private readyClient;
|
|
@@ -17,6 +17,7 @@ import { splitTextFenceAware, truncatePreview, fenceBlock } from "../markdown-ch
|
|
|
17
17
|
import { stripPlaceRefs } from "../../topic-link.js";
|
|
18
18
|
import { CROSS_INSTANCE_VISIBILITY_MODES } from "../../cross-instance-notice.js";
|
|
19
19
|
import { POLL_STATUS_CALLBACK } from "../../reply-polls.js";
|
|
20
|
+
import { protectDiscordClientRetirement, retireDiscordClient } from "./discord-client-retirement.js";
|
|
20
21
|
const DISCORD_MAX_LENGTH = 2000;
|
|
21
22
|
const GATEWAY_WATCHDOG_INTERVAL_MS = 30_000;
|
|
22
23
|
const GATEWAY_STALE_MIN_MS = 180_000;
|
|
@@ -288,6 +289,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
288
289
|
return channel;
|
|
289
290
|
}
|
|
290
291
|
registerClientHandlers(client, generation) {
|
|
292
|
+
protectDiscordClientRetirement(client, error => this.reportRetiredSocketError(error));
|
|
291
293
|
// Client/shard errors (WebSocket hiccups, gateway resumes, etc.). discord.js
|
|
292
294
|
// auto-reconnects; we just need a listener so Node's EventEmitter doesn't
|
|
293
295
|
// rethrow on "error" — without one it surfaces as an uncaughtException and
|
|
@@ -842,7 +844,10 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
842
844
|
const oldClient = this.client;
|
|
843
845
|
// A destroyed discord.js Client cannot be logged in again. Destroy first to
|
|
844
846
|
// avoid overlapping gateway sessions delivering MESSAGE_CREATE twice.
|
|
845
|
-
|
|
847
|
+
await this.retireClient(oldClient);
|
|
848
|
+
if (!this.desiredRunning || epoch !== this.lifecycleEpoch) {
|
|
849
|
+
throw new Error("Discord gateway login superseded by lifecycle change");
|
|
850
|
+
}
|
|
846
851
|
const client = this.clientFactory();
|
|
847
852
|
const generation = ++this.clientGeneration;
|
|
848
853
|
this.client = client;
|
|
@@ -856,7 +861,6 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
856
861
|
try {
|
|
857
862
|
await client.login(this.botToken);
|
|
858
863
|
if (!this.desiredRunning || epoch !== this.lifecycleEpoch || this.client !== client) {
|
|
859
|
-
client.destroy();
|
|
860
864
|
throw new Error("Discord gateway login superseded by lifecycle change");
|
|
861
865
|
}
|
|
862
866
|
this.lastReconnectAt = this.now();
|
|
@@ -865,10 +869,16 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
865
869
|
this.emitHealthChanged();
|
|
866
870
|
}
|
|
867
871
|
catch (err) {
|
|
868
|
-
|
|
872
|
+
await this.retireClient(client);
|
|
869
873
|
throw err;
|
|
870
874
|
}
|
|
871
875
|
}
|
|
876
|
+
retireClient(client) {
|
|
877
|
+
return retireDiscordClient(client, error => this.reportRetiredSocketError(error));
|
|
878
|
+
}
|
|
879
|
+
reportRetiredSocketError(error) {
|
|
880
|
+
console.warn(`[discord:${this.id}] retired gateway socket error: ${error.message}`);
|
|
881
|
+
}
|
|
872
882
|
/** Rebuild just this bot's gateway Client. Calls coalesce into one generation. */
|
|
873
883
|
reconnectGateway(reason) {
|
|
874
884
|
if (this.reconnectPromise)
|
|
@@ -1342,7 +1352,7 @@ export class DiscordAdapter extends EventEmitter {
|
|
|
1342
1352
|
clearInterval(this.watchdogTimer);
|
|
1343
1353
|
this.watchdogTimer = null;
|
|
1344
1354
|
this.queue.stop();
|
|
1345
|
-
this.client
|
|
1355
|
+
await this.retireClient(this.client);
|
|
1346
1356
|
}
|
|
1347
1357
|
// ── Text / file sending ────────────────────────────────────────────────
|
|
1348
1358
|
/**
|