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
@@ -0,0 +1,995 @@
1
+ /**
2
+ * Runtime validators for untrusted API response data.
3
+ *
4
+ * These validators follow the Runtime Contract Rules (ERR-001/005/009/013):
5
+ * - All input is treated as `unknown` (Rule 1)
6
+ * - No `as` type assertions to bypass validation (Rule 2)
7
+ * - Required fields fail loud when missing (Rule 3)
8
+ * - Uses `Object.hasOwn()` for untrusted object keys (Rule 5)
9
+ * - Graceful degradation includes a reason (Rule 9)
10
+ */
11
+ // ── Primitive guards ──────────────────────────────────────────────────────────
12
+ function isString(v) {
13
+ return typeof v === 'string';
14
+ }
15
+ function isNumber(v) {
16
+ return typeof v === 'number' && !Number.isNaN(v);
17
+ }
18
+ function isBoolean(v) {
19
+ return typeof v === 'boolean';
20
+ }
21
+ function isObject(v) {
22
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
23
+ }
24
+ /** Read a nullable string field from an untrusted object. */
25
+ function readNullableString(v, key) {
26
+ if (!Object.hasOwn(v, key))
27
+ return { valid: true, value: null };
28
+ const val = v[key];
29
+ if (val === null || typeof val === 'string')
30
+ return { valid: true, value: val };
31
+ return { valid: false };
32
+ }
33
+ /** Read a nullable number field from an untrusted object. */
34
+ function readNullableNumber(v, key) {
35
+ if (!Object.hasOwn(v, key))
36
+ return { valid: true, value: null };
37
+ const val = v[key];
38
+ if (val === null || (typeof val === 'number' && !Number.isNaN(val)))
39
+ return { valid: true, value: val };
40
+ return { valid: false };
41
+ }
42
+ // ── Generic array element validator ───────────────────────────────────────────
43
+ function validateArray(v, validateElement) {
44
+ if (!Array.isArray(v))
45
+ return null;
46
+ const result = [];
47
+ for (const el of v) {
48
+ const validated = validateElement(el);
49
+ if (validated === null)
50
+ return null;
51
+ result.push(validated);
52
+ }
53
+ return result;
54
+ }
55
+ export function validateErrorResponse(v) {
56
+ if (!isObject(v))
57
+ return null;
58
+ const result = {};
59
+ if (Object.hasOwn(v, 'message') && isString(v.message)) {
60
+ result.message = v.message;
61
+ }
62
+ if (Object.hasOwn(v, 'error') && isString(v.error)) {
63
+ result.error = v.error;
64
+ }
65
+ if (Object.hasOwn(v, 'nextAction') && isString(v.nextAction)) {
66
+ result.nextAction = v.nextAction;
67
+ }
68
+ return result;
69
+ }
70
+ // ── Request headers validator ─────────────────────────────────────────────────
71
+ /**
72
+ * Validates that `options.headers` is a plain object with string values.
73
+ * Returns null if the value is not a valid headers object.
74
+ * Used instead of `as Record<string, string>` on untrusted RequestInit.headers.
75
+ */
76
+ export function validateHeaders(v) {
77
+ if (v === undefined || v === null)
78
+ return null;
79
+ if (!isObject(v))
80
+ return null;
81
+ const result = {};
82
+ for (const key of Object.keys(v)) {
83
+ const value = v[key];
84
+ if (!isString(value))
85
+ return null;
86
+ result[key] = value;
87
+ }
88
+ return result;
89
+ }
90
+ export function validateFeedbackReport(v) {
91
+ if (!isObject(v))
92
+ return null;
93
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
94
+ return null;
95
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
96
+ return null;
97
+ if (!Object.hasOwn(v, 'report') || !isObject(v.report))
98
+ return null;
99
+ return { id: v.id, createdAt: v.createdAt, report: v.report };
100
+ }
101
+ export function validateFeedbackDraftsList(v) {
102
+ if (!isObject(v))
103
+ return null;
104
+ if (!Object.hasOwn(v, 'drafts') || !Array.isArray(v.drafts))
105
+ return null;
106
+ return validateArray(v.drafts, (item) => {
107
+ if (!isObject(item))
108
+ return null;
109
+ if (!Object.hasOwn(item, 'id') || !isString(item.id))
110
+ return null;
111
+ if (!Object.hasOwn(item, 'createdAt') || !isString(item.createdAt))
112
+ return null;
113
+ if (!Object.hasOwn(item, 'type') || !isString(item.type))
114
+ return null;
115
+ if (!Object.hasOwn(item, 'title') || !isString(item.title))
116
+ return null;
117
+ return { id: item.id, createdAt: item.createdAt, type: item.type, title: item.title };
118
+ });
119
+ }
120
+ export function validateFeedbackDraftEnvelope(v) {
121
+ if (!isObject(v))
122
+ return null;
123
+ if (!Object.hasOwn(v, 'report') || !isObject(v.report))
124
+ return null;
125
+ return { report: v.report };
126
+ }
127
+ export function validateDeleteEnvelope(v) {
128
+ if (!isObject(v))
129
+ return null;
130
+ if (!Object.hasOwn(v, 'deleted') || !isBoolean(v.deleted))
131
+ return null;
132
+ return { deleted: v.deleted };
133
+ }
134
+ function validateWorkspaceConfig(v) {
135
+ if (!isObject(v))
136
+ return null;
137
+ if (!Object.hasOwn(v, 'workspaceName') || !isString(v.workspaceName))
138
+ return null;
139
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
140
+ return null;
141
+ const displayName = readNullableString(v, 'displayName');
142
+ if (!displayName.valid)
143
+ return null;
144
+ if (!Object.hasOwn(v, 'syncEnabled') || !isBoolean(v.syncEnabled))
145
+ return null;
146
+ return {
147
+ workspaceName: v.workspaceName,
148
+ enabled: v.enabled,
149
+ displayName: displayName.value,
150
+ syncEnabled: v.syncEnabled,
151
+ };
152
+ }
153
+ export function validateWorkspaceEntry(v) {
154
+ if (!isObject(v))
155
+ return null;
156
+ if (!Object.hasOwn(v, 'name') || !isString(v.name))
157
+ return null;
158
+ if (!Object.hasOwn(v, 'path') || !isString(v.path))
159
+ return null;
160
+ const lastSync = readNullableString(v, 'lastSync');
161
+ if (!lastSync.valid)
162
+ return null;
163
+ let config = null;
164
+ if (Object.hasOwn(v, 'config') && v.config !== null) {
165
+ config = validateWorkspaceConfig(v.config);
166
+ if (config === null)
167
+ return null;
168
+ }
169
+ return {
170
+ name: v.name,
171
+ path: v.path,
172
+ lastSync: lastSync.value,
173
+ config,
174
+ };
175
+ }
176
+ export function validateWorkspaceList(v) {
177
+ return validateArray(v, validateWorkspaceEntry);
178
+ }
179
+ export function validateRemovedEnvelope(v) {
180
+ if (!isObject(v))
181
+ return null;
182
+ if (!Object.hasOwn(v, 'removed') || !isString(v.removed))
183
+ return null;
184
+ return { removed: v.removed };
185
+ }
186
+ export function validateSyncResult(v) {
187
+ if (!isObject(v))
188
+ return null;
189
+ if (!Object.hasOwn(v, 'success') || !isBoolean(v.success))
190
+ return null;
191
+ if (!Object.hasOwn(v, 'syncedAt') || !isString(v.syncedAt))
192
+ return null;
193
+ return { success: v.success, syncedAt: v.syncedAt };
194
+ }
195
+ function validateReadinessStatus(v) {
196
+ switch (v) {
197
+ case 'ready':
198
+ case 'not_ready':
199
+ case 'needs_setup':
200
+ case 'disabled':
201
+ case 'unknown':
202
+ return v;
203
+ default:
204
+ return null;
205
+ }
206
+ }
207
+ function validateRuntimeProfileSummary(v) {
208
+ if (!isObject(v))
209
+ return null;
210
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
211
+ return null;
212
+ if (!Object.hasOwn(v, 'type') || !isString(v.type))
213
+ return null;
214
+ if (!Object.hasOwn(v, 'label') || !isString(v.label))
215
+ return null;
216
+ if (Object.hasOwn(v, 'apiKeyEnv') && !isString(v.apiKeyEnv))
217
+ return null;
218
+ if (!Object.hasOwn(v, 'readiness'))
219
+ return null;
220
+ const readiness = validateReadinessStatus(v.readiness);
221
+ if (readiness === null)
222
+ return null;
223
+ return {
224
+ id: v.id, type: v.type, label: v.label,
225
+ ...(Object.hasOwn(v, 'apiKeyEnv') && isString(v.apiKeyEnv) ? { apiKeyEnv: v.apiKeyEnv } : {}),
226
+ readiness,
227
+ };
228
+ }
229
+ function validateFeatureSummary(v) {
230
+ if (!isObject(v))
231
+ return null;
232
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
233
+ return null;
234
+ if (!Object.hasOwn(v, 'category') || !isString(v.category))
235
+ return null;
236
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
237
+ return null;
238
+ return { id: v.id, category: v.category, enabled: v.enabled };
239
+ }
240
+ function validateAgentSummary(v) {
241
+ if (!isObject(v))
242
+ return null;
243
+ if (!Object.hasOwn(v, 'name') || !isString(v.name))
244
+ return null;
245
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
246
+ return null;
247
+ if (!Object.hasOwn(v, 'runtimeProfileId') || !isString(v.runtimeProfileId))
248
+ return null;
249
+ if (!Object.hasOwn(v, 'runtimeProfileLabel') || !isString(v.runtimeProfileLabel))
250
+ return null;
251
+ if (!Object.hasOwn(v, 'readiness'))
252
+ return null;
253
+ const readiness = validateReadinessStatus(v.readiness);
254
+ if (readiness === null)
255
+ return null;
256
+ return { name: v.name, enabled: v.enabled, runtimeProfileId: v.runtimeProfileId, runtimeProfileLabel: v.runtimeProfileLabel, readiness };
257
+ }
258
+ function validateConfigError(v) {
259
+ if (!isObject(v))
260
+ return null;
261
+ if (!Object.hasOwn(v, 'path') || !isString(v.path))
262
+ return null;
263
+ if (!Object.hasOwn(v, 'reason') || !isString(v.reason))
264
+ return null;
265
+ if (!Object.hasOwn(v, 'nextAction') || !isString(v.nextAction))
266
+ return null;
267
+ return { path: v.path, reason: v.reason, nextAction: v.nextAction };
268
+ }
269
+ function validateConfigSource(v) {
270
+ switch (v) {
271
+ case 'defaults':
272
+ case 'user_config':
273
+ return v;
274
+ default:
275
+ return null;
276
+ }
277
+ }
278
+ export function validateConfigSummary(v) {
279
+ if (!isObject(v))
280
+ return null;
281
+ if (!Object.hasOwn(v, 'version') || !isNumber(v.version))
282
+ return null;
283
+ if (!Object.hasOwn(v, 'source'))
284
+ return null;
285
+ const source = validateConfigSource(v.source);
286
+ if (source === null)
287
+ return null;
288
+ if (!Object.hasOwn(v, 'features') || !Array.isArray(v.features))
289
+ return null;
290
+ if (!Object.hasOwn(v, 'runtimeProfiles') || !Array.isArray(v.runtimeProfiles))
291
+ return null;
292
+ if (!Object.hasOwn(v, 'defaultRuntime') || !isString(v.defaultRuntime))
293
+ return null;
294
+ if (!Object.hasOwn(v, 'agents') || !Array.isArray(v.agents))
295
+ return null;
296
+ if (!Object.hasOwn(v, 'ui') || !isObject(v.ui))
297
+ return null;
298
+ if (!Object.hasOwn(v, 'warnings') || !Array.isArray(v.warnings))
299
+ return null;
300
+ const features = validateArray(v.features, validateFeatureSummary);
301
+ if (features === null)
302
+ return null;
303
+ const runtimeProfiles = validateArray(v.runtimeProfiles, validateRuntimeProfileSummary);
304
+ if (runtimeProfiles === null)
305
+ return null;
306
+ const agents = validateArray(v.agents, validateAgentSummary);
307
+ if (agents === null)
308
+ return null;
309
+ const warnings = validateArray(v.warnings, (el) => isString(el) ? el : null);
310
+ if (warnings === null)
311
+ return null;
312
+ // ui.diagnostics.mode
313
+ const { ui } = v;
314
+ if (!Object.hasOwn(ui, 'diagnostics') || !isObject(ui.diagnostics))
315
+ return null;
316
+ if (!Object.hasOwn(ui.diagnostics, 'mode') || !isString(ui.diagnostics.mode))
317
+ return null;
318
+ let errors;
319
+ if (Object.hasOwn(v, 'errors') && Array.isArray(v.errors)) {
320
+ errors = validateArray(v.errors, validateConfigError) ?? undefined;
321
+ }
322
+ return {
323
+ version: v.version, source, features, runtimeProfiles,
324
+ defaultRuntime: v.defaultRuntime, agents,
325
+ ui: { diagnostics: { mode: ui.diagnostics.mode } },
326
+ warnings, errors,
327
+ };
328
+ }
329
+ export function validateConfigCatalog(v) {
330
+ if (!isObject(v))
331
+ return null;
332
+ if (!Object.hasOwn(v, 'profiles') || !Array.isArray(v.profiles))
333
+ return null;
334
+ const profiles = validateArray(v.profiles, validateRuntimeProfileSummary);
335
+ if (profiles === null)
336
+ return null;
337
+ let errors;
338
+ if (Object.hasOwn(v, 'errors') && Array.isArray(v.errors)) {
339
+ errors = validateArray(v.errors, validateConfigError) ?? undefined;
340
+ }
341
+ return { profiles, errors };
342
+ }
343
+ export function validateAgentBindingUpdate(v) {
344
+ if (!isObject(v))
345
+ return null;
346
+ if (!Object.hasOwn(v, 'agent') || !isString(v.agent))
347
+ return null;
348
+ if (!Object.hasOwn(v, 'runtimeProfile') || !isString(v.runtimeProfile))
349
+ return null;
350
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
351
+ return null;
352
+ return { agent: v.agent, runtimeProfile: v.runtimeProfile, enabled: v.enabled };
353
+ }
354
+ export function validateReadinessCheck(v) {
355
+ if (!isObject(v))
356
+ return null;
357
+ if (!Object.hasOwn(v, 'agent') || !isString(v.agent))
358
+ return null;
359
+ if (!Object.hasOwn(v, 'readiness'))
360
+ return null;
361
+ const readiness = validateReadinessStatus(v.readiness);
362
+ if (readiness === null)
363
+ return null;
364
+ if (!Object.hasOwn(v, 'profileId') || !isString(v.profileId))
365
+ return null;
366
+ if (!Object.hasOwn(v, 'profileLabel') || !isString(v.profileLabel))
367
+ return null;
368
+ const result = { agent: v.agent, readiness, profileId: v.profileId, profileLabel: v.profileLabel };
369
+ if (Object.hasOwn(v, 'reason') && isString(v.reason))
370
+ result.reason = v.reason;
371
+ if (Object.hasOwn(v, 'nextAction') && isString(v.nextAction))
372
+ result.nextAction = v.nextAction;
373
+ return result;
374
+ }
375
+ export function validateDefaultRuntimeUpdate(v) {
376
+ if (!isObject(v))
377
+ return null;
378
+ if (!Object.hasOwn(v, 'defaultRuntime') || !isString(v.defaultRuntime))
379
+ return null;
380
+ return { defaultRuntime: v.defaultRuntime };
381
+ }
382
+ function validateHealthCheckItem(v) {
383
+ if (!isObject(v))
384
+ return null;
385
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
386
+ return null;
387
+ if (!Object.hasOwn(v, 'name') || !isString(v.name))
388
+ return null;
389
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
390
+ return null;
391
+ if (!Object.hasOwn(v, 'message') || !isString(v.message))
392
+ return null;
393
+ if (!Object.hasOwn(v, 'lastCheck') || !isString(v.lastCheck))
394
+ return null;
395
+ return { id: v.id, name: v.name, status: v.status, message: v.message, lastCheck: v.lastCheck };
396
+ }
397
+ export function validateConfigReadiness(v) {
398
+ if (!isObject(v))
399
+ return null;
400
+ if (!Object.hasOwn(v, 'checks') || !Array.isArray(v.checks))
401
+ return null;
402
+ if (!Object.hasOwn(v, 'generatedAt') || !isString(v.generatedAt))
403
+ return null;
404
+ const checks = validateArray(v.checks, validateHealthCheckItem);
405
+ if (checks === null)
406
+ return null;
407
+ return { checks, generatedAt: v.generatedAt };
408
+ }
409
+ function validateStagnationSignal(v) {
410
+ if (!isObject(v))
411
+ return null;
412
+ if (!Object.hasOwn(v, 'type') || !isString(v.type))
413
+ return null;
414
+ if (!Object.hasOwn(v, 'principleId') || !isString(v.principleId))
415
+ return null;
416
+ if (!Object.hasOwn(v, 'daysSince') || !isNumber(v.daysSince))
417
+ return null;
418
+ return { type: v.type, principleId: v.principleId, daysSince: v.daysSince };
419
+ }
420
+ const VALID_GOVERNANCE_STATES = new Set(['none', 'in_progress', 'owner_review_ready', 'degraded']);
421
+ const VALID_STATE_REASON_CODES = new Set([
422
+ 'state_db_missing', 'no_pipeline_activity', 'pending_approvals',
423
+ 'pipeline_active', 'consumed_candidates', 'degraded_state',
424
+ ]);
425
+ const VALID_NEXT_ACTION_CODES = new Set([
426
+ 'run_config_doctor', 'wait_for_pipeline', 'review_approvals',
427
+ 'check_degraded_signals', 'check_pipeline_status',
428
+ ]);
429
+ const VALID_DEGRADED_REASON_CODES = new Set(['task_retry_wait', 'task_failed', 'approval_table_missing']);
430
+ const VALID_DEGRADED_NEXT_ACTION_CODES = new Set(['check_task_status', 'fix_and_retry', 'run_integrity_check']);
431
+ function validateDegradedSignal(v) {
432
+ if (!isObject(v))
433
+ return null;
434
+ if (!Object.hasOwn(v, 'reasonCode') || !isString(v.reasonCode))
435
+ return null;
436
+ if (!VALID_DEGRADED_REASON_CODES.has(v.reasonCode))
437
+ return null;
438
+ if (!Object.hasOwn(v, 'nextActionCode') || !isString(v.nextActionCode))
439
+ return null;
440
+ if (!VALID_DEGRADED_NEXT_ACTION_CODES.has(v.nextActionCode))
441
+ return null;
442
+ if (!Object.hasOwn(v, 'reason') || !isString(v.reason))
443
+ return null;
444
+ if (!Object.hasOwn(v, 'nextAction') || !isString(v.nextAction))
445
+ return null;
446
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
447
+ return null;
448
+ return {
449
+ reasonCode: v.reasonCode,
450
+ nextActionCode: v.nextActionCode,
451
+ reason: v.reason,
452
+ nextAction: v.nextAction,
453
+ source: v.source,
454
+ };
455
+ }
456
+ export function validateGovernanceQueue(v) {
457
+ if (!isObject(v))
458
+ return null;
459
+ if (!Object.hasOwn(v, 'pendingReviewCount') || !isNumber(v.pendingReviewCount))
460
+ return null;
461
+ if (!Object.hasOwn(v, 'behaviorDeviationCount') || !isNumber(v.behaviorDeviationCount))
462
+ return null;
463
+ if (!Object.hasOwn(v, 'stagnationSignals') || !Array.isArray(v.stagnationSignals))
464
+ return null;
465
+ if (!Object.hasOwn(v, 'governanceState') || !isString(v.governanceState))
466
+ return null;
467
+ if (!VALID_GOVERNANCE_STATES.has(v.governanceState))
468
+ return null;
469
+ if (!Object.hasOwn(v, 'stateReasonCode') || !isString(v.stateReasonCode))
470
+ return null;
471
+ if (!VALID_STATE_REASON_CODES.has(v.stateReasonCode))
472
+ return null;
473
+ if (!Object.hasOwn(v, 'nextActionCode') || !isString(v.nextActionCode))
474
+ return null;
475
+ if (!VALID_NEXT_ACTION_CODES.has(v.nextActionCode))
476
+ return null;
477
+ if (!Object.hasOwn(v, 'stateReason') || !isString(v.stateReason))
478
+ return null;
479
+ if (!Object.hasOwn(v, 'nextAction') || !isString(v.nextAction))
480
+ return null;
481
+ const signals = validateArray(v.stagnationSignals, validateStagnationSignal);
482
+ if (signals === null)
483
+ return null;
484
+ const result = {
485
+ pendingReviewCount: v.pendingReviewCount,
486
+ behaviorDeviationCount: v.behaviorDeviationCount,
487
+ stagnationSignals: signals,
488
+ governanceState: VALID_GOVERNANCE_STATES.has(v.governanceState)
489
+ ? v.governanceState
490
+ : 'none',
491
+ stateReasonCode: v.stateReasonCode,
492
+ nextActionCode: v.nextActionCode,
493
+ stateReason: v.stateReason,
494
+ nextAction: v.nextAction,
495
+ };
496
+ // Optional fields — fail loud when present but wrong type (ERR-009)
497
+ if (Object.hasOwn(v, 'inProgressSummary')) {
498
+ if (!isString(v.inProgressSummary))
499
+ return null;
500
+ result.inProgressSummary = v.inProgressSummary;
501
+ }
502
+ if (Object.hasOwn(v, 'degradedSignals')) {
503
+ if (!Array.isArray(v.degradedSignals))
504
+ return null;
505
+ const ds = validateArray(v.degradedSignals, validateDegradedSignal);
506
+ if (ds === null)
507
+ return null;
508
+ result.degradedSignals = ds;
509
+ }
510
+ if (Object.hasOwn(v, 'note')) {
511
+ if (!isString(v.note))
512
+ return null;
513
+ result.note = v.note;
514
+ }
515
+ if (Object.hasOwn(v, 'generatedAt')) {
516
+ if (!isString(v.generatedAt))
517
+ return null;
518
+ result.generatedAt = v.generatedAt;
519
+ }
520
+ return result;
521
+ }
522
+ function validateActivationRecord(v) {
523
+ if (!isObject(v))
524
+ return null;
525
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
526
+ return null;
527
+ if (!Object.hasOwn(v, 'artifactId') || !isString(v.artifactId))
528
+ return null;
529
+ if (!Object.hasOwn(v, 'principleId') || !isString(v.principleId))
530
+ return null;
531
+ if (!Object.hasOwn(v, 'channel') || !isString(v.channel))
532
+ return null;
533
+ if (!Object.hasOwn(v, 'action') || !isString(v.action))
534
+ return null;
535
+ if (!Object.hasOwn(v, 'targetRef') || !isString(v.targetRef))
536
+ return null;
537
+ const activatedAt = readNullableString(v, 'activatedAt');
538
+ if (!activatedAt.valid)
539
+ return null;
540
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
541
+ return null;
542
+ return {
543
+ id: v.id, artifactId: v.artifactId, principleId: v.principleId,
544
+ channel: v.channel, action: v.action, targetRef: v.targetRef,
545
+ activatedAt: activatedAt.value,
546
+ status: v.status,
547
+ };
548
+ }
549
+ export function validateActivations(v) {
550
+ if (!isObject(v))
551
+ return null;
552
+ if (!Object.hasOwn(v, 'activations') || !Array.isArray(v.activations))
553
+ return null;
554
+ if (!Object.hasOwn(v, 'generatedAt') || !isString(v.generatedAt))
555
+ return null;
556
+ const activations = validateArray(v.activations, validateActivationRecord);
557
+ if (activations === null)
558
+ return null;
559
+ const result = { activations, generatedAt: v.generatedAt };
560
+ if (Object.hasOwn(v, 'note') && isString(v.note))
561
+ result.note = v.note;
562
+ return result;
563
+ }
564
+ export function validateDisableActivation(v) {
565
+ if (!isObject(v))
566
+ return null;
567
+ if (!Object.hasOwn(v, 'activationId') || !isString(v.activationId))
568
+ return null;
569
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
570
+ return null;
571
+ return { activationId: v.activationId, status: v.status };
572
+ }
573
+ function validateLifecycleAdherence(v) {
574
+ if (!isObject(v))
575
+ return null;
576
+ if (!Object.hasOwn(v, 'insufficientData') || !isBoolean(v.insufficientData))
577
+ return null;
578
+ const rate = readNullableNumber(v, 'rate');
579
+ if (!rate.valid)
580
+ return null;
581
+ if (!Object.hasOwn(v, 'note') || !isString(v.note))
582
+ return null;
583
+ return {
584
+ insufficientData: v.insufficientData,
585
+ rate: rate.value,
586
+ note: v.note,
587
+ };
588
+ }
589
+ function validateLifecycleRuleMetric(v) {
590
+ if (!isObject(v))
591
+ return null;
592
+ if (!Object.hasOwn(v, 'ruleId') || !isString(v.ruleId))
593
+ return null;
594
+ if (!Object.hasOwn(v, 'triggered') || !isNumber(v.triggered))
595
+ return null;
596
+ const lastTriggeredAt = readNullableString(v, 'lastTriggeredAt');
597
+ if (!lastTriggeredAt.valid)
598
+ return null;
599
+ return {
600
+ ruleId: v.ruleId, triggered: v.triggered,
601
+ lastTriggeredAt: lastTriggeredAt.value,
602
+ };
603
+ }
604
+ export function validateLifecycleMetrics(v) {
605
+ if (!isObject(v))
606
+ return null;
607
+ if (!Object.hasOwn(v, 'principleId') || !isString(v.principleId))
608
+ return null;
609
+ if (!Object.hasOwn(v, 'adherence'))
610
+ return null;
611
+ const adherence = validateLifecycleAdherence(v.adherence);
612
+ if (adherence === null)
613
+ return null;
614
+ if (!Object.hasOwn(v, 'ruleMetrics') || !Array.isArray(v.ruleMetrics))
615
+ return null;
616
+ const ruleMetrics = validateArray(v.ruleMetrics, validateLifecycleRuleMetric);
617
+ if (ruleMetrics === null)
618
+ return null;
619
+ return { principleId: v.principleId, adherence, ruleMetrics };
620
+ }
621
+ export function validateUpdateStatus(v) {
622
+ if (!isObject(v))
623
+ return null;
624
+ if (!Object.hasOwn(v, 'currentVersion') || !isString(v.currentVersion))
625
+ return null;
626
+ if (!Object.hasOwn(v, 'latestVersion') || !isString(v.latestVersion))
627
+ return null;
628
+ if (!Object.hasOwn(v, 'updateAvailable') || !isBoolean(v.updateAvailable))
629
+ return null;
630
+ if (!Object.hasOwn(v, 'lastChecked') || !isString(v.lastChecked))
631
+ return null;
632
+ return { currentVersion: v.currentVersion, latestVersion: v.latestVersion, updateAvailable: v.updateAvailable, lastChecked: v.lastChecked };
633
+ }
634
+ function validateUpdateHistoryEntry(v) {
635
+ if (!isObject(v))
636
+ return null;
637
+ if (!Object.hasOwn(v, 'version') || !isString(v.version))
638
+ return null;
639
+ if (!Object.hasOwn(v, 'appliedAt') || !isString(v.appliedAt))
640
+ return null;
641
+ if (!Object.hasOwn(v, 'notes') || !isString(v.notes))
642
+ return null;
643
+ return { version: v.version, appliedAt: v.appliedAt, notes: v.notes };
644
+ }
645
+ export function validateUpdateHistory(v) {
646
+ if (!isObject(v))
647
+ return null;
648
+ if (!Object.hasOwn(v, 'updates') || !Array.isArray(v.updates))
649
+ return null;
650
+ const updates = validateArray(v.updates, validateUpdateHistoryEntry);
651
+ if (updates === null)
652
+ return null;
653
+ return { updates };
654
+ }
655
+ function validateApprovalRecord(v) {
656
+ if (!isObject(v))
657
+ return null;
658
+ if (!Object.hasOwn(v, 'approvalId') || !isString(v.approvalId))
659
+ return null;
660
+ if (!Object.hasOwn(v, 'artifactId') || !isString(v.artifactId))
661
+ return null;
662
+ if (!Object.hasOwn(v, 'channel') || !isString(v.channel))
663
+ return null;
664
+ if (!Object.hasOwn(v, 'riskLevel') || !isString(v.riskLevel))
665
+ return null;
666
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
667
+ return null;
668
+ if (Object.hasOwn(v, 'confidence') && !isNumber(v.confidence))
669
+ return null;
670
+ if (!Object.hasOwn(v, 'requestedAt') || !isString(v.requestedAt))
671
+ return null;
672
+ const result = {
673
+ approvalId: v.approvalId, artifactId: v.artifactId, channel: v.channel,
674
+ riskLevel: v.riskLevel, status: v.status,
675
+ confidence: Object.hasOwn(v, 'confidence') && isNumber(v.confidence) ? v.confidence : undefined,
676
+ requestedAt: v.requestedAt,
677
+ decidedAt: Object.hasOwn(v, 'decidedAt') && isString(v.decidedAt) ? v.decidedAt : undefined,
678
+ decidedBy: Object.hasOwn(v, 'decidedBy') && isString(v.decidedBy) ? v.decidedBy : undefined,
679
+ decisionNote: Object.hasOwn(v, 'decisionNote') && isString(v.decisionNote) ? v.decisionNote : undefined,
680
+ rejectionReason: Object.hasOwn(v, 'rejectionReason') && isString(v.rejectionReason) ? v.rejectionReason : undefined,
681
+ summary: Object.hasOwn(v, 'summary') && isString(v.summary) ? v.summary : undefined,
682
+ triggerReason: Object.hasOwn(v, 'triggerReason') && isString(v.triggerReason) ? v.triggerReason : undefined,
683
+ confidenceLabel: Object.hasOwn(v, 'confidenceLabel') && isString(v.confidenceLabel) ? v.confidenceLabel : undefined,
684
+ confidenceExplanation: Object.hasOwn(v, 'confidenceExplanation') && isString(v.confidenceExplanation) ? v.confidenceExplanation : undefined,
685
+ effectDescription: Object.hasOwn(v, 'effectDescription') && isString(v.effectDescription) ? v.effectDescription : undefined,
686
+ rejectionEffect: Object.hasOwn(v, 'rejectionEffect') && isString(v.rejectionEffect) ? v.rejectionEffect : undefined,
687
+ };
688
+ if (Object.hasOwn(v, 'isMvpProven') && isBoolean(v.isMvpProven))
689
+ result.isMvpProven = v.isMvpProven;
690
+ return result;
691
+ }
692
+ export function validateApprovalListResult(v) {
693
+ if (!isObject(v))
694
+ return null;
695
+ if (!Object.hasOwn(v, 'items') || !Array.isArray(v.items))
696
+ return null;
697
+ if (!Object.hasOwn(v, 'total') || !isNumber(v.total))
698
+ return null;
699
+ if (!Object.hasOwn(v, 'stats') || !isObject(v.stats))
700
+ return null;
701
+ const { stats } = v;
702
+ if (!Object.hasOwn(stats, 'pending') || !isNumber(stats.pending))
703
+ return null;
704
+ if (!Object.hasOwn(stats, 'approved') || !isNumber(stats.approved))
705
+ return null;
706
+ if (!Object.hasOwn(stats, 'rejected') || !isNumber(stats.rejected))
707
+ return null;
708
+ if (!Object.hasOwn(stats, 'cancelled') || !isNumber(stats.cancelled))
709
+ return null;
710
+ const items = validateArray(v.items, validateApprovalRecord);
711
+ if (items === null)
712
+ return null;
713
+ return { items, total: v.total, stats: { pending: stats.pending, approved: stats.approved, rejected: stats.rejected, cancelled: stats.cancelled } };
714
+ }
715
+ // Re-export the private validateApprovalRecord for direct use
716
+ export { validateApprovalRecord as validateApprovalRecordDirect };
717
+ const VALID_WARNING_CODES = ['technical_pattern', 'diagnostic_residue', 'title_too_long'];
718
+ function isReadabilityWarningCode(value) {
719
+ return isString(value) && VALID_WARNING_CODES.includes(value);
720
+ }
721
+ function validatePrincipleListItem(v) {
722
+ if (!isObject(v))
723
+ return null;
724
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
725
+ return null;
726
+ if (!Object.hasOwn(v, 'text') || !isString(v.text))
727
+ return null;
728
+ if (!Object.hasOwn(v, 'triggerPattern') || !isString(v.triggerPattern))
729
+ return null;
730
+ if (!Object.hasOwn(v, 'action') || !isString(v.action))
731
+ return null;
732
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
733
+ return null;
734
+ if (!Object.hasOwn(v, 'priority') || !isString(v.priority))
735
+ return null;
736
+ if (!Object.hasOwn(v, 'scope') || !isString(v.scope))
737
+ return null;
738
+ const domain = readNullableString(v, 'domain');
739
+ if (!domain.valid)
740
+ return null;
741
+ if (!Object.hasOwn(v, 'evaluability') || !isString(v.evaluability))
742
+ return null;
743
+ if (!Object.hasOwn(v, 'valueScore') || !isNumber(v.valueScore))
744
+ return null;
745
+ if (!Object.hasOwn(v, 'adherenceRate') || !isNumber(v.adherenceRate))
746
+ return null;
747
+ if (!Object.hasOwn(v, 'painPreventedCount') || !isNumber(v.painPreventedCount))
748
+ return null;
749
+ if (!Object.hasOwn(v, 'ruleCount') || !isNumber(v.ruleCount))
750
+ return null;
751
+ if (!Object.hasOwn(v, 'conflictsWithCount') || !isNumber(v.conflictsWithCount))
752
+ return null;
753
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
754
+ return null;
755
+ if (!Object.hasOwn(v, 'updatedAt') || !isString(v.updatedAt))
756
+ return null;
757
+ const result = {
758
+ id: v.id, text: v.text, triggerPattern: v.triggerPattern, action: v.action,
759
+ status: v.status, priority: v.priority, scope: v.scope,
760
+ domain: domain.value,
761
+ evaluability: v.evaluability, valueScore: v.valueScore, adherenceRate: v.adherenceRate,
762
+ painPreventedCount: v.painPreventedCount, ruleCount: v.ruleCount,
763
+ conflictsWithCount: v.conflictsWithCount, createdAt: v.createdAt, updatedAt: v.updatedAt,
764
+ // PRI-332: detectedLanguage — absent defaults to 'unknown'; present but malformed → fail loud (ERR-009)
765
+ detectedLanguage: 'unknown',
766
+ };
767
+ if (Object.hasOwn(v, 'detectedLanguage')) {
768
+ if (!isString(v.detectedLanguage))
769
+ return null;
770
+ result.detectedLanguage = v.detectedLanguage;
771
+ }
772
+ // PRI-332 P1-5: readabilityWarningCode is optional — fail loud when present but invalid (ERR-009)
773
+ if (Object.hasOwn(v, 'readabilityWarningCode')) {
774
+ if (!isReadabilityWarningCode(v.readabilityWarningCode))
775
+ return null;
776
+ result.readabilityWarningCode = v.readabilityWarningCode;
777
+ }
778
+ return result;
779
+ }
780
+ export function validatePrinciplesList(v) {
781
+ if (!isObject(v))
782
+ return null;
783
+ if (!Object.hasOwn(v, 'principles') || !Array.isArray(v.principles))
784
+ return null;
785
+ if (!Object.hasOwn(v, 'summary') || !isObject(v.summary))
786
+ return null;
787
+ const s = v.summary;
788
+ const { candidate, probation, active, deprecated, archived, total } = s;
789
+ if (!isNumber(candidate) || !isNumber(probation) || !isNumber(active) || !isNumber(deprecated) || !isNumber(archived) || !isNumber(total))
790
+ return null;
791
+ const principles = validateArray(v.principles, validatePrincipleListItem);
792
+ if (principles === null)
793
+ return null;
794
+ // categories is optional (PRI-330) — EP-01: runtime validate, no `as` bypass
795
+ // When present but invalid, fail loud (ERR-009: required-ish fields fail loud)
796
+ let categories;
797
+ if (Object.hasOwn(v, 'categories')) {
798
+ if (!isObject(v.categories))
799
+ return null; // categories exists but is not an object → reject
800
+ const raw = v.categories;
801
+ const validated = {};
802
+ for (const [key, val] of Object.entries(raw)) {
803
+ if (!isNumber(val))
804
+ return null; // categories value is not a number → reject
805
+ validated[key] = val;
806
+ }
807
+ if (Object.keys(validated).length > 0) {
808
+ categories = validated;
809
+ }
810
+ }
811
+ // approvalCrossCheckUnavailable — optional string, fail loud if wrong type
812
+ // (ERR-009: required-ish fields fail loud; ERR-002: no silent degradation)
813
+ if (Object.hasOwn(v, 'approvalCrossCheckUnavailable') && !isString(v.approvalCrossCheckUnavailable)) {
814
+ return null;
815
+ }
816
+ const approvalCrossCheckUnavailable = isString(v.approvalCrossCheckUnavailable)
817
+ ? v.approvalCrossCheckUnavailable
818
+ : undefined;
819
+ return {
820
+ principles,
821
+ summary: { candidate, probation, active, deprecated, archived, total },
822
+ ...(categories !== undefined ? { categories } : {}),
823
+ ...(approvalCrossCheckUnavailable !== undefined ? { approvalCrossCheckUnavailable } : {}),
824
+ };
825
+ }
826
+ function validateApprovalGroupRecord(v) {
827
+ if (!isObject(v))
828
+ return null;
829
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
830
+ return null;
831
+ if (!Object.hasOwn(v, 'artifactId') || !isString(v.artifactId))
832
+ return null;
833
+ if (!Object.hasOwn(v, 'channel') || !isString(v.channel))
834
+ return null;
835
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
836
+ return null;
837
+ return { id: v.id, artifactId: v.artifactId, channel: v.channel, createdAt: v.createdAt };
838
+ }
839
+ function validateApprovalGroup(v) {
840
+ if (!isObject(v))
841
+ return null;
842
+ if (!Object.hasOwn(v, 'principleId') || !isString(v.principleId))
843
+ return null;
844
+ if (!Object.hasOwn(v, 'principleTitle') || !isString(v.principleTitle))
845
+ return null;
846
+ if (!Object.hasOwn(v, 'status') || !isString(v.status))
847
+ return null;
848
+ if (!Object.hasOwn(v, 'records') || !Array.isArray(v.records))
849
+ return null;
850
+ const records = validateArray(v.records, validateApprovalGroupRecord);
851
+ if (records === null)
852
+ return null;
853
+ return { principleId: v.principleId, principleTitle: v.principleTitle, status: v.status, records };
854
+ }
855
+ export function validateApprovalsGrouped(v) {
856
+ if (!isObject(v))
857
+ return null;
858
+ if (!Object.hasOwn(v, 'groups') || !Array.isArray(v.groups))
859
+ return null;
860
+ if (!Object.hasOwn(v, 'generatedAt') || !isString(v.generatedAt))
861
+ return null;
862
+ const groups = validateArray(v.groups, validateApprovalGroup);
863
+ if (groups === null)
864
+ return null;
865
+ const result = { groups, generatedAt: v.generatedAt };
866
+ if (Object.hasOwn(v, 'note') && isString(v.note))
867
+ result.note = v.note;
868
+ return result;
869
+ }
870
+ // ── Evidence Chain (PRI-331) ──────────────────────────────────────────────────
871
+ const VALID_EVIDENCE_CHAIN_STATES = new Set([
872
+ 'evidence_only',
873
+ 'pain_recorded',
874
+ 'diagnosis_queued',
875
+ 'diagnosis_running',
876
+ 'diagnosis_succeeded',
877
+ 'diagnosis_failed',
878
+ 'diagnosis_retry_wait',
879
+ 'candidate_generated',
880
+ 'internalization_started',
881
+ ]);
882
+ function validateEvidenceChainRecord(v) {
883
+ if (!isObject(v))
884
+ return null;
885
+ // Required fields (ERR-009: fail loud when missing)
886
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
887
+ return null;
888
+ if (!Object.hasOwn(v, 'sourceKind') || !isString(v.sourceKind))
889
+ return null;
890
+ if (!Object.hasOwn(v, 'observedAt') || !isString(v.observedAt))
891
+ return null;
892
+ if (!Object.hasOwn(v, 'state') || !isString(v.state))
893
+ return null;
894
+ if (!VALID_EVIDENCE_CHAIN_STATES.has(v.state))
895
+ return null;
896
+ if (!Object.hasOwn(v, 'summary') || !isString(v.summary))
897
+ return null;
898
+ const result = {
899
+ id: v.id,
900
+ sourceKind: v.sourceKind,
901
+ observedAt: v.observedAt,
902
+ state: v.state,
903
+ summary: v.summary,
904
+ };
905
+ // Optional fields — fail loud when present but wrong type (ERR-009)
906
+ if (Object.hasOwn(v, 'admissionDecision')) {
907
+ if (!isString(v.admissionDecision))
908
+ return null;
909
+ result.admissionDecision = v.admissionDecision;
910
+ }
911
+ if (Object.hasOwn(v, 'linkedPainId')) {
912
+ if (!isString(v.linkedPainId))
913
+ return null;
914
+ result.linkedPainId = v.linkedPainId;
915
+ }
916
+ if (Object.hasOwn(v, 'linkedTaskId')) {
917
+ if (!isString(v.linkedTaskId))
918
+ return null;
919
+ result.linkedTaskId = v.linkedTaskId;
920
+ }
921
+ if (Object.hasOwn(v, 'linkedTaskStatus')) {
922
+ if (!isString(v.linkedTaskStatus))
923
+ return null;
924
+ result.linkedTaskStatus = v.linkedTaskStatus;
925
+ }
926
+ if (Object.hasOwn(v, 'linkedCandidateId')) {
927
+ if (!isString(v.linkedCandidateId))
928
+ return null;
929
+ result.linkedCandidateId = v.linkedCandidateId;
930
+ }
931
+ if (Object.hasOwn(v, 'linkedPrincipleId')) {
932
+ if (!isString(v.linkedPrincipleId))
933
+ return null;
934
+ result.linkedPrincipleId = v.linkedPrincipleId;
935
+ }
936
+ if (Object.hasOwn(v, 'failureReason')) {
937
+ if (!isString(v.failureReason))
938
+ return null;
939
+ result.failureReason = v.failureReason;
940
+ }
941
+ if (Object.hasOwn(v, 'degradedReason')) {
942
+ if (!isString(v.degradedReason))
943
+ return null;
944
+ result.degradedReason = v.degradedReason;
945
+ }
946
+ if (Object.hasOwn(v, 'nextAction')) {
947
+ if (!isString(v.nextAction))
948
+ return null;
949
+ result.nextAction = v.nextAction;
950
+ }
951
+ return result;
952
+ }
953
+ export function validateEvidenceChain(v) {
954
+ if (!isObject(v))
955
+ return null;
956
+ if (!Object.hasOwn(v, 'records') || !Array.isArray(v.records))
957
+ return null;
958
+ if (!Object.hasOwn(v, 'generatedAt') || !isString(v.generatedAt))
959
+ return null;
960
+ const records = validateArray(v.records, validateEvidenceChainRecord);
961
+ if (records === null)
962
+ return null;
963
+ const result = {
964
+ records,
965
+ generatedAt: v.generatedAt,
966
+ };
967
+ if (Object.hasOwn(v, 'degradedReason')) {
968
+ if (!isString(v.degradedReason))
969
+ return null;
970
+ result.degradedReason = v.degradedReason;
971
+ }
972
+ if (Object.hasOwn(v, 'nextAction')) {
973
+ if (!isString(v.nextAction))
974
+ return null;
975
+ result.nextAction = v.nextAction;
976
+ }
977
+ if (Object.hasOwn(v, 'note')) {
978
+ if (!isString(v.note))
979
+ return null;
980
+ result.note = v.note;
981
+ }
982
+ return result;
983
+ }
984
+ const VALID_OUTPUT_LANGUAGE_VALUES = ['zh-CN', 'en'];
985
+ export function validateOutputLanguage(v) {
986
+ if (!isObject(v))
987
+ return null;
988
+ if (!Object.hasOwn(v, 'outputLanguage') || !isString(v.outputLanguage))
989
+ return null;
990
+ if (!VALID_OUTPUT_LANGUAGE_VALUES.includes(v.outputLanguage))
991
+ return null;
992
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
993
+ return null;
994
+ return { outputLanguage: v.outputLanguage, source: v.source };
995
+ }