@songsid/agend 2.3.5-alpha.4 → 2.3.5-beta.1
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 +0 -2
- package/README.zh-TW.md +0 -2
- package/THIRD_PARTY_NOTICES.md +12 -28
- 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 +4 -6
- package/dist/agent-endpoint.js +15 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/auth-api.d.ts +0 -21
- package/dist/auth-api.js +8 -93
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +30 -4
- package/dist/authority/session-authorizations.js +69 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +2 -12
- package/dist/authority/web-authority.js +4 -25
- package/dist/authority/web-authority.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 +12 -15
- package/dist/backend/claude-code.js +133 -152
- package/dist/backend/claude-code.js.map +1 -1
- 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-package.d.ts +2 -5
- package/dist/backend/codex-package.js +5 -1
- package/dist/backend/codex-package.js.map +1 -1
- package/dist/backend/codex-quota-history.d.ts +7 -0
- package/dist/backend/codex-quota-history.js +72 -0
- package/dist/backend/codex-quota-history.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +6 -0
- package/dist/backend/codex-session-lookup.js +1 -1
- 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 +116 -136
- package/dist/backend/codex.js +912 -942
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-weekly-reset.d.ts +24 -0
- package/dist/backend/grok-weekly-reset.js +95 -0
- package/dist/backend/grok-weekly-reset.js.map +1 -0
- package/dist/backend/grok.d.ts +30 -3
- package/dist/backend/grok.js +301 -76
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +50 -2
- 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 +15 -8
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-tmux-guard.d.ts +21 -0
- package/dist/bundled-tmux-guard.js +96 -0
- package/dist/bundled-tmux-guard.js.map +1 -0
- 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 +11 -3
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +235 -17
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/ipc-bridge.d.ts +0 -2
- 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/classic-channel-manager.d.ts +2 -0
- package/dist/classic-channel-manager.js +5 -1
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +14 -10
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +30 -71
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +3 -17
- package/dist/config.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 +70 -68
- package/dist/daemon.js +774 -846
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +8 -0
- package/dist/dashboard-permissions.js +16 -0
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +26 -16
- package/dist/delivery-consumed-watch.js +31 -26
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +0 -5
- package/dist/delivery-outbox.js +4 -32
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +42 -2
- package/dist/delivery-reconciliation.js +164 -2
- package/dist/delivery-reconciliation.js.map +1 -1
- 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 +4 -2
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +0 -2
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +108 -245
- package/dist/fleet-manager.js +656 -2028
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-instance.d.ts +0 -7
- package/dist/general-instance.js +3 -20
- package/dist/general-instance.js.map +1 -1
- 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/web-dashboard/SKILL.md +9 -3
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/instance-config-impact.js +6 -7
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +19 -23
- package/dist/instance-lifecycle.js +216 -383
- 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 -3
- package/dist/instructions.js +1 -7
- 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/locale.js +63 -86
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +28 -0
- package/dist/log-service.js +29 -0
- 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 +16 -2
- package/dist/logger.js +346 -66
- package/dist/logger.js.map +1 -1
- package/dist/login-flows.d.ts +7 -0
- package/dist/login-flows.js +5 -2
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.js +25 -4
- 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/muse-usage-relay.d.ts +2 -0
- package/dist/muse-usage-relay.js +5 -3
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +6 -3
- package/dist/needs-you-hub.js +31 -9
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +20 -18
- package/dist/needs-you.js +18 -14
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +1 -1
- package/dist/office-share-page.js.map +1 -1
- package/dist/outbound-handlers.d.ts +2 -16
- package/dist/outbound-handlers.js +10 -72
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +0 -38
- package/dist/outbound-schemas.js +5 -14
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +7 -0
- package/dist/pane-quota-history.js +47 -0
- package/dist/pane-quota-history.js.map +1 -0
- package/dist/platform-general.d.ts +46 -0
- package/dist/platform-general.js +91 -0
- package/dist/platform-general.js.map +1 -0
- package/dist/public-web-gateway.js +0 -9
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +0 -11
- package/dist/public-web-link.js +0 -13
- package/dist/public-web-link.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/quickstart-api.js +5 -9
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +8 -1
- package/dist/quickstart.js +42 -4
- package/dist/quickstart.js.map +1 -1
- package/dist/quota-notice-config.d.ts +22 -0
- package/dist/quota-notice-config.js +41 -0
- package/dist/quota-notice-config.js.map +1 -0
- package/dist/quota-notice.d.ts +7 -0
- package/dist/quota-notice.js +40 -0
- package/dist/quota-notice.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -6
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-polls.d.ts +2 -2
- package/dist/reply-polls.js +3 -3
- package/dist/reply-polls.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/scheduler/task-board.d.ts +9 -0
- package/dist/scheduler/task-board.js +19 -0
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/settings-api.d.ts +13 -5
- package/dist/settings-api.js +26 -96
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +0 -1
- package/dist/settings-baseline.js +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +23 -28
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +1 -16
- package/dist/settings-confirmation.js +9 -47
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.d.ts +0 -4
- package/dist/settings-effect.js +1 -58
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +0 -4
- package/dist/settings-http-confirmation.js +3 -31
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +28 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +0 -2
- package/dist/settings-request-capability.js +0 -4
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.d.ts +0 -4
- package/dist/settings-transaction.js +0 -9
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-form.js +3 -6
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +0 -3
- package/dist/setup-i18n.js.map +1 -1
- package/dist/task-board-tool.d.ts +11 -0
- package/dist/task-board-tool.js +44 -0
- package/dist/task-board-tool.js.map +1 -1
- package/dist/task-board-waker.d.ts +6 -0
- package/dist/task-board-waker.js +4 -0
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-control.d.ts +1 -2
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -2
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +7 -7
- 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 -3
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +1 -1
- package/dist/transcript-delta-reader.js +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-monitor.d.ts +20 -3
- package/dist/transcript-monitor.js +92 -24
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +0 -5
- package/dist/transcript-sources.js +79 -8
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +3 -23
- package/dist/ui/app.html +8 -1
- package/dist/ui/backend-signin.js +21 -36
- package/dist/ui/chat-md-strings.js +9 -0
- package/dist/ui/chat-store.js +2 -13
- package/dist/ui/chat-strings.js +2 -50
- package/dist/ui/chat-thread.js +53 -3
- package/dist/ui/fleet-task-card.js +3 -3
- package/dist/ui/fleet-task-common.js +10 -0
- package/dist/ui/fleet-tasks.js +7 -5
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/panel-chat.js +37 -66
- package/dist/ui/panel-details.js +1 -2
- package/dist/ui/panel-fleet.js +88 -107
- package/dist/ui/panel-needs.js +21 -163
- package/dist/ui/panel-notices.js +4 -3
- package/dist/ui/panel-settings.js +149 -239
- package/dist/ui/preview-panel.js +84 -6
- package/dist/ui/search-dialog.js +3 -2
- package/dist/ui/settings-appearance.js +23 -122
- package/dist/ui/settings-catalog.js +10 -37
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-confirm.js +1 -3
- package/dist/ui/settings-dialogs.js +20 -27
- package/dist/ui/settings-guests.js +14 -27
- package/dist/ui/settings-model.js +17 -12
- package/dist/ui/settings-quota-notice.js +100 -0
- package/dist/ui/settings-registry.js +4 -11
- package/dist/ui/settings-strings.js +4 -113
- package/dist/ui/settings-web-authority.js +13 -15
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-route.js +2 -6
- package/dist/ui/shared/app-shell.js +18 -23
- package/dist/ui/shared/app-store.js +2 -3
- package/dist/ui/shared/app-stream.js +1 -3
- package/dist/ui/shared/app.css +40 -1312
- package/dist/ui/shared/app.js +2 -5
- package/dist/ui/shared/header-tools.js +4 -6
- package/dist/ui/shared/instance-nav.js +7 -34
- package/dist/ui/shared/instance-switch.js +3 -4
- package/dist/ui/shared/loading.css +37 -0
- package/dist/ui/shared/panel-view.js +77 -4
- package/dist/ui/shared/signin.js +6 -39
- package/dist/ui/shared/tokens.css +0 -1
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +10 -30
- package/dist/ui/shared/ui-states.js +14 -3
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/vendor/vendor.json +2 -19
- 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 +16 -8
- package/dist/ui/signin.html +5 -2
- package/dist/unattended-install.d.ts +11 -2
- package/dist/unattended-install.js +39 -5
- package/dist/unattended-install.js.map +1 -1
- 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/providers.d.ts +5 -0
- package/dist/usage/providers.js +5 -0
- package/dist/usage/providers.js.map +1 -1
- 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/quota-notices.d.ts +38 -0
- package/dist/usage/quota-notices.js +160 -0
- package/dist/usage/quota-notices.js.map +1 -0
- package/dist/usage/usage-api.d.ts +32 -0
- package/dist/usage/usage-api.js +96 -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 +16 -0
- package/dist/view-api.js +100 -16
- 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 -38
- package/dist/web-api.js +20 -255
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-history.d.ts +2 -19
- package/dist/web-chat-history.js +3 -72
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-only-fleet.d.ts +0 -20
- package/dist/web-only-fleet.js +0 -21
- package/dist/web-only-fleet.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 +0 -7
- package/dist/web-session.js +0 -2
- package/dist/web-session.js.map +1 -1
- package/dist/web-shell-routes.d.ts +1 -4
- package/dist/web-shell-routes.js +2 -7
- package/dist/web-shell-routes.js.map +1 -1
- package/launcher/private-home.cjs +1 -1
- package/package.json +3 -9
- package/dist/agent-runtime-api.d.ts +0 -4
- package/dist/agent-runtime-api.js +0 -59
- package/dist/agent-runtime-api.js.map +0 -1
- package/dist/agent-runtime-change.d.ts +0 -74
- package/dist/agent-runtime-change.js +0 -102
- package/dist/agent-runtime-change.js.map +0 -1
- package/dist/backend/grok-model-cache.d.ts +0 -7
- package/dist/backend/grok-model-cache.js +0 -65
- package/dist/backend/grok-model-cache.js.map +0 -1
- package/dist/backend/native-pane.d.ts +0 -9
- package/dist/backend/native-pane.js +0 -59
- package/dist/backend/native-pane.js.map +0 -1
- package/dist/fleet-windows-runtime.d.ts +0 -97
- package/dist/fleet-windows-runtime.js +0 -449
- package/dist/fleet-windows-runtime.js.map +0 -1
- package/dist/general-binding.d.ts +0 -85
- package/dist/general-binding.js +0 -298
- package/dist/general-binding.js.map +0 -1
- package/dist/general-host-owner.d.ts +0 -8
- package/dist/general-host-owner.js +0 -26
- package/dist/general-host-owner.js.map +0 -1
- package/dist/general-role.d.ts +0 -5
- package/dist/general-role.js +0 -26
- package/dist/general-role.js.map +0 -1
- package/dist/local-pane-endpoint.d.ts +0 -46
- package/dist/local-pane-endpoint.js +0 -189
- package/dist/local-pane-endpoint.js.map +0 -1
- package/dist/local-pane-launcher.d.ts +0 -2
- package/dist/local-pane-launcher.js +0 -38
- package/dist/local-pane-launcher.js.map +0 -1
- package/dist/local-pane-stage.ps1 +0 -101
- package/dist/model-catalog-defaults.d.ts +0 -14
- package/dist/model-catalog-defaults.js +0 -20
- package/dist/model-catalog-defaults.js.map +0 -1
- package/dist/native-agent-admission.d.ts +0 -7
- package/dist/native-agent-admission.js +0 -26
- package/dist/native-agent-admission.js.map +0 -1
- package/dist/native-daemon-client.d.ts +0 -13
- package/dist/native-daemon-client.js +0 -28
- package/dist/native-daemon-client.js.map +0 -1
- package/dist/native-instance-api.d.ts +0 -14
- package/dist/native-instance-api.js +0 -205
- package/dist/native-instance-api.js.map +0 -1
- package/dist/native-instance-input.d.ts +0 -84
- package/dist/native-instance-input.js +0 -54
- package/dist/native-instance-input.js.map +0 -1
- package/dist/native-instance-registry.d.ts +0 -32
- package/dist/native-instance-registry.js +0 -105
- package/dist/native-instance-registry.js.map +0 -1
- package/dist/native-mcp.d.ts +0 -40
- package/dist/native-mcp.js +0 -278
- package/dist/native-mcp.js.map +0 -1
- package/dist/native-model-catalog.d.ts +0 -5
- package/dist/native-model-catalog.js +0 -76
- package/dist/native-model-catalog.js.map +0 -1
- package/dist/native-pane-crash-budget.d.ts +0 -20
- package/dist/native-pane-crash-budget.js +0 -60
- package/dist/native-pane-crash-budget.js.map +0 -1
- package/dist/native-pane-create.d.ts +0 -26
- package/dist/native-pane-create.js +0 -53
- package/dist/native-pane-create.js.map +0 -1
- package/dist/native-pane-lifecycle.d.ts +0 -65
- package/dist/native-pane-lifecycle.js +0 -230
- package/dist/native-pane-lifecycle.js.map +0 -1
- package/dist/native-pane-manager.d.ts +0 -59
- package/dist/native-pane-manager.js +0 -584
- package/dist/native-pane-manager.js.map +0 -1
- package/dist/native-pane-output-log.d.ts +0 -15
- package/dist/native-pane-output-log.js +0 -108
- package/dist/native-pane-output-log.js.map +0 -1
- package/dist/native-pane-reconciliation.d.ts +0 -4
- package/dist/native-pane-reconciliation.js +0 -40
- package/dist/native-pane-reconciliation.js.map +0 -1
- package/dist/native-pane-recovery.d.ts +0 -12
- package/dist/native-pane-recovery.js +0 -10
- package/dist/native-pane-recovery.js.map +0 -1
- package/dist/native-pane-tools.d.ts +0 -2
- package/dist/native-pane-tools.js +0 -14
- package/dist/native-pane-tools.js.map +0 -1
- package/dist/pane-port.d.ts +0 -118
- package/dist/pane-port.js +0 -2
- package/dist/pane-port.js.map +0 -1
- package/dist/runtime-api.d.ts +0 -8
- package/dist/runtime-api.js +0 -171
- package/dist/runtime-api.js.map +0 -1
- package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
- package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
- package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
- package/dist/runtime-assets/@xterm/headless/package.json +0 -29
- package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
- package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
- package/dist/runtime-assets/node-pty/LICENSE +0 -69
- package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
- package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
- package/dist/runtime-assets/node-pty/lib/index.js +0 -52
- package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
- package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
- package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
- package/dist/runtime-assets/node-pty/lib/types.js +0 -7
- package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
- package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
- package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
- package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
- package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
- package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
- package/dist/runtime-assets/node-pty/package.json +0 -64
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/runtime-build-info.d.ts +0 -9
- package/dist/runtime-build-info.js +0 -57
- package/dist/runtime-build-info.js.map +0 -1
- package/dist/runtime-bundle.d.ts +0 -19
- package/dist/runtime-bundle.js +0 -156
- package/dist/runtime-bundle.js.map +0 -1
- package/dist/runtime-cli.d.ts +0 -7
- package/dist/runtime-cli.js +0 -152
- package/dist/runtime-cli.js.map +0 -1
- package/dist/runtime-client-store.d.ts +0 -68
- package/dist/runtime-client-store.js +0 -344
- package/dist/runtime-client-store.js.map +0 -1
- package/dist/runtime-client.d.ts +0 -112
- package/dist/runtime-client.js +0 -736
- package/dist/runtime-client.js.map +0 -1
- package/dist/runtime-connection.d.ts +0 -22
- package/dist/runtime-connection.js +0 -93
- package/dist/runtime-connection.js.map +0 -1
- package/dist/runtime-coordinator.d.ts +0 -91
- package/dist/runtime-coordinator.js +0 -911
- package/dist/runtime-coordinator.js.map +0 -1
- package/dist/runtime-general-protocol.d.ts +0 -22
- package/dist/runtime-general-protocol.js +0 -57
- package/dist/runtime-general-protocol.js.map +0 -1
- package/dist/runtime-general-workspace.d.ts +0 -17
- package/dist/runtime-general-workspace.js +0 -213
- package/dist/runtime-general-workspace.js.map +0 -1
- package/dist/runtime-pane-assets.d.ts +0 -17
- package/dist/runtime-pane-assets.js +0 -23
- package/dist/runtime-pane-assets.js.map +0 -1
- package/dist/runtime-pane-boot.d.ts +0 -9
- package/dist/runtime-pane-boot.js +0 -47
- package/dist/runtime-pane-boot.js.map +0 -1
- package/dist/runtime-pane-codex-index.d.ts +0 -1
- package/dist/runtime-pane-codex-index.js +0 -47
- package/dist/runtime-pane-codex-index.js.map +0 -1
- package/dist/runtime-pane-config.d.ts +0 -16
- package/dist/runtime-pane-config.js +0 -54
- package/dist/runtime-pane-config.js.map +0 -1
- package/dist/runtime-pane-host.d.ts +0 -44
- package/dist/runtime-pane-host.js +0 -424
- package/dist/runtime-pane-host.js.map +0 -1
- package/dist/runtime-pane-job-owner.d.ts +0 -1
- package/dist/runtime-pane-job-owner.js +0 -29
- package/dist/runtime-pane-job-owner.js.map +0 -1
- package/dist/runtime-pane-job.ps1 +0 -116
- package/dist/runtime-pane-link.d.ts +0 -40
- package/dist/runtime-pane-link.js +0 -246
- package/dist/runtime-pane-link.js.map +0 -1
- package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
- package/dist/runtime-pane-mcp-protocol.js +0 -39
- package/dist/runtime-pane-mcp-protocol.js.map +0 -1
- package/dist/runtime-pane-mcp-relay.d.ts +0 -17
- package/dist/runtime-pane-mcp-relay.js +0 -70
- package/dist/runtime-pane-mcp-relay.js.map +0 -1
- package/dist/runtime-pane-mcp.d.ts +0 -51
- package/dist/runtime-pane-mcp.js +0 -150
- package/dist/runtime-pane-mcp.js.map +0 -1
- package/dist/runtime-pane-native.d.ts +0 -45
- package/dist/runtime-pane-native.js +0 -65
- package/dist/runtime-pane-native.js.map +0 -1
- package/dist/runtime-pane-output.d.ts +0 -19
- package/dist/runtime-pane-output.js +0 -53
- package/dist/runtime-pane-output.js.map +0 -1
- package/dist/runtime-pane-port.d.ts +0 -139
- package/dist/runtime-pane-port.js +0 -558
- package/dist/runtime-pane-port.js.map +0 -1
- package/dist/runtime-pane-private.d.ts +0 -14
- package/dist/runtime-pane-private.js +0 -51
- package/dist/runtime-pane-private.js.map +0 -1
- package/dist/runtime-pane-private.ps1 +0 -14
- package/dist/runtime-pane-process.d.ts +0 -4
- package/dist/runtime-pane-process.js +0 -108
- package/dist/runtime-pane-process.js.map +0 -1
- package/dist/runtime-pane-protocol.d.ts +0 -172
- package/dist/runtime-pane-protocol.js +0 -195
- package/dist/runtime-pane-protocol.js.map +0 -1
- package/dist/runtime-pane-screen.d.ts +0 -19
- package/dist/runtime-pane-screen.js +0 -76
- package/dist/runtime-pane-screen.js.map +0 -1
- package/dist/runtime-pane-service.d.ts +0 -11
- package/dist/runtime-pane-service.js +0 -221
- package/dist/runtime-pane-service.js.map +0 -1
- package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
- package/dist/runtime-pane-stdio-protocol.js +0 -94
- package/dist/runtime-pane-stdio-protocol.js.map +0 -1
- package/dist/runtime-pane-stdio.d.ts +0 -3
- package/dist/runtime-pane-stdio.js +0 -123
- package/dist/runtime-pane-stdio.js.map +0 -1
- package/dist/runtime-pane-store.d.ts +0 -33
- package/dist/runtime-pane-store.js +0 -164
- package/dist/runtime-pane-store.js.map +0 -1
- package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
- package/dist/runtime-pane-transcript-protocol.js +0 -58
- package/dist/runtime-pane-transcript-protocol.js.map +0 -1
- package/dist/runtime-pane-transcript.d.ts +0 -45
- package/dist/runtime-pane-transcript.js +0 -605
- package/dist/runtime-pane-transcript.js.map +0 -1
- package/dist/runtime-pane-worker.d.ts +0 -1
- package/dist/runtime-pane-worker.js +0 -154
- package/dist/runtime-pane-worker.js.map +0 -1
- package/dist/runtime-protocol.d.ts +0 -162
- package/dist/runtime-protocol.js +0 -37
- package/dist/runtime-protocol.js.map +0 -1
- package/dist/runtime-switches.d.ts +0 -79
- package/dist/runtime-switches.js +0 -90
- package/dist/runtime-switches.js.map +0 -1
- package/dist/runtime-transcript-delta-reader.d.ts +0 -23
- package/dist/runtime-transcript-delta-reader.js +0 -74
- package/dist/runtime-transcript-delta-reader.js.map +0 -1
- package/dist/runtime-transcript-source.d.ts +0 -36
- package/dist/runtime-transcript-source.js +0 -189
- package/dist/runtime-transcript-source.js.map +0 -1
- package/dist/runtime-windows-bridge.d.ts +0 -41
- package/dist/runtime-windows-bridge.js +0 -157
- package/dist/runtime-windows-bridge.js.map +0 -1
- package/dist/settings-route-lifetime.d.ts +0 -14
- package/dist/settings-route-lifetime.js +0 -48
- package/dist/settings-route-lifetime.js.map +0 -1
- package/dist/tmux-pane-host.d.ts +0 -26
- package/dist/tmux-pane-host.js +0 -25
- package/dist/tmux-pane-host.js.map +0 -1
- package/dist/transcript-needles.d.ts +0 -35
- package/dist/transcript-needles.js +0 -158
- package/dist/transcript-needles.js.map +0 -1
- package/dist/transcript-records.d.ts +0 -21
- package/dist/transcript-records.js +0 -140
- package/dist/transcript-records.js.map +0 -1
- package/dist/ui/agent-proposals.js +0 -90
- package/dist/ui/agent-runtime-settings.js +0 -67
- package/dist/ui/agent-runtime.js +0 -124
- package/dist/ui/cli-picker.js +0 -42
- package/dist/ui/general-location.js +0 -71
- package/dist/ui/native-instance-settings.js +0 -44
- package/dist/ui/native-pane-recovery.js +0 -45
- package/dist/ui/panel-runtimes.js +0 -334
- package/dist/ui/panel-windows-agent.js +0 -86
- package/dist/ui/panel-windows-cli.js +0 -179
- package/dist/ui/provider-marks.js +0 -83
- package/dist/ui/runtime-catalog.js +0 -55
- package/dist/ui/settings-agent-filters.js +0 -94
- package/dist/ui/settings-layout.js +0 -245
- package/dist/ui/settings-outside.js +0 -176
- package/dist/ui/settings-shortcuts.js +0 -65
- package/dist/ui/shared/machine-name.js +0 -13
- package/dist/ui/shared/qrcode.module.js +0 -2237
- package/dist/ui/shared/settings-width.js +0 -31
- package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
- package/dist/ui/windows-agents-nav.js +0 -2
- package/dist/ui/windows-cli-catalog.js +0 -108
- package/dist/web-remote-access.d.ts +0 -152
- package/dist/web-remote-access.js +0 -368
- package/dist/web-remote-access.js.map +0 -1
- package/dist/windows-agents.d.ts +0 -126
- package/dist/windows-agents.js +0 -490
- package/dist/windows-agents.js.map +0 -1
- package/dist/windows-cli-api.d.ts +0 -23
- package/dist/windows-cli-api.js +0 -159
- package/dist/windows-cli-api.js.map +0 -1
- package/dist/windows-cli-providers.d.ts +0 -115
- package/dist/windows-cli-providers.js +0 -429
- package/dist/windows-cli-providers.js.map +0 -1
- package/dist/windows-cli-worker.d.ts +0 -59
- package/dist/windows-cli-worker.js +0 -479
- package/dist/windows-cli-worker.js.map +0 -1
- package/dist/windows-cli.d.ts +0 -116
- package/dist/windows-cli.js +0 -407
- package/dist/windows-cli.js.map +0 -1
- package/dist/windows-native-mcp.d.ts +0 -19
- package/dist/windows-native-mcp.js +0 -143
- package/dist/windows-native-mcp.js.map +0 -1
- package/dist/windows-pane-mcp.d.ts +0 -26
- package/dist/windows-pane-mcp.js +0 -187
- package/dist/windows-pane-mcp.js.map +0 -1
- package/templates/runtime-assets/conpty-LICENSE +0 -21
- package/templates/runtime-assets/conpty-NOTICE.md +0 -503
- package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
- package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
- package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
- package/templates/runtime-assets/xterm-LICENSE +0 -21
|
@@ -17,15 +17,18 @@ import { startOperation } from "./settings-apply.js";
|
|
|
17
17
|
import { goToTarget } from "./settings-registry.js";
|
|
18
18
|
import { sectionPath } from "/assets/app-route.js";
|
|
19
19
|
import { backendLabel } from "/assets/instance-nav.js";
|
|
20
|
-
import {AgentRuntimeSettings} from "./agent-runtime-settings.js";
|
|
21
20
|
import "./settings-strings.js"; // its words, wherever a picker of this file is used (#2072: Fleet's create dialog too)
|
|
22
|
-
import { backendChoices, modelChoices, OTHER_MODEL, useBackendRows,
|
|
21
|
+
import { backendChoices, modelChoices, OTHER_MODEL, useBackendRows, useModelCatalog } from "./settings-catalog.js";
|
|
23
22
|
import {
|
|
24
23
|
ACCESS_MODES, AGENT_MODES, CH_TYPES, DASHBOARD_CHOICES, DASHBOARD_FEATURES, HANG_TIMEOUT_DEFAULT_MINUTES, LOG_LEVELS, TOOL_PROGRESS, TOOL_SETS,
|
|
25
24
|
VISIBILITY_MODES, accessConfirmations, agentForm, agentPatch, backendOptions, changedFields, channelId, channelsOf,
|
|
26
25
|
chLabel, dashboardDefault, hasOwn, impactOf, newConnectionImpact, nonNegative, nonNegativeInteger, positive, replyGuardSupported, sameValue, visibilityDefault,
|
|
27
26
|
classicWebEchoEffective, toolSetDefault, worstImpact,
|
|
28
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"];
|
|
29
32
|
/** #2342: a field by id, for recordEdit before a pick or a reset writes it. */
|
|
30
33
|
const byId = (id) => (typeof document !== "undefined" ? document.getElementById(id) : null);
|
|
31
34
|
|
|
@@ -61,25 +64,16 @@ export function BackendSelect({ value, onChange, disabled, id }) {
|
|
|
61
64
|
* the current value in it: choosing "Other…" alone changes nothing — emptying the box is what inherits, #2098 review).
|
|
62
65
|
* `inherit`: the label of the empty choice (inherit / none), or omit it when the field has none.
|
|
63
66
|
*/
|
|
64
|
-
export function ModelSelect({ value, onChange, disabled, id, backend, instance,
|
|
65
|
-
const
|
|
66
|
-
const catalog = catalogOverride === undefined ? state.models : catalogOverride;
|
|
67
|
+
export function ModelSelect({ value, onChange, disabled, id, backend, instance, inherit }) {
|
|
68
|
+
const catalog = useModelCatalog(backend, instance);
|
|
67
69
|
const [typing, setTyping] = useState(false);
|
|
68
|
-
useEffect(() => { setTyping(false); }, [backend, instance, runtime]);
|
|
69
70
|
const opts = modelChoices(catalog || [], value, { notListed: tn("modelNotListed"), other: tn("modelOther") }, inherit);
|
|
70
|
-
const managed = catalogOverride === undefined && !!backend;
|
|
71
|
-
const sourceNote = state.source === "cli-list" ? "modelCatalogCliList" : state.source === "cli-cache" ? "modelCatalogCliCache"
|
|
72
|
-
: ["documented", "official-catalog", "cli-alias"].includes(state.source) ? "modelCatalogOfficial" : "modelCatalogCached";
|
|
73
|
-
const note = state.loading ? "modelCatalogLoading" : state.error ? "modelCatalogFailed" : !catalog?.length ? "modelCatalogEmpty"
|
|
74
|
-
: sourceNote;
|
|
75
71
|
return html`<div class="model-pick">
|
|
76
|
-
<select id=${id} value=${typing ? OTHER_MODEL : value} disabled=${disabled}
|
|
72
|
+
<select id=${id} value=${typing ? OTHER_MODEL : value} disabled=${disabled}
|
|
77
73
|
onChange=${(e) => { const v = e.target.value; if (v === OTHER_MODEL) setTyping(true); else { setTyping(false); onChange(v); } }}>
|
|
78
74
|
${opts.map((o) => html`<option key=${o.value} value=${o.value}>${o.label}</option>`)}</select>
|
|
79
75
|
${typing ? html`<input type="text" aria-label=${tn("modelOtherLabel")} placeholder=${tn("modelOtherPlaceholder")} disabled=${disabled}
|
|
80
|
-
value=${value} onInput=${(e) => onChange(e.target.value)} />` : null}
|
|
81
|
-
${managed ? html`<div class="model-catalog-status"><span class="note" role=${state.error ? "alert" : "status"} aria-live="polite">${state.loading ? html`<span class="out-spin" aria-hidden="true"></span> ` : null}${tn(note)}</span><button type="button" class="btn btn-ghost btn-sm" disabled=${disabled || state.loading} onClick=${state.refresh}>${tn(state.error || !catalog?.length ? "modelCatalogRetry" : "modelCatalogRefresh")}</button></div>` : null}
|
|
82
|
-
</div>`;
|
|
76
|
+
value=${value} onInput=${(e) => onChange(e.target.value)} />` : null}</div>`;
|
|
83
77
|
}
|
|
84
78
|
export function Impact({ schema, field }) { return html`<span class="impact">${impactText(impactOf(schema, field))}</span>`; }
|
|
85
79
|
export function Label({ text, schema, field, htmlFor, mark }) {
|
|
@@ -147,9 +141,9 @@ export function ChipList({ items, onChange, placeholder, label }) {
|
|
|
147
141
|
const replyHint = (backend, mode, kiroUi) => (replyGuardSupported(backend, mode, kiroUi) ? tn("replyGuardSupported") : tn("replyGuardUnsupported", backend, mode));
|
|
148
142
|
|
|
149
143
|
/** The dialog every editor uses: Cancel / Stage change; the footer says what the changes made so far will cost (#2346: only the fields that changed). */
|
|
150
|
-
function EditDialog({ title, subtitle, onClose, onStage, impacts, schema, children, ready = true, wide = true
|
|
144
|
+
function EditDialog({ title, subtitle, onClose, onStage, impacts, schema, children, ready = true, wide = true }) {
|
|
151
145
|
const kinds = [...new Set((impacts || []).map((f) => impactOf(schema, f)))];
|
|
152
|
-
return html`<${Dialog} title=${title} label=${subtitle ? `${title} — ${subtitle}` : title} onClose=${onClose} wide=${wide}
|
|
146
|
+
return html`<${Dialog} title=${title} label=${subtitle ? `${title} — ${subtitle}` : title} onClose=${onClose} wide=${wide}
|
|
153
147
|
actions=${html`${kinds.length ? html`<span class="note dlg-impact">${kinds.map(impactText).join(" · ")}</span>` : null}
|
|
154
148
|
<button type="button" class="btn" onClick=${onClose}>${tn("cancel")}</button>
|
|
155
149
|
<button type="button" class="btn btn-primary" disabled=${!ready} onClick=${onStage}>${tn("modalDone")}</button>`}>
|
|
@@ -282,13 +276,8 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
282
276
|
auto: f.inherit.auto_pause_after ? "" : nonNegative(f.auto_pause_after),
|
|
283
277
|
hang: f.inherit.hang ? "" : positive(f.hang),
|
|
284
278
|
};
|
|
285
|
-
// #3008 G1: a fleet with no chat connection has one General at most — ticking a second says which one it is, right
|
|
286
|
-
// by the checkbox (kept ticked, Save waits), by the name the chat list shows (the leader's string 18).
|
|
287
|
-
const otherGeneral = !channelsOf(fleet).length && f.general_topic && !inst.general_topic
|
|
288
|
-
? Object.entries(fleet.instances || {}).find(([other, c]) => other !== name && c && (c.general_topic === true || (other === "general" && c.general_topic !== false))) : null;
|
|
289
|
-
const generalError = otherGeneral ? tn("oneGeneral", ctx.shortName(otherGeneral[0], otherGeneral[1])) : "";
|
|
290
279
|
const failoverWarn = !f.inherit.model_failover && !f.model_failover.trim() ? "failoverEmpty" : "";
|
|
291
|
-
const ready = !errors.auto && !errors.hang
|
|
280
|
+
const ready = !errors.auto && !errors.hang;
|
|
292
281
|
const pending = () => agentPatch({ ...f, status_emojis: emojis.value }, inst, defaults, visibilityBaseline, emojis.baseline);
|
|
293
282
|
const stage = () => {
|
|
294
283
|
if (!ready) return;
|
|
@@ -303,15 +292,20 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
303
292
|
const inh = (k, value, target, kind, set = hasOwn(defaults, k)) => ({ text: valueText(value, kind), builtin: !set, from: target ? inAgentDefaults(target) : null });
|
|
304
293
|
const inheritedBackend = !inst.backend && f.backend === (defaults.backend || "claude-code");
|
|
305
294
|
const L = (text, field, id) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${id} />`;
|
|
306
|
-
return html`<${EditDialog} title=${ctx.shortName(name, inst)} subtitle=${tn("idLine", name)} onClose=${onClose} onStage=${stage} ready=${ready}
|
|
307
|
-
<${AgentRuntimeSettings} name=${name} inst=${{...inst,backend:f.backend}} inherited=${inheritedBackend ? html`<${Inherited} ...${inh("backend", f.backend, "#g-be", "backend")} />` : null} disabled=${Object.keys(pending()).length>0||ctx.staged?.size>0} onChanged=${()=>{ctx.reload();onClose();}}/>
|
|
295
|
+
return html`<${EditDialog} title=${ctx.shortName(name, inst)} subtitle=${tn("idLine", name)} onClose=${onClose} onStage=${stage} ready=${ready} impacts=${Object.keys(pending()).map((k) => `instance.${k}`)} schema=${schema}>
|
|
308
296
|
<div class="grid2">
|
|
309
297
|
<div class="field">${L(tn("displayName"), "instance.display_name", "ag-dn")}
|
|
310
298
|
<${Override} inherit=${f.inherit.display_name} onInherit=${setInherit("display_name")} inherited=${inh("display_name", defaults.display_name || name, null, "", !!defaults.display_name)}>
|
|
311
299
|
<input id="ag-dn" type="text" placeholder=${name} disabled=${f.inherit.display_name} value=${shown("display_name", f.display_name, defaults.display_name || "")} onInput=${(e) => set("display_name")(e.target.value)} /></${Override}></div>
|
|
312
300
|
<div class="field">${L(tn("description"), "instance.description", "ag-desc")}<input id="ag-desc" type="text" value=${f.description} onInput=${(e) => set("description")(e.target.value)} /></div>
|
|
301
|
+
<div class="field">${L(tn("backend"), "instance.backend", "ag-be")}<${BackendSelect} id="ag-be" value=${f.backend} onChange=${set("backend")} />
|
|
302
|
+
${inheritedBackend ? html`<${Inherited} ...${inh("backend", f.backend, "#g-be", "backend")} />` : null}</div>
|
|
313
303
|
<div class="field">${L(tn("model"), "instance.model", "ag-model")}<${ModelSelect} id="ag-model" value=${f.model} onChange=${set("model")}
|
|
314
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}
|
|
315
309
|
</div>
|
|
316
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>
|
|
317
311
|
<div class="field">${L(`${tn("autoPause")} (${tn("minutes")})`, "instance.auto_pause_after", "ag-auto")}
|
|
@@ -365,9 +359,8 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
365
359
|
</div>
|
|
366
360
|
<div class="field">${L(tn("systemPrompt"), "instance.systemPrompt", "ag-sys")}<input id="ag-sys" type="text" placeholder="e.g. file:prompts/dev.md" value=${f.systemPrompt} onInput=${(e) => set("systemPrompt")(e.target.value)} /></div>
|
|
367
361
|
<div class="field">${L(tn("tags"), "instance.tags")}<${ChipList} items=${f.tags} onChange=${set("tags")} placeholder=${tn("tagPlaceholder")} label=${tn("tags")} /></div>
|
|
368
|
-
<label class="check"><input
|
|
362
|
+
<label class="check"><input type="checkbox" checked=${f.general_topic} onChange=${(e) => set("general_topic")(e.target.checked)} /><span>${tn("generalTopicField")}</span>
|
|
369
363
|
<${Impact} schema=${schema} field="instance.general_topic" /></label>
|
|
370
|
-
${generalError ? html`<p class="feedback error" role="alert" id="ag-general-one">${generalError}</p>` : null}
|
|
371
364
|
</${Drawer}>
|
|
372
365
|
<${Drawer} title=${tn("statusEmojis")}>
|
|
373
366
|
<p class="note">${tn("statusEmojisInstance")} <${Impact} schema=${schema} field="instance.status_emojis" /></p>
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
// reset from ctx.fleet), ctx.readOnly (the public link: controls disabled, actions hidden), `s-dirty` on edited rows.
|
|
12
12
|
import { html, useEffect, useMemo, useState } from "/assets/app-html.js";
|
|
13
13
|
import { t } from "/assets/app-i18n.js";
|
|
14
|
+
import { Skeleton } from "/assets/ui-states.js";
|
|
14
15
|
import { toast } from "/assets/ui-toast.js";
|
|
15
16
|
import { confirmDialog } from "/assets/ui-confirm.js";
|
|
16
17
|
import { api } from "./settings-confirm.js";
|
|
17
18
|
import { DEFAULT_SCHEMA, impactOf } from "./settings-model.js";
|
|
18
19
|
import "./settings-strings.js";
|
|
19
|
-
import { layoutText } from "./settings-layout.js";
|
|
20
20
|
|
|
21
21
|
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
22
22
|
const PLATFORMS = { discord: "Discord", telegram: "Telegram" };
|
|
@@ -94,7 +94,6 @@ export function GuestsSection({ ctx, staged }) {
|
|
|
94
94
|
const [overview, setOverview] = useState(null), [failed, setFailed] = useState(false);
|
|
95
95
|
const [people, setPeople] = useState(null), [query, setQuery] = useState(""), [editing, setEditing] = useState(null);
|
|
96
96
|
const [sendState, setSendState] = useState({}), [now, setNow] = useState(() => Date.now());
|
|
97
|
-
const [viewedGuest, setViewedGuest] = useState(null);
|
|
98
97
|
const [status, setStatus] = useState(null); // { kind: "waiting" } | { kind: "failed", error }
|
|
99
98
|
const load = async () => {
|
|
100
99
|
let r = null;
|
|
@@ -213,7 +212,6 @@ export function GuestsSection({ ctx, staged }) {
|
|
|
213
212
|
};
|
|
214
213
|
|
|
215
214
|
const rows = f.grants ? [...new Set([...Object.keys(f.grants), ...Object.keys(original.grants || {})])] : [];
|
|
216
|
-
const activeGuest = rows.includes(editing) ? editing : rows.includes(viewedGuest) ? viewedGuest : rows[0];
|
|
217
215
|
const q = query.trim().toLowerCase();
|
|
218
216
|
const candidates = (people || []).filter((p) => !(f.grants && own(f.grants, accountKey(p))))
|
|
219
217
|
.filter((p) => !q || [p.name, p.username, p.userId].some((x) => typeof x === "string" && x.toLowerCase().includes(q))).slice(0, 8);
|
|
@@ -221,32 +219,21 @@ export function GuestsSection({ ctx, staged }) {
|
|
|
221
219
|
return html`<section class="card s-guests" id="guests"><h3>${tn("guestsTitle")}</h3>
|
|
222
220
|
<p class="note">${tn("grantsHint")}</p>
|
|
223
221
|
<fieldset class="s-guest-fields" disabled=${readOnly}>
|
|
224
|
-
|
|
222
|
+
<label class=${`check${f.enabled !== original.enabled ? " s-dirty" : ""}`}><input id="guestsEnabled" type="checkbox" checked=${f.enabled} onChange=${(e) => set({ enabled: e.target.checked })} /><span>${tn("guestsEnabled")}</span></label>
|
|
225
223
|
<p class="note">${tn("guestsEnabledHint")}</p>
|
|
226
|
-
|
|
224
|
+
<label class=${`check${f.chat !== original.chat ? " s-dirty" : ""}`}><input id="guestsChat" type="checkbox" checked=${f.chat} onChange=${(e) => set({ chat: e.target.checked })} /><span>${tn("guestsChat")}</span></label>
|
|
227
225
|
<p class="note">${tn("guestsChatHint")}</p>
|
|
228
|
-
</div></div>
|
|
229
226
|
${failed ? html`<p class="note" role="status">${tn("guestsLoadFailed")} <button type="button" class="btn btn-sm" onClick=${load}>${t("app.retry")}</button></p>`
|
|
230
|
-
: !overview ? html
|
|
227
|
+
: !overview ? html`<${Skeleton} variant="rows" lines=${3} />` : null}
|
|
231
228
|
${!f.grants && overview ? html`<div class="g-legacy"><p class="note">${tn("grantsLegacy")}</p>
|
|
232
229
|
${readOnly ? null : html`<button type="button" class="btn btn-sm" id="grantsConvert" onClick=${convert}>${tn("grantsConvert")}</button>`}</div>` : null}
|
|
233
|
-
<
|
|
234
|
-
|
|
235
|
-
${!rows.length ? html`<p class="note" id="grantsNone">${tn("grantsNoneYet")}</p>` : html`<ul class="guest-list">${rows.map(k => {
|
|
236
|
-
const person=who(k), grant=f.grants?.[k] || original.grants?.[k];
|
|
237
|
-
return html`<li key=${k} class=${`guest-summary${activeGuest === k ? " is-selected" : ""}`}>
|
|
238
|
-
<span class="g-summary-name"><strong>${person.name}</strong><small>${PLATFORMS[person.platform] || person.platform}</small></span>
|
|
239
|
-
<span class="g-summary-agents">${(grant?.instances || []).map(n => html`<span key=${n}>${shownName(rooms,n)}</span>`)}</span>
|
|
240
|
-
<span>${tn(levelOf(grant) === "trusted" ? "grantsLevelTrusted" : "grantsLevelChat")}</span>
|
|
241
|
-
<button type="button" class="btn btn-sm" aria-pressed=${activeGuest === k ? "true" : "false"} aria-controls=${`guest-detail-${encodeURIComponent(k)}`} onClick=${() => {setViewedGuest(k);setEditing(k);}}>${tn("settingsButton")}</button>
|
|
242
|
-
</li>`;
|
|
243
|
-
})}</ul>`}</section>
|
|
244
|
-
<aside class="s-guest-detail-card" aria-label=${layoutText("revGuestDetail")}>${rows.map((k) => {
|
|
230
|
+
<h4>${tn("grantsWithAccess")}</h4>
|
|
231
|
+
${!rows.length ? html`<p class="note" id="grantsNone">${tn("grantsNoneYet")}</p>` : html`<ul class="guest-list">${rows.map((k) => {
|
|
245
232
|
const person = who(k), draft = f.grants && f.grants[k], saved = original.grants && original.grants[k];
|
|
246
233
|
const removed = !draft, added = !saved, dirty = removed || added || !sameGrant(draft, saved);
|
|
247
234
|
const applied = !!saved && saved.instances.length > 0 && !dirty;
|
|
248
235
|
const ss = sendState[k] || {}, cooling = ss.until && ss.until > now;
|
|
249
|
-
return html`<
|
|
236
|
+
return html`<li key=${k} class=${`guest-row${dirty ? " s-dirty" : ""}${removed ? " g-removed" : ""}`} data-account=${k}>
|
|
250
237
|
<div class="g-head"><span class="g-av" aria-hidden="true">${(person.name || "?").slice(0, 1).toUpperCase()}</span>
|
|
251
238
|
<div class="g-id"><strong>${person.name}</strong> <span class="note">${PLATFORMS[person.platform] || person.platform}${person.username ? ` · @${person.username}` : ""}</span></div>
|
|
252
239
|
${removed ? html`<span class="g-state">${tn("grantsWillBeRemoved")}</span>` : added ? html`<span class="g-state">${tn("grantsNew")}</span>` : pill(person)}</div>
|
|
@@ -269,23 +256,23 @@ export function GuestsSection({ ctx, staged }) {
|
|
|
269
256
|
: html`<button type="button" class="btn btn-sm" onClick=${() => setGrant(k, { ...saved })}>${tn("grantsUndoRemove")}</button>`}
|
|
270
257
|
${person.guest && (person.guest.sessions || person.guest.devices) ? html`<button type="button" class="btn btn-sm" onClick=${() => signOut(person)}>${tn("guestSignOut")}</button>` : null}
|
|
271
258
|
</div>`}
|
|
272
|
-
</
|
|
273
|
-
})}
|
|
274
|
-
${readOnly ? null : html`<
|
|
259
|
+
</li>`;
|
|
260
|
+
})}</ul>`}
|
|
261
|
+
${readOnly ? null : html`<h4>${tn("grantsAdd")}</h4>
|
|
275
262
|
<input type="search" class="input g-search" id="grantsSearch" value=${query} aria-label=${tn("grantsSearch")} placeholder=${tn("grantsSearch")} onInput=${(e) => setQuery(e.target.value)} />
|
|
276
|
-
${people === null ? html
|
|
263
|
+
${people === null ? html`<${Skeleton} variant="rows" lines=${3} />` : !candidates.length ? html`<p class="note" id="grantsNoPeople">${tn("grantsNoPeople")}</p>`
|
|
277
264
|
: html`<ul class="g-pick">${candidates.map((p) => html`<li key=${accountKey(p)} class="g-cand" data-account=${accountKey(p)}>
|
|
278
265
|
<span class="g-av" aria-hidden="true">${(p.name || "?").slice(0, 1).toUpperCase()}</span>
|
|
279
266
|
<div class="g-id"><strong>${p.name}</strong> <span class="note">${PLATFORMS[p.platform] || p.platform}${p.username ? ` · @${p.username}` : ""} · <span class="g-when">${tn("grantsLastSeen", new Date(p.lastSeen).toLocaleString())}</span></span>
|
|
280
267
|
${p.instances && p.instances.length ? html`<div class="note">${wroteTo(p.instances)}</div>` : null}</div>
|
|
281
|
-
<button type="button" class="btn btn-sm" onClick=${() => { const k = accountKey(p); setGrant(k, { ...(p.name ? { name: p.name } : {}), instances: choosable.filter((n) => (p.instances || []).includes(n)) }); setEditing(k); }}>${tn("grantsChoose")}</button></li>`)}</ul>`}
|
|
268
|
+
<button type="button" class="btn btn-sm" onClick=${() => { const k = accountKey(p); setGrant(k, { ...(p.name ? { name: p.name } : {}), instances: choosable.filter((n) => (p.instances || []).includes(n)) }); setEditing(k); }}>${tn("grantsChoose")}</button></li>`)}</ul>`}`}
|
|
282
269
|
</fieldset>
|
|
283
|
-
${overview && overview.audit ? html`<
|
|
270
|
+
${overview && overview.audit ? html`<h4>${tn("grantsRecent")}</h4>${!overview.audit.length ? html`<p class="note" id="grantsRecentNone">${tn("grantsRecentNone")}</p>`
|
|
284
271
|
: html`<ul class="g-audit" id="grantsRecentList">${overview.audit.map((e, i) => html`<li key=${`${e.at}-${i}`} class="g-audit-row" data-kind=${e.kind}>
|
|
285
272
|
<span class="g-when">${new Date(e.at).toLocaleString()}</span> <strong>${e.name}</strong>
|
|
286
273
|
${e.kind === "grant" ? html`${e.added.map((n) => html` <span key=${`+${n}`} class="g-wrote g-add">+${n}</span>`)}${e.removed.map((n) => html` <span key=${`-${n}`} class="g-wrote g-del">−${n}</span>`)}${e.level ? html` <span class="g-wrote g-level-to">${tn("grantsAuditLevel", tn(e.level === "trusted" ? "grantsLevelTrusted" : "grantsLevelChat"))}</span>` : null}
|
|
287
274
|
<span class="note"> · <span class="g-wrote">${tn(e.via === "confirmed" ? "grantsAuditConfirmed" : "grantsAuditDirect")}</span>${e.endedSessions ? html` · <span class="g-wrote">${tn("grantsAuditEnded", e.endedSessions)}</span>` : null}</span>`
|
|
288
|
-
: html` <span class="note">${e.outcome === "sent" ? tn("grantsAuditCodeSent") : tn("grantsAuditCodeNot", auditOutcome(e.outcome))}</span>`}</li>`)}</ul>`}
|
|
275
|
+
: html` <span class="note">${e.outcome === "sent" ? tn("grantsAuditCodeSent") : tn("grantsAuditCodeNot", auditOutcome(e.outcome))}</span>`}</li>`)}</ul>`}` : null}
|
|
289
276
|
${status && status.kind === "waiting" ? html`<p class="note" role="status">${tn("grantsWaiting")}</p>` : null}
|
|
290
277
|
${status && status.kind === "failed" ? html`<p class="note g-error" role="alert">${tn("grantsSaveFailed", status.error)}</p>` : null}
|
|
291
278
|
</section>`;
|
|
@@ -23,8 +23,7 @@ export const TOOL_SETS = ["worker", "coordinator", "standard", "minimal", "full"
|
|
|
23
23
|
export function toolSetDefault(defaults, inst, name = "") {
|
|
24
24
|
if (TOOL_SETS.includes(defaults && defaults.tool_set)) return defaults.tool_set;
|
|
25
25
|
const general = hasOwn(inst, "general_topic") ? inst.general_topic === true : !!defaults && defaults.general_topic === true;
|
|
26
|
-
|
|
27
|
-
return general || (name === "general" && !(hasOwn(inst, "general_topic") && inst.general_topic === false)) ? "general" : "worker";
|
|
26
|
+
return general || name === "general" ? "general" : "worker";
|
|
28
27
|
}
|
|
29
28
|
export const TOOL_PROGRESS = ["off", "standard", "verbose"];
|
|
30
29
|
export const AGENT_MODES = ["mcp", "cli"];
|
|
@@ -75,14 +74,6 @@ export const visibilityDefault = (defaults) => (VISIBILITY_MODES.includes(defaul
|
|
|
75
74
|
export const replyGuardSupported = (backend, mode, kiroUi = "legacy") =>
|
|
76
75
|
mode === "mcp" && (["claude-code", "codex", "muse"].includes(backend) || (backend === "kiro-cli" && ["legacy", "tui"].includes(kiroUi || "legacy")));
|
|
77
76
|
|
|
78
|
-
/**
|
|
79
|
-
* Backends AgEnD no longer runs, with the one to use instead (#1280). The browser cannot import src/backend/removed.ts;
|
|
80
|
-
* tests/settings-removed-backend-1280.test.ts keeps this list equal to it.
|
|
81
|
-
*/
|
|
82
|
-
export const REMOVED_BACKEND_REPLACEMENTS = Object.freeze({ "gemini-cli": "antigravity" });
|
|
83
|
-
export const removedBackendReplacement = (backend) =>
|
|
84
|
-
typeof backend === "string" && Object.prototype.hasOwnProperty.call(REMOVED_BACKEND_REPLACEMENTS, backend) ? REMOVED_BACKEND_REPLACEMENTS[backend] : null;
|
|
85
|
-
|
|
86
77
|
/**
|
|
87
78
|
* The backend picker's options. A current value it does not offer (the removed gemini-cli, #1280 review) stays first
|
|
88
79
|
* and selected: otherwise the select falls to its first option and an unrelated edit switches the CLI and account.
|
|
@@ -176,6 +167,11 @@ export function groupAgents(instances, live, filter, groupFor = (n) => groupOf(i
|
|
|
176
167
|
* (the key is removed); the visibility baseline is what the picker showed, so a value it cannot show (a typo, read as
|
|
177
168
|
* unset) is never rewritten by an unrelated edit (#1302).
|
|
178
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
|
+
}
|
|
179
175
|
export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmojisBaseline) {
|
|
180
176
|
const hang = inst.hang_detector || {};
|
|
181
177
|
const next = {
|
|
@@ -199,7 +195,7 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
199
195
|
office_access: separateChoice(form.dashboard.office),
|
|
200
196
|
office_pack_access: separateChoice(form.dashboard.office_packs),
|
|
201
197
|
};
|
|
202
|
-
return changedFields(next, {
|
|
198
|
+
return Object.assign(changedFields(next, {
|
|
203
199
|
backend: inst.backend || defaults.backend || "claude-code",
|
|
204
200
|
model: (inst.model && inst.model.trim()) || null,
|
|
205
201
|
working_directory: inst.working_directory || "",
|
|
@@ -223,7 +219,15 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
223
219
|
dashboard: dashboardPatchValue(dashboardForm(inst)),
|
|
224
220
|
office_access: separateChoice(dashboardForm(inst).office),
|
|
225
221
|
office_pack_access: separateChoice(dashboardForm(inst).office_packs),
|
|
226
|
-
});
|
|
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 } } };
|
|
227
231
|
}
|
|
228
232
|
|
|
229
233
|
/** The agent form's starting values (an override shows the inherited value while "inherit" is on). */
|
|
@@ -254,6 +258,7 @@ export function agentForm(inst, defaults, name = "") {
|
|
|
254
258
|
display_name: inst.display_name ?? defaults.display_name ?? "",
|
|
255
259
|
status_emojis: inst.status_emojis || null,
|
|
256
260
|
dashboard: dashboardForm(inst),
|
|
261
|
+
codex_speed: codexSpeedOf(inst),
|
|
257
262
|
inherit: {
|
|
258
263
|
auto_pause_after: inherit("auto_pause_after"), hang: !hasOwn(hang, "timeout_minutes"), agent_mode: inherit("agent_mode"),
|
|
259
264
|
tool_set: inherit("tool_set"), tool_progress: inherit("tool_progress"), cross_instance_visibility: inherit("cross_instance_visibility"),
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { html, useEffect, useMemo, useState } from "/assets/app-html.js";
|
|
2
|
+
import { lang } from "/assets/app-i18n.js";
|
|
3
|
+
import { useDraft, syncStage } from "./settings-draft.js";
|
|
4
|
+
|
|
5
|
+
const COPY = {
|
|
6
|
+
en: { title: "Notifications", heading: "Quota notices", hint: "One reminder per account, shared by its enabled agents. Exhaustion, pause and auto-continue messages are always kept.",
|
|
7
|
+
classic: "ClassicBot", periodExample: "weekly", scope: "Rule for", fleet: "Fleet default", backend: "Backend", agent: "Agent", enabled: "Reminders", inherit: "Inherit", on: "On", off: "Off",
|
|
8
|
+
thresholds: "Remaining percentages", thresholdHint: "Comma-separated, 1–99 (up to 8). Blank inherits; none disables reminders.",
|
|
9
|
+
periods: "Periods", periodHint: "session, hourly, daily, weekly, monthly. Comma-separated; blank inherits; none disables reminders.",
|
|
10
|
+
target: "Send to", general: "General", error: "Check percentages and periods. Changes cannot be saved yet.",
|
|
11
|
+
old: "This server does not support quota notice settings. Update AgEnD to edit them.",
|
|
12
|
+
sources: "Only fresh account usage with a known reset is used. Unsupported or stale readings do not send reminders. Enabled agents contribute a union of rules; disabling one does not silence others.",
|
|
13
|
+
effective: "In effect", defaults: "Built-in: on · 10% remaining · weekly · General", saved: "Quota notices" },
|
|
14
|
+
"zh-TW": { title: "通知", heading: "用量提醒", hint: "同一帳號共用一份提醒,由啟用提醒的 Agent 合併規則。額度耗盡、暫停與自動繼續的狀態訊息一律保留。",
|
|
15
|
+
classic: "ClassicBot", periodExample: "weekly", scope: "設定對象", fleet: "全隊預設", backend: "後端", agent: "Agent", enabled: "提醒", inherit: "繼承", on: "開啟", off: "關閉",
|
|
16
|
+
thresholds: "剩餘百分比", thresholdHint: "以逗號分隔,1–99,最多 8 個。空白表示繼承;none 表示不提醒。",
|
|
17
|
+
periods: "週期", periodHint: "session(工作階段)、hourly(每小時)、daily(每日)、weekly(每週)、monthly(每月)。以逗號分隔;空白繼承;none 不提醒。",
|
|
18
|
+
target: "傳送至", general: "General", error: "請檢查百分比與週期,目前無法儲存。",
|
|
19
|
+
old: "此伺服器尚未支援用量提醒設定,請更新 AgEnD 後再編輯。",
|
|
20
|
+
sources: "只採用有重設時間的最新帳號用量。不支援或過期的資料不會產生提醒。各 Agent 的規則取聯集;關閉其中一個不會關掉其他 Agent 的提醒。",
|
|
21
|
+
effective: "目前生效", defaults: "內建預設:開啟 · 剩餘 10% · 每週 · General", saved: "用量提醒" },
|
|
22
|
+
};
|
|
23
|
+
export const quotaNoticeText = () => COPY[lang()] || COPY.en;
|
|
24
|
+
const BACKENDS = ["claude-code", "codex", "kiro-cli", "grok", "antigravity", "muse"];
|
|
25
|
+
const PERIODS = ["session", "hourly", "daily", "weekly", "monthly"];
|
|
26
|
+
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
27
|
+
const fieldKey = (scope, field) => JSON.stringify([scope, field]);
|
|
28
|
+
const ruleForm = (v = {}) => ({ enabled: v.enabled === undefined ? "" : v.enabled ? "on" : "off", thresholds: v.thresholds === undefined ? "" : v.thresholds.join(", ") || "none", periods: v.periods === undefined ? "" : v.periods.join(", ") || "none" });
|
|
29
|
+
export function quotaRuleFromForm(f) {
|
|
30
|
+
const rule = {};
|
|
31
|
+
if (f.enabled) rule.enabled = f.enabled === "on";
|
|
32
|
+
for (const k of ["thresholds", "periods"]) {
|
|
33
|
+
const raw = f[k].trim(); if (!raw) continue;
|
|
34
|
+
const values = raw === "none" ? [] : raw.split(",").map(v => v.trim());
|
|
35
|
+
const list = k === "thresholds" ? values.map(v => v === "" ? NaN : Number(v)) : values;
|
|
36
|
+
if (new Set(list).size !== list.length || (k === "thresholds" ? list.length > 8 || list.some(v => !Number.isFinite(v) || v < 1 || v > 99) : list.some(v => !PERIODS.includes(v)))) return null;
|
|
37
|
+
rule[k] = list;
|
|
38
|
+
}
|
|
39
|
+
return rule;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function QuotaNoticeSettings({ ctx }) {
|
|
43
|
+
const text = quotaNoticeText();
|
|
44
|
+
const supported = ctx.schema?.impacts?.["instance.quota_notice"] === "now";
|
|
45
|
+
const instances = ctx.fleet.instances || {};
|
|
46
|
+
const classic = ctx.classic?.channels || {};
|
|
47
|
+
const base = useMemo(() => {
|
|
48
|
+
const d = ctx.fleet.defaults?.quota_notice || {};
|
|
49
|
+
return { target: d.target || "general", rules: Object.fromEntries([
|
|
50
|
+
["fleet", ruleForm(d)], ...BACKENDS.map(b => [`backend:${b}`, ruleForm(d.backends?.[b])]),
|
|
51
|
+
...Object.entries(instances).map(([n, c]) => [`agent:${n}`, ruleForm(c.quota_notice)]),
|
|
52
|
+
...Object.entries(classic).map(([n, c]) => [`classic:${n}`, ruleForm(c.quota_notice)]),
|
|
53
|
+
]) };
|
|
54
|
+
}, []);
|
|
55
|
+
// useDraft retains top-level edited fields. Flatten rules so an edit never
|
|
56
|
+
// freezes untouched rules (or untouched fields of the same rule) across reload.
|
|
57
|
+
const savedFields = useMemo(() => {
|
|
58
|
+
const saved = { target: base.target, ...Object.fromEntries(Object.entries(base.rules).flatMap(([scope, rule]) => Object.entries(rule).map(([field, value]) => [fieldKey(scope, field), value]))) };
|
|
59
|
+
const retained = ctx.drafts?.get("quota-notices");
|
|
60
|
+
if (retained) ctx.drafts.set("quota-notices", Object.fromEntries(Object.entries(retained).filter(([key]) => Object.hasOwn(saved, key))));
|
|
61
|
+
return saved;
|
|
62
|
+
}, []);
|
|
63
|
+
const [fields, setFields] = useDraft(ctx, "quota-notices", () => savedFields);
|
|
64
|
+
const form = useMemo(() => ({ target: fields.target, rules: Object.fromEntries(Object.entries(base.rules).map(([scope, rule]) => [scope, Object.fromEntries(Object.keys(rule).map(field => [field, fields[fieldKey(scope, field)]]))])) }), [fields]);
|
|
65
|
+
const [scope, setScope] = useState("fleet");
|
|
66
|
+
const parsed = Object.fromEntries(Object.entries(form.rules).map(([k, v]) => [k, quotaRuleFromForm(v)]));
|
|
67
|
+
const invalid = Object.values(parsed).some(v => v === null);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!supported) return;
|
|
70
|
+
const defaults = { ...parsed.fleet, target: form.target, backends: Object.fromEntries(BACKENDS.flatMap(b => Object.keys(parsed[`backend:${b}`] || {}).length ? [[b, parsed[`backend:${b}`]]] : [])) };
|
|
71
|
+
const changed = !same(form.rules.fleet, base.rules.fleet) || form.target !== base.target || BACKENDS.some(b => !same(form.rules[`backend:${b}`], base.rules[`backend:${b}`]));
|
|
72
|
+
syncStage(ctx, "quota:defaults", changed ? { label: text.saved, impact: "now", ...(invalid ? { invalid: text.error } : { request: { method: "PUT", url: "/api/settings/fleet/defaults", body: { quota_notice: defaults } } }) } : null);
|
|
73
|
+
for (const [name, isClassic] of [...Object.keys(instances).map(n => [n, false]), ...Object.keys(classic).map(n => [n, true])]) {
|
|
74
|
+
const k = `${isClassic ? "classic" : "agent"}:${name}`, rule = parsed[k];
|
|
75
|
+
syncStage(ctx, `quota:${k}`, !same(form.rules[k], base.rules[k]) ? { label: `${text.saved} · ${name}`, impact: "now", ...(rule === null ? { invalid: text.error } : { request: { method: "PATCH", url: isClassic ? `/api/settings/classic/channels/${encodeURIComponent(name)}` : `/api/settings/fleet/instances/${encodeURIComponent(name)}`, body: { quota_notice: Object.keys(rule).length ? rule : null } } }) } : null);
|
|
76
|
+
}
|
|
77
|
+
}, [form, supported]);
|
|
78
|
+
const value = form.rules[scope];
|
|
79
|
+
const selectedBackend = scope.startsWith("backend:") ? scope.slice(8) : scope.startsWith("agent:") ? instances[scope.slice(6)]?.backend || ctx.fleet.defaults?.backend || "claude-code" : scope.startsWith("classic:") ? classic[scope.slice(8)]?.backend || ctx.classic?.defaults?.backend || ctx.fleet.defaults?.backend || "claude-code" : null;
|
|
80
|
+
const effective = { enabled: true, thresholds: [10], periods: ["weekly"], ...parsed.fleet,
|
|
81
|
+
...(selectedBackend ? parsed[`backend:${selectedBackend}`] : {}), ...(scope.startsWith("agent:") || scope.startsWith("classic:") ? parsed[scope] : {}) };
|
|
82
|
+
const update = k => e => setFields(f => ({ ...f, [fieldKey(scope, k)]: e.target.value }));
|
|
83
|
+
return html`<section class="s-card" id="quota-notices"><h2>${text.heading}</h2><p>${text.hint}</p><p class="muted">${text.defaults}</p>
|
|
84
|
+
${!supported ? html`<p role="status">${text.old}</p>` : null}
|
|
85
|
+
${!invalid ? html`<p class="muted" data-quota-effective>${text.effective}: ${effective.enabled ? text.on : text.off} · ${effective.thresholds.map(v => `${v}%`).join(", ") || "—"} · ${effective.periods.join(", ") || "—"}</p>` : null}
|
|
86
|
+
<fieldset disabled=${!supported} class="s-quota-fields">
|
|
87
|
+
<div class="field"><label for="qn-target">${text.target}</label><select id="qn-target" value=${form.target} onChange=${e => setFields(f => ({ ...f, target: e.target.value }))}>
|
|
88
|
+
<option value="general">${text.general}</option>${Object.entries(instances).filter(([n]) => n !== "general").map(([n, c]) => html`<option value=${n}>${c.display_name || n}</option>`)}
|
|
89
|
+
${form.target !== "general" && !Object.hasOwn(instances, form.target) ? html`<option value=${form.target}>${form.target}</option>` : null}
|
|
90
|
+
</select></div>
|
|
91
|
+
<div class="field"><label for="qn-scope">${text.scope}</label><select id="qn-scope" value=${scope} onChange=${e => setScope(e.target.value)}>
|
|
92
|
+
<option value="fleet">${text.fleet}</option>${BACKENDS.map(b => html`<option value=${`backend:${b}`}>${text.backend} · ${b}</option>`)}
|
|
93
|
+
${Object.entries(instances).map(([n, c]) => html`<option value=${`agent:${n}`}>${text.agent} · ${c.display_name || n}</option>`)}
|
|
94
|
+
${Object.entries(classic).map(([n, c]) => html`<option value=${`classic:${n}`}>${text.classic} · ${c.name || c.instanceName || n}</option>`)}
|
|
95
|
+
</select></div>
|
|
96
|
+
<div class="field"><label for="qn-enabled">${text.enabled}</label><select id="qn-enabled" value=${value.enabled} onChange=${update("enabled")}><option value="">${text.inherit}</option><option value="on">${text.on}</option><option value="off">${text.off}</option></select></div>
|
|
97
|
+
<div class="field"><label for="qn-thresholds">${text.thresholds}</label><input id="qn-thresholds" value=${value.thresholds} onInput=${update("thresholds")} placeholder="10" /><p class="muted">${text.thresholdHint}</p></div>
|
|
98
|
+
<div class="field"><label for="qn-periods">${text.periods}</label><input id="qn-periods" value=${value.periods} onInput=${update("periods")} placeholder=${text.periodExample} /><p class="muted">${text.periodHint}</p></div>
|
|
99
|
+
</fieldset>${invalid ? html`<p class="feedback error" role="alert">${text.error}</p>` : null}<p class="muted">${text.sources}</p></section>`;
|
|
100
|
+
}
|
|
@@ -12,19 +12,17 @@ import { GUESTS_SETTINGS } from "./settings-guests.js";
|
|
|
12
12
|
const L = (en, zh) => ({ en, "zh-TW": zh });
|
|
13
13
|
/** [id, section, target, labelKey | label, config key, words en, words zh] */
|
|
14
14
|
const ROWS = [
|
|
15
|
-
["
|
|
15
|
+
["quota.notices", "notifications", "#quota-notices", null, "defaults.quota_notice", ["usage", "quota", "notifications", "remaining", "weekly"], ["用量", "額度", "提醒", "通知", "剩餘"], L("Quota notices", "用量提醒")],
|
|
16
16
|
// You · Preferences
|
|
17
17
|
["profile.name", "preferences", "#profile-name", "settings.profileTitle", null, ["name", "display name", "who agents see", "profile"], ["名字", "名稱", "顯示名稱", "個人資料"]],
|
|
18
|
-
["prefs.theme", "
|
|
18
|
+
["prefs.theme", "preferences", "#pref-theme", "app.theme", null, ["theme", "dark", "light", "dark mode", "colour scheme"], ["主題", "深色", "淺色", "外觀"]],
|
|
19
19
|
["prefs.lang", "preferences", "#pref-lang", "app.language", null, ["language", "dashboard language", "english", "chinese", "locale"], ["語言", "介面語言", "中文", "英文"]],
|
|
20
20
|
["prefs.names", "preferences", "#pref-names", "app.names", null, ["names", "nickname", "real name", "instance name", "display"], ["名稱", "暱稱", "實名"]],
|
|
21
21
|
["prefs.previews", "preferences", "#pref-previews", "chat.previews", null, ["html preview", "preview", "iframe"], ["預覽", "HTML 預覽"]],
|
|
22
22
|
["prefs.tour", "preferences", "#tourBtn", "chat.tour", null, ["tour", "help", "walkthrough", "guide"], ["導覽", "說明", "教學"]],
|
|
23
|
-
["
|
|
24
|
-
["device.
|
|
25
|
-
["device.css-off", "look", "#css-off-here", "settings.cssDeviceOff", null, ["custom css", "css off", "this device", "safe"], ["自訂 CSS", "關閉 CSS", "這個裝置"]],
|
|
23
|
+
["device.motion", "preferences", "#fx-follow-reduced-motion", "settings.themesFollowMotion", null, ["reduced motion", "animation", "effects", "accessibility"], ["減少動態", "動畫", "特效", "無障礙"]],
|
|
24
|
+
["device.css-off", "preferences", "#css-off-here", "settings.cssDeviceOff", null, ["custom css", "css off", "this device", "safe"], ["自訂 CSS", "關閉 CSS", "這個裝置"]],
|
|
26
25
|
// You · Look
|
|
27
|
-
["device.settings-width", "look", "#settings-content-width", null, null, ["settings width", "content width", "layout", "wide", "compact", "this device"], ["設定寬度", "內容寬度", "版型", "寬版", "窄版", "此裝置"], L("Settings content width", "設定頁內容寬度")],
|
|
28
26
|
["look.themes", "look", "#fx-show-themes", "settings.themesShow", "fx.show", ["agent themes", "themes", "effects", "widgets"], ["主題", "agent 的主題", "特效", "小工具"]],
|
|
29
27
|
["look.colours", "look", ".s-colors", "settings.colorTitle", "color.show", ["identity colour", "color", "colour", "turn off colours"], ["識別色", "顏色", "關閉顏色"]],
|
|
30
28
|
["look.cards", "look", ".s-card-size", "settings.cardSizeTitle", "card.size", ["identity card", "card size", "portrait", "banner"], ["身分卡", "卡片大小"]],
|
|
@@ -35,11 +33,6 @@ const ROWS = [
|
|
|
35
33
|
// Fleet · Agents
|
|
36
34
|
["agents.new", "agents", "#newAgentBtn", "settings.newAgent", null, ["new agent", "create", "add agent", "instance"], ["新增 agent", "建立", "新 agent"]],
|
|
37
35
|
["agents.provider-keys", "agents", ".s-provider-keys", "settings.providerKeys", "web.provider_secrets", ["api key", "provider", "openai", "anthropic", "token", "secret"], ["API 金鑰", "金鑰", "供應商", "token"]],
|
|
38
|
-
// M-2255: the two switches (fleet.yaml runtimes.*).
|
|
39
|
-
["runtimes.windows-cli", "runtimes", "#runtimeWindowsCli", null, "runtimes.windows_cli", ["windows cli", "this pc", "local windows", "AGEND_WINDOWS_CLI", "codex", "claude code"], ["Windows CLI", "這台電腦", "本機"], L("Use this PC's Windows CLIs", "使用這台電腦 Windows 上的 CLI")],
|
|
40
|
-
["runtimes.remote-runtime", "runtimes", "#runtimeRemoteRuntime", null, "runtimes.remote_runtime", ["pair", "remote", "other computer", "AGEND_REMOTE_RUNTIME", "tailscale", "ssh"], ["配對", "遠端", "其他電腦"], L("Allow other Windows PCs to pair", "允許其他 Windows 電腦配對")],
|
|
41
|
-
["runtimes.max-agents", "runtimes", "#runtimeMaxAgents", null, "runtimes.max_agents_per_machine", ["concurrent", "at once", "limit", "parallel", "how many agents"], ["同時", "上限", "並行", "數量"], L("Agents at once on each Windows PC", "每台 Windows 電腦同時執行的 Agent 數")],
|
|
42
|
-
["runtimes.machines", "runtimes", ".runtime-settings", "settings.sec_runtimes", null, ["runtime", "computer", "machine", "pair", "connect", "windows", "linux", "CLI"], ["執行環境", "電腦", "機器", "配對", "連接", "Windows", "CLI"]],
|
|
43
36
|
["defaults.tips", "agent-defaults", "#g-tips", "settings.dailyTips", "defaults.tips", ["daily tips", "notices"], ["每日提示"]],
|
|
44
37
|
["web.notify-login", "access", "#webNotifyLogin", "settings.webNotifyLogin", "web.notify_login", ["sign in", "login", "notices"], ["登入通知"]],
|
|
45
38
|
// Fleet · Agent defaults
|