create-principles-disciple 1.94.0 → 1.95.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 (339) hide show
  1. package/console/dist/server/config/WorkspaceConfigStore.js +2 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +33 -0
  3. package/console/dist/server/config/pd-config-store.js +159 -0
  4. package/console/dist/server/index.js +18 -4
  5. package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
  6. package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
  7. package/console/dist/server/models/HealthCheckModel.js +5 -3
  8. package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
  9. package/console/dist/server/models/IntentDecisionModel.js +207 -0
  10. package/console/dist/server/models/IntentPageModel.d.ts +18 -0
  11. package/console/dist/server/models/IntentPageModel.js +90 -0
  12. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
  13. package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
  14. package/console/dist/server/models/WorkspaceService.d.ts +0 -28
  15. package/console/dist/server/models/WorkspaceService.js +0 -115
  16. package/console/dist/server/routes/config.js +55 -1
  17. package/console/dist/server/routes/intent-decisions.d.ts +33 -0
  18. package/console/dist/server/routes/intent-decisions.js +499 -0
  19. package/console/dist/server/routes/intent.d.ts +3 -0
  20. package/console/dist/server/routes/intent.js +35 -0
  21. package/console/dist/server/routes/principles.js +67 -1
  22. package/console/dist/server/routes/update.d.ts +0 -1
  23. package/console/dist/server/routes/update.js +14 -11
  24. package/console/dist/ui/App.js +2 -7
  25. package/console/dist/ui/api.d.ts +44 -18
  26. package/console/dist/ui/api.js +44 -5
  27. package/console/dist/ui/components/layout/app-sidebar.js +2 -1
  28. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  29. package/console/dist/ui/components/ui/button.d.ts +1 -1
  30. package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
  31. package/console/dist/ui/components/ui/shiny-text.js +46 -0
  32. package/console/dist/ui/i18n/en.json +167 -3
  33. package/console/dist/ui/i18n/zh-CN.json +167 -3
  34. package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
  35. package/console/dist/ui/pages/control-center/ControlCenterPage.js +28 -2
  36. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
  37. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
  38. package/console/dist/ui/pages/debt/DebtPage.js +219 -2
  39. package/console/dist/ui/pages/focus/FocusPage.js +2 -1
  40. package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
  41. package/console/dist/ui/pages/intent/IntentPage.js +147 -0
  42. package/console/dist/ui/pages/pain/PainPage.js +234 -4
  43. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
  44. package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
  45. package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
  46. package/console/dist/ui/utils/validators.d.ts +163 -0
  47. package/console/dist/ui/utils/validators.js +433 -0
  48. package/console/dist/web/assets/app.css +138 -0
  49. package/console/dist/web/assets/app.js +3124 -1288
  50. package/console/package.json +3 -0
  51. package/core/dist/principle-tree-ledger.d.ts +55 -4
  52. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  53. package/core/dist/principle-tree-ledger.js +472 -13
  54. package/core/dist/principle-tree-ledger.js.map +1 -1
  55. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
  56. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
  57. package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
  58. package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
  59. package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
  60. package/core/dist/prompt-builder/size-guard.d.ts +1 -0
  61. package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
  62. package/core/dist/prompt-builder/size-guard.js +21 -0
  63. package/core/dist/prompt-builder/size-guard.js.map +1 -1
  64. package/core/dist/prompt-builder/types.d.ts +2 -0
  65. package/core/dist/prompt-builder/types.d.ts.map +1 -1
  66. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +118 -32
  67. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  68. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
  69. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
  70. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
  71. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
  72. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +105 -0
  73. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
  74. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
  75. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  76. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
  77. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
  78. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
  79. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  80. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
  81. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
  82. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
  83. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
  84. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
  85. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
  86. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
  87. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
  88. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
  89. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
  90. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
  91. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
  92. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
  93. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
  94. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
  95. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  96. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
  97. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
  98. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
  99. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
  100. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
  101. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  102. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
  103. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
  104. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  105. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
  106. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  107. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  108. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
  109. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  110. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +65 -1
  111. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  112. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  113. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +33 -11
  114. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  115. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
  116. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  117. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
  118. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
  119. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
  120. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
  121. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
  122. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
  123. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
  124. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
  125. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
  126. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
  127. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
  128. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
  129. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
  130. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
  131. package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
  132. package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  133. package/core/dist/runtime-v2/diagnostician-output.js +16 -0
  134. package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
  135. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
  136. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  137. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  138. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
  139. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
  140. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +23 -0
  141. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  142. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
  143. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
  144. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
  145. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
  146. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  147. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +2 -0
  148. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  149. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
  150. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
  151. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  152. package/core/dist/runtime-v2/index.d.ts +9 -4
  153. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  154. package/core/dist/runtime-v2/index.js +12 -3
  155. package/core/dist/runtime-v2/index.js.map +1 -1
  156. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
  157. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
  158. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
  159. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
  160. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
  161. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
  162. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +91 -0
  163. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
  164. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
  165. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
  166. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
  167. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
  168. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
  169. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
  170. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
  171. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
  172. package/core/dist/runtime-v2/intent/index.d.ts +6 -0
  173. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
  174. package/core/dist/runtime-v2/intent/index.js +6 -0
  175. package/core/dist/runtime-v2/intent/index.js.map +1 -0
  176. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
  177. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
  178. package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
  179. package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
  180. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
  181. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
  182. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
  183. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
  184. package/core/dist/runtime-v2/intent/intent-doc.d.ts +19 -0
  185. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
  186. package/core/dist/runtime-v2/intent/intent-doc.js +70 -0
  187. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
  188. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
  189. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
  190. package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
  191. package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
  192. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
  193. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
  194. package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
  195. package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
  196. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
  197. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
  198. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
  199. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
  200. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
  201. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
  202. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
  203. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
  204. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
  205. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
  206. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
  207. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
  208. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
  209. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
  210. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
  211. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
  212. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
  213. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  214. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
  215. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  216. package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  217. package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
  218. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  219. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  220. package/core/dist/runtime-v2/pain-signal-observability.js +257 -56
  221. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  222. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
  223. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  224. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
  225. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  226. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
  227. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  228. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  229. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  230. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
  231. package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
  232. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  233. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
  234. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
  236. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
  237. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
  238. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
  239. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
  240. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
  241. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
  242. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
  243. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
  244. package/core/dist/runtime-v2/store/intent/index.d.ts +6 -0
  245. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
  246. package/core/dist/runtime-v2/store/intent/index.js +5 -0
  247. package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
  248. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
  249. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
  250. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
  251. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
  252. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
  253. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
  254. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
  255. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
  256. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
  257. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
  258. package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
  259. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  260. package/core/dist/runtime-v2/store/sqlite-connection.js +124 -12
  261. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  262. package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
  263. package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
  264. package/core/dist/runtime-v2/types/event-payload.js +0 -12
  265. package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
  266. package/core/dist/runtime-v2/types/event-types.d.ts +5 -34
  267. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  268. package/core/dist/runtime-v2/types/event-types.js +0 -19
  269. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  270. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
  271. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
  272. package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
  273. package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
  274. package/core/dist/runtime-v2/types/index.d.ts +5 -5
  275. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  276. package/core/dist/runtime-v2/types/index.js +5 -3
  277. package/core/dist/runtime-v2/types/index.js.map +1 -1
  278. package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
  279. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
  280. package/core/dist/runtime-v2/types/ledger-store.js +10 -5
  281. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
  282. package/core/dist/workflow-funnel-loader.d.ts +2 -2
  283. package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
  284. package/dist/installer.d.ts.map +1 -1
  285. package/dist/installer.js +16 -0
  286. package/dist/installer.js.map +1 -1
  287. package/package.json +1 -1
  288. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
  289. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
  290. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +166 -0
  291. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
  292. package/pd-cli/dist/commands/intent.d.ts +59 -0
  293. package/pd-cli/dist/commands/intent.d.ts.map +1 -0
  294. package/pd-cli/dist/commands/intent.js +350 -0
  295. package/pd-cli/dist/commands/intent.js.map +1 -0
  296. package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
  297. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
  298. package/pd-cli/dist/commands/runtime-init.js +264 -0
  299. package/pd-cli/dist/commands/runtime-init.js.map +1 -0
  300. package/pd-cli/dist/index.js +25 -0
  301. package/pd-cli/dist/index.js.map +1 -1
  302. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  303. package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
  304. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  305. package/pd-cli/package.json +1 -0
  306. package/plugin/dist/commands/pain.js +2 -0
  307. package/plugin/dist/core/control-ui-db.d.ts +11 -0
  308. package/plugin/dist/core/control-ui-db.js +40 -16
  309. package/plugin/dist/core/event-log.js +0 -5
  310. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +28 -0
  311. package/plugin/dist/core/intent-doc-reader-adapter.js +56 -0
  312. package/plugin/dist/core/intent-doc-reader.d.ts +80 -0
  313. package/plugin/dist/core/intent-doc-reader.js +189 -0
  314. package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
  315. package/plugin/dist/core/principle-tree-ledger.js +39 -524
  316. package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
  317. package/plugin/dist/core/trajectory.d.ts +16 -0
  318. package/plugin/dist/core/trajectory.js +332 -254
  319. package/plugin/dist/core/workspace-context.d.ts +2 -3
  320. package/plugin/dist/hooks/pain.js +5 -0
  321. package/plugin/dist/hooks/prompt-helpers.d.ts +19 -1
  322. package/plugin/dist/hooks/prompt-helpers.js +39 -2
  323. package/plugin/dist/hooks/prompt-types.d.ts +8 -0
  324. package/plugin/dist/hooks/prompt.js +80 -21
  325. package/plugin/dist/index.d.ts +3 -1
  326. package/plugin/dist/index.js +9 -5
  327. package/plugin/dist/service/runtime-summary-service.js +1 -1
  328. package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
  329. package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
  330. package/plugin/dist/types/event-types.d.ts +1 -1
  331. package/plugin/package.json +6 -3
  332. package/plugin/scripts/acceptance-test.mjs +3 -3
  333. package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
  334. package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
  335. package/plugin/dist/service/central-database.d.ts +0 -138
  336. package/plugin/dist/service/central-database.js +0 -731
  337. package/plugin/dist/service/central-sync-service.d.ts +0 -8
  338. package/plugin/dist/service/central-sync-service.js +0 -71
  339. package/plugin/scripts/validate-live-path.ts +0 -462
