create-principles-disciple 1.82.0 → 1.83.0

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 (494) hide show
  1. package/console/dist/server/config/pd-config-store.d.ts +135 -0
  2. package/console/dist/server/config/pd-config-store.js +660 -0
  3. package/console/dist/server/index.js +40 -389
  4. package/console/dist/server/models/ActivationsConsoleModel.d.ts +33 -0
  5. package/console/dist/server/models/ActivationsConsoleModel.js +112 -0
  6. package/console/dist/server/models/ApprovalsConsoleModel.d.ts +5 -0
  7. package/console/dist/server/models/ApprovalsConsoleModel.js +14 -0
  8. package/console/dist/server/models/ApprovalsGroupedConsoleModel.d.ts +25 -0
  9. package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +126 -0
  10. package/console/dist/server/models/ConsoleLifecycleDatasource.d.ts +13 -0
  11. package/console/dist/server/models/ConsoleLifecycleDatasource.js +73 -0
  12. package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +58 -0
  13. package/console/dist/server/models/EvidenceChainConsoleModel.js +493 -0
  14. package/console/dist/server/models/GovernanceConsoleModel.d.ts +74 -0
  15. package/console/dist/server/models/GovernanceConsoleModel.js +246 -0
  16. package/console/dist/server/models/HealthCheckModel.d.ts +0 -4
  17. package/console/dist/server/models/HealthCheckModel.js +49 -80
  18. package/console/dist/server/models/LifecycleConsoleModel.d.ts +19 -0
  19. package/console/dist/server/models/LifecycleConsoleModel.js +55 -0
  20. package/console/dist/server/models/PrincipleClassifier.d.ts +41 -0
  21. package/console/dist/server/models/PrincipleClassifier.js +100 -0
  22. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +12 -1
  23. package/console/dist/server/models/PrinciplesConsoleModel.js +53 -6
  24. package/console/dist/server/models/WorkspaceService.d.ts +2 -1
  25. package/console/dist/server/models/WorkspaceService.js +51 -23
  26. package/console/dist/server/routes/activations.d.ts +3 -0
  27. package/console/dist/server/routes/activations.js +111 -0
  28. package/console/dist/server/routes/approvals-grouped.d.ts +3 -0
  29. package/console/dist/server/routes/approvals-grouped.js +32 -0
  30. package/console/dist/server/routes/approvals.js +28 -4
  31. package/console/dist/server/routes/config.d.ts +27 -0
  32. package/console/dist/server/routes/config.js +213 -0
  33. package/console/dist/server/routes/evidence-chain.d.ts +9 -0
  34. package/console/dist/server/routes/evidence-chain.js +32 -0
  35. package/console/dist/server/routes/governance.d.ts +3 -0
  36. package/console/dist/server/routes/governance.js +32 -0
  37. package/console/dist/server/routes/{evolution.d.ts → lifecycle.d.ts} +2 -2
  38. package/console/dist/server/routes/lifecycle.js +48 -0
  39. package/console/dist/server/routes/principles.js +74 -1
  40. package/console/dist/server/routes/workspaces.js +8 -1
  41. package/console/dist/server/utils/response.d.ts +1 -1
  42. package/console/dist/server/utils/response.js +6 -2
  43. package/console/dist/types.d.ts +1 -0
  44. package/console/dist/ui/App.js +116 -40
  45. package/console/dist/ui/api.d.ts +88 -501
  46. package/console/dist/ui/api.js +139 -162
  47. package/console/dist/ui/components/approval-card.js +1 -1
  48. package/console/dist/ui/components/approval-detail-dialog.js +1 -1
  49. package/console/dist/ui/components/auth/login-form.d.ts +3 -0
  50. package/console/dist/ui/components/auth/login-form.js +36 -0
  51. package/console/dist/ui/components/auth/splash-screen.d.ts +8 -0
  52. package/console/dist/ui/components/auth/splash-screen.js +22 -0
  53. package/console/dist/ui/components/layout/app-sidebar.d.ts +1 -0
  54. package/console/dist/ui/components/layout/app-sidebar.js +56 -0
  55. package/console/dist/ui/components/layout/page-shell.d.ts +11 -0
  56. package/console/dist/ui/components/layout/page-shell.js +10 -0
  57. package/console/dist/ui/components/layout/section-title.d.ts +10 -0
  58. package/console/dist/ui/components/layout/section-title.js +9 -0
  59. package/console/dist/ui/components/theme-provider.d.ts +1 -1
  60. package/console/dist/ui/components/theme-provider.js +13 -8
  61. package/console/dist/ui/components/theme-toggle.js +2 -21
  62. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  63. package/console/dist/ui/components/ui/badge.js +7 -5
  64. package/console/dist/ui/components/ui/button.d.ts +2 -2
  65. package/console/dist/ui/components/ui/button.js +12 -11
  66. package/console/dist/ui/components/ui/card.js +6 -6
  67. package/console/dist/ui/components/ui/sheet.d.ts +1 -1
  68. package/console/dist/ui/i18n/en.json +401 -343
  69. package/console/dist/ui/i18n/index.js +2 -2
  70. package/console/dist/ui/i18n/zh-CN.json +406 -348
  71. package/console/dist/ui/main.d.ts +1 -1
  72. package/console/dist/ui/main.js +1 -0
  73. package/console/dist/ui/pages/activation/ActivationPage.d.ts +1 -0
  74. package/console/dist/ui/pages/activation/ActivationPage.js +150 -0
  75. package/console/dist/ui/pages/activation/ActivationValidators.d.ts +20 -0
  76. package/console/dist/ui/pages/activation/ActivationValidators.js +156 -0
  77. package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +1 -0
  78. package/console/dist/ui/pages/control-center/ControlCenterPage.js +447 -0
  79. package/console/dist/ui/pages/debt/DebtPage.d.ts +1 -0
  80. package/console/dist/ui/pages/debt/DebtPage.js +5 -0
  81. package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +1 -0
  82. package/console/dist/ui/pages/design-system/DesignSystemPage.js +30 -0
  83. package/console/dist/ui/pages/focus/FocusPage.d.ts +1 -0
  84. package/console/dist/ui/pages/focus/FocusPage.js +265 -0
  85. package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +59 -0
  86. package/console/dist/ui/pages/pain/PainEvidenceValidators.js +125 -0
  87. package/console/dist/ui/pages/pain/PainPage.js +136 -0
  88. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +264 -0
  89. package/console/dist/ui/pages/principles/PrinciplesPage.js +244 -0
  90. package/console/dist/ui/pages/report-problem/ReportProblemPage.js +245 -0
  91. package/console/dist/ui/pages/settings/SettingsPage.d.ts +4 -0
  92. package/console/dist/ui/pages/settings/SettingsPage.js +202 -0
  93. package/console/dist/ui/pages/settings/UpdatePage.d.ts +5 -0
  94. package/console/dist/ui/pages/settings/UpdatePage.js +168 -0
  95. package/console/dist/ui/utils/control-center-helpers.d.ts +58 -0
  96. package/console/dist/ui/utils/control-center-helpers.js +152 -0
  97. package/console/dist/ui/utils/validators.d.ts +350 -0
  98. package/console/dist/ui/utils/validators.js +995 -0
  99. package/console/dist/web/assets/app.css +672 -902
  100. package/console/dist/web/assets/app.js +6404 -15347
  101. package/console/dist/web/assets/jetbrains-mono-cyrillic-400-normal-C5JECUCT.woff2 +0 -0
  102. package/console/dist/web/assets/jetbrains-mono-cyrillic-400-normal-FGCZYWMY.woff +0 -0
  103. package/console/dist/web/assets/jetbrains-mono-cyrillic-ext-400-normal-C7IFWGF6.woff2 +0 -0
  104. package/console/dist/web/assets/jetbrains-mono-cyrillic-ext-400-normal-PWXUA557.woff +0 -0
  105. package/console/dist/web/assets/jetbrains-mono-greek-400-normal-JJNQZMPZ.woff +0 -0
  106. package/console/dist/web/assets/jetbrains-mono-greek-400-normal-O7JTTR3P.woff2 +0 -0
  107. package/console/dist/web/assets/jetbrains-mono-latin-400-normal-3OOWLGQ2.woff2 +0 -0
  108. package/console/dist/web/assets/jetbrains-mono-latin-400-normal-WDD34GPP.woff +0 -0
  109. package/console/dist/web/assets/jetbrains-mono-latin-ext-400-normal-55RNMRQS.woff +0 -0
  110. package/console/dist/web/assets/jetbrains-mono-latin-ext-400-normal-JVR3IR4Z.woff2 +0 -0
  111. package/console/dist/web/assets/jetbrains-mono-vietnamese-400-normal-7ULXAK72.woff +0 -0
  112. package/console/dist/web/assets/jetbrains-mono-vietnamese-400-normal-KU7YLUPA.woff2 +0 -0
  113. package/console/package.json +2 -1
  114. package/core/dist/runtime-v2/__tests__/admission-gate.test.js +49 -0
  115. package/core/dist/runtime-v2/__tests__/admission-gate.test.js.map +1 -1
  116. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +16 -1
  117. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  118. package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts +21 -0
  119. package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts.map +1 -0
  120. package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.js +354 -0
  121. package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.js.map +1 -0
  122. package/core/dist/runtime-v2/__tests__/language-directive.test.d.ts +12 -0
  123. package/core/dist/runtime-v2/__tests__/language-directive.test.d.ts.map +1 -0
  124. package/core/dist/runtime-v2/__tests__/language-directive.test.js +162 -0
  125. package/core/dist/runtime-v2/__tests__/language-directive.test.js.map +1 -0
  126. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +23 -1
  127. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  128. package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +48 -3
  129. package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
  130. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +13 -1
  131. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  132. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts +12 -0
  133. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts.map +1 -0
  134. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js +194 -0
  135. package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js.map +1 -0
  136. package/core/dist/runtime-v2/__tests__/runtime-config-boundary.test.js +5 -3
  137. package/core/dist/runtime-v2/__tests__/runtime-config-boundary.test.js.map +1 -1
  138. package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +1 -0
  139. package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
  140. package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js +54 -0
  141. package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js.map +1 -1
  142. package/core/dist/runtime-v2/activation/__tests__/memory-activation-state-store.test.js +15 -2
  143. package/core/dist/runtime-v2/activation/__tests__/memory-activation-state-store.test.js.map +1 -1
  144. package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js +10 -0
  145. package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js.map +1 -1
  146. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +17 -2
  147. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  148. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +36 -0
  149. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  150. package/core/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
  151. package/core/dist/runtime-v2/activation/activation-dispatcher.js +1 -1
  152. package/core/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
  153. package/core/dist/runtime-v2/activation/activation-types.d.ts +10 -0
  154. package/core/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
  155. package/core/dist/runtime-v2/activation/activation-types.js.map +1 -1
  156. package/core/dist/runtime-v2/activation/approval-queue.d.ts +6 -0
  157. package/core/dist/runtime-v2/activation/approval-queue.d.ts.map +1 -1
  158. package/core/dist/runtime-v2/activation/approval-queue.js +3 -0
  159. package/core/dist/runtime-v2/activation/approval-queue.js.map +1 -1
  160. package/core/dist/runtime-v2/activation/memory-activation-state-store.d.ts +2 -0
  161. package/core/dist/runtime-v2/activation/memory-activation-state-store.d.ts.map +1 -1
  162. package/core/dist/runtime-v2/activation/memory-activation-state-store.js +17 -1
  163. package/core/dist/runtime-v2/activation/memory-activation-state-store.js.map +1 -1
  164. package/core/dist/runtime-v2/activation/memory-approval-store.d.ts +6 -0
  165. package/core/dist/runtime-v2/activation/memory-approval-store.d.ts.map +1 -1
  166. package/core/dist/runtime-v2/activation/memory-approval-store.js +16 -0
  167. package/core/dist/runtime-v2/activation/memory-approval-store.js.map +1 -1
  168. package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js +1 -1
  169. package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
  170. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts +2 -0
  171. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  172. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +34 -6
  173. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  174. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts +6 -0
  175. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  176. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +10 -0
  177. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  178. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js +51 -1
  179. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js.map +1 -1
  180. package/core/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js +145 -0
  181. package/core/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js.map +1 -1
  182. package/core/dist/runtime-v2/adapter/json-extractor.d.ts +13 -0
  183. package/core/dist/runtime-v2/adapter/json-extractor.d.ts.map +1 -1
  184. package/core/dist/runtime-v2/adapter/json-extractor.js +103 -0
  185. package/core/dist/runtime-v2/adapter/json-extractor.js.map +1 -1
  186. package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts +4 -2
  187. package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts.map +1 -1
  188. package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js +57 -5
  189. package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js.map +1 -1
  190. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts +18 -0
  191. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts.map +1 -0
  192. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +633 -0
  193. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -0
  194. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +92 -0
  195. package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -1
  196. package/core/dist/runtime-v2/config/index.d.ts +3 -1
  197. package/core/dist/runtime-v2/config/index.d.ts.map +1 -1
  198. package/core/dist/runtime-v2/config/index.js +1 -0
  199. package/core/dist/runtime-v2/config/index.js.map +1 -1
  200. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts +93 -0
  201. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -0
  202. package/core/dist/runtime-v2/config/pd-config-agent-binding.js +184 -0
  203. package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -0
  204. package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
  205. package/core/dist/runtime-v2/config/pd-config-defaults.js +2 -0
  206. package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
  207. package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
  208. package/core/dist/runtime-v2/config/pd-config-effective.js +3 -0
  209. package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
  210. package/core/dist/runtime-v2/config/pd-config-types.d.ts +8 -0
  211. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  212. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  213. package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts +13 -0
  214. package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts.map +1 -0
  215. package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js +97 -0
  216. package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js.map +1 -0
  217. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +3 -2
  218. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  219. package/core/dist/runtime-v2/diagnostician-prompt-builder.js +6 -4
  220. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  221. package/core/dist/runtime-v2/evidence-sanitizer.d.ts +57 -0
  222. package/core/dist/runtime-v2/evidence-sanitizer.d.ts.map +1 -0
  223. package/core/dist/runtime-v2/evidence-sanitizer.js +213 -0
  224. package/core/dist/runtime-v2/evidence-sanitizer.js.map +1 -0
  225. package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.d.ts +7 -0
  226. package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.d.ts.map +1 -0
  227. package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js +170 -0
  228. package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js.map +1 -0
  229. package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts +18 -0
  230. package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts.map +1 -0
  231. package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js +277 -0
  232. package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js.map +1 -0
  233. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts +13 -0
  234. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +264 -0
  236. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -0
  237. package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts +16 -0
  238. package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts.map +1 -0
  239. package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js +316 -0
  240. package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js.map +1 -0
  241. package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts +126 -0
  242. package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts.map +1 -0
  243. package/core/dist/runtime-v2/evidence-triage/admission-events.js +159 -0
  244. package/core/dist/runtime-v2/evidence-triage/admission-events.js.map +1 -0
  245. package/core/dist/runtime-v2/evidence-triage/index.d.ts +16 -0
  246. package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -0
  247. package/core/dist/runtime-v2/evidence-triage/index.js +13 -0
  248. package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -0
  249. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +48 -0
  250. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts.map +1 -0
  251. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +131 -0
  252. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js.map +1 -0
  253. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts +32 -0
  254. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -0
  255. package/core/dist/runtime-v2/evidence-triage/triage-policy.js +95 -0
  256. package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -0
  257. package/core/dist/runtime-v2/evidence-triage/trigger-controller.d.ts +116 -0
  258. package/core/dist/runtime-v2/evidence-triage/trigger-controller.d.ts.map +1 -0
  259. package/core/dist/runtime-v2/evidence-triage/trigger-controller.js +218 -0
  260. package/core/dist/runtime-v2/evidence-triage/trigger-controller.js.map +1 -0
  261. package/core/dist/runtime-v2/evidence-triage/types.d.ts +65 -0
  262. package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -0
  263. package/core/dist/runtime-v2/evidence-triage/types.js +38 -0
  264. package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -0
  265. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +10 -0
  266. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  267. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  268. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +1 -0
  269. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  270. package/core/dist/runtime-v2/index.d.ts +8 -1
  271. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  272. package/core/dist/runtime-v2/index.js +7 -1
  273. package/core/dist/runtime-v2/index.js.map +1 -1
  274. package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.d.ts +12 -0
  275. package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.d.ts.map +1 -0
  276. package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.js +83 -0
  277. package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.js.map +1 -0
  278. package/core/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts +10 -0
  279. package/core/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts.map +1 -1
  280. package/core/dist/runtime-v2/internalization/scribe-prompt-builder.js +13 -1
  281. package/core/dist/runtime-v2/internalization/scribe-prompt-builder.js.map +1 -1
  282. package/core/dist/runtime-v2/internalization/scribe-runner.d.ts +3 -0
  283. package/core/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
  284. package/core/dist/runtime-v2/internalization/scribe-runner.js +2 -0
  285. package/core/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
  286. package/core/dist/runtime-v2/internalization-chain-integrity-read-model.js +1 -1
  287. package/core/dist/runtime-v2/internalization-chain-integrity-read-model.js.map +1 -1
  288. package/core/dist/runtime-v2/language-directive.d.ts +80 -0
  289. package/core/dist/runtime-v2/language-directive.d.ts.map +1 -0
  290. package/core/dist/runtime-v2/language-directive.js +108 -0
  291. package/core/dist/runtime-v2/language-directive.js.map +1 -0
  292. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  293. package/core/dist/runtime-v2/pain-signal-observability.js +24 -11
  294. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  295. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +16 -0
  296. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  297. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +97 -6
  298. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  299. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +7 -0
  300. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  301. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  302. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  303. package/core/dist/runtime-v2/proven-channel-baseline.d.ts.map +1 -1
  304. package/core/dist/runtime-v2/proven-channel-baseline.js +14 -0
  305. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  306. package/core/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js +40 -0
  307. package/core/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js.map +1 -1
  308. package/core/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  309. package/core/dist/runtime-v2/runner/base-peer-runner.js +1 -0
  310. package/core/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  311. package/core/dist/runtime-v2/runner/diagnostician-runner-options.d.ts +10 -0
  312. package/core/dist/runtime-v2/runner/diagnostician-runner-options.d.ts.map +1 -1
  313. package/core/dist/runtime-v2/runner/diagnostician-runner-options.js +1 -0
  314. package/core/dist/runtime-v2/runner/diagnostician-runner-options.js.map +1 -1
  315. package/core/dist/runtime-v2/runner/diagnostician-runner.d.ts.map +1 -1
  316. package/core/dist/runtime-v2/runner/diagnostician-runner.js +28 -4
  317. package/core/dist/runtime-v2/runner/diagnostician-runner.js.map +1 -1
  318. package/core/dist/runtime-v2/runner/peer-runner-types.d.ts +9 -0
  319. package/core/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
  320. package/core/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
  321. package/core/dist/runtime-v2/store/runtime-state-manager.integration.test.js +34 -1
  322. package/core/dist/runtime-v2/store/runtime-state-manager.integration.test.js.map +1 -1
  323. package/core/dist/runtime-v2/store/runtime-state-manager.js +1 -0
  324. package/core/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
  325. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  326. package/core/dist/runtime-v2/store/sqlite-connection.js +9 -1
  327. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  328. package/core/dist/runtime-v2/store/task/sqlite-task-store.js +1 -1
  329. package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
  330. package/core/dist/runtime-v2/task-status.d.ts +4 -4
  331. package/core/dist/runtime-v2/task-status.d.ts.map +1 -1
  332. package/core/dist/runtime-v2/task-status.js +2 -2
  333. package/core/dist/runtime-v2/task-status.js.map +1 -1
  334. package/core/package.json +1 -1
  335. package/package.json +2 -2
  336. package/pd-cli/dist/commands/console.d.ts +2 -0
  337. package/pd-cli/dist/commands/console.d.ts.map +1 -1
  338. package/pd-cli/dist/commands/console.js +6 -1
  339. package/pd-cli/dist/commands/console.js.map +1 -1
  340. package/pd-cli/dist/commands/diagnose.d.ts.map +1 -1
  341. package/pd-cli/dist/commands/diagnose.js +18 -1
  342. package/pd-cli/dist/commands/diagnose.js.map +1 -1
  343. package/pd-cli/dist/commands/pain-evidence.d.ts +41 -0
  344. package/pd-cli/dist/commands/pain-evidence.d.ts.map +1 -0
  345. package/pd-cli/dist/commands/pain-evidence.js +177 -0
  346. package/pd-cli/dist/commands/pain-evidence.js.map +1 -0
  347. package/pd-cli/dist/commands/pain-record.d.ts.map +1 -1
  348. package/pd-cli/dist/commands/pain-record.js +24 -9
  349. package/pd-cli/dist/commands/pain-record.js.map +1 -1
  350. package/pd-cli/dist/commands/pain-retry.d.ts +19 -0
  351. package/pd-cli/dist/commands/pain-retry.d.ts.map +1 -0
  352. package/pd-cli/dist/commands/pain-retry.js +485 -0
  353. package/pd-cli/dist/commands/pain-retry.js.map +1 -0
  354. package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  355. package/pd-cli/dist/commands/runtime-internalization-run-once.js +59 -9
  356. package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
  357. package/pd-cli/dist/commands/runtime-uat.d.ts +1 -0
  358. package/pd-cli/dist/commands/runtime-uat.d.ts.map +1 -1
  359. package/pd-cli/dist/commands/runtime-uat.guard.test.d.ts +2 -0
  360. package/pd-cli/dist/commands/runtime-uat.guard.test.d.ts.map +1 -0
  361. package/pd-cli/dist/commands/runtime-uat.guard.test.js +155 -0
  362. package/pd-cli/dist/commands/runtime-uat.guard.test.js.map +1 -0
  363. package/pd-cli/dist/commands/runtime-uat.js +29 -3
  364. package/pd-cli/dist/commands/runtime-uat.js.map +1 -1
  365. package/pd-cli/dist/config-reader.d.ts +25 -0
  366. package/pd-cli/dist/config-reader.d.ts.map +1 -0
  367. package/pd-cli/dist/config-reader.js +109 -0
  368. package/pd-cli/dist/config-reader.js.map +1 -0
  369. package/pd-cli/dist/index.js +40 -5
  370. package/pd-cli/dist/index.js.map +1 -1
  371. package/pd-cli/dist/services/console-launcher.d.ts.map +1 -1
  372. package/pd-cli/dist/services/console-launcher.js +29 -15
  373. package/pd-cli/dist/services/console-launcher.js.map +1 -1
  374. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  375. package/pd-cli/dist/services/demo-story-a-runner.js +1 -0
  376. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  377. package/pd-cli/dist/utils/production-workspace-guard.d.ts +77 -0
  378. package/pd-cli/dist/utils/production-workspace-guard.d.ts.map +1 -0
  379. package/pd-cli/dist/utils/production-workspace-guard.js +170 -0
  380. package/pd-cli/dist/utils/production-workspace-guard.js.map +1 -0
  381. package/pd-cli/dist/utils/production-workspace-guard.test.d.ts +2 -0
  382. package/pd-cli/dist/utils/production-workspace-guard.test.d.ts.map +1 -0
  383. package/pd-cli/dist/utils/production-workspace-guard.test.js +95 -0
  384. package/pd-cli/dist/utils/production-workspace-guard.test.js.map +1 -0
  385. package/pd-cli/package.json +1 -1
  386. package/plugin/dist/commands/pain.js +27 -2
  387. package/plugin/dist/core/pain-diagnostic-gate.d.ts +6 -0
  388. package/plugin/dist/core/pain-diagnostic-gate.js +9 -0
  389. package/plugin/dist/hooks/after-tool-call-helpers.d.ts +90 -0
  390. package/plugin/dist/hooks/after-tool-call-helpers.js +486 -0
  391. package/plugin/dist/hooks/after-tool-call-types.d.ts +92 -0
  392. package/plugin/dist/hooks/after-tool-call-types.js +13 -0
  393. package/plugin/dist/hooks/gate-block-helper.js +73 -29
  394. package/plugin/dist/hooks/llm.js +49 -29
  395. package/plugin/dist/hooks/message-sanitize.d.ts +21 -0
  396. package/plugin/dist/hooks/message-sanitize.js +30 -0
  397. package/plugin/dist/hooks/pain.d.ts +26 -3
  398. package/plugin/dist/hooks/pain.js +165 -425
  399. package/plugin/dist/hooks/prompt.js +3 -2
  400. package/plugin/dist/hooks/trajectory-evidence.d.ts +11 -0
  401. package/plugin/dist/hooks/trajectory-evidence.js +65 -0
  402. package/plugin/dist/hooks/triage-adapter.d.ts +82 -0
  403. package/plugin/dist/hooks/triage-adapter.js +121 -0
  404. package/console/dist/server/models/EventLogReadModel.d.ts +0 -33
  405. package/console/dist/server/models/EventLogReadModel.js +0 -218
  406. package/console/dist/server/models/EvolutionConsoleModel.d.ts +0 -79
  407. package/console/dist/server/models/EvolutionConsoleModel.js +0 -179
  408. package/console/dist/server/models/FeedbackConsoleModel.d.ts +0 -38
  409. package/console/dist/server/models/FeedbackConsoleModel.js +0 -129
  410. package/console/dist/server/models/GateConsoleModel.d.ts +0 -50
  411. package/console/dist/server/models/GateConsoleModel.js +0 -151
  412. package/console/dist/server/models/OverviewConsoleModel.d.ts +0 -22
  413. package/console/dist/server/models/OverviewConsoleModel.js +0 -202
  414. package/console/dist/server/models/PipelineStatsModel.d.ts +0 -35
  415. package/console/dist/server/models/PipelineStatsModel.js +0 -129
  416. package/console/dist/server/models/SampleConsoleModel.d.ts +0 -21
  417. package/console/dist/server/models/SampleConsoleModel.js +0 -188
  418. package/console/dist/server/models/ThinkingModelsConsoleModel.d.ts +0 -22
  419. package/console/dist/server/models/ThinkingModelsConsoleModel.js +0 -75
  420. package/console/dist/server/routes/agents.d.ts +0 -3
  421. package/console/dist/server/routes/agents.js +0 -442
  422. package/console/dist/server/routes/central.d.ts +0 -5
  423. package/console/dist/server/routes/central.js +0 -31
  424. package/console/dist/server/routes/events.d.ts +0 -10
  425. package/console/dist/server/routes/events.js +0 -99
  426. package/console/dist/server/routes/evolution.js +0 -73
  427. package/console/dist/server/routes/feedback.d.ts +0 -3
  428. package/console/dist/server/routes/feedback.js +0 -65
  429. package/console/dist/server/routes/gates.d.ts +0 -3
  430. package/console/dist/server/routes/gates.js +0 -52
  431. package/console/dist/server/routes/overview.d.ts +0 -3
  432. package/console/dist/server/routes/overview.js +0 -49
  433. package/console/dist/server/routes/pipeline.d.ts +0 -3
  434. package/console/dist/server/routes/pipeline.js +0 -33
  435. package/console/dist/server/routes/samples.d.ts +0 -3
  436. package/console/dist/server/routes/samples.js +0 -101
  437. package/console/dist/server/routes/thinking-models.d.ts +0 -3
  438. package/console/dist/server/routes/thinking-models.js +0 -54
  439. package/console/dist/ui/components/app-sidebar.d.ts +0 -7
  440. package/console/dist/ui/components/app-sidebar.js +0 -75
  441. package/console/dist/ui/components/compare-view.d.ts +0 -7
  442. package/console/dist/ui/components/compare-view.js +0 -32
  443. package/console/dist/ui/components/data-freshness-indicator.d.ts +0 -10
  444. package/console/dist/ui/components/data-freshness-indicator.js +0 -63
  445. package/console/dist/ui/components/health-diagnostic-card.d.ts +0 -15
  446. package/console/dist/ui/components/health-diagnostic-card.js +0 -42
  447. package/console/dist/ui/components/page-header.d.ts +0 -10
  448. package/console/dist/ui/components/page-header.js +0 -37
  449. package/console/dist/ui/hooks/useAutoRefresh.d.ts +0 -13
  450. package/console/dist/ui/hooks/useAutoRefresh.js +0 -64
  451. package/console/dist/ui/hooks/useBookmarks.d.ts +0 -6
  452. package/console/dist/ui/hooks/useBookmarks.js +0 -43
  453. package/console/dist/ui/hooks/useDebounce.d.ts +0 -2
  454. package/console/dist/ui/hooks/useDebounce.js +0 -32
  455. package/console/dist/ui/hooks/useKeyboardNavigation.d.ts +0 -14
  456. package/console/dist/ui/hooks/useKeyboardNavigation.js +0 -75
  457. package/console/dist/ui/pages/AgentsPage.d.ts +0 -1
  458. package/console/dist/ui/pages/AgentsPage.js +0 -167
  459. package/console/dist/ui/pages/ApprovalsPage.d.ts +0 -1
  460. package/console/dist/ui/pages/ApprovalsPage.js +0 -123
  461. package/console/dist/ui/pages/CentralPage.d.ts +0 -1
  462. package/console/dist/ui/pages/CentralPage.js +0 -57
  463. package/console/dist/ui/pages/DataFlowPage.d.ts +0 -1
  464. package/console/dist/ui/pages/DataFlowPage.js +0 -158
  465. package/console/dist/ui/pages/EventLogPage.d.ts +0 -1
  466. package/console/dist/ui/pages/EventLogPage.js +0 -176
  467. package/console/dist/ui/pages/EvolutionPage.d.ts +0 -1
  468. package/console/dist/ui/pages/EvolutionPage.js +0 -118
  469. package/console/dist/ui/pages/FeedbackPage.d.ts +0 -1
  470. package/console/dist/ui/pages/FeedbackPage.js +0 -46
  471. package/console/dist/ui/pages/GatesPage.d.ts +0 -1
  472. package/console/dist/ui/pages/GatesPage.js +0 -31
  473. package/console/dist/ui/pages/LoginPage.d.ts +0 -5
  474. package/console/dist/ui/pages/LoginPage.js +0 -39
  475. package/console/dist/ui/pages/OverviewPage.d.ts +0 -1
  476. package/console/dist/ui/pages/OverviewPage.js +0 -50
  477. package/console/dist/ui/pages/PainPage.js +0 -50
  478. package/console/dist/ui/pages/PrincipleDetailPage.js +0 -145
  479. package/console/dist/ui/pages/PrinciplesPage.js +0 -322
  480. package/console/dist/ui/pages/ReportProblemPage.js +0 -186
  481. package/console/dist/ui/pages/SamplesPage.d.ts +0 -1
  482. package/console/dist/ui/pages/SamplesPage.js +0 -105
  483. package/console/dist/ui/pages/SettingsPage.d.ts +0 -1
  484. package/console/dist/ui/pages/SettingsPage.js +0 -86
  485. package/console/dist/ui/pages/TasksPage.d.ts +0 -1
  486. package/console/dist/ui/pages/TasksPage.js +0 -373
  487. package/console/dist/ui/pages/ThinkingModelsPage.d.ts +0 -1
  488. package/console/dist/ui/pages/ThinkingModelsPage.js +0 -32
  489. package/console/dist/ui/pages/UpdatePage.d.ts +0 -1
  490. package/console/dist/ui/pages/UpdatePage.js +0 -142
  491. /package/console/dist/ui/pages/{PainPage.d.ts → pain/PainPage.d.ts} +0 -0
  492. /package/console/dist/ui/pages/{PrincipleDetailPage.d.ts → principles/PrincipleDetailPage.d.ts} +0 -0
  493. /package/console/dist/ui/pages/{PrinciplesPage.d.ts → principles/PrinciplesPage.d.ts} +0 -0
  494. /package/console/dist/ui/pages/{ReportProblemPage.d.ts → report-problem/ReportProblemPage.d.ts} +0 -0
