create-principles-disciple 1.146.3 → 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.
Files changed (311) hide show
  1. package/_release/product-identity.json +1 -1
  2. package/console/dist/web/assets/app.js +26 -26
  3. package/console/package.json +1 -1
  4. package/package.json +3 -3
  5. package/pd-cli/package.json +1 -1
  6. package/release-manager/package.json +3 -3
  7. package/console/dist/ui/App.d.ts +0 -1
  8. package/console/dist/ui/App.js +0 -172
  9. package/console/dist/ui/api.d.ts +0 -611
  10. package/console/dist/ui/api.js +0 -1094
  11. package/console/dist/ui/components/auth/login-form.d.ts +0 -4
  12. package/console/dist/ui/components/auth/login-form.js +0 -142
  13. package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
  14. package/console/dist/ui/components/auth/splash-screen.js +0 -22
  15. package/console/dist/ui/components/error-boundary.d.ts +0 -15
  16. package/console/dist/ui/components/error-boundary.js +0 -30
  17. package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
  18. package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
  19. package/console/dist/ui/components/language-switcher.d.ts +0 -2
  20. package/console/dist/ui/components/language-switcher.js +0 -17
  21. package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
  22. package/console/dist/ui/components/layout/app-sidebar.js +0 -128
  23. package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
  24. package/console/dist/ui/components/layout/page-loading.js +0 -14
  25. package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
  26. package/console/dist/ui/components/layout/page-shell.js +0 -11
  27. package/console/dist/ui/components/layout/section-title.d.ts +0 -10
  28. package/console/dist/ui/components/layout/section-title.js +0 -9
  29. package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
  30. package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
  31. package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
  32. package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
  33. package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
  34. package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
  35. package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
  36. package/console/dist/ui/components/notifications/sound-storage.js +0 -37
  37. package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
  38. package/console/dist/ui/components/notifications/useNotifications.js +0 -9
  39. package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
  40. package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
  41. package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
  42. package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
  43. package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
  44. package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
  45. package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
  46. package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
  47. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
  48. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
  49. package/console/dist/ui/components/theme-provider.d.ts +0 -14
  50. package/console/dist/ui/components/theme-provider.js +0 -40
  51. package/console/dist/ui/components/theme-toggle.d.ts +0 -2
  52. package/console/dist/ui/components/theme-toggle.js +0 -11
  53. package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
  54. package/console/dist/ui/components/ui/alert-dialog.js +0 -26
  55. package/console/dist/ui/components/ui/badge.d.ts +0 -9
  56. package/console/dist/ui/components/ui/badge.js +0 -22
  57. package/console/dist/ui/components/ui/button.d.ts +0 -11
  58. package/console/dist/ui/components/ui/button.js +0 -34
  59. package/console/dist/ui/components/ui/card.d.ts +0 -8
  60. package/console/dist/ui/components/ui/card.js +0 -16
  61. package/console/dist/ui/components/ui/charts.d.ts +0 -51
  62. package/console/dist/ui/components/ui/charts.js +0 -72
  63. package/console/dist/ui/components/ui/dialog.d.ts +0 -19
  64. package/console/dist/ui/components/ui/dialog.js +0 -22
  65. package/console/dist/ui/components/ui/input.d.ts +0 -3
  66. package/console/dist/ui/components/ui/input.js +0 -8
  67. package/console/dist/ui/components/ui/markdown.d.ts +0 -24
  68. package/console/dist/ui/components/ui/markdown.js +0 -119
  69. package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
  70. package/console/dist/ui/components/ui/progress-bar.js +0 -38
  71. package/console/dist/ui/components/ui/select.d.ts +0 -13
  72. package/console/dist/ui/components/ui/select.js +0 -26
  73. package/console/dist/ui/components/ui/separator.d.ts +0 -3
  74. package/console/dist/ui/components/ui/separator.js +0 -6
  75. package/console/dist/ui/components/ui/sheet.d.ts +0 -25
  76. package/console/dist/ui/components/ui/sheet.js +0 -37
  77. package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
  78. package/console/dist/ui/components/ui/shiny-text.js +0 -46
  79. package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
  80. package/console/dist/ui/components/ui/skeleton.js +0 -6
  81. package/console/dist/ui/components/ui/sonner.d.ts +0 -3
  82. package/console/dist/ui/components/ui/sonner.js +0 -13
  83. package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
  84. package/console/dist/ui/components/ui/tooltip.js +0 -10
  85. package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
  86. package/console/dist/ui/data/daily-thoughts.js +0 -164
  87. package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
  88. package/console/dist/ui/hooks/useNotificationSound.js +0 -74
  89. package/console/dist/ui/i18n/en.json +0 -2399
  90. package/console/dist/ui/i18n/index.d.ts +0 -2
  91. package/console/dist/ui/i18n/index.js +0 -32
  92. package/console/dist/ui/i18n/zh-CN.json +0 -2399
  93. package/console/dist/ui/main.d.ts +0 -1
  94. package/console/dist/ui/main.js +0 -9
  95. package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
  96. package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
  97. package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
  98. package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
  99. package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
  100. package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
  101. package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
  102. package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
  103. package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
  104. package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
  105. package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
  106. package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
  107. package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
  108. package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
  109. package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
  110. package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
  111. package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
  112. package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
  113. package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
  114. package/console/dist/ui/pages/debt/DebtPage.js +0 -222
  115. package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
  116. package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
  117. package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
  118. package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
  119. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
  120. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
  121. package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
  122. package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
  123. package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
  124. package/console/dist/ui/pages/focus/FocusPage.js +0 -567
  125. package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
  126. package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
  127. package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
  128. package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
  129. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
  130. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
  131. package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
  132. package/console/dist/ui/pages/focus/focus-validation.js +0 -211
  133. package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
  134. package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
  135. package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
  136. package/console/dist/ui/pages/intent/IntentPage.js +0 -252
  137. package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
  138. package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
  139. package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
  140. package/console/dist/ui/pages/pain/PainPage.js +0 -420
  141. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
  142. package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
  143. package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
  144. package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
  145. package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
  146. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
  147. package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
  148. package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
  149. package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
  150. package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
  151. package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
  152. package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
  153. package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
  154. package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
  155. package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
  156. package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
  157. package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
  158. package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
  159. package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
  160. package/console/dist/ui/utils/agent-metadata.js +0 -284
  161. package/console/dist/ui/utils/approval-review.d.ts +0 -30
  162. package/console/dist/ui/utils/approval-review.js +0 -50
  163. package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
  164. package/console/dist/ui/utils/approval-warning-localization.js +0 -148
  165. package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
  166. package/console/dist/ui/utils/attention-presentation.js +0 -46
  167. package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
  168. package/console/dist/ui/utils/blocker-localization.js +0 -36
  169. package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
  170. package/console/dist/ui/utils/control-center-helpers.js +0 -189
  171. package/console/dist/ui/utils/enum-labels.d.ts +0 -50
  172. package/console/dist/ui/utils/enum-labels.js +0 -171
  173. package/console/dist/ui/utils/format-date.d.ts +0 -11
  174. package/console/dist/ui/utils/format-date.js +0 -17
  175. package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
  176. package/console/dist/ui/utils/onboarding-state.js +0 -77
  177. package/console/dist/ui/utils/reading-layout.d.ts +0 -20
  178. package/console/dist/ui/utils/reading-layout.js +0 -46
  179. package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
  180. package/console/dist/ui/utils/rule-binding-validators.js +0 -188
  181. package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
  182. package/console/dist/ui/utils/runtime-mode.js +0 -11
  183. package/console/dist/ui/utils/token-storage.d.ts +0 -22
  184. package/console/dist/ui/utils/token-storage.js +0 -47
  185. package/console/dist/ui/utils/validators.d.ts +0 -1178
  186. package/console/dist/ui/utils/validators.js +0 -3297
  187. package/release-manager/dist/bootstrap-entry.d.ts +0 -2
  188. package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
  189. package/release-manager/dist/bootstrap-entry.js.map +0 -1
  190. package/release-manager/dist/i18n.d.ts +0 -6
  191. package/release-manager/dist/i18n.d.ts.map +0 -1
  192. package/release-manager/dist/i18n.js.map +0 -1
  193. package/release-manager/dist/index.d.ts +0 -7
  194. package/release-manager/dist/index.d.ts.map +0 -1
  195. package/release-manager/dist/index.js +0 -656
  196. package/release-manager/dist/index.js.map +0 -1
  197. package/release-manager/dist/installer.d.ts +0 -629
  198. package/release-manager/dist/installer.d.ts.map +0 -1
  199. package/release-manager/dist/installer.js.map +0 -1
  200. package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
  201. package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
  202. package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
  203. package/release-manager/dist/installers/index.d.ts +0 -51
  204. package/release-manager/dist/installers/index.d.ts.map +0 -1
  205. package/release-manager/dist/installers/index.js.map +0 -1
  206. package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
  207. package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
  208. package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
  209. package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
  210. package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
  211. package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
  212. package/release-manager/dist/mvp-config.d.ts +0 -233
  213. package/release-manager/dist/mvp-config.d.ts.map +0 -1
  214. package/release-manager/dist/mvp-config.js.map +0 -1
  215. package/release-manager/dist/prompts.d.ts +0 -43
  216. package/release-manager/dist/prompts.d.ts.map +0 -1
  217. package/release-manager/dist/prompts.js +0 -268
  218. package/release-manager/dist/prompts.js.map +0 -1
  219. package/release-manager/dist/skill-language.d.ts +0 -32
  220. package/release-manager/dist/skill-language.d.ts.map +0 -1
  221. package/release-manager/dist/skill-language.js.map +0 -1
  222. package/release-manager/dist/uninstaller.d.ts +0 -68
  223. package/release-manager/dist/uninstaller.d.ts.map +0 -1
  224. package/release-manager/dist/uninstaller.js +0 -746
  225. package/release-manager/dist/uninstaller.js.map +0 -1
  226. package/release-manager/dist/update/apply-payload.d.ts +0 -143
  227. package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
  228. package/release-manager/dist/update/apply-payload.js.map +0 -1
  229. package/release-manager/dist/update/atomic-file.d.ts +0 -35
  230. package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
  231. package/release-manager/dist/update/atomic-file.js.map +0 -1
  232. package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
  233. package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
  234. package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
  235. package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
  236. package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
  237. package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
  238. package/release-manager/dist/update/channel-metadata.d.ts +0 -28
  239. package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
  240. package/release-manager/dist/update/channel-metadata.js.map +0 -1
  241. package/release-manager/dist/update/channel-promotion.d.ts +0 -39
  242. package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
  243. package/release-manager/dist/update/channel-promotion.js +0 -55
  244. package/release-manager/dist/update/channel-promotion.js.map +0 -1
  245. package/release-manager/dist/update/console-surface.d.ts +0 -19
  246. package/release-manager/dist/update/console-surface.d.ts.map +0 -1
  247. package/release-manager/dist/update/console-surface.js.map +0 -1
  248. package/release-manager/dist/update/data-compatibility.d.ts +0 -35
  249. package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
  250. package/release-manager/dist/update/data-compatibility.js +0 -45
  251. package/release-manager/dist/update/data-compatibility.js.map +0 -1
  252. package/release-manager/dist/update/install-layout.d.ts +0 -105
  253. package/release-manager/dist/update/install-layout.d.ts.map +0 -1
  254. package/release-manager/dist/update/install-layout.js.map +0 -1
  255. package/release-manager/dist/update/product-identity.d.ts +0 -70
  256. package/release-manager/dist/update/product-identity.d.ts.map +0 -1
  257. package/release-manager/dist/update/product-identity.js.map +0 -1
  258. package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
  259. package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
  260. package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
  261. package/release-manager/dist/update/release-identity.d.ts +0 -33
  262. package/release-manager/dist/update/release-identity.d.ts.map +0 -1
  263. package/release-manager/dist/update/release-identity.js.map +0 -1
  264. package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
  265. package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
  266. package/release-manager/dist/update/release-manager-authority.js.map +0 -1
  267. package/release-manager/dist/update/release-manager.d.ts +0 -156
  268. package/release-manager/dist/update/release-manager.d.ts.map +0 -1
  269. package/release-manager/dist/update/release-manager.js.map +0 -1
  270. package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
  271. package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
  272. package/release-manager/dist/update/release-metadata-publisher.js +0 -478
  273. package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
  274. package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
  275. package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
  276. package/release-manager/dist/update/release-metadata-source.js.map +0 -1
  277. package/release-manager/dist/update/release-metadata.d.ts +0 -60
  278. package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
  279. package/release-manager/dist/update/release-metadata.js.map +0 -1
  280. package/release-manager/dist/update/release-policy.d.ts +0 -51
  281. package/release-manager/dist/update/release-policy.d.ts.map +0 -1
  282. package/release-manager/dist/update/release-policy.js.map +0 -1
  283. package/release-manager/dist/update/rollback-policy.d.ts +0 -56
  284. package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
  285. package/release-manager/dist/update/rollback-policy.js +0 -61
  286. package/release-manager/dist/update/rollback-policy.js.map +0 -1
  287. package/release-manager/dist/update/transaction-journal.d.ts +0 -212
  288. package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
  289. package/release-manager/dist/update/transaction-journal.js.map +0 -1
  290. package/release-manager/dist/update/trust-metadata.d.ts +0 -55
  291. package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
  292. package/release-manager/dist/update/trust-metadata.js.map +0 -1
  293. package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
  294. package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
  295. package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
  296. package/release-manager/dist/update/update-history.d.ts +0 -46
  297. package/release-manager/dist/update/update-history.d.ts.map +0 -1
  298. package/release-manager/dist/update/update-history.js +0 -123
  299. package/release-manager/dist/update/update-history.js.map +0 -1
  300. package/release-manager/dist/utils/config-file-io.d.ts +0 -34
  301. package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
  302. package/release-manager/dist/utils/config-file-io.js.map +0 -1
  303. package/release-manager/dist/utils/env.d.ts +0 -94
  304. package/release-manager/dist/utils/env.d.ts.map +0 -1
  305. package/release-manager/dist/utils/env.js.map +0 -1
  306. package/release-manager/dist/utils/logger.d.ts +0 -15
  307. package/release-manager/dist/utils/logger.d.ts.map +0 -1
  308. package/release-manager/dist/utils/logger.js.map +0 -1
  309. package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
  310. package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
  311. 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;