@@ -357,6 +357,15 @@ export function validateAgentBindingUpdate(v) {
357
357
  return null;
358
358
  return { agent: v.agent, runtimeProfile: v.runtimeProfile, enabled: v.enabled };
359
359
  }
360
+ export function validateFeatureFlagUpdate(v) {
361
+ if (!isObject(v))
362
+ return null;
363
+ if (!Object.hasOwn(v, 'feature') || !isString(v.feature))
364
+ return null;
365
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
366
+ return null;
367
+ return { feature: v.feature, enabled: v.enabled };
368
+ }
360
369
  export function validateReadinessCheck(v) {
361
370
  if (!isObject(v))
362
371
  return null;
@@ -934,6 +943,320 @@ const VALID_EVIDENCE_CHAIN_STATES = new Set([
934
943
  'malformed',
935
944
  'degraded',
936
945
  ]);
946
+ // ── Intent Tension (PRI-469, SPEC §16) ───────────────────────────────────────
947
+ //
948
+ // Frontend mirror of the core IntentTension type. `confidence` is forbidden
949
+ // (SPEC §16.3) — validateIntentTension rejects any object carrying it.
950
+ // This validator is the Console's trust boundary: untrusted JSON from the API
951
+ // is narrowed here before any UI code touches it (ERR-001).
952
+ const VALID_INTENT_TENSION_SOURCES = ['none', 'action_drift', 'intent_suspect', 'healthy_tension'];
953
+ const VALID_EVIDENCE_STRENGTHS = ['weak', 'moderate', 'strong'];
954
+ const VALID_INTENT_RELATED_FIELDS = [
955
+ 'why',
956
+ 'desired_outcome',
957
+ 'non_negotiables',
958
+ 'stop_escalation',
959
+ 'current_strategic_focus',
960
+ ];
961
+ const VALID_SUGGESTED_OWNER_ACTIONS = [
962
+ 'confirm_drift',
963
+ 'revise_intent',
964
+ 'observe',
965
+ 'dismiss',
966
+ 'promote_to_principle',
967
+ 'promote_to_rulehost',
968
+ ];
969
+ /**
970
+ * Validate an untrusted `intentTension` object from the EvidenceChain API
971
+ * response. Returns `null` when malformed; the caller (validateEvidenceChainRecord)
972
+ * treats a `null` intentTension as "not present" so the record is still usable.
973
+ *
974
+ * SPEC §16.3: `confidence` is forbidden — explicitly rejected here.
975
+ * SPEC §16.4: evidence is capped at 3 items; we accept up to 3 and reject
976
+ * arrays with non-string elements (ERR-005/007).
977
+ */
978
+ export function validateIntentTension(v) {
979
+ if (!isObject(v))
980
+ return null;
981
+ // SPEC §16.3: confidence is forbidden on intentTension.
982
+ if (Object.hasOwn(v, 'confidence'))
983
+ return null;
984
+ // Required fields (ERR-009: fail loud when missing or wrong type)
985
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
986
+ return null;
987
+ if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
988
+ return null;
989
+ if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
990
+ return null;
991
+ if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
992
+ return null;
993
+ if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
994
+ return null;
995
+ const relatedIntentFields = [];
996
+ for (const f of v.relatedIntentFields) {
997
+ if (typeof f !== 'string')
998
+ return null;
999
+ if (!VALID_INTENT_RELATED_FIELDS.includes(f))
1000
+ return null;
1001
+ relatedIntentFields.push(f);
1002
+ }
1003
+ if (!Object.hasOwn(v, 'evidence') || !Array.isArray(v.evidence))
1004
+ return null;
1005
+ const evidence = [];
1006
+ for (const e of v.evidence) {
1007
+ if (typeof e !== 'string')
1008
+ return null;
1009
+ evidence.push(e);
1010
+ }
1011
+ // SPEC §16.4: cap at 3. Server-side already truncates, but the frontend
1012
+ // must not trust that — enforce the cap here too (defense in depth).
1013
+ const truncatedEvidence = evidence.slice(0, 3);
1014
+ if (!Object.hasOwn(v, 'explanation') || !isString(v.explanation))
1015
+ return null;
1016
+ if (v.explanation.length === 0)
1017
+ return null;
1018
+ if (!Object.hasOwn(v, 'suggestedOwnerAction') || !isString(v.suggestedOwnerAction))
1019
+ return null;
1020
+ if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.suggestedOwnerAction))
1021
+ return null;
1022
+ const result = {
1023
+ source: v.source,
1024
+ evidenceStrength: v.evidenceStrength,
1025
+ relatedIntentFields,
1026
+ evidence: truncatedEvidence,
1027
+ explanation: v.explanation,
1028
+ suggestedOwnerAction: v.suggestedOwnerAction,
1029
+ };
1030
+ // Optional: intentDocHash
1031
+ if (Object.hasOwn(v, 'intentDocHash')) {
1032
+ if (!isString(v.intentDocHash))
1033
+ return null;
1034
+ result.intentDocHash = v.intentDocHash;
1035
+ }
1036
+ return result;
1037
+ }
1038
+ /**
1039
+ * Validate an untrusted IntentDecisionRecord object from the API.
1040
+ * Returns null when malformed (Rule 3: fail loud on missing/wrong-type fields).
1041
+ *
1042
+ * Enum fields (source, evidenceStrength, ownerAction) are validated against
1043
+ * the same sets used by validateIntentTension. relatedIntentFields elements
1044
+ * are validated against VALID_INTENT_RELATED_FIELDS.
1045
+ */
1046
+ export function validateIntentDecisionRecord(v) {
1047
+ if (!isObject(v))
1048
+ return null;
1049
+ // Required fields (ERR-009: fail loud when missing or wrong type)
1050
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
1051
+ return null;
1052
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
1053
+ return null;
1054
+ if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
1055
+ return null;
1056
+ if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
1057
+ return null;
1058
+ if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
1059
+ return null;
1060
+ if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
1061
+ return null;
1062
+ const relatedIntentFields = [];
1063
+ for (const f of v.relatedIntentFields) {
1064
+ if (typeof f !== 'string')
1065
+ return null;
1066
+ if (!VALID_INTENT_RELATED_FIELDS.includes(f))
1067
+ return null;
1068
+ relatedIntentFields.push(f);
1069
+ }
1070
+ if (!Object.hasOwn(v, 'ownerAction') || !isString(v.ownerAction))
1071
+ return null;
1072
+ if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.ownerAction))
1073
+ return null;
1074
+ if (!Object.hasOwn(v, 'evidenceRefs') || !Array.isArray(v.evidenceRefs))
1075
+ return null;
1076
+ const evidenceRefs = [];
1077
+ for (const e of v.evidenceRefs) {
1078
+ if (typeof e !== 'string')
1079
+ return null;
1080
+ evidenceRefs.push(e);
1081
+ }
1082
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
1083
+ return null;
1084
+ const result = {
1085
+ id: v.id,
1086
+ source: v.source,
1087
+ evidenceStrength: v.evidenceStrength,
1088
+ relatedIntentFields,
1089
+ ownerAction: v.ownerAction,
1090
+ evidenceRefs,
1091
+ createdAt: v.createdAt,
1092
+ };
1093
+ // Optional fields — fail loud when present but wrong type (ERR-009)
1094
+ if (Object.hasOwn(v, 'painId')) {
1095
+ if (!isString(v.painId))
1096
+ return null;
1097
+ result.painId = v.painId;
1098
+ }
1099
+ if (Object.hasOwn(v, 'taskId')) {
1100
+ if (!isString(v.taskId))
1101
+ return null;
1102
+ result.taskId = v.taskId;
1103
+ }
1104
+ if (Object.hasOwn(v, 'runId')) {
1105
+ if (!isString(v.runId))
1106
+ return null;
1107
+ result.runId = v.runId;
1108
+ }
1109
+ if (Object.hasOwn(v, 'intentDocHash')) {
1110
+ if (!isString(v.intentDocHash))
1111
+ return null;
1112
+ result.intentDocHash = v.intentDocHash;
1113
+ }
1114
+ if (Object.hasOwn(v, 'resultingCandidateId')) {
1115
+ if (!isString(v.resultingCandidateId))
1116
+ return null;
1117
+ result.resultingCandidateId = v.resultingCandidateId;
1118
+ }
1119
+ if (Object.hasOwn(v, 'resultingRuleCandidateId')) {
1120
+ if (!isString(v.resultingRuleCandidateId))
1121
+ return null;
1122
+ result.resultingRuleCandidateId = v.resultingRuleCandidateId;
1123
+ }
1124
+ if (Object.hasOwn(v, 'patchProposalId')) {
1125
+ if (!isString(v.patchProposalId))
1126
+ return null;
1127
+ result.patchProposalId = v.patchProposalId;
1128
+ }
1129
+ return result;
1130
+ }
1131
+ /**
1132
+ * Validate a list of IntentDecisionRecord objects. Returns null if any
1133
+ * element is malformed (ERR-005/007: validate array element types).
1134
+ */
1135
+ export function validateIntentDecisionList(v) {
1136
+ return validateArray(v, validateIntentDecisionRecord);
1137
+ }
1138
+ /**
1139
+ * Validate the POST /api/v1/intent-decisions response envelope.
1140
+ * Shape: { record: IntentDecisionRecord, created: boolean }
1141
+ */
1142
+ export function validateIntentDecisionResult(v) {
1143
+ if (!isObject(v))
1144
+ return null;
1145
+ if (!Object.hasOwn(v, 'record'))
1146
+ return null;
1147
+ const record = validateIntentDecisionRecord(v.record);
1148
+ if (record === null)
1149
+ return null;
1150
+ if (!Object.hasOwn(v, 'created') || !isBoolean(v.created))
1151
+ return null;
1152
+ return { record, created: v.created };
1153
+ }
1154
+ /**
1155
+ * Validate the GET /api/v1/intent-decisions/summary response.
1156
+ * All 6 count keys must be present with non-negative finite numbers.
1157
+ * lastDecisionAt: null is valid, string is valid, anything else returns null.
1158
+ */
1159
+ export function validateIntentDecisionSummary(v) {
1160
+ if (!isObject(v))
1161
+ return null;
1162
+ if (!Object.hasOwn(v, 'counts') || !isObject(v.counts))
1163
+ return null;
1164
+ const { counts } = v;
1165
+ // Explicit per-key checks so isNumber type guards narrow each property.
1166
+ if (!Object.hasOwn(counts, 'confirm_drift') || !isNumber(counts.confirm_drift) || counts.confirm_drift < 0)
1167
+ return null;
1168
+ if (!Object.hasOwn(counts, 'revise_intent') || !isNumber(counts.revise_intent) || counts.revise_intent < 0)
1169
+ return null;
1170
+ if (!Object.hasOwn(counts, 'observe') || !isNumber(counts.observe) || counts.observe < 0)
1171
+ return null;
1172
+ if (!Object.hasOwn(counts, 'dismiss') || !isNumber(counts.dismiss) || counts.dismiss < 0)
1173
+ return null;
1174
+ if (!Object.hasOwn(counts, 'promote_to_principle') || !isNumber(counts.promote_to_principle) || counts.promote_to_principle < 0)
1175
+ return null;
1176
+ if (!Object.hasOwn(counts, 'promote_to_rulehost') || !isNumber(counts.promote_to_rulehost) || counts.promote_to_rulehost < 0)
1177
+ return null;
1178
+ // lastDecisionAt: null or string
1179
+ if (!Object.hasOwn(v, 'lastDecisionAt'))
1180
+ return null;
1181
+ const { lastDecisionAt } = v;
1182
+ if (lastDecisionAt !== null && !isString(lastDecisionAt))
1183
+ return null;
1184
+ return {
1185
+ counts: {
1186
+ confirm_drift: counts.confirm_drift,
1187
+ revise_intent: counts.revise_intent,
1188
+ observe: counts.observe,
1189
+ dismiss: counts.dismiss,
1190
+ promote_to_principle: counts.promote_to_principle,
1191
+ promote_to_rulehost: counts.promote_to_rulehost,
1192
+ },
1193
+ lastDecisionAt,
1194
+ };
1195
+ }
1196
+ const FOLLOW_UP_RESPONSE_TYPES = new Set([
1197
+ 'link_candidate',
1198
+ 'guide_rulehost',
1199
+ 'generate_patch_proposal',
1200
+ ]);
1201
+ /**
1202
+ * Validate the POST /api/v1/intent-decisions/:id/follow-up response.
1203
+ *
1204
+ * The response is a discriminated union on the `type` field. Each branch has
1205
+ * its own required fields (Rule 3: fail loud on missing required fields).
1206
+ *
1207
+ * Common required fields: `type`, `decisionId`.
1208
+ * - link_candidate: + `record` (IntentDecisionRecordData), `linkedCandidateId`
1209
+ * - guide_rulehost: + `cliCommand`, `note`
1210
+ * - generate_patch_proposal: + `record`, `patchProposal: { id, markdown }`
1211
+ */
1212
+ export function validateFollowUpResponse(v) {
1213
+ if (!isObject(v))
1214
+ return null;
1215
+ if (!Object.hasOwn(v, 'type') || !isString(v.type))
1216
+ return null;
1217
+ if (!FOLLOW_UP_RESPONSE_TYPES.has(v.type))
1218
+ return null;
1219
+ if (!Object.hasOwn(v, 'decisionId') || !isString(v.decisionId))
1220
+ return null;
1221
+ const typedType = v.type;
1222
+ const { decisionId } = v;
1223
+ if (typedType === 'link_candidate') {
1224
+ if (!Object.hasOwn(v, 'record'))
1225
+ return null;
1226
+ const record = validateIntentDecisionRecord(v.record);
1227
+ if (record === null)
1228
+ return null;
1229
+ if (!Object.hasOwn(v, 'linkedCandidateId') || !isString(v.linkedCandidateId))
1230
+ return null;
1231
+ return { type: 'link_candidate', decisionId, record, linkedCandidateId: v.linkedCandidateId };
1232
+ }
1233
+ if (typedType === 'guide_rulehost') {
1234
+ if (!Object.hasOwn(v, 'cliCommand') || !isString(v.cliCommand))
1235
+ return null;
1236
+ if (!Object.hasOwn(v, 'note') || !isString(v.note))
1237
+ return null;
1238
+ return { type: 'guide_rulehost', decisionId, cliCommand: v.cliCommand, note: v.note };
1239
+ }
1240
+ // generate_patch_proposal
1241
+ if (!Object.hasOwn(v, 'record'))
1242
+ return null;
1243
+ const record = validateIntentDecisionRecord(v.record);
1244
+ if (record === null)
1245
+ return null;
1246
+ if (!Object.hasOwn(v, 'patchProposal') || !isObject(v.patchProposal))
1247
+ return null;
1248
+ const pp = v.patchProposal;
1249
+ if (!Object.hasOwn(pp, 'id') || !isString(pp.id))
1250
+ return null;
1251
+ if (!Object.hasOwn(pp, 'markdown') || !isString(pp.markdown))
1252
+ return null;
1253
+ return {
1254
+ type: 'generate_patch_proposal',
1255
+ decisionId,
1256
+ record,
1257
+ patchProposal: { id: pp.id, markdown: pp.markdown },
1258
+ };
1259
+ }
937
1260
  function validateEvidenceChainRecord(v) {
938
1261
  if (!isObject(v))
939
1262
  return null;
@@ -1040,6 +1363,20 @@ function validateEvidenceChainRecord(v) {
1040
1363
  return null;
1041
1364
  result.dreamerTaskStatus = v.dreamerTaskStatus;
1042
1365
  }
1366
+ // PRI-469: intentTension (optional). When present but malformed, we DROP
1367
+ // the intentTension field but keep the rest of the record (the Owner still
1368
+ // sees the pain evidence). This matches the core's graceful-degradation
1369
+ // behavior where a malformed intentTension is omitted rather than failing
1370
+ // the entire record. The degradedReason on the record (if any) explains
1371
+ // what happened.
1372
+ if (Object.hasOwn(v, 'intentTension')) {
1373
+ const tension = validateIntentTension(v.intentTension);
1374
+ if (tension !== null) {
1375
+ result.intentTension = tension;
1376
+ }
1377
+ // If tension === null, we intentionally do NOT return null here — the
1378
+ // record is still valid, just without intentTension.
1379
+ }
1043
1380
  return result;
1044
1381
  }
