create-principles-disciple 1.146.4 → 1.146.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/_release/product-identity.json +1 -1
  2. package/package.json +3 -3
  3. package/release-manager/package.json +3 -3
  4. package/console/dist/ui/App.d.ts +0 -1
  5. package/console/dist/ui/App.js +0 -172
  6. package/console/dist/ui/api.d.ts +0 -611
  7. package/console/dist/ui/api.js +0 -1094
  8. package/console/dist/ui/components/auth/login-form.d.ts +0 -4
  9. package/console/dist/ui/components/auth/login-form.js +0 -142
  10. package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
  11. package/console/dist/ui/components/auth/splash-screen.js +0 -22
  12. package/console/dist/ui/components/error-boundary.d.ts +0 -15
  13. package/console/dist/ui/components/error-boundary.js +0 -30
  14. package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
  15. package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
  16. package/console/dist/ui/components/language-switcher.d.ts +0 -2
  17. package/console/dist/ui/components/language-switcher.js +0 -17
  18. package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
  19. package/console/dist/ui/components/layout/app-sidebar.js +0 -128
  20. package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
  21. package/console/dist/ui/components/layout/page-loading.js +0 -14
  22. package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
  23. package/console/dist/ui/components/layout/page-shell.js +0 -11
  24. package/console/dist/ui/components/layout/section-title.d.ts +0 -10
  25. package/console/dist/ui/components/layout/section-title.js +0 -9
  26. package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
  27. package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
  28. package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
  29. package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
  30. package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
  31. package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
  32. package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
  33. package/console/dist/ui/components/notifications/sound-storage.js +0 -37
  34. package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
  35. package/console/dist/ui/components/notifications/useNotifications.js +0 -9
  36. package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
  37. package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
  38. package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
  39. package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
  40. package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
  41. package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
  42. package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
  43. package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
  44. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
  45. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
  46. package/console/dist/ui/components/theme-provider.d.ts +0 -14
  47. package/console/dist/ui/components/theme-provider.js +0 -40
  48. package/console/dist/ui/components/theme-toggle.d.ts +0 -2
  49. package/console/dist/ui/components/theme-toggle.js +0 -11
  50. package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
  51. package/console/dist/ui/components/ui/alert-dialog.js +0 -26
  52. package/console/dist/ui/components/ui/badge.d.ts +0 -9
  53. package/console/dist/ui/components/ui/badge.js +0 -22
  54. package/console/dist/ui/components/ui/button.d.ts +0 -11
  55. package/console/dist/ui/components/ui/button.js +0 -34
  56. package/console/dist/ui/components/ui/card.d.ts +0 -8
  57. package/console/dist/ui/components/ui/card.js +0 -16
  58. package/console/dist/ui/components/ui/charts.d.ts +0 -51
  59. package/console/dist/ui/components/ui/charts.js +0 -72
  60. package/console/dist/ui/components/ui/dialog.d.ts +0 -19
  61. package/console/dist/ui/components/ui/dialog.js +0 -22
  62. package/console/dist/ui/components/ui/input.d.ts +0 -3
  63. package/console/dist/ui/components/ui/input.js +0 -8
  64. package/console/dist/ui/components/ui/markdown.d.ts +0 -24
  65. package/console/dist/ui/components/ui/markdown.js +0 -119
  66. package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
  67. package/console/dist/ui/components/ui/progress-bar.js +0 -38
  68. package/console/dist/ui/components/ui/select.d.ts +0 -13
  69. package/console/dist/ui/components/ui/select.js +0 -26
  70. package/console/dist/ui/components/ui/separator.d.ts +0 -3
  71. package/console/dist/ui/components/ui/separator.js +0 -6
  72. package/console/dist/ui/components/ui/sheet.d.ts +0 -25
  73. package/console/dist/ui/components/ui/sheet.js +0 -37
  74. package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
  75. package/console/dist/ui/components/ui/shiny-text.js +0 -46
  76. package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
  77. package/console/dist/ui/components/ui/skeleton.js +0 -6
  78. package/console/dist/ui/components/ui/sonner.d.ts +0 -3
  79. package/console/dist/ui/components/ui/sonner.js +0 -13
  80. package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
  81. package/console/dist/ui/components/ui/tooltip.js +0 -10
  82. package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
  83. package/console/dist/ui/data/daily-thoughts.js +0 -164
  84. package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
  85. package/console/dist/ui/hooks/useNotificationSound.js +0 -74
  86. package/console/dist/ui/i18n/en.json +0 -2399
  87. package/console/dist/ui/i18n/index.d.ts +0 -2
  88. package/console/dist/ui/i18n/index.js +0 -32
  89. package/console/dist/ui/i18n/zh-CN.json +0 -2399
  90. package/console/dist/ui/main.d.ts +0 -1
  91. package/console/dist/ui/main.js +0 -9
  92. package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
  93. package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
  94. package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
  95. package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
  96. package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
  97. package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
  98. package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
  99. package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
  100. package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
  101. package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
  102. package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
  103. package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
  104. package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
  105. package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
  106. package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
  107. package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
  108. package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
  109. package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
  110. package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
  111. package/console/dist/ui/pages/debt/DebtPage.js +0 -222
  112. package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
  113. package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
  114. package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
  115. package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
  116. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
  117. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
  118. package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
  119. package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
  120. package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
  121. package/console/dist/ui/pages/focus/FocusPage.js +0 -567
  122. package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
  123. package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
  124. package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
  125. package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
  126. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
  127. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
  128. package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
  129. package/console/dist/ui/pages/focus/focus-validation.js +0 -211
  130. package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
  131. package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
  132. package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
  133. package/console/dist/ui/pages/intent/IntentPage.js +0 -252
  134. package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
  135. package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
  136. package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
  137. package/console/dist/ui/pages/pain/PainPage.js +0 -420
  138. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
  139. package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
  140. package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
  141. package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
  142. package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
  143. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
  144. package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
  145. package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
  146. package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
  147. package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
  148. package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
  149. package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
  150. package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
  151. package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
  152. package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
  153. package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
  154. package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
  155. package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
  156. package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
  157. package/console/dist/ui/utils/agent-metadata.js +0 -284
  158. package/console/dist/ui/utils/approval-review.d.ts +0 -30
  159. package/console/dist/ui/utils/approval-review.js +0 -50
  160. package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
  161. package/console/dist/ui/utils/approval-warning-localization.js +0 -148
  162. package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
  163. package/console/dist/ui/utils/attention-presentation.js +0 -46
  164. package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
  165. package/console/dist/ui/utils/blocker-localization.js +0 -36
  166. package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
  167. package/console/dist/ui/utils/control-center-helpers.js +0 -189
  168. package/console/dist/ui/utils/enum-labels.d.ts +0 -50
  169. package/console/dist/ui/utils/enum-labels.js +0 -171
  170. package/console/dist/ui/utils/format-date.d.ts +0 -11
  171. package/console/dist/ui/utils/format-date.js +0 -17
  172. package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
  173. package/console/dist/ui/utils/onboarding-state.js +0 -77
  174. package/console/dist/ui/utils/reading-layout.d.ts +0 -20
  175. package/console/dist/ui/utils/reading-layout.js +0 -46
  176. package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
  177. package/console/dist/ui/utils/rule-binding-validators.js +0 -188
  178. package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
  179. package/console/dist/ui/utils/runtime-mode.js +0 -11
  180. package/console/dist/ui/utils/token-storage.d.ts +0 -22
  181. package/console/dist/ui/utils/token-storage.js +0 -47
  182. package/console/dist/ui/utils/validators.d.ts +0 -1178
  183. package/console/dist/ui/utils/validators.js +0 -3297
  184. package/release-manager/dist/bootstrap-entry.d.ts +0 -2
  185. package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
  186. package/release-manager/dist/bootstrap-entry.js.map +0 -1
  187. package/release-manager/dist/i18n.d.ts +0 -6
  188. package/release-manager/dist/i18n.d.ts.map +0 -1
  189. package/release-manager/dist/i18n.js.map +0 -1
  190. package/release-manager/dist/index.d.ts +0 -7
  191. package/release-manager/dist/index.d.ts.map +0 -1
  192. package/release-manager/dist/index.js +0 -656
  193. package/release-manager/dist/index.js.map +0 -1
  194. package/release-manager/dist/installer.d.ts +0 -629
  195. package/release-manager/dist/installer.d.ts.map +0 -1
  196. package/release-manager/dist/installer.js.map +0 -1
  197. package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
  198. package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
  199. package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
  200. package/release-manager/dist/installers/index.d.ts +0 -51
  201. package/release-manager/dist/installers/index.d.ts.map +0 -1
  202. package/release-manager/dist/installers/index.js.map +0 -1
  203. package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
  204. package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
  205. package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
  206. package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
  207. package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
  208. package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
  209. package/release-manager/dist/mvp-config.d.ts +0 -233
  210. package/release-manager/dist/mvp-config.d.ts.map +0 -1
  211. package/release-manager/dist/mvp-config.js.map +0 -1
  212. package/release-manager/dist/prompts.d.ts +0 -43
  213. package/release-manager/dist/prompts.d.ts.map +0 -1
  214. package/release-manager/dist/prompts.js +0 -268
  215. package/release-manager/dist/prompts.js.map +0 -1
  216. package/release-manager/dist/skill-language.d.ts +0 -32
  217. package/release-manager/dist/skill-language.d.ts.map +0 -1
  218. package/release-manager/dist/skill-language.js.map +0 -1
  219. package/release-manager/dist/uninstaller.d.ts +0 -68
  220. package/release-manager/dist/uninstaller.d.ts.map +0 -1
  221. package/release-manager/dist/uninstaller.js +0 -746
  222. package/release-manager/dist/uninstaller.js.map +0 -1
  223. package/release-manager/dist/update/apply-payload.d.ts +0 -143
  224. package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
  225. package/release-manager/dist/update/apply-payload.js.map +0 -1
  226. package/release-manager/dist/update/atomic-file.d.ts +0 -35
  227. package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
  228. package/release-manager/dist/update/atomic-file.js.map +0 -1
  229. package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
  230. package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
  231. package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
  232. package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
  233. package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
  234. package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
  235. package/release-manager/dist/update/channel-metadata.d.ts +0 -28
  236. package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
  237. package/release-manager/dist/update/channel-metadata.js.map +0 -1
  238. package/release-manager/dist/update/channel-promotion.d.ts +0 -39
  239. package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
  240. package/release-manager/dist/update/channel-promotion.js +0 -55
  241. package/release-manager/dist/update/channel-promotion.js.map +0 -1
  242. package/release-manager/dist/update/console-surface.d.ts +0 -19
  243. package/release-manager/dist/update/console-surface.d.ts.map +0 -1
  244. package/release-manager/dist/update/console-surface.js.map +0 -1
  245. package/release-manager/dist/update/data-compatibility.d.ts +0 -35
  246. package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
  247. package/release-manager/dist/update/data-compatibility.js +0 -45
  248. package/release-manager/dist/update/data-compatibility.js.map +0 -1
  249. package/release-manager/dist/update/install-layout.d.ts +0 -105
  250. package/release-manager/dist/update/install-layout.d.ts.map +0 -1
  251. package/release-manager/dist/update/install-layout.js.map +0 -1
  252. package/release-manager/dist/update/product-identity.d.ts +0 -70
  253. package/release-manager/dist/update/product-identity.d.ts.map +0 -1
  254. package/release-manager/dist/update/product-identity.js.map +0 -1
  255. package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
  256. package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
  257. package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
  258. package/release-manager/dist/update/release-identity.d.ts +0 -33
  259. package/release-manager/dist/update/release-identity.d.ts.map +0 -1
  260. package/release-manager/dist/update/release-identity.js.map +0 -1
  261. package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
  262. package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
  263. package/release-manager/dist/update/release-manager-authority.js.map +0 -1
  264. package/release-manager/dist/update/release-manager.d.ts +0 -156
  265. package/release-manager/dist/update/release-manager.d.ts.map +0 -1
  266. package/release-manager/dist/update/release-manager.js.map +0 -1
  267. package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
  268. package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
  269. package/release-manager/dist/update/release-metadata-publisher.js +0 -478
  270. package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
  271. package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
  272. package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
  273. package/release-manager/dist/update/release-metadata-source.js.map +0 -1
  274. package/release-manager/dist/update/release-metadata.d.ts +0 -60
  275. package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
  276. package/release-manager/dist/update/release-metadata.js.map +0 -1
  277. package/release-manager/dist/update/release-policy.d.ts +0 -51
  278. package/release-manager/dist/update/release-policy.d.ts.map +0 -1
  279. package/release-manager/dist/update/release-policy.js.map +0 -1
  280. package/release-manager/dist/update/rollback-policy.d.ts +0 -56
  281. package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
  282. package/release-manager/dist/update/rollback-policy.js +0 -61
  283. package/release-manager/dist/update/rollback-policy.js.map +0 -1
  284. package/release-manager/dist/update/transaction-journal.d.ts +0 -212
  285. package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
  286. package/release-manager/dist/update/transaction-journal.js.map +0 -1
  287. package/release-manager/dist/update/trust-metadata.d.ts +0 -55
  288. package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
  289. package/release-manager/dist/update/trust-metadata.js.map +0 -1
  290. package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
  291. package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
  292. package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
  293. package/release-manager/dist/update/update-history.d.ts +0 -46
  294. package/release-manager/dist/update/update-history.d.ts.map +0 -1
  295. package/release-manager/dist/update/update-history.js +0 -123
  296. package/release-manager/dist/update/update-history.js.map +0 -1
  297. package/release-manager/dist/utils/config-file-io.d.ts +0 -34
  298. package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
  299. package/release-manager/dist/utils/config-file-io.js.map +0 -1
  300. package/release-manager/dist/utils/env.d.ts +0 -94
  301. package/release-manager/dist/utils/env.d.ts.map +0 -1
  302. package/release-manager/dist/utils/env.js.map +0 -1
  303. package/release-manager/dist/utils/logger.d.ts +0 -15
  304. package/release-manager/dist/utils/logger.d.ts.map +0 -1
  305. package/release-manager/dist/utils/logger.js.map +0 -1
  306. package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
  307. package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
  308. package/release-manager/dist/utils/workspace-divergence.js.map +0 -1
