create-principles-disciple 1.93.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 (526) hide show
  1. package/console/dist/server/config/WorkspaceConfigStore.js +2 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +40 -1
  3. package/console/dist/server/config/pd-config-store.js +170 -1
  4. package/console/dist/server/index.js +28 -10
  5. package/console/dist/server/models/ApprovalsConsoleModel.js +4 -12
  6. package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
  7. package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
  8. package/console/dist/server/models/HealthCheckModel.js +5 -3
  9. package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
  10. package/console/dist/server/models/IntentDecisionModel.js +207 -0
  11. package/console/dist/server/models/IntentPageModel.d.ts +18 -0
  12. package/console/dist/server/models/IntentPageModel.js +90 -0
  13. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
  14. package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
  15. package/console/dist/server/models/WorkspaceService.d.ts +0 -28
  16. package/console/dist/server/models/WorkspaceService.js +0 -115
  17. package/console/dist/server/routes/config.js +55 -1
  18. package/console/dist/server/routes/feedback-reports.js +1 -1
  19. package/console/dist/server/routes/intent-decisions.d.ts +33 -0
  20. package/console/dist/server/routes/intent-decisions.js +499 -0
  21. package/console/dist/server/routes/intent.d.ts +3 -0
  22. package/console/dist/server/routes/intent.js +35 -0
  23. package/console/dist/server/routes/principles.js +67 -1
  24. package/console/dist/server/routes/update.d.ts +0 -1
  25. package/console/dist/server/routes/update.js +14 -11
  26. package/console/dist/ui/App.js +2 -7
  27. package/console/dist/ui/api.d.ts +44 -18
  28. package/console/dist/ui/api.js +44 -5
  29. package/console/dist/ui/components/layout/app-sidebar.js +2 -1
  30. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  31. package/console/dist/ui/components/ui/button.d.ts +1 -1
  32. package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
  33. package/console/dist/ui/components/ui/shiny-text.js +46 -0
  34. package/console/dist/ui/i18n/en.json +167 -3
  35. package/console/dist/ui/i18n/zh-CN.json +167 -3
  36. package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
  37. package/console/dist/ui/pages/control-center/ControlCenterPage.js +28 -2
  38. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
  39. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
  40. package/console/dist/ui/pages/debt/DebtPage.js +219 -2
  41. package/console/dist/ui/pages/focus/FocusPage.js +2 -1
  42. package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
  43. package/console/dist/ui/pages/intent/IntentPage.js +147 -0
  44. package/console/dist/ui/pages/pain/PainPage.js +234 -4
  45. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
  46. package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
  47. package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
  48. package/console/dist/ui/utils/validators.d.ts +163 -0
  49. package/console/dist/ui/utils/validators.js +433 -0
  50. package/console/dist/web/assets/app.css +138 -0
  51. package/console/dist/web/assets/app.js +3124 -1288
  52. package/console/package.json +3 -0
  53. package/core/dist/index.d.ts +2 -2
  54. package/core/dist/index.d.ts.map +1 -1
  55. package/core/dist/index.js +1 -1
  56. package/core/dist/index.js.map +1 -1
  57. package/core/dist/principle-tree-ledger.d.ts +55 -4
  58. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  59. package/core/dist/principle-tree-ledger.js +472 -13
  60. package/core/dist/principle-tree-ledger.js.map +1 -1
  61. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts +2 -0
  62. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
  63. package/core/dist/prompt-builder/__tests__/model-config.test.js +158 -0
  64. package/core/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
  65. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
  66. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
  67. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts +2 -0
  68. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
  69. package/core/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
  70. package/core/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
  71. package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
  72. package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
  73. package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
  74. package/core/dist/prompt-builder/index.d.ts +3 -0
  75. package/core/dist/prompt-builder/index.d.ts.map +1 -1
  76. package/core/dist/prompt-builder/index.js +2 -0
  77. package/core/dist/prompt-builder/index.js.map +1 -1
  78. package/core/dist/prompt-builder/model-config.d.ts +42 -0
  79. package/core/dist/prompt-builder/model-config.d.ts.map +1 -0
  80. package/core/dist/prompt-builder/model-config.js +84 -0
  81. package/core/dist/prompt-builder/model-config.js.map +1 -0
  82. package/core/dist/prompt-builder/size-guard.d.ts +1 -0
  83. package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
  84. package/core/dist/prompt-builder/size-guard.js +21 -0
  85. package/core/dist/prompt-builder/size-guard.js.map +1 -1
  86. package/core/dist/prompt-builder/types.d.ts +2 -0
  87. package/core/dist/prompt-builder/types.d.ts.map +1 -1
  88. package/core/dist/prompt-builder/xml-escape.d.ts +12 -0
  89. package/core/dist/prompt-builder/xml-escape.d.ts.map +1 -0
  90. package/core/dist/prompt-builder/xml-escape.js +19 -0
  91. package/core/dist/prompt-builder/xml-escape.js.map +1 -0
  92. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +205 -48
  93. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  94. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
  95. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
  96. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
  97. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
  98. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts +2 -0
  99. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts.map +1 -0
  100. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +500 -0
  101. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -0
  102. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
  103. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  104. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
  105. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
  106. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
  107. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  108. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
  109. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
  110. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
  111. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
  112. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
  113. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
  114. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
  115. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
  116. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
  117. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
  118. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
  119. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
  120. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
  121. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
  122. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
  123. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  124. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
  125. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
  126. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
  127. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
  128. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
  129. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  130. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
  131. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
  132. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  133. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
  134. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  135. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  136. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
  137. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  138. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +65 -1
  139. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  140. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  141. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +33 -11
  142. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  143. package/core/dist/runtime-v2/bridge-result-shaper.d.ts +53 -0
  144. package/core/dist/runtime-v2/bridge-result-shaper.d.ts.map +1 -0
  145. package/core/dist/runtime-v2/bridge-result-shaper.js +117 -0
  146. package/core/dist/runtime-v2/bridge-result-shaper.js.map +1 -0
  147. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
  148. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
  149. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
  150. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
  151. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
  152. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
  153. package/core/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
  154. package/core/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
  155. package/core/dist/runtime-v2/detection/index.d.ts +10 -0
  156. package/core/dist/runtime-v2/detection/index.d.ts.map +1 -0
  157. package/core/dist/runtime-v2/detection/index.js +9 -0
  158. package/core/dist/runtime-v2/detection/index.js.map +1 -0
  159. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
  160. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  161. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
  162. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
  163. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
  164. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
  165. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
  166. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
  167. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
  168. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
  169. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
  170. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
  171. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
  172. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
  173. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
  174. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
  175. package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
  176. package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  177. package/core/dist/runtime-v2/diagnostician-output.js +16 -0
  178. package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
  179. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
  180. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  181. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  182. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts +12 -0
  183. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
  184. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +181 -0
  185. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
  186. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
  187. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
  188. package/core/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
  189. package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
  190. package/core/dist/runtime-v2/evidence-triage/index.js +3 -0
  191. package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
  192. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +128 -0
  193. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
  194. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +203 -0
  195. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
  196. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
  197. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
  198. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts +4 -0
  199. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
  200. package/core/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
  201. package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
  202. package/core/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
  203. package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
  204. package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -1
  205. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +56 -4
  206. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  207. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
  208. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
  209. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
  210. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
  211. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  212. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +11 -2
  213. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  214. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
  215. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
  216. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  217. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts +15 -0
  218. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts.map +1 -0
  219. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js +450 -0
  220. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js.map +1 -0
  221. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts +13 -0
  222. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts.map +1 -0
  223. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js +243 -0
  224. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js.map +1 -0
  225. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts +12 -0
  226. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts.map +1 -0
  227. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js +172 -0
  228. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js.map +1 -0
  229. package/core/dist/runtime-v2/index.d.ts +15 -6
  230. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  231. package/core/dist/runtime-v2/index.js +15 -4
  232. package/core/dist/runtime-v2/index.js.map +1 -1
  233. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
  234. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
  236. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
  237. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
  238. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
  239. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +91 -0
  240. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
  241. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
  242. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
  243. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
  244. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
  245. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
  246. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
  247. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
  248. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
  249. package/core/dist/runtime-v2/intent/index.d.ts +6 -0
  250. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
  251. package/core/dist/runtime-v2/intent/index.js +6 -0
  252. package/core/dist/runtime-v2/intent/index.js.map +1 -0
  253. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
  254. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
  255. package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
  256. package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
  257. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
  258. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
  259. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
  260. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
  261. package/core/dist/runtime-v2/intent/intent-doc.d.ts +19 -0
  262. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
  263. package/core/dist/runtime-v2/intent/intent-doc.js +70 -0
  264. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
  265. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
  266. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
  267. package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
  268. package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
  269. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
  270. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
  271. package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
  272. package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
  273. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
  274. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
  275. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
  276. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
  277. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts +2 -0
  278. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts.map +1 -0
  279. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +306 -0
  280. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -0
  281. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
  282. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
  283. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
  284. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
  285. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
  286. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
  287. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
  288. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
  289. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
  290. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
  291. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
  292. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
  293. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
  294. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  295. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
  296. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  297. package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  298. package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
  299. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  300. package/core/dist/runtime-v2/internalization/index.d.ts +0 -16
  301. package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  302. package/core/dist/runtime-v2/internalization/index.js +0 -8
  303. package/core/dist/runtime-v2/internalization/index.js.map +1 -1
  304. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
  305. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
  306. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
  307. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
  308. package/core/dist/runtime-v2/pain-gate/index.d.ts +10 -0
  309. package/core/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
  310. package/core/dist/runtime-v2/pain-gate/index.js +9 -0
  311. package/core/dist/runtime-v2/pain-gate/index.js.map +1 -0
  312. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +121 -0
  313. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
  314. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +157 -0
  315. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
  316. package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  317. package/core/dist/runtime-v2/pain-signal-bridge.js +14 -88
  318. package/core/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  319. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  320. package/core/dist/runtime-v2/pain-signal-observability.js +272 -61
  321. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  322. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
  323. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  324. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
  325. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  326. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
  327. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  328. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  329. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  330. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
  331. package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
  332. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  333. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
  334. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
  335. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
  336. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
  337. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
  338. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
  339. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
  340. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
  341. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
  342. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
  343. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
  344. package/core/dist/runtime-v2/store/intent/index.d.ts +6 -0
  345. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
  346. package/core/dist/runtime-v2/store/intent/index.js +5 -0
  347. package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
  348. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
  349. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
  350. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
  351. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
  352. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
  353. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
  354. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
  355. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
  356. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
  357. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
  358. package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
  359. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  360. package/core/dist/runtime-v2/store/sqlite-connection.js +124 -12
  361. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  362. package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
  363. package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
  364. package/core/dist/runtime-v2/types/event-payload.js +0 -12
  365. package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
  366. package/core/dist/runtime-v2/types/event-types.d.ts +5 -61
  367. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  368. package/core/dist/runtime-v2/types/event-types.js +2 -36
  369. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  370. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
  371. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
  372. package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
  373. package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
  374. package/core/dist/runtime-v2/types/index.d.ts +5 -5
  375. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  376. package/core/dist/runtime-v2/types/index.js +7 -3
  377. package/core/dist/runtime-v2/types/index.js.map +1 -1
  378. package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
  379. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
  380. package/core/dist/runtime-v2/types/ledger-store.js +10 -5
  381. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
  382. package/core/dist/runtime-v2/types/pain-signal.d.ts +2 -2
  383. package/core/dist/runtime-v2/types/pain-signal.js +2 -2
  384. package/core/dist/workflow-funnel-loader.d.ts +2 -2
  385. package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
  386. package/dist/installer.d.ts.map +1 -1
  387. package/dist/installer.js +16 -0
  388. package/dist/installer.js.map +1 -1
  389. package/dist/mvp-config.d.ts +0 -10
  390. package/dist/mvp-config.d.ts.map +1 -1
  391. package/dist/mvp-config.js +0 -65
  392. package/dist/mvp-config.js.map +1 -1
  393. package/package.json +1 -1
  394. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
  395. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
  396. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +166 -0
  397. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
  398. package/pd-cli/dist/commands/intent.d.ts +59 -0
  399. package/pd-cli/dist/commands/intent.d.ts.map +1 -0
  400. package/pd-cli/dist/commands/intent.js +350 -0
  401. package/pd-cli/dist/commands/intent.js.map +1 -0
  402. package/pd-cli/dist/commands/mvp-smoke.js +1 -1
  403. package/pd-cli/dist/commands/mvp-smoke.js.map +1 -1
  404. package/pd-cli/dist/commands/rulecode.js +1 -1
  405. package/pd-cli/dist/commands/rulecode.js.map +1 -1
  406. package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
  407. package/pd-cli/dist/commands/runtime-canary.js +10 -11
  408. package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
  409. package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
  410. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
  411. package/pd-cli/dist/commands/runtime-init.js +264 -0
  412. package/pd-cli/dist/commands/runtime-init.js.map +1 -0
  413. package/pd-cli/dist/commands/runtime-internalization-queue.d.ts.map +1 -1
  414. package/pd-cli/dist/commands/runtime-internalization-queue.js +13 -16
  415. package/pd-cli/dist/commands/runtime-internalization-queue.js.map +1 -1
  416. package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  417. package/pd-cli/dist/commands/runtime-internalization-run-once.js +3 -0
  418. package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
  419. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
  420. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +61 -7
  421. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
  422. package/pd-cli/dist/commands/runtime.js +1 -1
  423. package/pd-cli/dist/commands/runtime.js.map +1 -1
  424. package/pd-cli/dist/index.js +92 -34
  425. package/pd-cli/dist/index.js.map +1 -1
  426. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts +2 -0
  427. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts.map +1 -0
  428. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js +314 -0
  429. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js.map +1 -0
  430. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +20 -12
  431. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  432. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  433. package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
  434. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  435. package/pd-cli/dist/services/rulehost-readiness.d.ts +62 -0
  436. package/pd-cli/dist/services/rulehost-readiness.d.ts.map +1 -0
  437. package/pd-cli/dist/services/rulehost-readiness.js +214 -0
  438. package/pd-cli/dist/services/rulehost-readiness.js.map +1 -0
  439. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts +1 -1
  440. package/pd-cli/dist/services/runtime-adapter-resolver.js +3 -3
  441. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  442. package/pd-cli/package.json +1 -0
  443. package/plugin/dist/commands/evolution-status.js +0 -2
  444. package/plugin/dist/commands/pain.js +2 -0
  445. package/plugin/dist/core/control-ui-db.d.ts +11 -0
  446. package/plugin/dist/core/control-ui-db.js +40 -16
  447. package/plugin/dist/core/detection-funnel.d.ts +25 -11
  448. package/plugin/dist/core/detection-funnel.js +32 -80
  449. package/plugin/dist/core/event-log.d.ts +1 -3
  450. package/plugin/dist/core/event-log.js +5 -21
  451. package/plugin/dist/core/evolution-reducer.d.ts +0 -8
  452. package/plugin/dist/core/evolution-reducer.js +9 -19
  453. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +28 -0
  454. package/plugin/dist/core/intent-doc-reader-adapter.js +56 -0
  455. package/plugin/dist/core/intent-doc-reader.d.ts +80 -0
  456. package/plugin/dist/core/intent-doc-reader.js +189 -0
  457. package/plugin/dist/core/pain-diagnostic-gate.d.ts +37 -28
  458. package/plugin/dist/core/pain-diagnostic-gate.js +53 -89
  459. package/plugin/dist/core/pain.d.ts +0 -63
  460. package/plugin/dist/core/pain.js +0 -167
  461. package/plugin/dist/core/paths.d.ts +0 -1
  462. package/plugin/dist/core/paths.js +2 -1
  463. package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
  464. package/plugin/dist/core/principle-tree-ledger.js +39 -524
  465. package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
  466. package/plugin/dist/core/schema/migrations/001-init-trajectory.js +3 -6
  467. package/plugin/dist/core/schema/schema-definitions.js +4 -9
  468. package/plugin/dist/core/trajectory.d.ts +16 -16
  469. package/plugin/dist/core/trajectory.js +338 -311
  470. package/plugin/dist/core/workspace-context.d.ts +2 -3
  471. package/plugin/dist/hooks/after-tool-call-helpers.d.ts +4 -1
  472. package/plugin/dist/hooks/after-tool-call-helpers.js +13 -17
  473. package/plugin/dist/hooks/gate-block-helper.js +57 -17
  474. package/plugin/dist/hooks/lifecycle.js +3 -6
  475. package/plugin/dist/hooks/llm.js +66 -26
  476. package/plugin/dist/hooks/pain.d.ts +3 -1
  477. package/plugin/dist/hooks/pain.js +124 -49
  478. package/plugin/dist/hooks/prompt-helpers.d.ts +105 -0
  479. package/plugin/dist/hooks/prompt-helpers.js +288 -0
  480. package/plugin/dist/hooks/prompt-types.d.ts +74 -0
  481. package/plugin/dist/hooks/prompt-types.js +12 -0
  482. package/plugin/dist/hooks/prompt.d.ts +7 -38
  483. package/plugin/dist/hooks/prompt.js +433 -338
  484. package/plugin/dist/hooks/raw-observation-adapter.d.ts +9 -50
  485. package/plugin/dist/hooks/raw-observation-adapter.js +9 -164
  486. package/plugin/dist/hooks/raw-observation-types.d.ts +6 -57
  487. package/plugin/dist/hooks/raw-observation-types.js +5 -9
  488. package/plugin/dist/hooks/triage-adapter.js +6 -26
  489. package/plugin/dist/hooks/trigger-cooldown-tracker.d.ts +12 -0
  490. package/plugin/dist/hooks/trigger-cooldown-tracker.js +25 -0
  491. package/plugin/dist/index.d.ts +3 -1
  492. package/plugin/dist/index.js +9 -5
  493. package/plugin/dist/service/evolution-worker.js +6 -64
  494. package/plugin/dist/service/runtime-summary-service.d.ts +0 -2
  495. package/plugin/dist/service/runtime-summary-service.js +1 -5
  496. package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
  497. package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
  498. package/plugin/dist/types/event-types.d.ts +1 -1
  499. package/plugin/package.json +6 -3
  500. package/plugin/scripts/acceptance-test.mjs +3 -3
  501. package/plugin/scripts/sync-plugin.mjs +33 -22
  502. package/plugin/templates/langs/en/skills/pd-cli-operator/SKILL.md +20 -11
  503. package/plugin/templates/langs/en/skills/pd-runtime-v2/SKILL.md +10 -0
  504. package/plugin/templates/langs/zh/skills/pd-cli-operator/SKILL.md +20 -11
  505. package/plugin/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +10 -0
  506. package/console/dist/server/config/feature-flags.d.ts +0 -25
  507. package/console/dist/server/config/feature-flags.js +0 -101
  508. package/pd-cli/dist/commands/central-sync.d.ts +0 -10
  509. package/pd-cli/dist/commands/central-sync.d.ts.map +0 -1
  510. package/pd-cli/dist/commands/central-sync.js +0 -32
  511. package/pd-cli/dist/commands/central-sync.js.map +0 -1
  512. package/pd-cli/dist/services/feature-flag-loader.d.ts +0 -6
  513. package/pd-cli/dist/services/feature-flag-loader.d.ts.map +0 -1
  514. package/pd-cli/dist/services/feature-flag-loader.js +0 -53
  515. package/pd-cli/dist/services/feature-flag-loader.js.map +0 -1
  516. package/plugin/dist/core/observability.d.ts +0 -40
  517. package/plugin/dist/core/observability.js +0 -164
  518. package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
  519. package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
  520. package/plugin/dist/hooks/subagent.d.ts +0 -9
  521. package/plugin/dist/hooks/subagent.js +0 -122
  522. package/plugin/dist/service/central-database.d.ts +0 -138
  523. package/plugin/dist/service/central-database.js +0 -731
  524. package/plugin/dist/service/central-sync-service.d.ts +0 -8
  525. package/plugin/dist/service/central-sync-service.js +0 -71
  526. package/plugin/scripts/validate-live-path.ts +0 -480
