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,493 @@
1
+ /**
2
+ * EvidenceChainConsoleModel — read model for the Behavior Evidence page.
3
+ *
4
+ * Reads real pain/evidence/diagnosis chain data from:
5
+ * - pain_events table in trajectory.db
6
+ * - tasks table in state.db (diagnostician tasks)
7
+ * - principle_candidates table in state.db
8
+ * - principle ledger JSON
9
+ *
10
+ * Returns structured EvidenceChainRecord items that the frontend can
11
+ * render as single-record cards with proper state grouping.
12
+ *
13
+ * Privacy boundary (G.2 / F.3 / F.5):
14
+ * - No raw prompt, chat, trajectory, token, full absolute path, or stack trace
15
+ * - All summaries go through sanitizeString from evidence-sanitizer
16
+ * - Degraded paths include structured reason + nextAction (ERR-002)
17
+ *
18
+ * ERR checklist:
19
+ * - ERR-001/005: All DB rows treated as unknown, runtime validation with typeof guards
20
+ * - ERR-002: Degraded paths include reason + nextAction, never silent fallback
21
+ * - ERR-009/010: Required fields fail loud
22
+ * - ERR-014/016/017: Evidence previews bounded via sanitizeString
23
+ * - ERR-013: Use Object.hasOwn() for untrusted object keys
24
+ */
25
+ import { SqliteConnection, sanitizeString } from '@principles/core/runtime-v2';
26
+ import * as fs from 'node:fs';
27
+ import * as path from 'node:path';
28
+ import Database from 'better-sqlite3';
29
+ // ── Helpers ────────────────────────────────────────────────────────────────────
30
+ function isString(value) {
31
+ return typeof value === 'string';
32
+ }
33
+ /**
34
+ * Runtime type guard: check if a value is a plain object (Record<string, unknown>).
35
+ * Rejects null, arrays, primitives. Used instead of `as Record<string, unknown>`
36
+ * on untrusted DB rows and parsed JSON (ERR-001/005).
37
+ */
38
+ function isRecord(value) {
39
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
40
+ }
41
+ /**
42
+ * Coerce an array of unknown values (e.g. better-sqlite3 .all() result)
43
+ * into an array of Record<string, unknown> with runtime validation.
44
+ * Filters out any non-record entries instead of casting the whole array (ERR-001).
45
+ */
46
+ function coerceRowsToRecords(rows) {
47
+ const result = [];
48
+ for (const row of rows) {
49
+ if (isRecord(row)) {
50
+ result.push(row);
51
+ }
52
+ }
53
+ return result;
54
+ }
55
+ /**
56
+ * Safe own-property getter for untrusted records (ERR-013).
57
+ * Uses Object.hasOwn() instead of `in` to avoid prototype-chain matches.
58
+ * Returns undefined when key is absent — caller decides whether that's an error.
59
+ */
60
+ function getOwnValue(record, key) {
61
+ return Object.hasOwn(record, key) ? record[key] : undefined;
62
+ }
63
+ /**
64
+ * Read an own string property from an untrusted record.
65
+ * Returns undefined when key is absent or value is not a string.
66
+ */
67
+ function readOwnString(record, key) {
68
+ const value = getOwnValue(record, key);
69
+ return isString(value) ? value : undefined;
70
+ }
71
+ /**
72
+ * Read an own string-array property from an untrusted record.
73
+ * Returns empty array when key is absent, value is not an array,
74
+ * or array contains non-string elements (ERR-005/007).
75
+ */
76
+ function readOwnStringArray(record, key) {
77
+ const value = getOwnValue(record, key);
78
+ if (!Array.isArray(value))
79
+ return [];
80
+ return value.filter(isString);
81
+ }
82
+ /**
83
+ * Coerce a value to string — handles SQLite INTEGER PRIMARY KEY returning number.
84
+ * Returns empty string only for null/undefined; numbers are stringified.
85
+ */
86
+ function coerceToString(value) {
87
+ if (typeof value === 'string')
88
+ return value;
89
+ if (typeof value === 'number' && Number.isFinite(value))
90
+ return String(value);
91
+ return '';
92
+ }
93
+ function isMissingTableError(err) {
94
+ if (!(err instanceof Error))
95
+ return false;
96
+ return err.message.includes('no such table');
97
+ }
98
+ /**
99
+ * Map pain_events source to a display-friendly sourceKind.
100
+ * Manual sources are highest confidence; hook/system sources are evidence-only by default.
101
+ */
102
+ function mapSourceKind(source) {
103
+ switch (source) {
104
+ case 'manual':
105
+ case 'owner_explicit_cli':
106
+ case 'owner_explicit_chat':
107
+ return 'manual';
108
+ case 'tool_call':
109
+ case 'hook':
110
+ return 'tool_call';
111
+ case 'rulehost':
112
+ case 'gate':
113
+ return 'rulehost';
114
+ case 'empathy':
115
+ case 'empathy_inferred':
116
+ return 'empathy_inferred';
117
+ case 'review':
118
+ case 'review_finding':
119
+ return 'review';
120
+ default:
121
+ return source || 'unknown';
122
+ }
123
+ }
124
+ /**
125
+ * Determine admission decision based on source kind (PEAT-B1 defaults).
126
+ * Owner-explicit manual pain → store_signal (admitted).
127
+ * Tool failures, dispatch errors, provider failures → evidence_only.
128
+ * Empathy inferred → owner_confirmation_required.
129
+ */
130
+ function inferAdmissionDecision(sourceKind) {
131
+ switch (sourceKind) {
132
+ case 'manual':
133
+ case 'review':
134
+ return 'store_signal';
135
+ case 'empathy_inferred':
136
+ return 'owner_confirmation_required';
137
+ default:
138
+ return 'evidence_only';
139
+ }
140
+ }
141
+ function determineState(links) {
142
+ const { sourceKind, linkedTaskStatus, linkedCandidateId, linkedPrincipleId } = links;
143
+ // If linked to a principle, internalization has started
144
+ if (linkedPrincipleId) {
145
+ return 'internalization_started';
146
+ }
147
+ // If linked to a candidate, candidate was generated
148
+ if (linkedCandidateId) {
149
+ return 'candidate_generated';
150
+ }
151
+ // If linked to a task, check task status
152
+ if (linkedTaskStatus) {
153
+ switch (linkedTaskStatus) {
154
+ case 'pending':
155
+ case 'queued':
156
+ return 'diagnosis_queued';
157
+ case 'running':
158
+ return 'diagnosis_running';
159
+ case 'succeeded':
160
+ return 'diagnosis_succeeded';
161
+ case 'failed':
162
+ return 'diagnosis_failed';
163
+ case 'retry_wait':
164
+ return 'diagnosis_retry_wait';
165
+ case 'needs_human_review':
166
+ return 'diagnosis_failed';
167
+ default:
168
+ return 'diagnosis_queued';
169
+ }
170
+ }
171
+ // No task linked — check admission decision
172
+ const admission = inferAdmissionDecision(sourceKind);
173
+ if (admission === 'store_signal') {
174
+ return 'pain_recorded';
175
+ }
176
+ return 'evidence_only';
177
+ }
178
+ function readLedgerPrinciples(workspaceDir) {
179
+ const ledgerPath = path.join(workspaceDir, '.state', 'principle_training_state.json');
180
+ if (!fs.existsSync(ledgerPath))
181
+ return { principles: [] };
182
+ let content;
183
+ try {
184
+ content = fs.readFileSync(ledgerPath, 'utf-8');
185
+ }
186
+ catch {
187
+ return {
188
+ principles: [],
189
+ degradedReason: 'Failed to read principle ledger file',
190
+ nextAction: 'Check file permissions for .state/principle_training_state.json',
191
+ };
192
+ }
193
+ if (!content || content.trim() === '')
194
+ return { principles: [] };
195
+ let parsed;
196
+ try {
197
+ parsed = JSON.parse(content);
198
+ }
199
+ catch {
200
+ return {
201
+ principles: [],
202
+ degradedReason: 'Principle ledger contains invalid JSON',
203
+ nextAction: 'Review .state/principle_training_state.json for syntax errors. Consider restoring from backup or re-running internalization.',
204
+ };
205
+ }
206
+ if (!isRecord(parsed)) {
207
+ return {
208
+ principles: [],
209
+ degradedReason: 'Principle ledger root is not a JSON object',
210
+ nextAction: 'Review .state/principle_training_state.json structure. Expected { _tree: { principles: {...} } } or { tree: { principles: {...} } }.',
211
+ };
212
+ }
213
+ const treeValue = Object.hasOwn(parsed, '_tree')
214
+ ? getOwnValue(parsed, '_tree')
215
+ : Object.hasOwn(parsed, 'tree')
216
+ ? getOwnValue(parsed, 'tree')
217
+ : parsed;
218
+ if (!isRecord(treeValue)) {
219
+ return {
220
+ principles: [],
221
+ degradedReason: 'Principle ledger tree is not a JSON object',
222
+ nextAction: 'Review .state/principle_training_state.json structure. The _tree or tree field must be an object.',
223
+ };
224
+ }
225
+ const principlesValue = getOwnValue(treeValue, 'principles');
226
+ if (!isRecord(principlesValue)) {
227
+ return {
228
+ principles: [],
229
+ degradedReason: 'Principle ledger principles field is missing or not an object',
230
+ nextAction: 'Review .state/principle_training_state.json structure. Expected principles to be an object.',
231
+ };
232
+ }
233
+ const result = [];
234
+ for (const [, entry] of Object.entries(principlesValue)) {
235
+ if (isRecord(entry)) {
236
+ result.push({
237
+ id: readOwnString(entry, 'id') ?? '',
238
+ derivedFromPainIds: readOwnStringArray(entry, 'derivedFromPainIds'),
239
+ text: readOwnString(entry, 'text'),
240
+ status: readOwnString(entry, 'status'),
241
+ createdAt: readOwnString(entry, 'createdAt'),
242
+ });
243
+ }
244
+ }
245
+ return { principles: result };
246
+ }
247
+ // ── Model ──────────────────────────────────────────────────────────────────────
248
+ export class EvidenceChainConsoleModel {
249
+ readConnection = null;
250
+ workspaceDir;
251
+ constructor(workspaceDir) {
252
+ this.workspaceDir = workspaceDir;
253
+ }
254
+ getReadConnection() {
255
+ if (!this.readConnection) {
256
+ this.readConnection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
257
+ }
258
+ return this.readConnection;
259
+ }
260
+ async getEvidenceChain() {
261
+ const generatedAt = new Date().toISOString();
262
+ const records = [];
263
+ const degradedReasons = [];
264
+ const degradedNextActions = [];
265
+ // ── 1. Read pain_events from trajectory.db ────────────────────────────
266
+ const trajectoryDbPath = path.join(this.workspaceDir, '.state', 'trajectory.db');
267
+ let painEvents = [];
268
+ let trajectoryDbAvailable = false;
269
+ if (fs.existsSync(trajectoryDbPath)) {
270
+ let trajDb = null;
271
+ try {
272
+ trajDb = new Database(trajectoryDbPath, { readonly: true });
273
+ painEvents = coerceRowsToRecords(trajDb.prepare('SELECT id, session_id, source, score, reason, severity, origin, confidence, text, created_at FROM pain_events ORDER BY created_at DESC LIMIT 100').all());
274
+ trajectoryDbAvailable = true;
275
+ }
276
+ catch (err) {
277
+ if (isMissingTableError(err)) {
278
+ degradedReasons.push('pain_events table not found in trajectory database');
279
+ degradedNextActions.push('This workspace may not have recorded any pain signals yet.');
280
+ }
281
+ else {
282
+ degradedReasons.push('Failed to read trajectory database');
283
+ degradedNextActions.push('Check workspace state directory integrity.');
284
+ }
285
+ }
286
+ finally {
287
+ trajDb?.close();
288
+ }
289
+ }
290
+ else {
291
+ degradedReasons.push('Trajectory database not found');
292
+ degradedNextActions.push('PD has not recorded any pain signals in this workspace yet.');
293
+ }
294
+ // ── 2. Read diagnostician tasks from state.db ─────────────────────────
295
+ const stateDbPath = path.join(this.workspaceDir, '.pd', 'state.db');
296
+ let taskMap = new Map();
297
+ let stateDbAvailable = false;
298
+ if (fs.existsSync(stateDbPath)) {
299
+ try {
300
+ const conn = this.getReadConnection();
301
+ const db = conn.getDb();
302
+ const tasks = coerceRowsToRecords(db.prepare("SELECT task_id, status, last_error, created_at FROM tasks WHERE task_kind = 'diagnostician' ORDER BY created_at DESC").all());
303
+ for (const task of tasks) {
304
+ const taskId = isString(task.task_id) ? task.task_id : '';
305
+ // Diagnostician task IDs follow pattern "diagnosis_<painId>"
306
+ const painId = taskId.startsWith('diagnosis_') ? taskId.slice('diagnosis_'.length) : taskId;
307
+ taskMap.set(painId, {
308
+ taskId,
309
+ status: isString(task.status) ? task.status : 'unknown',
310
+ lastError: isString(task.last_error) ? task.last_error : null,
311
+ createdAt: isString(task.created_at) ? task.created_at : '',
312
+ });
313
+ }
314
+ stateDbAvailable = true;
315
+ }
316
+ catch (err) {
317
+ if (isMissingTableError(err)) {
318
+ degradedReasons.push('Tasks table not found in state database');
319
+ degradedNextActions.push('Workspace may need initialization via pd config doctor.');
320
+ }
321
+ else {
322
+ degradedReasons.push('Failed to read state database');
323
+ degradedNextActions.push('Check workspace .pd directory integrity.');
324
+ }
325
+ }
326
+ }
327
+ else {
328
+ degradedReasons.push('State database not found');
329
+ degradedNextActions.push('PD runtime has not been initialized in this workspace.');
330
+ }
331
+ // ── 3. Read candidates from state.db ──────────────────────────────────
332
+ let candidateMap = new Map(); // painId → candidateId
333
+ if (stateDbAvailable) {
334
+ try {
335
+ const conn = this.getReadConnection();
336
+ const db = conn.getDb();
337
+ const candidates = coerceRowsToRecords(db.prepare('SELECT candidate_id, task_id FROM principle_candidates').all());
338
+ for (const c of candidates) {
339
+ const candidateId = isString(c.candidate_id) ? c.candidate_id : '';
340
+ const taskId = isString(c.task_id) ? c.task_id : '';
341
+ // Reverse-map: taskId → painId
342
+ const painId = taskId.startsWith('diagnosis_') ? taskId.slice('diagnosis_'.length) : '';
343
+ if (painId && candidateId) {
344
+ candidateMap.set(painId, candidateId);
345
+ }
346
+ }
347
+ }
348
+ catch (err) {
349
+ if (isMissingTableError(err)) {
350
+ degradedReasons.push('Candidates table not found in state database');
351
+ degradedNextActions.push('Candidate and internalization chain links are unavailable. Workspace may need initialization.');
352
+ }
353
+ else {
354
+ degradedReasons.push('Failed to read candidates table');
355
+ degradedNextActions.push('Check state database integrity.');
356
+ }
357
+ }
358
+ }
359
+ // ── 4. Read ledger principles ─────────────────────────────────────────
360
+ const ledgerResult = readLedgerPrinciples(this.workspaceDir);
361
+ const ledgerPrinciples = ledgerResult.principles;
362
+ if (ledgerResult.degradedReason) {
363
+ degradedReasons.push(ledgerResult.degradedReason);
364
+ degradedNextActions.push(ledgerResult.nextAction ?? 'Review principle ledger file.');
365
+ }
366
+ const painToPrincipleMap = new Map(); // painId → principleId
367
+ for (const p of ledgerPrinciples) {
368
+ for (const painId of p.derivedFromPainIds ?? []) {
369
+ painToPrincipleMap.set(painId, p.id);
370
+ }
371
+ }
372
+ // ── 5. Build evidence chain records from pain_events ──────────────────
373
+ for (const event of painEvents) {
374
+ // SQLite INTEGER PRIMARY KEY returns number, not string — must coerce
375
+ const eventId = coerceToString(event.id);
376
+ if (!eventId)
377
+ continue; // Skip records with no valid id (ERR-009: fail loud)
378
+ const source = isString(event.source) ? event.source : 'unknown';
379
+ const reason = isString(event.reason) ? event.reason : '';
380
+ const text = isString(event.text) ? event.text : '';
381
+ const createdAt = isString(event.created_at) ? event.created_at : '';
382
+ const score = typeof event.score === 'number' ? event.score : 0;
383
+ const sourceKind = mapSourceKind(source);
384
+ // Use id as a stable painId reference
385
+ const painId = `pain_${eventId}`;
386
+ // Look up linked task, candidate, principle
387
+ const linkedTask = taskMap.get(painId);
388
+ const linkedCandidateId = candidateMap.get(painId) || undefined;
389
+ const linkedPrincipleId = painToPrincipleMap.get(painId) || undefined;
390
+ // Determine state
391
+ const state = determineState({
392
+ sourceKind,
393
+ linkedTaskStatus: linkedTask?.status,
394
+ linkedCandidateId,
395
+ linkedPrincipleId,
396
+ });
397
+ // Build bounded, sanitized summary
398
+ const rawSummary = text || reason || `Pain signal (source: ${source}, score: ${score})`;
399
+ const summary = sanitizeString(rawSummary, this.workspaceDir);
400
+ const record = {
401
+ id: painId,
402
+ sourceKind,
403
+ observedAt: createdAt,
404
+ state,
405
+ summary,
406
+ admissionDecision: inferAdmissionDecision(sourceKind),
407
+ };
408
+ if (linkedTask) {
409
+ record.linkedTaskId = linkedTask.taskId;
410
+ record.linkedTaskStatus = linkedTask.status;
411
+ if (linkedTask.lastError && (state === 'diagnosis_failed' || state === 'diagnosis_retry_wait')) {
412
+ record.failureReason = sanitizeString(linkedTask.lastError, this.workspaceDir);
413
+ record.nextAction = state === 'diagnosis_retry_wait'
414
+ ? 'Diagnosis is waiting for automatic retry. Check pipeline status if it stays in this state.'
415
+ : 'Diagnosis failed. Check the error details and retry if appropriate.';
416
+ }
417
+ else if (state === 'diagnosis_succeeded' && !linkedCandidateId) {
418
+ record.nextAction = 'Diagnosis completed. A candidate principle may be generated shortly.';
419
+ }
420
+ }
421
+ if (linkedCandidateId) {
422
+ record.linkedCandidateId = linkedCandidateId;
423
+ }
424
+ if (linkedPrincipleId) {
425
+ record.linkedPrincipleId = linkedPrincipleId;
426
+ }
427
+ records.push(record);
428
+ }
429
+ // ── 6. Also include tasks that have no matching pain_event ─────────────
430
+ // This catches manual pain that was recorded directly through the bridge
431
+ // without a trajectory.db entry (e.g., pd pain record)
432
+ const coveredPainIds = new Set(records.map(r => r.id));
433
+ for (const [painId, task] of taskMap.entries()) {
434
+ if (coveredPainIds.has(painId))
435
+ continue;
436
+ const linkedCandidateId = candidateMap.get(painId) || undefined;
437
+ const linkedPrincipleId = painToPrincipleMap.get(painId) || undefined;
438
+ const state = determineState({
439
+ sourceKind: 'manual',
440
+ linkedTaskStatus: task.status,
441
+ linkedCandidateId,
442
+ linkedPrincipleId,
443
+ });
444
+ records.push({
445
+ id: painId,
446
+ sourceKind: 'manual',
447
+ observedAt: task.createdAt,
448
+ state,
449
+ summary: sanitizeString(`Manual pain signal (task: ${task.taskId})`, this.workspaceDir),
450
+ admissionDecision: 'store_signal',
451
+ linkedTaskId: task.taskId,
452
+ linkedTaskStatus: task.status,
453
+ linkedCandidateId,
454
+ linkedPrincipleId,
455
+ failureReason: (task.lastError && (state === 'diagnosis_failed' || state === 'diagnosis_retry_wait'))
456
+ ? sanitizeString(task.lastError, this.workspaceDir)
457
+ : undefined,
458
+ nextAction: (state === 'diagnosis_retry_wait')
459
+ ? 'Diagnosis is waiting for automatic retry.'
460
+ : (state === 'diagnosis_failed')
461
+ ? 'Diagnosis failed. Check error details and retry.'
462
+ : undefined,
463
+ });
464
+ }
465
+ // Sort by observedAt descending
466
+ records.sort((a, b) => b.observedAt.localeCompare(a.observedAt));
467
+ // ── 7. Build response ─────────────────────────────────────────────────
468
+ const response = {
469
+ records,
470
+ generatedAt,
471
+ };
472
+ if (degradedReasons.length > 0) {
473
+ response.degradedReason = degradedReasons.join('; ');
474
+ response.nextAction = degradedNextActions.join(' ');
475
+ }
476
+ // Note when evidence-only sources exist but no pain signals
477
+ if (records.length === 0 && trajectoryDbAvailable && stateDbAvailable) {
478
+ response.note = 'PD has not captured any displayable behavior evidence in this workspace yet.';
479
+ }
480
+ return response;
481
+ }
482
+ dispose() {
483
+ if (this.readConnection) {
484
+ try {
485
+ this.readConnection.close();
486
+ }
487
+ catch (err) {
488
+ console.warn('EvidenceChainConsoleModel.dispose: failed to close connection:', err instanceof Error ? err.message : String(err));
489
+ }
490
+ this.readConnection = null;
491
+ }
492
+ }
493
+ }
@@ -0,0 +1,74 @@
1
+ export interface StagnationSignal {
2
+ type: 'no_pain' | 'never_activated';
3
+ principleId: string;
4
+ daysSince: number;
5
+ }
6
+ /**
7
+ * System state indicator for the governance focus page.
8
+ *
9
+ * - `none`: No governance data exists (workspace not initialized or empty).
10
+ * - `in_progress`: PD has recorded pipeline activity (tasks, candidates) but
11
+ * no owner-ready decision items are available yet.
12
+ * - `owner_review_ready`: At least one pending approval awaits owner review.
13
+ * - `degraded`: Pipeline or data source is degraded — decisions may be
14
+ * incomplete or delayed.
15
+ */
16
+ export type GovernanceState = 'none' | 'in_progress' | 'owner_review_ready' | 'degraded';
17
+ /**
18
+ * Machine-readable codes for degraded signals.
19
+ * Frontend maps these via i18n; `reason` is English debug text.
20
+ */
21
+ export type DegradedReasonCode = 'task_retry_wait' | 'task_failed' | 'approval_table_missing';
22
+ export type DegradedNextActionCode = 'check_task_status' | 'fix_and_retry' | 'run_integrity_check';
23
+ export interface DegradedSignal {
24
+ /** Machine-readable code for i18n mapping */
25
+ reasonCode: DegradedReasonCode;
26
+ /** Machine-readable code for i18n mapping */
27
+ nextActionCode: DegradedNextActionCode;
28
+ /** English debug text with dynamic details (task kind, error) */
29
+ reason: string;
30
+ /** English debug text for next action */
31
+ nextAction: string;
32
+ /** Source of the degraded signal, e.g. 'internalization_task', 'source_unavailable' */
33
+ source: string;
34
+ }
35
+ /**
36
+ * Machine-readable codes for governance state reason/nextAction.
37
+ * Frontend maps these via i18n; some codes support interpolation
38
+ * (e.g. {{count}} from pendingReviewCount).
39
+ */
40
+ export type StateReasonCode = 'state_db_missing' | 'no_pipeline_activity' | 'pending_approvals' | 'pipeline_active' | 'consumed_candidates' | 'degraded_state';
41
+ export type NextActionCode = 'run_config_doctor' | 'wait_for_pipeline' | 'review_approvals' | 'check_degraded_signals' | 'check_pipeline_status';
42
+ export interface GovernanceQueueResponse {
43
+ /** Number of pending approvals awaiting owner review */
44
+ pendingReviewCount: number;
45
+ /** Number of high/critical risk pending approvals */
46
+ behaviorDeviationCount: number;
47
+ /** Stagnation signals for approvals older than 7 days */
48
+ stagnationSignals: StagnationSignal[];
49
+ /** Overall governance state */
50
+ governanceState: GovernanceState;
51
+ /** Machine-readable code for i18n mapping */
52
+ stateReasonCode: StateReasonCode;
53
+ /** Machine-readable code for i18n mapping */
54
+ nextActionCode: NextActionCode;
55
+ /** English debug text (fallback / logging) */
56
+ stateReason: string;
57
+ /** English debug text (fallback / logging) */
58
+ nextAction: string;
59
+ /** Human-readable summary of pipeline activity when state is 'in_progress' */
60
+ inProgressSummary?: string;
61
+ /** Degraded signals when state is 'degraded' */
62
+ degradedSignals?: DegradedSignal[];
63
+ generatedAt: string;
64
+ /** Present when data is degraded/missing rather than genuinely zero */
65
+ note?: string;
66
+ }
67
+ export declare class GovernanceConsoleModel {
68
+ private readConnection;
69
+ private readonly workspaceDir;
70
+ constructor(workspaceDir: string);
71
+ private getReadConnection;
72
+ getGovernanceQueue(): Promise<GovernanceQueueResponse>;
73
+ dispose(): void;
74
+ }