@songsid/agend 2.3.4-beta.1 → 2.3.4-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/THIRD_PARTY_NOTICES.md +37 -0
- package/dist/agend-home.d.ts +13 -0
- package/dist/agend-home.js +42 -0
- package/dist/agend-home.js.map +1 -1
- package/dist/agent-cli-instructions.md +1 -1
- package/dist/agent-credentials.d.ts +24 -0
- package/dist/agent-credentials.js +66 -0
- package/dist/agent-credentials.js.map +1 -0
- package/dist/agent-endpoint.d.ts +3 -1
- package/dist/agent-endpoint.js +13 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/auth-api.js +10 -2
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +28 -4
- package/dist/authority/session-authorizations.js +63 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/backend/antigravity.js +3 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +3 -0
- package/dist/backend/claude-code.js +89 -4
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +4 -0
- package/dist/backend/codex-footer-hints.js +27 -0
- package/dist/backend/codex-footer-hints.js.map +1 -0
- package/dist/backend/codex-metadata.d.ts +14 -0
- package/dist/backend/codex-metadata.js +45 -0
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex-session-lookup.d.ts +35 -0
- package/dist/backend/codex-session-lookup.js +93 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex-speed.d.ts +14 -0
- package/dist/backend/codex-speed.js +35 -0
- package/dist/backend/codex-speed.js.map +1 -0
- package/dist/backend/codex.d.ts +27 -0
- package/dist/backend/codex.js +133 -25
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/kiro-identity.d.ts +2 -0
- package/dist/backend/kiro-identity.js +13 -6
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +68 -5
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +5 -3
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +6 -1
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +6 -0
- package/dist/backend-availability.js +13 -5
- package/dist/backend-availability.js.map +1 -1
- package/dist/cache-ledger.d.ts +95 -0
- package/dist/cache-ledger.js +276 -4
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +5 -0
- package/dist/cache-service.js +16 -4
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.js +27 -4
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +238 -18
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/inbox-temp-name.d.ts +9 -0
- package/dist/channel/inbox-temp-name.js +13 -0
- package/dist/channel/inbox-temp-name.js.map +1 -0
- package/dist/channel/mcp-tools.js +3 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +2 -0
- package/dist/chat-log-ids.d.ts +48 -0
- package/dist/chat-log-ids.js +182 -0
- package/dist/chat-log-ids.js.map +1 -0
- package/dist/classic-channel-manager.d.ts +8 -1
- package/dist/classic-channel-manager.js +24 -2
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +4 -6
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +5 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +10 -0
- package/dist/cross-instance-notice.js +67 -5
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +52 -0
- package/dist/daemon.js +530 -34
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +23 -1
- package/dist/delivery-consumed-watch.js +30 -3
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +7 -0
- package/dist/delivery-reconciliation.js +9 -1
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/dialog-screen-text.d.ts +16 -0
- package/dist/dialog-screen-text.js +51 -0
- package/dist/dialog-screen-text.js.map +1 -0
- package/dist/export-import.d.ts +7 -0
- package/dist/export-import.js +44 -10
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -0
- package/dist/fleet-manager.d.ts +147 -11
- package/dist/fleet-manager.js +747 -118
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-yaml-patch.d.ts +3 -0
- package/dist/fleet-yaml-patch.js +103 -0
- package/dist/fleet-yaml-patch.js.map +1 -0
- package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +2 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +10 -4
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/install-stream.d.ts +53 -0
- package/dist/install-stream.js +134 -0
- package/dist/install-stream.js.map +1 -0
- package/dist/instance-config-impact.js +2 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +20 -2
- package/dist/instance-lifecycle.js +80 -12
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-topic-delete.d.ts +77 -0
- package/dist/instance-topic-delete.js +123 -0
- package/dist/instance-topic-delete.js.map +1 -0
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +1 -1
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +11 -0
- package/dist/kiro-engine-status.js +6 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-resume-summary.d.ts +37 -0
- package/dist/kiro-resume-summary.js +85 -0
- package/dist/kiro-resume-summary.js.map +1 -0
- package/dist/locale.js +90 -6
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +30 -0
- package/dist/log-service.js +36 -3
- package/dist/log-service.js.map +1 -1
- package/dist/log-steps.d.ts +4 -3
- package/dist/log-steps.js +32 -7
- package/dist/log-steps.js.map +1 -1
- package/dist/logger.d.ts +12 -0
- package/dist/logger.js +43 -1
- package/dist/logger.js.map +1 -1
- package/dist/login-controller.js +9 -1
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.d.ts +2 -0
- package/dist/login-flows.js +5 -2
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.d.ts +6 -0
- package/dist/login-manager.js +10 -1
- package/dist/login-manager.js.map +1 -1
- package/dist/missed-offline.d.ts +25 -0
- package/dist/missed-offline.js +79 -0
- package/dist/missed-offline.js.map +1 -0
- package/dist/needs-you-hub.d.ts +6 -1
- package/dist/needs-you-hub.js +31 -8
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +22 -2
- package/dist/needs-you.js +17 -3
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.d.ts +1 -1
- package/dist/office-share-page.js +6 -2
- package/dist/office-share-page.js.map +1 -1
- package/dist/outbound-handlers.js +59 -3
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +1 -0
- package/dist/outbound-schemas.js +9 -3
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/package-preimage.js +27 -2
- package/dist/package-preimage.js.map +1 -1
- package/dist/queued-handoffs.d.ts +33 -0
- package/dist/queued-handoffs.js +75 -0
- package/dist/queued-handoffs.js.map +1 -0
- package/dist/reply-buttons-controller.js +10 -0
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/scheduler/db.d.ts +2 -1
- package/dist/scheduler/db.js +23 -9
- package/dist/scheduler/db.js.map +1 -1
- package/dist/selection-card.d.ts +2 -3
- package/dist/selection-card.js +99 -26
- package/dist/selection-card.js.map +1 -1
- package/dist/settings-api.d.ts +13 -0
- package/dist/settings-api.js +22 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +16 -1
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-instance-patch.js +27 -0
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/stall-reporter.d.ts +21 -0
- package/dist/stall-reporter.js +82 -0
- package/dist/stall-reporter.js.map +1 -0
- package/dist/tmux-control.d.ts +2 -2
- package/dist/tmux-control.js +4 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +6 -3
- package/dist/tmux-exec-helper.js +115 -53
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +6 -0
- package/dist/tmux-manager.js +17 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +6 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.d.ts +2 -0
- package/dist/tool-progress.js +19 -3
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.js +4 -0
- package/dist/topic-commands.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +4 -0
- package/dist/tunnel/cloudflared-install.js +20 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +8 -1
- package/dist/tunnel/cloudflared.js +34 -6
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.d.ts +3 -3
- package/dist/tunnel/lease.js +23 -19
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js +6 -7
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/ui/chat-md-strings.js +9 -0
- package/dist/ui/chat-store.js +20 -3
- package/dist/ui/chat-strings.js +4 -4
- package/dist/ui/chat-thread.js +105 -13
- package/dist/ui/fleet-canvas.js +4 -3
- package/dist/ui/fleet-office-model.js +55 -22
- package/dist/ui/fleet-office-overview.js +6 -38
- package/dist/ui/fleet-office-pack.js +4 -3
- package/dist/ui/fleet-office-skin.js +114 -21
- package/dist/ui/fleet-office-store.js +5 -0
- package/dist/ui/fleet-office-zones.js +2 -2
- package/dist/ui/fleet-office.js +41 -9
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/panel-chat.js +5 -2
- package/dist/ui/panel-log.js +7 -1
- package/dist/ui/panel-needs.js +17 -8
- package/dist/ui/preview-panel.js +78 -2
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-dialogs.js +8 -0
- package/dist/ui/settings-model.js +16 -2
- package/dist/ui/settings-strings.js +2 -2
- package/dist/ui/shared/app-i18n.js +4 -4
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-shell.js +4 -2
- package/dist/ui/shared/app-stream.js +26 -0
- package/dist/ui/shared/app.css +55 -3
- package/dist/ui/shared/office/guild.png +0 -0
- package/dist/ui/shared/office/school.png +0 -0
- package/dist/ui/shared/panel-view.js +339 -17
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/view-history.css +17 -0
- package/dist/ui/shared/view-history.js +438 -0
- package/dist/ui/shared/view-strings.js +42 -0
- package/dist/unattended-install.d.ts +6 -0
- package/dist/unattended-install.js +79 -0
- package/dist/unattended-install.js.map +1 -0
- package/dist/usage/capacity.d.ts +69 -0
- package/dist/usage/capacity.js +119 -0
- package/dist/usage/capacity.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +3 -0
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/profile-timeline.d.ts +16 -0
- package/dist/usage/profile-timeline.js +58 -0
- package/dist/usage/profile-timeline.js.map +1 -0
- package/dist/usage/quota-history.d.ts +43 -0
- package/dist/usage/quota-history.js +168 -0
- package/dist/usage/quota-history.js.map +1 -0
- package/dist/usage/usage-api.d.ts +31 -0
- package/dist/usage/usage-api.js +80 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +25 -1
- package/dist/usage-report.js +55 -4
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +6 -1
- package/dist/usage-rollup.js +16 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/view-api.d.ts +31 -0
- package/dist/view-api.js +186 -41
- package/dist/view-api.js.map +1 -1
- package/dist/view-history.d.ts +84 -0
- package/dist/view-history.js +116 -0
- package/dist/view-history.js.map +1 -0
- package/dist/web-api.d.ts +6 -0
- package/dist/web-api.js +15 -4
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +20 -0
- package/dist/web-chat-history.js +21 -0
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-guest-access.js +5 -1
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-login.d.ts +4 -3
- package/dist/web-login.js +23 -14
- package/dist/web-login.js.map +1 -1
- package/dist/web-office-pack-tools.d.ts +1 -1
- package/dist/web-office-pack-tools.js +1 -1
- package/dist/web-office-pack-tools.js.map +1 -1
- package/dist/web-session-authorization.d.ts +13 -2
- package/dist/web-session-authorization.js +10 -3
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.d.ts +5 -0
- package/dist/web-session.js +20 -8
- package/dist/web-session.js.map +1 -1
- package/launcher/agend-install.cjs +16 -2
- package/launcher/private-home.cjs +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// M-2446: the agent dialog's Codex speed words, lazy and fixed. A tab opened before an upgrade may keep the old
|
|
2
|
+
// settings-strings module while the dialog module is fresh: these words live here, registered with the dialog.
|
|
3
|
+
import { register } from "/assets/app-i18n.js";
|
|
4
|
+
register("settings", {
|
|
5
|
+
en: {
|
|
6
|
+
codexSpeed: "Speed",
|
|
7
|
+
codexSpeedDefault: "Codex default",
|
|
8
|
+
codexSpeedStandard: "Standard",
|
|
9
|
+
codexSpeedFast: "Fast",
|
|
10
|
+
codexSpeedHint: "Fast: uses plan limits at 2.5× (OpenAI). Only for models that offer Fast; otherwise the agent starts without it and the log says why. Changing it restarts the agent.",
|
|
11
|
+
},
|
|
12
|
+
"zh-TW": {
|
|
13
|
+
codexSpeed: "速度",
|
|
14
|
+
codexSpeedDefault: "Codex 預設",
|
|
15
|
+
codexSpeedStandard: "標準",
|
|
16
|
+
codexSpeedFast: "快速",
|
|
17
|
+
codexSpeedHint: "快速:方案額度以 2.5 倍消耗(OpenAI)。只適用於提供 Fast 的模型;不支援時 Agent 會照常啟動,並在記錄中說明原因。變更後會重新啟動 Agent。",
|
|
18
|
+
},
|
|
19
|
+
});
|
|
@@ -25,6 +25,10 @@ import {
|
|
|
25
25
|
chLabel, dashboardDefault, hasOwn, impactOf, newConnectionImpact, nonNegative, nonNegativeInteger, positive, replyGuardSupported, sameValue, visibilityDefault,
|
|
26
26
|
classicWebEchoEffective, toolSetDefault, worstImpact,
|
|
27
27
|
} from "./settings-model.js";
|
|
28
|
+
import "./settings-codex-copy.js"; // M-2446: the Speed field's words (a retained old settings-strings lacks them)
|
|
29
|
+
/** M-2446: Codex speed choices (backend_options.codex.speed); "" = unset. Local, not imported: a stale tab may keep an
|
|
30
|
+
* older settings-model.js, and a new named import would fail this module's load. */
|
|
31
|
+
const CODEX_SPEED_CHOICES = ["", "standard", "fast"];
|
|
28
32
|
/** #2342: a field by id, for recordEdit before a pick or a reset writes it. */
|
|
29
33
|
const byId = (id) => (typeof document !== "undefined" ? document.getElementById(id) : null);
|
|
30
34
|
|
|
@@ -298,6 +302,10 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
298
302
|
${inheritedBackend ? html`<${Inherited} ...${inh("backend", f.backend, "#g-be", "backend")} />` : null}</div>
|
|
299
303
|
<div class="field">${L(tn("model"), "instance.model", "ag-model")}<${ModelSelect} id="ag-model" value=${f.model} onChange=${set("model")}
|
|
300
304
|
backend=${f.backend || defaults.backend || "claude-code"} instance=${name} inherit=${tn("inheritValue", defaults.model || tn("modelCliDefault"))} /></div>
|
|
305
|
+
${(f.backend || defaults.backend || "claude-code") === "codex" ? html`<div class="field codex-speed">${L(tn("codexSpeed"), "instance.backend_options", "ag-speed")}
|
|
306
|
+
<${Select} id="ag-speed" value=${f.codex_speed} onChange=${set("codex_speed")}
|
|
307
|
+
options=${CODEX_SPEED_CHOICES.map((v) => ({ value: v, label: tn(v === "fast" ? "codexSpeedFast" : v === "standard" ? "codexSpeedStandard" : "codexSpeedDefault") }))} />
|
|
308
|
+
<p class="note">${tn("codexSpeedHint")}</p></div>` : null}
|
|
301
309
|
</div>
|
|
302
310
|
<div class="field">${L(tn("workingDir"), "instance.working_directory", "ag-wd")}<input id="ag-wd" type="text" value=${f.working_directory} onInput=${(e) => set("working_directory")(e.target.value)} /></div>
|
|
303
311
|
<div class="field">${L(`${tn("autoPause")} (${tn("minutes")})`, "instance.auto_pause_after", "ag-auto")}
|
|
@@ -167,6 +167,11 @@ export function groupAgents(instances, live, filter, groupFor = (n) => groupOf(i
|
|
|
167
167
|
* (the key is removed); the visibility baseline is what the picker showed, so a value it cannot show (a typo, read as
|
|
168
168
|
* unset) is never rewritten by an unrelated edit (#1302).
|
|
169
169
|
*/
|
|
170
|
+
/** The agent's own Codex speed, as the picker shows it ("" when unset or not one AgEnD knows). */
|
|
171
|
+
export function codexSpeedOf(inst) {
|
|
172
|
+
const v = inst && inst.backend_options && inst.backend_options.codex && inst.backend_options.codex.speed;
|
|
173
|
+
return v === "fast" || v === "standard" ? v : "";
|
|
174
|
+
}
|
|
170
175
|
export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmojisBaseline) {
|
|
171
176
|
const hang = inst.hang_detector || {};
|
|
172
177
|
const next = {
|
|
@@ -190,7 +195,7 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
190
195
|
office_access: separateChoice(form.dashboard.office),
|
|
191
196
|
office_pack_access: separateChoice(form.dashboard.office_packs),
|
|
192
197
|
};
|
|
193
|
-
return changedFields(next, {
|
|
198
|
+
return Object.assign(changedFields(next, {
|
|
194
199
|
backend: inst.backend || defaults.backend || "claude-code",
|
|
195
200
|
model: (inst.model && inst.model.trim()) || null,
|
|
196
201
|
working_directory: inst.working_directory || "",
|
|
@@ -214,7 +219,15 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
214
219
|
dashboard: dashboardPatchValue(dashboardForm(inst)),
|
|
215
220
|
office_access: separateChoice(dashboardForm(inst).office),
|
|
216
221
|
office_pack_access: separateChoice(dashboardForm(inst).office_packs),
|
|
217
|
-
});
|
|
222
|
+
}), codexSpeedPatch(form, inst));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* M-2446: only the Codex speed key, merged per backend by the server (settings-instance-patch.ts), so the agent's other
|
|
226
|
+
* backend options are kept; back to "" removes it (null). Nothing when it did not change.
|
|
227
|
+
*/
|
|
228
|
+
function codexSpeedPatch(form, inst) {
|
|
229
|
+
const next = form.codex_speed || "";
|
|
230
|
+
return next === codexSpeedOf(inst) ? {} : { backend_options: { codex: { speed: next || null } } };
|
|
218
231
|
}
|
|
219
232
|
|
|
220
233
|
/** The agent form's starting values (an override shows the inherited value while "inherit" is on). */
|
|
@@ -245,6 +258,7 @@ export function agentForm(inst, defaults, name = "") {
|
|
|
245
258
|
display_name: inst.display_name ?? defaults.display_name ?? "",
|
|
246
259
|
status_emojis: inst.status_emojis || null,
|
|
247
260
|
dashboard: dashboardForm(inst),
|
|
261
|
+
codex_speed: codexSpeedOf(inst),
|
|
248
262
|
inherit: {
|
|
249
263
|
auto_pause_after: inherit("auto_pause_after"), hang: !hasOwn(hang, "timeout_minutes"), agent_mode: inherit("agent_mode"),
|
|
250
264
|
tool_set: inherit("tool_set"), tool_progress: inherit("tool_progress"), cross_instance_visibility: inherit("cross_instance_visibility"),
|
|
@@ -166,7 +166,7 @@ register("settings", {
|
|
|
166
166
|
failed: "Failed",
|
|
167
167
|
actionFailed: "{0} failed",
|
|
168
168
|
noAgentMatch: "No agents match \"{0}\".",
|
|
169
|
-
deleteAgent: "Delete agent \"{0}\"? This will be applied only after you confirm the pending changes.",
|
|
169
|
+
deleteAgent: "Delete agent \"{0}\" and its chat topic (on Discord, its channel and history)? This will be applied only after you confirm the pending changes.",
|
|
170
170
|
nameRequired: "name required",
|
|
171
171
|
tokenEnvRequired: "token env required",
|
|
172
172
|
removeBot: "Remove bot \"{0}\"? (the token in .env is left untouched)",
|
|
@@ -823,7 +823,7 @@ register("settings", {
|
|
|
823
823
|
failed: "失敗",
|
|
824
824
|
actionFailed: "{0}失敗",
|
|
825
825
|
noAgentMatch: "沒有符合「{0}」的 Agent。",
|
|
826
|
-
deleteAgent: "確定刪除 Agent「{0}
|
|
826
|
+
deleteAgent: "確定刪除 Agent「{0}」及它的聊天 topic(在 Discord 上是它的頻道與訊息記錄)嗎?只有在確認套用待處理變更後才會生效。",
|
|
827
827
|
nameRequired: "必須填寫名稱",
|
|
828
828
|
tokenEnvRequired: "必須填寫 token 環境變數",
|
|
829
829
|
removeBot: "確定移除機器人「{0}」嗎?(.env 中的 token 會保留)",
|
|
@@ -78,7 +78,7 @@ register("app", {
|
|
|
78
78
|
statusQueued: "queued", statusStarting: "starting", fleetStarting: "Fleet starting {0}/{1}…", statusRunning: "running", statusStopped: "stopped", statusPaused: "paused", statusCrashed: "crashed", statusWorking: "working", statusStuck: "looks stuck", statusIdle: "idle",
|
|
79
79
|
connReconnecting: "Can't reach AgEnD — it may be restarting. Reconnecting…", connReconnectingIn: "Can't reach AgEnD — it may be restarting. Trying again in {0} s.",
|
|
80
80
|
hydrating: "Loading what is open now…", hydrateFailed: "Could not load what is open now (prompts, ticks).",
|
|
81
|
-
skip: "Skip to the conversation", loadFailed: "This could not be loaded.", retry: "Try again", loading: "Loading…",
|
|
81
|
+
skip: "Skip to the conversation", loadFailed: "This could not be loaded.", retry: "Try again", reloadPage: "Reload the page", loading: "Loading…",
|
|
82
82
|
noInstances: "No instances yet", noInstancesHint: "Create one to start chatting.",
|
|
83
83
|
guestChip: "Guest", guestAs: "Guest · {0}", guestAsOn: "Guest · {0} ({1})", guestHint: "You see only the agents you can already use in chat.",
|
|
84
84
|
session: "Session", signIn: "Sign in", signedIn: "Signed in", signedOut: "Not signed in", thisDevice: "This device", devicePrefs: "Theme and language",
|
|
@@ -111,7 +111,7 @@ register("app", {
|
|
|
111
111
|
confirmTitle: "Please confirm", confirmOk: "Continue", cancel: "Cancel",
|
|
112
112
|
sidePanelLeave: "Leave {0} without saving? Your changes there will be lost.", sidePanelDiscard: "Discard changes",
|
|
113
113
|
// The server's own wording (src/locale.ts needs.reason.*), so the web says what Discord says.
|
|
114
|
-
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", 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_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
|
|
114
|
+
needs_reason_hang: "Not responding", needs_reason_exited: "Exited", needs_reason_assist: "Waiting at its terminal", needs_reason_question: "Asking you a question", 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_kiro_choice: "Kiro needs your decision", needs_reason_terminal_input: "May be waiting for input", needs_reason_auth_paused: "Paused: sign-in needed", needs_reason_backend_signin: "Backend sign-in needed", needs_reason_config_invalid: "Configuration file needs attention", needs_reason_config_fallback: "Running on stored configuration", config_history_edit: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. The next restart would use the stored valid copy from {4}. Correct the YAML error; the file has not been changed by AgEnD.", config_history_no_history: "{0}, line {1}, column {2}: {3}. AgEnD is still running on the previous settings. No stored valid copy is available, so the next restart cannot recover automatically. Correct the YAML error before restarting; the file has not been changed by AgEnD.", config_history_fallback: "{0}, line {1}, column {2}: {3}. AgEnD started using the stored valid copy from {4}. Correct the YAML error and reload the settings. The file on disk has not been changed by AgEnD.", needs_reason_crashed: "Crashed", needs_reason_usage_limit: "Usage limit reached · reset time unknown", needs_reason_delivery_uncertain: "Could not confirm delivery", needs_reason_delivery_failed: "Delivery failed", needs_reason_missed_offline: "Missed while AgEnD was offline", needs_reason_task_review: "Waiting for your confirmation", needs_reason_task_blocked: "Blocked: asks you",
|
|
115
115
|
},
|
|
116
116
|
"zh-TW": {
|
|
117
117
|
brand: "AgEnD", fleet: "Fleet", fleetOverview: "Fleet 概覽", view: "檢視", settings: "設定", instances: "Instances", newInstance: "新增 instance", newAgent: "新增 Agent",
|
|
@@ -126,7 +126,7 @@ register("app", {
|
|
|
126
126
|
statusQueued: "等待啟動", statusStarting: "啟動中", fleetStarting: "Fleet 啟動中 {0}/{1}…", statusRunning: "執行中", statusStopped: "已停止", statusPaused: "已暫停", statusCrashed: "已當掉", statusWorking: "工作中", statusStuck: "似乎卡住", statusIdle: "閒置",
|
|
127
127
|
connReconnecting: "連不上 AgEnD——可能正在重新啟動。正在重新連線…", connReconnectingIn: "連不上 AgEnD——可能正在重新啟動。{0} 秒後再試。",
|
|
128
128
|
hydrating: "正在載入目前的狀態…", hydrateFailed: "無法載入目前的狀態(提示、送達標記)。",
|
|
129
|
-
skip: "跳到對話", loadFailed: "無法載入。", retry: "再試一次", loading: "載入中…",
|
|
129
|
+
skip: "跳到對話", loadFailed: "無法載入。", retry: "再試一次", reloadPage: "重新載入頁面", loading: "載入中…",
|
|
130
130
|
noInstances: "還沒有 instance", noInstancesHint: "建立一個就能開始聊天。",
|
|
131
131
|
guestChip: "訪客", guestAs: "訪客 · {0}", guestAsOn: "訪客 · {0}({1})", guestHint: "你只會看到在聊天中本來就能用的 agent。",
|
|
132
132
|
session: "登入狀態", signIn: "登入", signedIn: "已登入", signedOut: "尚未登入", thisDevice: "這台裝置", devicePrefs: "主題與語言",
|
|
@@ -156,6 +156,6 @@ register("app", {
|
|
|
156
156
|
search: "搜尋", searchTitle: "搜尋聊天、agent 之間的訊息與任務({0})",
|
|
157
157
|
confirmTitle: "請確認", confirmOk: "繼續", cancel: "取消",
|
|
158
158
|
sidePanelLeave: "不儲存就離開「{0}」?你在那裡的修改會遺失。", sidePanelDiscard: "捨棄修改",
|
|
159
|
-
needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
|
|
159
|
+
needs_reason_hang: "沒有回應", needs_reason_exited: "已結束", needs_reason_assist: "在終端機上等待", needs_reason_question: "正在問你問題", needs_reason_permission: "需要權限", needs_reason_dangerous_command: "危險指令待確認", needs_reason_login: "需要登入", needs_reason_dialog: "停在對話框", needs_reason_kiro_choice: "Kiro 需要你決定", needs_reason_terminal_input: "可能在等輸入", needs_reason_auth_paused: "已暫停:需要登入", needs_reason_backend_signin: "後端需要登入", needs_reason_config_invalid: "設定檔需要處理", needs_reason_config_fallback: "正在使用儲存的設定副本", config_history_edit: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。下次重新啟動會改用 {4} 儲存的有效副本。請修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_no_history: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 仍使用先前的設定執行。沒有可用的有效副本,下次重新啟動將無法自動恢復。請在重新啟動前修正 YAML 錯誤;AgEnD 未更動此檔案。", config_history_fallback: "{0} 第 {1} 行、第 {2} 欄:{3}。AgEnD 已使用 {4} 儲存的有效副本啟動。請修正 YAML 錯誤並重新載入設定。AgEnD 未更動磁碟上的檔案。", needs_reason_crashed: "已崩潰", needs_reason_usage_limit: "用量已達上限 · 恢復時間未知", needs_reason_delivery_uncertain: "無法確認是否送達", needs_reason_delivery_failed: "傳送失敗", needs_reason_missed_offline: "AgEnD 離線時錯過", needs_reason_task_review: "等你確認", needs_reason_task_blocked: "卡住,在問你",
|
|
160
160
|
},
|
|
161
161
|
});
|
|
@@ -63,7 +63,7 @@ export const configDetail = (item) => {
|
|
|
63
63
|
const issue = item.configIssue;
|
|
64
64
|
return issue ? t(`app.config_history_${issue.mode === "fallback" ? "fallback" : issue.time ? "edit" : "no_history"}`, issue.file, issue.line, issue.column, issue.reason, issue.time || "") : item.detail;
|
|
65
65
|
};
|
|
66
|
-
export const reasonText = (item) => t(`app.needs_reason_${item.reason}`);
|
|
66
|
+
export const reasonText = (item) => t(`app.needs_reason_${item.kiroChoice ? "kiro_choice" : item.reason}`);
|
|
67
67
|
|
|
68
68
|
let stop = null;
|
|
69
69
|
|
|
@@ -508,12 +508,14 @@ function BottomTabs({ route, viewOnly }) {
|
|
|
508
508
|
</nav>`;
|
|
509
509
|
}
|
|
510
510
|
|
|
511
|
-
function ConnectionLine() {
|
|
511
|
+
export function ConnectionLine() {
|
|
512
512
|
const { connection, hydration, retryHydration } = useStore(appStore);
|
|
513
513
|
// A late catch-up that is not done: the chat may be missing what was open before it loaded (#1425 review).
|
|
514
|
+
// M-2260: never a dead end — beside Try again, a reload reads everything current, whatever kept the catch-up from it.
|
|
514
515
|
if (hydration === "retrying" || hydration === "failed") {
|
|
515
516
|
return html`<div data-trust="status" class="conn" role="status">${hydration === "failed" ? t("app.hydrateFailed") : t("app.hydrating")}
|
|
516
|
-
${hydration === "failed" && retryHydration ? html` <button type="button" class="btn btn-sm" onClick=${() => retryHydration()}>${t("app.retry")}</button>` : null}
|
|
517
|
+
${hydration === "failed" && retryHydration ? html` <button type="button" class="btn btn-sm" onClick=${() => retryHydration()}>${t("app.retry")}</button>` : null}
|
|
518
|
+
${hydration === "failed" ? html` <button type="button" class="btn btn-sm" onClick=${() => location.reload()}>${t("app.reloadPage")}</button>` : null}</div>`;
|
|
517
519
|
}
|
|
518
520
|
if (connection === "reconnecting") return html`<${Reconnecting} />`;
|
|
519
521
|
// #1603: polling is a working transport (the public link polls by design; a buffering proxy makes a page poll), not
|
|
@@ -27,6 +27,9 @@
|
|
|
27
27
|
// - every reconnect catches up once the new stream speaks (catchUp(), with the page's cursor — #1566/#1578), so what
|
|
28
28
|
// was said meanwhile is shown, once.
|
|
29
29
|
// - a 401 is the session ending: nothing is retried (agend-auth.js says so).
|
|
30
|
+
// - M-2260: a catch-up after a long absence carries only the newest messages (the server's budget) and says so
|
|
31
|
+
// (`truncated`): "gap" tells the chats to read their newest history again — it converges like a reload, never by
|
|
32
|
+
// asking a slow link for hours of replies in one answer.
|
|
30
33
|
// - suspend()/resume(): the page is leaving (pagehide) / came back from the back-forward cache.
|
|
31
34
|
|
|
32
35
|
// #1218: steps_tick — an instance's transcript moved while a Log watches it (SSE only: a poll page asks the Log itself).
|
|
@@ -79,6 +82,22 @@ export function createStream(opts) {
|
|
|
79
82
|
try { return Object.freeze({ source: "sse", receivedAt: now() }); } catch { return undefined; }
|
|
80
83
|
}
|
|
81
84
|
function setConnection(c) { if (state.connection !== c) { state.connection = c; emit("connection", c); } }
|
|
85
|
+
|
|
86
|
+
// M-2260: a tab the browser froze for hours gets every heartbeat it missed at once when it wakes — thousands of status
|
|
87
|
+
// frames, each a whole snapshot, each redrawing the page (seconds of work before the newest message shows). A status
|
|
88
|
+
// that comes after a quiet moment is delivered at once, as before; more statuses before the next turn of the page's
|
|
89
|
+
// task loop replace the waiting one, delivered then — or before any other event, so the order of events never changes.
|
|
90
|
+
// The next turn is a 0 ms timer: in a hidden tab the browser may run it late (a minute when throttled) — a status
|
|
91
|
+
// then waits that long while nobody looks (Needs you, the title's count and notifications ride `needs`, never held).
|
|
92
|
+
let pendingStatus = null, statusBurst = false;
|
|
93
|
+
const turn = () => env.setTimeout(endBurst, 0);
|
|
94
|
+
function endBurst() { statusBurst = false; flushStatus(); }
|
|
95
|
+
function flushStatus() { const d = pendingStatus; pendingStatus = null; if (d !== null) live("status", d, null); }
|
|
96
|
+
function liveStatus(data) {
|
|
97
|
+
if (statusBurst) { pendingStatus = data; return; }
|
|
98
|
+
statusBurst = true; turn();
|
|
99
|
+
live("status", data, null);
|
|
100
|
+
}
|
|
82
101
|
function setHydration(h) { if (state.hydration !== h) { state.hydration = h; emit("hydration", h); } }
|
|
83
102
|
|
|
84
103
|
/** A live event: delivered now, or held (in order) while a catch-up snapshot is on its way. */
|
|
@@ -115,6 +134,7 @@ export function createStream(opts) {
|
|
|
115
134
|
if (polling) { if (!opts.join) pollAgain = true; return polling; }
|
|
116
135
|
const mine = ++pollSeq, ep = readEpoch;
|
|
117
136
|
let status = 0; // this read's HTTP status — its own, never another read's
|
|
137
|
+
flushStatus(); // a status that came before this read is older than its snapshot
|
|
118
138
|
if (sse && !held) held = [];
|
|
119
139
|
let limit = null;
|
|
120
140
|
const read = (async () => {
|
|
@@ -128,6 +148,9 @@ export function createStream(opts) {
|
|
|
128
148
|
if (d.status) emit("status", d.status);
|
|
129
149
|
for (const m of d.messages || []) emit("message", m, { source: "poll" });
|
|
130
150
|
if (typeof d.cursor === "string") state.cursor = d.cursor;
|
|
151
|
+
// M-2260: the server sent only the newest messages of a long absence (its catch-up budget): the chats read their
|
|
152
|
+
// newest history again, as a reload would, instead of this read carrying everything that was missed.
|
|
153
|
+
if (d.truncated === true) emit("gap", {});
|
|
131
154
|
if (Array.isArray(d.deliveries)) emit("deliveries", d.deliveries);
|
|
132
155
|
if (Array.isArray(d.prompts)) emit("prompts", d.prompts);
|
|
133
156
|
if (Array.isArray(d.reply_buttons)) for (const u of d.reply_buttons) emit("reply_buttons", u); // #1266
|
|
@@ -157,6 +180,7 @@ export function createStream(opts) {
|
|
|
157
180
|
}
|
|
158
181
|
/** #1580 review: the page lets go of everything in flight — reads, the queued poll, the catch-up and its retry wait. */
|
|
159
182
|
function cancelWork() {
|
|
183
|
+
pendingStatus = null; // a page let go of (suspend, end, close) draws no waiting status
|
|
160
184
|
readEpoch++; epoch++;
|
|
161
185
|
pollSeq++; polling = null; pollAgain = false; held = null;
|
|
162
186
|
env.clearTimeout(retryTimer); retryTimer = null;
|
|
@@ -225,6 +249,8 @@ export function createStream(opts) {
|
|
|
225
249
|
else alive();
|
|
226
250
|
// #1823: a clock reading is about now, not about order: it is never held behind a catch-up (it would be stale).
|
|
227
251
|
if (name === "clock") { emit(name, data); return; }
|
|
252
|
+
if (name === "status") { liveStatus(data); return; }
|
|
253
|
+
flushStatus(); // a status waiting goes first: the order never changes
|
|
228
254
|
live(name, data, name === "message" ? e.lastEventId : null, ingress);
|
|
229
255
|
});
|
|
230
256
|
}
|
package/dist/ui/shared/app.css
CHANGED
|
@@ -623,9 +623,21 @@ html:has(.shell), html:has(.shell) body { overflow: hidden; }
|
|
|
623
623
|
Its class is `status-line`, never `status`: that is the header's inline-flex badge class, and on a message it turned
|
|
624
624
|
the meta, body and tools into one flex row. */
|
|
625
625
|
.msg.status-line { align-self: stretch; font-size: var(--fs-sm); color: var(--text-3); }
|
|
626
|
-
|
|
627
|
-
.msg.status-line
|
|
626
|
+
/* Each line is a row (.st-ln); the line breaks between rows are text for copying, not extra rows. */
|
|
627
|
+
.msg.status-line .st-text { border-left: 2px solid var(--border); padding-left: var(--s-3); }
|
|
628
|
+
.msg.status-line .st-ln { display: block; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
629
|
+
.msg.status-line .st-ln:empty::after { content: " "; }
|
|
630
|
+
/* Folded (the user, hmsg-d6ac6dfb): two lines — the header and the first line — each one row with an ellipsis; the
|
|
631
|
+
button sits at the end of line 2. The text opens it too. */
|
|
632
|
+
.msg.status-line.folded .body { display: flex; align-items: flex-end; gap: var(--s-2); }
|
|
633
|
+
.msg.status-line.folded .st-text { flex: 1 1 auto; min-width: 0; }
|
|
634
|
+
.msg.status-line.folded.overflows .st-text { cursor: pointer; }
|
|
635
|
+
/* Its control only while something is hidden (two short rows that fit: plain, no control). */
|
|
636
|
+
.msg.status-line.folded:not(.overflows) .st-more { display: none; }
|
|
637
|
+
.msg.status-line.folded .st-ln { white-space: pre; overflow: hidden; text-overflow: ellipsis; }
|
|
638
|
+
.msg.status-line.folded .st-ln:nth-child(n+3) { display: none; }
|
|
628
639
|
.msg.status-line .st-more { border: 0; background: none; color: var(--text-2); cursor: pointer; font-size: var(--fs-xs); padding: var(--s-1) 0 0 var(--s-3); }
|
|
640
|
+
.msg.status-line.folded .st-more { flex: none; padding: 0 var(--s-2) 0 0; white-space: nowrap; }
|
|
629
641
|
.msg.status-line .st-more:hover { color: var(--text); }
|
|
630
642
|
.msg-tools { display: flex; gap: var(--s-1); margin-top: var(--s-1); opacity: 0; transition: opacity var(--t-fast); }
|
|
631
643
|
/* #2147: bounded stock toolbar paint, including fixed descendants. Padding preserves focus outlines. */
|
|
@@ -804,6 +816,10 @@ img.amb-p { object-fit: contain; }
|
|
|
804
816
|
.pv-panel-body { flex: 1; min-height: 0; display: flex; flex-direction: column; padding: 0 var(--s-3) var(--s-3); }
|
|
805
817
|
.pv-panel-body .pv-holder { flex: 1; min-height: 0; margin: 0; display: flex; flex-direction: column; }
|
|
806
818
|
.pv-panel-body.show-code .pv-holder { display: none; }
|
|
819
|
+
/* M-2448: a Markdown file in the panel — the chat's Markdown look, scrolling inside the panel (never the page). */
|
|
820
|
+
.pv-code.pv-md { font-family: var(--font-ui); font-size: var(--fs-md); line-height: 1.6; white-space: normal; padding: var(--s-3) var(--s-4); }
|
|
821
|
+
.pv-md .md { max-width: 860px; overflow-wrap: anywhere; }
|
|
822
|
+
.pv-md .tc-pre { white-space: pre-wrap; font-family: var(--font-mono); font-size: var(--fs-xs); }
|
|
807
823
|
.preview-frame.fill { flex: 1; height: 100%; min-height: 0; }
|
|
808
824
|
.pv-code { flex: 1; min-height: 0; margin: 0; overflow: auto; font-family: var(--font-mono); font-size: var(--fs-xs); line-height: 1.5;
|
|
809
825
|
background: var(--surface); border-radius: var(--r-sm); padding: var(--s-3); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); }
|
|
@@ -1323,6 +1339,21 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
1323
1339
|
/* #1844 Fleet overview → Docs: the arrow says "opens a new tab". */
|
|
1324
1340
|
.hd-docs .hd-ext { color: var(--text-3); }
|
|
1325
1341
|
.v-term { flex: 1; min-height: 0; overflow: auto; scrollbar-gutter: stable; padding: 5px 6px; background: #000000; position: relative; }
|
|
1342
|
+
/* M-2262: the terminal's box — the scrolling terminal, and its scrollback controls over it (they never scroll with it). */
|
|
1343
|
+
/* --v-term-rev: the View's mark (panel-view.js VIEW_REV): a tab still on an older stylesheet reads this one again. */
|
|
1344
|
+
.v-term-box { --v-term-rev: 2; flex: 1; min-height: 0; display: flex; flex-direction: column; position: relative; }
|
|
1345
|
+
.v-term:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
|
|
1346
|
+
.v-term-earlier, .v-term-latest { position: absolute; right: var(--s-4); z-index: 2; display: inline-flex; align-items: center; gap: 4px; opacity: .88; }
|
|
1347
|
+
.v-term-earlier { top: var(--s-2); }
|
|
1348
|
+
.v-term-latest { bottom: var(--s-3); opacity: 1; }
|
|
1349
|
+
.v-term-logbar { flex-shrink: 0; margin: 0; padding: var(--s-2) var(--s-4); background: #111111; border-bottom: 1px solid #2a2a2a; text-align: right; font-size: var(--fs-sm); }
|
|
1350
|
+
.v-term-logbar a { display: inline-flex; align-items: center; gap: 4px; color: #9cc8ff; text-decoration: underline; text-underline-offset: 2px; min-height: 28px; }
|
|
1351
|
+
@media (pointer: coarse) { .v-term-logbar a { min-height: 44px; } }
|
|
1352
|
+
.v-term-latest.has-new { background: var(--accent-fill); border-color: transparent; color: var(--on-accent); }
|
|
1353
|
+
.v-term-earlier:hover, .v-term-earlier:focus-visible { opacity: 1; }
|
|
1354
|
+
.v-term-history-note { position: absolute; left: var(--s-3); right: var(--s-3); bottom: var(--s-3); z-index: 2; margin: 0; padding: var(--s-1) var(--s-3); border-radius: var(--r-sm); background: rgba(20, 20, 20, .92); border: 1px solid #3a3a3a; color: #e0e0e0; font-size: var(--fs-sm); }
|
|
1355
|
+
@media (max-width: 600px) { .v-term-history-note { left: var(--s-4); right: var(--s-4); } }
|
|
1356
|
+
@media (pointer: coarse) { .v-term-earlier, .v-term-latest { min-height: 44px; padding-left: var(--s-3); padding-right: var(--s-3); } }
|
|
1326
1357
|
.v-pre { margin: 0; min-width: 100%; min-height: 100%; font-family: var(--font-mono); line-height: 1.2; white-space: pre; color: #d0d0d0; }
|
|
1327
1358
|
.v-pre .ansi[data-b] { font-weight: var(--fw-bold); }
|
|
1328
1359
|
/* #1582: faint text (SGR 2) — a CLI's suggestion or placeholder, never input — stays faint here. */
|
|
@@ -1365,6 +1396,11 @@ body.side-resizing, body.side-resizing * { cursor: col-resize !important; user-s
|
|
|
1365
1396
|
.u-stale { font-weight: var(--fw-semibold); }
|
|
1366
1397
|
.u-stale-detail { color: var(--text-3); font-size: var(--fs-xs); }
|
|
1367
1398
|
.u-sub { color: var(--text-3); font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
|
|
1399
|
+
/* #3066 §1: a weekly quota's measured 100% under its bar, and its notes (the fleet-only limit always). */
|
|
1400
|
+
.u-cap { margin-top: 4px; font-size: var(--fs-xs); }
|
|
1401
|
+
.u-cap-line { color: var(--text-2); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
|
|
1402
|
+
.u-cap-wait .u-cap-line { color: var(--text-3); }
|
|
1403
|
+
.u-cap-note { color: var(--text-3); overflow-wrap: anywhere; }
|
|
1368
1404
|
.u-err { color: var(--warn); font-size: var(--fs-sm); }
|
|
1369
1405
|
.u-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--s-2); }
|
|
1370
1406
|
/* #1673: the usage rail beside the page on a wide screen (header-tools.js UsageRail; shown only at min-width 1200px). */
|
|
@@ -1860,6 +1896,12 @@ strong.org-name { font-size: var(--fs-sm); color: var(--text); }
|
|
|
1860
1896
|
.oo-canvas:focus-visible { outline: 2px solid var(--focus); outline-offset: -2px; }
|
|
1861
1897
|
.oo-canvas.hot { cursor: pointer; }
|
|
1862
1898
|
/* The canvas controls, as the org chart canvas's (.oc-zoom, .oc-mini): over the stage's corners. */
|
|
1899
|
+
/* #2946: the key to the items carried between desks — a strip under the bar, as the org chart's (.oc-legend). */
|
|
1900
|
+
.oo-key { font-size: var(--fs-xs); color: var(--text-2); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); padding: 4px 10px; }
|
|
1901
|
+
.oo-key-rows { display: flex; flex-wrap: wrap; gap: var(--s-1) var(--s-4); margin: 0; padding: 0; list-style: none; }
|
|
1902
|
+
.oo-key-row { display: inline-flex; align-items: center; gap: 6px; }
|
|
1903
|
+
.oo-key-icon { width: 32px; height: 32px; flex: none; image-rendering: pixelated; }
|
|
1904
|
+
.oo-key-btn.on { border-color: var(--accent); }
|
|
1863
1905
|
.oo-zoom { z-index: 6; }
|
|
1864
1906
|
.oo-zoom .icon-btn { color: var(--text); }
|
|
1865
1907
|
/* The overview's box (left, top, width, height) is set by the page, inside the stage and scaled to it (miniBox). */
|
|
@@ -2078,6 +2120,16 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
|
|
|
2078
2120
|
.us-meta { display: block; font-size: var(--fs-xs); color: var(--text-3); overflow-wrap: anywhere; }
|
|
2079
2121
|
.us-est { display: block; font-size: var(--fs-xs); font-weight: var(--fw-regular); color: var(--text-3); }
|
|
2080
2122
|
.us-flags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
|
|
2123
|
+
/* #3066 §3: a row's numbers carry small marks (◐ partly priced, † the CLI's amount, ≈ estimated) and "—" with a reason,
|
|
2124
|
+
each said in its tooltip; the key under the table names only the marks that appear. */
|
|
2125
|
+
.us-mark { margin-left: 2px; color: var(--text-3); font-size: var(--fs-xs); cursor: help; }
|
|
2126
|
+
.us-mark.us-approx { margin-left: 0; margin-right: 1px; }
|
|
2127
|
+
.us-none { cursor: help; }
|
|
2128
|
+
.us-key { margin-top: 6px; }
|
|
2129
|
+
/* #3066 §2: each model's speed after the first token. */
|
|
2130
|
+
.us-speed { margin-top: 12px; }
|
|
2131
|
+
.us-speed .row-item { gap: 8px; flex-wrap: wrap; }
|
|
2132
|
+
.us-speed .num { font-variant-numeric: tabular-nums; }
|
|
2081
2133
|
.us-trend, .us-heat { display: flex; flex-direction: column; gap: var(--s-2); min-width: 0; }
|
|
2082
2134
|
.us-trend h3, .us-heat h3, .us-rest h3 { font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
|
|
2083
2135
|
.us-scroll { overflow-x: auto; max-width: 100%; }
|
|
@@ -2286,7 +2338,7 @@ html.oo-immersive .p-fleet > .panel-body { z-index: 50; }
|
|
|
2286
2338
|
.p-fleet > .seg, .p-settings > .seg,
|
|
2287
2339
|
.p-fleet > .panel-body, .p-needs > .panel-body, .p-notices > .panel-body, .p-settings > .panel-body,
|
|
2288
2340
|
.p-log > .panel-body, .p-details > .panel-body, .p-view > .panel-body,
|
|
2289
|
-
.p-log > .log-bar, .p-view > .v-term, .p-view > .v-id, .p-view > .v-watching { position: relative; z-index: 1; }
|
|
2341
|
+
.p-log > .log-bar, .p-view > .v-term-box, .p-view > .v-id, .p-view > .v-watching { position: relative; z-index: 1; }
|
|
2290
2342
|
/* Keep the existing Apply bar's sticky behavior, in its own bounded stock band. */
|
|
2291
2343
|
.p-settings > .s-pending { z-index: 1; }
|
|
2292
2344
|
|
|
Binary file
|
|
Binary file
|