@songsid/agend 2.3.0-beta.9 → 2.3.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 +16 -8
- package/README.zh-TW.md +16 -8
- package/dist/adapter-world.js.map +1 -1
- package/dist/agend-home.d.ts +5 -0
- package/dist/agend-home.js +7 -0
- package/dist/agend-home.js.map +1 -0
- package/dist/agent-cli-instructions.md +7 -1
- package/dist/agent-cli.js +41 -0
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +9 -0
- package/dist/agent-endpoint.js +23 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.js +1 -1
- package/dist/agent-file-read.js.map +1 -1
- package/dist/agent-whats-new.d.ts +16 -0
- package/dist/agent-whats-new.js +53 -12
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/apply-job.js.map +1 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +12 -0
- package/dist/auth-api.js +77 -22
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +4 -0
- package/dist/authority/authority-state.js +17 -8
- package/dist/authority/authority-state.js.map +1 -1
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +16 -8
- package/dist/authority/web-authority.js +19 -5
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/antigravity.d.ts +2 -2
- package/dist/backend/antigravity.js +2 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.js +13 -4
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +8 -0
- package/dist/backend/codex-metadata.js +74 -17
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex-package.d.ts +30 -0
- package/dist/backend/codex-package.js +133 -0
- package/dist/backend/codex-package.js.map +1 -0
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex.d.ts +2 -0
- package/dist/backend/codex.js +25 -5
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/credential-profile.d.ts +2 -0
- package/dist/backend/credential-profile.js +2 -0
- package/dist/backend/credential-profile.js.map +1 -1
- package/dist/backend/effort-metadata.js.map +1 -1
- package/dist/backend/grok.js +58 -3
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-engine-ledger.js.map +1 -1
- package/dist/backend/kiro-kas-store.js.map +1 -1
- package/dist/backend/kiro-v2-store.js.map +1 -1
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +9 -1
- package/dist/backend/kiro.js +102 -1
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/mock.js.map +1 -1
- package/dist/backend/muse.d.ts +20 -2
- package/dist/backend/muse.js +154 -16
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/opencode-permission.js +1 -1
- package/dist/backend/opencode-permission.js.map +1 -1
- package/dist/backend/opencode.js +2 -1
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/session-signals.js.map +1 -1
- package/dist/backend-availability.js.map +1 -1
- package/dist/backend-command.d.ts +2 -0
- package/dist/backend-command.js +3 -1
- package/dist/backend-command.js.map +1 -1
- package/dist/backend-outage.js.map +1 -1
- package/dist/binary-probe.js +1 -1
- package/dist/binary-probe.js.map +1 -1
- package/dist/bug-report-cli.d.ts +30 -0
- package/dist/bug-report-cli.js +139 -0
- package/dist/bug-report-cli.js.map +1 -0
- package/dist/bug-report.d.ts +47 -0
- package/dist/bug-report.js +137 -0
- package/dist/bug-report.js.map +1 -0
- package/dist/bundled-skills.d.ts +18 -0
- package/dist/bundled-skills.js +38 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-service.js +1 -1
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
- package/dist/channel/adapters/discord-client-retirement.js +57 -0
- package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +4 -0
- package/dist/channel/adapters/discord.js +57 -12
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +7 -1
- package/dist/channel/adapters/telegram.js +57 -49
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-server.js +21 -4
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.d.ts +3 -1
- package/dist/channel/mcp-tools.js +41 -4
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/sticker-download.js.map +1 -1
- package/dist/channel/tool-router.js.map +1 -1
- package/dist/child-process.d.ts +21 -0
- package/dist/child-process.js +54 -0
- package/dist/child-process.js.map +1 -0
- package/dist/classic-channel-manager.js +3 -2
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.js.map +1 -1
- package/dist/cli-flags.js.map +1 -1
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +448 -313
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +1 -1
- package/dist/command-table.js +1 -1
- package/dist/command-table.js.map +1 -1
- package/dist/compact-watch.js.map +1 -1
- package/dist/completion-install.js.map +1 -1
- package/dist/completion.js.map +1 -1
- package/dist/config-validator.d.ts +6 -0
- package/dist/config-validator.js +81 -8
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.js +41 -10
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.js.map +1 -1
- package/dist/context-guardian.js.map +1 -1
- package/dist/coredump-filter.js.map +1 -1
- package/dist/cpu-profile.js.map +1 -1
- package/dist/cross-instance-envelope.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +7 -0
- package/dist/cross-instance-notice.js +10 -0
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +52 -1
- package/dist/daemon.js +385 -27
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.js.map +1 -1
- package/dist/darwin-memory.js +1 -1
- package/dist/darwin-memory.js.map +1 -1
- package/dist/dashboard-live.d.ts +8 -0
- package/dist/dashboard-live.js +35 -0
- package/dist/dashboard-live.js.map +1 -0
- package/dist/dashboard-permissions.d.ts +69 -0
- package/dist/dashboard-permissions.js +138 -0
- package/dist/dashboard-permissions.js.map +1 -0
- package/dist/decision-list.js.map +1 -1
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +11 -0
- package/dist/delivery-outbox.js +52 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-outbox.test.js.map +1 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/diagnostic-redaction.d.ts +10 -0
- package/dist/diagnostic-redaction.js +167 -0
- package/dist/diagnostic-redaction.js.map +1 -0
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.js +52 -0
- package/dist/doctor.js.map +1 -1
- package/dist/e2e-isolation.js.map +1 -1
- package/dist/event-log.js.map +1 -1
- package/dist/export-import.js +7 -5
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +1 -1
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-label.js.map +1 -1
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +2 -0
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-lock.d.ts +6 -0
- package/dist/fleet-lock.js +22 -2
- package/dist/fleet-lock.js.map +1 -1
- package/dist/fleet-manager.d.ts +283 -15
- package/dist/fleet-manager.js +1825 -331
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-process-handlers.d.ts +18 -0
- package/dist/fleet-process-handlers.js +70 -0
- package/dist/fleet-process-handlers.js.map +1 -0
- package/dist/fleet-startup.d.ts +14 -0
- package/dist/fleet-startup.js +30 -0
- package/dist/fleet-startup.js.map +1 -0
- package/dist/fleet-traffic.js.map +1 -1
- package/dist/forged-envelope-scan.d.ts +0 -20
- package/dist/forged-envelope-scan.js +3 -2
- package/dist/forged-envelope-scan.js.map +1 -1
- package/dist/full-restart.d.ts +5 -5
- package/dist/full-restart.js +5 -5
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/bug-report/SKILL.md +31 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +52 -11
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +5 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +3 -1
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +8 -9
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +11 -0
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -1
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/scheduling/SKILL.md +4 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +321 -0
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +24 -4
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +554 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +156 -32
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-knowledge/steering/core-rules.md +1 -1
- package/dist/host-memory.js.map +1 -1
- package/dist/idle-gate-log.d.ts +19 -0
- package/dist/idle-gate-log.js +15 -0
- package/dist/idle-gate-log.js.map +1 -0
- package/dist/instance-config-impact.js +25 -4
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +11 -1
- package/dist/instance-lifecycle.js +97 -25
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +12 -6
- package/dist/instructions.js +19 -10
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-compact-pane.js.map +1 -1
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-log-gate.js.map +1 -1
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/locale.js +450 -20
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -0
- package/dist/log-service.js.map +1 -1
- package/dist/log-steps.d.ts +1 -0
- package/dist/log-steps.js +15 -0
- package/dist/log-steps.js.map +1 -1
- package/dist/logger.js +3 -2
- package/dist/logger.js.map +1 -1
- package/dist/login-controller.d.ts +45 -0
- package/dist/login-controller.js +101 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/login-flows.js +1 -1
- package/dist/login-manager.js.map +1 -1
- package/dist/login-shell.js +3 -1
- package/dist/login-shell.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +96 -0
- package/dist/ls-attach-resolve.js +180 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/ls-rows.d.ts +12 -0
- package/dist/ls-rows.js +83 -4
- package/dist/ls-rows.js.map +1 -1
- package/dist/memory-pressure.js.map +1 -1
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +98 -1
- package/dist/needs-you-hub.js +313 -44
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you-live.d.ts +5 -2
- package/dist/needs-you-live.js +6 -3
- package/dist/needs-you-live.js.map +1 -1
- package/dist/needs-you.d.ts +68 -3
- package/dist/needs-you.js +39 -4
- package/dist/needs-you.js.map +1 -1
- package/dist/network-family.js.map +1 -1
- package/dist/operator-control-paths.js +3 -4
- package/dist/operator-control-paths.js.map +1 -1
- package/dist/outbound-handlers.d.ts +5 -2
- package/dist/outbound-handlers.js +81 -24
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +106 -60
- package/dist/outbound-schemas.js +33 -10
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/outbox-open-error.js.map +1 -1
- package/dist/pane-context-cache.js.map +1 -1
- package/dist/paths.js.map +1 -1
- package/dist/private-dir.js.map +1 -1
- package/dist/probe-worker-pool.js.map +1 -1
- package/dist/profile-control.js.map +1 -1
- package/dist/prompt-file-ref.js.map +1 -1
- package/dist/provider-probe.js.map +1 -1
- package/dist/provider-secret-registry.d.ts +5 -3
- package/dist/provider-secret-registry.js +8 -2
- package/dist/provider-secret-registry.js.map +1 -1
- package/dist/public-link-auto-open.d.ts +32 -0
- package/dist/public-link-auto-open.js +86 -0
- package/dist/public-link-auto-open.js.map +1 -0
- package/dist/public-link-owner.d.ts +10 -0
- package/dist/public-link-owner.js +36 -0
- package/dist/public-link-owner.js.map +1 -0
- package/dist/public-link-progress.d.ts +12 -1
- package/dist/public-link-progress.js +5 -10
- package/dist/public-link-progress.js.map +1 -1
- package/dist/public-preview.js.map +1 -1
- package/dist/public-tunnel-config.d.ts +11 -0
- package/dist/public-tunnel-config.js +68 -0
- package/dist/public-tunnel-config.js.map +1 -0
- package/dist/public-web-gateway.d.ts +2 -0
- package/dist/public-web-gateway.js +19 -6
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +48 -3
- package/dist/public-web-link.js +177 -51
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +9 -0
- package/dist/quickstart-api.js +82 -0
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +5 -0
- package/dist/quickstart.js +40 -25
- package/dist/quickstart.js.map +1 -1
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-dedup.js.map +1 -1
- package/dist/resource-report.js +1 -1
- package/dist/resource-report.js.map +1 -1
- package/dist/restart-guard.js.map +1 -1
- package/dist/restart-progress.d.ts +80 -1
- package/dist/restart-progress.js +306 -21
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.js.map +1 -1
- package/dist/runtime-cpu-profile.js.map +1 -1
- package/dist/scheduler/db.d.ts +40 -13
- package/dist/scheduler/db.js +123 -89
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/task-board-text.d.ts +26 -0
- package/dist/scheduler/task-board-text.js +140 -0
- package/dist/scheduler/task-board-text.js.map +1 -0
- package/dist/scheduler/task-board.d.ts +730 -0
- package/dist/scheduler/task-board.js +2179 -0
- package/dist/scheduler/task-board.js.map +1 -0
- package/dist/scheduler/types.d.ts +6 -1
- package/dist/sd-notify.js +2 -1
- package/dist/sd-notify.js.map +1 -1
- package/dist/search/search-docs.d.ts +58 -0
- package/dist/search/search-docs.js +63 -0
- package/dist/search/search-docs.js.map +1 -0
- package/dist/search/search-index.d.ts +149 -0
- package/dist/search/search-index.js +453 -0
- package/dist/search/search-index.js.map +1 -0
- package/dist/search/search-store.d.ts +122 -0
- package/dist/search/search-store.js +236 -0
- package/dist/search/search-store.js.map +1 -0
- package/dist/search/search-worker.d.ts +1 -0
- package/dist/search/search-worker.js +163 -0
- package/dist/search/search-worker.js.map +1 -0
- package/dist/secret-file.js.map +1 -1
- package/dist/secret-store.d.ts +2 -0
- package/dist/secret-store.js +21 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-installer.d.ts +98 -1
- package/dist/service-installer.js +246 -11
- package/dist/service-installer.js.map +1 -1
- package/dist/service-owner.d.ts +44 -0
- package/dist/service-owner.js +48 -0
- package/dist/service-owner.js.map +1 -0
- package/dist/service-plan.d.ts +39 -2
- package/dist/service-plan.js +188 -6
- package/dist/service-plan.js.map +1 -1
- package/dist/session-oom-stop.d.ts +45 -0
- package/dist/session-oom-stop.js +259 -0
- package/dist/session-oom-stop.js.map +1 -0
- package/dist/session-oom.d.ts +34 -0
- package/dist/session-oom.js +251 -0
- package/dist/session-oom.js.map +1 -0
- package/dist/settings-api.d.ts +14 -1
- package/dist/settings-api.js +74 -13
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.d.ts +5 -0
- package/dist/settings-change.js +167 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +9 -1
- package/dist/settings-confirmation.js +18 -8
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-control.js +2 -1
- package/dist/settings-control.js.map +1 -1
- package/dist/settings-effect.js +29 -4
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +13 -0
- package/dist/settings-http-confirmation.js +15 -3
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +13 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +4 -1
- package/dist/settings-request-capability.js +11 -3
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-auth.d.ts +1 -0
- package/dist/setup-auth.js +2 -1
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +23 -7
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-host.d.ts +6 -1
- package/dist/setup-host.js +15 -4
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +6 -3
- package/dist/setup-wizard.js.map +1 -1
- package/dist/spawn-gate.d.ts +7 -0
- package/dist/spawn-gate.js +45 -12
- package/dist/spawn-gate.js.map +1 -1
- package/dist/start-attempt.d.ts +11 -0
- package/dist/start-attempt.js +29 -0
- package/dist/start-attempt.js.map +1 -0
- package/dist/start-failure-chat.d.ts +37 -0
- package/dist/start-failure-chat.js +142 -0
- package/dist/start-failure-chat.js.map +1 -0
- package/dist/start-failure-notice.d.ts +4 -0
- package/dist/start-failure-notice.js +20 -0
- package/dist/start-failure-notice.js.map +1 -0
- package/dist/start-failure.d.ts +171 -0
- package/dist/start-failure.js +348 -0
- package/dist/start-failure.js.map +1 -0
- package/dist/startup-memory-deadline.d.ts +23 -0
- package/dist/startup-memory-deadline.js +55 -0
- package/dist/startup-memory-deadline.js.map +1 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/storm-window.js.map +1 -1
- package/dist/systemd-peer-bus.js.map +1 -1
- package/dist/target-queue-worker.js.map +1 -1
- package/dist/task-board-summary.d.ts +101 -0
- package/dist/task-board-summary.js +177 -0
- package/dist/task-board-summary.js.map +1 -0
- package/dist/task-board-tool.d.ts +25 -0
- package/dist/task-board-tool.js +155 -0
- package/dist/task-board-tool.js.map +1 -0
- package/dist/task-board-waker.d.ts +51 -0
- package/dist/task-board-waker.js +141 -0
- package/dist/task-board-waker.js.map +1 -0
- package/dist/telegram-api-root.d.ts +1 -0
- package/dist/telegram-api-root.js +40 -0
- package/dist/telegram-api-root.js.map +1 -0
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.js +1 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.d.ts +104 -0
- package/dist/tmux-exec-helper.js +412 -0
- package/dist/tmux-exec-helper.js.map +1 -0
- package/dist/tmux-manager.d.ts +1 -0
- package/dist/tmux-manager.js +29 -13
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +2 -2
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-archiver.js.map +1 -1
- package/dist/topic-commands.d.ts +13 -0
- package/dist/topic-commands.js +56 -33
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.js.map +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-jsonl.js.map +1 -1
- package/dist/transcript-monitor.js +5 -0
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +2 -0
- package/dist/transcript-sources.js +4 -0
- package/dist/transcript-sources.js.map +1 -1
- package/dist/tunnel/cloudflared-install.js +3 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/cloudflared.d.ts +7 -16
- package/dist/tunnel/cloudflared.js +100 -13
- package/dist/tunnel/cloudflared.js.map +1 -1
- package/dist/tunnel/lease.js +3 -2
- package/dist/tunnel/lease.js.map +1 -1
- package/dist/tunnel/manager.js.map +1 -1
- package/dist/tunnel/named-diagnostics.d.ts +13 -0
- package/dist/tunnel/named-diagnostics.js +52 -0
- package/dist/tunnel/named-diagnostics.js.map +1 -0
- package/dist/tunnel/public-fetch.js.map +1 -1
- package/dist/tunnel/purpose-lane.js.map +1 -1
- package/dist/tunnel/types.d.ts +4 -1
- package/dist/tunnel/types.js.map +1 -1
- package/dist/types.d.ts +56 -2
- package/dist/ui/app-effects.js +23 -5
- package/dist/ui/app.html +2 -0
- package/dist/ui/backend-signin.js +297 -0
- package/dist/ui/chat-effects.js +10 -3
- package/dist/ui/chat-msg-actions.js +176 -0
- package/dist/ui/chat-render.js +62 -18
- package/dist/ui/chat-store.js +218 -48
- package/dist/ui/chat-strings.js +40 -8
- package/dist/ui/chat-thread.js +119 -10
- package/dist/ui/effect-trial-offer.js +2 -31
- package/dist/ui/effects-waker.js +2 -0
- package/dist/ui/fleet-canvas-layout.js +13 -4
- package/dist/ui/fleet-canvas.js +69 -28
- package/dist/ui/fleet-office-editor.js +149 -0
- package/dist/ui/fleet-office-model.js +358 -0
- package/dist/ui/fleet-office-pack.js +199 -0
- package/dist/ui/fleet-office-skin.js +474 -0
- package/dist/ui/fleet-office-store.js +49 -0
- package/dist/ui/fleet-office-zones.js +177 -0
- package/dist/ui/fleet-office.js +434 -0
- package/dist/ui/fleet-org.js +18 -5
- package/dist/ui/fleet-route-scene.js +272 -0
- package/dist/ui/fleet-route-worker.js +21 -0
- package/dist/ui/fleet-route.js +88 -0
- package/dist/ui/fleet-task-card.js +436 -0
- package/dist/ui/fleet-task-common.js +482 -0
- package/dist/ui/fleet-task-work.js +107 -0
- package/dist/ui/fleet-tasks.js +569 -0
- package/dist/ui/fleet-traffic.js +81 -18
- package/dist/ui/fleet-usage.js +36 -2
- package/dist/ui/guest-refused.html +41 -0
- package/dist/ui/icons/icon-192.png +0 -0
- package/dist/ui/icons/icon-512.png +0 -0
- package/dist/ui/image-lightbox.js +45 -1
- package/dist/ui/image-zoom.js +242 -0
- package/dist/ui/panel-chat.js +214 -57
- package/dist/ui/panel-details.js +2 -0
- package/dist/ui/panel-fleet.js +32 -71
- package/dist/ui/panel-log.js +3 -3
- package/dist/ui/panel-needs.js +23 -6
- package/dist/ui/panel-settings.js +166 -33
- package/dist/ui/preview-panel.js +2 -1
- package/dist/ui/search-dialog.js +350 -0
- package/dist/ui/settings-appearance.js +170 -10
- package/dist/ui/settings-apply.js +3 -3
- package/dist/ui/settings-confirm.js +7 -2
- package/dist/ui/settings-dialogs.js +46 -21
- package/dist/ui/settings-discord.js +6 -2
- package/dist/ui/settings-guests.js +2 -1
- package/dist/ui/settings-learn.js +1 -0
- package/dist/ui/settings-model.js +51 -18
- package/dist/ui/settings-mods.js +8 -3
- package/dist/ui/settings-owner-effects.js +6 -4
- package/dist/ui/settings-strings.js +186 -6
- package/dist/ui/settings-token.js +3 -1
- package/dist/ui/settings-web-authority.js +13 -5
- package/dist/ui/settings-wizard.js +13 -7
- package/dist/ui/shared/agend-auth.js +2 -0
- package/dist/ui/shared/app-i18n.js +12 -5
- package/dist/ui/shared/app-needs.js +2 -2
- package/dist/ui/shared/app-prefs.js +15 -0
- package/dist/ui/shared/app-route.js +18 -0
- package/dist/ui/shared/app-shell.js +189 -28
- package/dist/ui/shared/app-store.js +3 -2
- package/dist/ui/shared/app-stream.js +5 -1
- package/dist/ui/shared/app-themes.js +116 -1
- package/dist/ui/shared/app.css +668 -48
- package/dist/ui/shared/app.js +9 -1
- package/dist/ui/shared/card-strings.js +4 -0
- package/dist/ui/shared/effect-app-runtime.js +7 -5
- package/dist/ui/shared/effect-chat-runtime.js +2 -7
- package/dist/ui/shared/effect-cursor.js +3 -2
- package/dist/ui/shared/effect-display-metadata.js +39 -0
- package/dist/ui/shared/effect-owner-source.js +8 -1
- package/dist/ui/shared/effect-registry.js +14 -4
- package/dist/ui/shared/effect-runtime-loader.js +3 -1
- package/dist/ui/shared/effect-stock-trust.js +5 -5
- package/dist/ui/shared/feature-flags.js +127 -0
- package/dist/ui/shared/guest-refused.js +35 -0
- package/dist/ui/shared/header-tools.js +2 -2
- package/dist/ui/shared/identity-card.js +26 -8
- package/dist/ui/shared/identity-color.js +17 -10
- package/dist/ui/shared/instance-nav.js +183 -28
- package/dist/ui/shared/owner-css.js +30 -1
- package/dist/ui/shared/panel-view.js +14 -29
- package/dist/ui/shared/text-undo.js +210 -0
- package/dist/ui/shared/tokens.css +4 -0
- package/dist/ui/shared/ui-dialog.js +5 -4
- package/dist/ui/shared/ui-icons.js +4 -0
- package/dist/ui/shared/ui-menu.js +20 -7
- package/dist/ui/shared/ui-toast.js +16 -3
- package/dist/ui/shared/usage-dialog.js +216 -16
- package/dist/ui/shared/view-strings.js +70 -4
- package/dist/ui/shared/web-authorize.js +50 -1
- package/dist/ui/signin.html +2 -0
- package/dist/ui/web-terminal/terminal.html +10 -10
- package/dist/ui/web-terminal/terminal.js +58 -12
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.js +1 -1
- package/dist/update-dispatch.js.map +1 -1
- package/dist/update-install.js.map +1 -1
- package/dist/update-launch.d.ts +10 -1
- package/dist/update-launch.js +39 -14
- package/dist/update-launch.js.map +1 -1
- package/dist/update-marker.js.map +1 -1
- package/dist/update-preflight.js +1 -1
- package/dist/update-preflight.js.map +1 -1
- package/dist/update-progress.d.ts +3 -1
- package/dist/update-progress.js +3 -1
- package/dist/update-progress.js.map +1 -1
- package/dist/usage/format-rich.js +6 -3
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +2 -1
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/i18n.d.ts +13 -1
- package/dist/usage/i18n.js +29 -0
- package/dist/usage/i18n.js.map +1 -1
- package/dist/usage/providers.d.ts +89 -2
- package/dist/usage/providers.js +247 -41
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/usage/usage-api.d.ts +5 -1
- package/dist/usage/usage-api.js +185 -58
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.js +1 -1
- package/dist/usage-rollup.js.map +1 -1
- package/dist/user-systemd.d.ts +24 -0
- package/dist/user-systemd.js +75 -0
- package/dist/user-systemd.js.map +1 -0
- package/dist/view-api.d.ts +7 -0
- package/dist/view-api.js +16 -4
- package/dist/view-api.js.map +1 -1
- package/dist/wake-coordinator.js.map +1 -1
- package/dist/web-ambient.js.map +1 -1
- package/dist/web-api.d.ts +58 -11
- package/dist/web-api.js +1104 -71
- package/dist/web-api.js.map +1 -1
- package/dist/web-app-icon-worker.d.ts +1 -0
- package/dist/web-app-icon-worker.js +16 -0
- package/dist/web-app-icon-worker.js.map +1 -0
- package/dist/web-app-icon.d.ts +109 -0
- package/dist/web-app-icon.js +257 -0
- package/dist/web-app-icon.js.map +1 -0
- package/dist/web-appearance-policy.js.map +1 -1
- package/dist/web-appearance-tools.d.ts +1 -0
- package/dist/web-appearance-tools.js +7 -3
- package/dist/web-appearance-tools.js.map +1 -1
- package/dist/web-appearance-view.js.map +1 -1
- package/dist/web-appearance.d.ts +4 -10
- package/dist/web-appearance.js +7 -4
- package/dist/web-appearance.js.map +1 -1
- package/dist/web-auth.d.ts +8 -4
- package/dist/web-auth.js +33 -21
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +130 -0
- package/dist/web-backend-login.js +225 -0
- package/dist/web-backend-login.js.map +1 -0
- package/dist/web-card.js.map +1 -1
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +118 -8
- package/dist/web-chat-history.js +220 -25
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +5 -1
- package/dist/web-commands.js +1 -1
- package/dist/web-commands.js.map +1 -1
- package/dist/web-cookie-names.d.ts +5 -0
- package/dist/web-cookie-names.js +12 -0
- package/dist/web-cookie-names.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +2 -2
- package/dist/web-effect-library.js.map +1 -1
- package/dist/web-effect-playback.js.map +1 -1
- package/dist/web-effect-profiles.d.ts +16 -16
- package/dist/web-effect-profiles.js +3 -2
- package/dist/web-effect-profiles.js.map +1 -1
- package/dist/web-effect-service.js.map +1 -1
- package/dist/web-effect-tools.js.map +1 -1
- package/dist/web-effect-trials.js.map +1 -1
- package/dist/web-effect-upload.js.map +1 -1
- package/dist/web-effect.d.ts +6 -6
- package/dist/web-effect.js.map +1 -1
- package/dist/web-experimental-http.d.ts +2 -0
- package/dist/web-experimental-http.js +12 -0
- package/dist/web-experimental-http.js.map +1 -0
- package/dist/web-experimental.d.ts +11 -0
- package/dist/web-experimental.js +49 -0
- package/dist/web-experimental.js.map +1 -0
- package/dist/web-guest-access.d.ts +4 -2
- package/dist/web-guest-access.js +22 -10
- package/dist/web-guest-access.js.map +1 -1
- package/dist/web-guest-rooms.js.map +1 -1
- package/dist/web-host-guard.d.ts +11 -0
- package/dist/web-host-guard.js +11 -0
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-icons.d.ts +33 -1
- package/dist/web-icons.js +83 -11
- package/dist/web-icons.js.map +1 -1
- package/dist/web-identity-color.js.map +1 -1
- package/dist/web-image-meta.d.ts +13 -0
- package/dist/web-image-meta.js +62 -0
- package/dist/web-image-meta.js.map +1 -1
- package/dist/web-images.js.map +1 -1
- package/dist/web-libavoid.d.ts +14 -0
- package/dist/web-libavoid.js +46 -0
- package/dist/web-libavoid.js.map +1 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mentions.js.map +1 -1
- package/dist/web-mod-agent.js.map +1 -1
- package/dist/web-mod-store.d.ts +2 -0
- package/dist/web-mod-store.js +10 -0
- package/dist/web-mod-store.js.map +1 -1
- package/dist/web-office-store.d.ts +104 -0
- package/dist/web-office-store.js +236 -0
- package/dist/web-office-store.js.map +1 -0
- package/dist/web-owner-css-store.d.ts +44 -1
- package/dist/web-owner-css-store.js +70 -9
- package/dist/web-owner-css-store.js.map +1 -1
- package/dist/web-owner-css.js.map +1 -1
- package/dist/web-png.d.ts +33 -0
- package/dist/web-png.js +329 -0
- package/dist/web-png.js.map +1 -0
- package/dist/web-prefs.d.ts +6 -0
- package/dist/web-prefs.js +29 -3
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +2 -0
- package/dist/web-preview.js +2 -0
- package/dist/web-preview.js.map +1 -1
- package/dist/web-profile.js.map +1 -1
- package/dist/web-reactions.d.ts +35 -0
- package/dist/web-reactions.js +47 -0
- package/dist/web-reactions.js.map +1 -0
- package/dist/web-request-context.d.ts +5 -0
- package/dist/web-request-context.js.map +1 -1
- package/dist/web-returning-device.d.ts +4 -2
- package/dist/web-returning-device.js +13 -6
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-schedules.js.map +1 -1
- package/dist/web-send-dedupe.d.ts +36 -0
- package/dist/web-send-dedupe.js +69 -0
- package/dist/web-send-dedupe.js.map +1 -0
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.js +1 -1
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +11 -5
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +6 -0
- package/dist/web-settings-tools.js +52 -17
- package/dist/web-settings-tools.js.map +1 -1
- package/dist/web-terminal-http.js +15 -2
- package/dist/web-terminal-http.js.map +1 -1
- package/dist/web-terminal.js +1 -1
- package/dist/web-terminal.js.map +1 -1
- package/dist/web-theme-store.d.ts +2 -2
- package/dist/web-theme-store.js +6 -3
- package/dist/web-theme-store.js.map +1 -1
- package/dist/web-theme.d.ts +29 -0
- package/dist/web-theme.js +89 -1
- package/dist/web-theme.js.map +1 -1
- package/dist/web-upload.d.ts +18 -1
- package/dist/web-upload.js +45 -7
- package/dist/web-upload.js.map +1 -1
- package/dist/web-widget.js.map +1 -1
- package/dist/webhook-emitter.js.map +1 -1
- package/dist/windows-shortcuts.d.ts +78 -0
- package/dist/windows-shortcuts.js +203 -0
- package/dist/windows-shortcuts.js.map +1 -0
- package/dist/workflow-templates/default.md +3 -0
- package/dist/working-state-journal.d.ts +68 -0
- package/dist/working-state-journal.js +93 -0
- package/dist/working-state-journal.js.map +1 -0
- package/dist/ws-server.js.map +1 -1
- package/dist/yaml-shared-nodes.d.ts +25 -0
- package/dist/yaml-shared-nodes.js +185 -0
- package/dist/yaml-shared-nodes.js.map +1 -0
- package/launcher/agend-install.cjs +828 -0
- package/launcher/install-admission.cjs +4 -39
- package/launcher/postinstall.cjs +14 -12
- package/launcher/private-home.cjs +43 -0
- package/package.json +16 -13
- package/scripts/preinstall-guard.cjs +2 -5
- package/templates/windows-shortcuts.ps1 +181 -0
- package/launcher/old-updater-note.cjs +0 -48
|
@@ -11,7 +11,7 @@ import { appStore } from "/assets/app-store.js";
|
|
|
11
11
|
import { t } from "/assets/app-i18n.js";
|
|
12
12
|
import { toast } from "/assets/ui-toast.js";
|
|
13
13
|
import "./settings-strings.js";
|
|
14
|
-
import { api, confirmedWrite, newKey } from "./settings-confirm.js";
|
|
14
|
+
import { api, confirmedWrite, newKey, selfConfirmed } from "./settings-confirm.js";
|
|
15
15
|
|
|
16
16
|
const WATCH_LIMIT_MS = 10 * 60_000;
|
|
17
17
|
const POST_RETRIES = [1000, 2000, 4000];
|
|
@@ -114,7 +114,7 @@ async function perform(step, o) {
|
|
|
114
114
|
if (step.request) {
|
|
115
115
|
const { method, url, body } = step.request;
|
|
116
116
|
return confirmedWrite(url, { method, body, key: step.key, label: step.label,
|
|
117
|
-
onPending: (id) => { if (mine(o)) { step.pendingId = id; step.status = "waiting"; publish(); } } });
|
|
117
|
+
onPending: (id, view) => { if (mine(o)) { step.pendingId = id; step.status = selfConfirmed(view) ? "running" : "waiting"; publish(); } } });
|
|
118
118
|
}
|
|
119
119
|
if (step.connectionSecret) return rotateConnectionSecret(step, o);
|
|
120
120
|
return { ok: false, body: { error: "unknown change" } };
|
|
@@ -129,7 +129,7 @@ async function rotateConnectionSecret(step, o) {
|
|
|
129
129
|
if (!verified.ok) return verified;
|
|
130
130
|
const applied = await confirmedWrite(`${base}/apply`, { method: "POST", key: step.key, label: step.label,
|
|
131
131
|
body: { verification_id: verified.body && verified.body.verification_id, idempotency_key: step.key },
|
|
132
|
-
onPending: (pid) => { if (mine(o)) { step.pendingId = pid; step.status = "waiting"; publish(); } } });
|
|
132
|
+
onPending: (pid, view) => { if (mine(o)) { step.pendingId = pid; step.status = selfConfirmed(view) ? "running" : "waiting"; publish(); } } });
|
|
133
133
|
if (!applied.ok && applied.status !== 409) return applied;
|
|
134
134
|
let result = applied.body || {};
|
|
135
135
|
for (let n = 0; result.job_id && result.result === "applying" && n < 60; n++) {
|
|
@@ -33,6 +33,10 @@ export async function api(path, opts = {}) {
|
|
|
33
33
|
|
|
34
34
|
/** A request id we can follow: a non-empty string (the server's are 32 hex characters). */
|
|
35
35
|
const usableId = (v) => typeof v === "string" && v.length > 0;
|
|
36
|
+
/** #2170: a held request its own web-verified account confirmed (the server's answer says so): applying, no wait for chat. */
|
|
37
|
+
export function selfConfirmed(view) {
|
|
38
|
+
return !!view && !!view.confirmation && view.confirmation.kind === "web";
|
|
39
|
+
}
|
|
36
40
|
/** The 202 that means "waiting for an admin", not "done". */
|
|
37
41
|
export function isPendingResponse(res) {
|
|
38
42
|
return !!res && res.status === 202 && !!res.body && res.body.result === "pending_confirmation" && !!res.body.pending_change
|
|
@@ -159,13 +163,14 @@ export async function attach() {
|
|
|
159
163
|
* itself would have been: applied → { ok: true, body: what the write answered }, anything else → { ok: false } with
|
|
160
164
|
* the reason. An accepted answer that cannot be read is { ok: false, ambiguous: true } (see isUnreadableAccept); a
|
|
161
165
|
* network failure throws. Every other answer is returned as it is. `key` is the request's Idempotency-Key: pass the same one to
|
|
162
|
-
* retry the same request. `onPending(id)` is told when it starts waiting
|
|
166
|
+
* retry the same request. `onPending(id, view)` is told when it starts waiting — or, held and confirmed by its own
|
|
167
|
+
* web-verified account (selfConfirmed(view), #2170), applying.
|
|
163
168
|
*/
|
|
164
169
|
export async function confirmedWrite(path, { method = "POST", body, key = newKey("w"), label, headers, onPending } = {}) {
|
|
165
170
|
const res = await api(path, { method, headers: { ...(headers || {}), "Idempotency-Key": key }, body: body === undefined ? undefined : JSON.stringify(body) });
|
|
166
171
|
if (isUnreadableAccept(res)) return { ok: false, status: 202, ambiguous: true, body: { error: "unreadable_confirmation_response" } };
|
|
167
172
|
if (!isPendingResponse(res)) return res;
|
|
168
|
-
if (onPending) onPending(res.body.pending_change.id);
|
|
173
|
+
if (onPending) onPending(res.body.pending_change.id, res.body.pending_change);
|
|
169
174
|
const final = await track(res.body.pending_change, label);
|
|
170
175
|
return outcomeResponse(final);
|
|
171
176
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// provider key): each goes through confirmedWrite, so a change an admin must confirm waits for it (#1423).
|
|
5
5
|
import { html, useEffect, useMemo, useRef, useState } from "/assets/app-html.js";
|
|
6
6
|
import { t } from "/assets/app-i18n.js";
|
|
7
|
+
import { recordEdit } from "/assets/text-undo.js";
|
|
7
8
|
import { useLease } from "/assets/app-ctx.js";
|
|
8
9
|
import { Dialog } from "/assets/ui-dialog.js";
|
|
9
10
|
import { Icon } from "/assets/ui-icons.js";
|
|
@@ -16,11 +17,13 @@ import { startOperation } from "./settings-apply.js";
|
|
|
16
17
|
import "./settings-strings.js"; // its words, wherever a picker of this file is used (#2072: Fleet's create dialog too)
|
|
17
18
|
import { backendChoices, modelChoices, OTHER_MODEL, useBackendRows, useModelCatalog } from "./settings-catalog.js";
|
|
18
19
|
import {
|
|
19
|
-
ACCESS_MODES,
|
|
20
|
+
ACCESS_MODES, AGENT_MODES, CH_TYPES, DASHBOARD_CHOICES, DASHBOARD_FEATURES, HANG_TIMEOUT_DEFAULT_MINUTES, LOG_LEVELS, TOOL_PROGRESS, TOOL_SETS,
|
|
20
21
|
VISIBILITY_MODES, accessConfirmations, agentForm, agentPatch, backendOptions, changedFields, channelId, channelsOf,
|
|
21
|
-
chLabel, hasOwn, impactOf, nonNegative, nonNegativeInteger, positive, replyGuardSupported, sameValue, visibilityDefault,
|
|
22
|
-
classicWebEchoEffective, worstImpact,
|
|
22
|
+
chLabel, dashboardDefault, hasOwn, impactOf, newConnectionImpact, nonNegative, nonNegativeInteger, positive, replyGuardSupported, sameValue, visibilityDefault,
|
|
23
|
+
classicWebEchoEffective, toolSetDefault, worstImpact,
|
|
23
24
|
} from "./settings-model.js";
|
|
25
|
+
/** #2342: a field by id, for recordEdit before a pick or a reset writes it. */
|
|
26
|
+
const byId = (id) => (typeof document !== "undefined" ? document.getElementById(id) : null);
|
|
24
27
|
|
|
25
28
|
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
26
29
|
export const impactText = (kind) => tn(kind === "now" ? "impactNow" : kind === "fleet" ? "impactFleet" : "impactAgent");
|
|
@@ -103,7 +106,7 @@ export function ChipList({ items, onChange, placeholder, label }) {
|
|
|
103
106
|
|
|
104
107
|
const replyHint = (backend, mode, kiroUi) => (replyGuardSupported(backend, mode, kiroUi) ? tn("replyGuardSupported") : tn("replyGuardUnsupported", backend, mode));
|
|
105
108
|
|
|
106
|
-
/** The dialog every editor uses: Cancel / Stage change; the footer says what the
|
|
109
|
+
/** 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). */
|
|
107
110
|
function EditDialog({ title, subtitle, onClose, onStage, impacts, schema, children, ready = true, wide = true }) {
|
|
108
111
|
const kinds = [...new Set((impacts || []).map((f) => impactOf(schema, f)))];
|
|
109
112
|
return html`<${Dialog} title=${title} label=${subtitle ? `${title} — ${subtitle}` : title} onClose=${onClose} wide=${wide}
|
|
@@ -184,9 +187,9 @@ export function StatusEmojiEditor({ own, platform, channel, previewBody, onChang
|
|
|
184
187
|
<label for=${`se-${key}`}>${tn(`se_${key}`)}</label>
|
|
185
188
|
<input id=${`se-${key}`} type="text" autocomplete="off" value=${values[key] || ""} placeholder=${builtins[key] || ""} onInput=${(e) => set(key, e.target.value)} />
|
|
186
189
|
<button type="button" class="btn btn-sm" onClick=${() => setPicker(picker === key ? null : key)} aria-expanded=${picker === key ? "true" : "false"}>${tn("se_pick")}</button>
|
|
187
|
-
<button type="button" class="icon-btn" aria-label=${tn("se_useDefault")} title=${tn("se_useDefault")} onClick=${() => set(key, "")}><${Icon} name="close" size=${14} /></button>
|
|
190
|
+
<button type="button" class="icon-btn" aria-label=${tn("se_useDefault")} title=${tn("se_useDefault")} onClick=${() => { recordEdit(byId(`se-${key}`)); set(key, ""); }}><${Icon} name="close" size=${14} /></button>
|
|
188
191
|
${picker === key ? html`<${EmojiPicker} cat=${cat} keyName=${key} platform=${platform} channel=${channel}
|
|
189
|
-
onPick=${(v) => { set(key, v); setPicker(null); }} onClose=${() => setPicker(null)} />` : null}
|
|
192
|
+
onPick=${(v) => { recordEdit(byId(`se-${key}`)); set(key, v); setPicker(null); }} onClose=${() => setPicker(null)} />` : null}
|
|
190
193
|
</div>`)}</div>
|
|
191
194
|
<p class="note">${tn("se_hint")}</p>
|
|
192
195
|
</div>`;
|
|
@@ -227,7 +230,7 @@ function EmojiPicker({ cat, keyName, platform, channel, onPick, onClose }) {
|
|
|
227
230
|
export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
228
231
|
const { fleet, schema } = ctx;
|
|
229
232
|
const defaults = fleet.defaults || {};
|
|
230
|
-
const [f, setF] = useState(() => agentForm(inst, defaults));
|
|
233
|
+
const [f, setF] = useState(() => agentForm(inst, defaults, name));
|
|
231
234
|
const [emojis, setEmojis] = useState({ value: inst.status_emojis || null, baseline: inst.status_emojis || null });
|
|
232
235
|
// #1302: the baseline is what the picker shows before anyone touches it.
|
|
233
236
|
const visibilityBaseline = useMemo(() => (hasOwn(inst, "cross_instance_visibility") ? (VISIBILITY_MODES.includes(inst.cross_instance_visibility) ? inst.cross_instance_visibility : VISIBILITY_MODES[0]) : null), []);
|
|
@@ -241,16 +244,17 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
241
244
|
};
|
|
242
245
|
const failoverWarn = !f.inherit.model_failover && !f.model_failover.trim() ? "failoverEmpty" : "";
|
|
243
246
|
const ready = !errors.auto && !errors.hang;
|
|
247
|
+
const pending = () => agentPatch({ ...f, status_emojis: emojis.value }, inst, defaults, visibilityBaseline, emojis.baseline);
|
|
244
248
|
const stage = () => {
|
|
245
249
|
if (!ready) return;
|
|
246
|
-
const patch =
|
|
250
|
+
const patch = pending();
|
|
247
251
|
if (Object.keys(patch).length) ctx.stageAgent(name, inst, patch);
|
|
248
252
|
onClose();
|
|
249
253
|
};
|
|
250
254
|
// What an override shows while it inherits: the default.
|
|
251
255
|
const shown = (k, own, dflt) => (f.inherit[k] ? dflt : own);
|
|
252
256
|
const L = (text, field, id) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${id} />`;
|
|
253
|
-
return html`<${EditDialog} title=${ctx.shortName(name, inst)} subtitle=${
|
|
257
|
+
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}>
|
|
254
258
|
<div class="grid2">
|
|
255
259
|
<div class="field">${L(tn("displayName"), "instance.display_name", "ag-dn")}
|
|
256
260
|
<${Override} inherit=${f.inherit.display_name} onInherit=${setInherit("display_name")}>
|
|
@@ -274,15 +278,24 @@ export function AgentDialog({ name, inst, ctx, onClose }) {
|
|
|
274
278
|
<input id="ag-hang" type="number" min="0.1" step="0.5" class=${errors.hang ? "invalid" : ""} disabled=${f.inherit.hang}
|
|
275
279
|
value=${shown("hang", f.hang, String((defaults.hang_detector && defaults.hang_detector.timeout_minutes) ?? HANG_TIMEOUT_DEFAULT_MINUTES))} onInput=${(e) => set("hang")(e.target.value)} /></${Override}>
|
|
276
280
|
<${Feedback} error=${errors.hang} /></div>
|
|
277
|
-
${[["agent_mode", "agentMode", AGENT_MODES, defaults.agent_mode || "mcp"], ["tool_set", "toolSet", TOOL_SETS, defaults
|
|
281
|
+
${[["agent_mode", "agentMode", AGENT_MODES, defaults.agent_mode || "mcp"], ["tool_set", "toolSet", TOOL_SETS, toolSetDefault(defaults, inst, name)],
|
|
278
282
|
["tool_progress", "toolProgress", TOOL_PROGRESS, defaults.tool_progress ?? "off"],
|
|
279
283
|
["cross_instance_visibility", "crossInstanceVisibility", VISIBILITY_MODES, visibilityDefault(defaults)],
|
|
280
284
|
["log_level", "logLevel", LOG_LEVELS, defaults.log_level || "info"]].map(([k, label, opts, dflt]) => html`<div key=${k} class="field">
|
|
281
285
|
${L(tn(label), `instance.${k}`, `ag-${k}`)}
|
|
282
286
|
<${Override} inherit=${f.inherit[k]} onInherit=${setInherit(k)}>
|
|
283
287
|
<${Select} id=${`ag-${k}`} value=${shown(k, f[k], dflt)} disabled=${f.inherit[k]} onChange=${set(k)}
|
|
284
|
-
options=${opts.includes(f[k]) || k === "cross_instance_visibility" ? opts : [f[k], ...opts]} /></${Override}>
|
|
288
|
+
options=${opts.includes(shown(k, f[k], dflt)) || k === "cross_instance_visibility" ? opts : [shown(k, f[k], dflt), ...opts]} /></${Override}>
|
|
285
289
|
${k === "cross_instance_visibility" ? html`<p class="note">${tn("crossInstanceVisibilityHint")}</p>` : null}</div>`)}
|
|
290
|
+
<fieldset class="field dash-perms"><legend>${L(tn("dashboardAccess"), "instance.dashboard")}</legend>
|
|
291
|
+
<p class="note">${tn("dashboardAccessHint")}</p>
|
|
292
|
+
${DASHBOARD_FEATURES.map((feature) => html`<div key=${feature} class="field">
|
|
293
|
+
<label for=${`ag-dash-${feature}`}>${tn(`dashboard_${feature}`)}</label>
|
|
294
|
+
<select id=${`ag-dash-${feature}`} value=${f.dashboard[feature]} onChange=${(e) => setF((x) => ({ ...x, dashboard: { ...x.dashboard, [feature]: e.target.value } }))}>
|
|
295
|
+
${DASHBOARD_CHOICES.map((c) => html`<option key=${c} value=${c}>${c === "inherit"
|
|
296
|
+
? tn("dashboardInherit", tn(dashboardDefault(defaults, feature) ? "dashboardOn" : "dashboardOff")) : tn(c === "on" ? "dashboardOn" : "dashboardOff")}</option>`)}
|
|
297
|
+
</select></div>`)}
|
|
298
|
+
</fieldset>
|
|
286
299
|
<div class="field">${L(tn("replyCompletionGuard"), "instance.reply_completion_guard")}
|
|
287
300
|
<${Override} inherit=${f.inherit.reply_completion_guard} onInherit=${setInherit("reply_completion_guard")}>
|
|
288
301
|
<label class="check"><input type="checkbox" disabled=${f.inherit.reply_completion_guard} checked=${shown("reply_completion_guard", f.reply_completion_guard, defaults.reply_completion_guard ?? true)}
|
|
@@ -406,8 +419,8 @@ export function BotDialog({ id, ctx, onClose }) {
|
|
|
406
419
|
setToken(""); setTokenId(null); setReplacing(false);
|
|
407
420
|
setTokenNote({ text: tn("tokenQueued") });
|
|
408
421
|
};
|
|
409
|
-
|
|
410
|
-
|
|
422
|
+
/** The connections with this dialog's edits, and which parts changed. */
|
|
423
|
+
const pending = () => {
|
|
411
424
|
const original = structuredClone(chs);
|
|
412
425
|
const next = structuredClone(original);
|
|
413
426
|
next[index] = { ...next[index], access: { ...(next[index].access || {}), mode, allowed_users: [...users] } };
|
|
@@ -418,6 +431,16 @@ export function BotDialog({ id, ctx, onClose }) {
|
|
|
418
431
|
if (emojis.value) options.status_emojis = emojis.value; else delete options.status_emojis;
|
|
419
432
|
next[index] = { ...next[index], options };
|
|
420
433
|
}
|
|
434
|
+
return { next, accessChanged, emojisChanged };
|
|
435
|
+
};
|
|
436
|
+
const pendingImpacts = () => {
|
|
437
|
+
if (!ch) return [];
|
|
438
|
+
const p = pending();
|
|
439
|
+
return [...(p.accessChanged ? ["fleet.channels"] : []), ...(p.emojisChanged ? ["fleet.channel.options.status_emojis"] : [])];
|
|
440
|
+
};
|
|
441
|
+
const stage = () => {
|
|
442
|
+
if (!ch) return;
|
|
443
|
+
const { next, accessChanged, emojisChanged } = pending();
|
|
421
444
|
if (accessChanged || emojisChanged) {
|
|
422
445
|
ctx.stageChannels(`connections:${ch.id || chLabel(index)}`, next, {
|
|
423
446
|
label: tn(accessChanged && emojisChanged ? "updateAccessEmojis" : accessChanged ? "updateAccess" : "updateEmojis", ch.id || chLabel(index)),
|
|
@@ -445,7 +468,7 @@ export function BotDialog({ id, ctx, onClose }) {
|
|
|
445
468
|
};
|
|
446
469
|
const L = (text, field, htmlFor) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${htmlFor} />`;
|
|
447
470
|
if (!ch) return null;
|
|
448
|
-
return html`<${EditDialog} title=${type === "telegram" ? "Telegram" : "Discord"} subtitle=${id} onClose=${onClose} onStage=${stage} impacts=${
|
|
471
|
+
return html`<${EditDialog} title=${type === "telegram" ? "Telegram" : "Discord"} subtitle=${id} onClose=${onClose} onStage=${stage} impacts=${pendingImpacts()} schema=${schema}>
|
|
449
472
|
<div class="grid2">
|
|
450
473
|
<div class="field">${L(tn("accessMode"), "fleet.channel.access.mode", "bot-mode")}<${Select} id="bot-mode" value=${mode} onChange=${setMode} options=${ACCESS_MODES} />
|
|
451
474
|
<${Feedback} warning=${accessWarn} /></div>
|
|
@@ -503,6 +526,7 @@ export function NewBotDialog({ ctx, onClose }) {
|
|
|
503
526
|
// The form's revision (#1529 review): any change to the token, platform, id or group moves it; a Verify or a plan
|
|
504
527
|
// that began before is dropped when it lands — never restoring an old token, naming it, or planning for it.
|
|
505
528
|
const rev = useRef(0);
|
|
529
|
+
// The fields keep what was typed (#2342: trimming the box would rewrite it, losing its undo); trimmed here.
|
|
506
530
|
const body = (x) => ({ platform: x.type, connection_only: true, admin_user_id: x.admin.trim(), ...(x.id.trim() ? { channel_id: x.id.trim() } : {}),
|
|
507
531
|
...(x.group.trim() ? (x.type === "discord" ? { guild_id: x.group.trim() } : { group_id: x.group.trim() }) : {}),
|
|
508
532
|
...(x.type === "discord" && x.general.trim() ? { general_channel_id: x.general.trim() } : {}) });
|
|
@@ -538,7 +562,7 @@ export function NewBotDialog({ ctx, onClose }) {
|
|
|
538
562
|
setBusy(true);
|
|
539
563
|
const p = await planFor(x);
|
|
540
564
|
if (!p) { if (lease.current()) setBusy(false); return; }
|
|
541
|
-
const handed = startOperation([{ label: tn("addBotLabel", p.channel_id), impact:
|
|
565
|
+
const handed = startOperation([{ label: tn("addBotLabel", p.channel_id), impact: newConnectionImpact(ctx.schema),
|
|
542
566
|
request: { method: "POST", url: "/api/settings/quickstart/commit",
|
|
543
567
|
body: { ...body(x), channel_id: p.channel_id, token_env: p.token_env, token_env_generated: true, token: x.token }, sensitive: true } }]);
|
|
544
568
|
if (!handed) { setErr(tn("applyBusyLocal")); setBusy(false); return; }
|
|
@@ -560,9 +584,9 @@ export function NewBotDialog({ ctx, onClose }) {
|
|
|
560
584
|
invite=${f.identity && f.identity.invite} portal=${f.identity && f.identity.portal} guilds=${f.guilds} onGuilds=${(g) => setF((x) => ({ ...x, guilds: g }))}
|
|
561
585
|
guild=${f.group} onGuild=${set("group")} channel=${f.general} onChannel=${set("general")} />`
|
|
562
586
|
: html`<div class="field"><label for="nb-group">${tn("groupIdField")}</label>
|
|
563
|
-
<input id="nb-group" type="text" value=${f.group} onInput=${(e) => set("group")(e.target.value
|
|
587
|
+
<input id="nb-group" type="text" value=${f.group} onInput=${(e) => set("group")(e.target.value)} /></div>`}
|
|
564
588
|
<div class="field"><label for="nb-user">${tn("wizardAdminUser")}</label>
|
|
565
|
-
<input id="nb-user" type="text" required=${true} inputmode="numeric" pattern=${adminUserIdPattern(f.type)} value=${f.admin} onInput=${(e) => set("admin")(e.target.value
|
|
589
|
+
<input id="nb-user" type="text" required=${true} inputmode="numeric" pattern=${adminUserIdPattern(f.type)} value=${f.admin} onInput=${(e) => set("admin")(e.target.value)} /></div>
|
|
566
590
|
<${Drawer} title=${tn("advancedSection")}>
|
|
567
591
|
<div class="field"><label for="nb-id">${tn("connectionIdOptional")}</label><input id="nb-id" type="text" placeholder=${plan ? plan.channel_id : f.type}
|
|
568
592
|
value=${f.id} onInput=${(e) => set("id")(e.target.value)} onBlur=${() => { if (f.identity && f.identity.valid) planFor(f); }} /></div>
|
|
@@ -597,9 +621,7 @@ export function ClassicDialog({ room, ctx, onClose }) {
|
|
|
597
621
|
const runtime = ctx.classicRuntime(c.instanceName);
|
|
598
622
|
const classicMode = fd.agent_mode ?? "mcp";
|
|
599
623
|
const lease = useLease("classic-dialog");
|
|
600
|
-
const
|
|
601
|
-
if (!ready) return;
|
|
602
|
-
const patch = changedFields({
|
|
624
|
+
const pending = () => changedFields({
|
|
603
625
|
backend: f.backend, model: f.model.trim() || null,
|
|
604
626
|
auto_pause_after: f.inherit.auto_pause_after ? null : Number(f.auto_pause_after),
|
|
605
627
|
tool_progress: f.inherit.tool_progress ? null : f.tool_progress,
|
|
@@ -612,13 +634,16 @@ export function ClassicDialog({ room, ctx, onClose }) {
|
|
|
612
634
|
reply_completion_guard: hasOwn(c, "reply_completion_guard") ? c.reply_completion_guard : null,
|
|
613
635
|
collab: !!c.collab, context_lines: c.context_lines ?? cd.context_lines ?? 5, web_echo: classicWebEchoEffective(c, fleet),
|
|
614
636
|
});
|
|
637
|
+
const stage = async () => {
|
|
638
|
+
if (!ready) return;
|
|
639
|
+
const patch = pending();
|
|
615
640
|
if (!Object.keys(patch).length) { onClose(); return; }
|
|
616
641
|
if (!lease.current()) return;
|
|
617
642
|
ctx.stageClassic(c, patch);
|
|
618
643
|
onClose();
|
|
619
644
|
};
|
|
620
645
|
const L = (text, field, id) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${id} />`;
|
|
621
|
-
return html`<${EditDialog} title=${c.name || c.instanceName} subtitle=${
|
|
646
|
+
return html`<${EditDialog} title=${c.name || c.instanceName} subtitle=${`${tn("idLine", c.instanceName)} · ${tn(`exec_${runtime.execution}`)}`} onClose=${onClose} onStage=${stage} ready=${ready} impacts=${Object.keys(pending()).map((k) => `classic.${k}`)} schema=${schema}>
|
|
622
647
|
<div class="grid2">
|
|
623
648
|
<div class="field">${L(tn("backend"), "classic.backend", "cl-be")}<${BackendSelect} id="cl-be" value=${f.backend} onChange=${set("backend")} /></div>
|
|
624
649
|
<div class="field">${L(tn("model"), "classic.model", "cl-model")}<${ModelSelect} id="cl-model" value=${f.model} onChange=${set("model")}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// B, nor after A again (an older A), nor once the page is gone.
|
|
10
10
|
import { html, useEffect, useRef, useState } from "/assets/app-html.js";
|
|
11
11
|
import { t } from "/assets/app-i18n.js";
|
|
12
|
+
import { useTypedText } from "/assets/text-undo.js";
|
|
12
13
|
import { api } from "./settings-confirm.js";
|
|
13
14
|
import { Select } from "./settings-dialogs.js";
|
|
14
15
|
|
|
@@ -23,6 +24,9 @@ const probe = (body) => api("/api/settings/quickstart/probe", { method: "POST",
|
|
|
23
24
|
*/
|
|
24
25
|
export function DiscordServerPicker({ idPrefix, token, bot, invite, portal, guilds, onGuilds, guild, onGuild, channel, onChannel }) {
|
|
25
26
|
const [polling, setPolling] = useState(null); // { timedOut } while waiting for the bot to join
|
|
27
|
+
// #2342: the typed IDs keep what was typed (a space, the undo history); the picks get them trimmed.
|
|
28
|
+
const [guildText, onGuildText] = useTypedText(guild);
|
|
29
|
+
const [channelText, onChannelText] = useTypedText(channel);
|
|
26
30
|
const [channels, setChannels] = useState(null); // null: not asked; { list } | { error }
|
|
27
31
|
const live = useRef(true);
|
|
28
32
|
const now = useRef({ token, guild, channel });
|
|
@@ -120,11 +124,11 @@ export function DiscordServerPicker({ idPrefix, token, bot, invite, portal, guil
|
|
|
120
124
|
<div class="field"><label for=${`${idPrefix}-guild`}>${tn("guildIdField")}</label>
|
|
121
125
|
${guilds && guilds.length
|
|
122
126
|
? html`<${Select} id=${`${idPrefix}-guild`} value=${guild} onChange=${(v) => pickGuild(v, true)} options=${["", ...guilds.map((g) => ({ value: g.id, label: `${g.name} (${g.id})` }))]} />`
|
|
123
|
-
: html`<input id=${`${idPrefix}-guild`} type="text" value=${
|
|
127
|
+
: html`<input id=${`${idPrefix}-guild`} type="text" value=${guildText} placeholder=${tn("discordNoServerYet")} onInput=${(e) => pickGuild(onGuildText(e.target.value), true)} />`}</div>
|
|
124
128
|
<div class="field"><label for=${`${idPrefix}-gen`}>${tn("wizardGeneralChannel")}</label>
|
|
125
129
|
${channels && channels.list && channels.list.length
|
|
126
130
|
? html`<${Select} id=${`${idPrefix}-gen`} value=${channel} onChange=${pickChannel} options=${["", ...channels.list.map((c) => ({ value: c.id, label: `#${c.name}` }))]} />`
|
|
127
|
-
: html`<input id=${`${idPrefix}-gen`} type="text" value=${
|
|
131
|
+
: html`<input id=${`${idPrefix}-gen`} type="text" value=${channelText} onInput=${(e) => pickChannel(onChannelText(e.target.value))} />`}
|
|
128
132
|
${channels && channels.error ? html`<p class="feedback warning">${channels.error}</p>` : null}</div>
|
|
129
133
|
</div>`;
|
|
130
134
|
}
|
|
@@ -8,6 +8,7 @@ import { t } from "/assets/app-i18n.js";
|
|
|
8
8
|
import { toast } from "/assets/ui-toast.js";
|
|
9
9
|
import { confirmDialog } from "/assets/ui-confirm.js";
|
|
10
10
|
import { api } from "./settings-confirm.js";
|
|
11
|
+
import { DEFAULT_SCHEMA, impactOf } from "./settings-model.js";
|
|
11
12
|
import "./settings-strings.js";
|
|
12
13
|
|
|
13
14
|
const tn = (k, ...v) => t(`settings.${k}`, ...v);
|
|
@@ -59,7 +60,7 @@ export function GuestsCard({ ctx, staged, disabled = false }) {
|
|
|
59
60
|
const setList = (key, k, list) => setF((x) => { const m = { ...x[key] }; if (list === undefined) delete m[k]; else m[k] = list; return { ...x, [key]: m }; });
|
|
60
61
|
const review = () => {
|
|
61
62
|
const body = guestsBody(original, f);
|
|
62
|
-
if (body) ctx.stage("guests", { label: tn("guestsTitle"), impact: "
|
|
63
|
+
if (body) ctx.stage("guests", { label: tn("guestsTitle"), impact: impactOf(ctx.schema || DEFAULT_SCHEMA, "web.guests"), request: { method: "PUT", url: "/api/settings/fleet/web", body: { guests: body } } });
|
|
63
64
|
else if (staged.has("guests")) ctx.unstage("guests");
|
|
64
65
|
setMsg(tn("readyApply"));
|
|
65
66
|
};
|
|
@@ -13,6 +13,7 @@ export const LEARN_ANCHORS = {
|
|
|
13
13
|
colors: ["identity-colours", "識別色"], css: ["custom-css-settings--web-appearance", "自訂-css設定--網頁外觀"], themes: ["agents-themes", "agent-的主題"],
|
|
14
14
|
cards: ["identity-cards", "身分卡"], limits: ["card-upload-limits", "身分卡上傳限制"], widgets: ["widgets", "小工具"], mods: ["mods", "mod"],
|
|
15
15
|
effects: ["effects", "效果"], restore: ["restore-defaults", "還原預設值"],
|
|
16
|
+
"app-icon": ["app-icon", "app-圖示"],
|
|
16
17
|
};
|
|
17
18
|
export function learnHref(topic, language = lang()) {
|
|
18
19
|
const zh = language === "zh-TW";
|
|
@@ -9,7 +9,22 @@ export const CH_TYPES = ["discord", "telegram"];
|
|
|
9
9
|
export const LOCALES = [["en", "English"], ["zh-TW", "繁體中文 (zh-TW)"]];
|
|
10
10
|
export const VISIBILITY_MODES = ["full", "summary", "hidden"];
|
|
11
11
|
export const LOG_LEVELS = ["trace", "debug", "info", "warn", "error"];
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* The tool profiles a person may choose (src/tool-permissions.ts; the validator's list). `general` is not one: AgEnD
|
|
14
|
+
* gives it to a General that sets none.
|
|
15
|
+
*/
|
|
16
|
+
export const TOOL_SETS = ["worker", "coordinator", "standard", "minimal", "full"];
|
|
17
|
+
/**
|
|
18
|
+
* The profile an agent runs under while it sets none (resolveToolSet, on the config as loaded: the defaults merged
|
|
19
|
+
* under the agent's own): the fleet default's, else `general` for a General — its own `general_topic`, else the
|
|
20
|
+
* default's (#2407 review: `defaults.general_topic: true` makes every agent without its own a General), or the instance
|
|
21
|
+
* named general — else `worker`; never `full`, which the page used to show.
|
|
22
|
+
*/
|
|
23
|
+
export function toolSetDefault(defaults, inst, name = "") {
|
|
24
|
+
if (TOOL_SETS.includes(defaults && defaults.tool_set)) return defaults.tool_set;
|
|
25
|
+
const general = hasOwn(inst, "general_topic") ? inst.general_topic === true : !!defaults && defaults.general_topic === true;
|
|
26
|
+
return general || name === "general" ? "general" : "worker";
|
|
27
|
+
}
|
|
13
28
|
export const TOOL_PROGRESS = ["off", "standard", "verbose"];
|
|
14
29
|
export const AGENT_MODES = ["mcp", "cli"];
|
|
15
30
|
export const ACCESS_MODES = ["locked", "open", "pairing"];
|
|
@@ -23,6 +38,23 @@ export function changedFields(next, baseline) {
|
|
|
23
38
|
return Object.fromEntries(Object.entries(next).filter(([key, value]) => !sameValue(value, baseline[key])));
|
|
24
39
|
}
|
|
25
40
|
|
|
41
|
+
/**
|
|
42
|
+
* The dashboard features an agent may use (dashboard-permissions.ts): each "inherit" (the fleet default: `defaults.dashboard`,
|
|
43
|
+
* else allowed), "on" or "off". The patch names only the features that changed: null follows the default again.
|
|
44
|
+
*/
|
|
45
|
+
export const DASHBOARD_FEATURES = ["appearance", "task_board", "web_settings"];
|
|
46
|
+
export const DASHBOARD_CHOICES = ["inherit", "on", "off"];
|
|
47
|
+
const dashboardOf = (v) => (v && typeof v === "object" && !Array.isArray(v) ? v : {});
|
|
48
|
+
/** What a feature is for an agent with no setting of its own: the default's, else allowed. */
|
|
49
|
+
export const dashboardDefault = (defaults, feature) => dashboardOf(defaults && defaults.dashboard)[feature] !== false;
|
|
50
|
+
export function dashboardForm(inst) {
|
|
51
|
+
const own = dashboardOf(inst.dashboard);
|
|
52
|
+
return Object.fromEntries(DASHBOARD_FEATURES.map((f) => [f, own[f] === true ? "on" : own[f] === false ? "off" : "inherit"]));
|
|
53
|
+
}
|
|
54
|
+
export function dashboardPatchValue(choices) {
|
|
55
|
+
return Object.fromEntries(DASHBOARD_FEATURES.map((f) => [f, choices[f] === "on" ? true : choices[f] === "off" ? false : null]));
|
|
56
|
+
}
|
|
57
|
+
|
|
26
58
|
/** #1302: cross-instance notices. Unset, or a value the fleet does not know, means full. */
|
|
27
59
|
export const visibilityDefault = (defaults) => (VISIBILITY_MODES.includes(defaults && defaults.cross_instance_visibility) ? defaults.cross_instance_visibility : "full");
|
|
28
60
|
|
|
@@ -56,6 +88,8 @@ export const chLabel = (i) => (i === 0 ? "primary" : "persona");
|
|
|
56
88
|
// ── Impacts: the server's (/api/settings/schema, derived from HOT_INSTANCE_CONFIG_KEYS); this page never decides one ──
|
|
57
89
|
export const DEFAULT_SCHEMA = { impacts: {}, order: ["now", "instance", "fleet"] };
|
|
58
90
|
export const impactOf = (schema, field) => (schema.impacts && schema.impacts[field]) || "instance";
|
|
91
|
+
/** #2346: a new connection starts at once while another one runs (the schema says so); the first one needs AgEnD restarted. */
|
|
92
|
+
export const newConnectionImpact = (schema) => (schema && schema.connections_start_live === true ? "now" : impactOf(schema || DEFAULT_SCHEMA, "fleet.channels"));
|
|
59
93
|
/** A batch costs as much as its worst member, in the order the server ships. */
|
|
60
94
|
export function batchImpact(schema, keys, impactFor) {
|
|
61
95
|
const order = schema.order;
|
|
@@ -97,15 +131,20 @@ export function effectiveSummary(live, config, fleetDefaults, classicDefaults) {
|
|
|
97
131
|
return { backend, model, effort };
|
|
98
132
|
}
|
|
99
133
|
|
|
100
|
-
/**
|
|
101
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Group by `groupFor(name)` — #2172: the sidebar's rule (instance-nav groupOf: its first team, else its first tag); the
|
|
136
|
+
* first tag when not given — teams first, then tags, "Other" last; within a group Running → Paused → Crashed → Stopped,
|
|
137
|
+
* then by name. `labelOf(group)` sorts by what the heading says.
|
|
138
|
+
*/
|
|
139
|
+
export function groupAgents(instances, live, filter, groupFor = (n) => groupOf(instances[n]), labelOf = (g) => g) {
|
|
102
140
|
const needle = String(filter || "").trim().toLowerCase();
|
|
103
141
|
let names = Object.keys(instances || {});
|
|
104
142
|
if (needle) names = names.filter((n) => n.toLowerCase().includes(needle) || shortName(n, instances[n]).toLowerCase().includes(needle));
|
|
105
143
|
const groups = {};
|
|
106
|
-
for (const n of names) (groups[
|
|
144
|
+
for (const n of names) (groups[groupFor(n)] ??= []).push(n);
|
|
107
145
|
const order = (n) => STATUS_ORDER[(live[n] && live[n].status) || "stopped"] ?? 9;
|
|
108
|
-
|
|
146
|
+
const team = (g) => g.charCodeAt(0) < 32; // a team's key (instance-nav TEAM_GROUP)
|
|
147
|
+
return Object.keys(groups).sort((a, b) => (a === "Other" ? 1 : b === "Other" ? -1 : team(a) !== team(b) ? (team(a) ? -1 : 1) : labelOf(a).localeCompare(labelOf(b))))
|
|
109
148
|
.map((g) => ({ group: g, names: groups[g].sort((a, b) => order(a) - order(b) || a.localeCompare(b)) }));
|
|
110
149
|
}
|
|
111
150
|
|
|
@@ -133,6 +172,7 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
133
172
|
model_failover: form.inherit.model_failover ? null : (form.model_failover.trim() ? [form.model_failover.trim()] : []),
|
|
134
173
|
display_name: form.inherit.display_name ? null : form.display_name.trim(),
|
|
135
174
|
status_emojis: form.status_emojis,
|
|
175
|
+
dashboard: dashboardPatchValue(form.dashboard),
|
|
136
176
|
};
|
|
137
177
|
return changedFields(next, {
|
|
138
178
|
backend: inst.backend || defaults.backend || "claude-code",
|
|
@@ -155,11 +195,12 @@ export function agentPatch(form, inst, defaults, visibilityBaseline, statusEmoji
|
|
|
155
195
|
model_failover: hasOwn(inst, "model_failover") ? inst.model_failover : null,
|
|
156
196
|
display_name: hasOwn(inst, "display_name") ? inst.display_name : null,
|
|
157
197
|
status_emojis: statusEmojisBaseline,
|
|
198
|
+
dashboard: dashboardPatchValue(dashboardForm(inst)),
|
|
158
199
|
});
|
|
159
200
|
}
|
|
160
201
|
|
|
161
202
|
/** The agent form's starting values (an override shows the inherited value while "inherit" is on). */
|
|
162
|
-
export function agentForm(inst, defaults) {
|
|
203
|
+
export function agentForm(inst, defaults, name = "") {
|
|
163
204
|
const hang = inst.hang_detector || {};
|
|
164
205
|
const inherit = (key) => !hasOwn(inst, key);
|
|
165
206
|
return {
|
|
@@ -170,7 +211,9 @@ export function agentForm(inst, defaults) {
|
|
|
170
211
|
auto_pause_after: String(inst.auto_pause_after ?? defaults.auto_pause_after ?? 0),
|
|
171
212
|
hang: String(hang.timeout_minutes ?? (defaults.hang_detector && defaults.hang_detector.timeout_minutes) ?? HANG_TIMEOUT_DEFAULT_MINUTES),
|
|
172
213
|
agent_mode: inst.agent_mode || defaults.agent_mode || "mcp",
|
|
173
|
-
|
|
214
|
+
// What the picker offers when the agent sets its own: a profile a person may choose (a General's inherited
|
|
215
|
+
// `general` is shown while inheriting, but not offered to write back).
|
|
216
|
+
tool_set: TOOL_SETS.includes(inst.tool_set) ? inst.tool_set : TOOL_SETS.includes(toolSetDefault(defaults, inst, name)) ? toolSetDefault(defaults, inst, name) : "worker",
|
|
174
217
|
tool_progress: inst.tool_progress ?? defaults.tool_progress ?? "off",
|
|
175
218
|
// #1302: a value the fleet does not know (a typo) is read as unset — the picker shows "full", as the old page did,
|
|
176
219
|
// and the baseline is that same "full", so an unrelated edit never writes the typo back (the server refuses it).
|
|
@@ -183,6 +226,7 @@ export function agentForm(inst, defaults) {
|
|
|
183
226
|
model_failover: Array.isArray(inst.model_failover) ? (inst.model_failover[0] || "") : ((defaults.model_failover && defaults.model_failover[0]) || ""),
|
|
184
227
|
display_name: inst.display_name ?? defaults.display_name ?? "",
|
|
185
228
|
status_emojis: inst.status_emojis || null,
|
|
229
|
+
dashboard: dashboardForm(inst),
|
|
186
230
|
inherit: {
|
|
187
231
|
auto_pause_after: inherit("auto_pause_after"), hang: !hasOwn(hang, "timeout_minutes"), agent_mode: inherit("agent_mode"),
|
|
188
232
|
tool_set: inherit("tool_set"), tool_progress: inherit("tool_progress"), cross_instance_visibility: inherit("cross_instance_visibility"),
|
|
@@ -192,17 +236,6 @@ export function agentForm(inst, defaults) {
|
|
|
192
236
|
};
|
|
193
237
|
}
|
|
194
238
|
|
|
195
|
-
/** Every field the agent dialog shows, for its footer's impact summary. */
|
|
196
|
-
export const AGENT_FIELDS = [
|
|
197
|
-
"instance.display_name", "instance.description", "instance.backend", "instance.model", "instance.working_directory",
|
|
198
|
-
"instance.auto_pause_after", "instance.topic_id", "instance.hang_detector", "instance.agent_mode", "instance.tool_set",
|
|
199
|
-
"instance.tool_progress", "instance.cross_instance_visibility", "instance.reply_completion_guard", "instance.log_level",
|
|
200
|
-
"instance.lightweight", "instance.model_failover", "instance.systemPrompt", "instance.tags", "instance.general_topic",
|
|
201
|
-
"instance.status_emojis",
|
|
202
|
-
];
|
|
203
|
-
export const CLASSIC_FIELDS = ["classic.backend", "classic.model", "classic.auto_pause_after", "classic.tool_progress",
|
|
204
|
-
"classic.reply_completion_guard", "classic.collab", "classic.context_lines", "classic.web_echo"];
|
|
205
|
-
export const BOT_FIELDS = ["fleet.channel.access.mode", "fleet.channel.access.allowed_users", "fleet.channels", "fleet.channel.options.status_emojis"];
|
|
206
239
|
|
|
207
240
|
/** Validation messages (keys of the settings namespace), or "" when the value is fine. */
|
|
208
241
|
export const nonNegative = (v) => (!Number.isFinite(Number(v)) || String(v).trim() === "" || Number(v) < 0 ? "mustNonNegative" : "");
|
package/dist/ui/settings-mods.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// parts the person ticks are applied, all or nothing. Custom CSS from a file is never ticked by default. Installed
|
|
5
5
|
// mods can be downloaded again or uninstalled (what they applied stays: Reset and the CSS controls work on it).
|
|
6
6
|
// Export builds a file from what is in force now.
|
|
7
|
+
import { canvasWorkerEnabled, useCanvasWorker } from "/assets/feature-flags.js";
|
|
7
8
|
import { html, useEffect, useLayoutEffect, useRef, useState } from "/assets/app-html.js";
|
|
8
9
|
import { t } from "/assets/app-i18n.js";
|
|
9
10
|
import { appStore, useStore } from "/assets/app-store.js";
|
|
@@ -36,6 +37,8 @@ function download(text, name) {
|
|
|
36
37
|
function why(body) {
|
|
37
38
|
if (!body) return tn("modFailed", "?");
|
|
38
39
|
if (Array.isArray(body.problems) && body.problems.length) return body.problems.slice(0, 5).map((p) => `${p.path || "file"}: ${p.problem}`).join("\n");
|
|
40
|
+
// #2390: a refusal the page has words for, in its language (the host's detail is English).
|
|
41
|
+
if (body.error === "canvas_worker_experimental") return tn("modCanvasWorkerOff");
|
|
39
42
|
return tn("modFailed", body.detail ? `${body.error}: ${body.detail}` : body.error || "?");
|
|
40
43
|
}
|
|
41
44
|
|
|
@@ -45,7 +48,7 @@ export function defaultChoice(plan) {
|
|
|
45
48
|
for (const it of plan.items) {
|
|
46
49
|
if (it.part === "theme" || it.part === "identity" || it.part === "ambient") c[it.part] = true;
|
|
47
50
|
else if (it.part === "widget") c.widgets[it.slot] = true;
|
|
48
|
-
else if (it.part === "effect") c.effects = true;
|
|
51
|
+
else if (it.part === "effect" && canvasWorkerEnabled()) c.effects = true;
|
|
49
52
|
// ownerCss stays false: "read it before turning it on" (r4 §4).
|
|
50
53
|
}
|
|
51
54
|
return c;
|
|
@@ -80,7 +83,7 @@ export function ThemeDetail({ theme, pictures, effects }) {
|
|
|
80
83
|
${th.background ? pic(th.background.image, tn("modBackground")) : null}
|
|
81
84
|
${th.background ? row(tn("modBackgroundFit"), `${th.background.fit} · ${Math.round(th.background.opacity * 100)}%`) : null}
|
|
82
85
|
${th.avatar ? pic(th.avatar, tn("modAvatar")) : null}
|
|
83
|
-
${(effects || []).map((e, i) => html`<div key=${i}>${row(tn("modPlacesEffect"), html`<span><code>${e.effect}</code>${e.id ? html` <span class="muted">${e.id.slice(0, 8)}</span>` : null}${Object.keys(e.params || {}).length ? html` · <code>${JSON.stringify(e.params)}</code>` : null}</span>`)}</div>`)}
|
|
86
|
+
${(canvasWorkerEnabled() ? effects || [] : []).map((e, i) => html`<div key=${i}>${row(tn("modPlacesEffect"), html`<span><code>${e.effect}</code>${e.id ? html` <span class="muted">${e.id.slice(0, 8)}</span>` : null}${Object.keys(e.params || {}).length ? html` · <code>${JSON.stringify(e.params)}</code>` : null}</span>`)}</div>`)}
|
|
84
87
|
<details class="s-mod-raw"><summary>${tn("modAllFields")}</summary><pre class="s-mod-css-text">${JSON.stringify(th, null, 2)}</pre></details>
|
|
85
88
|
</div>`;
|
|
86
89
|
}
|
|
@@ -114,6 +117,7 @@ function PlanItem({ it, choice, setChoice, binds, fleet }) {
|
|
|
114
117
|
<details class="s-mod-raw"><summary>${tn("modAllFields")}</summary><pre class="s-mod-css-text">${JSON.stringify({ loop: it.loop, click: it.click }, null, 2)}</pre></details></div></li>`;
|
|
115
118
|
}
|
|
116
119
|
if (it.part === "effect") {
|
|
120
|
+
if (!canvasWorkerEnabled()) return null;
|
|
117
121
|
return html`<li class="s-mod-item">${tick(tn("modPartEffect", it.title), choice.effects, (v) => setChoice({ ...choice, effects: v }))}
|
|
118
122
|
<div class="s-mod-detail"><span>${kib(it.bytes)} · ${tn("modRegions", it.regions.join(", "))}</span>${it.wants.length ? html`<span>${tn("modWants", it.wants.join(", "))}</span>` : null}</div></li>`;
|
|
119
123
|
}
|
|
@@ -137,7 +141,7 @@ function Plan({ staged, onDone }) {
|
|
|
137
141
|
const names = (app.instances || []).map((i) => i.name);
|
|
138
142
|
const install = async () => {
|
|
139
143
|
setBusy(true); setError("");
|
|
140
|
-
const r = await postJson("/ui/mods/commit", { stage: staged.stage, plan_hash: staged.plan_hash, include: choice, ...(toInstance ? { target } : {}) });
|
|
144
|
+
const r = await postJson("/ui/mods/commit", { stage: staged.stage, plan_hash: staged.plan_hash, include: { ...choice, effects: canvasWorkerEnabled() && choice.effects }, ...(toInstance ? { target } : {}) });
|
|
141
145
|
setBusy(false);
|
|
142
146
|
// The stage this plan shows is gone or no longer this plan (replaced on another device, expired): read again —
|
|
143
147
|
// the page then shows whatever is staged now, with its own, fresh choices (keyed by stage).
|
|
@@ -205,6 +209,7 @@ function ExportForm() {
|
|
|
205
209
|
}
|
|
206
210
|
|
|
207
211
|
export function ModsCard() {
|
|
212
|
+
useCanvasWorker();
|
|
208
213
|
const [state, setState] = useState(null);
|
|
209
214
|
const [busy, setBusy] = useState(false);
|
|
210
215
|
const [error, setError] = useState("");
|
|
@@ -3,7 +3,7 @@ import { html, useEffect, useRef, useState } from "/assets/app-html.js";
|
|
|
3
3
|
import { register, t } from "/assets/app-i18n.js";
|
|
4
4
|
import { useStore } from "/assets/app-store.js";
|
|
5
5
|
import { OWNER_EFFECT_PREF_KEYS } from "/assets/app-prefs.js";
|
|
6
|
-
import { getAppEffects } from "./
|
|
6
|
+
import { getAppEffects, wakeEffects } from "./effects-waker.js";
|
|
7
7
|
import { ownerEffectsStore, watchOwnerEffects, refreshOwnerEffects, saveOwnerEffects } from "/assets/owner-effect-prefs.js";
|
|
8
8
|
register("ownerEffects", {
|
|
9
9
|
en: {
|
|
@@ -38,9 +38,11 @@ export function OwnerEffects({ catalog, busy = false }) {
|
|
|
38
38
|
const state = useStore(ownerEffectsStore), [message, setMessage] = useState(null), life = useRef({ alive: false, seq: 0 }), [runtime, setRuntime] = useState(null);
|
|
39
39
|
useEffect(() => { life.current.alive = true; const stop = watchOwnerEffects(); return () => { life.current.alive = false; life.current.seq++; stop(); }; }, []);
|
|
40
40
|
useEffect(() => {
|
|
41
|
-
|
|
41
|
+
// #2193: managing personal effects needs the runtime's view of them: it is woken here (it may still be asleep).
|
|
42
|
+
let live = true, entry = getAppEffects(), off = null, end = null;
|
|
42
43
|
const pull = () => { if (!live) return; const gates = entry?.gates(); setRuntime({ entry, snapshot: entry?.api?.ownerSnapshot?.(), cursor: entry?.cursorSnapshot?.(), available: !!entry && !entry.dead && gates.enabled && gates.show && gates.transportReady && !gates.safe && !gates.publicLink && !gates.reducedMotion }); };
|
|
43
|
-
const off = entry?.subscribe(pull)
|
|
44
|
+
const bind = () => { off = entry?.subscribe(pull) ?? null; end = entry?.onEnd(pull) ?? null; pull(); };
|
|
45
|
+
if (entry) bind(); else { pull(); void wakeEffects().then(() => { if (!live) return; entry = getAppEffects(); bind(); }); }
|
|
44
46
|
return () => { live = false; off?.(); end?.(); };
|
|
45
47
|
}, []);
|
|
46
48
|
const reload = () => { getAppEffects()?.api?.changedOwner?.(); return refreshOwnerEffects(); };
|
|
@@ -54,7 +56,7 @@ export function OwnerEffects({ catalog, busy = false }) {
|
|
|
54
56
|
const seq = ++life.current.seq; setMessage(null);
|
|
55
57
|
const result = await saveOwnerEffects({ [key]: id });
|
|
56
58
|
if (!life.current.alive || seq !== life.current.seq) return;
|
|
57
|
-
if (result.ok || result.saved) getAppEffects()?.api?.changedOwner?.();
|
|
59
|
+
if (result.ok || result.saved) getAppEffects()?.api?.changedOwner?.(); // #2193: asleep, the saved slot wakes it (app-prefs)
|
|
58
60
|
setMessage(text(result.ok ? "saved" : result.saved ? "savedRefresh" : "failed"));
|
|
59
61
|
};
|
|
60
62
|
return html`<section class="s-fx-owner" aria-label=${text(state.scope === "operator" ? "operatorTitle" : "title")}><h4>${text(state.scope === "operator" ? "operatorTitle" : "title")}</h4><p class="sub">${text(state.scope === "operator" ? "operator" : "person")}</p>
|