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
@@ -226,7 +226,65 @@
226
226
  "noHumanSummary": "PD 尚未为此条证据生成行为摘要",
227
227
  "inReviewQueueCount": "已有 {{count}} 条进入审查队列",
228
228
  "goToGovernance": "去治理首页处理",
229
- "expandTechDetails": "展开技术细节"
229
+ "expandTechDetails": "展开技术细节",
230
+ "intentTensionTitle": "意图张力",
231
+ "intentTensionSourceLabel": "来源",
232
+ "intentTensionSourceNone": "无意图张力",
233
+ "intentTensionSourceActionDrift": "行动偏离",
234
+ "intentTensionSourceIntentSuspect": "意图存疑",
235
+ "intentTensionSourceHealthyTension": "良性张力",
236
+ "intentTensionEvidenceStrengthLabel": "证据强度",
237
+ "intentTensionEvidenceStrengthWeak": "弱",
238
+ "intentTensionEvidenceStrengthModerate": "中",
239
+ "intentTensionEvidenceStrengthStrong": "强",
240
+ "intentTensionRelatedIntentFieldsLabel": "关联 INTENT 字段",
241
+ "intentTensionEvidenceLabel": "证据",
242
+ "intentTensionExplanationLabel": "说明",
243
+ "intentTensionSuggestedActionLabel": "建议拥有者操作",
244
+ "intentTensionSuggestedActionConfirmDrift": "确认偏离",
245
+ "intentTensionSuggestedActionReviseIntent": "修订意图",
246
+ "intentTensionSuggestedActionObserve": "继续观察",
247
+ "intentTensionSuggestedActionDismiss": "忽略",
248
+ "intentTensionSuggestedActionPromoteToPrinciple": "提升为原则",
249
+ "intentTensionSuggestedActionPromoteToRulehost": "提升为 RuleHost",
250
+ "intentTensionIntentDocHashLabel": "INTENT 文档哈希",
251
+ "intentTensionNoTension": "未检测到意图张力",
252
+ "intentTensionArtifactDegraded": "此记录的诊断器产物无法完整解析,意图张力可能不可用。",
253
+ "ownerDecisionPanelTitle": "拥有者决策",
254
+ "ownerDecisionPanelSubtitle": "记录您对此意图张力的决策。后续操作仅在决策持久化后才会显示。",
255
+ "ownerDecisionNoteLabel": "备注(可选)",
256
+ "ownerDecisionNotePlaceholder": "为此决策添加上下文",
257
+ "ownerDecisionSubmitConfirmDrift": "确认漂移",
258
+ "ownerDecisionSubmitReviseIntent": "修订意图",
259
+ "ownerDecisionSubmitObserve": "观察",
260
+ "ownerDecisionSubmitDismiss": "驳回",
261
+ "ownerDecisionSubmitPromoteToPrinciple": "沉淀为原则",
262
+ "ownerDecisionSubmitPromoteToRulehost": "转为 RuleHost",
263
+ "ownerDecisionSubmitting": "正在记录决策…",
264
+ "ownerDecisionRecorded": "决策已记录",
265
+ "ownerDecisionFailed": "记录决策失败",
266
+ "ownerDecisionExisting": "此张力已存在决策",
267
+ "ownerDecisionFollowUpPlaceholder": "决策记录后,后续操作将显示在此处。",
268
+ "ownerDecisionLoadingExisting": "正在加载已有决策…",
269
+ "ownerDecisionLoadFailed": "加载已有决策失败",
270
+ "followUpActionsTitle": "后续动作",
271
+ "followUpDispatching": "正在派发…",
272
+ "followUpDispatchFailed": "派发后续动作失败",
273
+ "followUpLinkCandidateDescription": "将已有的原则候选链接到此决策。PD 不会创建新的候选——从证据链中选择或粘贴候选 ID。",
274
+ "followUpLinkCandidateButton": "链接候选",
275
+ "followUpCandidateIdPlaceholder": "粘贴候选 ID",
276
+ "followUpCandidateIdAriaLabel": "要链接的原则候选 ID",
277
+ "followUpPrefilledFromEvidenceChain": "已从证据链的链接候选预填。",
278
+ "followUpLinkedSuccess": "已链接候选",
279
+ "followUpGuideRulehostDescription": "获取将此决策转为 RuleHost 候选的 CLI 命令。PD 将创建一个审批,可在治理队列中审核。",
280
+ "followUpGuideRulehostButton": "查看 RuleHost 指引",
281
+ "followUpCliCommandLabel": "CLI 命令",
282
+ "followUpPatchProposalDescription": "生成只读的意图补丁建议。该建议汇总张力并提示 INTENT.md 可能需要修订的位置。PD 不会自动应用补丁。",
283
+ "followUpViewPatchProposalButton": "查看意图补丁建议",
284
+ "followUpPatchProposalLabel": "意图补丁建议",
285
+ "followUpPatchProposalReadOnlyBadge": "仅展示",
286
+ "followUpPatchProposalWarning": "仅展示——不可自动应用。拥有者若接受此建议,需手动编辑 .principles/INTENT.md。",
287
+ "followUpPromoteToPrincipleDescription": "链接已有的原则候选以沉淀此决策。PD 不会创建新的候选——从证据链中选择或粘贴候选 ID。"
230
288
  },
231
289
  "principles": {
232
290
  "title": "原则",
@@ -589,7 +647,12 @@
589
647
  "agentEnabled": "已启用",
590
648
  "agentDisabled": "已停用",
591
649
  "profileLabel": "配置",
592
- "readinessLabel": "就绪状态"
650
+ "readinessLabel": "就绪状态",
651
+ "empathyCostHint": {
652
+ "body": "共情观察器已启用 — 每次关键词未命中时会调用 LLM 做深度分析(当前模型:{{provider}}/{{model}})。",
653
+ "muted": "如需节省成本,在 workflows.yaml 的 pd-empathy-observer.policy.model 换更便宜模型。",
654
+ "ack": "知道了"
655
+ }
593
656
  },
