@songsid/agend 2.3.0-beta.2 → 2.3.0-beta.4
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-whats-new.js +2 -0
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +42 -12
- package/dist/auth-api.js.map +1 -1
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +5 -4
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/types.d.ts +6 -0
- package/dist/backend/types.js +15 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +21 -3
- package/dist/backend-command.js +23 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +7 -0
- package/dist/channel/adapters/discord.js +35 -0
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +8 -4
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +6 -0
- package/dist/classic-channel-manager.d.ts +8 -3
- package/dist/classic-channel-manager.js +10 -3
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/config-validator.js +73 -2
- package/dist/config-validator.js.map +1 -1
- package/dist/delivery-outbox.js +5 -0
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-context.d.ts +10 -0
- package/dist/fleet-manager.d.ts +238 -5
- package/dist/fleet-manager.js +878 -71
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-traffic.d.ts +38 -0
- package/dist/fleet-traffic.js +96 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +13 -5
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +56 -11
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +398 -0
- package/dist/human-delivery-receipts.js +2 -1
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/locale.js +48 -8
- package/dist/locale.js.map +1 -1
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +40 -1
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +92 -0
- package/dist/outbound-schemas.js +55 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +1 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +10 -1
- package/dist/quickstart-api.js +12 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +2 -0
- package/dist/reply-buttons-controller.js +1 -1
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +16 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.js +4 -0
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +5 -0
- package/dist/topic-commands.js +16 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/types.d.ts +25 -1
- package/dist/ui/app-effects.js +33 -9
- package/dist/ui/chat-effects.js +62 -4
- package/dist/ui/chat-strings.js +40 -4
- package/dist/ui/chat-thread.js +17 -6
- package/dist/ui/effect-trial-panel.js +19 -16
- package/dist/ui/fleet-canvas-layout.js +111 -0
- package/dist/ui/fleet-canvas.js +489 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-traffic.js +224 -0
- package/dist/ui/panel-chat.js +12 -5
- package/dist/ui/panel-details.js +2 -1
- package/dist/ui/panel-fleet.js +32 -11
- package/dist/ui/panel-settings.js +6 -4
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +34 -18
- package/dist/ui/settings-catalog.js +89 -0
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +4 -3
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +6 -2
- package/dist/ui/settings-mods.js +4 -3
- package/dist/ui/settings-owner-effects.js +8 -8
- package/dist/ui/settings-strings.js +40 -38
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-prefs.js +1 -1
- package/dist/ui/shared/app-shell.js +23 -1
- package/dist/ui/shared/app-store.js +12 -1
- package/dist/ui/shared/app-stream.js +2 -1
- package/dist/ui/shared/app.css +186 -11
- package/dist/ui/shared/card-strings.js +4 -0
- package/dist/ui/shared/effect-app-runtime.js +1 -1
- package/dist/ui/shared/effect-frame.js +10 -5
- package/dist/ui/shared/effect-geometry.js +24 -9
- package/dist/ui/shared/effect-policy.js +2 -1
- package/dist/ui/shared/effect-registry.js +71 -17
- package/dist/ui/shared/effect-stock-trust.js +23 -2
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-stage.js +15 -9
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/identity-card.js +75 -4
- package/dist/ui/shared/identity-color.js +3 -3
- package/dist/ui/shared/instance-nav.js +20 -4
- package/dist/ui/shared/panel-view.js +24 -4
- package/dist/ui/shared/view-strings.js +22 -0
- package/dist/view-api.d.ts +32 -0
- package/dist/view-api.js +55 -4
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +19 -4
- package/dist/web-api.js +178 -20
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-policy.d.ts +4 -6
- package/dist/web-appearance-policy.js +5 -12
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.js +5 -1
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.d.ts +14 -1
- package/dist/web-appearance-view.js +98 -10
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +2 -2
- package/dist/web-appearance.js +5 -6
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-auth.js +1 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +14 -0
- package/dist/web-card.js +40 -6
- package/dist/web-card.js.map +1 -1
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +40 -0
- package/dist/web-chat-history.js +66 -3
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +1 -0
- package/dist/web-effect-tools.js +2 -3
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.d.ts +2 -2
- package/dist/web-effect-trials.js +3 -3
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-guest-access.d.ts +125 -0
- package/dist/web-guest-access.js +232 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-identity-palette.d.ts +1 -1
- package/dist/web-identity-palette.js +2 -2
- package/dist/web-identity-palette.js.map +1 -1
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +1 -1
- package/dist/web-mod-agent.js +2 -4
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-store.d.ts +5 -0
- package/dist/web-mod-store.js +6 -0
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-prefs.d.ts +8 -0
- package/dist/web-prefs.js +9 -0
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +6 -2
- package/dist/web-preview.js +4 -2
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +39 -0
- package/dist/web-returning-device.js +46 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session.d.ts +58 -10
- package/dist/web-session.js +104 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-tools.d.ts +81 -0
- package/dist/web-settings-tools.js +257 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-theme.d.ts +2 -0
- package/dist/web-theme.js +10 -1
- package/dist/web-theme.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,7 +14,7 @@ register("settings", {
|
|
|
14
14
|
publicTtl: "Public link minutes (1–480)",
|
|
15
15
|
publicProtocol: "Tunnel protocol",
|
|
16
16
|
webEcho: "Web echo",
|
|
17
|
-
webEchoHint: "Copies web messages to the bound Telegram or Discord topic. ClassicBot rooms
|
|
17
|
+
webEchoHint: "Copies web messages to the bound Telegram or Discord topic. ClassicBot rooms follow it unless a room sets its own.",
|
|
18
18
|
webLogTab: "Log tab: each agent's steps", webLogTabHint: "Shows each instance's prompts, replies, tool calls and results, and fleet events in its Log tab, read from its own transcript only while the tab is open. Secret values are masked. Also over the public link. Turning it on waits for a fleet admin's confirmation.",
|
|
19
19
|
general: "General Settings",
|
|
20
20
|
advanced: "Advanced",
|
|
@@ -88,7 +88,6 @@ register("settings", {
|
|
|
88
88
|
wake: "Wake",
|
|
89
89
|
accessMode: "Access mode",
|
|
90
90
|
affected: "Affected instances",
|
|
91
|
-
webEchoGroupConfirm: "This looks like a group channel: enabling posts every web message to this instance where all channel members can read it. Enable web echo?",
|
|
92
91
|
language: "Language (bot replies)",
|
|
93
92
|
defaultBackend: "Default backend",
|
|
94
93
|
defaultModel: "Default model",
|
|
@@ -204,6 +203,9 @@ register("settings", {
|
|
|
204
203
|
changesApplied: "Changes applied. AgEnD is reconciling affected Agents.",
|
|
205
204
|
reviewChanges: "Review changes",
|
|
206
205
|
backendUnavailable: "{0} (removed — choose another backend)",
|
|
206
|
+
backendNotInstalled: "not installed", backendNotSignedIn: "not signed in (use /login)", backendTooOld: "needs {0} or newer", backendUnchecked: "not checked yet",
|
|
207
|
+
modelNotListed: "current — not in this CLI's list", modelOther: "Other…", modelOtherLabel: "Model name", modelOtherPlaceholder: "a model name this CLI accepts",
|
|
208
|
+
modelNone: "— none —", inheritValue: "inherit ({0})", modelCliDefault: "the CLI's own default",
|
|
207
209
|
readyApply: "Ready to apply",
|
|
208
210
|
copied: "Copied",
|
|
209
211
|
expectedMapping: "expected a mapping",
|
|
@@ -290,17 +292,18 @@ register("settings", {
|
|
|
290
292
|
sec_web: "Web",
|
|
291
293
|
// #1629 r4 §3: Settings → Appearance (owner CSS).
|
|
292
294
|
sec_appearance: "Web appearance",
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
295
|
+
groupLook: "Look", groupLayout: "Your layout", groupCss: "Styles you write", groupMods: "Add-ons", groupAdvanced: "Advanced", learnMore: "Learn more: {0}",
|
|
296
|
+
colorTitle: "Identity colours", colorLead: "One agent's colour: its ⋯ menu → Colour…",
|
|
297
|
+
colorPlaces: "Where colours show", colorSample: "Sample agent", colorOff: "Turn off colours",
|
|
298
|
+
colorOffLead: "Colours people picked are kept.",
|
|
299
|
+
restoreTitle: "Restore defaults", restoreLead: "Puts this host's look back to the defaults. Asks first.",
|
|
300
|
+
restoreConfirm: "Resets, for this host: showing agents' themes and effects, the card size and each card's own size, your sidebar widget, where colours show, and colours off. Also turns your custom CSS off (its versions are kept) and its switch on this device. Kept: the colours people picked for agents, installed mods, uploaded effects and the card limits.",
|
|
298
301
|
restoreGo: "Restore defaults", restoreDone: "Appearance settings are back to their defaults.", restoreCssFailed: "The settings are back to their defaults, but your custom CSS could not be turned off: {0}",
|
|
299
302
|
cardSizeTitle: "Identity cards",
|
|
300
|
-
cardSizeLead: "
|
|
303
|
+
cardSizeLead: "A card's own S / M / L overrides this.",
|
|
301
304
|
cardLimitsTitle: "Identity card upload limits",
|
|
302
|
-
cardLimitsLead: "
|
|
303
|
-
cardLimitsUnavailable: "Only a signed-in admin can
|
|
305
|
+
cardLimitsLead: "Empty = the default. Raising a limit needs an admin's OK.",
|
|
306
|
+
cardLimitsUnavailable: "Only a signed-in admin can change these.",
|
|
304
307
|
cardLimit_portrait_max_width: "Portrait width (px)", cardLimit_portrait_max_height: "Portrait height (px)", cardLimit_portrait_max_kib: "Portrait size (KiB)",
|
|
305
308
|
cardLimit_banner_max_width: "Banner width (px)", cardLimit_banner_max_height: "Banner height (px)", cardLimit_banner_max_kib: "Banner size (KiB)",
|
|
306
309
|
cardLimit_instance_quota_files: "Pictures per agent", cardLimit_instance_quota_mib: "Picture space per agent (MiB)",
|
|
@@ -312,10 +315,10 @@ register("settings", {
|
|
|
312
315
|
cardLimitsFailed: "Not saved: {0}",
|
|
313
316
|
themesTitle: "Agents' themes",
|
|
314
317
|
themesShow: "Show agents' themes, effects and widgets",
|
|
315
|
-
themesShowLead: "
|
|
318
|
+
themesShowLead: "When off, every chat looks the same.",
|
|
316
319
|
themesSafeMode: "This page was opened with ?safe=1: agents' themes are not shown on it.",
|
|
317
320
|
widgetTitle: "Your sidebar widget",
|
|
318
|
-
widgetLead: "A small panel under
|
|
321
|
+
widgetLead: "A small panel under your agent list, written as JSON.",
|
|
319
322
|
widgetNotJson: "Not JSON.",
|
|
320
323
|
widgetSave: "Save widget",
|
|
321
324
|
widgetSaved: "Sidebar widget saved.",
|
|
@@ -323,7 +326,7 @@ register("settings", {
|
|
|
323
326
|
widgetRemove: "Remove widget",
|
|
324
327
|
widgetRemoved: "Sidebar widget removed.",
|
|
325
328
|
modsTitle: "Mods",
|
|
326
|
-
modsLead: "
|
|
329
|
+
modsLead: "Only the parts you tick are applied.",
|
|
327
330
|
modsLoadFailed: "Couldn't load the installed mods. Reload the page to try again.",
|
|
328
331
|
modsNone: "No mods installed.",
|
|
329
332
|
modChoose: "Import a mod file…",
|
|
@@ -360,7 +363,7 @@ register("settings", {
|
|
|
360
363
|
modUninstallConfirm: "Uninstall {0}? Its effects leave your library unless something still uses them. What it applied stays.",
|
|
361
364
|
modUninstalled: "Uninstalled {0}.",
|
|
362
365
|
modExport: "Export a mod",
|
|
363
|
-
modExportLead: "
|
|
366
|
+
modExportLead: "Save what's in force now as a mod file.",
|
|
364
367
|
modExportInstance: "Agent",
|
|
365
368
|
modExportName: "Name (a-z, 0-9, -)",
|
|
366
369
|
modExportVersion: "Version",
|
|
@@ -372,7 +375,7 @@ register("settings", {
|
|
|
372
375
|
modReview: "Review",
|
|
373
376
|
modDismiss: "Dismiss",
|
|
374
377
|
cssTitle: "Custom CSS (yours only)",
|
|
375
|
-
cssLead: "
|
|
378
|
+
cssLead: "Applies to your screens only.",
|
|
376
379
|
cssLoadFailed: "Couldn't load your custom CSS. Reload the page to try again.",
|
|
377
380
|
cssPublicLink: "Custom CSS isn't available on a temporary public link.",
|
|
378
381
|
cssInForce: "In force: {0}",
|
|
@@ -385,15 +388,14 @@ register("settings", {
|
|
|
385
388
|
cssCurrent: "in force",
|
|
386
389
|
cssRestore: "Use this",
|
|
387
390
|
cssAssets: "Assets",
|
|
388
|
-
cssAssetsLead: "
|
|
391
|
+
cssAssetsLead: "{0} of {1} files, {2} in total (at most 1 MiB in all).",
|
|
389
392
|
cssAssetAdd: "Add a picture or font",
|
|
390
393
|
cssAssetCopy: "Copy reference",
|
|
391
394
|
cssCopied: "Copied {0}",
|
|
392
395
|
cssAssetRemove: "Remove",
|
|
393
396
|
cssDeviceTitle: "On this device",
|
|
394
397
|
cssDeviceOff: "Turn off custom CSS on this device",
|
|
395
|
-
|
|
396
|
-
cssSafe: "Is something hidden or broken? Add ?safe=1 to the end of any page's address and it loads without custom CSS.",
|
|
398
|
+
cssSafe: "Something hidden? Add ?safe=1 to the address.",
|
|
397
399
|
cssError_at_rule: "Not saved: {0} isn't allowed.",
|
|
398
400
|
cssError_url: "Not saved: the only url() allowed is url(\"asset:<id>\") for a file in Assets.",
|
|
399
401
|
cssError_unknown_asset: "Not saved: there's no asset {0}. Add it under Assets first.",
|
|
@@ -491,7 +493,6 @@ register("settings", {
|
|
|
491
493
|
discordUserPlaceholder: "your Discord user id",
|
|
492
494
|
telegramUserPlaceholder: "your Telegram user id",
|
|
493
495
|
bindingApplyButton: "Rebind",
|
|
494
|
-
webEchoEnable: "Turn on web echo",
|
|
495
496
|
help1: "Agents: each agent's settings, Start/Stop, Pause/Wake, and New agent.",
|
|
496
497
|
help2: "Connections: who may use each bot, its binding, its status emojis, a new token; and provider API keys.",
|
|
497
498
|
help3: "ClassicBot: each room's backend, model and options.",
|
|
@@ -535,7 +536,7 @@ register("settings", {
|
|
|
535
536
|
publicTtl: "公開連結分鐘數(1–480)",
|
|
536
537
|
publicProtocol: "Tunnel 協定",
|
|
537
538
|
webEcho: "Web 同步",
|
|
538
|
-
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord
|
|
539
|
+
webEchoHint: "將網頁訊息複製到綁定的 Telegram 或 Discord 主題。ClassicBot 聊天室也照這個設定,除非該聊天室另外設定。",
|
|
539
540
|
webLogTab: "紀錄分頁:每個 agent 的步驟", webLogTabHint: "在每個 instance 的「紀錄」分頁顯示提示、回覆、工具呼叫與結果,以及 fleet 事件;只在分頁開著時從它自己的對話紀錄讀取。機密值會遮蔽。公開連結也看得到。開啟需 fleet admin 確認。",
|
|
540
541
|
general: "一般設定",
|
|
541
542
|
advanced: "進階",
|
|
@@ -584,7 +585,6 @@ register("settings", {
|
|
|
584
585
|
wake: "喚醒",
|
|
585
586
|
accessMode: "存取模式",
|
|
586
587
|
affected: "受影響 instances",
|
|
587
|
-
webEchoGroupConfirm: "這看起來是群組頻道:開啟後,這個 instance 的每則 web 訊息都會貼到所有頻道成員看得到的地方。確定要開啟 web echo?",
|
|
588
588
|
language: "語言(bot 回覆)",
|
|
589
589
|
defaultBackend: "預設後端",
|
|
590
590
|
defaultModel: "預設模型",
|
|
@@ -700,6 +700,9 @@ register("settings", {
|
|
|
700
700
|
changesApplied: "變更已套用,AgEnD 正在協調受影響的 Agent。",
|
|
701
701
|
reviewChanges: "檢查變更",
|
|
702
702
|
backendUnavailable: "{0}(已移除,請選擇其他 backend)",
|
|
703
|
+
backendNotInstalled: "未安裝", backendNotSignedIn: "未登入(請用 /login)", backendTooOld: "需要 {0} 以上版本", backendUnchecked: "尚未檢查",
|
|
704
|
+
modelNotListed: "目前使用中 — 不在這個 CLI 的清單裡", modelOther: "其他…", modelOtherLabel: "模型名稱", modelOtherPlaceholder: "這個 CLI 接受的模型名稱",
|
|
705
|
+
modelNone: "— 無 —", inheritValue: "沿用({0})", modelCliDefault: "CLI 自己的預設",
|
|
703
706
|
readyApply: "可套用變更",
|
|
704
707
|
copied: "已複製",
|
|
705
708
|
expectedMapping: "預期為 mapping",
|
|
@@ -785,17 +788,18 @@ register("settings", {
|
|
|
785
788
|
webChat: "網頁聊天",
|
|
786
789
|
sec_web: "網頁",
|
|
787
790
|
sec_appearance: "網頁外觀",
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
791
|
+
groupLook: "外觀", groupLayout: "你的版面", groupCss: "自己寫的樣式", groupMods: "擴充", groupAdvanced: "進階", learnMore: "了解更多:{0}",
|
|
792
|
+
colorTitle: "識別色", colorLead: "單一 agent 的顏色:⋯ 選單 → 顏色…",
|
|
793
|
+
colorPlaces: "顏色顯示的位置", colorSample: "範例 agent", colorOff: "關閉顏色",
|
|
794
|
+
colorOffLead: "已挑選的顏色會保留。",
|
|
795
|
+
restoreTitle: "還原預設值", restoreLead: "把這台主機的外觀改回預設值,會先詢問。",
|
|
796
|
+
restoreConfirm: "會重設這台主機的:是否顯示 agent 的主題與效果、卡片大小與各張卡片自己的大小、你的側欄小工具、顏色顯示的位置、是否關閉顏色;也會關閉你的自訂 CSS(版本會保留)與這台裝置上的 CSS 開關。不變:有人替 agent 挑的顏色、已安裝的 mod、上傳的效果與卡片上限。",
|
|
793
797
|
restoreGo: "還原預設值", restoreDone: "外觀設定已改回預設值。", restoreCssFailed: "設定已改回預設值,但無法關閉你的自訂 CSS:{0}",
|
|
794
798
|
cardSizeTitle: "身分卡",
|
|
795
|
-
cardSizeLead: "
|
|
799
|
+
cardSizeLead: "卡片上的 小/中/大 可單獨設定。",
|
|
796
800
|
cardLimitsTitle: "身分卡上傳限制",
|
|
797
|
-
cardLimitsLead: "
|
|
798
|
-
cardLimitsUnavailable: "
|
|
801
|
+
cardLimitsLead: "留空=預設值。調高上限需管理員確認。",
|
|
802
|
+
cardLimitsUnavailable: "只有已登入的管理者能修改。",
|
|
799
803
|
cardLimit_portrait_max_width: "肖像寬度(px)", cardLimit_portrait_max_height: "肖像高度(px)", cardLimit_portrait_max_kib: "肖像大小(KiB)",
|
|
800
804
|
cardLimit_banner_max_width: "橫幅寬度(px)", cardLimit_banner_max_height: "橫幅高度(px)", cardLimit_banner_max_kib: "橫幅大小(KiB)",
|
|
801
805
|
cardLimit_instance_quota_files: "每個 agent 的圖片數", cardLimit_instance_quota_mib: "每個 agent 的圖片空間(MiB)",
|
|
@@ -807,10 +811,10 @@ register("settings", {
|
|
|
807
811
|
cardLimitsFailed: "未儲存:{0}",
|
|
808
812
|
themesTitle: "Agent 的主題",
|
|
809
813
|
themesShow: "顯示 agent 的主題、效果與小工具",
|
|
810
|
-
themesShowLead: "
|
|
814
|
+
themesShowLead: "關閉時每個聊天看起來都一樣。",
|
|
811
815
|
themesSafeMode: "這個頁面是用 ?safe=1 開啟的:不顯示 agent 的主題。",
|
|
812
816
|
widgetTitle: "你的側邊欄小工具",
|
|
813
|
-
widgetLead: "
|
|
817
|
+
widgetLead: "agent 清單下方的小面板,用 JSON 撰寫。",
|
|
814
818
|
widgetNotJson: "不是 JSON。",
|
|
815
819
|
widgetSave: "儲存小工具",
|
|
816
820
|
widgetSaved: "已儲存側邊欄小工具。",
|
|
@@ -818,7 +822,7 @@ register("settings", {
|
|
|
818
822
|
widgetRemove: "移除小工具",
|
|
819
823
|
widgetRemoved: "已移除側邊欄小工具。",
|
|
820
824
|
modsTitle: "Mod",
|
|
821
|
-
modsLead: "
|
|
825
|
+
modsLead: "只套用你勾選的部分。",
|
|
822
826
|
modsLoadFailed: "無法載入已安裝的 mod。請重新載入頁面再試一次。",
|
|
823
827
|
modsNone: "尚未安裝任何 mod。",
|
|
824
828
|
modChoose: "匯入 mod 檔案…",
|
|
@@ -855,7 +859,7 @@ register("settings", {
|
|
|
855
859
|
modUninstallConfirm: "要解除安裝 {0} 嗎?它的效果會離開你的效果庫,除非還有東西在使用。它已套用的外觀會保留。",
|
|
856
860
|
modUninstalled: "已解除安裝 {0}。",
|
|
857
861
|
modExport: "匯出 mod",
|
|
858
|
-
modExportLead: "
|
|
862
|
+
modExportLead: "把目前生效的外觀存成 mod 檔。",
|
|
859
863
|
modExportInstance: "Agent",
|
|
860
864
|
modExportName: "名稱(a-z、0-9、-)",
|
|
861
865
|
modExportVersion: "版本",
|
|
@@ -867,7 +871,7 @@ register("settings", {
|
|
|
867
871
|
modReview: "檢視",
|
|
868
872
|
modDismiss: "略過",
|
|
869
873
|
cssTitle: "自訂 CSS(只套用在你自己)",
|
|
870
|
-
cssLead: "
|
|
874
|
+
cssLead: "只套用在你的畫面。",
|
|
871
875
|
cssLoadFailed: "無法載入你的自訂 CSS。請重新整理頁面再試一次。",
|
|
872
876
|
cssPublicLink: "臨時公開連結無法使用自訂 CSS。",
|
|
873
877
|
cssInForce: "使用中:{0}",
|
|
@@ -880,15 +884,14 @@ register("settings", {
|
|
|
880
884
|
cssCurrent: "使用中",
|
|
881
885
|
cssRestore: "改用這版",
|
|
882
886
|
cssAssets: "資源",
|
|
883
|
-
cssAssetsLead: "
|
|
887
|
+
cssAssetsLead: "{0} / {1} 個檔案,合計 {2}(全部合計最多 1 MiB)。",
|
|
884
888
|
cssAssetAdd: "加入圖片或字型",
|
|
885
889
|
cssAssetCopy: "複製引用",
|
|
886
890
|
cssCopied: "已複製 {0}",
|
|
887
891
|
cssAssetRemove: "移除",
|
|
888
892
|
cssDeviceTitle: "這台裝置",
|
|
889
893
|
cssDeviceOff: "在這台裝置關閉自訂 CSS",
|
|
890
|
-
|
|
891
|
-
cssSafe: "畫面被藏起來或壞掉了嗎?在任何頁面網址的最後加上 ?safe=1,就會不套用自訂 CSS 地載入。",
|
|
894
|
+
cssSafe: "畫面被藏起來?在網址後加上 ?safe=1。",
|
|
892
895
|
cssError_at_rule: "未儲存:不允許使用 {0}。",
|
|
893
896
|
cssError_url: "未儲存:url() 只能用 url(\"asset:<id>\") 引用「資源」裡的檔案。",
|
|
894
897
|
cssError_unknown_asset: "未儲存:找不到資源 {0}。請先在「資源」加入它。",
|
|
@@ -986,7 +989,6 @@ register("settings", {
|
|
|
986
989
|
discordUserPlaceholder: "你的 Discord 使用者 id",
|
|
987
990
|
telegramUserPlaceholder: "你的 Telegram 使用者 id",
|
|
988
991
|
bindingApplyButton: "改綁",
|
|
989
|
-
webEchoEnable: "開啟網頁轉發",
|
|
990
992
|
help1: "Agent:每個 agent 的設定、啟動/停止、暫停/喚醒,以及新增 agent。",
|
|
991
993
|
help2: "連線:誰可以使用各個 bot、它的綁定、狀態表情、新的 token;以及供應商 API key。",
|
|
992
994
|
help3: "ClassicBot:每個房間的 backend、model 與選項。",
|
|
@@ -60,7 +60,7 @@ export function t(key, ...values) {
|
|
|
60
60
|
|
|
61
61
|
register("app", {
|
|
62
62
|
en: {
|
|
63
|
-
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet overview", view: "View", settings: "Settings", instances: "Instances", newInstance: "New instance",
|
|
63
|
+
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet overview", view: "View", settings: "Settings", instances: "Instances", newInstance: "New instance", newAgent: "New agent",
|
|
64
64
|
collapse: "Hide the sidebar", expand: "Show the sidebar", openMenu: "Open the sidebar", closeMenu: "Close the sidebar",
|
|
65
65
|
resizeSidebar: "Sidebar width", resizeSidebarHint: "Drag to resize · double-click to reset",
|
|
66
66
|
names: "Names", namesNickname: "Nickname first", namesInstance: "Real name first",
|
|
@@ -92,7 +92,7 @@ register("app", {
|
|
|
92
92
|
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_permission: "Permission needed", needs_reason_dangerous_command: "Dangerous command waiting", needs_reason_login: "Sign-in needed", needs_reason_dialog: "Waiting at a dialog", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_crashed: "Crashed", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed",
|
|
93
93
|
},
|
|
94
94
|
"zh-TW": {
|
|
95
|
-
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance",
|
|
95
|
+
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance", newAgent: "新增 Agent",
|
|
96
96
|
collapse: "隱藏側邊欄", expand: "顯示側邊欄", openMenu: "打開側邊欄", closeMenu: "關閉側邊欄",
|
|
97
97
|
resizeSidebar: "側邊欄寬度", resizeSidebarHint: "拖曳調整寬度 · 按兩下恢復預設",
|
|
98
98
|
names: "名稱", namesNickname: "暱稱優先", namesInstance: "實際名稱優先",
|
|
@@ -40,7 +40,7 @@ export const SYNCED = {
|
|
|
40
40
|
"card.sizeByInstance": { ls: "agend_card_sizes", ...json },
|
|
41
41
|
// #1629 r4-4: the person's own sidebar widget ({ spec, data }), drawn by the page's own components.
|
|
42
42
|
"widget.sidebar": { ls: "agend_widget_sidebar", ...json },
|
|
43
|
-
// #1958: where identity colours show by default (
|
|
43
|
+
// #1958: where identity colours show by default (#2056: name, bar and ring unless chosen), and the host's switch to turn them off.
|
|
44
44
|
"color.show": { ls: "agend_color_show", ...json },
|
|
45
45
|
"color.off": { ls: "agend_color_off", toLocal: (v) => (v === true ? "on" : null), fromLocal: (s) => (s === "on" ? true : undefined) },
|
|
46
46
|
};
|
|
@@ -39,6 +39,25 @@ let newInstanceOpener = null;
|
|
|
39
39
|
export function setNewInstanceOpener(fn) { newInstanceOpener = fn; }
|
|
40
40
|
export function requestNewInstance() { if (newInstanceOpener) newInstanceOpener(); }
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* #2074: whether this page's session may make an agent — an admin's (/auth/session's tier); a guest's create is refused.
|
|
44
|
+
* Asked once per page; a session that ends takes the buttons away. A display hint only: the create route decides.
|
|
45
|
+
*/
|
|
46
|
+
export const canCreateStore = createStore({ value: false });
|
|
47
|
+
let canCreateOf = null; // the AgendAuth asked (one per page)
|
|
48
|
+
export function useCanCreate() {
|
|
49
|
+
const s = useStore(canCreateStore);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
const auth = typeof window !== "undefined" ? window.AgendAuth : undefined;
|
|
52
|
+
if (!auth || typeof auth.canWrite !== "function" || canCreateOf === auth) return;
|
|
53
|
+
canCreateOf = auth;
|
|
54
|
+
canCreateStore.set({ value: false });
|
|
55
|
+
Promise.resolve(auth.canWrite()).then((v) => { if (canCreateOf === auth && !auth.sessionEnded?.()) canCreateStore.set({ value: v === true }); }, () => {});
|
|
56
|
+
auth.onSessionEnd?.(() => { if (canCreateOf === auth) canCreateStore.set({ value: false }); });
|
|
57
|
+
}, []);
|
|
58
|
+
return s.value;
|
|
59
|
+
}
|
|
60
|
+
|
|
42
61
|
/** An app-level dialog (New instance): rendered by the shell until closed, whatever panel is showing. */
|
|
43
62
|
export function showDialog(Component, props = {}) { shellStore.set({ dialog: { Component, props } }); }
|
|
44
63
|
export function closeDialog() { shellStore.set({ dialog: null }); }
|
|
@@ -247,6 +266,7 @@ export function signInHref() {
|
|
|
247
266
|
function Sidebar({ route, onNewInstance, viewOnly }) {
|
|
248
267
|
const app = useStore(appStore);
|
|
249
268
|
const shell = useStore(shellStore);
|
|
269
|
+
const canCreate = useCanCreate();
|
|
250
270
|
// #1675: the Fleet panel is "Fleet overview"'s (one current row); the "Fleet" row is current on an instance's Details.
|
|
251
271
|
const on = (panel) => !!route && (panel === "fleet" ? route.panel === "details" : route.panel === panel);
|
|
252
272
|
const openInstance = openInstanceOf(route);
|
|
@@ -280,13 +300,13 @@ function Sidebar({ route, onNewInstance, viewOnly }) {
|
|
|
280
300
|
<div class="side-head" data-trust="navigation">
|
|
281
301
|
<a class="brand" href="/ui" onClick=${closeDrawer}>${t("app.brand")}</a>
|
|
282
302
|
<button type="button" class="icon-btn side-collapse" onClick=${toggleSidebar} aria-label=${narrow() ? t("app.closeMenu") : t("app.collapse")} title=${narrow() ? t("app.closeMenu") : t("app.collapse")} aria-controls="sidebar"><${Icon} name="sidebar" /></button>
|
|
283
|
-
<button type="button" class="icon-btn" onClick=${onNewInstance} aria-label=${t("app.newInstance")} title=${t("app.newInstance")}><${Icon} name="plus" /></button>
|
|
284
303
|
</div>
|
|
285
304
|
<nav data-trust="navigation" class="side-nav" aria-label=${t("app.menu")}>
|
|
286
305
|
${overview}
|
|
287
306
|
${navLink("needs", NEEDS_PATH, "inbox", t("app.needsNav"), needsCount)}
|
|
288
307
|
${navLink("fleet", openInstance ? detailsPath(openInstance) : "/ui/fleet", "fleet", t("app.fleet"))}
|
|
289
308
|
${navLink("view", "/view", "view", t("app.view"))}
|
|
309
|
+
${canCreate && onNewInstance ? html`<button type="button" class="side-row side-new" onClick=${onNewInstance}><${Icon} name="plus" /><span class="grow">${t("app.newAgent")}</span></button>` : null}
|
|
290
310
|
</nav>
|
|
291
311
|
${shell.side ? html`<${shell.side.Component} />` : html`<${InstanceNav} route=${route} items=${app.instances} loaded=${app.ready !== false}
|
|
292
312
|
exec=${app.exec} awaiting=${app.awaiting} onPick=${closeDrawer} />`}
|
|
@@ -349,9 +369,11 @@ function PrefsPopover() {
|
|
|
349
369
|
*/
|
|
350
370
|
export function PanelHeader({ title, sub, children, headingRef, nav }) {
|
|
351
371
|
const shell = useStore(shellStore);
|
|
372
|
+
const canCreate = useCanCreate() && !!newInstanceOpener;
|
|
352
373
|
return html`<header data-trust="header" class=${`panel-head${shell.collapsed ? " collapsed" : ""}`}>
|
|
353
374
|
<button type="button" id="sbOpen" class="icon-btn sb-open" onClick=${() => (narrow() ? openDrawer() : toggleSidebar())}
|
|
354
375
|
aria-label=${narrow() ? t("app.openMenu") : t("app.expand")} title=${narrow() ? t("app.openMenu") : t("app.expand")} aria-controls="sidebar" aria-expanded=${shell.drawer ? "true" : "false"}><${Icon} name="menu" /></button>
|
|
376
|
+
${canCreate && shell.collapsed ? html`<button type="button" class="icon-btn sb-new" onClick=${requestNewInstance} aria-label=${t("app.newAgent")} title=${t("app.newAgent")}><${Icon} name="plus" /></button>` : null}
|
|
355
377
|
<div class="panel-title"><h1 ref=${headingRef} tabindex="-1">${title}</h1>${sub ? html`<div class="panel-sub">${sub}</div>` : null}</div>
|
|
356
378
|
${nav || null}
|
|
357
379
|
<div class="panel-actions">${children}</div>
|
|
@@ -42,7 +42,18 @@ export function applyStatus(d) {
|
|
|
42
42
|
// #1629: the agents' themes' revision (app-themes.js re-reads them when it moves).
|
|
43
43
|
themesRev: typeof d.themes_rev === "number" ? d.themes_rev : null,
|
|
44
44
|
// #1685: host memory pressure slowing or holding new agents ("elevated" | "critical"), else null.
|
|
45
|
-
hostMemory: d.host_memory === "elevated" || d.host_memory === "critical" ? d.host_memory : null
|
|
45
|
+
hostMemory: d.host_memory === "elevated" || d.host_memory === "critical" ? d.host_memory : null,
|
|
46
|
+
// #2015: while it lasts, the largest processes in the fleet and whose they are (at most 3; anything else dropped).
|
|
47
|
+
hostMemoryTop: hostMemoryTop(d.host_memory_top) });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** #2015: the status frame's host_memory_top, as the dashboard keeps it: well-formed entries only, at most 3. */
|
|
51
|
+
export function hostMemoryTop(raw) {
|
|
52
|
+
if (!Array.isArray(raw)) return [];
|
|
53
|
+
return raw.slice(0, 3).flatMap(p => p && typeof p.name === "string" && Number.isSafeInteger(p.pid) && Number.isSafeInteger(p.rssBytes) && p.rssBytes >= 0
|
|
54
|
+
&& ["fleet", "tmux", "instance", "other"].includes(p.owner)
|
|
55
|
+
? [{ name: p.name.slice(0, 64), pid: p.pid, rssBytes: p.rssBytes, owner: p.owner, ...(p.owner === "instance" && typeof p.instance === "string" ? { instance: p.instance.slice(0, 128) } : {}) }]
|
|
56
|
+
: []);
|
|
46
57
|
}
|
|
47
58
|
|
|
48
59
|
/** One "activity" event: an instance started or stopped working. */
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
// - suspend()/resume(): the page is leaving (pagehide) / came back from the back-forward cache.
|
|
31
31
|
|
|
32
32
|
// #1218: steps_tick — an instance's transcript moved while a Log watches it (SSE only: a poll page asks the Log itself).
|
|
33
|
-
|
|
33
|
+
// #1918: traffic — a message between instances moved (SSE only: the org canvas reads /ui/traffic when it has no stream).
|
|
34
|
+
const EVENTS = ["status", "message", "agent_reply_live", "delivery", "deliveries", "prompt", "prompts", "prompt_resolved", "activity", "needs", "reply_buttons", "steps_tick", "clock", "traffic"];
|
|
34
35
|
const MAX_HELD = 1000; // live events held during one catch-up read; more → read again afterwards
|
|
35
36
|
const RETRY_DELAYS = [1000, 2000, 4000]; // after the first failed catch-up read; then it waits for Retry
|
|
36
37
|
const POLL_LIMIT_MS = 10000; // a poll that has not answered by then counts as failed
|