create-principles-disciple 1.146.4 → 1.146.6
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/_release/product-identity.json +1 -1
- package/package.json +3 -3
- package/release-manager/package.json +3 -3
- package/console/dist/ui/App.d.ts +0 -1
- package/console/dist/ui/App.js +0 -172
- package/console/dist/ui/api.d.ts +0 -611
- package/console/dist/ui/api.js +0 -1094
- package/console/dist/ui/components/auth/login-form.d.ts +0 -4
- package/console/dist/ui/components/auth/login-form.js +0 -142
- package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
- package/console/dist/ui/components/auth/splash-screen.js +0 -22
- package/console/dist/ui/components/error-boundary.d.ts +0 -15
- package/console/dist/ui/components/error-boundary.js +0 -30
- package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
- package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
- package/console/dist/ui/components/language-switcher.d.ts +0 -2
- package/console/dist/ui/components/language-switcher.js +0 -17
- package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
- package/console/dist/ui/components/layout/app-sidebar.js +0 -128
- package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
- package/console/dist/ui/components/layout/page-loading.js +0 -14
- package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
- package/console/dist/ui/components/layout/page-shell.js +0 -11
- package/console/dist/ui/components/layout/section-title.d.ts +0 -10
- package/console/dist/ui/components/layout/section-title.js +0 -9
- package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
- package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
- package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
- package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
- package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
- package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
- package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
- package/console/dist/ui/components/notifications/sound-storage.js +0 -37
- package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
- package/console/dist/ui/components/notifications/useNotifications.js +0 -9
- package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
- package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
- package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
- package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
- package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
- package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
- package/console/dist/ui/components/theme-provider.d.ts +0 -14
- package/console/dist/ui/components/theme-provider.js +0 -40
- package/console/dist/ui/components/theme-toggle.d.ts +0 -2
- package/console/dist/ui/components/theme-toggle.js +0 -11
- package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
- package/console/dist/ui/components/ui/alert-dialog.js +0 -26
- package/console/dist/ui/components/ui/badge.d.ts +0 -9
- package/console/dist/ui/components/ui/badge.js +0 -22
- package/console/dist/ui/components/ui/button.d.ts +0 -11
- package/console/dist/ui/components/ui/button.js +0 -34
- package/console/dist/ui/components/ui/card.d.ts +0 -8
- package/console/dist/ui/components/ui/card.js +0 -16
- package/console/dist/ui/components/ui/charts.d.ts +0 -51
- package/console/dist/ui/components/ui/charts.js +0 -72
- package/console/dist/ui/components/ui/dialog.d.ts +0 -19
- package/console/dist/ui/components/ui/dialog.js +0 -22
- package/console/dist/ui/components/ui/input.d.ts +0 -3
- package/console/dist/ui/components/ui/input.js +0 -8
- package/console/dist/ui/components/ui/markdown.d.ts +0 -24
- package/console/dist/ui/components/ui/markdown.js +0 -119
- package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
- package/console/dist/ui/components/ui/progress-bar.js +0 -38
- package/console/dist/ui/components/ui/select.d.ts +0 -13
- package/console/dist/ui/components/ui/select.js +0 -26
- package/console/dist/ui/components/ui/separator.d.ts +0 -3
- package/console/dist/ui/components/ui/separator.js +0 -6
- package/console/dist/ui/components/ui/sheet.d.ts +0 -25
- package/console/dist/ui/components/ui/sheet.js +0 -37
- package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
- package/console/dist/ui/components/ui/shiny-text.js +0 -46
- package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
- package/console/dist/ui/components/ui/skeleton.js +0 -6
- package/console/dist/ui/components/ui/sonner.d.ts +0 -3
- package/console/dist/ui/components/ui/sonner.js +0 -13
- package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
- package/console/dist/ui/components/ui/tooltip.js +0 -10
- package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
- package/console/dist/ui/data/daily-thoughts.js +0 -164
- package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
- package/console/dist/ui/hooks/useNotificationSound.js +0 -74
- package/console/dist/ui/i18n/en.json +0 -2399
- package/console/dist/ui/i18n/index.d.ts +0 -2
- package/console/dist/ui/i18n/index.js +0 -32
- package/console/dist/ui/i18n/zh-CN.json +0 -2399
- package/console/dist/ui/main.d.ts +0 -1
- package/console/dist/ui/main.js +0 -9
- package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
- package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
- package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
- package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
- package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
- package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
- package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
- package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
- package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
- package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
- package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
- package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
- package/console/dist/ui/pages/debt/DebtPage.js +0 -222
- package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
- package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
- package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
- package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
- package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
- package/console/dist/ui/pages/focus/FocusPage.js +0 -567
- package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
- package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
- package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
- package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
- package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
- package/console/dist/ui/pages/focus/focus-validation.js +0 -211
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
- package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
- package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
- package/console/dist/ui/pages/intent/IntentPage.js +0 -252
- package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
- package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
- package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
- package/console/dist/ui/pages/pain/PainPage.js +0 -420
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
- package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
- package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
- package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
- package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
- package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
- package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
- package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
- package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
- package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
- package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
- package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
- package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
- package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
- package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
- package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
- package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
- package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
- package/console/dist/ui/utils/agent-metadata.js +0 -284
- package/console/dist/ui/utils/approval-review.d.ts +0 -30
- package/console/dist/ui/utils/approval-review.js +0 -50
- package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
- package/console/dist/ui/utils/approval-warning-localization.js +0 -148
- package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
- package/console/dist/ui/utils/attention-presentation.js +0 -46
- package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
- package/console/dist/ui/utils/blocker-localization.js +0 -36
- package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
- package/console/dist/ui/utils/control-center-helpers.js +0 -189
- package/console/dist/ui/utils/enum-labels.d.ts +0 -50
- package/console/dist/ui/utils/enum-labels.js +0 -171
- package/console/dist/ui/utils/format-date.d.ts +0 -11
- package/console/dist/ui/utils/format-date.js +0 -17
- package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
- package/console/dist/ui/utils/onboarding-state.js +0 -77
- package/console/dist/ui/utils/reading-layout.d.ts +0 -20
- package/console/dist/ui/utils/reading-layout.js +0 -46
- package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
- package/console/dist/ui/utils/rule-binding-validators.js +0 -188
- package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
- package/console/dist/ui/utils/runtime-mode.js +0 -11
- package/console/dist/ui/utils/token-storage.d.ts +0 -22
- package/console/dist/ui/utils/token-storage.js +0 -47
- package/console/dist/ui/utils/validators.d.ts +0 -1178
- package/console/dist/ui/utils/validators.js +0 -3297
- package/release-manager/dist/bootstrap-entry.d.ts +0 -2
- package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
- package/release-manager/dist/bootstrap-entry.js.map +0 -1
- package/release-manager/dist/i18n.d.ts +0 -6
- package/release-manager/dist/i18n.d.ts.map +0 -1
- package/release-manager/dist/i18n.js.map +0 -1
- package/release-manager/dist/index.d.ts +0 -7
- package/release-manager/dist/index.d.ts.map +0 -1
- package/release-manager/dist/index.js +0 -656
- package/release-manager/dist/index.js.map +0 -1
- package/release-manager/dist/installer.d.ts +0 -629
- package/release-manager/dist/installer.d.ts.map +0 -1
- package/release-manager/dist/installer.js.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
- package/release-manager/dist/installers/index.d.ts +0 -51
- package/release-manager/dist/installers/index.d.ts.map +0 -1
- package/release-manager/dist/installers/index.js.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
- package/release-manager/dist/mvp-config.d.ts +0 -233
- package/release-manager/dist/mvp-config.d.ts.map +0 -1
- package/release-manager/dist/mvp-config.js.map +0 -1
- package/release-manager/dist/prompts.d.ts +0 -43
- package/release-manager/dist/prompts.d.ts.map +0 -1
- package/release-manager/dist/prompts.js +0 -268
- package/release-manager/dist/prompts.js.map +0 -1
- package/release-manager/dist/skill-language.d.ts +0 -32
- package/release-manager/dist/skill-language.d.ts.map +0 -1
- package/release-manager/dist/skill-language.js.map +0 -1
- package/release-manager/dist/uninstaller.d.ts +0 -68
- package/release-manager/dist/uninstaller.d.ts.map +0 -1
- package/release-manager/dist/uninstaller.js +0 -746
- package/release-manager/dist/uninstaller.js.map +0 -1
- package/release-manager/dist/update/apply-payload.d.ts +0 -143
- package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
- package/release-manager/dist/update/apply-payload.js.map +0 -1
- package/release-manager/dist/update/atomic-file.d.ts +0 -35
- package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
- package/release-manager/dist/update/atomic-file.js.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
- package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
- package/release-manager/dist/update/channel-metadata.d.ts +0 -28
- package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/channel-metadata.js.map +0 -1
- package/release-manager/dist/update/channel-promotion.d.ts +0 -39
- package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
- package/release-manager/dist/update/channel-promotion.js +0 -55
- package/release-manager/dist/update/channel-promotion.js.map +0 -1
- package/release-manager/dist/update/console-surface.d.ts +0 -19
- package/release-manager/dist/update/console-surface.d.ts.map +0 -1
- package/release-manager/dist/update/console-surface.js.map +0 -1
- package/release-manager/dist/update/data-compatibility.d.ts +0 -35
- package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
- package/release-manager/dist/update/data-compatibility.js +0 -45
- package/release-manager/dist/update/data-compatibility.js.map +0 -1
- package/release-manager/dist/update/install-layout.d.ts +0 -105
- package/release-manager/dist/update/install-layout.d.ts.map +0 -1
- package/release-manager/dist/update/install-layout.js.map +0 -1
- package/release-manager/dist/update/product-identity.d.ts +0 -70
- package/release-manager/dist/update/product-identity.d.ts.map +0 -1
- package/release-manager/dist/update/product-identity.js.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
- package/release-manager/dist/update/release-identity.d.ts +0 -33
- package/release-manager/dist/update/release-identity.d.ts.map +0 -1
- package/release-manager/dist/update/release-identity.js.map +0 -1
- package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
- package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager-authority.js.map +0 -1
- package/release-manager/dist/update/release-manager.d.ts +0 -156
- package/release-manager/dist/update/release-manager.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager.js.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
- package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.js +0 -478
- package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
- package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
- package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-source.js.map +0 -1
- package/release-manager/dist/update/release-metadata.d.ts +0 -60
- package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata.js.map +0 -1
- package/release-manager/dist/update/release-policy.d.ts +0 -51
- package/release-manager/dist/update/release-policy.d.ts.map +0 -1
- package/release-manager/dist/update/release-policy.js.map +0 -1
- package/release-manager/dist/update/rollback-policy.d.ts +0 -56
- package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
- package/release-manager/dist/update/rollback-policy.js +0 -61
- package/release-manager/dist/update/rollback-policy.js.map +0 -1
- package/release-manager/dist/update/transaction-journal.d.ts +0 -212
- package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
- package/release-manager/dist/update/transaction-journal.js.map +0 -1
- package/release-manager/dist/update/trust-metadata.d.ts +0 -55
- package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/trust-metadata.js.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
- package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
- package/release-manager/dist/update/update-history.d.ts +0 -46
- package/release-manager/dist/update/update-history.d.ts.map +0 -1
- package/release-manager/dist/update/update-history.js +0 -123
- package/release-manager/dist/update/update-history.js.map +0 -1
- package/release-manager/dist/utils/config-file-io.d.ts +0 -34
- package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
- package/release-manager/dist/utils/config-file-io.js.map +0 -1
- package/release-manager/dist/utils/env.d.ts +0 -94
- package/release-manager/dist/utils/env.d.ts.map +0 -1
- package/release-manager/dist/utils/env.js.map +0 -1
- package/release-manager/dist/utils/logger.d.ts +0 -15
- package/release-manager/dist/utils/logger.d.ts.map +0 -1
- package/release-manager/dist/utils/logger.js.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.js.map +0 -1
|
@@ -1,457 +0,0 @@
|
|
|
1
|
-
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useCallback } from "react";
|
|
3
|
-
import { useTranslation } from "react-i18next";
|
|
4
|
-
import { toast } from "sonner";
|
|
5
|
-
import { useNotifications } from "../../components/notifications/useNotifications.js";
|
|
6
|
-
import { cn } from "../../../lib/utils.js";
|
|
7
|
-
import { PageShell } from "../../components/layout/page-shell.js";
|
|
8
|
-
import { PageLoading } from "../../components/layout/page-loading.js";
|
|
9
|
-
import { SectionTitle } from "../../components/layout/section-title.js";
|
|
10
|
-
import { getToken, setToken, clearToken, fetchWorkspaces, addWorkspace, removeWorkspace, syncWorkspace, fetchOutputLanguage, updateOutputLanguage, fetchConfigSummary, patchFeatureFlag, fetchOwnerIdentity, registerOwnerIdentity, unregisterOwnerIdentity, } from "../../api.js";
|
|
11
|
-
import { resetOnboardingState } from "../../utils/onboarding-state.js";
|
|
12
|
-
// ── Runtime validators (H section / ERR-001/005/009/013) ─────────────────────
|
|
13
|
-
/** Type guard: is this a non-null object with own properties (not inherited)? */
|
|
14
|
-
function isRecord(value) {
|
|
15
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
-
}
|
|
17
|
-
export function validateWorkspaceEntry(raw) {
|
|
18
|
-
if (!isRecord(raw))
|
|
19
|
-
return null;
|
|
20
|
-
if (!Object.hasOwn(raw, "name") ||
|
|
21
|
-
!Object.hasOwn(raw, "path") ||
|
|
22
|
-
!Object.hasOwn(raw, "lastSync")) {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
const name = raw.name;
|
|
26
|
-
const path = raw.path;
|
|
27
|
-
const lastSync = raw.lastSync;
|
|
28
|
-
if (typeof name !== "string" ||
|
|
29
|
-
name.length === 0 ||
|
|
30
|
-
typeof path !== "string" ||
|
|
31
|
-
path.length === 0) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
if (lastSync !== null && typeof lastSync !== "string") {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
// Validate optional config field
|
|
38
|
-
let config = null;
|
|
39
|
-
if (Object.hasOwn(raw, "config") && raw.config !== null) {
|
|
40
|
-
if (!isRecord(raw.config))
|
|
41
|
-
return null;
|
|
42
|
-
const cfg = raw.config;
|
|
43
|
-
if (!Object.hasOwn(cfg, "workspaceName") ||
|
|
44
|
-
!Object.hasOwn(cfg, "enabled") ||
|
|
45
|
-
!Object.hasOwn(cfg, "syncEnabled")) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
if (typeof cfg.workspaceName !== "string" ||
|
|
49
|
-
typeof cfg.enabled !== "boolean" ||
|
|
50
|
-
typeof cfg.syncEnabled !== "boolean") {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
const displayName = Object.hasOwn(cfg, "displayName") && typeof cfg.displayName === "string"
|
|
54
|
-
? cfg.displayName
|
|
55
|
-
: null;
|
|
56
|
-
config = {
|
|
57
|
-
workspaceName: cfg.workspaceName,
|
|
58
|
-
enabled: cfg.enabled,
|
|
59
|
-
displayName,
|
|
60
|
-
syncEnabled: cfg.syncEnabled,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
return { name, path, lastSync, config };
|
|
64
|
-
}
|
|
65
|
-
export function validateWorkspaceArray(raw) {
|
|
66
|
-
if (!Array.isArray(raw))
|
|
67
|
-
return null;
|
|
68
|
-
const entries = [];
|
|
69
|
-
for (const item of raw) {
|
|
70
|
-
const validated = validateWorkspaceEntry(item);
|
|
71
|
-
if (validated === null)
|
|
72
|
-
return null; // ERR-009: fail loud on invalid element
|
|
73
|
-
entries.push(validated);
|
|
74
|
-
}
|
|
75
|
-
return entries;
|
|
76
|
-
}
|
|
77
|
-
function getCompanionBridge() {
|
|
78
|
-
if (typeof window === "undefined")
|
|
79
|
-
return undefined;
|
|
80
|
-
const candidate = window.pdCompanion;
|
|
81
|
-
return candidate;
|
|
82
|
-
}
|
|
83
|
-
export function SettingsPage() {
|
|
84
|
-
const { t } = useTranslation();
|
|
85
|
-
const { soundEnabled, setSoundEnabled } = useNotifications();
|
|
86
|
-
const [loadingState, setLoadingState] = useState("loading");
|
|
87
|
-
const [errorMessage, setErrorMessage] = useState(null);
|
|
88
|
-
// Auth token state
|
|
89
|
-
const [tokenInput, setTokenInput] = useState("");
|
|
90
|
-
// Inline confirm for credential clearing (J.1 pattern, same as workspace removal)
|
|
91
|
-
const [confirmClearToken, setConfirmClearToken] = useState(false);
|
|
92
|
-
// ADR-0022 (PRI-578): Owner identity registration state
|
|
93
|
-
const [ownerIdentity, setOwnerIdentity] = useState(null);
|
|
94
|
-
const [ownerIdInput, setOwnerIdInput] = useState("");
|
|
95
|
-
const [credentialIdInput, setCredentialIdInput] = useState("");
|
|
96
|
-
const [ownerActionPending, setOwnerActionPending] = useState(false);
|
|
97
|
-
// Workspace state
|
|
98
|
-
const [workspaces, setWorkspaces] = useState([]);
|
|
99
|
-
const [addName, setAddName] = useState("");
|
|
100
|
-
const [addPath, setAddPath] = useState("");
|
|
101
|
-
// PRI-332: Principle output language state
|
|
102
|
-
const [outputLanguage, setOutputLanguage] = useState("zh-CN");
|
|
103
|
-
// spec 2026-06-30 §12.5: new_user_onboarding feature flag toggle state.
|
|
104
|
-
// null = loading/unknown (button disabled); true/false = persisted state.
|
|
105
|
-
const [onboardingFlagEnabled, setOnboardingFlagEnabled] = useState(null);
|
|
106
|
-
// PRI-720: prompt_full_pipeline feature flag toggle state (Owner switch for
|
|
107
|
-
// forcing prompt/defer_archive chains through the full legacy pipeline).
|
|
108
|
-
// null = loading/unknown (button disabled); true/false = persisted state.
|
|
109
|
-
const [fullPipelineFlagEnabled, setFullPipelineFlagEnabled] = useState(null);
|
|
110
|
-
// Inline confirm for remove (J.1 pattern)
|
|
111
|
-
const [confirmRemove, setConfirmRemove] = useState(null);
|
|
112
|
-
// ── Load data on mount ──────────────────────────────────────────────────
|
|
113
|
-
const loadData = useCallback(async () => {
|
|
114
|
-
setLoadingState("loading");
|
|
115
|
-
setErrorMessage(null);
|
|
116
|
-
// Load current token
|
|
117
|
-
const storedToken = getToken();
|
|
118
|
-
setTokenInput(storedToken ?? "");
|
|
119
|
-
// Load workspaces
|
|
120
|
-
const result = await fetchWorkspaces();
|
|
121
|
-
if (!result.success) {
|
|
122
|
-
setLoadingState("error");
|
|
123
|
-
setErrorMessage(result.error ?? "Unknown error");
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const validated = validateWorkspaceArray(result.data);
|
|
127
|
-
if (validated === null) {
|
|
128
|
-
setLoadingState("error");
|
|
129
|
-
setErrorMessage("Workspace data has unexpected shape");
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
setWorkspaces(validated);
|
|
133
|
-
// PRI-332: Load output language preference
|
|
134
|
-
const langResult = await fetchOutputLanguage();
|
|
135
|
-
if (langResult.success && langResult.data) {
|
|
136
|
-
const lang = langResult.data.outputLanguage;
|
|
137
|
-
if (lang === "zh-CN" || lang === "en") {
|
|
138
|
-
setOutputLanguage(lang);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
// Non-fatal: if language load fails, keep default zh-CN
|
|
142
|
-
// ADR-0022 (PRI-578): Load owner identity status
|
|
143
|
-
const ownerResult = await fetchOwnerIdentity();
|
|
144
|
-
if (ownerResult.success && ownerResult.data) {
|
|
145
|
-
setOwnerIdentity(ownerResult.data);
|
|
146
|
-
}
|
|
147
|
-
// Non-fatal: failures keep the section collapsed to its loading state
|
|
148
|
-
setLoadingState("loaded");
|
|
149
|
-
}, []);
|
|
150
|
-
useEffect(() => {
|
|
151
|
-
loadData();
|
|
152
|
-
}, [loadData]);
|
|
153
|
-
// spec 2026-06-30 §12.5: load new_user_onboarding flag state from config summary.
|
|
154
|
-
// Non-blocking — failures keep the toggle disabled (null) and surface a toast
|
|
155
|
-
// (rc-9: no silent fallback). The flag list comes from GET /api/v1/config/summary
|
|
156
|
-
// because there is no dedicated GET /features list endpoint.
|
|
157
|
-
const loadOnboardingFlag = useCallback(async () => {
|
|
158
|
-
setOnboardingFlagEnabled(null);
|
|
159
|
-
const result = await fetchConfigSummary();
|
|
160
|
-
if (!result.success || !result.data) {
|
|
161
|
-
toast.error(t("components.onboardingFlag.loadFailed"));
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const flag = result.data.features.find((f) => f.id === "new_user_onboarding");
|
|
165
|
-
if (!flag) {
|
|
166
|
-
toast.error(t("components.onboardingFlag.loadFailed"));
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
setOnboardingFlagEnabled(flag.enabled);
|
|
170
|
-
}, [t]);
|
|
171
|
-
useEffect(() => { void loadOnboardingFlag(); }, [loadOnboardingFlag]);
|
|
172
|
-
// PRI-720: load prompt_full_pipeline flag state from config summary.
|
|
173
|
-
// Same contract as the onboarding toggle (rc-9: failures keep the toggle
|
|
174
|
-
// disabled and surface a toast — no silent fallback).
|
|
175
|
-
const loadFullPipelineFlag = useCallback(async () => {
|
|
176
|
-
setFullPipelineFlagEnabled(null);
|
|
177
|
-
const result = await fetchConfigSummary();
|
|
178
|
-
if (!result.success || !result.data) {
|
|
179
|
-
toast.error(t("components.fullPipelineFlag.loadFailed"));
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
const flag = result.data.features.find((f) => f.id === "prompt_full_pipeline");
|
|
183
|
-
if (!flag) {
|
|
184
|
-
toast.error(t("components.fullPipelineFlag.loadFailed"));
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
setFullPipelineFlagEnabled(flag.enabled);
|
|
188
|
-
}, [t]);
|
|
189
|
-
useEffect(() => { void loadFullPipelineFlag(); }, [loadFullPipelineFlag]);
|
|
190
|
-
// ── ADR-0022 (PRI-578): owner identity handlers ─────────────────────────
|
|
191
|
-
const handleRegisterOwner = useCallback(async () => {
|
|
192
|
-
if (ownerIdInput.trim().length === 0 || credentialIdInput.trim().length === 0) {
|
|
193
|
-
toast.error(t("pages.settings.ownerIdentity.required"));
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
setOwnerActionPending(true);
|
|
197
|
-
try {
|
|
198
|
-
const result = await registerOwnerIdentity(ownerIdInput.trim(), credentialIdInput.trim());
|
|
199
|
-
if (!result.success) {
|
|
200
|
-
toast.error(t("pages.settings.ownerIdentity.operationFailed"));
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const refresh = await fetchOwnerIdentity();
|
|
204
|
-
if (refresh.success && refresh.data)
|
|
205
|
-
setOwnerIdentity(refresh.data);
|
|
206
|
-
setOwnerIdInput("");
|
|
207
|
-
setCredentialIdInput("");
|
|
208
|
-
toast.success(t("pages.settings.ownerIdentity.registered"));
|
|
209
|
-
}
|
|
210
|
-
finally {
|
|
211
|
-
setOwnerActionPending(false);
|
|
212
|
-
}
|
|
213
|
-
}, [ownerIdInput, credentialIdInput, t]);
|
|
214
|
-
const handleUnregisterOwner = useCallback(async () => {
|
|
215
|
-
setOwnerActionPending(true);
|
|
216
|
-
try {
|
|
217
|
-
const result = await unregisterOwnerIdentity();
|
|
218
|
-
if (!result.success) {
|
|
219
|
-
toast.error(t("pages.settings.ownerIdentity.operationFailed"));
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const refresh = await fetchOwnerIdentity();
|
|
223
|
-
if (refresh.success && refresh.data)
|
|
224
|
-
setOwnerIdentity(refresh.data);
|
|
225
|
-
toast.success(t("pages.settings.ownerIdentity.unregistered"));
|
|
226
|
-
}
|
|
227
|
-
finally {
|
|
228
|
-
setOwnerActionPending(false);
|
|
229
|
-
}
|
|
230
|
-
}, [t]);
|
|
231
|
-
// ── Auth token handlers ────────────────────────────────────────────────
|
|
232
|
-
const handleSaveToken = useCallback(async () => {
|
|
233
|
-
const trimmed = tokenInput.trim();
|
|
234
|
-
if (trimmed.length === 0)
|
|
235
|
-
return;
|
|
236
|
-
try {
|
|
237
|
-
const companion = getCompanionBridge();
|
|
238
|
-
if (companion !== undefined) {
|
|
239
|
-
const result = await companion.configureConsoleToken(trimmed);
|
|
240
|
-
if (!result.persisted) {
|
|
241
|
-
toast.error(t("pages.settings.tokenSaveFailed"));
|
|
242
|
-
if (result.nextAction)
|
|
243
|
-
toast.info(result.nextAction);
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
if (result.reason === "external_console_attached") {
|
|
247
|
-
toast.info(t("pages.settings.tokenExternalAttached"));
|
|
248
|
-
if (result.nextAction)
|
|
249
|
-
toast.info(result.nextAction, { duration: 8000 });
|
|
250
|
-
}
|
|
251
|
-
else if (result.restartRequested) {
|
|
252
|
-
toast.success(t("pages.settings.tokenSavedRestarting"));
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
toast.success(t("pages.settings.tokenSaved"));
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
else {
|
|
259
|
-
toast.success(t("pages.settings.tokenSaved"));
|
|
260
|
-
}
|
|
261
|
-
setToken(trimmed);
|
|
262
|
-
await loadOnboardingFlag();
|
|
263
|
-
}
|
|
264
|
-
catch {
|
|
265
|
-
toast.error(t("pages.settings.tokenSaveFailed"));
|
|
266
|
-
}
|
|
267
|
-
}, [tokenInput, loadOnboardingFlag, t]);
|
|
268
|
-
// Credential lifecycle rollback (SPEC §6.4 清除凭证): drop the durable
|
|
269
|
-
// credential and return the Console to its pre-binding no-auth state. In a
|
|
270
|
-
// plain browser there is nothing durable — only the session cache.
|
|
271
|
-
const handleClearToken = useCallback(async () => {
|
|
272
|
-
setConfirmClearToken(false);
|
|
273
|
-
const companion = getCompanionBridge();
|
|
274
|
-
if (companion === undefined) {
|
|
275
|
-
clearToken();
|
|
276
|
-
setTokenInput("");
|
|
277
|
-
toast.success(t("pages.settings.tokenClearedSession"));
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
try {
|
|
281
|
-
const result = await companion.clearConsoleToken();
|
|
282
|
-
if (!result.cleared) {
|
|
283
|
-
// inherited_env_token: the token comes from the OS environment and
|
|
284
|
-
// would return on the next launch — refuse the fake-durable clear and
|
|
285
|
-
// tell the Owner where the real authority lives (rc-9).
|
|
286
|
-
if (result.reason === "inherited_env_token") {
|
|
287
|
-
toast.info(t("pages.settings.tokenInheritedEnv"));
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
toast.error(t("pages.settings.tokenClearFailed"));
|
|
291
|
-
}
|
|
292
|
-
if (result.nextAction)
|
|
293
|
-
toast.info(result.nextAction, { duration: 8000 });
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
clearToken();
|
|
297
|
-
setTokenInput("");
|
|
298
|
-
if (result.reason === "external_console_attached") {
|
|
299
|
-
// Clear-specific message: the credential IS cleared on this side;
|
|
300
|
-
// the external server still enforces its own copy.
|
|
301
|
-
toast.info(t("pages.settings.tokenClearedExternalAttached"));
|
|
302
|
-
}
|
|
303
|
-
else if (result.restartRequested) {
|
|
304
|
-
toast.success(t("pages.settings.tokenClearedRestarting"));
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
toast.success(t("pages.settings.tokenCleared"));
|
|
308
|
-
}
|
|
309
|
-
if (result.nextAction)
|
|
310
|
-
toast.info(result.nextAction, { duration: 8000 });
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
toast.error(t("pages.settings.tokenClearFailed"));
|
|
314
|
-
}
|
|
315
|
-
}, [t]);
|
|
316
|
-
// ── Workspace handlers ─────────────────────────────────────────────────
|
|
317
|
-
const handleAddWorkspace = useCallback(async () => {
|
|
318
|
-
const name = addName.trim();
|
|
319
|
-
const path = addPath.trim();
|
|
320
|
-
if (name.length === 0 || path.length === 0)
|
|
321
|
-
return;
|
|
322
|
-
const result = await addWorkspace(name, path);
|
|
323
|
-
if (!result.success) {
|
|
324
|
-
toast.error(result.error ?? "Failed to add workspace");
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
// Validate the returned entry before adding to state
|
|
328
|
-
const validated = validateWorkspaceEntry(result.data);
|
|
329
|
-
if (validated === null) {
|
|
330
|
-
// ERR-002: degrade with reason — still reload from server
|
|
331
|
-
toast.success(t("pages.settings.workspaceAdded"));
|
|
332
|
-
await loadData();
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
setWorkspaces((prev) => [...prev, validated]);
|
|
336
|
-
setAddName("");
|
|
337
|
-
setAddPath("");
|
|
338
|
-
toast.success(t("pages.settings.workspaceAdded"));
|
|
339
|
-
}, [addName, addPath, t, loadData]);
|
|
340
|
-
const handleRemoveWorkspace = useCallback(async (name) => {
|
|
341
|
-
const result = await removeWorkspace(name);
|
|
342
|
-
if (!result.success) {
|
|
343
|
-
toast.error(result.error ?? "Failed to remove workspace");
|
|
344
|
-
setConfirmRemove(null);
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
setWorkspaces((prev) => prev.filter((w) => w.name !== name));
|
|
348
|
-
setConfirmRemove(null);
|
|
349
|
-
toast.success(t("pages.settings.workspaceRemoved"));
|
|
350
|
-
}, [t]);
|
|
351
|
-
const handleSyncWorkspace = useCallback(async (name) => {
|
|
352
|
-
const result = await syncWorkspace(name);
|
|
353
|
-
if (!result.success) {
|
|
354
|
-
toast.error(result.error ?? "Failed to sync workspace");
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
// Reload to get fresh lastSync timestamps
|
|
358
|
-
await loadData();
|
|
359
|
-
toast.success(t("pages.settings.syncWorkspace"));
|
|
360
|
-
}, [loadData, t]);
|
|
361
|
-
// ── PRI-332: Output language handler ────────────────────────────────
|
|
362
|
-
const handleOutputLanguageChange = useCallback(async (newLang) => {
|
|
363
|
-
if (newLang !== 'zh-CN' && newLang !== 'en')
|
|
364
|
-
return;
|
|
365
|
-
const result = await updateOutputLanguage(newLang);
|
|
366
|
-
if (!result.success) {
|
|
367
|
-
toast.error(result.error ?? t("pages.settings.languageLoadError"));
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
// Re-read to confirm persisted state
|
|
371
|
-
if (result.data && (result.data.outputLanguage === "zh-CN" || result.data.outputLanguage === "en")) {
|
|
372
|
-
setOutputLanguage(result.data.outputLanguage);
|
|
373
|
-
}
|
|
374
|
-
toast.success(t("pages.settings.languageSaved"));
|
|
375
|
-
}, [t]);
|
|
376
|
-
// ── Onboarding flag toggle handler (spec 2026-06-30 §12.5) ────────────
|
|
377
|
-
// Calls the validated PATCH /api/v1/config/features/new_user_onboarding
|
|
378
|
-
// wrapper (patchFeatureFlag). Response is runtime-validated by validateFeatureFlagUpdate
|
|
379
|
-
// (rc-1/rc-3) before state is updated.
|
|
380
|
-
const handleToggleOnboardingFlag = useCallback(async () => {
|
|
381
|
-
if (onboardingFlagEnabled === null)
|
|
382
|
-
return;
|
|
383
|
-
const newEnabled = !onboardingFlagEnabled;
|
|
384
|
-
const result = await patchFeatureFlag("new_user_onboarding", newEnabled);
|
|
385
|
-
if (!result.success || !result.data) {
|
|
386
|
-
// rc-9: surface reason via toast instead of silent rollback
|
|
387
|
-
toast.error(t("components.onboardingFlag.toggleFailed"));
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
setOnboardingFlagEnabled(result.data.enabled);
|
|
391
|
-
toast.success(t(newEnabled
|
|
392
|
-
? "components.onboardingFlag.enabled"
|
|
393
|
-
: "components.onboardingFlag.disabled"));
|
|
394
|
-
}, [onboardingFlagEnabled, t]);
|
|
395
|
-
// ── PRI-720 full-pipeline flag toggle handler ───────────────────────────
|
|
396
|
-
// Calls the validated PATCH /api/v1/config/features/prompt_full_pipeline
|
|
397
|
-
// wrapper (patchFeatureFlag). Response is runtime-validated by
|
|
398
|
-
// validateFeatureFlagUpdate (rc-1/rc-3) before state is updated.
|
|
399
|
-
const handleToggleFullPipelineFlag = useCallback(async () => {
|
|
400
|
-
if (fullPipelineFlagEnabled === null)
|
|
401
|
-
return;
|
|
402
|
-
const newEnabled = !fullPipelineFlagEnabled;
|
|
403
|
-
const result = await patchFeatureFlag("prompt_full_pipeline", newEnabled);
|
|
404
|
-
if (!result.success || !result.data) {
|
|
405
|
-
// rc-9: surface reason via toast instead of silent rollback
|
|
406
|
-
toast.error(t("components.fullPipelineFlag.toggleFailed"));
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
setFullPipelineFlagEnabled(result.data.enabled);
|
|
410
|
-
toast.success(t(newEnabled
|
|
411
|
-
? "components.fullPipelineFlag.enabled"
|
|
412
|
-
: "components.fullPipelineFlag.disabled"));
|
|
413
|
-
}, [fullPipelineFlagEnabled, t]);
|
|
414
|
-
// ── Onboarding reset handler ───────────────────────────────────────────
|
|
415
|
-
// Mirror App.tsx currentWorkspaceId derivation (App.tsx default="default",
|
|
416
|
-
// then workspaces[0].name after fetch). Using the same key ensures
|
|
417
|
-
// resetOnboardingState targets the same localStorage entry the onboarding
|
|
418
|
-
// wizard wrote — avoids a silent no-op reset (EP-09 test-reality gap).
|
|
419
|
-
const currentWorkspaceId = workspaces[0]?.name ?? "default";
|
|
420
|
-
const handleResetOnboarding = useCallback(() => {
|
|
421
|
-
const confirmed = window.confirm(t("components.onboardingReset.resetConfirm"));
|
|
422
|
-
if (confirmed) {
|
|
423
|
-
if (!resetOnboardingState(currentWorkspaceId)) {
|
|
424
|
-
toast.error(t("components.onboardingReset.resetFailed"));
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
toast.success(t("components.onboardingReset.resetSuccess"));
|
|
428
|
-
}
|
|
429
|
-
}, [currentWorkspaceId, t]);
|
|
430
|
-
// ── Loading state ────────────────────────────────────────────────────────
|
|
431
|
-
if (loadingState === "loading") {
|
|
432
|
-
return (_jsx(PageShell, { children: _jsx(PageLoading, { cardCount: 3, label: t("common.loading") }) }));
|
|
433
|
-
}
|
|
434
|
-
// ── Error state (ERR-002: degradation with reason) ───────────────────────
|
|
435
|
-
if (loadingState === "error") {
|
|
436
|
-
return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.settings.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.settings.title") }), _jsxs("div", { className: "mt-6 p-4 bg-panel border border-line rounded-[6px] text-ink-2 text-sm", children: [_jsx("p", { children: t("pages.settings.loadError") }), errorMessage && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMessage }))] })] }));
|
|
437
|
-
}
|
|
438
|
-
// ── Loaded state ─────────────────────────────────────────────────────────
|
|
439
|
-
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.settings.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.settings.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.settings.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-auth", children: [_jsx(SectionTitle, { id: "section-auth", children: t("pages.settings.auth") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("label", { htmlFor: "bearer-token-input", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.bearerToken") }), _jsx("input", { id: "bearer-token-input", type: "password", value: tokenInput, onChange: (e) => setTokenInput(e.target.value), placeholder: t("pages.settings.enterAccessToken"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" }), _jsxs("div", { className: "flex items-center justify-between mt-3 gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { onClick: handleSaveToken, disabled: tokenInput.trim().length === 0, className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.save") }), confirmClearToken ? (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleClearToken, className: "border border-amber bg-amber text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:opacity-90 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.clearTokenConfirm") }), _jsx("button", { onClick: () => setConfirmClearToken(false), className: "border border-line text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:border-gov transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.cancel") })] })) : (_jsx("button", { onClick: () => setConfirmClearToken(true), className: "border border-line text-ink-3 rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:border-gov hover:text-ink transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.clearToken") }))] }), _jsx("span", { className: "text-ink-4 text-[12px]", children: getCompanionBridge() === undefined
|
|
440
|
-
? t("pages.settings.tokenSessionOnly")
|
|
441
|
-
: t("pages.settings.tokenDesktopStored") })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-owner-identity", children: [_jsx(SectionTitle, { id: "section-owner-identity", children: t("pages.settings.ownerIdentity.title") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.settings.ownerIdentity.intro") }), ownerIdentity === null ? (_jsx("div", { className: "text-ink-4 text-[12px]", children: t("pages.settings.ownerIdentity.loading") })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2 text-[13px] mb-2", "data-testid": "owner-identity-status", children: [_jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${ownerIdentity.resolved.source === "none"
|
|
442
|
-
? "bg-amber text-ink"
|
|
443
|
-
: ownerIdentity.resolved.source === "invalid_env"
|
|
444
|
-
? "bg-danger text-paper"
|
|
445
|
-
: "bg-green text-ink"}`, role: "status", children: ownerIdentity.resolved.source === "none"
|
|
446
|
-
? t("pages.settings.ownerIdentity.statusMissing")
|
|
447
|
-
: ownerIdentity.resolved.source === "invalid_env"
|
|
448
|
-
? t("pages.settings.ownerIdentity.statusInvalid")
|
|
449
|
-
: t("pages.settings.ownerIdentity.statusConfigured") }), _jsxs("span", { className: "text-ink-3 text-[12px]", children: [ownerIdentity.resolved.source === "env" && t("pages.settings.ownerIdentity.sourceEnv"), ownerIdentity.resolved.source === "file" && t("pages.settings.ownerIdentity.sourceFile"), ownerIdentity.resolved.source === "invalid_env" && t("pages.settings.ownerIdentity.sourceInvalid"), ownerIdentity.resolved.source === "none" && t("pages.settings.ownerIdentity.sourceNone")] })] }), _jsxs("div", { className: "flex items-center gap-2 text-[13px] mb-2", "data-testid": "owner-governance-readiness", "data-ready": ownerIdentity.governance.ownerIdentityConfiguration === "configured" && ownerIdentity.governance.authenticationMode === "authenticated" ? "true" : "false", children: [_jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${ownerIdentity.governance.ownerIdentityConfiguration === "configured" && ownerIdentity.governance.authenticationMode === "authenticated" ? "bg-green text-ink" : "bg-amber text-ink"}`, role: "status", children: ownerIdentity.governance.ownerIdentityConfiguration === "configured" && ownerIdentity.governance.authenticationMode === "authenticated"
|
|
450
|
-
? t("pages.settings.ownerIdentity.governanceReady")
|
|
451
|
-
: t("pages.settings.ownerIdentity.governanceNotReady") }), (ownerIdentity.governance.ownerIdentityConfiguration !== "configured" || ownerIdentity.governance.authenticationMode !== "authenticated") && (_jsx("span", { className: "text-ink-3 text-[12px]", children: ownerIdentity.governance.ownerIdentityConfiguration === "configured" && ownerIdentity.governance.authenticationMode === "no_auth"
|
|
452
|
-
? t("pages.settings.ownerIdentity.governanceReasonTokenAuth")
|
|
453
|
-
: t("pages.settings.ownerIdentity.governanceReasonIdentity") }))] }), ownerIdentity.governance.ownerIdentityConfiguration === "configured" &&
|
|
454
|
-
ownerIdentity.governance.authenticationMode === "no_auth" && (_jsx("div", { className: "text-ink-4 text-[12px] mb-3", "data-testid": "owner-governance-next-action", children: t("pages.settings.ownerIdentity.governanceNextActionTokenAuth") })), ownerIdentity.resolved.error !== undefined && (_jsx("div", { className: "text-danger text-[12px] mb-3", "data-testid": "owner-identity-error", children: ownerIdentity.resolved.error })), ownerIdentity.resolved.source === "invalid_env" && (_jsx("div", { className: "text-ink-4 text-[12px] mb-3", "data-testid": "owner-identity-invalid-env-hint", children: t("pages.settings.ownerIdentity.invalidEnvHint") })), ownerIdentity.resolved.source === "file" && ownerIdentity.fileRecord !== null && (_jsxs("div", { className: "text-ink-4 text-[12px] mb-3 font-mono", children: [t("pages.settings.ownerIdentity.ownerIdLabel"), ": ", ownerIdentity.fileRecord.ownerId, " \u00B7", " ", t("pages.settings.ownerIdentity.registeredAt"), " ", ownerIdentity.fileRecord.registeredAt.slice(0, 10)] })), ownerIdentity.fileError !== undefined && (_jsx("div", { className: "text-danger text-[12px] mb-3", "data-testid": "owner-identity-file-error", children: ownerIdentity.fileError })), ownerIdentity.resolved.source === "env" ? (_jsx("div", { className: "text-ink-4 text-[12px]", children: t("pages.settings.ownerIdentity.envHint") })) : (_jsxs("div", { className: "mt-3", children: [_jsx("label", { htmlFor: "owner-id-input", className: "block text-sm font-medium text-ink mb-1", children: t("pages.settings.ownerIdentity.ownerIdLabel") }), _jsx("input", { id: "owner-id-input", type: "text", value: ownerIdInput, onChange: (e) => setOwnerIdInput(e.target.value), disabled: ownerActionPending, placeholder: "owner-alice", className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov disabled:opacity-50" }), _jsx("label", { htmlFor: "credential-id-input", className: "block text-sm font-medium text-ink mt-3 mb-1", children: t("pages.settings.ownerIdentity.credentialIdLabel") }), _jsx("input", { id: "credential-id-input", type: "text", value: credentialIdInput, onChange: (e) => setCredentialIdInput(e.target.value), disabled: ownerActionPending, placeholder: "cred-...", className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov disabled:opacity-50" }), _jsxs("div", { className: "flex items-center gap-2 mt-3", children: [_jsx("button", { type: "button", onClick: handleRegisterOwner, disabled: ownerActionPending, className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.ownerIdentity.register") }), ownerIdentity.resolved.source === "file" && (_jsx("button", { type: "button", onClick: handleUnregisterOwner, disabled: ownerActionPending, className: "border border-line text-ink-3 rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-surface transition-colors disabled:opacity-50 disabled:cursor-not-allowed", children: t("pages.settings.ownerIdentity.unregister") }))] })] }))] }))] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-principle-language", children: [_jsx(SectionTitle, { id: "section-principle-language", children: t("pages.settings.principleLanguage") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.settings.principleLanguageDescription") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("label", { htmlFor: "output-language-select", className: "text-sm font-medium text-ink", children: [t("pages.settings.principleLanguage"), ":"] }), _jsxs("select", { id: "output-language-select", value: outputLanguage, onChange: (e) => handleOutputLanguageChange(e.target.value), className: "border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov", children: [_jsx("option", { value: "zh-CN", children: t("pages.settings.languageZhCN") }), _jsx("option", { value: "en", children: t("pages.settings.languageEn") })] })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-sound-alerts", children: [_jsx(SectionTitle, { id: "section-sound-alerts", children: t("pages.settings.notifications") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "sound-alerts-toggle", className: "block text-sm font-medium text-ink", children: t("pages.settings.soundAlerts") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("pages.settings.soundAlertsDescription") })] }), _jsx("button", { id: "sound-alerts-toggle", type: "button", role: "switch", "aria-checked": soundEnabled, onClick: () => setSoundEnabled(!soundEnabled), className: cn("relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", soundEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", soundEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-workspaces", children: [_jsx(SectionTitle, { id: "section-workspaces", children: t("pages.settings.workspace") }), workspaces.length > 0 ? (_jsx("div", { className: "space-y-[10px] mb-5", children: workspaces.map((ws) => (_jsx("article", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium text-ink text-sm", children: ws.name }), _jsx("div", { className: "text-ink-3 text-[13px] mt-1 font-mono break-all", children: ws.path }), _jsxs("div", { className: "text-ink-4 text-[12px] mt-1", children: [t("pages.settings.lastSync"), ":", " ", ws.lastSync ?? "—"] })] }), _jsx("div", { className: "flex items-center gap-2 shrink-0", children: confirmRemove?.workspaceName === ws.name ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-ink-2 text-[12px]", children: t("pages.settings.confirmDeleteDescription", {
|
|
455
|
-
name: ws.name,
|
|
456
|
-
}) }), _jsx("button", { onClick: () => handleRemoveWorkspace(ws.name), className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.confirm") }), _jsx("button", { onClick: () => setConfirmRemove(null), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.cancel") })] })) : (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => handleSyncWorkspace(ws.name), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.syncWorkspace") }), _jsx("button", { onClick: () => setConfirmRemove({ workspaceName: ws.name }), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.removeWorkspace") })] })) })] }) }, ws.name))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3 mb-5", children: "\u2014" })), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-end gap-3", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("label", { htmlFor: "add-workspace-name", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.name") }), _jsx("input", { id: "add-workspace-name", type: "text", value: addName, onChange: (e) => setAddName(e.target.value), placeholder: t("pages.settings.addNamePlaceholder"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("label", { htmlFor: "add-workspace-path", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.path") }), _jsx("input", { id: "add-workspace-path", type: "text", value: addPath, onChange: (e) => setAddPath(e.target.value), placeholder: t("pages.settings.addPathPlaceholder"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" })] }), _jsx("button", { onClick: handleAddWorkspace, disabled: addName.trim().length === 0 || addPath.trim().length === 0, className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed shrink-0 focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.addWorkspace") })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-onboarding-flag", children: [_jsx(SectionTitle, { id: "section-onboarding-flag", children: t("components.onboardingFlag.title") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("label", { htmlFor: "onboarding-flag-toggle", className: "block text-sm font-medium text-ink", children: t("components.onboardingFlag.label") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("components.onboardingFlag.description") })] }), _jsx("button", { id: "onboarding-flag-toggle", type: "button", role: "switch", "aria-checked": onboardingFlagEnabled ?? false, "aria-label": t("components.onboardingFlag.toggleAriaLabel"), onClick: handleToggleOnboardingFlag, disabled: onboardingFlagEnabled === null, className: cn("relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed", onboardingFlagEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", onboardingFlagEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-full-pipeline-flag", children: [_jsx(SectionTitle, { id: "section-full-pipeline-flag", children: t("components.fullPipelineFlag.title") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("label", { htmlFor: "full-pipeline-flag-toggle", className: "block text-sm font-medium text-ink", children: t("components.fullPipelineFlag.label") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("components.fullPipelineFlag.description") })] }), _jsx("button", { id: "full-pipeline-flag-toggle", type: "button", role: "switch", "aria-checked": fullPipelineFlagEnabled ?? false, "aria-label": t("components.fullPipelineFlag.toggleAriaLabel"), onClick: handleToggleFullPipelineFlag, disabled: fullPipelineFlagEnabled === null, className: cn("relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed", fullPipelineFlagEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", fullPipelineFlagEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { "aria-labelledby": "section-onboarding-reset", children: [_jsx(SectionTitle, { id: "section-onboarding-reset", children: t("components.onboardingReset.title") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsx("button", { onClick: handleResetOnboarding, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("components.onboardingReset.resetButton") }) })] })] }) }));
|
|
457
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function UpdatePage(): import("react").JSX.Element;
|