594
657
  "login": {
595
658
  "title": "登录",
@@ -640,6 +703,106 @@
640
703
  "filesUpdated": "更新了 {{count}} 个文件",
641
704
  "networkErrorHint": "请检查网络连接后重试。",
642
705
  "retry": "重试"
706
+ },
707
+ "intent": {
708
+ "eyebrow": "拥有者意图",
709
+ "title": "拥有者意图文档",
710
+ "subtitle": "单页锚点,记录拥有者的目标、不可违背的边界、以及何时应当停止并升级。仅当 intent_engineering 标志开启时,PD 才会读取此文档。",
711
+ "flagStatus": {
712
+ "enabled": "标志已开启",
713
+ "disabled": "标志已关闭",
714
+ "ariaLabel": "intent_engineering 功能标志状态",
715
+ "enable": "启用意图工程",
716
+ "enabling": "启用中…",
717
+ "enableFailed": "启用失败,请稍后重试或手动修改 .pd/config.yaml"
718
+ },
719
+ "editEntry": {
720
+ "heading": "编辑 INTENT.md",
721
+ "title": "拥有者自有文档",
722
+ "description": "PD 不会修改此文件。请在自己的编辑器中编辑,以声明或修订你的意图。",
723
+ "copy": "复制路径",
724
+ "copyAriaLabel": "复制 INTENT.md 文件路径到剪贴板"
725
+ },
726
+ "flagDisabled": {
727
+ "title": "意图工程已关闭",
728
+ "description": "intent_engineering 功能标志未开启。PD 当前不会读取 INTENT.md,不会将意图上下文注入提示词,也不会在诊断中呈现意图张力。这是 MVP-Quiet 的默认状态。"
729
+ },
730
+ "notFound": {
731
+ "title": "未找到 INTENT.md",
732
+ "description": "PD 在 .principles/ 目录中未找到 INTENT.md 文件。缺少此锚点时,基于意图的诊断无法运行。",
733
+ "nextAction": "运行:pd intent init --confirm --workspace <path>"
734
+ },
735
+ "oversized": {
736
+ "title": "INTENT.md 超过 32KB",
737
+ "description": "文件超过 32KB 上限。PD 拒绝读取超大文件,以保证意图解析的确定性与有界性。",
738
+ "nextAction": "请将 INTENT.md 精简至 32KB 以下,将长篇策略移至独立文档。"
739
+ },
740
+ "sections": {
741
+ "why": "为什么",
742
+ "desiredOutcome": "期望结果",
743
+ "nonNegotiables": "不可妥协项",
744
+ "stopEscalation": "停止 / 升级",
745
+ "currentStrategicFocus": "当前战略焦点"
746
+ },
747
+ "warnings": {
748
+ "title": "健康告警",
749
+ "empty": "无告警。INTENT.md 格式良好。",
750
+ "missing_section": "缺失章节",
751
+ "empty_section": "章节为空",
752
+ "too_vague": "章节过于简略(少于 10 个字符)",
753
+ "oversized": "文档超过 32KB 上限",
754
+ "parse_failed": "章节解析失败"
755
+ },
756
+ "meta": {
757
+ "title": "文档元信息",
758
+ "lastEditedAt": "上次编辑",
759
+ "contentHash": "内容哈希",
760
+ "path": "路径",
761
+ "templateTitle": "INTENT.md 模板",
762
+ "templateDescription": "将其复制到 .principles/INTENT.md,替换占位符为你的意图。"
763
+ },
764
+ "loadError": "加载意图文档失败",
765
+ "validationError": "数据格式校验失败,请刷新后重试",
766
+ "decisions": {
767
+ "sectionTitle": "拥有者决策",
768
+ "sectionSubtitle": "基于 IntentDecisionRecord 的轻量审计摘要,非仪表盘。",
769
+ "countConfirmDrift": "确认漂移",
770
+ "countReviseIntent": "修订意图",
771
+ "countObserve": "观察",
772
+ "countDismiss": "驳回",
773
+ "countPromoteToPrinciple": "沉淀为原则",
774
+ "countPromoteToRulehost": "转为 RuleHost",
775
+ "lastDecisionAtLabel": "最近决策",
776
+ "noDecisions": "暂无决策记录",
777
+ "loadError": "加载决策摘要失败"
778
+ }
779
+ },
780
+ "debt": {
781
+ "eyebrow": "原则债务",
782
+ "title": "原则债务管理",
783
+ "subtitle": "审查那些未激活、长期停滞或可能成为技术/行为负债的原则。",
784
+ "emptyTitle": "暂无原则债务",
785
+ "emptyDescription": "太棒了!你的所有活跃原则均运行正常,没有发现长期未激活或被晾在审批队列里的情况。",
786
+ "reasonNeverActivated": "该原则已被批准,但从未真正部署到任何运行通道(如提示词、RuleHost)。",
787
+ "reasonStagnant": "该原则的审批请求已在队列中滞留超过 7 天,可能已被遗忘。",
788
+ "suggestedAction": "建议操作",
789
+ "actionArchive": "归档",
790
+ "actionDeactivate": "停用通道",
791
+ "actionKeep": "保留观察",
792
+ "confirmArchive": "归档该原则会将其移出当前活跃原则库,确认归档吗?",
793
+ "confirmDeactivate": "停用该通道将使该原则不再在运行时对智能体进行拦截,确认停用吗?",
794
+ "deactivateSuccess": "通道停用成功。",
795
+ "deactivateFailed": "停用通道失败。",
796
+ "archiveSuccess": "原则归档成功。",
797
+ "archiveFailed": "原则归档失败。",
798
+ "undoAction": "撤销",
799
+ "undoSuccess": "操作已撤销。",
800
+ "undoFailed": "撤销操作失败。",
801
+ "loadError": "无法加载原则债务数据,请尝试刷新页面。",
802
+ "daysSinceAgo": "{{count}} 天前",
803
+ "demoteTooltip": "降权端点开发中",
804
+ "principleAriaLabel": "原则债务 {{id}}",
805
+ "listAriaLabel": "原则债务列表"
643
806
  }