@@ -1,3 +1,5 @@
1
+ import { validateErrorResponse, validateHeaders, validateFeedbackReport, validateFeedbackDraftsList, validateFeedbackDraftEnvelope, validateDeleteEnvelope, validateWorkspaceEntry, validateWorkspaceList, validateRemovedEnvelope, validateSyncResult, validateConfigReadiness, validateConfigSummary, validateConfigCatalog, validateAgentBindingUpdate, validateReadinessCheck, validateDefaultRuntimeUpdate, validateOutputLanguage, validateGovernanceQueue, validateActivations, validateDisableActivation, validateLifecycleMetrics, validateUpdateStatus, validateUpdateHistory, validateApprovalListResult, validateApprovalRecordDirect, validatePrinciplesList, validateApprovalsGrouped, validateEvidenceChain, } from "./utils/validators.js";
2
+ // ── Auth ──────────────────────────────────────────────────────────────────────
1
3
  function getToken() {
2
4
  return sessionStorage.getItem("pd_token");
3
5
  }
@@ -7,7 +9,7 @@ function setToken(token) {
7
9
  function clearToken() {
8
10
  sessionStorage.removeItem("pd_token");
9
11
  }
10
- async function request(path, options) {
12
+ async function request(path, options, validate) {
11
13
  const token = getToken();
12
14
  const headers = {
13
15
  "Content-Type": "application/json",
@@ -20,30 +22,59 @@ async function request(path, options) {
20
22
  ...options,
21
23
  headers: {
22
24
  ...headers,
23
- ...options?.headers,
25
+ ...(validateHeaders(options?.headers) ?? {}),
24
26
  },
25
27
  });
26
28
  if (!response.ok) {
29
+ if (response.status === 401) {
30
+ const hadToken = getToken() !== null;
31
+ clearToken();
32
+ // eslint-disable-next-line no-undef
33
+ if (hadToken && !window.location.hash.startsWith("#/login")) {
34
+ // eslint-disable-next-line no-undef
35
+ window.location.hash = "#/login?session_expired=true";
36
+ }
37
+ }
27
38
  let errorMessage = `HTTP ${response.status}`;
39
+ let nextAction;
28
40
  try {
29
- const parsed = await response.json();
30
- if (parsed && typeof parsed.message === 'string') {
31
- errorMessage = parsed.message;
32
- }
33
- else if (parsed && typeof parsed.error === 'string') {
34
- errorMessage = parsed.error;
41
+ const raw = await response.json();
42
+ const parsed = validateErrorResponse(raw);
43
+ if (parsed) {
44
+ if (parsed.message) {
45
+ errorMessage = parsed.message;
46
+ }
47
+ else if (parsed.error) {
48
+ errorMessage = parsed.error;
49
+ }
50
+ if (parsed.nextAction) {
51
+ ({ nextAction } = parsed);
52
+ }
35
53
  }
36
54
  }
37
55
  catch {
38
56
  // ignore parse errors
39
57
  }
40
- return { success: false, error: errorMessage };
58
+ return { success: false, error: errorMessage, nextAction };
41
59
  }
42
- const json = await response.json();
43
- if (json.success === true && json.data !== undefined) {
44
- return { success: true, data: json.data };
60
+ const raw = await response.json();
61
+ const apiData = (raw && typeof raw === "object" && "success" in raw && "data" in raw)
62
+ ? raw.data
63
+ : raw;
64
+ if (validate) {
65
+ const validated = validate(apiData);
66
+ if (validated !== null) {
67
+ return { success: true, data: validated };
68
+ }
69
+ return {
70
+ success: false,
71
+ error: "Response validation failed: unexpected data shape from server",
72
+ nextAction: "Try refreshing the page. If the problem persists, report it.",
73
+ };
45
74
  }
46
- return { success: true, data: json };
75
+ // No validator provided returns ApiResponse<unknown>.
76
+ // The caller must not assume a specific data shape.
77
+ return { success: true, data: apiData };
47
78
  }
48
79
  catch (err) {
49
80
  return {
@@ -56,162 +87,38 @@ async function checkAuth() {
56
87
  const result = await request("/api/health");
57
88
  return result.success;
58
89
  }
59
- async function fetchTasks() {
60
- return request("/api/tasks");
61
- }
62
- async function fetchTaskEvidence(id) {
63
- return request(`/api/tasks/${id}/evidence`);
64
- }
65
- async function approveTask(id) {
66
- return request(`/api/tasks/${id}/approve`, { method: "POST" });
67
- }
68
- async function rejectTask(id) {
69
- return request(`/api/tasks/${id}/reject`, { method: "POST" });
70
- }
71
- async function cleanupTask(id) {
72
- return request(`/api/tasks/${id}/cleanup`, { method: "POST" });
73
- }
74
- async function fetchStatus() {
75
- return request("/api/status");
76
- }
77
- async function fetchActivity() {
78
- return request("/api/activity");
79
- }
80
- async function fetchOverview() {
81
- return request("/api/overview");
82
- }
83
- async function fetchOverviewHealth() {
84
- return request("/api/overview/health");
85
- }
86
- async function fetchGateStats() {
87
- return request("/api/gate/stats");
88
- }
89
- async function fetchGateBlocks(limit) {
90
- const query = limit ? `?limit=${limit}` : '';
91
- return request(`/api/gate/blocks${query}`);
92
- }
93
- async function fetchFeedbackGfi() {
94
- return request("/api/feedback/gfi");
95
- }
96
- async function fetchEmpathyEvents(limit) {
97
- const query = limit ? `?limit=${limit}` : '';
98
- return request(`/api/feedback/empathy-events${query}`);
99
- }
100
- async function fetchFeedbackGateBlocks(limit) {
101
- const query = limit ? `?limit=${limit}` : '';
102
- return request(`/api/feedback/gate-blocks${query}`);
90
+ // ── Config Readiness (renamed from fetchSystemHealth) ─────────────────────────
91
+ async function fetchConfigReadiness() {
92
+ return request("/api/health", undefined, validateConfigReadiness);
103
93
  }
94
+ // ── Workspaces ────────────────────────────────────────────────────────────────
104
95
  async function fetchWorkspaces() {
105
- return request("/api/workspaces");
96
+ return request("/api/workspaces", undefined, validateWorkspaceList);
106
97
  }
107
98
  async function addWorkspace(name, path) {
108
99
  return request("/api/workspaces", {
109
100
  method: "POST",
110
101
  body: JSON.stringify({ name, path }),
111
- });
102
+ }, validateWorkspaceEntry);
112
103
  }
113
104
  async function removeWorkspace(name) {
114
- return request(`/api/workspaces/${encodeURIComponent(name)}`, { method: "DELETE" });
105
+ return request(`/api/workspaces/${encodeURIComponent(name)}`, { method: "DELETE" }, validateRemovedEnvelope);
115
106
  }
116
107
  async function syncWorkspace(name) {
117
- return request(`/api/workspaces/${encodeURIComponent(name)}/sync`, { method: "POST" });
118
- }
119
- async function fetchCentralOverview() {
120
- return request("/api/central/overview");
121
- }
122
- async function fetchCentralHealth() {
123
- return request("/api/central/health");
124
- }
125
- async function fetchSamples(status, page) {
126
- const params = new URLSearchParams();
127
- if (status && status !== 'all')
128
- params.set('status', status);
129
- if (page)
130
- params.set('page', String(page));
131
- const query = params.toString() ? `?${params.toString()}` : '';
132
- return request(`/api/samples${query}`);
133
- }
134
- async function fetchSampleDetail(sampleId) {
135
- return request(`/api/samples/${encodeURIComponent(sampleId)}`);
136
- }
137
- async function reviewSample(sampleId, decision) {
138
- return request(`/api/samples/${encodeURIComponent(sampleId)}/review`, {
139
- method: 'POST',
140
- body: JSON.stringify({ decision }),
141
- });
108
+ return request(`/api/workspaces/${encodeURIComponent(name)}/sync`, { method: "POST" }, validateSyncResult);
142
109
  }
143
- async function fetchEvolutionStats() {
144
- return request("/api/evolution/stats");
145
- }
146
- async function fetchEvolutionTasks(status, page) {
147
- const params = new URLSearchParams();
148
- if (status && status !== 'all')
149
- params.set('status', status);
150
- if (page)
151
- params.set('page', String(page));
152
- const query = params.toString() ? `?${params.toString()}` : '';
153
- return request(`/api/evolution/tasks${query}`);
154
- }
155
- async function fetchEvolutionPrinciples() {
156
- return request("/api/evolution/principles");
157
- }
158
- async function fetchPrinciples() {
159
- return request("/api/principles");
110
+ // ── Principles ────────────────────────────────────────────────────────────────
111
+ async function fetchPrinciples(filter) {
112
+ const query = filter && filter !== 'all' ? `?filter=${filter}` : '';
113
+ return request(`/api/principles${query}`, undefined, validatePrinciplesList);
160
114
  }
115
+ // Principle detail is deeply nested; for now we accept unvalidated until a
116
+ // dedicated validator is added (the page already handles missing fields gracefully).
117
+ // This endpoint is marked legacy/deferred for full validation.
161
118
  async function fetchPrincipleDetail(principleId) {
162
119
  return request(`/api/principles/${encodeURIComponent(principleId)}`);
163
120
  }
164
- async function fetchEvolutionQueue() {
165
- return request("/api/evolution/queue");
166
- }
167
- async function fetchThinkingModels() {
168
- return request("/api/thinking-models");
169
- }
170
- async function fetchSystemHealth() {
171
- return request("/api/health");
172
- }
173
- async function fetchPipelineStats() {
174
- return request("/api/pipeline");
175
- }
176
- async function fetchEvents(options) {
177
- const params = new URLSearchParams();
178
- if (options.types)
179
- options.types.forEach(type => params.append('type', type));
180
- if (options.startDate)
181
- params.set('startDate', options.startDate);
182
- if (options.endDate)
183
- params.set('endDate', options.endDate);
184
- if (options.searchQuery)
185
- params.set('q', options.searchQuery);
186
- if (options.page)
187
- params.set('page', options.page.toString());
188
- if (options.pageSize)
189
- params.set('pageSize', options.pageSize.toString());
190
- const queryStr = params.toString() ? `?${params.toString()}` : '';
191
- return request(`/api/events${queryStr}`);
192
- }
193
- async function fetchEventsGrouped(options) {
194
- const params = new URLSearchParams();
195
- if (options?.startDate)
196
- params.set('startDate', options.startDate);
197
- if (options?.endDate)
198
- params.set('endDate', options.endDate);
199
- const queryStr = params.toString() ? `?${params.toString()}` : '';
200
- return request(`/api/events/grouped${queryStr}`);
201
- }
202
- async function fetchRelatedEvents(eventId, maxDistance) {
203
- const params = new URLSearchParams();
204
- if (maxDistance)
205
- params.set('maxDistance', maxDistance.toString());
206
- const queryStr = params.toString() ? `?${params.toString()}` : '';
207
- return request(`/api/events/${encodeURIComponent(eventId)}/related${queryStr}`);
208
- }
209
- async function fetchAgents() {
210
- return request("/api/agents");
211
- }
212
- async function fetchAgentDetail(id) {
213
- return request(`/api/agents/${encodeURIComponent(id)}`);
214
- }
121
+ // ── Approvals ─────────────────────────────────────────────────────────────────
215
122
  async function fetchApprovals(params) {
216
123
  const searchParams = new URLSearchParams();
217
124
  if (params?.status)
@@ -223,38 +130,108 @@ async function fetchApprovals(params) {
223
130
  if (params?.pageSize)
224
131
  searchParams.set('pageSize', String(params.pageSize));
225
132
  const qs = searchParams.toString() ? '?' + searchParams.toString() : '';
226
- return request('/api/v1/approvals' + qs);
133
+ return request('/api/v1/approvals' + qs, undefined, validateApprovalListResult);
227
134
  }
228
135
  async function fetchApprovalDetail(approvalId) {
229
- return request('/api/v1/approvals/' + encodeURIComponent(approvalId));
136
+ return request('/api/v1/approvals/' + encodeURIComponent(approvalId), undefined, validateApprovalRecordDirect);
230
137
  }
231
138
  async function approveApproval(approvalId, note) {
232
139
  return request('/api/v1/approvals/' + encodeURIComponent(approvalId) + '/approve', {
233
140
  method: 'POST',
234
141
  body: JSON.stringify({ note }),
235
- });
142
+ }, validateApprovalRecordDirect);
236
143
  }
237
144
  async function rejectApproval(approvalId, reason) {
238
145
  return request('/api/v1/approvals/' + encodeURIComponent(approvalId) + '/reject', {
239
146
  method: 'POST',
240
147
  body: JSON.stringify({ reason }),
241
- });
148
+ }, validateApprovalRecordDirect);
242
149
  }
150
+ // ── MVP seed feedback report drafts (PRI-285) ────────────────────────────────
243
151
  async function createFeedbackReport(input, diagnostics) {
244
152
  return request('/api/feedback/reports', {
245
153
  method: 'POST',
246
154
  body: JSON.stringify({ input, diagnostics }),
247
- });
155
+ }, validateFeedbackReport);
248
156
  }
249
157
  async function listFeedbackReports() {
250
- return request('/api/feedback/reports');
158
+ // The API returns { drafts: [...] } — validate the drafts array inside
159
+ return request('/api/feedback/reports', undefined, (v) => {
160
+ const drafts = validateFeedbackDraftsList(v);
161
+ if (drafts === null)
162
+ return null;
163
+ return { drafts };
164
+ });
251
165
  }
252
166
  async function getFeedbackReport(id) {
253
- return request('/api/feedback/reports/' + encodeURIComponent(id));
167
+ return request('/api/feedback/reports/' + encodeURIComponent(id), undefined, validateFeedbackDraftEnvelope);
254
168
  }
255
169
  async function deleteFeedbackReport(id) {
256
170
  return request('/api/feedback/reports/' + encodeURIComponent(id), {
257
171
  method: 'DELETE',
258
- });
172
+ }, validateDeleteEnvelope);
173
+ }
174
+ // ── Config / Control Center API (PRI-303, PRI-309) ───────────────────────────
175
+ async function fetchConfigSummary() {
176
+ return request('/api/v1/config/summary', undefined, validateConfigSummary);
177
+ }
178
+ async function fetchConfigCatalog() {
179
+ return request('/api/v1/config/catalog', undefined, validateConfigCatalog);
180
+ }
181
+ async function updateAgentBinding(agentName, runtimeProfile, enabled) {
182
+ return request(`/api/v1/config/agents/${encodeURIComponent(agentName)}/binding`, {
183
+ method: 'PATCH',
184
+ body: JSON.stringify({ runtimeProfile, enabled }),
185
+ }, validateAgentBindingUpdate);
186
+ }
187
+ async function checkAgentReadiness(agentName) {
188
+ return request(`/api/v1/config/readiness/${encodeURIComponent(agentName)}`, undefined, validateReadinessCheck);
189
+ }
190
+ async function updateDefaultRuntime(defaultRuntime) {
191
+ return request('/api/v1/config/default-runtime', {
192
+ method: 'PATCH',
193
+ body: JSON.stringify({ defaultRuntime }),
194
+ }, validateDefaultRuntimeUpdate);
195
+ }
196
+ // ── Principles Output Language (PRI-332 P1-1) ────────────────────────────────
197
+ async function fetchOutputLanguage() {
198
+ return request('/api/v1/config/principles/output-language', undefined, validateOutputLanguage);
199
+ }
200
+ async function updateOutputLanguage(outputLanguage) {
201
+ return request('/api/v1/config/principles/output-language', {
202
+ method: 'PATCH',
203
+ body: JSON.stringify({ outputLanguage }),
204
+ }, validateOutputLanguage);
205
+ }
206
+ // ── CR8: Backend Data Contract (G.1) ─────────────────────────────────────────
207
+ async function fetchGovernanceQueue() {
208
+ return request('/api/v1/governance/queue', undefined, validateGovernanceQueue);
209
+ }
210
+ async function fetchApprovalsGrouped() {
211
+ return request('/api/v1/approvals/grouped', undefined, validateApprovalsGrouped);
212
+ }
213
+ async function fetchAllActivations() {
214
+ return request('/api/v1/activations', undefined, validateActivations);
215
+ }
216
+ async function disableActivation(activationId) {
217
+ return request(`/api/v1/activations/${encodeURIComponent(activationId)}/disable`, {
218
+ method: 'POST',
219
+ body: JSON.stringify({ confirmed: true }),
220
+ }, validateDisableActivation);
221
+ }
222
+ async function fetchLifecycleMetrics(principleId) {
223
+ return request(`/api/v1/lifecycle/principles/${encodeURIComponent(principleId)}`, undefined, validateLifecycleMetrics);
224
+ }
225
+ // ── Updates (CR9) ─────────────────────────────────────────────────────────────
226
+ async function fetchUpdateStatus() {
227
+ return request('/api/update', undefined, validateUpdateStatus);
228
+ }
229
+ async function fetchUpdateHistory() {
230
+ return request('/api/update/history', undefined, validateUpdateHistory);
231
+ }
232
+ // ── Evidence Chain (PRI-331) ──────────────────────────────────────────────────
233
+ async function fetchEvidenceChain() {
234
+ return request('/api/v1/evidence-chain', undefined, validateEvidenceChain);
259
235
  }