@@ -0,0 +1,207 @@
1
+ /**
2
+ * IntentDecisionModel — Console model for IntentDecisionRecord (PRI-470).
3
+ *
4
+ * Holds the workspaceDir (like ApprovalsConsoleModel) and opens a per-request
5
+ * SqliteConnection inside each method: open → delegate to SqliteIntentDecisionStore
6
+ * → close. This keeps each operation isolated and safe across workspaces.
7
+ *
8
+ * Graceful degradation (SPEC §21.7 / ERR-002):
9
+ * - Missing state.db → reads return null/empty/zero summary; writes return a
10
+ * structured `not_initialized` result so the route can map to a clear HTTP
11
+ * error instead of silently creating a half-initialized workspace.
12
+ * - Missing intent_decisions table → reads degrade to empty; writes re-throw
13
+ * (the table is created by SqliteConnection.initSchema, so its absence
14
+ * signals a corrupted or pre-PD workspace that should not be written to).
15
+ *
16
+ * ERR checklist:
17
+ * - EP-01 / ERR-001, ERR-005: store rows validated via core type guards
18
+ * - EP-03 / ERR-002: every degraded path carries reason + nextAction
19
+ * - EP-09: model is a thin I/O adapter over the pure store contract
20
+ */
21
+ import * as fs from 'node:fs';
22
+ import * as path from 'node:path';
23
+ import { SqliteConnection, SqliteIntentDecisionStore, } from '@principles/core/runtime-v2';
24
+ function stateDbExists(workspaceDir) {
25
+ return fs.existsSync(path.join(workspaceDir, '.pd', 'state.db'));
26
+ }
27
+ function isMissingTableError(err) {
28
+ if (!(err instanceof Error))
29
+ return false;
30
+ return err.message.includes('no such table');
31
+ }
32
+ function emptySummary() {
33
+ return {
34
+ counts: {
35
+ confirm_drift: 0,
36
+ revise_intent: 0,
37
+ observe: 0,
38
+ dismiss: 0,
39
+ promote_to_principle: 0,
40
+ promote_to_rulehost: 0,
41
+ },
42
+ lastDecisionAt: null,
43
+ };
44
+ }
45
+ export class IntentDecisionModel {
46
+ workspaceDir;
47
+ constructor(workspaceDir) {
48
+ this.workspaceDir = workspaceDir;
49
+ }
50
+ async record(input) {
51
+ if (!stateDbExists(this.workspaceDir)) {
52
+ return {
53
+ ok: false,
54
+ reason: 'state_db_not_found',
55
+ nextAction: 'Initialize the workspace with PD (run a diagnosis or pd config) before recording intent decisions.',
56
+ };
57
+ }
58
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir });
59
+ try {
60
+ const store = new SqliteIntentDecisionStore(connection);
61
+ const result = await store.record(input);
62
+ return { ok: true, record: result.record, created: result.created };
63
+ }
64
+ catch (err) {
65
+ if (isMissingTableError(err)) {
66
+ return {
67
+ ok: false,
68
+ reason: 'intent_decisions_table_missing',
69
+ nextAction: 'Run pd config doctor or re-initialize the workspace so the intent_decisions table is created.',
70
+ };
71
+ }
72
+ throw err;
73
+ }
74
+ finally {
75
+ try {
76
+ connection.close();
77
+ }
78
+ catch { /* best-effort */ }
79
+ }
80
+ }
81
+ async getById(id) {
82
+ if (!stateDbExists(this.workspaceDir))
83
+ return null;
84
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
85
+ try {
86
+ const store = new SqliteIntentDecisionStore(connection);
87
+ return await store.getById(id);
88
+ }
89
+ catch (err) {
90
+ if (isMissingTableError(err))
91
+ return null;
92
+ throw err;
93
+ }
94
+ finally {
95
+ try {
96
+ connection.close();
97
+ }
98
+ catch { /* best-effort */ }
99
+ }
100
+ }
101
+ async listByPainId(painId) {
102
+ if (!stateDbExists(this.workspaceDir))
103
+ return [];
104
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
105
+ try {
106
+ const store = new SqliteIntentDecisionStore(connection);
107
+ return await store.listByPainId(painId);
108
+ }
109
+ catch (err) {
110
+ if (isMissingTableError(err))
111
+ return [];
112
+ throw err;
113
+ }
114
+ finally {
115
+ try {
116
+ connection.close();
117
+ }
118
+ catch { /* best-effort */ }
119
+ }
120
+ }
121
+ async listByTaskId(taskId) {
122
+ if (!stateDbExists(this.workspaceDir))
123
+ return [];
124
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
125
+ try {
126
+ const store = new SqliteIntentDecisionStore(connection);
127
+ return await store.listByTaskId(taskId);
128
+ }
129
+ catch (err) {
130
+ if (isMissingTableError(err))
131
+ return [];
132
+ throw err;
133
+ }
134
+ finally {
135
+ try {
136
+ connection.close();
137
+ }
138
+ catch { /* best-effort */ }
139
+ }
140
+ }
141
+ async getSummary() {
142
+ if (!stateDbExists(this.workspaceDir))
143
+ return emptySummary();
144
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
145
+ try {
146
+ const store = new SqliteIntentDecisionStore(connection);
147
+ return await store.getSummary();
148
+ }
149
+ catch (err) {
150
+ if (isMissingTableError(err))
151
+ return emptySummary();
152
+ throw err;
153
+ }
154
+ finally {
155
+ try {
156
+ connection.close();
157
+ }
158
+ catch { /* best-effort */ }
159
+ }
160
+ }
161
+ /**
162
+ * Update follow-up action fields on an existing IntentDecisionRecord
163
+ * (PRI-471, SPEC §22.1.4).
164
+ *
165
+ * Called by the follow-up route after the Owner decision has been
166
+ * persisted. Only fields present in `patch` are written; the rest stay
167
+ * unchanged. Returns the updated record or a structured failure.
168
+ */
169
+ async updateFollowUp(id, patch) {
170
+ if (!stateDbExists(this.workspaceDir)) {
171
+ return {
172
+ ok: false,
173
+ reason: 'state_db_not_found',
174
+ nextAction: 'Initialize the workspace with PD (run a diagnosis or pd config) before dispatching follow-up actions.',
175
+ };
176
+ }
177
+ const connection = new SqliteConnection({ workspaceDir: this.workspaceDir });
178
+ try {
179
+ const store = new SqliteIntentDecisionStore(connection);
180
+ const record = await store.updateFollowUp(id, patch);
181
+ if (record === null) {
182
+ return {
183
+ ok: false,
184
+ reason: 'decision_not_found',
185
+ nextAction: 'Intent decision ' + id + ' does not exist. Refresh the page and try again.',
186
+ };
187
+ }
188
+ return { ok: true, record };
189
+ }
190
+ catch (err) {
191
+ if (isMissingTableError(err)) {
192
+ return {
193
+ ok: false,
194
+ reason: 'intent_decisions_table_missing',
195
+ nextAction: 'Run pd config doctor or re-initialize the workspace so the intent_decisions table is created.',
196
+ };
197
+ }
198
+ throw err;
199
+ }
200
+ finally {
201
+ try {
202
+ connection.close();
203
+ }
204
+ catch { /* best-effort */ }
205
+ }
206
+ }
207
+ }
@@ -0,0 +1,18 @@
1
+ import { type IntentDocWarning } from '@principles/core/runtime-v2';
2
+ export interface IntentPageResult {
3
+ ok: boolean;
4
+ found: boolean;
5
+ flagEnabled: boolean;
6
+ warnings: IntentDocWarning[];
7
+ path?: string;
8
+ contentHash?: string;
9
+ lastEditedAt?: string;
10
+ sections?: Record<string, string>;
11
+ reason?: string;
12
+ nextAction?: string;
13
+ }
14
+ export declare class IntentPageModel {
15
+ private readonly workspaceDir;
16
+ constructor(workspaceDir: string);
17
+ getSummary(flagEnabled: boolean): Promise<IntentPageResult>;
18
+ }
@@ -0,0 +1,90 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { INTENT_MAX_BYTES, parseIntentDocSections, computeIntentContentHash, validateIntentDocSections, } from '@principles/core/runtime-v2';
4
+ const INTENT_FILENAME = 'INTENT.md';
5
+ const INTENT_DIR = '.principles';
6
+ export class IntentPageModel {
7
+ workspaceDir;
8
+ constructor(workspaceDir) {
9
+ this.workspaceDir = workspaceDir;
10
+ }
11
+ async getSummary(flagEnabled) {
12
+ if (!flagEnabled) {
13
+ return {
14
+ ok: false,
15
+ found: false,
16
+ flagEnabled: false,
17
+ warnings: [],
18
+ reason: 'flag_disabled',
19
+ nextAction: 'Enable the intent_engineering feature flag in .pd/config.yaml to read INTENT.md.',
20
+ };
21
+ }
22
+ const filePath = path.join(this.workspaceDir, INTENT_DIR, INTENT_FILENAME);
23
+ try {
24
+ if (!fs.existsSync(filePath)) {
25
+ return {
26
+ ok: false,
27
+ found: false,
28
+ flagEnabled: true,
29
+ warnings: [],
30
+ reason: 'not_found',
31
+ nextAction: 'Create .principles/INTENT.md using "pd intent init".',
32
+ };
33
+ }
34
+ const stat = fs.statSync(filePath);
35
+ if (stat.size > INTENT_MAX_BYTES) {
36
+ return {
37
+ ok: false,
38
+ found: true,
39
+ flagEnabled: true,
40
+ warnings: [],
41
+ reason: 'oversized',
42
+ nextAction: `INTENT.md exceeds ${INTENT_MAX_BYTES} bytes (${stat.size} bytes). Reduce content.`,
43
+ };
44
+ }
45
+ const raw = fs.readFileSync(filePath, 'utf8');
46
+ const sections = parseIntentDocSections(raw);
47
+ const warnings = validateIntentDocSections(sections);
48
+ const contentHash = computeIntentContentHash(raw);
49
+ const sectionRecord = {};
50
+ if (sections.why !== undefined) {
51
+ sectionRecord.why = sections.why;
52
+ }
53
+ if (sections.desiredOutcome !== undefined) {
54
+ sectionRecord.desiredOutcome = sections.desiredOutcome;
55
+ }
56
+ if (sections.nonNegotiables !== undefined) {
57
+ sectionRecord.nonNegotiables = sections.nonNegotiables;
58
+ }
59
+ if (sections.stopEscalation !== undefined) {
60
+ sectionRecord.stopEscalation = sections.stopEscalation;
61
+ }
62
+ if (sections.currentStrategicFocus !== undefined) {
63
+ sectionRecord.currentStrategicFocus = sections.currentStrategicFocus;
64
+ }
65
+ return {
66
+ ok: true,
67
+ found: true,
68
+ flagEnabled: true,
69
+ warnings,
70
+ path: filePath,
71
+ contentHash,
72
+ lastEditedAt: stat.mtime.toISOString(),
73
+ sections: sectionRecord,
74
+ };
75
+ }
76
+ catch (err) {
77
+ // Runtime Contract Rule #9: log underlying error for observability
78
+ // while preserving the never-throws contract.
79
+ console.error('[IntentPageModel] failed to read INTENT.md:', err);
80
+ return {
81
+ ok: false,
82
+ found: false,
83
+ flagEnabled: true,
84
+ warnings: [],
85
+ reason: 'read_error',
86
+ nextAction: 'Check filesystem permissions for .principles/INTENT.md.',
87
+ };
88
+ }
89
+ }
90
+ }
@@ -77,4 +77,6 @@ export declare class PrinciplesConsoleModel {
77
77
  private loadLedger;
78
78
  listPrinciples(filter?: PrincipleFilter, decidedPrincipleIds?: Set<string>): Promise<PrinciplesListOutput>;
79
79
  getPrincipleDetail(principleId: string): Promise<PrincipleDetailOutput | null>;
80
+ archivePrinciple(principleId: string): Promise<boolean>;
81
+ unarchivePrinciple(principleId: string): Promise<boolean>;
80
82
  }
