create-principles-disciple 1.94.0 → 1.96.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 (530) 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 +196 -0
  4. package/console/dist/server/index.js +19 -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 +52 -0
  11. package/console/dist/server/models/IntentPageModel.js +292 -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 +7 -0
  20. package/console/dist/server/routes/intent.js +223 -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/types.d.ts +1 -0
  25. package/console/dist/ui/App.js +2 -60
  26. package/console/dist/ui/api.d.ts +58 -18
  27. package/console/dist/ui/api.js +78 -6
  28. package/console/dist/ui/components/layout/app-sidebar.js +13 -12
  29. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  30. package/console/dist/ui/components/ui/button.d.ts +1 -1
  31. package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
  32. package/console/dist/ui/components/ui/shiny-text.js +46 -0
  33. package/console/dist/ui/i18n/en.json +306 -3
  34. package/console/dist/ui/i18n/zh-CN.json +306 -3
  35. package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
  36. package/console/dist/ui/pages/control-center/AgentCard.d.ts +31 -0
  37. package/console/dist/ui/pages/control-center/AgentCard.js +156 -0
  38. package/console/dist/ui/pages/control-center/AgentGroup.d.ts +26 -0
  39. package/console/dist/ui/pages/control-center/AgentGroup.js +38 -0
  40. package/console/dist/ui/pages/control-center/ControlCenterPage.js +103 -41
  41. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
  42. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
  43. package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +17 -0
  44. package/console/dist/ui/pages/control-center/WorkflowDiagram.js +55 -0
  45. package/console/dist/ui/pages/debt/DebtPage.js +219 -2
  46. package/console/dist/ui/pages/focus/FocusPage.js +2 -1
  47. package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +67 -0
  48. package/console/dist/ui/pages/intent/IntentOnboarding.js +289 -0
  49. package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
  50. package/console/dist/ui/pages/intent/IntentPage.js +258 -0
  51. package/console/dist/ui/pages/pain/PainPage.js +234 -4
  52. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
  53. package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
  54. package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
  55. package/console/dist/ui/utils/agent-metadata.d.ts +58 -0
  56. package/console/dist/ui/utils/agent-metadata.js +275 -0
  57. package/console/dist/ui/utils/control-center-helpers.d.ts +19 -0
  58. package/console/dist/ui/utils/control-center-helpers.js +37 -0
  59. package/console/dist/ui/utils/validators.d.ts +200 -0
  60. package/console/dist/ui/utils/validators.js +563 -0
  61. package/console/dist/web/assets/app.css +498 -3
  62. package/console/dist/web/assets/app.js +5063 -1418
  63. package/console/package.json +3 -0
  64. package/core/dist/principle-tree-ledger.d.ts +55 -4
  65. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  66. package/core/dist/principle-tree-ledger.js +472 -13
  67. package/core/dist/principle-tree-ledger.js.map +1 -1
  68. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
  69. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
  70. package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
  71. package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
  72. package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
  73. package/core/dist/prompt-builder/size-guard.d.ts +1 -0
  74. package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
  75. package/core/dist/prompt-builder/size-guard.js +21 -0
  76. package/core/dist/prompt-builder/size-guard.js.map +1 -1
  77. package/core/dist/prompt-builder/types.d.ts +2 -0
  78. package/core/dist/prompt-builder/types.d.ts.map +1 -1
  79. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +143 -65
  80. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  81. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +85 -7
  82. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
  83. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
  84. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
  85. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
  86. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
  87. package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js +70 -0
  88. package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js.map +1 -1
  89. package/core/dist/runtime-v2/__tests__/golden-trace.test.js +136 -1
  90. package/core/dist/runtime-v2/__tests__/golden-trace.test.js.map +1 -1
  91. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +105 -0
  92. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
  93. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
  94. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  95. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
  96. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
  97. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
  98. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  99. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
  100. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
  101. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
  102. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
  103. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
  104. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
  105. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
  106. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
  107. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts +2 -0
  108. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts.map +1 -0
  109. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js +211 -0
  110. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js.map +1 -0
  111. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
  112. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
  113. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
  114. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
  115. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
  116. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
  117. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
  118. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  119. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
  120. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
  121. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
  122. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
  123. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
  124. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  125. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
  126. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
  127. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  128. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
  129. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  130. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  131. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
  132. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  133. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +158 -1
  134. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  135. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts +11 -0
  136. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  137. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +55 -11
  138. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  139. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
  140. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  141. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
  142. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
  143. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
  144. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
  145. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
  146. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
  147. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
  148. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
  149. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
  150. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
  151. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
  152. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
  153. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
  154. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
  155. package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
  156. package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  157. package/core/dist/runtime-v2/diagnostician-output.js +16 -0
  158. package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
  159. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
  160. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  161. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  162. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
  163. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
  164. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +23 -0
  165. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  166. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
  167. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
  168. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
  169. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
  170. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
  171. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
  172. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
  173. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
  174. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts +2 -0
  175. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts.map +1 -0
  176. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js +246 -0
  177. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js.map +1 -0
  178. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  179. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +9 -0
  180. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  181. package/core/dist/runtime-v2/feature-flags/index.d.ts +2 -0
  182. package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
  183. package/core/dist/runtime-v2/feature-flags/index.js +2 -0
  184. package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
  185. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
  186. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
  187. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  188. package/{plugin/dist/core/surface-guard.d.ts → core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts} +15 -5
  189. package/core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts.map +1 -0
  190. package/{plugin/dist/core/surface-guard.js → core/dist/runtime-v2/feature-flags/surface-guard-policy.js} +14 -2
  191. package/core/dist/runtime-v2/feature-flags/surface-guard-policy.js.map +1 -0
  192. package/core/dist/runtime-v2/golden-trace-replay-validator.js +1 -1
  193. package/core/dist/runtime-v2/golden-trace-replay-validator.js.map +1 -1
  194. package/core/dist/runtime-v2/golden-trace.d.ts +19 -3
  195. package/core/dist/runtime-v2/golden-trace.d.ts.map +1 -1
  196. package/core/dist/runtime-v2/golden-trace.js +2 -0
  197. package/core/dist/runtime-v2/golden-trace.js.map +1 -1
  198. package/core/dist/runtime-v2/index.d.ts +21 -4
  199. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  200. package/core/dist/runtime-v2/index.js +21 -3
  201. package/core/dist/runtime-v2/index.js.map +1 -1
  202. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
  203. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
  204. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
  205. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
  206. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts +2 -0
  207. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts.map +1 -0
  208. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js +88 -0
  209. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js.map +1 -0
  210. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
  211. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
  212. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +181 -0
  213. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
  214. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
  215. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
  216. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
  217. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
  218. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
  219. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
  220. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
  221. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
  222. package/core/dist/runtime-v2/intent/index.d.ts +8 -0
  223. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
  224. package/core/dist/runtime-v2/intent/index.js +8 -0
  225. package/core/dist/runtime-v2/intent/index.js.map +1 -0
  226. package/core/dist/runtime-v2/intent/intent-browser.d.ts +23 -0
  227. package/core/dist/runtime-v2/intent/intent-browser.d.ts.map +1 -0
  228. package/core/dist/runtime-v2/intent/intent-browser.js +21 -0
  229. package/core/dist/runtime-v2/intent/intent-browser.js.map +1 -0
  230. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
  231. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
  232. package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
  233. package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
  234. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
  235. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
  236. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
  237. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
  238. package/core/dist/runtime-v2/intent/intent-doc-version.d.ts +28 -0
  239. package/core/dist/runtime-v2/intent/intent-doc-version.d.ts.map +1 -0
  240. package/core/dist/runtime-v2/intent/intent-doc-version.js +21 -0
  241. package/core/dist/runtime-v2/intent/intent-doc-version.js.map +1 -0
  242. package/core/dist/runtime-v2/intent/intent-doc.d.ts +35 -0
  243. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
  244. package/core/dist/runtime-v2/intent/intent-doc.js +158 -0
  245. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
  246. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
  247. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
  248. package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
  249. package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
  250. package/core/dist/runtime-v2/intent/intent-hash.d.ts +2 -0
  251. package/core/dist/runtime-v2/intent/intent-hash.d.ts.map +1 -0
  252. package/core/dist/runtime-v2/intent/intent-hash.js +10 -0
  253. package/core/dist/runtime-v2/intent/intent-hash.js.map +1 -0
  254. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
  255. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
  256. package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
  257. package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
  258. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
  259. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
  260. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
  261. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
  262. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +41 -1
  263. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  264. package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js +130 -2
  265. package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js.map +1 -1
  266. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts +2 -0
  267. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts.map +1 -0
  268. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js +228 -0
  269. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js.map +1 -0
  270. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +41 -11
  271. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
  272. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
  273. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
  274. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
  275. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
  276. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
  277. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
  278. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
  279. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
  280. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
  281. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
  282. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
  283. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
  284. package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js +135 -0
  285. package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js.map +1 -1
  286. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
  287. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
  288. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
  289. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
  290. package/core/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -1
  291. package/core/dist/runtime-v2/internalization/adversarial-case.js +24 -0
  292. package/core/dist/runtime-v2/internalization/adversarial-case.js.map +1 -1
  293. package/core/dist/runtime-v2/internalization/artificer-output.d.ts +10 -0
  294. package/core/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
  295. package/core/dist/runtime-v2/internalization/artificer-output.js +45 -0
  296. package/core/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
  297. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +2 -2
  298. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  299. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +7 -2
  300. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  301. package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts +66 -0
  302. package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts.map +1 -0
  303. package/core/dist/runtime-v2/internalization/behavior-example-pack.js +183 -0
  304. package/core/dist/runtime-v2/internalization/behavior-example-pack.js.map +1 -0
  305. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
  306. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  307. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
  308. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  309. package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  310. package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
  311. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  312. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts +8 -0
  313. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
  314. package/core/dist/runtime-v2/internalization/evaluator-output.js +10 -0
  315. package/core/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
  316. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +17 -0
  317. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  318. package/core/dist/runtime-v2/internalization/evaluator-runner.js +118 -24
  319. package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  320. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.d.ts.map +1 -1
  321. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js +1 -1
  322. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js.map +1 -1
  323. package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
  324. package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
  325. package/core/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
  326. package/core/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
  327. package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
  328. package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
  329. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts +55 -0
  330. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts.map +1 -0
  331. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js +131 -0
  332. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js.map +1 -0
  333. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  334. package/core/dist/runtime-v2/pain-signal-observability.js +280 -56
  335. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  336. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
  337. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  338. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
  339. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  340. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
  341. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  342. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  343. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  344. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
  345. package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
  346. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  347. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts +2 -0
  348. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts.map +1 -0
  349. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js +95 -0
  350. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js.map +1 -0
  351. package/core/dist/runtime-v2/risk/index.d.ts +7 -0
  352. package/core/dist/runtime-v2/risk/index.d.ts.map +1 -0
  353. package/core/dist/runtime-v2/risk/index.js +6 -0
  354. package/core/dist/runtime-v2/risk/index.js.map +1 -0
  355. package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts +18 -0
  356. package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts.map +1 -0
  357. package/core/dist/runtime-v2/risk/risk-calculator-policy.js +47 -0
  358. package/core/dist/runtime-v2/risk/risk-calculator-policy.js.map +1 -0
  359. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
  360. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
  361. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
  362. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
  363. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
  364. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
  365. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
  366. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
  367. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
  368. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
  369. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
  370. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts +2 -0
  371. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts.map +1 -0
  372. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js +83 -0
  373. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js.map +1 -0
  374. package/core/dist/runtime-v2/store/intent/index.d.ts +7 -0
  375. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
  376. package/core/dist/runtime-v2/store/intent/index.js +6 -0
  377. package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
  378. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
  379. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
  380. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
  381. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
  382. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts +28 -0
  383. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts.map +1 -0
  384. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js +88 -0
  385. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js.map +1 -0
  386. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
  387. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
  388. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
  389. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
  390. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
  391. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
  392. package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
  393. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  394. package/core/dist/runtime-v2/store/sqlite-connection.js +138 -12
  395. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  396. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts +2 -0
  397. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts.map +1 -0
  398. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js +149 -0
  399. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js.map +1 -0
  400. package/core/dist/runtime-v2/thinking-models/index.d.ts +3 -0
  401. package/core/dist/runtime-v2/thinking-models/index.d.ts.map +1 -0
  402. package/core/dist/runtime-v2/thinking-models/index.js +3 -0
  403. package/core/dist/runtime-v2/thinking-models/index.js.map +1 -0
  404. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts +73 -0
  405. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts.map +1 -0
  406. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js +227 -0
  407. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js.map +1 -0
  408. package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js +40 -1
  409. package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js.map +1 -1
  410. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
  411. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js +28 -1
  412. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
  413. package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts +3 -0
  414. package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts.map +1 -1
  415. package/core/dist/runtime-v2/tools/artificer-output-typebox.js +3 -0
  416. package/core/dist/runtime-v2/tools/artificer-output-typebox.js.map +1 -1
  417. package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
  418. package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
  419. package/core/dist/runtime-v2/types/event-payload.js +0 -12
  420. package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
  421. package/core/dist/runtime-v2/types/event-types.d.ts +5 -34
  422. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  423. package/core/dist/runtime-v2/types/event-types.js +0 -19
  424. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  425. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
  426. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
  427. package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
  428. package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
  429. package/core/dist/runtime-v2/types/index.d.ts +5 -5
  430. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  431. package/core/dist/runtime-v2/types/index.js +5 -3
  432. package/core/dist/runtime-v2/types/index.js.map +1 -1
  433. package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
  434. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
  435. package/core/dist/runtime-v2/types/ledger-store.js +10 -5
  436. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
  437. package/core/dist/workflow-funnel-loader.d.ts +2 -2
  438. package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
  439. package/core/package.json +4 -0
  440. package/dist/installer.d.ts.map +1 -1
  441. package/dist/installer.js +16 -0
  442. package/dist/installer.js.map +1 -1
  443. package/package.json +1 -1
  444. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
  445. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
  446. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +237 -0
  447. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
  448. package/pd-cli/dist/commands/intent.d.ts +76 -0
  449. package/pd-cli/dist/commands/intent.d.ts.map +1 -0
  450. package/pd-cli/dist/commands/intent.js +411 -0
  451. package/pd-cli/dist/commands/intent.js.map +1 -0
  452. package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
  453. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
  454. package/pd-cli/dist/commands/runtime-init.js +264 -0
  455. package/pd-cli/dist/commands/runtime-init.js.map +1 -0
  456. package/pd-cli/dist/index.js +25 -0
  457. package/pd-cli/dist/index.js.map +1 -1
  458. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  459. package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
  460. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  461. package/pd-cli/package.json +1 -0
  462. package/plugin/dist/commands/pain.js +2 -0
  463. package/plugin/dist/core/behavior-example-pack-assembler.d.ts +43 -0
  464. package/plugin/dist/core/behavior-example-pack-assembler.js +247 -0
  465. package/plugin/dist/core/control-ui-db.d.ts +11 -0
  466. package/plugin/dist/core/control-ui-db.js +40 -16
  467. package/plugin/dist/core/event-log.js +0 -5
  468. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +36 -0
  469. package/plugin/dist/core/intent-doc-reader-adapter.js +76 -0
  470. package/plugin/dist/core/intent-doc-reader.d.ts +89 -0
  471. package/plugin/dist/core/intent-doc-reader.js +210 -0
  472. package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
  473. package/plugin/dist/core/principle-tree-ledger.js +39 -524
  474. package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
  475. package/plugin/dist/core/rule-context-assembler.d.ts +45 -0
  476. package/plugin/dist/core/rule-context-assembler.js +148 -0
  477. package/plugin/dist/core/thinking-models.d.ts +12 -57
  478. package/plugin/dist/core/thinking-models.js +18 -224
  479. package/plugin/dist/core/trajectory-types.d.ts +18 -0
  480. package/plugin/dist/core/trajectory.d.ts +50 -2
  481. package/plugin/dist/core/trajectory.js +435 -254
  482. package/plugin/dist/core/workspace-context.d.ts +2 -3
  483. package/plugin/dist/hooks/gate.js +59 -2
  484. package/plugin/dist/hooks/pain.js +5 -0
  485. package/plugin/dist/hooks/prompt-helpers.d.ts +19 -1
  486. package/plugin/dist/hooks/prompt-helpers.js +39 -2
  487. package/plugin/dist/hooks/prompt-types.d.ts +8 -0
  488. package/plugin/dist/hooks/prompt.js +81 -21
  489. package/plugin/dist/index.d.ts +3 -1
  490. package/plugin/dist/index.js +10 -6
  491. package/plugin/dist/service/runtime-summary-service.js +1 -1
  492. package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
  493. package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
  494. package/plugin/dist/types/event-types.d.ts +1 -1
  495. package/plugin/package.json +6 -3
  496. package/plugin/scripts/acceptance-test.mjs +3 -3
  497. package/plugin/dist/core/evolution-migration.d.ts +0 -5
  498. package/plugin/dist/core/evolution-migration.js +0 -65
  499. package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
  500. package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
  501. package/plugin/dist/core/risk-calculator.d.ts +0 -22
  502. package/plugin/dist/core/risk-calculator.js +0 -88
  503. package/plugin/dist/core/rule-host-helpers.d.ts +0 -8
  504. package/plugin/dist/core/rule-host-helpers.js +0 -7
  505. package/plugin/dist/core/rule-host-types.d.ts +0 -7
  506. package/plugin/dist/core/rule-host-types.js +0 -7
  507. package/plugin/dist/core/schema/db-types.d.ts +0 -11
  508. package/plugin/dist/core/schema/db-types.js +0 -5
  509. package/plugin/dist/core/schema/index.d.ts +0 -17
  510. package/plugin/dist/core/schema/index.js +0 -15
  511. package/plugin/dist/core/schema/migration-runner.d.ts +0 -53
  512. package/plugin/dist/core/schema/migration-runner.js +0 -170
  513. package/plugin/dist/core/schema/migrations/001-init-trajectory.d.ts +0 -6
  514. package/plugin/dist/core/schema/migrations/001-init-trajectory.js +0 -190
  515. package/plugin/dist/core/schema/migrations/002-init-central.d.ts +0 -5
  516. package/plugin/dist/core/schema/migrations/002-init-central.js +0 -108
  517. package/plugin/dist/core/schema/migrations/003-init-workflow.d.ts +0 -5
  518. package/plugin/dist/core/schema/migrations/003-init-workflow.js +0 -50
  519. package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +0 -8
  520. package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.js +0 -66
  521. package/plugin/dist/core/schema/migrations/index.d.ts +0 -16
  522. package/plugin/dist/core/schema/migrations/index.js +0 -27
  523. package/plugin/dist/core/schema/schema-definitions.d.ts +0 -46
  524. package/plugin/dist/core/schema/schema-definitions.js +0 -599
  525. package/plugin/dist/service/central-database.d.ts +0 -138
  526. package/plugin/dist/service/central-database.js +0 -731
  527. package/plugin/dist/service/central-sync-service.d.ts +0 -8
  528. package/plugin/dist/service/central-sync-service.js +0 -71
  529. package/plugin/scripts/db-migrate.mjs +0 -170
  530. package/plugin/scripts/validate-live-path.ts +0 -462