1045
1382
  export function validateEvidenceChain(v) {
@@ -1193,3 +1530,99 @@ export function validateTrajectoryData(v) {
1193
1530
  }
1194
1531
  return result;
1195
1532
  }
1533
+ // ── Intent Page (PRI-466) ────────────────────────────────────────────────────
1534
+ const VALID_INTENT_REASONS = ['flag_disabled', 'not_found', 'read_error', 'parse_error', 'oversized'];
1535
+ const VALID_INTENT_WARNING_CODES = ['missing_section', 'empty_section', 'too_vague', 'oversized', 'parse_failed'];
1536
+ const VALID_INTENT_SECTION_KEYS = ['why', 'desiredOutcome', 'nonNegotiables', 'stopEscalation', 'currentStrategicFocus'];
1537
+ export function validateIntentWarning(v) {
1538
+ if (!isObject(v))
1539
+ return null;
1540
+ if (!Object.hasOwn(v, 'code') || !isString(v.code))
1541
+ return null;
1542
+ if (!VALID_INTENT_WARNING_CODES.includes(v.code))
1543
+ return null;
1544
+ if (!Object.hasOwn(v, 'message') || !isString(v.message))
1545
+ return null;
1546
+ const result = { code: v.code, message: v.message };
1547
+ // Runtime Contract Rule #3: fail loud on wrong-type optional fields,
1548
+ // consistent with validateIntentSummary's optional-field handling.
1549
+ if (Object.hasOwn(v, 'section')) {
1550
+ if (!isString(v.section))
1551
+ return null;
1552
+ result.section = v.section;
1553
+ }
1554
+ return result;
1555
+ }
1556
+ export function validateIntentSections(v) {
1557
+ if (!isObject(v))
1558
+ return null;
1559
+ const result = {};
1560
+ for (const key of VALID_INTENT_SECTION_KEYS) {
1561
+ if (Object.hasOwn(v, key)) {
1562
+ const val = v[key];
1563
+ if (val !== null && !isString(val))
1564
+ return null;
1565
+ if (isString(val)) {
1566
+ result[key] = val;
1567
+ }
1568
+ }
1569
+ }
1570
+ return result;
1571
+ }
1572
+ export function validateIntentSummary(v) {
1573
+ if (!isObject(v))
1574
+ return null;
1575
+ // Required fields
1576
+ if (!Object.hasOwn(v, 'ok') || !isBoolean(v.ok))
1577
+ return null;
1578
+ if (!Object.hasOwn(v, 'found') || !isBoolean(v.found))
1579
+ return null;
1580
+ if (!Object.hasOwn(v, 'flagEnabled') || !isBoolean(v.flagEnabled))
1581
+ return null;
1582
+ if (!Object.hasOwn(v, 'warnings') || !Array.isArray(v.warnings))
1583
+ return null;
1584
+ const warnings = validateArray(v.warnings, validateIntentWarning);
1585
+ if (warnings === null)
1586
+ return null;
1587
+ const result = {
1588
+ ok: v.ok,
1589
+ found: v.found,
1590
+ flagEnabled: v.flagEnabled,
1591
+ warnings,
1592
+ };
1593
+ // Optional fields — validate type if present, fail loud on wrong type
1594
+ if (Object.hasOwn(v, 'reason')) {
1595
+ if (!isString(v.reason))
1596
+ return null;
1597
+ if (!VALID_INTENT_REASONS.includes(v.reason))
1598
+ return null;
1599
+ result.reason = v.reason;
1600
+ }
1601
+ if (Object.hasOwn(v, 'nextAction')) {
1602
+ if (!isString(v.nextAction))
1603
+ return null;
1604
+ result.nextAction = v.nextAction;
1605
+ }
1606
+ if (Object.hasOwn(v, 'path')) {
1607
+ if (!isString(v.path))
1608
+ return null;
1609
+ result.path = v.path;
1610
+ }
1611
+ if (Object.hasOwn(v, 'contentHash')) {
1612
+ if (!isString(v.contentHash))
1613
+ return null;
1614
+ result.contentHash = v.contentHash;
1615
+ }
1616
+ if (Object.hasOwn(v, 'lastEditedAt')) {
1617
+ if (!isString(v.lastEditedAt))
1618
+ return null;
1619
+ result.lastEditedAt = v.lastEditedAt;
1620
+ }
1621
+ if (Object.hasOwn(v, 'sections')) {
1622
+ const sections = validateIntentSections(v.sections);
1623
+ if (sections === null)
1624
+ return null;
1625
+ result.sections = sections;
1626
+ }
1627
+ return result;
1628
+ }