644
807
  },
645
808
  "components": {
@@ -699,7 +862,8 @@
699
862
  "settings": "设置",
700
863
  "update": "更新",
701
864
  "pendingApprovalsAria": "{{count}} 条待审批原则",
702
- "degradedSignalsAria": "{{count}} 个系统降级信号"
865
+ "degradedSignalsAria": "{{count}} 个系统降级信号",
866
+ "intent": "拥有者意图"
703
867
  },
704
868
  "approvalCard": {
705
869
  "confidence": {
@@ -6,6 +6,7 @@ import { toast } from "sonner";
6
6
  import { PageShell } from "../../components/layout/page-shell.js";
7
7
  import { PageLoading } from "../../components/layout/page-loading.js";
8
8
  import { SectionTitle } from "../../components/layout/section-title.js";
9
+ import { ShinyText } from "../../components/ui/shiny-text.js";
9
10
  import { fetchAllActivations, disableActivation, fetchLifecycleMetrics, } from "../../api.js";
10
11
  import { validateActivationsData, validateLifecycleMetricsData, isReversibleChannel, } from "./ActivationValidators.js";
11
12
  import { enumLabel } from "../../utils/enum-labels.js";
@@ -137,7 +138,7 @@ export function ActivationPage() {
137
138
  const activeActivations = activations.filter((a) => a.status === "active");
138
139
  const inactiveActivations = activations.filter((a) => a.status === "inactive");
139
140
  const neverActivatedCount = activations.filter((a) => a.activatedAt === null).length;
140
- return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.activation.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.activation.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.activation.subtitle") }), _jsxs("div", { className: "text-sm leading-relaxed text-ink-2 mb-7 px-[18px] py-[14px] bg-panel border border-line rounded-[6px]", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "font-mono font-semibold text-ink tabular-nums", children: activeActivations.length }), " ", _jsx("span", { className: "text-ink-3", children: t("pages.activation.summaryActive") }), " ", "/", " ", _jsx("span", { className: "font-mono font-semibold text-ink tabular-nums", children: inactiveActivations.length }), " ", _jsx("span", { className: "text-ink-3", children: t("pages.activation.summaryInactive") }), neverActivatedCount > 0 && (_jsxs(_Fragment, { children: [" ", "/", " ", _jsx("span", { className: "font-mono font-semibold text-amber tabular-nums", children: neverActivatedCount }), " ", _jsx("span", { className: "text-amber", children: t("pages.activation.summaryNeverActivated") })] }))] }), _jsx(CapabilityBoundaryDeclaration, {}), degradedNote && (_jsx("div", { className: "mt-4 text-ink-4 text-[13px] bg-surface/60 border-l-2 border-amber px-3 py-2", children: degradedNote })), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-active", children: [_jsx(SectionTitle, { id: "section-active", children: t("pages.activation.sectionActive") }), activeActivations.length > 0 ? (_jsx("div", { className: "space-y-[14px]", children: activeActivations.map((record) => (_jsx(ActivationFactCard, { record: record, lifecycleData: lifecycleCache[record.principleId], onDisable: handleDisable, disabling: disablingIds.has(record.id) }, record.id))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: t("pages.activation.emptyActive") }))] }), inactiveActivations.length > 0 && (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-inactive", children: [_jsx(SectionTitle, { id: "section-inactive", children: t("pages.activation.sectionInactive") }), _jsx("div", { className: "space-y-[14px]", children: inactiveActivations.map((record) => (_jsx(ActivationFactCard, { record: record, lifecycleData: lifecycleCache[record.principleId], onDisable: handleDisable, disabling: disablingIds.has(record.id) }, record.id))) })] })), neverActivatedCount > 0 && (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-never-activated", children: [_jsx(SectionTitle, { id: "section-never-activated", children: t("pages.activation.sectionNeverActivated") }), _jsx("div", { className: "space-y-[10px]", children: activations
141
+ return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.activation.eyebrow") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: activeActivations.length === 0, children: t("pages.activation.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.activation.subtitle") }), _jsxs("div", { className: "text-sm leading-relaxed text-ink-2 mb-7 px-[18px] py-[14px] bg-panel border border-line rounded-[6px]", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "font-mono font-semibold text-ink tabular-nums", children: activeActivations.length }), " ", _jsx("span", { className: "text-ink-3", children: t("pages.activation.summaryActive") }), " ", "/", " ", _jsx("span", { className: "font-mono font-semibold text-ink tabular-nums", children: inactiveActivations.length }), " ", _jsx("span", { className: "text-ink-3", children: t("pages.activation.summaryInactive") }), neverActivatedCount > 0 && (_jsxs(_Fragment, { children: [" ", "/", " ", _jsx("span", { className: "font-mono font-semibold text-amber tabular-nums", children: neverActivatedCount }), " ", _jsx("span", { className: "text-amber", children: t("pages.activation.summaryNeverActivated") })] }))] }), _jsx(CapabilityBoundaryDeclaration, {}), degradedNote && (_jsx("div", { className: "mt-4 text-ink-4 text-[13px] bg-surface/60 border-l-2 border-amber px-3 py-2", children: degradedNote })), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-active", children: [_jsx(SectionTitle, { id: "section-active", children: t("pages.activation.sectionActive") }), activeActivations.length > 0 ? (_jsx("div", { className: "space-y-[14px]", children: activeActivations.map((record) => (_jsx(ActivationFactCard, { record: record, lifecycleData: lifecycleCache[record.principleId], onDisable: handleDisable, disabling: disablingIds.has(record.id) }, record.id))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: t("pages.activation.emptyActive") }))] }), inactiveActivations.length > 0 && (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-inactive", children: [_jsx(SectionTitle, { id: "section-inactive", children: t("pages.activation.sectionInactive") }), _jsx("div", { className: "space-y-[14px]", children: inactiveActivations.map((record) => (_jsx(ActivationFactCard, { record: record, lifecycleData: lifecycleCache[record.principleId], onDisable: handleDisable, disabling: disablingIds.has(record.id) }, record.id))) })] })), neverActivatedCount > 0 && (_jsxs("section", { className: "mt-8", "aria-labelledby": "section-never-activated", children: [_jsx(SectionTitle, { id: "section-never-activated", children: t("pages.activation.sectionNeverActivated") }), _jsx("div", { className: "space-y-[10px]", children: activations
141
142
  .filter((a) => a.activatedAt === null)
142
143
  .map((record) => (_jsxs("article", { className: "relative pl-[22px] py-[14px] pr-[18px] bg-panel border border-amber/20 border-l-[3px] border-l-amber rounded-[6px]", children: [_jsxs("div", { className: "text-ink-2 text-sm leading-relaxed", children: [_jsx("span", { className: "font-medium text-ink", children: t("pages.activation.neverActivatedCard") }), " ", "\u2014 ", record.action, " \u00B7 ", getChannelLabel(record.channel, t), _jsx("span", { className: "ml-2 font-mono text-[11px] text-ink-4", children: record.principleId })] }), _jsxs(Link, { to: "/debt", className: "inline-flex items-center mt-2 text-gov text-[13px] hover:underline focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: [t("pages.activation.viewDebt"), " \u2192"] })] }, record.id))) })] })), _jsx("footer", { className: "mt-12 pt-6 border-t border-line text-ink-3 text-[13px]", children: t("pages.activation.footer") })] }) }));
143
144
  }
@@ -8,6 +8,7 @@ import { SectionTitle } from "../../components/layout/section-title.js";
8
8
  import { fetchConfigSummary, fetchConfigCatalog, updateAgentBinding, updateDefaultRuntime, } from "../../api.js";
9
9
  import { computeOverallReadiness, groupAgentsByReadiness, redactDiagnosticsForCopy, } from "../../utils/control-center-helpers.js";
10
10
  import { enumLabel } from "../../utils/enum-labels.js";
11
+ import { EmpathyObserverCostHint } from "./EmpathyObserverCostHint.js";
11
12
  // ── Runtime validators (H section / ERR-001/005/009/013) ─────────────────────
12
13
  function validateSource(raw) {
13
14
  if (typeof raw !== "string")
@@ -76,7 +77,18 @@ function validateRedactedRuntimeProfileSummary(raw) {
76
77
  const apiKeyEnv = Object.hasOwn(raw, "apiKeyEnv") && typeof raw.apiKeyEnv === "string"
77
78
  ? raw.apiKeyEnv
78
79
  : undefined;
79
- return { id, type, label, apiKeyEnv, readiness };
80
+ // provider/model are optional (set by backend redactPdConfig for both
81
+ // pi-ai and openclaw profiles). Extract so EmpathyObserverCostHint can
82
+ // show the active model without parsing the label string. Aligns with
83
+ // the canonical validator in validators.ts (EP-01: validate fields that
84
+ // actually exist in the target type).
85
+ const provider = Object.hasOwn(raw, "provider") && typeof raw.provider === "string"
86
+ ? raw.provider
87
+ : undefined;
88
+ const model = Object.hasOwn(raw, "model") && typeof raw.model === "string"
89
+ ? raw.model
90
+ : undefined;
91
+ return { id, type, label, apiKeyEnv, provider, model, readiness };
80
92
  }
81
93
  function validateRedactedAgentSummary(raw) {
82
94
  if (!isRecord(raw))
@@ -445,5 +457,19 @@ export function ControlCenterPage() {
445
457
  };
446
458
  const overallReadiness = computeOverallReadiness(diagnostics);
447
459
  const availableProfiles = catalogData?.profiles ?? configData.runtimeProfiles;
448
- return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.controlCenter.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.controlCenter.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.controlCenter.subtitle") }), _jsx("section", { "aria-labelledby": "section-readiness", children: _jsx(OverallStatusCard, { readiness: overallReadiness, agents: configData.agents }) }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-agents", children: [_jsx(SectionTitle, { id: "section-agents", children: t("pages.controlCenter.internalAgents") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.controlCenter.internalAgentsDescription") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] px-[18px] py-[6px]", children: configData.agents.length === 0 ? (_jsx("div", { className: "py-3 text-ink-3 text-[13px]", children: "\u2014" })) : (configData.agents.map((agent) => (_jsx(AgentRow, { agent: agent, profiles: availableProfiles, onBindingChange: handleBindingChange, saving: savingAgent }, agent.name)))) })] }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-default-runtime", children: [_jsx(SectionTitle, { id: "section-default-runtime", children: t("pages.controlCenter.defaultRuntime") }), _jsx(DefaultRuntimeSelector, { currentDefault: configData.defaultRuntime, profiles: availableProfiles, onDefaultChange: handleDefaultRuntimeChange, saving: savingDefault })] }), _jsx("section", { className: "mt-8", "aria-labelledby": "section-diagnostics", children: _jsx(AdvancedDiagnostics, { config: configData }) })] }) }));
460
+ return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.controlCenter.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.controlCenter.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.controlCenter.subtitle") }), _jsx("section", { "aria-labelledby": "section-readiness", children: _jsx(OverallStatusCard, { readiness: overallReadiness, agents: configData.agents }) }), (() => {
461
+ const empathyAgent = configData.agents.find((a) => a.name === "empathyObserver" && a.enabled);
462
+ if (!empathyAgent)
463
+ return null;
464
+ let acked = false;
465
+ try {
466
+ acked = localStorage.getItem("pd.empathyObserver.costAck") === "true";
467
+ }
468
+ catch {
469
+ // localStorage unavailable (privacy mode) → not acked → render
470
+ }
471
+ if (acked)
472
+ return null;
473
+ return (_jsx(EmpathyObserverCostHint, { agent: empathyAgent, profiles: availableProfiles }));
474
+ })(), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-agents", children: [_jsx(SectionTitle, { id: "section-agents", children: t("pages.controlCenter.internalAgents") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.controlCenter.internalAgentsDescription") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] px-[18px] py-[6px]", children: configData.agents.length === 0 ? (_jsx("div", { className: "py-3 text-ink-3 text-[13px]", children: "\u2014" })) : (configData.agents.map((agent) => (_jsx(AgentRow, { agent: agent, profiles: availableProfiles, onBindingChange: handleBindingChange, saving: savingAgent }, agent.name)))) })] }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-default-runtime", children: [_jsx(SectionTitle, { id: "section-default-runtime", children: t("pages.controlCenter.defaultRuntime") }), _jsx(DefaultRuntimeSelector, { currentDefault: configData.defaultRuntime, profiles: availableProfiles, onDefaultChange: handleDefaultRuntimeChange, saving: savingDefault })] }), _jsx("section", { className: "mt-8", "aria-labelledby": "section-diagnostics", children: _jsx(AdvancedDiagnostics, { config: configData }) })] }) }));
449
475
  }