@@ -1,6 +1,7 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
3
  import { classifyPrinciples, filterOwnerActionable } from './PrincipleClassifier.js';
4
+ import { updatePrinciple } from '@principles/core/principle-tree-ledger';
4
5
  const VALID_STATUSES = ['candidate', 'active', 'archived', 'deprecated', 'probation'];
5
6
  const VALID_PRIORITIES = ['P0', 'P1', 'P2'];
6
7
  const VALID_SCOPES = ['general', 'domain'];
@@ -92,7 +93,8 @@ function readLedgerFromFile(filePath) {
92
93
  tree: parseTree(treeRaw),
93
94
  };
94
95
  }
95
- catch {
96
+ catch (e) {
97
+ console.warn('PrinciplesConsoleModel: failed to parse principle_training_state.json, returning empty tree:', e);
96
98
  return { trainingStore: {}, tree: createEmptyTree() };
97
99
  }
98
100
  }
@@ -244,4 +246,38 @@ export class PrinciplesConsoleModel {
244
246
  };
245
247
  return { principle };
246
248
  }
249
+ async archivePrinciple(principleId) {
250
+ try {
251
+ const stateDir = path.join(this.workspaceDir, '.state');
252
+ updatePrinciple(stateDir, principleId, {
253
+ status: 'archived',
254
+ updatedAt: new Date().toISOString(),
255
+ });
256
+ // Clear cache to force reload
257
+ this.cachedLedger = null;
258
+ this.cacheTimestamp = 0;
259
+ return true;
260
+ }
261
+ catch (e) {
262
+ console.error(`Failed to archive principle ${principleId}:`, e);
263
+ return false;
264
+ }
265
+ }
266
+ async unarchivePrinciple(principleId) {
267
+ try {
268
+ const stateDir = path.join(this.workspaceDir, '.state');
269
+ updatePrinciple(stateDir, principleId, {
270
+ status: 'active',
271
+ updatedAt: new Date().toISOString(),
272
+ });
273
+ // Clear cache to force reload
274
+ this.cachedLedger = null;
275
+ this.cacheTimestamp = 0;
276
+ return true;
277
+ }
278
+ catch (e) {
279
+ console.error(`Failed to unarchive principle ${principleId}:`, e);
280
+ return false;
281
+ }
282
+ }
247
283
  }