@@ -62,6 +62,14 @@ export function validateErrorResponse(v) {
62
62
  if (Object.hasOwn(v, 'error') && isString(v.error)) {
63
63
  result.error = v.error;
64
64
  }
65
+ // N4 (PR-1083 review): surfacing the machine-readable `reason` field lets
66
+ // the UI branch on structured error codes instead of parsing natural
67
+ // language out of nextAction. Previously `nextAction.includes("32KB")`
68
+ // would silently regress to "saveFailed" the moment the backend phrased
69
+ // the cap differently or returned localized text.
70
+ if (Object.hasOwn(v, 'reason') && isString(v.reason)) {
71
+ result.reason = v.reason;
72
+ }
65
73
  if (Object.hasOwn(v, 'nextAction') && isString(v.nextAction)) {
66
74
  result.nextAction = v.nextAction;
67
75
  }
@@ -357,6 +365,15 @@ export function validateAgentBindingUpdate(v) {
357
365
  return null;
358
366
  return { agent: v.agent, runtimeProfile: v.runtimeProfile, enabled: v.enabled };
359
367
  }
368
+ export function validateFeatureFlagUpdate(v) {
369
+ if (!isObject(v))
370
+ return null;
371
+ if (!Object.hasOwn(v, 'feature') || !isString(v.feature))
372
+ return null;
373
+ if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
374
+ return null;
375
+ return { feature: v.feature, enabled: v.enabled };
376
+ }
360
377
  export function validateReadinessCheck(v) {
361
378
  if (!isObject(v))
362
379
  return null;
@@ -934,6 +951,320 @@ const VALID_EVIDENCE_CHAIN_STATES = new Set([
934
951
  'malformed',
935
952
  'degraded',
936
953
  ]);
954
+ // ── Intent Tension (PRI-469, SPEC §16) ───────────────────────────────────────
955
+ //
956
+ // Frontend mirror of the core IntentTension type. `confidence` is forbidden
957
+ // (SPEC §16.3) — validateIntentTension rejects any object carrying it.
958
+ // This validator is the Console's trust boundary: untrusted JSON from the API
959
+ // is narrowed here before any UI code touches it (ERR-001).
960
+ const VALID_INTENT_TENSION_SOURCES = ['none', 'action_drift', 'intent_suspect', 'healthy_tension'];
961
+ const VALID_EVIDENCE_STRENGTHS = ['weak', 'moderate', 'strong'];
962
+ const VALID_INTENT_RELATED_FIELDS = [
963
+ 'why',
964
+ 'desired_outcome',
965
+ 'non_negotiables',
966
+ 'stop_escalation',
967
+ 'current_strategic_focus',
968
+ ];
969
+ const VALID_SUGGESTED_OWNER_ACTIONS = [
970
+ 'confirm_drift',
971
+ 'revise_intent',
972
+ 'observe',
973
+ 'dismiss',
974
+ 'promote_to_principle',
975
+ 'promote_to_rulehost',
976
+ ];
977
+ /**
978
+ * Validate an untrusted `intentTension` object from the EvidenceChain API
979
+ * response. Returns `null` when malformed; the caller (validateEvidenceChainRecord)
980
+ * treats a `null` intentTension as "not present" so the record is still usable.
981
+ *
982
+ * SPEC §16.3: `confidence` is forbidden — explicitly rejected here.
983
+ * SPEC §16.4: evidence is capped at 3 items; we accept up to 3 and reject
984
+ * arrays with non-string elements (ERR-005/007).
985
+ */
986
+ export function validateIntentTension(v) {
987
+ if (!isObject(v))
988
+ return null;
989
+ // SPEC §16.3: confidence is forbidden on intentTension.
990
+ if (Object.hasOwn(v, 'confidence'))
991
+ return null;
992
+ // Required fields (ERR-009: fail loud when missing or wrong type)
993
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
994
+ return null;
995
+ if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
996
+ return null;
997
+ if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
998
+ return null;
999
+ if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
1000
+ return null;
1001
+ if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
1002
+ return null;
1003
+ const relatedIntentFields = [];
1004
+ for (const f of v.relatedIntentFields) {
1005
+ if (typeof f !== 'string')
1006
+ return null;
1007
+ if (!VALID_INTENT_RELATED_FIELDS.includes(f))
1008
+ return null;
1009
+ relatedIntentFields.push(f);
1010
+ }
1011
+ if (!Object.hasOwn(v, 'evidence') || !Array.isArray(v.evidence))
1012
+ return null;
1013
+ const evidence = [];
1014
+ for (const e of v.evidence) {
1015
+ if (typeof e !== 'string')
1016
+ return null;
1017
+ evidence.push(e);
1018
+ }
1019
+ // SPEC §16.4: cap at 3. Server-side already truncates, but the frontend
1020
+ // must not trust that — enforce the cap here too (defense in depth).
1021
+ const truncatedEvidence = evidence.slice(0, 3);
1022
+ if (!Object.hasOwn(v, 'explanation') || !isString(v.explanation))
1023
+ return null;
1024
+ if (v.explanation.length === 0)
1025
+ return null;
1026
+ if (!Object.hasOwn(v, 'suggestedOwnerAction') || !isString(v.suggestedOwnerAction))
1027
+ return null;
1028
+ if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.suggestedOwnerAction))
1029
+ return null;
1030
+ const result = {
1031
+ source: v.source,
1032
+ evidenceStrength: v.evidenceStrength,
1033
+ relatedIntentFields,
1034
+ evidence: truncatedEvidence,
1035
+ explanation: v.explanation,
1036
+ suggestedOwnerAction: v.suggestedOwnerAction,
1037
+ };
1038
+ // Optional: intentDocHash
1039
+ if (Object.hasOwn(v, 'intentDocHash')) {
1040
+ if (!isString(v.intentDocHash))
1041
+ return null;
1042
+ result.intentDocHash = v.intentDocHash;
1043
+ }
1044
+ return result;
1045
+ }
1046
+ /**
1047
+ * Validate an untrusted IntentDecisionRecord object from the API.
1048
+ * Returns null when malformed (Rule 3: fail loud on missing/wrong-type fields).
1049
+ *
1050
+ * Enum fields (source, evidenceStrength, ownerAction) are validated against
1051
+ * the same sets used by validateIntentTension. relatedIntentFields elements
1052
+ * are validated against VALID_INTENT_RELATED_FIELDS.
1053
+ */
1054
+ export function validateIntentDecisionRecord(v) {
1055
+ if (!isObject(v))
1056
+ return null;
1057
+ // Required fields (ERR-009: fail loud when missing or wrong type)
1058
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
1059
+ return null;
1060
+ if (!Object.hasOwn(v, 'source') || !isString(v.source))
1061
+ return null;
1062
+ if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
1063
+ return null;
1064
+ if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
1065
+ return null;
1066
+ if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
1067
+ return null;
1068
+ if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
1069
+ return null;
1070
+ const relatedIntentFields = [];
1071
+ for (const f of v.relatedIntentFields) {
1072
+ if (typeof f !== 'string')
1073
+ return null;
1074
+ if (!VALID_INTENT_RELATED_FIELDS.includes(f))
1075
+ return null;
1076
+ relatedIntentFields.push(f);
1077
+ }
1078
+ if (!Object.hasOwn(v, 'ownerAction') || !isString(v.ownerAction))
1079
+ return null;
1080
+ if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.ownerAction))
1081
+ return null;
1082
+ if (!Object.hasOwn(v, 'evidenceRefs') || !Array.isArray(v.evidenceRefs))
1083
+ return null;
1084
+ const evidenceRefs = [];
1085
+ for (const e of v.evidenceRefs) {
1086
+ if (typeof e !== 'string')
1087
+ return null;
1088
+ evidenceRefs.push(e);
1089
+ }
1090
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
1091
+ return null;
1092
+ const result = {
1093
+ id: v.id,
1094
+ source: v.source,
1095
+ evidenceStrength: v.evidenceStrength,
1096
+ relatedIntentFields,
1097
+ ownerAction: v.ownerAction,
1098
+ evidenceRefs,
1099
+ createdAt: v.createdAt,
1100
+ };
1101
+ // Optional fields — fail loud when present but wrong type (ERR-009)
1102
+ if (Object.hasOwn(v, 'painId')) {
1103
+ if (!isString(v.painId))
1104
+ return null;
1105
+ result.painId = v.painId;
1106
+ }
1107
+ if (Object.hasOwn(v, 'taskId')) {
1108
+ if (!isString(v.taskId))
1109
+ return null;
1110
+ result.taskId = v.taskId;
1111
+ }
1112
+ if (Object.hasOwn(v, 'runId')) {
1113
+ if (!isString(v.runId))
1114
+ return null;
1115
+ result.runId = v.runId;
1116
+ }
1117
+ if (Object.hasOwn(v, 'intentDocHash')) {
1118
+ if (!isString(v.intentDocHash))
1119
+ return null;
1120
+ result.intentDocHash = v.intentDocHash;
1121
+ }
1122
+ if (Object.hasOwn(v, 'resultingCandidateId')) {
1123
+ if (!isString(v.resultingCandidateId))
1124
+ return null;
1125
+ result.resultingCandidateId = v.resultingCandidateId;
1126
+ }
1127
+ if (Object.hasOwn(v, 'resultingRuleCandidateId')) {
1128
+ if (!isString(v.resultingRuleCandidateId))
1129
+ return null;
1130
+ result.resultingRuleCandidateId = v.resultingRuleCandidateId;
1131
+ }
1132
+ if (Object.hasOwn(v, 'patchProposalId')) {
1133
+ if (!isString(v.patchProposalId))
1134
+ return null;
1135
+ result.patchProposalId = v.patchProposalId;
1136
+ }
1137
+ return result;
1138
+ }
1139
+ /**
1140
+ * Validate a list of IntentDecisionRecord objects. Returns null if any
1141
+ * element is malformed (ERR-005/007: validate array element types).
1142
+ */
1143
+ export function validateIntentDecisionList(v) {
1144
+ return validateArray(v, validateIntentDecisionRecord);
1145
+ }
1146
+ /**
1147
+ * Validate the POST /api/v1/intent-decisions response envelope.
1148
+ * Shape: { record: IntentDecisionRecord, created: boolean }
1149
+ */
1150
+ export function validateIntentDecisionResult(v) {
1151
+ if (!isObject(v))
1152
+ return null;
1153
+ if (!Object.hasOwn(v, 'record'))
1154
+ return null;
1155
+ const record = validateIntentDecisionRecord(v.record);
1156
+ if (record === null)
1157
+ return null;
1158
+ if (!Object.hasOwn(v, 'created') || !isBoolean(v.created))
1159
+ return null;
1160
+ return { record, created: v.created };
1161
+ }
1162
+ /**
1163
+ * Validate the GET /api/v1/intent-decisions/summary response.
1164
+ * All 6 count keys must be present with non-negative finite numbers.
1165
+ * lastDecisionAt: null is valid, string is valid, anything else returns null.
1166
+ */
1167
+ export function validateIntentDecisionSummary(v) {
1168
+ if (!isObject(v))
1169
+ return null;
1170
+ if (!Object.hasOwn(v, 'counts') || !isObject(v.counts))
1171
+ return null;
1172
+ const { counts } = v;
1173
+ // Explicit per-key checks so isNumber type guards narrow each property.
1174
+ if (!Object.hasOwn(counts, 'confirm_drift') || !isNumber(counts.confirm_drift) || counts.confirm_drift < 0)
1175
+ return null;
1176
+ if (!Object.hasOwn(counts, 'revise_intent') || !isNumber(counts.revise_intent) || counts.revise_intent < 0)
1177
+ return null;
1178
+ if (!Object.hasOwn(counts, 'observe') || !isNumber(counts.observe) || counts.observe < 0)
1179
+ return null;
1180
+ if (!Object.hasOwn(counts, 'dismiss') || !isNumber(counts.dismiss) || counts.dismiss < 0)
1181
+ return null;
1182
+ if (!Object.hasOwn(counts, 'promote_to_principle') || !isNumber(counts.promote_to_principle) || counts.promote_to_principle < 0)
1183
+ return null;
1184
+ if (!Object.hasOwn(counts, 'promote_to_rulehost') || !isNumber(counts.promote_to_rulehost) || counts.promote_to_rulehost < 0)
1185
+ return null;
1186
+ // lastDecisionAt: null or string
1187
+ if (!Object.hasOwn(v, 'lastDecisionAt'))
1188
+ return null;
1189
+ const { lastDecisionAt } = v;
1190
+ if (lastDecisionAt !== null && !isString(lastDecisionAt))
1191
+ return null;
1192
+ return {
1193
+ counts: {
1194
+ confirm_drift: counts.confirm_drift,
1195
+ revise_intent: counts.revise_intent,
1196
+ observe: counts.observe,
1197
+ dismiss: counts.dismiss,
1198
+ promote_to_principle: counts.promote_to_principle,
1199
+ promote_to_rulehost: counts.promote_to_rulehost,
1200
+ },
1201
+ lastDecisionAt,
1202
+ };
1203
+ }
1204
+ const FOLLOW_UP_RESPONSE_TYPES = new Set([
1205
+ 'link_candidate',
1206
+ 'guide_rulehost',
1207
+ 'generate_patch_proposal',
1208
+ ]);
1209
+ /**
1210
+ * Validate the POST /api/v1/intent-decisions/:id/follow-up response.
1211
+ *
1212
+ * The response is a discriminated union on the `type` field. Each branch has
1213
+ * its own required fields (Rule 3: fail loud on missing required fields).
1214
+ *
1215
+ * Common required fields: `type`, `decisionId`.
1216
+ * - link_candidate: + `record` (IntentDecisionRecordData), `linkedCandidateId`
1217
+ * - guide_rulehost: + `cliCommand`, `note`
1218
+ * - generate_patch_proposal: + `record`, `patchProposal: { id, markdown }`
1219
+ */
1220
+ export function validateFollowUpResponse(v) {
1221
+ if (!isObject(v))
1222
+ return null;
1223
+ if (!Object.hasOwn(v, 'type') || !isString(v.type))
1224
+ return null;
1225
+ if (!FOLLOW_UP_RESPONSE_TYPES.has(v.type))
1226
+ return null;
1227
+ if (!Object.hasOwn(v, 'decisionId') || !isString(v.decisionId))
1228
+ return null;
1229
+ const typedType = v.type;
1230
+ const { decisionId } = v;
1231
+ if (typedType === 'link_candidate') {
1232
+ if (!Object.hasOwn(v, 'record'))
1233
+ return null;
1234
+ const record = validateIntentDecisionRecord(v.record);
1235
+ if (record === null)
1236
+ return null;
1237
+ if (!Object.hasOwn(v, 'linkedCandidateId') || !isString(v.linkedCandidateId))
1238
+ return null;
1239
+ return { type: 'link_candidate', decisionId, record, linkedCandidateId: v.linkedCandidateId };
1240
+ }
1241
+ if (typedType === 'guide_rulehost') {
1242
+ if (!Object.hasOwn(v, 'cliCommand') || !isString(v.cliCommand))
1243
+ return null;
1244
+ if (!Object.hasOwn(v, 'note') || !isString(v.note))
1245
+ return null;
1246
+ return { type: 'guide_rulehost', decisionId, cliCommand: v.cliCommand, note: v.note };
1247
+ }
1248
+ // generate_patch_proposal
1249
+ if (!Object.hasOwn(v, 'record'))
1250
+ return null;
1251
+ const record = validateIntentDecisionRecord(v.record);
1252
+ if (record === null)
1253
+ return null;
1254
+ if (!Object.hasOwn(v, 'patchProposal') || !isObject(v.patchProposal))
1255
+ return null;
1256
+ const pp = v.patchProposal;
1257
+ if (!Object.hasOwn(pp, 'id') || !isString(pp.id))
1258
+ return null;
1259
+ if (!Object.hasOwn(pp, 'markdown') || !isString(pp.markdown))
1260
+ return null;
1261
+ return {
1262
+ type: 'generate_patch_proposal',
1263
+ decisionId,
1264
+ record,
1265
+ patchProposal: { id: pp.id, markdown: pp.markdown },
1266
+ };
1267
+ }
937
1268
  function validateEvidenceChainRecord(v) {
938
1269
  if (!isObject(v))
939
1270
  return null;
@@ -1040,6 +1371,20 @@ function validateEvidenceChainRecord(v) {
1040
1371
  return null;
1041
1372
  result.dreamerTaskStatus = v.dreamerTaskStatus;
1042
1373
  }
1374
+ // PRI-469: intentTension (optional). When present but malformed, we DROP
1375
+ // the intentTension field but keep the rest of the record (the Owner still
1376
+ // sees the pain evidence). This matches the core's graceful-degradation
1377
+ // behavior where a malformed intentTension is omitted rather than failing
1378
+ // the entire record. The degradedReason on the record (if any) explains
1379
+ // what happened.
1380
+ if (Object.hasOwn(v, 'intentTension')) {
1381
+ const tension = validateIntentTension(v.intentTension);
1382
+ if (tension !== null) {
1383
+ result.intentTension = tension;
1384
+ }
1385
+ // If tension === null, we intentionally do NOT return null here — the
1386
+ // record is still valid, just without intentTension.
1387
+ }
1043
1388
  return result;
1044
1389
  }