260
- export { getToken, setToken, clearToken, checkAuth, request, fetchTasks, fetchTaskEvidence, approveTask, rejectTask, cleanupTask, fetchStatus, fetchActivity, fetchOverview, fetchOverviewHealth, fetchGateStats, fetchGateBlocks, fetchFeedbackGfi, fetchEmpathyEvents, fetchFeedbackGateBlocks, fetchWorkspaces, addWorkspace, removeWorkspace, syncWorkspace, fetchCentralOverview, fetchCentralHealth, fetchSamples, fetchSampleDetail, reviewSample, fetchEvolutionStats, fetchEvolutionTasks, fetchEvolutionPrinciples, fetchPrinciples, fetchPrincipleDetail, fetchEvolutionQueue, fetchThinkingModels, fetchSystemHealth, fetchPipelineStats, fetchEvents, fetchEventsGrouped, fetchRelatedEvents, fetchAgents, fetchAgentDetail, fetchApprovals, fetchApprovalDetail, approveApproval, rejectApproval, createFeedbackReport, listFeedbackReports, getFeedbackReport, deleteFeedbackReport, };
236
+ // ── Exports ───────────────────────────────────────────────────────────────────
237
+ export { getToken, setToken, clearToken, checkAuth, request, fetchApprovals, fetchApprovalDetail, approveApproval, rejectApproval, fetchPrinciples, fetchPrincipleDetail, createFeedbackReport, listFeedbackReports, getFeedbackReport, deleteFeedbackReport, fetchConfigSummary, fetchConfigCatalog, updateAgentBinding, checkAgentReadiness, updateDefaultRuntime, fetchOutputLanguage, updateOutputLanguage, fetchWorkspaces, addWorkspace, removeWorkspace, syncWorkspace, fetchConfigReadiness, fetchGovernanceQueue, fetchApprovalsGrouped, fetchAllActivations, disableActivation, fetchLifecycleMetrics, fetchUpdateStatus, fetchUpdateHistory, fetchEvidenceChain, };
@@ -35,5 +35,5 @@ function getChannelLabel(channel, t) {
35
35
  export function ApprovalCard({ approval, onApprove, onReject, onViewDetail, loading, }) {
36
36
  const { t } = useTranslation();
37
37
  const isPending = approval.status === "pending";
38
- return (_jsx(Card, { className: "mb-3 transition-all duration-200 hover:shadow-sm", children: _jsxs(CardContent, { className: "p-4", children: [_jsx("div", { className: "flex items-start justify-between gap-3", children: _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1.5 flex-wrap", children: [_jsx(Badge, { variant: "outline", className: "text-xs", children: getChannelLabel(approval.channel, t) }), _jsx(Badge, { className: "text-xs border " + (CONFIDENCE_COLORS[approval.confidenceLabel] ?? CONFIDENCE_COLORS.medium), children: t("components:approvalCard.confidence." + approval.confidenceLabel) }), approval.riskLevel && (_jsx(Badge, { variant: "secondary", className: "text-xs " + (RISK_COLORS[approval.riskLevel] ?? ""), children: t("components:approvalCard.riskLevel." + approval.riskLevel, approval.riskLevel) })), _jsx("span", { className: "text-xs text-muted-foreground", children: timeAgo(new Date(approval.requestedAt), t) })] }), _jsx("p", { className: "font-medium text-sm line-clamp-2", children: approval.summary ?? approval.approvalId })] }) }), isPending && (_jsxs("div", { className: "flex items-center gap-2 mt-3 pt-3 border-t", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: onViewDetail, className: "flex items-center gap-1", disabled: loading, children: [_jsx(Eye, { className: "h-3 w-3" }), t("components:approvalCard.viewDetail")] }), _jsx("div", { className: "flex-1" }), _jsxs(Button, { variant: "destructive", size: "sm", onClick: onReject, className: "flex items-center gap-1", disabled: loading, children: [_jsx(X, { className: "h-3 w-3" }), t("components:approvalCard.reject")] }), _jsxs(Button, { variant: "default", size: "sm", onClick: onApprove, className: "flex items-center gap-1", disabled: loading, children: [_jsx(Check, { className: "h-3 w-3" }), t("components:approvalCard.approve")] })] })), !isPending && (_jsxs("div", { className: "flex items-center gap-2 mt-3 pt-3 border-t", children: [_jsx(Badge, { variant: approval.status === "approved" ? "default" : "secondary", children: t("components:approvalCard.status." + approval.status) }), approval.decidedBy && (_jsx("span", { className: "text-xs text-muted-foreground", children: t("components:approvalCard.decidedBy", { by: approval.decidedBy }) })), _jsx("div", { className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: onViewDetail, disabled: loading, "aria-label": t("components:approvalCard.viewDetail"), children: _jsx(Eye, { className: "h-3 w-3" }) })] }))] }) }));
38
+ return (_jsx(Card, { className: "mb-3 transition-all duration-200 hover:shadow-sm", children: _jsxs(CardContent, { className: "p-4", children: [_jsx("div", { className: "flex items-start justify-between gap-3", children: _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 mb-1.5 flex-wrap", children: [_jsx(Badge, { variant: "outline", className: "text-xs", children: getChannelLabel(approval.channel, t) }), _jsx(Badge, { className: "text-xs border " + (CONFIDENCE_COLORS[approval.confidenceLabel ?? 'medium'] ?? CONFIDENCE_COLORS.medium), children: t("components:approvalCard.confidence." + (approval.confidenceLabel ?? 'medium')) }), approval.riskLevel && (_jsx(Badge, { variant: "secondary", className: "text-xs " + (RISK_COLORS[approval.riskLevel] ?? ""), children: t("components:approvalCard.riskLevel." + approval.riskLevel, approval.riskLevel) })), _jsx("span", { className: "text-xs text-muted-foreground", children: timeAgo(new Date(approval.requestedAt), t) })] }), _jsx("p", { className: "font-medium text-sm line-clamp-2", children: approval.summary ?? approval.approvalId })] }) }), isPending && (_jsxs("div", { className: "flex items-center gap-2 mt-3 pt-3 border-t", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: onViewDetail, className: "flex items-center gap-1", disabled: loading, children: [_jsx(Eye, { className: "h-3 w-3" }), t("components:approvalCard.viewDetail")] }), _jsx("div", { className: "flex-1" }), _jsxs(Button, { variant: "destructive", size: "sm", onClick: onReject, className: "flex items-center gap-1", disabled: loading, children: [_jsx(X, { className: "h-3 w-3" }), t("components:approvalCard.reject")] }), _jsxs(Button, { variant: "default", size: "sm", onClick: onApprove, className: "flex items-center gap-1", disabled: loading, children: [_jsx(Check, { className: "h-3 w-3" }), t("components:approvalCard.approve")] })] })), !isPending && (_jsxs("div", { className: "flex items-center gap-2 mt-3 pt-3 border-t", children: [_jsx(Badge, { variant: approval.status === "approved" ? "default" : "secondary", children: t("components:approvalCard.status." + approval.status) }), approval.decidedBy && (_jsx("span", { className: "text-xs text-muted-foreground", children: t("components:approvalCard.decidedBy", { by: approval.decidedBy }) })), _jsx("div", { className: "flex-1" }), _jsx(Button, { variant: "ghost", size: "sm", onClick: onViewDetail, disabled: loading, "aria-label": t("components:approvalCard.viewDetail"), children: _jsx(Eye, { className: "h-3 w-3" }) })] }))] }) }));
39
39
  }
@@ -16,5 +16,5 @@ export function ApprovalDetailDialog({ approval, open, onOpenChange, onApprove,
16
16
  return null;
17
17
  const isPending = approval.status === "pending";
18
18
  const canAct = isPending && approval.isMvpProven !== false;
19
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg max-h-[80vh] overflow-y-auto", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { className: "text-base", children: approval.summary ?? approval.approvalId }), _jsx(DialogDescription, { children: _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx(Badge, { variant: "outline", className: "text-xs", children: t("components:approvalCard.channel." + approval.channel, approval.channel) }), _jsx(Badge, { className: "text-xs border " + (CONFIDENCE_COLORS[approval.confidenceLabel] ?? CONFIDENCE_COLORS.medium), children: t("components:approvalCard.confidence." + approval.confidenceLabel) }), approval.riskLevel && (_jsx(Badge, { variant: "secondary", className: "text-xs", children: t("components:approvalCard.riskLevel." + approval.riskLevel, approval.riskLevel) }))] }) })] }), _jsxs("div", { className: "space-y-4", children: [approval.triggerReason && (_jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.whyRecommended") }), _jsx("p", { className: "text-sm", children: approval.triggerReason })] })), approval.confidenceExplanation && (_jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.confidenceExplanation") }), _jsx("p", { className: "text-sm", children: approval.confidenceExplanation })] })), approval.effectDescription && (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.whatHappens") }), _jsx("p", { className: "text-sm", children: approval.effectDescription })] })] })), approval.rejectionEffect && (_jsxs("div", { className: "bg-red-50 dark:bg-red-950/20 rounded-md p-3", children: [_jsx("p", { className: "text-xs font-medium text-red-600 dark:text-red-400 mb-1", children: t("components:approvalDetail.ifReject") }), _jsx("p", { className: "text-sm text-red-700 dark:text-red-300", children: approval.rejectionEffect })] }))] }), isPending && approval.isMvpProven === false && (_jsxs("div", { className: "text-xs text-muted-foreground italic pt-2", children: [t("components:approvalCard.channel." + approval.channel, approval.channel), " \u2014 ", t("components:approvalCard.channel.retired", "retired")] })), canAct && (_jsxs(DialogFooter, { children: [_jsxs(Button, { variant: "destructive", size: "sm", onClick: onReject, disabled: loading, className: "flex items-center gap-1", children: [_jsx(X, { className: "h-3 w-3" }), t("components:approvalCard.reject")] }), _jsxs(Button, { size: "sm", onClick: onApprove, disabled: loading, className: "flex items-center gap-1", children: [_jsx(Check, { className: "h-3 w-3" }), t("components:approvalCard.approve")] })] }))] }) }));
19
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-lg max-h-[80vh] overflow-y-auto", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { className: "text-base", children: approval.summary ?? approval.approvalId }), _jsx(DialogDescription, { children: _jsxs("div", { className: "flex items-center gap-2 mt-1", children: [_jsx(Badge, { variant: "outline", className: "text-xs", children: t("components:approvalCard.channel." + approval.channel, approval.channel) }), _jsx(Badge, { className: "text-xs border " + (CONFIDENCE_COLORS[approval.confidenceLabel ?? 'medium'] ?? CONFIDENCE_COLORS.medium), children: t("components:approvalCard.confidence." + (approval.confidenceLabel ?? 'medium')) }), approval.riskLevel && (_jsx(Badge, { variant: "secondary", className: "text-xs", children: t("components:approvalCard.riskLevel." + approval.riskLevel, approval.riskLevel) }))] }) })] }), _jsxs("div", { className: "space-y-4", children: [approval.triggerReason && (_jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.whyRecommended") }), _jsx("p", { className: "text-sm", children: approval.triggerReason })] })), approval.confidenceExplanation && (_jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.confidenceExplanation") }), _jsx("p", { className: "text-sm", children: approval.confidenceExplanation })] })), approval.effectDescription && (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { children: [_jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: t("components:approvalDetail.whatHappens") }), _jsx("p", { className: "text-sm", children: approval.effectDescription })] })] })), approval.rejectionEffect && (_jsxs("div", { className: "bg-red-50 dark:bg-red-950/20 rounded-md p-3", children: [_jsx("p", { className: "text-xs font-medium text-red-600 dark:text-red-400 mb-1", children: t("components:approvalDetail.ifReject") }), _jsx("p", { className: "text-sm text-red-700 dark:text-red-300", children: approval.rejectionEffect })] }))] }), isPending && approval.isMvpProven === false && (_jsxs("div", { className: "text-xs text-muted-foreground italic pt-2", children: [t("components:approvalCard.channel." + approval.channel, approval.channel), " \u2014 ", t("components:approvalCard.channel.retired", "retired")] })), canAct && (_jsxs(DialogFooter, { children: [_jsxs(Button, { variant: "destructive", size: "sm", onClick: onReject, disabled: loading, className: "flex items-center gap-1", children: [_jsx(X, { className: "h-3 w-3" }), t("components:approvalCard.reject")] }), _jsxs(Button, { size: "sm", onClick: onApprove, disabled: loading, className: "flex items-center gap-1", children: [_jsx(Check, { className: "h-3 w-3" }), t("components:approvalCard.approve")] })] }))] }) }));
20
20
  }
