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,215 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * UpdatePage — PD self-update status and history.
4
- *
5
- * Contract aligned with backend routes/update.ts:
6
- * - GET /api/update/check → { hasUpdate, currentVersion, latestVersion, error? }
7
- * - GET /api/update/history → [{ id, timestamp, fromVersion, toVersion, success }, ...]
8
- *
9
- * Privacy boundary: version strings and timestamps only — no session/path data.
10
- */
11
- import { useState, useEffect, useCallback } from "react";
12
- import { useTranslation } from "react-i18next";
13
- import { toast } from "sonner";
14
- import { PageShell } from "../../components/layout/page-shell.js";
15
- import { PageLoading } from "../../components/layout/page-loading.js";
16
- import { SectionTitle } from "../../components/layout/section-title.js";
17
- import { fetchUpdateStatus, fetchUpdateHistory, applyFullUpdate, fetchUpdateRecovery, fetchUpdateTransaction, } from "../../api.js";
18
- import { validateUpdateStatus, validateUpdateHistory, validateUpdateRecovery, validateUpdateTransaction } from "../../utils/validators.js";
19
- import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, } from "../../components/ui/alert-dialog.js";
20
- import { Loader2, CheckCircle2, XCircle, ArrowRight, AlertTriangle } from "lucide-react";
21
- import { formatDate } from "../../utils/format-date.js";
22
- export function UpdatePage() {
23
- const { t, i18n } = useTranslation();
24
- const [statusData, setStatusData] = useState(null);
25
- const [historyData, setHistoryData] = useState(null);
26
- const [loadingState, setLoadingState] = useState("loading");
27
- const [checking, setChecking] = useState(false);
28
- const [errorMessage, setErrorMessage] = useState(null);
29
- const [historyErrorReason, setHistoryErrorReason] = useState(null);
30
- const [updateResult, setUpdateResult] = useState(null);
31
- const [showFullUpdateDialog, setShowFullUpdateDialog] = useState(false);
32
- const [fullUpdating, setFullUpdating] = useState(false);
33
- const [recoveryData, setRecoveryData] = useState(null);
34
- // PRI-853 (SPEC §12.1): a running detached update — the page tracks its
35
- // transaction instead of treating the accepted request as "success".
36
- const [inProgress, setInProgress] = useState(null);
37
- const loadData = useCallback(async () => {
38
- setLoadingState("loading");
39
- setErrorMessage(null);
40
- setHistoryErrorReason(null);
41
- const [statusResult, historyResult, recoveryResult] = await Promise.all([
42
- fetchUpdateStatus(),
43
- fetchUpdateHistory(),
44
- fetchUpdateRecovery(),
45
- ]);
46
- // Validate status data (H section / ERR-001/005)
47
- if (!statusResult.success) {
48
- setLoadingState("error");
49
- setErrorMessage(statusResult.error);
50
- return;
51
- }
52
- const validatedStatus = validateUpdateStatus(statusResult.data);
53
- if (validatedStatus === null) {
54
- setLoadingState("error");
55
- setErrorMessage("Update status data has unexpected shape");
56
- return;
57
- }
58
- setStatusData(validatedStatus);
59
- // Validate history data (ERR-002: degradation with reason)
60
- if (!historyResult.success) {
61
- setHistoryData(null);
62
- setHistoryErrorReason(historyResult.error ?? "Update history unavailable");
63
- }
64
- else {
65
- const validatedHistory = validateUpdateHistory(historyResult.data);
66
- setHistoryData(validatedHistory);
67
- if (validatedHistory === null) {
68
- setHistoryErrorReason("Update history data has unexpected shape");
69
- }
70
- }
71
- // PRI-848 (SPEC §12.1): recovery surface — surface an unfinished update
72
- // transaction instead of letting the Owner start a duplicate update.
73
- if (recoveryResult.success) {
74
- setRecoveryData(validateUpdateRecovery(recoveryResult.data));
75
- }
76
- else {
77
- setRecoveryData(null);
78
- }
79
- setLoadingState("loaded");
80
- }, []);
81
- useEffect(() => {
82
- loadData();
83
- }, [loadData]);
84
- const handleCheckForUpdates = useCallback(async () => {
85
- setChecking(true);
86
- const result = await fetchUpdateStatus();
87
- if (!result.success) {
88
- toast.error(t("pages.update.checkFailed"));
89
- setChecking(false);
90
- return;
91
- }
92
- const validated = validateUpdateStatus(result.data);
93
- if (validated === null) {
94
- toast.error(t("pages.update.checkFailed"));
95
- setChecking(false);
96
- return;
97
- }
98
- setStatusData(validated);
99
- setChecking(false);
100
- }, [t]);
101
- const handleApplyFullUpdate = useCallback(async () => {
102
- setShowFullUpdateDialog(false);
103
- setFullUpdating(true);
104
- setUpdateResult(null);
105
- const result = await applyFullUpdate();
106
- setFullUpdating(false);
107
- if (!result.success) {
108
- setUpdateResult({ success: false, message: result.error ?? 'Unknown error' });
109
- toast.error(t('pages.update.updateFailed', { message: result.error ?? 'Unknown error' }));
110
- return;
111
- }
112
- const data = result.data;
113
- if (data.state === 'update_in_progress' && data.transactionId) {
114
- // PRI-853 (SPEC §12.1): an ACCEPTED request is not a completed update.
115
- // Track the detached transaction; only its terminal phase ends this flow.
116
- setInProgress({ transactionId: data.transactionId, phase: null });
117
- toast.info(t('pages.update.inProgressToast'));
118
- return;
119
- }
120
- if (data.success) {
121
- setUpdateResult({
122
- success: true,
123
- message: data.message,
124
- newVersion: data.newVersion,
125
- fromVersion: statusData?.currentVersion,
126
- requiresRestart: data.requiresRestart,
127
- gatewayNotice: data.gatewayNotice,
128
- });
129
- toast.success(t('pages.update.fullUpdateSuccess'));
130
- await loadData();
131
- }
132
- else {
133
- setUpdateResult({
134
- success: false,
135
- refusal: data.refusal,
136
- message: data.message,
137
- reason: data.reason,
138
- nextAction: data.nextAction,
139
- gatewayNotice: data.gatewayNotice,
140
- });
141
- toast.error(t('pages.update.updateFailed', { message: data.message }));
142
- }
143
- }, [t, loadData, statusData?.currentVersion]);
144
- // PRI-853: poll the detached update's transaction until a terminal phase.
145
- useEffect(() => {
146
- if (!inProgress)
147
- return;
148
- let cancelled = false;
149
- let attempts = 0;
150
- const tick = async () => {
151
- if (cancelled)
152
- return;
153
- attempts += 1;
154
- const result = await fetchUpdateTransaction(inProgress.transactionId);
155
- if (cancelled)
156
- return;
157
- const tx = result.success ? validateUpdateTransaction(result.data) : null;
158
- if (tx === null || !tx.exists) {
159
- if (attempts >= 200) {
160
- setInProgress(null);
161
- setUpdateResult({ success: false, message: t('pages.update.inProgressTimeout'), reason: 'transaction_unresolved' });
162
- }
163
- return;
164
- }
165
- setInProgress({ transactionId: inProgress.transactionId, phase: tx.lastState });
166
- if (!tx.terminal)
167
- return;
168
- setInProgress(null);
169
- if (tx.lastState === 'confirmed') {
170
- setUpdateResult({ success: true, message: t('pages.update.inProgressConfirmed', { version: tx.productVersion ?? '' }), requiresRestart: true });
171
- toast.success(t('pages.update.fullUpdateSuccess'));
172
- }
173
- else {
174
- setUpdateResult({ success: false, message: t('pages.update.inProgressEnded', { state: tx.lastState ?? '' }) });
175
- }
176
- await loadData();
177
- };
178
- const timer = setInterval(tick, 3000);
179
- void tick();
180
- return () => { cancelled = true; clearInterval(timer); };
181
- }, [inProgress?.transactionId, t, loadData]);
182
- // ── Loading state ────────────────────────────────────────────────────────
183
- if (loadingState === "loading") {
184
- return (_jsx(PageShell, { children: _jsx(PageLoading, { cardCount: 2, label: t("common.loading") }) }));
185
- }
186
- // ── Error state (ERR-002: degradation with reason) ───────────────────────
187
- if (loadingState === "error") {
188
- return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.update.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.update.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.update.loadError") }), errorMessage && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMessage }))] })] }));
189
- }
190
- // ── Loaded state ─────────────────────────────────────────────────────────
191
- // PRI-848 (SPEC §12.1): explicit state contract. Servers predating the
192
- // contract fall back to the legacy hasUpdate/error derivation.
193
- const updateState = statusData?.state ??
194
- (statusData ? (statusData.error ? 'check_failed' : statusData.hasUpdate ? 'update_available' : 'up_to_date') : 'up_to_date');
195
- const isUpToDate = updateState === 'up_to_date';
196
- // SPEC §12.1: reason codes localize; an unmapped code falls back to the raw
197
- // value instead of hiding it.
198
- const localizedReason = (reason) => reason ? t(`pages.update.reason.${reason}`, { defaultValue: reason }) : undefined;
199
- const blockedReason = updateState === 'update_blocked' || updateState === 'check_failed'
200
- ? localizedReason(statusData?.reason)
201
- : undefined;
202
- return (_jsxs(PageShell, { children: [_jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [recoveryData?.needsRecovery && recoveryData.unfinished.length > 0 && (_jsxs("div", { className: "mb-6 p-4 bg-amber/5 border border-amber/35 rounded-[6px] text-[13px] leading-relaxed text-ink-2", role: "alert", children: [_jsx("p", { className: "font-medium text-amber", children: t("pages.update.recoveryBanner") }), recoveryData.unfinished.slice(0, 3).map((item) => (_jsx("p", { className: "mt-1 font-mono text-[12px] text-ink-3", children: t("pages.update.recoveryItem", {
203
- id: item.transactionId,
204
- phase: item.lastState ?? "—",
205
- }) }, item.transactionId))), recoveryData.nextAction && (_jsx("p", { className: "mt-2 text-[12px] text-ink-3", children: recoveryData.nextAction }))] })), recoveryData?.needsRecovery && recoveryData.recoveryRequired.length > 0 && (_jsxs("div", { className: "mb-6 p-4 bg-amber/5 border border-amber/35 rounded-[6px] text-[13px] leading-relaxed text-ink-2", role: "alert", children: [_jsx("p", { className: "font-medium text-amber", children: t("pages.update.recoveryRequiredBanner") }), recoveryData.recoveryRequired.slice(0, 3).map((item) => (_jsx("p", { className: "mt-1 font-mono text-[12px] text-ink-3", children: t("pages.update.recoveryRequiredItem", { id: item.transactionId }) }, item.transactionId))), recoveryData.nextAction && (_jsx("p", { className: "mt-2 text-[12px] text-ink-3", children: recoveryData.nextAction }))] })), _jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.update.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.update.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.update.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-update-status", children: [_jsx(SectionTitle, { id: "section-update-status", children: t("pages.update.currentVersion") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.currentVersion") }), _jsx("span", { className: "font-mono text-[13px] text-ink", children: statusData?.currentVersion ?? "—" })] }), statusData?.identityDivergence && (_jsx("div", { className: "border border-amber/35 rounded-[4px] px-3 py-2 text-[12px] leading-relaxed text-ink-2", children: t("pages.update.identityDivergence", {
206
- active: statusData.identityDivergence.activeVersion,
207
- plugin: statusData.identityDivergence.pluginVersion,
208
- }) })), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.latestVersion") }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px] text-ink", children: updateState === 'check_failed' ? "—" : (statusData?.latestVersion || "—") }), updateState === 'check_failed' && (_jsx("span", { className: "inline-flex items-center border border-amber/35 text-amber rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.checkFailed") })), updateState === 'update_blocked' && (_jsx("span", { className: "inline-flex items-center border border-amber/35 text-amber rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.blockedBadge") })), updateState === 'up_to_date' && (_jsx("span", { className: "inline-flex items-center border border-green/35 text-green rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.upToDate") })), updateState === 'update_available' && (_jsx("span", { className: "inline-flex items-center border border-amber/35 text-amber rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.updateAvailable") }))] })] })] }), (updateState === 'update_blocked' || updateState === 'check_failed') && (_jsxs("div", { className: "mt-4 pt-3 border-t border-line text-[12px] leading-relaxed", children: [blockedReason && (_jsxs("p", { className: "text-ink-2", children: [t("pages.update.reasonLabel"), blockedReason] })), statusData?.message && updateState === 'update_blocked' && (_jsx("p", { className: "mt-1 text-ink-3", children: statusData.message })), statusData?.nextAction && (_jsx("p", { className: "mt-1 text-ink-3 font-mono", children: statusData.nextAction }))] })), statusData?.error && (_jsxs("div", { className: "mt-4 pt-3 border-t border-line text-[12px] text-ink-4 font-mono", children: [t("pages.update.checkError"), ": ", statusData.error] })), inProgress && (_jsxs("div", { className: "mt-4 p-4 rounded-[6px] border border-gov/30 bg-surface text-[13px] leading-relaxed", role: "status", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin text-gov" }), _jsx("span", { className: "font-medium text-ink", children: t("pages.update.inProgressPanel") })] }), _jsx("p", { className: "mt-1 font-mono text-[12px] text-ink-3", children: t("pages.update.inProgressPhase", { phase: inProgress.phase ?? "…" }) }), _jsx("p", { className: "mt-1 font-mono text-[12px] text-ink-4", children: inProgress.transactionId })] })), _jsxs("div", { className: "mt-5 pt-4 border-t border-line flex items-center gap-3 flex-wrap", children: [_jsx("button", { type: "button", onClick: handleCheckForUpdates, disabled: checking || fullUpdating || inProgress !== null, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: checking ? t("pages.update.checking") : t("pages.update.checkForUpdates") }), !isUpToDate && updateState === 'update_available' && (_jsx("button", { type: "button", onClick: () => setShowFullUpdateDialog(true), disabled: checking || fullUpdating || inProgress !== null, className: "bg-gov text-white rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:bg-gov/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: fullUpdating ? (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), t("pages.update.updating")] })) : (t("pages.update.applyUpdate")) }))] }), updateResult && (_jsx("div", { className: `mt-4 p-4 rounded-[6px] border animate-[pdFadeIn_400ms_ease-out] ${updateResult.success ? 'bg-green/5 border-green/20' : updateResult.refusal ? 'bg-amber/5 border-amber/25' : 'bg-danger/5 border-danger/20'}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [updateResult.success ? (_jsx(CheckCircle2, { className: "h-6 w-6 text-green shrink-0 mt-0.5 animate-[pdFadeIn_600ms_ease-out]", style: { transform: 'scale(1)', animationFillMode: 'both' } })) : updateResult.refusal ? (_jsx(AlertTriangle, { className: "h-6 w-6 text-amber shrink-0 mt-0.5" })) : (_jsx(XCircle, { className: "h-6 w-6 text-danger shrink-0 mt-0.5" })), _jsxs("div", { className: "flex-1 min-w-0", children: [updateResult.refusal && (_jsx("p", { className: "text-[12px] font-mono uppercase text-amber mb-1", children: t("pages.update.blockedBadge") })), updateResult.success && updateResult.fromVersion && updateResult.newVersion && (_jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [_jsx("span", { className: "font-mono text-[13px] text-ink-3 line-through", children: updateResult.fromVersion }), _jsx(ArrowRight, { className: "h-3.5 w-3.5 text-green" }), _jsx("span", { className: "font-mono text-[13px] text-green font-medium", children: updateResult.newVersion })] })), _jsx("p", { className: `text-[13px] ${updateResult.success ? 'text-green' : updateResult.refusal ? 'text-ink-2' : 'text-danger'}`, children: updateResult.message }), updateResult.success && updateResult.requiresRestart && (_jsx("p", { className: "mt-2 p-2 rounded-[3px] bg-amber/5 border border-amber/20 text-[12px] text-amber leading-relaxed", children: t("pages.update.fullUpdateRestartPrompt") })), updateResult.gatewayNotice && (_jsx("p", { className: "mt-2 p-2 rounded-[3px] bg-amber/5 border border-amber/20 text-[12px] text-amber leading-relaxed font-mono", children: updateResult.gatewayNotice })), !updateResult.success && updateResult.nextAction && (_jsx("p", { className: "mt-1 text-[12px] text-ink-4 font-mono leading-relaxed", children: updateResult.nextAction })), !updateResult.success && (_jsxs("div", { className: "mt-2 flex items-center gap-2", children: [/network|fetch|timeout|ECONNREFUSED|ENOTFOUND/i.test(updateResult.message) && (_jsx("p", { className: "text-[12px] text-ink-4 font-mono", children: t("pages.update.networkErrorHint") })), _jsx("button", { type: "button", onClick: () => setShowFullUpdateDialog(true), disabled: fullUpdating, className: "text-[12px] text-danger underline hover:text-danger/80 disabled:opacity-50", children: t("pages.update.retry") })] }))] })] }) }))] })] }), _jsxs("section", { "aria-labelledby": "section-update-history", children: [_jsx(SectionTitle, { id: "section-update-history", children: t("pages.update.history") }), historyErrorReason ? (_jsxs("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: [t("pages.update.loadError"), " (", historyErrorReason, ")"] })) : historyData && historyData.updates.length > 0 ? (_jsx("div", { className: "space-y-[10px]", children: historyData.updates.map((entry) => (_jsxs("article", { className: "bg-panel border border-line rounded-[6px] px-5 py-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex items-center border border-line rounded-[2px] px-[7px] py-1 font-mono text-[11px] text-ink-3 bg-surface/80 uppercase", children: t("pages.update.version") }), _jsxs("span", { className: "font-mono text-[13px] text-ink", children: [entry.fromVersion, " \u2192 ", entry.toVersion === "failed" ? "—" : entry.toVersion] }), entry.kind !== "failure" && (_jsx("span", { className: "inline-flex items-center border border-line rounded-[2px] px-[7px] py-1 font-mono text-[11px] text-ink-3 bg-surface/80 uppercase", children: t(`pages.update.historyKind.${entry.kind}`) })), !entry.success && entry.kind !== 'refusal' && (_jsx("span", { className: "inline-flex items-center border border-danger/35 text-danger rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.failed") }))] }), _jsx("div", { className: "flex items-center gap-3", children: _jsx("span", { className: "text-ink-3 text-[13px]", children: formatDate(entry.timestamp, i18n.language, {
209
- year: "numeric",
210
- month: "short",
211
- day: "numeric",
212
- hour: "2-digit",
213
- minute: "2-digit",
214
- }) }) })] }), (entry.reason || entry.nextAction) && (_jsxs("div", { className: "mt-3 border-t border-line pt-3 text-[12px] leading-relaxed text-ink-3", children: [entry.reason && _jsx("p", { children: entry.reason }), entry.nextAction && _jsx("p", { className: "mt-1 text-ink-2", children: entry.nextAction })] }))] }, entry.id))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: t("pages.update.noHistory") }))] })] }), _jsx(AlertDialog, { open: showFullUpdateDialog, onOpenChange: setShowFullUpdateDialog, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t("pages.update.confirmFullUpdateTitle") }), _jsx(AlertDialogDescription, { children: t("pages.update.confirmFullUpdateDesc") })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t("common.cancel") }), _jsx(AlertDialogAction, { onClick: handleApplyFullUpdate, children: t("pages.update.applyFullUpdate") })] })] }) })] }));
215
- }
@@ -1,5 +0,0 @@
1
- interface WelcomePageProps {
2
- workspaceId: string;
3
- }
4
- export declare function WelcomePage({ workspaceId }: WelcomePageProps): import("react").JSX.Element;
5
- export {};
@@ -1,187 +0,0 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect, useCallback, useRef } from 'react';
3
- import { useNavigate } from 'react-router-dom';
4
- import { useTranslation } from 'react-i18next';
5
- import { CircuitDiagram } from '../../components/onboarding/CircuitDiagram.js';
6
- import { DemoResultView } from '../../components/onboarding/DemoResultView.js';
7
- import { SlashCommandsCard } from '../../components/onboarding/SlashCommandsCard.js';
8
- import { ONBOARDING_SLASH_COMMANDS } from '../../components/onboarding/slashCommands.js';
9
- import { getOnboardingState, setOnboardingState } from '../../utils/onboarding-state.js';
10
- import { request } from '../../api.js';
11
- // Polling configuration for step 4 evidence detection (spec 6.5.2).
12
- const TWO_HOURS_MS = 2 * 60 * 60 * 1000;
13
- const POLL_INTERVAL_MS = 30 * 1000;
14
- // rc-1/rc-2/rc-4: validate the demo response shape before use.
15
- // The backend owns this shape, but parsed JSON is treated as unknown.
16
- function isDemoStage(value) {
17
- if (typeof value !== 'object' || value === null)
18
- return false;
19
- const name = Object.hasOwn(value, 'name') ? Reflect.get(value, 'name') : undefined;
20
- const status = Object.hasOwn(value, 'status') ? Reflect.get(value, 'status') : undefined;
21
- if (typeof name !== 'string')
22
- return false;
23
- return status === 'passed' || status === 'failed' || status === 'degraded' || status === 'skipped';
24
- }
25
- function parseDemoResponse(value) {
26
- if (typeof value !== 'object' || value === null)
27
- return null;
28
- const v = value;
29
- if (typeof v.simulated !== 'boolean')
30
- return null;
31
- if (typeof v.demo !== 'object' || v.demo === null)
32
- return null;
33
- const d = v.demo;
34
- if (typeof d.status !== 'string')
35
- return null;
36
- const demo = { status: d.status };
37
- if (typeof d.generatedAt === 'string')
38
- demo.generatedAt = d.generatedAt;
39
- if (typeof d.narrative === 'string')
40
- demo.narrative = d.narrative;
41
- if (typeof d.storyDescription === 'string')
42
- demo.storyDescription = d.storyDescription;
43
- if (typeof d.simulated === 'boolean')
44
- demo.simulated = d.simulated;
45
- if (Object.hasOwn(d, 'stages')) {
46
- if (!Array.isArray(d.stages) || !d.stages.every(isDemoStage))
47
- return null;
48
- demo.stages = d.stages;
49
- }
50
- return { demo, simulated: v.simulated };
51
- }
52
- export function WelcomePage({ workspaceId }) {
53
- const { t } = useTranslation();
54
- const navigate = useNavigate();
55
- const [step, setStep] = useState(1);
56
- const [demoStatus, setDemoStatus] = useState('idle');
57
- const [demoResult, setDemoResult] = useState(null);
58
- const [demoError, setDemoError] = useState(null);
59
- const [stateError, setStateError] = useState(null);
60
- const [pollingActive, setPollingActive] = useState(false);
61
- const [pollingStatus, setPollingStatus] = useState('idle');
62
- const [pollingError, setPollingError] = useState(null);
63
- // Refs for polling cleanup (spec 6.5.2 test case 3: unmount clears timers).
64
- const pollingIntervalRef = useRef(null);
65
- const pollingTimeoutRef = useRef(null);
66
- // P2-2B: track consecutive polling errors; after 3, stop polling and surface
67
- // the failure (rc-9: no silent fallback). Reset to 0 on any successful poll.
68
- const errorCountRef = useRef(0);
69
- // P2-3: baseline record count captured when polling starts, so we only
70
- // trigger evidence-found on NEW evidence (not pre-existing records).
71
- const baselineCountRef = useRef(0);
72
- // If onboarding was already completed for this workspace, skip the wizard.
73
- useEffect(() => {
74
- const state = getOnboardingState(workspaceId);
75
- if (state.completed) {
76
- navigate('/focus', { replace: true });
77
- }
78
- }, [workspaceId, navigate]);
79
- const completeOnboarding = useCallback((status) => {
80
- if (!setOnboardingState(workspaceId, {
81
- completed: true,
82
- step: 4,
83
- status,
84
- completedAt: new Date().toISOString(),
85
- })) {
86
- setStateError(t('pages.welcome.stateSaveError'));
87
- return;
88
- }
89
- navigate('/focus', { replace: true });
90
- }, [workspaceId, navigate, t]);
91
- const runDemo = useCallback(async () => {
92
- setDemoStatus('loading');
93
- setDemoError(null);
94
- try {
95
- const response = await request('/api/v1/onboarding/run-demo', { method: 'POST' }, parseDemoResponse);
96
- if (!response.success) {
97
- throw new Error(response.error);
98
- }
99
- setDemoResult(response.data.demo);
100
- setDemoStatus('success');
101
- }
102
- catch (err) {
103
- const message = err instanceof Error ? err.message : 'Demo failed to start';
104
- setDemoError(message);
105
- setDemoStatus('error');
106
- }
107
- }, []);
108
- const skipOnboarding = useCallback(() => {
109
- completeOnboarding('skipped');
110
- }, [completeOnboarding]);
111
- // EP-05 (Loop State Freshness): each poll fetches fresh evidence.
112
- const stopPolling = useCallback(() => {
113
- setPollingActive(false);
114
- if (pollingIntervalRef.current) {
115
- clearInterval(pollingIntervalRef.current);
116
- pollingIntervalRef.current = null;
117
- }
118
- if (pollingTimeoutRef.current) {
119
- clearTimeout(pollingTimeoutRef.current);
120
- pollingTimeoutRef.current = null;
121
- }
122
- }, []);
123
- const startPolling = useCallback(() => {
124
- setPollingActive(true);
125
- setPollingStatus('polling');
126
- setPollingError(null);
127
- errorCountRef.current = 0;
128
- pollingTimeoutRef.current = setTimeout(() => {
129
- setPollingStatus('timeout');
130
- stopPolling();
131
- }, TWO_HOURS_MS);
132
- // P2-3: capture baseline count on first poll, then only trigger
133
- // evidence-found when count exceeds baseline (NEW evidence appeared).
134
- let baselineCaptured = false;
135
- const checkForEvidence = async () => {
136
- try {
137
- const response = await request('/api/v1/evidence-chain');
138
- // P2-A: request() returns { success: false, error } on HTTP/network
139
- // errors instead of throwing. Convert non-success into a thrown error
140
- // so the catch block (error counter + retry UI) actually fires.
141
- if (!response.success) {
142
- throw new Error(response.error || 'Failed to fetch evidence');
143
- }
144
- if (response.data) {
145
- const data = response.data;
146
- if (typeof data === 'object' && data !== null && Object.hasOwn(data, 'records')) {
147
- const records = data.records;
148
- if (Array.isArray(records)) {
149
- // P2-2B: a successful poll with valid data resets the error streak.
150
- errorCountRef.current = 0;
151
- if (!baselineCaptured) {
152
- // First poll: capture baseline count, do not trigger.
153
- baselineCountRef.current = records.length;
154
- baselineCaptured = true;
155
- return;
156
- }
157
- if (records.length > baselineCountRef.current) {
158
- setPollingStatus('evidence-found');
159
- stopPolling();
160
- }
161
- }
162
- }
163
- }
164
- }
165
- catch {
166
- // P2-2B (rc-9: no silent fallback) — surface the failure instead of
167
- // swallowing it. After 3 consecutive errors, stop polling and show the
168
- // error UI so the user can retry rather than waiting up to 2 hours.
169
- errorCountRef.current += 1;
170
- setPollingError(t('pages.welcome.step4.pollingError'));
171
- if (errorCountRef.current >= 3) {
172
- setPollingStatus('error');
173
- stopPolling();
174
- }
175
- }
176
- };
177
- checkForEvidence();
178
- pollingIntervalRef.current = setInterval(checkForEvidence, POLL_INTERVAL_MS);
179
- }, [stopPolling, t]);
180
- // Cleanup on unmount (spec 6.5.2 test case 3: no memory leak).
181
- useEffect(() => {
182
- return () => {
183
- stopPolling();
184
- };
185
- }, [stopPolling]);
186
- return (_jsxs("div", { className: "welcome-page", role: "main", children: [_jsxs("header", { className: "welcome-header", children: [_jsx("h1", { children: t('pages.welcome.title') }), _jsx("p", { className: "welcome-subtitle", children: t('pages.welcome.subtitle') }), _jsx("div", { className: "welcome-step-indicator", role: "progressbar", "aria-valuetext": t('pages.welcome.stepIndicator', { current: step, total: 4 }), children: [1, 2, 3, 4].map((s) => (_jsx("span", { className: `step-dot ${s === step ? 'active' : ''} ${s < step ? 'completed' : ''}` }, s))) })] }), stateError && _jsx("p", { className: "polling-error", role: "alert", children: stateError }), step === 1 && (_jsxs("section", { className: "welcome-step welcome-step-1", "aria-labelledby": "step1-title", children: [_jsx("h2", { id: "step1-title", children: t('pages.welcome.step1.title') }), _jsx("p", { children: t('pages.welcome.step1.description') }), _jsx(CircuitDiagram, {}), _jsxs("div", { className: "welcome-actions", children: [_jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => setStep(2), children: t('pages.welcome.step1.startButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: skipOnboarding, children: t('pages.welcome.step1.skipButton') })] })] })), step === 2 && (_jsxs("section", { className: "welcome-step welcome-step-2", "aria-labelledby": "step2-title", children: [_jsx("h2", { id: "step2-title", children: t('pages.welcome.step2.title') }), _jsx("p", { children: t('pages.welcome.step2.description') }), _jsx(DemoResultView, { result: demoResult, loading: demoStatus === 'loading', error: demoError }), _jsxs("div", { className: "welcome-actions", children: [demoStatus === 'idle' && (_jsx("button", { className: "pd-btn pd-btn-brand", onClick: runDemo, children: t('pages.welcome.step2.runDemoButton') })), (demoStatus === 'success' || demoStatus === 'error') && (_jsx("button", { className: "pd-btn pd-btn-alt", onClick: () => setStep(3), children: t('pages.welcome.step2.nextButton') }))] })] })), step === 3 && (_jsxs("section", { className: "welcome-step welcome-step-3", "aria-labelledby": "step3-title", children: [_jsx("h2", { id: "step3-title", children: t('pages.welcome.step3.title') }), _jsx("p", { children: t('pages.welcome.step3.description') }), _jsx("p", { className: "slash-commands-intro", children: t('pages.welcome.step3.commandsIntro') }), _jsx(SlashCommandsCard, { commands: ONBOARDING_SLASH_COMMANDS }), _jsxs("div", { className: "welcome-actions", children: [_jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => setStep(4), children: t('pages.welcome.step3.nextButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: skipOnboarding, children: t('pages.welcome.step1.skipButton') })] })] })), step === 4 && (_jsxs("section", { className: "welcome-step welcome-step-4", "aria-labelledby": "step4-title", children: [_jsx("h2", { id: "step4-title", children: t('pages.welcome.step4.title') }), _jsx("p", { children: t('pages.welcome.step4.description') }), _jsxs("div", { className: "example-prompt", role: "note", children: [_jsx("span", { className: "prompt-label", children: t('pages.welcome.step4.examplePrompt') }), _jsx("code", { className: "prompt-text", children: t('pages.welcome.step4.examplePromptText') })] }), pollingStatus === 'idle' && (_jsxs(_Fragment, { children: [_jsx("p", { className: "window-hint", children: t('pages.welcome.step4.windowHint') }), _jsxs("div", { className: "welcome-actions", children: [_jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => { startPolling(); }, children: t('pages.welcome.step4.tryNowButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: () => completeOnboarding('demo'), children: t('pages.welcome.step4.goToFocusButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: skipOnboarding, children: t('pages.welcome.step4.skipButton') })] })] })), pollingStatus === 'polling' && (_jsxs("div", { className: "polling-active", role: "status", "aria-live": "polite", children: [_jsx("p", { children: t('pages.welcome.step4.pollingActive') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: () => { stopPolling(); completeOnboarding('demo'); }, children: t('pages.welcome.step4.stopPollingButton') })] })), pollingStatus === 'evidence-found' && (_jsxs("div", { className: "polling-success", role: "status", children: [_jsx("p", { children: t('pages.welcome.step4.evidenceFound') }), _jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => completeOnboarding('evidence_found'), children: t('pages.welcome.step4.goToFocusButton') })] })), pollingStatus === 'timeout' && (_jsxs("div", { className: "polling-timeout", role: "status", children: [_jsx("p", { children: t('pages.welcome.step4.timeoutHint') }), _jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => completeOnboarding('demo'), children: t('pages.welcome.step4.goToFocusButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: skipOnboarding, children: t('pages.welcome.step4.skipButton') })] })), pollingStatus === 'error' && (_jsxs("div", { className: "polling-error", role: "alert", children: [_jsx("p", { children: pollingError ?? t('pages.welcome.step4.pollingError') }), _jsxs("div", { className: "welcome-actions", children: [_jsx("button", { className: "pd-btn pd-btn-brand", onClick: () => { startPolling(); }, children: t('pages.welcome.step4.retryButton') }), _jsx("button", { className: "pd-btn pd-btn-alt", onClick: () => completeOnboarding('demo'), children: t('pages.welcome.step4.goToFocusButton') })] })] }))] }))] }));
187
- }
@@ -1,71 +0,0 @@
1
- /**
2
- * Agent Metadata — Control Center agent grouping & role descriptions
3
- *
4
- * Pure data module (no React, no I/O). Defines:
5
- * - Which dependency cluster each of the 9 internal agents belongs to
6
- * - Bilingual role / detail / impact / tech-detail text for progressive disclosure
7
- * - Whether toggling the agent off requires inline confirmation (isCore)
8
- *
9
- * Content source: design-prototype/control-center.html (approved prototype).
10
- * Agent names match INTERNAL_AGENT_NAMES from @principles/core (camelCase).
11
- *
12
- * ERR entries:
13
- * - rc-1: pure static data, no untrusted input
14
- * - rc-2: no `as` bypasses
15
- * - rc-5: consumers use Object.hasOwn() to look up metadata by agent name
16
- */
17
- import type { InternalAgentName } from '@principles/core/runtime-v2';
18
- export type AgentGroup = 'core_trio' | 'code_chain' | 'quality_polish' | 'sidechain';
19
- export type ImpactLevel = 'danger' | 'amber' | 'green';
20
- export type GroupTag = 'must' | 'recommend' | 'optional' | 'independent';
21
- export interface AgentMeta {
22
- name: InternalAgentName;
23
- group: AgentGroup;
24
- /** 中文角色名(如"诊断师") */
25
- displayNameZh: string;
26
- displayNameEn: string;
27
- /** 一句话角色(L1 折叠态显示) */
28
- roleZh: string;
29
- roleEn: string;
30
- /** 展开后的详细说明(L2),段落用 \n\n 分隔 */
31
- detailZh: string;
32
- detailEn: string;
33
- /** 关掉会怎样(L2 impact box) */
34
- impactLevel: ImpactLevel;
35
- impactZh: string;
36
- impactEn: string;
37
- /** 技术细节(L3 嵌套折叠)— 键为标签,值可含反引号包裹的 code 片段 */
38
- techDetailZh: Record<string, string>;
39
- techDetailEn: Record<string, string>;
40
- /** 是否核心代理(关掉需 inline confirm)。true 对应原型 data-core="true" */
41
- isCore: boolean;
42
- /** MVP 状态说明(可选,仅 philosopher/rolloutReviewer 有) */
43
- mvpNoteZh?: string;
44
- mvpNoteEn?: string;
45
- /** 操作入口(可选,仅侧链代理用于跳转管理页面) */
46
- action?: ActionMeta;
47
- }
48
- /**
49
- * 操作入口(可选,仅侧链代理用于跳转管理页面)
50
- */
51
- export interface ActionMeta {
52
- /** 链接文本(中) */
53
- linkTextZh: string;
54
- /** 链接文本(英) */
55
- linkTextEn: string;
56
- /** 路由路径 */
57
- to: string;
58
- }
59
- export interface AgentGroupMeta {
60
- id: AgentGroup;
61
- labelZh: string;
62
- labelEn: string;
63
- tag: GroupTag;
64
- tagLabelZh: string;
65
- tagLabelEn: string;
66
- hintZh: string;
67
- hintEn: string;
68
- }
69
- export declare const GROUP_ORDER: AgentGroup[];
70
- export declare const AGENT_GROUPS: AgentGroupMeta[];
71
- export declare const AGENT_METADATA: Record<InternalAgentName, AgentMeta>;