1045
1390
  export function validateEvidenceChain(v) {
@@ -1193,3 +1538,221 @@ export function validateTrajectoryData(v) {
1193
1538
  }
1194
1539
  return result;
1195
1540
  }
1541
+ // ── Intent Page (PRI-466) ────────────────────────────────────────────────────
1542
+ const VALID_INTENT_REASONS = ['flag_disabled', 'not_found', 'read_error', 'parse_error', 'oversized'];
1543
+ const VALID_INTENT_WARNING_CODES = ['missing_section', 'empty_section', 'too_vague', 'oversized', 'parse_failed'];
1544
+ const VALID_INTENT_SECTION_KEYS = ['why', 'desiredOutcome', 'nonNegotiables', 'stopEscalation', 'currentStrategicFocus'];
1545
+ export function validateIntentWarning(v) {
1546
+ if (!isObject(v))
1547
+ return null;
1548
+ if (!Object.hasOwn(v, 'code') || !isString(v.code))
1549
+ return null;
1550
+ if (!VALID_INTENT_WARNING_CODES.includes(v.code))
1551
+ return null;
1552
+ if (!Object.hasOwn(v, 'message') || !isString(v.message))
1553
+ return null;
1554
+ const result = { code: v.code, message: v.message };
1555
+ // Runtime Contract Rule #3: fail loud on wrong-type optional fields,
1556
+ // consistent with validateIntentSummary's optional-field handling.
1557
+ if (Object.hasOwn(v, 'section')) {
1558
+ if (!isString(v.section))
1559
+ return null;
1560
+ result.section = v.section;
1561
+ }
1562
+ return result;
1563
+ }
1564
+ export function validateIntentSections(v) {
1565
+ if (!isObject(v))
1566
+ return null;
1567
+ const result = {};
1568
+ for (const key of VALID_INTENT_SECTION_KEYS) {
1569
+ if (Object.hasOwn(v, key)) {
1570
+ const val = v[key];
1571
+ if (val !== null && !isString(val))
1572
+ return null;
1573
+ if (isString(val)) {
1574
+ result[key] = val;
1575
+ }
1576
+ }
1577
+ }
1578
+ return result;
1579
+ }
1580
+ export function validateIntentSummary(v) {
1581
+ if (!isObject(v))
1582
+ return null;
1583
+ // Required fields
1584
+ if (!Object.hasOwn(v, 'ok') || !isBoolean(v.ok))
1585
+ return null;
1586
+ if (!Object.hasOwn(v, 'found') || !isBoolean(v.found))
1587
+ return null;
1588
+ if (!Object.hasOwn(v, 'flagEnabled') || !isBoolean(v.flagEnabled))
1589
+ return null;
1590
+ if (!Object.hasOwn(v, 'warnings') || !Array.isArray(v.warnings))
1591
+ return null;
1592
+ const warnings = validateArray(v.warnings, validateIntentWarning);
1593
+ if (warnings === null)
1594
+ return null;
1595
+ const result = {
1596
+ ok: v.ok,
1597
+ found: v.found,
1598
+ flagEnabled: v.flagEnabled,
1599
+ warnings,
1600
+ };
1601
+ // Optional fields — validate type if present, fail loud on wrong type
1602
+ if (Object.hasOwn(v, 'reason')) {
1603
+ if (!isString(v.reason))
1604
+ return null;
1605
+ if (!VALID_INTENT_REASONS.includes(v.reason))
1606
+ return null;
1607
+ result.reason = v.reason;
1608
+ }
1609
+ if (Object.hasOwn(v, 'nextAction')) {
1610
+ if (!isString(v.nextAction))
1611
+ return null;
1612
+ result.nextAction = v.nextAction;
1613
+ }
1614
+ if (Object.hasOwn(v, 'path')) {
1615
+ if (!isString(v.path))
1616
+ return null;
1617
+ result.path = v.path;
1618
+ }
1619
+ if (Object.hasOwn(v, 'contentHash')) {
1620
+ if (!isString(v.contentHash))
1621
+ return null;
1622
+ result.contentHash = v.contentHash;
1623
+ }
1624
+ if (Object.hasOwn(v, 'lastEditedAt')) {
1625
+ if (!isString(v.lastEditedAt))
1626
+ return null;
1627
+ result.lastEditedAt = v.lastEditedAt;
1628
+ }
1629
+ if (Object.hasOwn(v, 'sections')) {
1630
+ const sections = validateIntentSections(v.sections);
1631
+ if (sections === null)
1632
+ return null;
1633
+ result.sections = sections;
1634
+ }
1635
+ return result;
1636
+ }
1637
+ export function validateIntentRawContent(v) {
1638
+ if (!isObject(v))
1639
+ return null;
1640
+ if (!Object.hasOwn(v, 'content') || !isString(v.content))
1641
+ return null;
1642
+ if (!Object.hasOwn(v, 'path') || !isString(v.path))
1643
+ return null;
1644
+ return { content: v.content, path: v.path };
1645
+ }
1646
+ export function validateIntentInitResult(v) {
1647
+ if (!isObject(v))
1648
+ return null;
1649
+ // Required fields
1650
+ if (!Object.hasOwn(v, 'ok') || !isBoolean(v.ok))
1651
+ return null;
1652
+ if (!Object.hasOwn(v, 'created') || !isBoolean(v.created))
1653
+ return null;
1654
+ const result = {
1655
+ ok: v.ok,
1656
+ created: v.created,
1657
+ };
1658
+ // Optional fields
1659
+ const path = readNullableString(v, 'path');
1660
+ if (!path.valid)
1661
+ return null;
1662
+ if (path.value !== null)
1663
+ result.path = path.value;
1664
+ const reason = readNullableString(v, 'reason');
1665
+ if (!reason.valid)
1666
+ return null;
1667
+ if (reason.value !== null)
1668
+ result.reason = reason.value;
1669
+ const nextAction = readNullableString(v, 'nextAction');
1670
+ if (!nextAction.valid)
1671
+ return null;
1672
+ if (nextAction.value !== null)
1673
+ result.nextAction = nextAction.value;
1674
+ return result;
1675
+ }
1676
+ export function validateIntentSaveResult(v) {
1677
+ if (!isObject(v))
1678
+ return null;
1679
+ // Required fields
1680
+ if (!Object.hasOwn(v, 'ok') || !isBoolean(v.ok))
1681
+ return null;
1682
+ if (!Object.hasOwn(v, 'saved') || !isBoolean(v.saved))
1683
+ return null;
1684
+ const result = {
1685
+ ok: v.ok,
1686
+ saved: v.saved,
1687
+ };
1688
+ // Optional fields
1689
+ const path = readNullableString(v, 'path');
1690
+ if (!path.valid)
1691
+ return null;
1692
+ if (path.value !== null)
1693
+ result.path = path.value;
1694
+ const contentHash = readNullableString(v, 'contentHash');
1695
+ if (!contentHash.valid)
1696
+ return null;
1697
+ if (contentHash.value !== null)
1698
+ result.contentHash = contentHash.value;
1699
+ const lastEditedAt = readNullableString(v, 'lastEditedAt');
1700
+ if (!lastEditedAt.valid)
1701
+ return null;
1702
+ if (lastEditedAt.value !== null)
1703
+ result.lastEditedAt = lastEditedAt.value;
1704
+ const reason = readNullableString(v, 'reason');
1705
+ if (!reason.valid)
1706
+ return null;
1707
+ if (reason.value !== null)
1708
+ result.reason = reason.value;
1709
+ const nextAction = readNullableString(v, 'nextAction');
1710
+ if (!nextAction.valid)
1711
+ return null;
1712
+ if (nextAction.value !== null)
1713
+ result.nextAction = nextAction.value;
1714
+ if (Object.hasOwn(v, 'warnings')) {
1715
+ if (!Array.isArray(v.warnings))
1716
+ return null;
1717
+ const warnings = validateArray(v.warnings, validateIntentWarning);
1718
+ if (warnings === null)
1719
+ return null;
1720
+ result.warnings = warnings;
1721
+ }
1722
+ return result;
1723
+ }
1724
+ function validateIntentVersionEntry(v) {
1725
+ if (!isObject(v))
1726
+ return null;
1727
+ // Required string fields — fail loud on missing or wrong type (rc-3, rc-4)
1728
+ if (!Object.hasOwn(v, 'id') || !isString(v.id))
1729
+ return null;
1730
+ if (!Object.hasOwn(v, 'lang') || !isString(v.lang))
1731
+ return null;
1732
+ if (!Object.hasOwn(v, 'contentHash') || !isString(v.contentHash))
1733
+ return null;
1734
+ if (!Object.hasOwn(v, 'contentSnapshot') || !isString(v.contentSnapshot))
1735
+ return null;
1736
+ if (!Object.hasOwn(v, 'reason') || !isString(v.reason))
1737
+ return null;
1738
+ if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
1739
+ return null;
1740
+ return {
1741
+ id: v.id,
1742
+ lang: v.lang,
1743
+ contentHash: v.contentHash,
1744
+ contentSnapshot: v.contentSnapshot,
1745
+ reason: v.reason,
1746
+ createdAt: v.createdAt,
1747
+ };
1748
+ }
1749
+ export function validateIntentVersions(v) {
1750
+ if (!isObject(v))
1751
+ return null;
1752
+ if (!Object.hasOwn(v, 'versions') || !Array.isArray(v.versions))
1753
+ return null;
1754
+ const versions = validateArray(v.versions, validateIntentVersionEntry);
1755
+ if (versions === null)
1756
+ return null;
1757
+ return { versions };
1758
+ }