@@ -0,0 +1,28 @@
1
+ import type { RedactedAgentSummary, RedactedRuntimeProfileSummary } from "../../api.js";
2
+ /**
3
+ * EmpathyObserverCostHint — spec 2026-06-27 §4
4
+ *
5
+ * A克制、可关闭的提示条,告知 Owner:启用 empathyObserver 后会有持续的
6
+ * LLM 调用与 token 成本,以及当前使用的 provider/model。
7
+ *
8
+ * 双层 gate(spec §4.1):
9
+ * - Gate 1(父组件 ControlCenterPage):仅当 empathyObserver 已启用且
10
+ * localStorage 未 ack 时才挂载本组件。
11
+ * - Gate 2(本组件):维护 visible 内部状态,承载"知道了"dismiss 行为。
12
+ *
13
+ * 该组件不修改后端任何代码、不修改 prompt.ts、不修改 resolveEmpathyObserver。
14
+ * 纯前端 localStorage 控制,清掉就重新出现,fail-open(隐私模式仍可见)。
15
+ *
16
+ * ERR entries (spec §8):
17
+ * - ERR-001/ERR-005: 消费 ControlCenterPage 已经过 type guard 的数据,无 untrusted 原始数据
18
+ * - ERR-009/ERR-010: provider/model 取不到时用 '—' 显式降级
19
+ * - ERR-013: localStorage 读取与写入用 try/catch 包裹
20
+ */
21
+ interface EmpathyObserverCostHintProps {
22
+ /** empathyObserver agent row (already validated by parent) */
23
+ agent: RedactedAgentSummary;
24
+ /** runtime profiles — used to resolve provider/model */
25
+ profiles: RedactedRuntimeProfileSummary[];
26
+ }
27
+ export declare function EmpathyObserverCostHint({ agent, profiles, }: EmpathyObserverCostHintProps): import("react/jsx-runtime").JSX.Element | null;
28
+ export {};
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useTranslation } from "react-i18next";
4
+ import { enumLabel } from "../../utils/enum-labels.js";
5
+ const COST_ACK_KEY = "pd.empathyObserver.costAck";
6
+ export function EmpathyObserverCostHint({ agent, profiles, }) {
7
+ const { t } = useTranslation();
8
+ // Gate 2: dismiss 后不再渲染。localStorage ack 时初始即隐藏。
9
+ const [visible, setVisible] = useState(() => {
10
+ try {
11
+ return localStorage.getItem(COST_ACK_KEY) !== "true";
12
+ }
13
+ catch {
14
+ // 隐私模式 / localStorage 不可用 → fail-open:默认可见
15
+ return true;
16
+ }
17
+ });
18
+ if (!visible)
19
+ return null;
20
+ // Resolve provider/model from the agent's runtime profile.
21
+ // agent.runtimeProfileId is always present (validated by parent).
22
+ const profile = profiles.find((p) => p.id === agent.runtimeProfileId);
23
+ const provider = profile?.provider ?? "—";
24
+ const model = profile?.model ?? "—";
25
+ const handleAck = () => {
26
+ try {
27
+ localStorage.setItem(COST_ACK_KEY, "true");
28
+ }
29
+ catch {
30
+ // 隐私模式等:写入失败不影响 dismiss 体验,下次仍会出现(fail-open)
31
+ }
32
+ setVisible(false);
33
+ };
34
+ return (_jsxs("div", { className: "bg-surface/60 border border-amber/20 border-l-2 border-l-amber rounded-[6px] px-3 py-2 mt-4", children: [_jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("pages.controlCenter.empathyCostHint.body", {
35
+ provider,
36
+ model,
37
+ }) }), _jsx("p", { className: "text-ink-3 text-[12px] mt-1 leading-relaxed", children: t("pages.controlCenter.empathyCostHint.muted") }), _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: handleAck, className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "aria-label": t("pages.controlCenter.empathyCostHint.ack"), children: t("pages.controlCenter.empathyCostHint.ack") }) }), _jsx("span", { className: "sr-only", children: enumLabel("featureId", "empathy_observer", t) })] }));
38
+ }
@@ -1,5 +1,222 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback } from "react";
3
+ import { useTranslation } from "react-i18next";
4
+ import { toast } from "sonner";
2
5
  import { PageShell } from "../../components/layout/page-shell.js";