@@ -1,35 +1,7 @@
1
1
  import type { WorkspaceConfigStore } from '../config/WorkspaceConfigStore.js';
2
2
  import type { SyncResult } from '../types/index.js';
3
- export interface CentralOverviewOutput {
4
- generatedAt: string;
5
- workspaceCount: number;
6
- workspaces: {
7
- name: string;
8
- path: string;
9
- status: 'healthy' | 'degraded' | 'error';
10
- gfi: number;
11
- principleCount: number;
12
- }[];
13
- }
14
- export interface CentralHealthOutput {
15
- generatedAt: string;
16
- overallStatus: 'healthy' | 'degraded' | 'error';
17
- workspaces: {
18
- name: string;
19
- status: 'healthy' | 'degraded' | 'error';
20
- gfi: number;
21
- activePrinciples: number;
22
- pendingTasks: number;
23
- }[];
24
- }
25
3
  export declare class WorkspaceService {
26
4
  private readonly configStore;
27
- private readonly models;
28
5
  constructor(configStore: WorkspaceConfigStore);
29
- getCentralOverview(): Promise<CentralOverviewOutput>;
30
- getCentralHealth(): Promise<CentralHealthOutput>;
31
6
  syncWorkspace(name: string): Promise<SyncResult>;
32
- dispose(): void;
33
- private disposeWorkspace;
34
- private getModels;
35
7
  }