@@ -1,252 +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 { PageShell } from "../../components/layout/page-shell.js";
6
- import { PageLoading } from "../../components/layout/page-loading.js";
7
- import { SectionTitle } from "../../components/layout/section-title.js";
8
- import { fetchIntentSummary, fetchIntentDecisionSummary, patchFeatureFlag, fetchIntentContent, fetchIntentVersions } from "../../api.js";
9
- import { IntentEditor, CreateIntentButton, EditButton } from "./IntentOnboarding.js";
10
- import { computeVersionDiff } from "@principles/core/runtime-v2/intent-browser";
11
- import { formatDate } from "../../utils/format-date.js";
12
- // ── Sub-components ────────────────────────────────────────────────────────────
13
- function FlagStatusBadge({ enabled }) {
14
- const { t } = useTranslation();
15
- // SPEC §22.1.1: Intent Page must show intent_engineering flag status.
16
- // Badge has a text label, not color-only (SPEC §23.14.10).
17
- const label = enabled
18
- ? t("pages.intent.flagStatus.enabled")
19
- : t("pages.intent.flagStatus.disabled");
20
- return (_jsxs("span", { className: `inline-flex items-center gap-1.5 px-2 py-0.5 rounded-[3px] text-[11px] font-mono border ${enabled
21
- ? "border-emerald/40 text-emerald bg-emerald/5"
22
- : "border-line text-ink-3 bg-surface"}`, role: "status", "aria-label": t("pages.intent.flagStatus.ariaLabel"), children: [_jsx("span", { className: `w-1.5 h-1.5 rounded-full ${enabled ? "bg-emerald" : "bg-ink-4"}`, "aria-hidden": "true" }), label] }));
23
- }
24
- function EditEntry({ filePath }) {
25
- const { t } = useTranslation();
26
- // SPEC §22.1.1 line 1402: Intent Page must show "edit INTENT.md 入口".
27
- // INTENT.md is Owner-owned; PD never auto-modifies it. This entry only
28
- // surfaces the file path so the Owner can edit it in their own editor.
29
- return (_jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-4", children: [_jsx("h3", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-2", children: t("pages.intent.editEntry.title") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-2", children: t("pages.intent.editEntry.description") }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("code", { className: "text-[12px] text-ink-2 bg-surface border border-line rounded-[3px] px-2 py-1 break-all", children: filePath }), _jsx("button", { type: "button", onClick: () => {
30
- // Copy to clipboard — Owner pastes into their editor.
31
- void navigator.clipboard?.writeText(filePath);
32
- }, className: "shrink-0 border border-line bg-surface text-ink-2 rounded-[3px] px-2 py-1 text-[11px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "aria-label": t("pages.intent.editEntry.copyAriaLabel"), children: t("pages.intent.editEntry.copy") })] })] }));
33
- }
34
- function FlagToggleCard({ flagEnabled, onAfterEnable }) {
35
- const { t } = useTranslation();
36
- const [busy, setBusy] = useState(false);
37
- const [acknowledged, setAcknowledged] = useState(false);
38
- // Only show when disabled and not yet acknowledged.
39
- // flagEnabled === true → already on, nothing to toggle.
40
- // acknowledged === true → owner just enabled, parent will re-fetch and
41
- // flagEnabled will flip to true; this prevents a flash of the card.
42
- if (flagEnabled || acknowledged)
43
- return null;
44
- return (_jsxs("div", { className: "bg-panel border border-amber/20 border-l-2 border-l-amber rounded-[6px] p-4 mb-5", children: [_jsx("h2", { className: "text-ink text-[15px] font-semibold mb-2", children: t("pages.intent.flagDisabled.title") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.intent.flagDisabled.description") }), _jsx("button", { type: "button", disabled: busy, onClick: async () => {
45
- setBusy(true);
46
- try {
47
- const res = await patchFeatureFlag("intent_engineering", true);
48
- if (!res.success) {
49
- toast.error(res.error ?? t("pages.intent.flagStatus.enableFailed"));
50
- return;
51
- }
52
- setAcknowledged(true);
53
- onAfterEnable?.();
54
- }
55
- finally {
56
- setBusy(false);
57
- }
58
- }, 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 focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "aria-label": t("pages.intent.flagStatus.enable"), children: busy ? t("pages.intent.flagStatus.enabling") : t("pages.intent.flagStatus.enable") })] }));
59
- }
60
- function NotFoundBanner({ onCreated, lang }) {
61
- const { t } = useTranslation();
62
- return (_jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("h2", { className: "text-ink text-[15px] font-semibold mb-2", children: t("pages.intent.notFound.title") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.intent.notFound.description") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(CreateIntentButton, { onCreated: onCreated, showOnboarding: true, lang: lang }), _jsx("span", { className: "text-ink-4 text-[12px] font-mono", children: t("pages.intent.notFound.nextAction") })] })] }));
63
- }
64
- function OversizedBanner() {
65
- const { t } = useTranslation();
66
- return (_jsxs("div", { className: "bg-panel border border-amber/30 rounded-[6px] p-5", children: [_jsx("h2", { className: "text-ink text-[15px] font-semibold mb-2", children: t("pages.intent.oversized.title") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.intent.oversized.description") }), _jsx("div", { className: "font-mono text-[12px] text-ink-2 bg-surface border border-line rounded-[3px] px-3 py-2", children: t("pages.intent.oversized.nextAction") })] }));
67
- }
68
- function WarningItem({ warning }) {
69
- const { t } = useTranslation();
70
- // SPEC: warnings are rendered as governance hints via i18n code key,
71
- // not raw server-side English message text (P2 i18n fix).
72
- const labelKey = `pages.intent.warnings.${warning.code}`;
73
- return (_jsxs("li", { className: "flex items-start gap-2 text-ink-2 text-[13px]", children: [_jsx("span", { className: "text-amber shrink-0 mt-0.5", "aria-hidden": "true", children: "!" }), _jsxs("span", { children: [_jsx("span", { className: "font-medium", children: t(labelKey) }), warning.section && (_jsxs("span", { className: "text-ink-3 font-mono ml-2", children: ["[", warning.section, "]"] }))] })] }));
74
- }
75
- function SectionContent({ label, content }) {
76
- if (content === undefined || content.trim() === "")
77
- return null;
78
- return (_jsxs("div", { children: [_jsx("h3", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-1.5", children: label }), _jsx("p", { className: "text-ink-2 text-[13px] leading-relaxed whitespace-pre-wrap", children: content })] }));
79
- }
80
- function MetaRow({ label, value }) {
81
- return (_jsxs("div", { className: "flex items-baseline gap-3", children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 w-32 shrink-0", children: label }), _jsx("span", { className: "text-ink-2 text-[12px] font-mono break-all", children: value })] }));
82
- }
83
- function VersionEntry({ version, previousContent, reasonLabel, defaultExpanded = false }) {
84
- const { t, i18n } = useTranslation();
85
- const [expanded, setExpanded] = useState(defaultExpanded);
86
- // Compute section-level diff between previous and this version.
87
- // For the oldest version (no previous), diff against "" so all non-empty
88
- // sections show as "changed" — gives the user a visual of what was filled.
89
- const diff = computeVersionDiff(previousContent, version.contentSnapshot);
90
- // Localize the timestamp for display (avoid showing raw UTC to end users).
91
- const localizedTime = formatDate(version.createdAt, i18n.language, {
92
- year: 'numeric', month: '2-digit', day: '2-digit',
93
- hour: '2-digit', minute: '2-digit',
94
- });
95
- return (_jsxs("div", { className: "border-b border-line last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => setExpanded((prev) => !prev), className: "w-full flex items-center gap-3 py-1.5 text-[12px] font-mono text-ink-2 hover:bg-surface-2/50 transition-colors text-left", "aria-expanded": expanded, "aria-label": expanded ? t("pages.intent.versionDiff.collapseHint") : t("pages.intent.versionDiff.expandHint"), title: version.contentHash, children: [_jsx("span", { className: "text-ink-3 shrink-0 w-4 inline-block", children: expanded ? "▾" : "▸" }), _jsx("span", { className: "text-ink-3 shrink-0", children: localizedTime }), _jsx("span", { className: "px-1.5 py-0.5 rounded-[2px] bg-surface-2 text-ink-3 shrink-0", children: reasonLabel }), _jsx("span", { className: "text-ink-4 text-[11px] ml-auto shrink-0 hidden sm:inline", children: expanded ? t("pages.intent.versionDiff.collapseHint") : t("pages.intent.versionDiff.expandHint") })] }), expanded && (_jsx("div", { className: "pb-2.5 pl-7 pr-2", children: _jsx("div", { className: "flex flex-wrap gap-1.5 mb-2", children: diff.map((d) => {
96
- // d.section is one of the 5 section keys from computeVersionDiff's
97
- // SECTION_KEYS — safe to construct the i18n key dynamically.
98
- const labelKey = `pages.intent.wizard.stepLabels.${d.section}`;
99
- return (_jsxs("span", { className: `inline-flex items-center gap-1 px-1.5 py-0.5 rounded-[2px] text-[11px] font-mono border ${d.changed
100
- ? "border-amber/40 text-amber bg-amber/5"
101
- : "border-line text-ink-3 bg-surface"}`, children: [_jsx("span", { className: `w-1.5 h-1.5 rounded-full ${d.changed ? "bg-amber" : "bg-ink-4"}`, "aria-hidden": "true" }), t(labelKey), _jsx("span", { className: "text-ink-4 ml-0.5", children: d.changed ? t("pages.intent.versionDiff.changed") : t("pages.intent.versionDiff.unchanged") })] }, d.section));
102
- }) }) }))] }));
103
- }
104
- // Static mapping from ownerAction enum value to its i18n label key.
105
- // Avoids dynamic string construction so i18n extraction tools can find keys.
106
- const DECISION_COUNT_LABEL_KEYS = [
107
- { action: "confirm_drift", labelKey: "pages.intent.decisions.countConfirmDrift" },
108
- { action: "revise_intent", labelKey: "pages.intent.decisions.countReviseIntent" },
109
- { action: "observe", labelKey: "pages.intent.decisions.countObserve" },
110
- { action: "dismiss", labelKey: "pages.intent.decisions.countDismiss" },
111
- { action: "promote_to_principle", labelKey: "pages.intent.decisions.countPromoteToPrinciple" },
112
- { action: "promote_to_rulehost", labelKey: "pages.intent.decisions.countPromoteToRulehost" },
113
- ];
114
- function DecisionSummarySection() {
115
- const { t } = useTranslation();
116
- const [state, setState] = useState("loading");
117
- const [summary, setSummary] = useState(null);
118
- const loadSummary = useCallback(async () => {
119
- setState("loading");
120
- const result = await fetchIntentDecisionSummary();
121
- if (!result.success) {
122
- // ERR-002: graceful degradation with reason; section collapses to a single line.
123
- setState("error");
124
- return;
125
- }
126
- setSummary(result.data);
127
- setState("loaded");
128
- }, []);
129
- useEffect(() => {
130
- loadSummary();
131
- }, [loadSummary]);
132
- return (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-decisions", children: [_jsx(SectionTitle, { id: "section-decisions", children: t("pages.intent.decisions.sectionTitle") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.intent.decisions.sectionSubtitle") }), state === "loading" && (_jsx("div", { className: "bg-panel border border-line rounded-[6px] p-4 text-ink-3 text-[13px]", children: t("common.loading") })), state === "error" && (_jsx("div", { className: "bg-panel border border-line rounded-[6px] p-4 text-ink-3 text-[13px]", children: t("pages.intent.decisions.loadError") })), state === "loaded" && summary && (_jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-4", children: [_jsx("dl", { className: "grid grid-cols-2 gap-x-6 gap-y-2 sm:grid-cols-3", children: DECISION_COUNT_LABEL_KEYS.map(({ action, labelKey }) => {
133
- const count = summary.counts[action];
134
- return (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("dt", { className: "text-ink-3 text-[12px]", children: t(labelKey) }), _jsx("dd", { className: "text-ink font-mono text-[13px]", children: count })] }, action));
135
- }) }), _jsx("div", { className: "mt-4 pt-3 border-t border-line", children: summary.lastDecisionAt === null ? (_jsx("p", { className: "text-ink-4 text-[12px]", children: t("pages.intent.decisions.noDecisions") })) : (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("pages.intent.decisions.lastDecisionAtLabel") }), _jsx("span", { className: "text-ink-2 text-[12px] font-mono break-all", children: summary.lastDecisionAt })] })) })] }))] }));
136
- }
137
- // ── Main page component ──────────────────────────────────────────────────────
138
- export function IntentPage() {
139
- const { t } = useTranslation();
140
- const [data, setData] = useState(null);
141
- const [pageState, setPageState] = useState("loading");
142
- const [errorMsg, setErrorMsg] = useState(null);
143
- // PRI-477: inline editor state
144
- const [isEditing, setIsEditing] = useState(false);
145
- const [editorContent, setEditorContent] = useState("");
146
- const [editorLoading, setEditorLoading] = useState(false);
147
- // Bilingual: language selector state
148
- const [lang, setLang] = useState('zh-CN');
149
- // Version history
150
- const [versions, setVersions] = useState([]);
151
- // Map raw backend reason codes to localized labels for the version history panel.
152
- // Unknown reasons fall back to the raw string (observability over silent masking).
153
- const versionReasonLabel = useCallback((reason) => {
154
- if (reason === 'init')
155
- return t("pages.intent.versionHistory.reasonInit");
156
- if (reason === 'save')
157
- return t("pages.intent.versionHistory.reasonSave");
158
- return reason;
159
- }, [t]);
160
- const loadData = useCallback(async () => {
161
- setPageState("loading");
162
- setErrorMsg(null);
163
- const result = await fetchIntentSummary(lang);
164
- if (!result.success) {
165
- // ERR-002: graceful degradation with reason
166
- setErrorMsg(result.error ?? t("pages.intent.loadError"));
167
- setPageState("error");
168
- return;
169
- }
170
- // result.data is already validated by validateIntentSummary in the API layer
171
- setData(result.data);
172
- setPageState("loaded");
173
- // Load version history in parallel (best-effort, never blocks page)
174
- fetchIntentVersions(lang).then(v => {
175
- if (v.success && v.data?.versions) {
176
- setVersions(v.data.versions);
177
- }
178
- }).catch(() => { });
179
- }, [t, lang]);
180
- useEffect(() => {
181
- loadData();
182
- }, [loadData]);
183
- // P0 fix: when language changes, reset editor state and stale versions.
184
- // Without this, switching language while editing would keep the editor open
185
- // with the old language's content — and saving would write that content
186
- // into the NEW language's file (data corruption).
187
- // Also clears stale versions so the panel doesn't show the old language's
188
- // history while the new language's fetch is in flight or has failed.
189
- useEffect(() => {
190
- setIsEditing(false);
191
- setEditorContent("");
192
- setVersions([]);
193
- }, [lang]);
194
- // PRI-477: Called when user clicks "Edit" — fetch raw content and open editor
195
- const handleStartEdit = useCallback(async () => {
196
- setEditorLoading(true);
197
- const result = await fetchIntentContent(lang);
198
- setEditorLoading(false);
199
- if (!result.success) {
200
- toast.error(t("pages.intent.loadError"));
201
- return;
202
- }
203
- setEditorContent(result.data.content);
204
- setIsEditing(true);
205
- }, [t, lang]);
206
- // PRI-477: Called when template is created — refresh summary; optionally
207
- // open the editor immediately so the user can start filling.
208
- //
209
- // PR-1083 review (CodeRabbit A5): `openEditor` lets CreateIntentButton
210
- // distinguish "Start filling" (open editor) from "Skip" (just refresh the
211
- // summary so NotFoundBanner re-renders to the sections view — otherwise the
212
- // user would see a stale "file not found" banner even though INTENT.md now
213
- // exists on disk).
214
- const handleCreated = useCallback(async (openEditor) => {
215
- await loadData();
216
- if (!openEditor)
217
- return;
218
- setEditorLoading(true);
219
- const result = await fetchIntentContent(lang);
220
- setEditorLoading(false);
221
- if (result.success) {
222
- setEditorContent(result.data.content);
223
- setIsEditing(true);
224
- }
225
- }, [loadData, lang]);
226
- // PRI-477: Called after successful save — close editor and refresh summary
227
- const handleSaved = useCallback(() => {
228
- setIsEditing(false);
229
- void loadData();
230
- }, [loadData]);
231
- // PRI-477: Called when user cancels editing
232
- const handleCancelEdit = useCallback(() => {
233
- setIsEditing(false);
234
- }, []);
235
- // ── Loading state ────────────────────────────────────────────────────────
236
- if (pageState === "loading") {
237
- return (_jsx(PageShell, { children: _jsx(PageLoading, { cardCount: 3, label: t("common.loading") }) }));
238
- }
239
- // ── Error state (ERR-002: degradation with reason) ───────────────────────
240
- if (pageState === "error") {
241
- return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.intent.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.intent.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.intent.loadError") }), errorMsg && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMsg }))] }), _jsx("div", { className: "mt-4", children: _jsx("button", { type: "button", onClick: loadData, 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.refresh") }) })] }));
242
- }
243
- // ── Loaded state ─────────────────────────────────────────────────────────
244
- const summary = data;
245
- 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.intent.eyebrow") }), _jsxs("div", { className: "flex items-center gap-3 mb-2", children: [_jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink", children: t("pages.intent.title") }), summary && (_jsx(FlagStatusBadge, { enabled: summary.flagEnabled })), _jsxs("select", { value: lang, onChange: (e) => setLang(e.target.value), disabled: isEditing || editorLoading, className: "ml-auto border border-line bg-surface text-ink-2 rounded-[3px] px-2 py-1 text-[12px] font-mono focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed", "aria-label": t("pages.intent.langSelector.ariaLabel"), title: isEditing || editorLoading ? t("pages.intent.langSelector.disabledWhileEditing") : undefined, children: [_jsx("option", { value: "zh-CN", children: "\u4E2D\u6587" }), _jsx("option", { value: "en", children: "English" })] })] }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.intent.subtitle") }), summary && !summary.flagEnabled && (_jsx(FlagToggleCard, { flagEnabled: summary.flagEnabled, onAfterEnable: loadData })), summary && summary.flagEnabled && !summary.found && summary.reason === "not_found" && (_jsx(NotFoundBanner, { onCreated: handleCreated, lang: lang })), summary && summary.flagEnabled && summary.found && summary.reason === "oversized" && (_jsx(OversizedBanner, {})), summary && summary.flagEnabled && summary.ok && summary.sections && (_jsxs(_Fragment, { children: [isEditing && (_jsx("section", { "aria-labelledby": "section-editor", className: "mb-8", children: _jsx(IntentEditor, { initialContent: editorContent, onSaved: handleSaved, onCancel: handleCancelEdit, lang: lang }) })), !isEditing && (_jsxs(_Fragment, { children: [_jsxs("section", { "aria-labelledby": "section-content", children: [_jsxs("div", { className: "flex items-center justify-between mb-3", children: [_jsx(SectionTitle, { id: "section-content", children: t("pages.intent.title") }), _jsx(EditButton, { onClick: handleStartEdit, loading: editorLoading })] }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5 space-y-5", children: [_jsx(SectionContent, { label: t("pages.intent.sections.why"), content: summary.sections.why }), _jsx(SectionContent, { label: t("pages.intent.sections.desiredOutcome"), content: summary.sections.desiredOutcome }), _jsx(SectionContent, { label: t("pages.intent.sections.nonNegotiables"), content: summary.sections.nonNegotiables }), _jsx(SectionContent, { label: t("pages.intent.sections.stopEscalation"), content: summary.sections.stopEscalation }), _jsx(SectionContent, { label: t("pages.intent.sections.currentStrategicFocus"), content: summary.sections.currentStrategicFocus })] })] }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-warnings", children: [_jsx(SectionTitle, { id: "section-warnings", children: t("pages.intent.warnings.title") }), summary.warnings.length === 0 ? (_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed", children: t("pages.intent.warnings.empty") })) : (_jsx("ul", { className: "bg-panel border border-line rounded-[6px] p-4 space-y-2", children: summary.warnings.map((w, i) => (_jsx(WarningItem, { warning: w }, i))) }))] }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-meta", children: [_jsx(SectionTitle, { id: "section-meta", children: t("pages.intent.meta.title") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-4 space-y-2", children: [summary.lastEditedAt && (_jsx(MetaRow, { label: t("pages.intent.meta.lastEditedAt"), value: summary.lastEditedAt })), summary.contentHash && (_jsx(MetaRow, { label: t("pages.intent.meta.contentHash"), value: summary.contentHash })), summary.path && (_jsx(MetaRow, { label: t("pages.intent.meta.path"), value: summary.path }))] })] }), summary.path && (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-edit", children: [_jsx(SectionTitle, { id: "section-edit", children: t("pages.intent.editEntry.heading") }), _jsx(EditEntry, { filePath: summary.path })] }))] }))] })), summary && summary.flagEnabled && !summary.ok && summary.reason && summary.reason !== "not_found" && summary.reason !== "oversized" && (_jsxs("div", { className: "bg-panel border border-red-200 rounded-[6px] p-5", children: [_jsx("h2", { className: "text-ink text-[15px] font-semibold mb-2", children: t("pages.intent.loadError") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3 font-mono", children: summary.reason }), summary.nextAction && (_jsx("p", { className: "text-ink-2 text-[13px] leading-relaxed", children: summary.nextAction }))] })), summary && summary.flagEnabled && (_jsx(DecisionSummarySection, {})), versions.length > 0 && (_jsxs("details", { className: "border border-line rounded-[3px] mt-6", children: [_jsxs("summary", { className: "cursor-pointer px-4 py-2 text-[13px] font-medium text-ink-2 select-none", children: [t("pages.intent.versionHistory.title"), " (", versions.length, ")"] }), _jsx("div", { className: "px-4 py-2 border-t border-line", children: versions.map((v, idx) => {
246
- // versions are sorted newest-first; previous = idx + 1.
247
- // For the oldest version (no previous), diff against "" so
248
- // all filled sections show as "changed".
249
- const previousContent = versions[idx + 1]?.contentSnapshot ?? "";
250
- return (_jsx(VersionEntry, { version: v, previousContent: previousContent, reasonLabel: versionReasonLabel(v.reason), defaultExpanded: idx === 0 }, v.id));
251
- }) })] }))] }) }));
252
- }
@@ -1,59 +0,0 @@
1
- /**
2
- * Runtime validators and derivation logic for Pain Evidence page data.
3
- *
4
- * Derives behavior evidence from existing principles data — no new backend
5
- * route needed. Principles with `derivedFromPainIds` or `painPreventedCount > 0`
6
- * represent evidence that was captured and internalized.
7
- *
8
- * This follows H-section rules and ERR-001/005/009/010.
9
- */
10
- export interface PainEvidence {
11
- /** The principle ID that was derived from this pain evidence */
12
- id: string;
13
- /** Principle text — serves as the evidence title */
14
- title: string;
15
- /** The trigger pattern — describes the context where the deviation occurred */
16
- context: string;
17
- /** The action — describes what the agent should do instead */
18
- expectedBehavior: string;
19
- /** Source: always 'principle_derivation' since we derive from principles */
20
- source: 'principle_derivation';
21
- /** Maps principle status to recommendation state */
22
- recommendationState: 'pending' | 'candidate' | 'principle' | 'dismissed';
23
- /** Pain-related metadata from the principle */
24
- trajectorySummary: {
25
- principleId: string;
26
- painPreventedCount: number;
27
- lastPainPreventedAt: string;
28
- derivedFromPainIds: string[];
29
- };
30
- createdAt: string;
31
- }
32
- export interface PainEvidenceListData {
33
- evidence: PainEvidence[];
34
- generatedAt: string;
35
- /** Present when data is degraded/missing rather than genuinely zero */
36
- note?: string;
37
- }
38
- export interface PainEvidenceDegraded {
39
- reason: string;
40
- nextAction: string;
41
- }
42
- /**
43
- * Derive a single PainEvidence from a principle list item + detail.
44
- * Returns null if the principle has no pain-related data.
45
- */
46
- export declare function derivePainEvidenceFromPrinciple(listItem: unknown, detail?: unknown): PainEvidence | null;
47
- /**
48
- * Validate the principles list response and derive pain evidence.
49
- * Uses existing /api/principles data — no new backend route needed.
50
- */
51
- export declare function derivePainEvidenceFromPrinciplesList(raw: unknown): PainEvidenceListData | PainEvidenceDegraded;
52
- /**
53
- * Check if a parsed result is degraded (missing data).
54
- */
55
- export declare function isDegraded(result: PainEvidenceListData | PainEvidenceDegraded): result is PainEvidenceDegraded;
56
- /**
57
- * Get error message from an unknown API error.
58
- */
59
- export declare function getErrorMessage(err: unknown): string;
@@ -1,125 +0,0 @@
1
- /**
2
- * Runtime validators and derivation logic for Pain Evidence page data.
3
- *
4
- * Derives behavior evidence from existing principles data — no new backend
5
- * route needed. Principles with `derivedFromPainIds` or `painPreventedCount > 0`
6
- * represent evidence that was captured and internalized.
7
- *
8
- * This follows H-section rules and ERR-001/005/009/010.
9
- */
10
- // ── Validators ────────────────────────────────────────────────────────────────
11
- const VALID_PRINCIPLE_STATUSES = ['candidate', 'active', 'archived', 'deprecated', 'probation'];
12
- function isString(value) {
13
- return typeof value === 'string';
14
- }
15
- function isNumber(value) {
16
- return typeof value === 'number' && !Number.isNaN(value);
17
- }
18
- function isRecord(value) {
19
- return typeof value === 'object' && value !== null && !Array.isArray(value);
20
- }
21
- /**
22
- * Map a principle status to a pain evidence recommendationState.
23
- * - candidate → pending (not yet reviewed)
24
- * - active → principle (internalized)
25
- * - probation → candidate (under review)
26
- * - archived/deprecated → dismissed
27
- */
28
- function mapRecommendationState(status) {
29
- switch (status) {
30
- case 'candidate': return 'pending';
31
- case 'active': return 'principle';
32
- case 'probation': return 'candidate';
33
- case 'archived':
34
- case 'deprecated': return 'dismissed';
35
- default: return 'pending';
36
- }
37
- }
38
- /**
39
- * Derive a single PainEvidence from a principle list item + detail.
40
- * Returns null if the principle has no pain-related data.
41
- */
42
- export function derivePainEvidenceFromPrinciple(listItem, detail) {
43
- if (!isRecord(listItem))
44
- return null;
45
- // Must have pain-related fields
46
- const { painPreventedCount, derivedFromPainIds, lastPainPreventedAt } = detail && isRecord(detail) ? detail : listItem;
47
- const painCount = isNumber(painPreventedCount) ? painPreventedCount : 0;
48
- const painIds = Array.isArray(derivedFromPainIds)
49
- ? derivedFromPainIds.filter(isString)
50
- : [];
51
- const lastPainAt = isString(lastPainPreventedAt) ? lastPainPreventedAt : '';
52
- // Only derive evidence if there's actual pain data
53
- if (painCount === 0 && painIds.length === 0 && !lastPainAt) {
54
- return null;
55
- }
56
- // Required fields from list item
57
- const { id, text, triggerPattern, action, status, createdAt } = listItem;
58
- if (!isString(id) || !isString(text))
59
- return null;
60
- const principleStatus = isString(status) && VALID_PRINCIPLE_STATUSES.includes(status)
61
- ? status
62
- : 'candidate';
63
- return {
64
- id,
65
- title: isString(text) ? text : '',
66
- context: isString(triggerPattern) ? triggerPattern : '',
67
- expectedBehavior: isString(action) ? action : '',
68
- source: 'principle_derivation',
69
- recommendationState: mapRecommendationState(principleStatus),
70
- trajectorySummary: {
71
- principleId: id,
72
- painPreventedCount: painCount,
73
- lastPainPreventedAt: lastPainAt,
74
- derivedFromPainIds: painIds,
75
- },
76
- createdAt: isString(createdAt) ? createdAt : new Date().toISOString(),
77
- };
78
- }
79
- /**
80
- * Validate the principles list response and derive pain evidence.
81
- * Uses existing /api/principles data — no new backend route needed.
82
- */
83
- export function derivePainEvidenceFromPrinciplesList(raw) {
84
- if (!isRecord(raw)) {
85
- return {
86
- reason: 'Invalid response format from server',
87
- nextAction: 'Try refreshing the page. If the problem persists, check the Console API.',
88
- };
89
- }
90
- const { principles: rawPrinciples } = raw;
91
- if (!Array.isArray(rawPrinciples)) {
92
- return {
93
- reason: 'Response missing principles array',
94
- nextAction: 'Try refreshing the page.',
95
- };
96
- }
97
- // Derive evidence from each principle (ERR-005/007: validate array element types)
98
- const evidence = [];
99
- for (const item of rawPrinciples) {
100
- const derived = derivePainEvidenceFromPrinciple(item);
101
- if (derived !== null) {
102
- evidence.push(derived);
103
- }
104
- }
105
- return {
106
- evidence,
107
- generatedAt: new Date().toISOString(),
108
- };
109
- }
110
- /**
111
- * Check if a parsed result is degraded (missing data).
112
- */
113
- export function isDegraded(result) {
114
- return !Object.hasOwn(result, 'evidence');
115
- }
116
- /**
117
- * Get error message from an unknown API error.
118
- */
119
- export function getErrorMessage(err) {
120
- if (err instanceof Error)
121
- return err.message;
122
- if (typeof err === 'string')
123
- return err;
124
- return 'Unknown error';
125
- }
@@ -1 +0,0 @@
1
- export declare function PainPage(): import("react").JSX.Element;