6
+ import { PageLoading } from "../../components/layout/page-loading.js";
7
+ import { SectionTitle } from "../../components/layout/section-title.js";
8
+ import { ShinyText } from "../../components/ui/shiny-text.js";
9
+ import { Button } from "../../components/ui/button.js";
10
+ import { AlertTriangle, Archive, Trash2 } from "lucide-react";
11
+ import { fetchPrinciples, fetchAllActivations, fetchGovernanceQueue, archivePrinciple, unarchivePrinciple, disableActivation, } from "../../api.js";
12
+ import { validatePrinciplesList, validateActivations, validateGovernanceQueue, } from "../../utils/validators.js";
13
+ // ── Debt Card Component (Handles its own J.1 confirmation state) ──────────────
14
+ function DebtCard({ item, onArchive, onDeactivate, isProcessing, }) {
15
+ const { t } = useTranslation();
16
+ const [confirmAction, setConfirmAction] = useState(null);
17
+ const [selectedActivationId, setSelectedActivationId] = useState(null);
18
+ const handleArchiveClick = () => {
19
+ setConfirmAction("archive");
20
+ };
21
+ const handleDeactivateClick = (activationId) => {
22
+ setSelectedActivationId(activationId);
23
+ setConfirmAction("deactivate");
24
+ };
25
+ const handleCancel = () => {
26
+ setConfirmAction(null);
27
+ setSelectedActivationId(null);
28
+ };
29
+ const handleConfirm = async () => {
30
+ if (confirmAction === "archive") {
31
+ await onArchive(item.id);
32
+ }
33
+ else if (confirmAction === "deactivate" && selectedActivationId) {
34
+ await onDeactivate(selectedActivationId, item.id);
35
+ }
36
+ setConfirmAction(null);
37
+ setSelectedActivationId(null);
38
+ };
39
+ // Render natural language reason based on debt type
40
+ const renderReason = () => {
41
+ if (item.type === "never_activated") {
42
+ return (_jsx("span", { className: "text-ink-2", children: t("pages.debt.reasonNeverActivated") }));
43
+ }
44
+ if (item.type === "stagnant") {
45
+ return (_jsxs("span", { className: "text-ink-2", children: [t("pages.debt.reasonStagnant"), item.daysSince !== undefined && (_jsxs("span", { className: "text-amber font-semibold ml-1", children: ["(", t("pages.debt.daysSinceAgo", { count: item.daysSince }), ")"] }))] }));
46
+ }
47
+ return null;
48
+ };
49
+ const isStagnant = item.type === "stagnant";
50
+ return (_jsx("article", { className: "p-5 bg-panel border border-line rounded-[6px] hover:border-line-2 transition-colors relative", "aria-label": t("pages.debt.principleAriaLabel", { id: item.id }), children: _jsxs("div", { className: "flex flex-col md:flex-row md:items-start gap-4", children: [_jsxs("div", { className: "flex-1 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[11px] uppercase px-2 py-0.5 bg-line rounded text-ink-3", children: item.id }), _jsx("span", { className: `font-mono text-[11px] uppercase px-2 py-0.5 rounded ${isStagnant
51
+ ? "bg-amber/10 text-amber"
52
+ : "bg-danger/10 text-danger"}`, children: isStagnant ? t("pages.focus.summaryStagnation") : t("pages.sidebar.debt") })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-ink text-[15px] font-medium leading-relaxed", children: item.text }), item.triggerPattern && (_jsxs("p", { className: "text-ink-3 text-[13px] font-mono leading-relaxed", children: [t("principles.detail.triggerLabel", { defaultValue: "Trigger:" }), " ", item.triggerPattern] }))] }), _jsxs("div", { className: "flex items-start gap-2 pt-1", children: [_jsx(AlertTriangle, { className: "w-4 h-4 text-amber shrink-0 mt-0.5", "aria-hidden": "true" }), _jsxs("div", { className: "text-[13px] leading-relaxed", children: [_jsxs("span", { className: "font-semibold text-ink-3", children: [t("pages.debt.suggestedAction"), ": "] }), renderReason()] })] })] }), _jsx("div", { className: "flex flex-col gap-2 shrink-0 md:w-48", children: !confirmAction ? (_jsxs(_Fragment, { children: [_jsxs("button", { onClick: handleArchiveClick, disabled: isProcessing, className: "w-full inline-flex items-center justify-center gap-1.5 border border-line bg-surface text-ink hover:border-line-2 transition-colors rounded-[3px] px-[14px] py-[6px] text-[12.5px] focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "data-testid": `archive-btn-${item.id}`, children: [_jsx(Archive, { className: "w-4 h-4 text-ink-3", "aria-hidden": "true" }), t("pages.debt.actionArchive")] }), item.activeActivationRecords && item.activeActivationRecords.length > 0 ? (item.activeActivationRecords.map((ar) => (_jsxs("button", { onClick: () => handleDeactivateClick(ar.id), disabled: isProcessing, className: "w-full inline-flex items-center justify-center gap-1.5 border border-danger/20 bg-surface text-danger hover:bg-danger/5 transition-colors rounded-[3px] px-[14px] py-[6px] text-[12.5px] focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "data-testid": `deactivate-btn-${ar.id}`, children: [_jsx(Trash2, { className: "w-4 h-4 text-danger/80", "aria-hidden": "true" }), t("pages.debt.actionDeactivate"), " (", ar.channel, ")"] }, ar.id)))) : (_jsx("button", { disabled: true, className: "w-full inline-flex items-center justify-center gap-1.5 border border-line bg-surface/50 text-ink-4 cursor-not-allowed rounded-[3px] px-[14px] py-[6px] text-[12.5px]", title: t("pages.debt.demoteTooltip"), children: t("pages.debt.actionKeep") }))] })) : (_jsxs("div", { className: "flex flex-col gap-2 p-3 bg-surface border border-amber/20 rounded-[4px] w-full", role: "alert", "data-testid": `confirm-bar-${item.id}`, children: [_jsx("p", { className: "text-ink-2 text-[12px] leading-relaxed", children: confirmAction === "archive"
53
+ ? t("pages.debt.confirmArchive")
54
+ : t("pages.debt.confirmDeactivate") }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: handleConfirm, disabled: isProcessing, className: "flex-1 text-[12px] py-1", "data-testid": `confirm-btn-${item.id}`, children: t("common.confirm") }), _jsx(Button, { variant: "outline", size: "sm", onClick: handleCancel, className: "flex-1 text-[12px] py-1", children: t("common.cancel") })] })] })) })] }) }));
55
+ }
56
+ // ── Main Page Component ──────────────────────────────────────────────────────
3
57
  export function DebtPage() {
4
- return (_jsxs(PageShell, { children: [_jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: "\u539F\u5219\u503A\u52A1" }), _jsx("p", { className: "text-ink-3 text-sm", children: "\u9875\u9762\u5EFA\u8BBE\u4E2D \u2014 CR3" })] }));
58
+ const { t } = useTranslation();
59
+ const [loadingState, setLoadingState] = useState("loading");
60
+ const [errorMessage, setErrorMessage] = useState(null);
61
+ const [debtItems, setDebtItems] = useState([]);
62
+ const [isProcessing, setIsProcessing] = useState(false);
63
+ const loadData = useCallback(async () => {
64
+ setLoadingState("loading");
65
+ setErrorMessage(null);
66
+ try {
67
+ const [principlesRes, activationsRes, govQueueRes] = await Promise.all([
68
+ fetchPrinciples("all"),
69
+ fetchAllActivations(),
70
+ fetchGovernanceQueue(),
71
+ ]);
72
+ // Handle raw response validation (EP-01 / EP-03)
73
+ if (!principlesRes.success) {
74
+ setLoadingState("error");
75
+ setErrorMessage(principlesRes.error || "Failed to fetch principles");
76
+ return;
77
+ }
78
+ if (!activationsRes.success) {
79
+ setLoadingState("error");
80
+ setErrorMessage(activationsRes.error || "Failed to fetch activations");
81
+ return;
82
+ }
83
+ if (!govQueueRes.success) {
84
+ setLoadingState("error");
85
+ setErrorMessage(govQueueRes.error || "Failed to fetch governance queue");
86
+ return;
87
+ }
88
+ const validatedPrinciples = validatePrinciplesList(principlesRes.data);
89
+ const validatedActivations = validateActivations(activationsRes.data);
90
+ const validatedGovQueue = validateGovernanceQueue(govQueueRes.data);
91
+ if (!validatedPrinciples || !validatedActivations || !validatedGovQueue) {
92
+ setLoadingState("error");
93
+ setErrorMessage("Data validation failed: unexpected response shape");
94
+ return;
95
+ }
96
+ // Filter and build the debt list (no-complexity heuristics)
97
+ const allPrinciples = validatedPrinciples.principles;
98
+ const allActivations = validatedActivations.activations;
99
+ const stagnationSignals = validatedGovQueue.stagnationSignals;
100
+ const items = [];
101
+ // 1. Identify "Never Activated" Principles
102
+ // An active principle with status === 'active' is never activated if it has no active activations.
103
+ const activePrinciples = allPrinciples.filter((p) => p.status === "active");
104
+ for (const p of activePrinciples) {
105
+ const principleActivations = allActivations.filter((a) => a.principleId === p.id);
106
+ const hasActiveActivation = principleActivations.some((a) => a.status === "active");
107
+ if (!hasActiveActivation) {
108
+ // It qualifies as never-activated debt
109
+ items.push({
110
+ id: p.id,
111
+ text: p.text,
112
+ triggerPattern: p.triggerPattern,
113
+ type: "never_activated",
114
+ status: p.status,
115
+ activeActivationRecords: principleActivations.filter((a) => a.status === "active"),
116
+ });
117
+ }
118
+ }
119
+ // 2. Identify "Stagnant" Principle Approvals (stagnant for > 7 days)
120
+ for (const signal of stagnationSignals) {
121
+ // Skip if we already added it (should not overlap, but to be safe)
122
+ if (items.some((item) => item.id === signal.principleId)) {
123
+ continue;
124
+ }
125
+ const p = allPrinciples.find((p) => p.id === signal.principleId);
126
+ if (p) {
127
+ items.push({
128
+ id: p.id,
129
+ text: p.text,
130
+ triggerPattern: p.triggerPattern,
131
+ type: "stagnant",
132
+ daysSince: signal.daysSince,
133
+ status: p.status,
134
+ });
135
+ }
136
+ }
137
+ setDebtItems(items);
138
+ setLoadingState("loaded");
139
+ }
140
+ catch (e) {
141
+ setLoadingState("error");
142
+ setErrorMessage(e instanceof Error ? e.message : String(e));
143
+ }
144
+ }, []);
145
+ useEffect(() => {
146
+ loadData();
147
+ }, [loadData]);
148
+ // Archive Action: calls POST /api/principles/:id/archive and triggers J.2 Undo toast
149
+ const handleArchive = async (principleId) => {
150
+ setIsProcessing(true);
151
+ const result = await archivePrinciple(principleId);
152
+ if (result.success) {
153
+ // Remove it from the local view immediately
154
+ setDebtItems((prev) => prev.filter((item) => item.id !== principleId));
155
+ // J.2 Undo Toast: 5 seconds countdown action link
156
+ toast.success(t("pages.debt.archiveSuccess"), {
157
+ description: t("pages.activation.disableSuccessDescription", { id: principleId, defaultValue: `Principle ${principleId} archived` }),
158
+ action: {
159
+ label: t("pages.debt.undoAction"),
160
+ onClick: async () => {
161
+ const undoResult = await unarchivePrinciple(principleId);
162
+ if (undoResult.success) {
163
+ toast.success(t("pages.debt.undoSuccess"));
164
+ loadData(); // Reload to restore the principle in list
165
+ }
166
+ else {
167
+ toast.error(t("pages.debt.undoFailed"));
168
+ }
169
+ },
170
+ },
171
+ duration: 5000,
172
+ });
173
+ }
174
+ else {
175
+ toast.error(t("pages.debt.archiveFailed"), {
176
+ description: result.error,
177
+ duration: 8000,
178
+ });
179
+ }
180
+ setIsProcessing(false);
181
+ };
182
+ // Deactivate Action: calls POST /api/v1/activations/:id/disable
183
+ const handleDeactivate = async (activationId, principleId) => {
184
+ setIsProcessing(true);
185
+ const result = await disableActivation(activationId);
186
+ if (result.success) {
187
+ // Update local state by filtering out this deactivated record
188
+ setDebtItems((prev) => prev
189
+ .map((item) => {
190
+ if (item.id !== principleId)
191
+ return item;
192
+ const updatedActivations = item.activeActivationRecords?.filter((ar) => ar.id !== activationId);
193
+ return {
194
+ ...item,
195
+ activeActivationRecords: updatedActivations,
196
+ };
197
+ }));
198
+ toast.success(t("pages.debt.deactivateSuccess"), {
199
+ description: t("pages.activation.disableSuccessDescription", { id: principleId }),
200
+ duration: 5000,
201
+ });
202
+ loadData(); // reload fresh state
203
+ }
204
+ else {
205
+ toast.error(t("pages.debt.deactivateFailed"), {
206
+ description: result.error,
207
+ duration: 8000,
208
+ });
209
+ }
210
+ setIsProcessing(false);
211
+ };
212
+ // ── Loading state ──────────────────────────────────────────────────────────
213
+ if (loadingState === "loading") {
214
+ return (_jsx(PageShell, { children: _jsx(PageLoading, { cardCount: 3, label: t("common.loading") }) }));
215
+ }
216
+ // ── Error state (ERR-002: degradation with explanation) ────────────────────
217
+ if (loadingState === "error") {
218
+ return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.debt.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.debt.title") }), _jsxs("div", { className: "mt-6 p-4 bg-panel border border-line rounded-[6px] text-ink-2 text-sm", children: [_jsx("p", { children: t("pages.debt.loadError") }), errorMessage && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMessage }))] })] }));
219
+ }
220
+ // ── Loaded state ───────────────────────────────────────────────────────────
221
+ return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out] space-y-6", children: [_jsxs("div", { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.debt.eyebrow") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: debtItems.length === 0, children: t("pages.debt.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed", children: t("pages.debt.subtitle") })] }), _jsx("section", { "aria-label": t("pages.debt.listAriaLabel"), className: "space-y-[14px]", children: debtItems.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs(SectionTitle, { id: "section-debt-list", children: [t("pages.sidebar.debt"), " (", debtItems.length, ")"] }), _jsx("div", { className: "space-y-[14px]", children: debtItems.map((item) => (_jsx(DebtCard, { item: item, onArchive: handleArchive, onDeactivate: handleDeactivate, isProcessing: isProcessing }, `${item.id}-${item.type}`))) })] })) : (_jsxs("div", { className: "p-8 text-center bg-panel border border-line border-dashed rounded-[6px] space-y-3", role: "status", children: [_jsx("p", { className: "text-ink-2 font-medium text-[16px]", children: t("pages.debt.emptyTitle") }), _jsx("p", { className: "text-ink-3 text-[13px] max-w-[500px] mx-auto leading-relaxed", children: t("pages.debt.emptyDescription") })] })) })] }) }));
5
222
  }