@@ -1,97 +1,13 @@
1
- import { OperatorHealthReadModel, PainChainReadModel, PruningReadModel, RuntimeStateManager, } from '@principles/core/runtime-v2';
2
- const noop = () => { };
3
1
  export class WorkspaceService {
4
2
  configStore;
5
- models = new Map();
6
3
  constructor(configStore) {
7
4
  this.configStore = configStore;
8
5
  }
9
- async getCentralOverview() {
10
- const workspaces = this.configStore.getWorkspaces().filter(w => w.config?.enabled !== false);
11
- const results = [];
12
- for (const ws of workspaces) {
13
- try {
14
- const models = this.getModels(ws);
15
- const [snapshot, pruningSummary] = await Promise.all([
16
- models.operatorHealth.getSnapshot(),
17
- Promise.resolve(models.pruning.getHealthSummary()),
18
- ]);
19
- const { byStatus } = pruningSummary;
20
- results.push({
21
- name: ws.name,
22
- path: ws.path,
23
- status: snapshot.overallStatus === 'healthy' ? 'healthy' : snapshot.overallStatus === 'degraded' ? 'degraded' : 'error',
24
- gfi: snapshot.gfi.active?.currentGfi ?? 0,
25
- principleCount: (byStatus.active ?? 0) + (byStatus.candidate ?? 0),
26
- });
27
- }
28
- catch {
29
- results.push({
30
- name: ws.name,
31
- path: ws.path,
32
- status: 'error',
33
- gfi: -1,
34
- principleCount: 0,
35
- });
36
- }
37
- }
38
- return {
39
- generatedAt: new Date().toISOString(),
40
- workspaceCount: workspaces.length,
41
- workspaces: results,
42
- };
43
- }
44
- async getCentralHealth() {
45
- const workspaces = this.configStore.getWorkspaces().filter(w => w.config?.enabled !== false);
46
- const results = [];
47
- let overallStatus = 'healthy';
48
- for (const ws of workspaces) {
49
- try {
50
- const models = this.getModels(ws);
51
- const [snapshot, pruningSummary, pendingTasks] = await Promise.all([
52
- models.operatorHealth.getSnapshot(),
53
- Promise.resolve(models.pruning.getHealthSummary()),
54
- models.runtime.listTasks({ status: 'pending', limit: 100 }),
55
- ]);
56
- const { byStatus } = pruningSummary;
57
- const wsStatus = snapshot.overallStatus === 'healthy' ? 'healthy' : snapshot.overallStatus === 'degraded' ? 'degraded' : 'error';
58
- if (wsStatus === 'error') {
59
- overallStatus = 'error';
60
- }
61
- else if (wsStatus !== 'healthy' && overallStatus === 'healthy') {
62
- overallStatus = 'degraded';
63
- }
64
- results.push({
65
- name: ws.name,
66
- status: wsStatus,
67
- gfi: snapshot.gfi.active?.currentGfi ?? 0,
68
- activePrinciples: (byStatus.active ?? 0) + (byStatus.candidate ?? 0),
69
- pendingTasks: pendingTasks.length,
70
- });
71
- }
72
- catch {
73
- overallStatus = 'error';
74
- results.push({
75
- name: ws.name,
76
- status: 'error',
77
- gfi: -1,
78
- activePrinciples: 0,
79
- pendingTasks: 0,
80
- });
81
- }
82
- }
83
- return {
84
- generatedAt: new Date().toISOString(),
85
- overallStatus,
86
- workspaces: results,
87
- };
88
- }
89
6
  async syncWorkspace(name) {
90
7
  const entry = this.configStore.getWorkspace(name);
91
8
  if (!entry) {
92
9
  throw new Error(`Workspace "${name}" not found`);
93
10
  }
94
- this.disposeWorkspace(name);
95
11
  this.configStore.updateSyncTime(name);
96
12
  return {
97
13
  success: true,
@@ -99,35 +15,4 @@ export class WorkspaceService {
99
15
  items: {},
100
16
  };
101
17
  }
102
- dispose() {
103
- for (const name of this.models.keys()) {
104
- this.disposeWorkspace(name);
105
- }
106
- this.models.clear();
107
- }
108
- disposeWorkspace(name) {
109
- const existing = this.models.get(name);
110
- if (existing) {
111
- existing.operatorHealth.close().catch(noop);
112
- existing.painChain.close().catch(noop);
113
- existing.runtime.close().catch(noop);
114
- this.models.delete(name);
115
- }
116
- }
117
- getModels(entry) {
118
- let existing = this.models.get(entry.name);
119
- if (!existing) {
120
- const runtime = new RuntimeStateManager({ workspaceDir: entry.path });
121
- const painChain = new PainChainReadModel({ workspaceDir: entry.path, stateManager: runtime });
122
- const pruning = new PruningReadModel({ workspaceDir: entry.path });
123
- const operatorHealth = new OperatorHealthReadModel({
124
- workspaceDir: entry.path,
125
- painChainReadModel: painChain,
126
- pruningReadModel: pruning,
127
- });
128
- existing = { operatorHealth, painChain, pruning, runtime };
129
- this.models.set(entry.name, existing);
130
- }
131
- return existing;
132
- }
133
18
  }
@@ -21,7 +21,7 @@
21
21
  * - ERR-045: ANY-segment redaction for sensitive keys
22
22
  */
23
23
  import { sendSuccess, sendError, sendNotFound, sendMethodNotAllowed, sendBadRequest } from '../utils/response.js';
24
- import { getConfigSummary, getConfigCatalog, updateAgentBinding, updateDefaultRuntime, checkReadiness, getPrinciplesOutputLanguage, updatePrinciplesOutputLanguage, } from '../config/pd-config-store.js';
24
+ import { getConfigSummary, getConfigCatalog, updateAgentBinding, updateDefaultRuntime, checkReadiness, getPrinciplesOutputLanguage, updatePrinciplesOutputLanguage, updateFeatureFlag, } from '../config/pd-config-store.js';
25
25
  // ── Constants ────────────────────────────────────────────────────────────────
26
26
  const MAX_BODY_SIZE = 1024 * 64; // 64 KB — generous for config binding updates
27
27
  // ── Request Body Reader ──────────────────────────────────────────────────────
@@ -49,6 +49,10 @@ function safeParseBody(text) {
49
49
  return null;
50
50
  }
51
51
  }