@@ -0,0 +1,3 @@
1
+ export declare function LoginForm({ onAuthSuccess }: {
2
+ onAuthSuccess: () => void;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { useTranslation } from "react-i18next";
4
+ import { ThemeToggle } from "../theme-toggle.js";
5
+ import { setToken, checkAuth } from "../../api.js";
6
+ export function LoginForm({ onAuthSuccess }) {
7
+ const [token, setTokenInput] = React.useState("");
8
+ const [error, setError] = React.useState(null);
9
+ const [loading, setLoading] = React.useState(false);
10
+ const { t } = useTranslation();
11
+ React.useEffect(() => {
12
+ if (window.location.hash.includes("session_expired=true")) {
13
+ setError("会话已过期或令牌失效,请重新输入。");
14
+ }
15
+ }, []);
16
+ const handleSubmit = async (e) => {
17
+ e.preventDefault();
18
+ if (!token.trim())
19
+ return;
20
+ setLoading(true);
21
+ setError(null);
22
+ setToken(token.trim());
23
+ const valid = await checkAuth();
24
+ if (valid) {
25
+ onAuthSuccess();
26
+ }
27
+ else {
28
+ setError("令牌无效或服务未就绪,请检查后重试。");
29
+ setLoading(false);
30
+ }
31
+ };
32
+ return (_jsxs("div", { className: "min-h-screen flex items-center justify-center bg-paper relative", style: {
33
+ backgroundImage: `linear-gradient(color-mix(in srgb, var(--color-gov) 3.5%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--color-gov) 3.5%, transparent) 1px, transparent 1px)`,
34
+ backgroundSize: "32px 32px",
35
+ }, children: [_jsx("div", { className: "absolute top-4 right-4", children: _jsx(ThemeToggle, {}) }), _jsxs("div", { className: "w-full max-w-[400px] mx-4 p-8 bg-surface rounded-[var(--radius-md)] border border-line shadow-card", children: [_jsxs("div", { className: "flex flex-col items-center mb-6", children: [_jsxs("svg", { viewBox: "0 0 28 28", className: "w-12 h-12 text-gov mb-3", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("path", { d: "M6 4V24M22 4V24M2 14H26", strokeLinecap: "square" }), _jsx("circle", { cx: "14", cy: "14", r: "2.5", fill: "currentColor", stroke: "none" })] }), _jsx("div", { className: "font-mono text-[14px] tracking-[0.16em] font-bold text-ink", children: "PD" }), _jsx("div", { className: "font-mono text-[11px] tracking-[0.14em] text-ink-3 mt-1", children: "GOVERNANCE WORKSPACE" }), _jsx("div", { className: "text-[13px] text-ink-3 mt-3", children: "\u62E5\u6709\u8005\u6CBB\u7406\u5DE5\u4F5C\u53F0" })] }), _jsx("div", { className: "border-t border-line my-5" }), _jsxs("form", { onSubmit: handleSubmit, children: [_jsx("label", { htmlFor: "bearer-token", className: "font-mono text-[11px] tracking-[0.08em] text-ink-3 uppercase mb-2 block", children: "Bearer Token" }), _jsx("input", { id: "bearer-token", type: "password", value: token, onChange: (e) => setTokenInput(e.target.value), className: "w-full px-3 py-2 bg-panel border border-line rounded-[var(--radius-sm)] font-mono text-[13px] text-ink focus:border-gov focus:outline-2 focus:outline-offset-2 focus:outline-gov transition-colors", placeholder: "\u8F93\u5165\u4EE4\u724C\u2026", autoFocus: true }), error && _jsx("p", { className: "mt-2 text-[13px] text-amber", children: error }), _jsx("button", { type: "submit", disabled: loading || !token.trim(), className: "mt-4 w-full py-2 px-4 bg-gov text-paper rounded-[var(--radius-sm)] text-[12.5px] font-medium hover:bg-gov-2 disabled:opacity-50 transition-colors focus:outline-2 focus:outline-offset-2 focus:outline-gov", children: loading ? "验证中…" : "进入工作台" })] })] })] }));
36
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Splash screen — 1-2s loading transition (C.0).
3
+ * Shows threshold mark + "PD" + "GOVERNANCE WORKSPACE" + progress bar.
4
+ * Auto-redirects after animation completes.
5
+ */
6
+ export declare function SplashScreen({ onComplete }: {
7
+ onComplete: () => void;
8
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ /**
4
+ * Splash screen — 1-2s loading transition (C.0).
5
+ * Shows threshold mark + "PD" + "GOVERNANCE WORKSPACE" + progress bar.
6
+ * Auto-redirects after animation completes.
7
+ */
8
+ export function SplashScreen({ onComplete }) {
9
+ React.useEffect(() => {
10
+ const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
11
+ const timeout = prefersReducedMotion ? 100 : 2200;
12
+ const timer = setTimeout(onComplete, timeout);
13
+ return () => clearTimeout(timer);
14
+ }, [onComplete]);
15
+ return (_jsxs("div", { className: "min-h-screen flex flex-col items-center justify-center bg-paper", style: {
16
+ backgroundImage: `linear-gradient(color-mix(in srgb, var(--color-gov) 3.5%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--color-gov) 3.5%, transparent) 1px, transparent 1px)`,
17
+ backgroundSize: "32px 32px",
18
+ }, children: [_jsxs("svg", { viewBox: "0 0 28 28", className: "w-16 h-16 text-gov animate-[fadeIn_200ms_ease-out]", fill: "none", stroke: "currentColor", strokeWidth: "1.5", children: [_jsx("path", { d: "M6 4V24M22 4V24M2 14H26", strokeLinecap: "square" }), _jsx("circle", { cx: "14", cy: "14", r: "2.5", fill: "currentColor", stroke: "none" })] }), _jsx("div", { className: "mt-6 font-mono text-[14px] tracking-[0.16em] font-bold text-ink animate-[fadeIn_500ms_ease-out_200ms_both]", children: "PD" }), _jsx("div", { className: "mt-2 font-mono text-[11px] tracking-[0.14em] text-ink-3 animate-[fadeIn_500ms_ease-out_400ms_both]", children: "GOVERNANCE WORKSPACE" }), _jsx("div", { className: "mt-8 w-48 h-1 bg-line rounded-full overflow-hidden animate-[fadeIn_500ms_ease-out_600ms_both]", children: _jsx("div", { className: "h-full bg-gov rounded-full animate-[progressFill_600ms_ease-out_1.2s_both]" }) }), _jsx("style", { children: `
19
+ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
20
+ @keyframes progressFill { from { width: 0; } to { width: 100%; } }
21
+ ` })] }));
22
+ }
@@ -0,0 +1 @@
1
+ export declare function AppSidebar(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,56 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link, useLocation, useNavigate } from "react-router-dom";
3
+ import { Sun, Moon, Focus, AlertTriangle, BookOpen, Zap, Archive, Settings, MessageSquare, RefreshCw, LogOut, Languages, } from "lucide-react";
4
+ import { useTheme } from "../theme-provider.js";
5
+ import { useTranslation } from "react-i18next";
6
+ import { clearToken } from "../../api.js";
7
+ import { cn } from "../../../lib/utils.js";
8
+ function ThresholdMark({ className }) {
9
+ return (_jsxs("svg", { viewBox: "0 0 28 28", className: className, fill: "none", stroke: "currentColor", strokeWidth: "1.5", "aria-hidden": "true", children: [_jsx("path", { d: "M6 4V24M22 4V24M2 14H26", strokeLinecap: "square" }), _jsx("circle", { cx: "14", cy: "14", r: "2.5", fill: "currentColor", stroke: "none" })] }));
10
+ }
11
+ const mainNavItems = [
12
+ { id: "focus", labelKey: "components.sidebar.focus", href: "/focus", icon: Focus, shortcut: "Alt+3" },
13
+ { id: "pain", labelKey: "components.sidebar.pain", href: "/pain", icon: AlertTriangle, shortcut: "Alt+4" },
14
+ { id: "principles", labelKey: "components.sidebar.principles", href: "/principles", icon: BookOpen, shortcut: "Alt+5" },
15
+ { id: "activation", labelKey: "components.sidebar.activation", href: "/activation", icon: Zap, shortcut: "Alt+6" },
16
+ { id: "debt", labelKey: "components.sidebar.debt", href: "/debt", icon: Archive, shortcut: "Alt+7" },
17
+ ];
18
+ const toolNavItems = [
19
+ { id: "control-center", labelKey: "components.sidebar.controlCenter", href: "/control-center", icon: Settings, shortcut: "Alt+8" },
20
+ { id: "report-problem", labelKey: "components.sidebar.reportProblem", href: "/report-problem", icon: MessageSquare, shortcut: "Alt+9" },
21
+ { id: "settings", labelKey: "components.sidebar.settings", href: "/settings", icon: Settings, shortcut: "Alt+0" },
22
+ { id: "update", labelKey: "components.sidebar.update", href: "/update", icon: RefreshCw, shortcut: "" },
23
+ ];
24
+ export function AppSidebar() {
25
+ const location = useLocation();
26
+ const navigate = useNavigate();
27
+ const { theme, setTheme } = useTheme();
28
+ const { t, i18n } = useTranslation();
29
+ const isActive = (href) => {
30
+ if (href === "/")
31
+ return location.pathname === "/";
32
+ return location.pathname === href || location.pathname.startsWith(href + "/");
33
+ };
34
+ const handleSignOut = () => {
35
+ clearToken();
36
+ navigate("/login");
37
+ };
38
+ const toggleLanguage = () => {
39
+ const nextLang = i18n.language === "zh-CN" ? "en" : "zh-CN";
40
+ i18n.changeLanguage(nextLang);
41
+ localStorage.setItem("pd-language", nextLang);
42
+ };
43
+ return (_jsxs("aside", { className: "w-[256px] h-screen fixed left-0 top-0 flex flex-col bg-surface border-r border-line flex-shrink-0 z-20", children: [_jsx("div", { className: "px-5 pt-5 pb-4", children: _jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx(ThresholdMark, { className: "w-6 h-6 text-gov" }), _jsxs("div", { children: [_jsx("div", { className: "font-mono text-[14px] tracking-[0.16em] font-bold text-ink", children: "PD" }), _jsx("div", { className: "font-mono text-[10px] tracking-[0.14em] text-ink-3", children: "GOVERNANCE WORKSPACE" })] })] }) }), _jsxs("nav", { className: "flex-1 py-2 overflow-y-auto", children: [_jsx("div", { className: "px-2", children: mainNavItems.map((item) => {
44
+ const Icon = item.icon;
45
+ const active = isActive(item.href);
46
+ return (_jsxs(Link, { to: item.href, "data-testid": `nav-${item.id}`, className: cn("flex items-center gap-3 px-3 py-2 rounded-[var(--radius-sm)] text-[13px] transition-colors", active
47
+ ? "border-l-2 border-l-gov bg-paper-2 text-ink"
48
+ : "text-ink-3 hover:text-ink hover:bg-paper-2"), children: [_jsx(Icon, { className: "h-4 w-4 flex-shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: t(item.labelKey) }), item.shortcut && (_jsx("span", { className: "text-ink-4 font-mono text-[11px]", children: item.shortcut }))] }, item.id));
49
+ }) }), _jsxs("div", { className: "mt-4 pt-3 border-t border-line mx-4", children: [_jsx("div", { className: "px-1 pb-1 text-[10px] font-mono tracking-[0.1em] uppercase text-ink-4", children: "Tools" }), _jsx("div", { className: "px-0", children: toolNavItems.map((item) => {
50
+ const Icon = item.icon;
51
+ const active = isActive(item.href);
52
+ return (_jsxs(Link, { to: item.href, "data-testid": `nav-${item.id}`, className: cn("flex items-center gap-3 px-3 py-1.5 rounded-[var(--radius-sm)] text-[12px] transition-colors", active
53
+ ? "border-l-2 border-l-gov bg-paper-2 text-ink"
54
+ : "text-ink-4 hover:text-ink-3 hover:bg-paper-2"), children: [_jsx(Icon, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" }), _jsx("span", { className: "flex-1", children: t(item.labelKey) }), item.shortcut && (_jsx("span", { className: "text-ink-4 font-mono text-[11px]", children: item.shortcut }))] }, item.id));
55
+ }) })] })] }), _jsxs("div", { className: "px-3 py-3 border-t border-line space-y-1", children: [_jsxs("button", { type: "button", onClick: () => setTheme(theme === "dark" ? "light" : "dark"), className: "flex items-center gap-3 px-3 py-1.5 rounded-[var(--radius-sm)] text-[12px] text-ink-4 hover:text-ink-3 hover:bg-paper-2 transition-colors w-full", title: theme === "dark" ? "切换亮色模式" : "切换暗色模式", children: [theme === "dark" ? (_jsx(Sun, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" })) : (_jsx(Moon, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" })), _jsx("span", { children: theme === "dark" ? "亮色模式" : "暗色模式" })] }), _jsxs("button", { type: "button", onClick: toggleLanguage, className: "flex items-center gap-3 px-3 py-1.5 rounded-[var(--radius-sm)] text-[12px] text-ink-4 hover:text-ink-3 hover:bg-paper-2 transition-colors w-full", title: "\u5207\u6362\u8BED\u8A00", children: [_jsx(Languages, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" }), _jsx("span", { children: i18n.language === "zh-CN" ? "English" : "中文" })] }), _jsxs("button", { type: "button", onClick: handleSignOut, className: "flex items-center gap-3 px-3 py-1.5 rounded-[var(--radius-sm)] text-[12px] text-ink-4 hover:text-ink-3 hover:bg-paper-2 transition-colors w-full", children: [_jsx(LogOut, { className: "h-3.5 w-3.5 flex-shrink-0", "aria-hidden": "true" }), _jsx("span", { children: "\u9000\u51FA" })] })] })] }));
56
+ }
@@ -0,0 +1,11 @@
1
+ import * as React from "react";
2
+ interface PageShellProps extends React.HTMLAttributes<HTMLDivElement> {
3
+ children: React.ReactNode;
4
+ }
5
+ /**
6
+ * 712px centered container — the "slow thinking" physical layout.
7
+ * Blueprint grid background is on body (globals.css), this adds
8
+ * the centered content column with generous whitespace.
9
+ */
10
+ export declare function PageShell({ children, className, ...props }: PageShellProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../../lib/utils.js";
3
+ /**
4
+ * 712px centered container — the "slow thinking" physical layout.
5
+ * Blueprint grid background is on body (globals.css), this adds
6
+ * the centered content column with generous whitespace.
7
+ */
8
+ export function PageShell({ children, className, ...props }) {
9
+ return (_jsx("div", { className: cn("mx-auto max-w-[712px] px-6 py-8", className), ...props, children: children }));
10
+ }
@@ -0,0 +1,10 @@
1
+ import * as React from "react";
2
+ interface SectionTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {
3
+ children: React.ReactNode;
4
+ }
5
+ /**
6
+ * 11px uppercase monospace section title with bottom border (B.4.6).
7
+ * Used for governance page section headings.
8
+ */
9
+ export declare function SectionTitle({ children, className, ...props }: SectionTitleProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../../lib/utils.js";
3
+ /**
4
+ * 11px uppercase monospace section title with bottom border (B.4.6).
5
+ * Used for governance page section headings.
6
+ */
7
+ export function SectionTitle({ children, className, ...props }) {
8
+ return (_jsx("h2", { className: cn("font-mono text-[11px] uppercase tracking-[0.1em] text-ink-3", "border-b border-line pb-2 mb-4", className), ...props, children: children }));
9
+ }
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- type Theme = "light" | "dark" | "system";
2
+ type Theme = "light" | "dark";
3
3
  interface ThemeProviderProps {
4
4
  children: React.ReactNode;
5
5
  defaultTheme?: Theme;