@@ -7,6 +7,7 @@ import { PageShell } from "../../components/layout/page-shell.js";
7
7
  import { PageLoading } from "../../components/layout/page-loading.js";
8
8
  import { SectionTitle } from "../../components/layout/section-title.js";
9
9
  import { DailyThoughtCard } from "../../components/focus/daily-thought-card.js";
10
+ import { ShinyText } from "../../components/ui/shiny-text.js";
10
11
  import { fetchGovernanceQueue, fetchApprovalsGrouped, approveApproval, rejectApproval, editApproval, } from "../../api.js";
11
12
  export function summarizeDecisionResults(results) {
12
13
  const failures = results.filter((result) => !result.success);
@@ -414,7 +415,7 @@ export function FocusPage() {
414
415
  // Map codes to i18n text
415
416
  const stateReason = getStateReasonText(stateReasonCode, t, pendingCount);
416
417
  const nextAction = getNextActionText(nextActionCode, t);
417
- return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.focus.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.focus.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.focus.subtitle") }), _jsxs("div", { className: "mb-7 px-[18px] py-[14px] bg-panel border border-line rounded-[6px]", children: [_jsx("div", { className: "flex items-center gap-2 mb-1", children: _jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${governanceState === "owner_review_ready"
418
+ return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.focus.eyebrow") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: pendingCount === 0, children: t("pages.focus.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.focus.subtitle") }), _jsxs("div", { className: "mb-7 px-[18px] py-[14px] bg-panel border border-line rounded-[6px]", children: [_jsx("div", { className: "flex items-center gap-2 mb-1", children: _jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${governanceState === "owner_review_ready"
418
419
  ? "bg-gov/10 text-gov border border-gov/20"
419
420
  : governanceState === "degraded"
420
421
  ? "bg-amber/10 text-amber border border-amber/20"
@@ -0,0 +1 @@
1
+ export declare function IntentPage(): import("react/jsx-runtime").JSX.Element;