52
+ /** Type guard: is `value` a plain Record<string, unknown>? (ERR-001) */
53
+ function isObject(value) {
54
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
55
+ }
52
56
  // ── Route Handler ────────────────────────────────────────────────────────────
53
57
  export async function handleConfigRoute(req, res, ctx) {
54
58
  const { workspaceDir, subPath } = ctx;
@@ -170,6 +174,56 @@ export async function handleConfigRoute(req, res, ctx) {
170
174
  });
171
175
  return;
172
176
  }
177
+ // PATCH /features/:featureName — spec 2026-06-27 §13.4
178
+ // Toggles a registered feature flag's `enabled` field in .pd/config.yaml.
179
+ const featureFlagMatch = /^\/features\/([^/]+)$/.exec(subPath);
180
+ if (featureFlagMatch) {
181
+ if (method !== 'PATCH') {
182
+ sendMethodNotAllowed(res);
183
+ return;
184
+ }
185
+ let featureName;
186
+ try {
187
+ featureName = decodeURIComponent(featureFlagMatch[1] ?? '');
188
+ }
189
+ catch {
190
+ sendBadRequest(res, 'Invalid feature name encoding');
191
+ return;
192
+ }
193
+ let bodyText;
194
+ try {
195
+ bodyText = await readBody(req);
196
+ }
197
+ catch {
198
+ sendBadRequest(res, 'Request body exceeds maximum allowed size');
199
+ return;
200
+ }
201
+ const body = safeParseBody(bodyText);
202
+ if (body === null) {
203
+ sendBadRequest(res, 'Invalid JSON body');
204
+ return;
205
+ }
206
+ // Validate body shape: { enabled: boolean } (ERR-001: no `as` bypass)
207
+ if (!isObject(body)) {
208
+ sendBadRequest(res, 'Body must be a JSON object with an enabled field');
209
+ return;
210
+ }
211
+ if (!Object.hasOwn(body, 'enabled')) {
212
+ sendBadRequest(res, 'Missing required field: enabled');
213
+ return;
214
+ }
215
+ if (typeof body.enabled !== 'boolean') {
216
+ sendBadRequest(res, 'enabled must be a boolean');
217
+ return;
218
+ }
219
+ const result = updateFeatureFlag(workspaceDir, featureName, body.enabled);
220
+ if (!result.ok) {
221
+ sendError(res, result.statusCode, result.error, result.message);
222
+ return;
223
+ }
224
+ sendSuccess(res, { feature: result.feature, enabled: result.enabled });
225
+ return;
226
+ }
173
227
  // GET/PATCH /principles/output-language — PRI-332 P1-1
174
228
  if (subPath === '/principles/output-language') {
175
229
  if (method === 'GET') {
@@ -81,7 +81,7 @@ export async function handleFeedbackReportsRoute(req, res, ctx) {
81
81
  && Object.hasOwn(ctx.featureFlags, 'feedback_channel')) {
82
82
  const feedbackChannel = ctx.featureFlags.feedback_channel;
83
83
  if (feedbackChannel && !feedbackChannel.enabled) {
84
- sendError(res, 403, 'feedback_channel_disabled', 'feedback_channel feature flag is disabled. Enable feedback_channel in .pd/feature-flags.yaml to use feedback reports.');
84
+ sendError(res, 403, 'feedback_channel_disabled', 'feedback_channel feature flag is disabled. Enable feedback_channel in .pd/config.yaml to use feedback reports.');
85
85
  return;
86
86
  }
87
87
  }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * IntentDecisions route — HTTP surface for IntentDecisionRecord (PRI-470, SPEC §21.7).
3
+ *
4
+ * Endpoints (all gated by the `intent_engineering` feature flag):
5
+ * - POST /api/v1/intent-decisions → create (201) or idempotent replay (200)
6
+ * - GET /api/v1/intent-decisions?painId=… → list by painId
7
+ * - GET /api/v1/intent-decisions?taskId=… → list by taskId
8
+ * - GET /api/v1/intent-decisions/summary → tallied summary (MUST precede /:id)
9
+ * - GET /api/v1/intent-decisions/:id → single record
10
+ * - POST /api/v1/intent-decisions/:id/follow-up → dispatch governed follow-up (PRI-471)
11
+ *
12
+ * PRI-471 follow-up types (SPEC §22.1.4):
13
+ * - link_candidate — record which existing principle candidate the Owner
14
+ * chose to link. Does NOT create a candidate.
15
+ * - guide_rulehost — returns the CLI guidance for promoting to RuleHost.
16
+ * Does NOT create a rule or approval directly.
17
+ * - generate_patch_proposal — generates a read-only Intent Patch Proposal and
18
+ * records its id on the decision. Does NOT modify
19
+ * `.principles/INTENT.md`.
20
+ *
21
+ * Runtime Contract rules applied:
22
+ * - Rule 1: parsed JSON body treated as `unknown` (ERR-001)
23
+ * - Rule 2: enum fields validated via core type guards, never `as` (ERR-001/ERR-005)
24
+ * - Rule 3: required fields fail loud → 400 with reason (ERR-009/ERR-010)
25
+ * - Rule 5: `Object.hasOwn()` for untrusted object keys (ERR-013)
26
+ * - Rule 9: every degraded path carries reason + nextAction (ERR-002)
27
+ */
28
+ import type { IncomingMessage, ServerResponse } from 'node:http';
29
+ export declare function handleIntentDecisionsRoute(req: IncomingMessage, res: ServerResponse, workspaceDir: string, subPath: string): Promise<void>;
30
+ /**
31
+ * Dispose hook for graceful shutdown — clears the per-workspace model cache.
32
+ */
33
+ export declare function disposeIntentDecisionModels(): void;