create-principles-disciple 1.121.8 → 1.121.10

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 (462) hide show
  1. package/README.md +13 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +1 -3
  3. package/console/dist/server/config/pd-config-store.js +4 -4
  4. package/console/dist/server/feedback/channels.d.ts +2 -8
  5. package/console/dist/server/feedback/channels.js +0 -11
  6. package/console/dist/server/index.js +34 -5
  7. package/console/dist/server/models/ActivationsConsoleModel.d.ts +28 -1
  8. package/console/dist/server/models/ActivationsConsoleModel.js +72 -30
  9. package/console/dist/server/models/GovernanceExperienceCollector.d.ts +28 -0
  10. package/console/dist/server/models/GovernanceExperienceCollector.js +305 -0
  11. package/console/dist/server/models/GovernanceProjectionCollector.d.ts +60 -2
  12. package/console/dist/server/models/GovernanceProjectionCollector.js +323 -285
  13. package/console/dist/server/models/PrincipleClassifier.d.ts +1 -1
  14. package/console/dist/server/models/PrincipleClassifier.js +7 -4
  15. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -1
  16. package/console/dist/server/models/ReceiptsConsoleModel.d.ts +5 -0
  17. package/console/dist/server/models/ReceiptsConsoleModel.js +140 -13
  18. package/console/dist/server/routes/activations.js +1 -1
  19. package/console/dist/server/routes/failed-tasks.js +28 -11
  20. package/console/dist/server/routes/governance.d.ts +26 -0
  21. package/console/dist/server/routes/governance.js +51 -0
  22. package/console/dist/server/routes/owner-identity.d.ts +31 -0
  23. package/console/dist/server/routes/owner-identity.js +76 -0
  24. package/console/dist/server/routes/update-history.d.ts +5 -0
  25. package/console/dist/server/routes/update-history.js +50 -4
  26. package/console/dist/server/routes/update.js +263 -41
  27. package/console/dist/server/utils/update-links.d.ts +38 -0
  28. package/console/dist/server/utils/update-links.js +71 -0
  29. package/console/dist/shared/feedback-channel-ids.d.ts +13 -0
  30. package/console/dist/shared/feedback-channel-ids.js +12 -0
  31. package/console/dist/shared/feedback-contract.d.ts +46 -0
  32. package/console/dist/shared/feedback-contract.js +45 -0
  33. package/console/dist/ui/App.js +1 -1
  34. package/console/dist/ui/api.d.ts +22 -3
  35. package/console/dist/ui/api.js +63 -3
  36. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +6 -0
  37. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +66 -0
  38. package/console/dist/ui/i18n/en.json +198 -2
  39. package/console/dist/ui/i18n/zh-CN.json +196 -0
  40. package/console/dist/ui/pages/activation/ActivationPage.js +14 -2
  41. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +25 -5
  42. package/console/dist/ui/pages/focus/FocusPage.d.ts +28 -1
  43. package/console/dist/ui/pages/focus/FocusPage.js +128 -15
  44. package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +30 -0
  45. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +49 -6
  46. package/console/dist/ui/pages/settings/SettingsPage.js +67 -2
  47. package/console/dist/ui/pages/settings/UpdatePage.js +7 -7
  48. package/console/dist/ui/utils/enum-labels.js +0 -1
  49. package/console/dist/ui/utils/validators.d.ts +53 -21
  50. package/console/dist/ui/utils/validators.js +248 -21
  51. package/console/dist/web/assets/app.css +6 -0
  52. package/console/dist/web/assets/app.js +2721 -1664
  53. package/console/package.json +3 -1
  54. package/core/dist/host/host-adapter.d.ts +1 -1
  55. package/core/dist/host/host-adapter.d.ts.map +1 -1
  56. package/core/dist/host/host-adapter.js +1 -0
  57. package/core/dist/host/host-adapter.js.map +1 -1
  58. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +12 -2
  59. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  60. package/core/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js +1 -1
  61. package/core/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js.map +1 -1
  62. package/core/dist/runtime-v2/__tests__/governance-experience.test.d.ts +2 -0
  63. package/core/dist/runtime-v2/__tests__/governance-experience.test.d.ts.map +1 -0
  64. package/core/dist/runtime-v2/__tests__/governance-experience.test.js +300 -0
  65. package/core/dist/runtime-v2/__tests__/governance-experience.test.js.map +1 -0
  66. package/core/dist/runtime-v2/__tests__/owner-identity.test.d.ts +2 -0
  67. package/core/dist/runtime-v2/__tests__/owner-identity.test.d.ts.map +1 -0
  68. package/core/dist/runtime-v2/__tests__/owner-identity.test.js +147 -0
  69. package/core/dist/runtime-v2/__tests__/owner-identity.test.js.map +1 -0
  70. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.d.ts +18 -0
  71. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.d.ts.map +1 -0
  72. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.js +303 -0
  73. package/core/dist/runtime-v2/__tests__/product-telemetry-contract.test.js.map +1 -0
  74. package/core/dist/runtime-v2/__tests__/recovery-actions-log.test.js +40 -0
  75. package/core/dist/runtime-v2/__tests__/recovery-actions-log.test.js.map +1 -1
  76. package/core/dist/runtime-v2/__tests__/status-contract.test.d.ts +2 -0
  77. package/core/dist/runtime-v2/__tests__/status-contract.test.d.ts.map +1 -0
  78. package/core/dist/runtime-v2/__tests__/status-contract.test.js +107 -0
  79. package/core/dist/runtime-v2/__tests__/status-contract.test.js.map +1 -0
  80. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.d.ts +2 -0
  81. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.d.ts.map +1 -0
  82. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.js +104 -0
  83. package/core/dist/runtime-v2/activation/__tests__/promotion-evidence-snapshot.test.js.map +1 -0
  84. package/core/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js +19 -0
  85. package/core/dist/runtime-v2/activation/__tests__/promotion-readiness-evaluator.test.js.map +1 -1
  86. package/core/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js +20 -0
  87. package/core/dist/runtime-v2/activation/__tests__/rulecode-owner-decision-service.test.js.map +1 -1
  88. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js +40 -0
  89. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-safety-store.test.js.map +1 -1
  90. package/core/dist/runtime-v2/activation/index.d.ts +2 -0
  91. package/core/dist/runtime-v2/activation/index.d.ts.map +1 -1
  92. package/core/dist/runtime-v2/activation/index.js +1 -0
  93. package/core/dist/runtime-v2/activation/index.js.map +1 -1
  94. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.d.ts +30 -0
  95. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.d.ts.map +1 -0
  96. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.js +87 -0
  97. package/core/dist/runtime-v2/activation/promotion-evidence-snapshot.js.map +1 -0
  98. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.d.ts.map +1 -1
  99. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.js +3 -0
  100. package/core/dist/runtime-v2/activation/promotion-readiness-evaluator.js.map +1 -1
  101. package/core/dist/runtime-v2/activation/promotion-readiness-reader.d.ts +1 -1
  102. package/core/dist/runtime-v2/activation/promotion-readiness-reader.d.ts.map +1 -1
  103. package/core/dist/runtime-v2/activation/promotion-readiness-reader.js +2 -2
  104. package/core/dist/runtime-v2/activation/promotion-readiness-reader.js.map +1 -1
  105. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.d.ts.map +1 -1
  106. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.js +18 -9
  107. package/core/dist/runtime-v2/activation/rulecode-owner-decision-service.js.map +1 -1
  108. package/core/dist/runtime-v2/adapter/__tests__/chaos-json-repair.test.js +1 -1
  109. package/core/dist/runtime-v2/adapter/__tests__/chaos-json-repair.test.js.map +1 -1
  110. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js +91 -1
  111. package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js.map +1 -1
  112. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js +59 -12
  113. package/core/dist/runtime-v2/adapter/__tests__/pi-ai-runtime-adapter.test.js.map +1 -1
  114. package/core/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js +10 -9
  115. package/core/dist/runtime-v2/adapter/__tests__/runtime-config-contract.test.js.map +1 -1
  116. package/core/dist/runtime-v2/adapter/__tests__/structured-output-repair.test.js +42 -1
  117. package/core/dist/runtime-v2/adapter/__tests__/structured-output-repair.test.js.map +1 -1
  118. package/core/dist/runtime-v2/adapter/json-extractor.d.ts +25 -0
  119. package/core/dist/runtime-v2/adapter/json-extractor.d.ts.map +1 -1
  120. package/core/dist/runtime-v2/adapter/json-extractor.js +126 -0
  121. package/core/dist/runtime-v2/adapter/json-extractor.js.map +1 -1
  122. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts +9 -4
  123. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.d.ts.map +1 -1
  124. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js +9 -4
  125. package/core/dist/runtime-v2/adapter/l2-agent-loop-adapter.js.map +1 -1
  126. package/core/dist/runtime-v2/adapter/output-repair-contract.d.ts +5 -1
  127. package/core/dist/runtime-v2/adapter/output-repair-contract.d.ts.map +1 -1
  128. package/core/dist/runtime-v2/adapter/output-repair-contract.js +4 -1
  129. package/core/dist/runtime-v2/adapter/output-repair-contract.js.map +1 -1
  130. package/core/dist/runtime-v2/adapter/pi-ai-catalog.d.ts +7 -0
  131. package/core/dist/runtime-v2/adapter/pi-ai-catalog.d.ts.map +1 -0
  132. package/core/dist/runtime-v2/adapter/pi-ai-catalog.js +19 -0
  133. package/core/dist/runtime-v2/adapter/pi-ai-catalog.js.map +1 -0
  134. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts +13 -15
  135. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.d.ts.map +1 -1
  136. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js +104 -37
  137. package/core/dist/runtime-v2/adapter/pi-ai-runtime-adapter.js.map +1 -1
  138. package/core/dist/runtime-v2/adapter/structured-output-repair.d.ts +16 -1
  139. package/core/dist/runtime-v2/adapter/structured-output-repair.d.ts.map +1 -1
  140. package/core/dist/runtime-v2/adapter/structured-output-repair.js +38 -6
  141. package/core/dist/runtime-v2/adapter/structured-output-repair.js.map +1 -1
  142. package/core/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts +1 -1
  143. package/core/dist/runtime-v2/adapter/tools/diagnostician-tool.d.ts.map +1 -1
  144. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +8 -9
  145. package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -1
  146. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +27 -3
  147. package/core/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
  148. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.d.ts +11 -0
  149. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.d.ts.map +1 -0
  150. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.js +93 -0
  151. package/core/dist/runtime-v2/config/__tests__/pd-config-principles.test.js.map +1 -0
  152. package/core/dist/runtime-v2/config/__tests__/pd-config-workspace.test.js +41 -0
  153. package/core/dist/runtime-v2/config/__tests__/pd-config-workspace.test.js.map +1 -1
  154. package/core/dist/runtime-v2/config/index.d.ts +2 -2
  155. package/core/dist/runtime-v2/config/index.d.ts.map +1 -1
  156. package/core/dist/runtime-v2/config/index.js +2 -0
  157. package/core/dist/runtime-v2/config/index.js.map +1 -1
  158. package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -1
  159. package/core/dist/runtime-v2/config/pd-config-agent-binding.js +4 -13
  160. package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -1
  161. package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
  162. package/core/dist/runtime-v2/config/pd-config-effective.js +14 -7
  163. package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
  164. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts.map +1 -1
  165. package/core/dist/runtime-v2/config/pd-config-feature-flags.js +5 -12
  166. package/core/dist/runtime-v2/config/pd-config-feature-flags.js.map +1 -1
  167. package/core/dist/runtime-v2/config/pd-config-types.d.ts +8 -0
  168. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  169. package/core/dist/runtime-v2/config/pd-config-types.js +2 -0
  170. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  171. package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
  172. package/core/dist/runtime-v2/config/pd-config-validate.js +48 -3
  173. package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
  174. package/core/dist/runtime-v2/core-principles/__tests__/core-axiom-block.test.js +36 -8
  175. package/core/dist/runtime-v2/core-principles/__tests__/core-axiom-block.test.js.map +1 -1
  176. package/core/dist/runtime-v2/core-principles/__tests__/core-principle-registry.test.js +36 -12
  177. package/core/dist/runtime-v2/core-principles/__tests__/core-principle-registry.test.js.map +1 -1
  178. package/core/dist/runtime-v2/core-principles/core-axiom-block.d.ts +22 -8
  179. package/core/dist/runtime-v2/core-principles/core-axiom-block.d.ts.map +1 -1
  180. package/core/dist/runtime-v2/core-principles/core-axiom-block.js +28 -13
  181. package/core/dist/runtime-v2/core-principles/core-axiom-block.js.map +1 -1
  182. package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts +29 -4
  183. package/core/dist/runtime-v2/core-principles/core-principle-registry.d.ts.map +1 -1
  184. package/core/dist/runtime-v2/core-principles/core-principle-registry.js +68 -33
  185. package/core/dist/runtime-v2/core-principles/core-principle-registry.js.map +1 -1
  186. package/core/dist/runtime-v2/core-principles/index.d.ts +3 -3
  187. package/core/dist/runtime-v2/core-principles/index.d.ts.map +1 -1
  188. package/core/dist/runtime-v2/core-principles/index.js +1 -1
  189. package/core/dist/runtime-v2/core-principles/index.js.map +1 -1
  190. package/core/dist/runtime-v2/evolution/evolution-types.d.ts +2 -1
  191. package/core/dist/runtime-v2/evolution/evolution-types.d.ts.map +1 -1
  192. package/core/dist/runtime-v2/evolution/evolution-types.js.map +1 -1
  193. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.d.ts +2 -0
  194. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.d.ts.map +1 -0
  195. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.js +48 -0
  196. package/core/dist/runtime-v2/feature-flags/__tests__/anonymous-product-telemetry-flag.test.js.map +1 -0
  197. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.d.ts +2 -0
  198. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.d.ts.map +1 -0
  199. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.js +46 -0
  200. package/core/dist/runtime-v2/feature-flags/__tests__/codex-conversation-ingestion-flag.test.js.map +1 -0
  201. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +86 -31
  202. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  203. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.d.ts +2 -0
  204. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.d.ts.map +1 -0
  205. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.js +83 -0
  206. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-lifecycle.test.js.map +1 -0
  207. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts +19 -1
  208. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  209. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +128 -10
  210. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  211. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.d.ts +37 -0
  212. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.d.ts.map +1 -0
  213. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.js +304 -0
  214. package/core/dist/runtime-v2/feature-flags/feature-flag-lifecycle.js.map +1 -0
  215. package/core/dist/runtime-v2/feature-flags/index.d.ts +4 -2
  216. package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
  217. package/core/dist/runtime-v2/feature-flags/index.js +3 -1
  218. package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
  219. package/core/dist/runtime-v2/governance-experience-contract.d.ts +468 -0
  220. package/core/dist/runtime-v2/governance-experience-contract.d.ts.map +1 -0
  221. package/core/dist/runtime-v2/governance-experience-contract.js +208 -0
  222. package/core/dist/runtime-v2/governance-experience-contract.js.map +1 -0
  223. package/core/dist/runtime-v2/governance-experience.d.ts +11 -0
  224. package/core/dist/runtime-v2/governance-experience.d.ts.map +1 -0
  225. package/core/dist/runtime-v2/governance-experience.js +276 -0
  226. package/core/dist/runtime-v2/governance-experience.js.map +1 -0
  227. package/core/dist/runtime-v2/index.d.ts +20 -8
  228. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  229. package/core/dist/runtime-v2/index.js +20 -6
  230. package/core/dist/runtime-v2/index.js.map +1 -1
  231. package/core/dist/runtime-v2/internalization/__tests__/artificer-output-retry-flag.test.js +29 -10
  232. package/core/dist/runtime-v2/internalization/__tests__/artificer-output-retry-flag.test.js.map +1 -1
  233. package/core/dist/runtime-v2/owner-identity.d.ts +69 -0
  234. package/core/dist/runtime-v2/owner-identity.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/owner-identity.js +179 -0
  236. package/core/dist/runtime-v2/owner-identity.js.map +1 -0
  237. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  238. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +2 -3
  239. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  240. package/core/dist/runtime-v2/product-telemetry/daily-identity.d.ts +70 -0
  241. package/core/dist/runtime-v2/product-telemetry/daily-identity.d.ts.map +1 -0
  242. package/core/dist/runtime-v2/product-telemetry/daily-identity.js +89 -0
  243. package/core/dist/runtime-v2/product-telemetry/daily-identity.js.map +1 -0
  244. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.d.ts +110 -0
  245. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.d.ts.map +1 -0
  246. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.js +250 -0
  247. package/core/dist/runtime-v2/product-telemetry/snapshot-contract.js.map +1 -0
  248. package/core/dist/runtime-v2/pruning-read-model.d.ts +2 -1
  249. package/core/dist/runtime-v2/pruning-read-model.d.ts.map +1 -1
  250. package/core/dist/runtime-v2/pruning-read-model.js.map +1 -1
  251. package/core/dist/runtime-v2/receipt-coverage.d.ts +63 -0
  252. package/core/dist/runtime-v2/receipt-coverage.d.ts.map +1 -0
  253. package/core/dist/runtime-v2/receipt-coverage.js +19 -0
  254. package/core/dist/runtime-v2/receipt-coverage.js.map +1 -0
  255. package/core/dist/runtime-v2/recovery-actions-log.d.ts +7 -0
  256. package/core/dist/runtime-v2/recovery-actions-log.d.ts.map +1 -1
  257. package/core/dist/runtime-v2/recovery-actions-log.js +6 -0
  258. package/core/dist/runtime-v2/recovery-actions-log.js.map +1 -1
  259. package/core/dist/runtime-v2/runtime-protocol.js +1 -1
  260. package/core/dist/runtime-v2/runtime-protocol.js.map +1 -1
  261. package/core/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js +17 -1
  262. package/core/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js.map +1 -1
  263. package/core/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
  264. package/core/dist/runtime-v2/store/task/sqlite-task-store.js +10 -0
  265. package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
  266. package/core/dist/runtime-v2/store/task/task-types.d.ts +2 -0
  267. package/core/dist/runtime-v2/store/task/task-types.d.ts.map +1 -1
  268. package/core/dist/runtime-v2/task-status.d.ts +9 -5
  269. package/core/dist/runtime-v2/task-status.d.ts.map +1 -1
  270. package/core/dist/runtime-v2/task-status.js +15 -7
  271. package/core/dist/runtime-v2/task-status.js.map +1 -1
  272. package/core/dist/runtime-v2/types/event-types.d.ts +4 -0
  273. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  274. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  275. package/core/dist/runtime-v2/types/index.d.ts +1 -1
  276. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  277. package/core/dist/runtime-v2/types/index.js +1 -1
  278. package/core/dist/runtime-v2/types/index.js.map +1 -1
  279. package/core/dist/runtime-v2/types/principle-enums.d.ts +3 -2
  280. package/core/dist/runtime-v2/types/principle-enums.d.ts.map +1 -1
  281. package/core/dist/runtime-v2/types/principle-enums.js +11 -5
  282. package/core/dist/runtime-v2/types/principle-enums.js.map +1 -1
  283. package/core/dist/runtime-v2/types/principle-schema.d.ts +1 -1
  284. package/core/dist/runtime-v2/types/principle-tree-store.d.ts +1 -1
  285. package/core/dist/runtime-v2/utils/cli-process-runner.d.ts.map +1 -1
  286. package/core/dist/runtime-v2/utils/cli-process-runner.js +3 -2
  287. package/core/dist/runtime-v2/utils/cli-process-runner.js.map +1 -1
  288. package/core/package.json +1 -2
  289. package/dist/i18n.d.ts.map +1 -1
  290. package/dist/i18n.js +4 -2
  291. package/dist/i18n.js.map +1 -1
  292. package/dist/index.d.ts +2 -0
  293. package/dist/index.d.ts.map +1 -1
  294. package/dist/index.js +47 -11
  295. package/dist/index.js.map +1 -1
  296. package/dist/installer.d.ts +31 -5
  297. package/dist/installer.d.ts.map +1 -1
  298. package/dist/installer.js +472 -161
  299. package/dist/installer.js.map +1 -1
  300. package/dist/installers/codex-host-installer.d.ts.map +1 -1
  301. package/dist/installers/codex-host-installer.js +4 -0
  302. package/dist/installers/codex-host-installer.js.map +1 -1
  303. package/dist/mvp-config.d.ts +10 -0
  304. package/dist/mvp-config.d.ts.map +1 -1
  305. package/dist/mvp-config.js +30 -3
  306. package/dist/mvp-config.js.map +1 -1
  307. package/dist/uninstaller.d.ts +9 -1
  308. package/dist/uninstaller.d.ts.map +1 -1
  309. package/dist/uninstaller.js +103 -23
  310. package/dist/uninstaller.js.map +1 -1
  311. package/dist/update/atomic-file.d.ts +35 -0
  312. package/dist/update/atomic-file.d.ts.map +1 -0
  313. package/dist/update/atomic-file.js +120 -0
  314. package/dist/update/atomic-file.js.map +1 -0
  315. package/dist/update/bootstrap-protocol.d.ts +55 -0
  316. package/dist/update/bootstrap-protocol.d.ts.map +1 -0
  317. package/dist/update/bootstrap-protocol.js +132 -0
  318. package/dist/update/bootstrap-protocol.js.map +1 -0
  319. package/dist/update/channel-metadata.d.ts +28 -0
  320. package/dist/update/channel-metadata.d.ts.map +1 -0
  321. package/dist/update/channel-metadata.js +90 -0
  322. package/dist/update/channel-metadata.js.map +1 -0
  323. package/dist/update/channel-promotion.d.ts +39 -0
  324. package/dist/update/channel-promotion.d.ts.map +1 -0
  325. package/dist/update/channel-promotion.js +55 -0
  326. package/dist/update/channel-promotion.js.map +1 -0
  327. package/dist/update/data-compatibility.d.ts +35 -0
  328. package/dist/update/data-compatibility.d.ts.map +1 -0
  329. package/dist/update/data-compatibility.js +45 -0
  330. package/dist/update/data-compatibility.js.map +1 -0
  331. package/dist/update/install-layout.d.ts +59 -0
  332. package/dist/update/install-layout.d.ts.map +1 -0
  333. package/dist/update/install-layout.js +127 -0
  334. package/dist/update/install-layout.js.map +1 -0
  335. package/dist/update/legacy-migration.d.ts +56 -0
  336. package/dist/update/legacy-migration.d.ts.map +1 -0
  337. package/dist/update/legacy-migration.js +254 -0
  338. package/dist/update/legacy-migration.js.map +1 -0
  339. package/dist/update/product-identity.d.ts +50 -0
  340. package/dist/update/product-identity.d.ts.map +1 -0
  341. package/dist/update/product-identity.js +63 -0
  342. package/dist/update/product-identity.js.map +1 -0
  343. package/dist/update/release-asset-manifest.d.ts +31 -0
  344. package/dist/update/release-asset-manifest.d.ts.map +1 -0
  345. package/dist/update/release-asset-manifest.js +161 -0
  346. package/dist/update/release-asset-manifest.js.map +1 -0
  347. package/dist/update/release-identity.d.ts +33 -0
  348. package/dist/update/release-identity.d.ts.map +1 -0
  349. package/dist/update/release-identity.js +108 -0
  350. package/dist/update/release-identity.js.map +1 -0
  351. package/dist/update/release-manager.d.ts +96 -0
  352. package/dist/update/release-manager.d.ts.map +1 -0
  353. package/dist/update/release-manager.js +253 -0
  354. package/dist/update/release-manager.js.map +1 -0
  355. package/dist/update/release-metadata.d.ts +57 -0
  356. package/dist/update/release-metadata.d.ts.map +1 -0
  357. package/dist/update/release-metadata.js +200 -0
  358. package/dist/update/release-metadata.js.map +1 -0
  359. package/dist/update/release-policy.d.ts +51 -0
  360. package/dist/update/release-policy.d.ts.map +1 -0
  361. package/dist/update/release-policy.js +103 -0
  362. package/dist/update/release-policy.js.map +1 -0
  363. package/dist/update/rollback-policy.d.ts +56 -0
  364. package/dist/update/rollback-policy.d.ts.map +1 -0
  365. package/dist/update/rollback-policy.js +61 -0
  366. package/dist/update/rollback-policy.js.map +1 -0
  367. package/dist/update/transaction-journal.d.ts +121 -0
  368. package/dist/update/transaction-journal.d.ts.map +1 -0
  369. package/dist/update/transaction-journal.js +333 -0
  370. package/dist/update/transaction-journal.js.map +1 -0
  371. package/dist/update/trust-metadata.d.ts +55 -0
  372. package/dist/update/trust-metadata.d.ts.map +1 -0
  373. package/dist/update/trust-metadata.js +170 -0
  374. package/dist/update/trust-metadata.js.map +1 -0
  375. package/dist/update/update-history.d.ts +46 -0
  376. package/dist/update/update-history.d.ts.map +1 -0
  377. package/dist/update/update-history.js +123 -0
  378. package/dist/update/update-history.js.map +1 -0
  379. package/dist/utils/env.d.ts +7 -0
  380. package/dist/utils/env.d.ts.map +1 -1
  381. package/dist/utils/env.js +134 -44
  382. package/dist/utils/env.js.map +1 -1
  383. package/host-runtime/dist/governance-observation-store.d.ts +172 -0
  384. package/host-runtime/dist/governance-observation-store.js +649 -0
  385. package/host-runtime/dist/index.d.ts +6 -0
  386. package/host-runtime/dist/index.js +8 -0
  387. package/host-runtime/dist/product-telemetry/consent-store.d.ts +107 -0
  388. package/host-runtime/dist/product-telemetry/consent-store.js +329 -0
  389. package/host-runtime/dist/product-telemetry/eligibility.d.ts +53 -0
  390. package/host-runtime/dist/product-telemetry/eligibility.js +69 -0
  391. package/host-runtime/dist/product-telemetry/exporter.d.ts +46 -0
  392. package/host-runtime/dist/product-telemetry/exporter.js +71 -0
  393. package/host-runtime/dist/product-telemetry/milestone-readers.d.ts +61 -0
  394. package/host-runtime/dist/product-telemetry/milestone-readers.js +234 -0
  395. package/host-runtime/dist/product-telemetry/service.d.ts +142 -0
  396. package/host-runtime/dist/product-telemetry/service.js +532 -0
  397. package/host-runtime/dist/product-telemetry/workspace-scope.d.ts +38 -0
  398. package/host-runtime/dist/product-telemetry/workspace-scope.js +64 -0
  399. package/host-runtime/package.json +5 -0
  400. package/install-layout/dist/index.d.ts +48 -0
  401. package/install-layout/dist/index.js +81 -0
  402. package/install-layout/dist/index.test.d.ts +1 -0
  403. package/install-layout/dist/index.test.js +34 -0
  404. package/install-layout/package.json +29 -0
  405. package/package.json +16 -6
  406. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts +9 -0
  407. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.d.ts.map +1 -0
  408. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.js +76 -0
  409. package/pd-cli/dist/commands/__tests__/telemetry-flag-wiring.test.js.map +1 -0
  410. package/pd-cli/dist/commands/__tests__/version.test.d.ts +2 -0
  411. package/pd-cli/dist/commands/__tests__/version.test.d.ts.map +1 -0
  412. package/pd-cli/dist/commands/__tests__/version.test.js +134 -0
  413. package/pd-cli/dist/commands/__tests__/version.test.js.map +1 -0
  414. package/pd-cli/dist/commands/console.d.ts.map +1 -1
  415. package/pd-cli/dist/commands/console.js +29 -10
  416. package/pd-cli/dist/commands/console.js.map +1 -1
  417. package/pd-cli/dist/commands/pain-record.d.ts.map +1 -1
  418. package/pd-cli/dist/commands/pain-record.js +6 -15
  419. package/pd-cli/dist/commands/pain-record.js.map +1 -1
  420. package/pd-cli/dist/commands/runtime-activation.d.ts +29 -0
  421. package/pd-cli/dist/commands/runtime-activation.d.ts.map +1 -1
  422. package/pd-cli/dist/commands/runtime-activation.js +70 -31
  423. package/pd-cli/dist/commands/runtime-activation.js.map +1 -1
  424. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.d.ts.map +1 -1
  425. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js +2 -2
  426. package/pd-cli/dist/commands/runtime-internalization-enqueue-successors.js.map +1 -1
  427. package/pd-cli/dist/commands/telemetry.d.ts +82 -0
  428. package/pd-cli/dist/commands/telemetry.d.ts.map +1 -0
  429. package/pd-cli/dist/commands/telemetry.js +268 -0
  430. package/pd-cli/dist/commands/telemetry.js.map +1 -0
  431. package/pd-cli/dist/commands/version.d.ts +11 -0
  432. package/pd-cli/dist/commands/version.d.ts.map +1 -0
  433. package/pd-cli/dist/commands/version.js +48 -0
  434. package/pd-cli/dist/commands/version.js.map +1 -0
  435. package/pd-cli/dist/index.js +35 -2
  436. package/pd-cli/dist/index.js.map +1 -1
  437. package/pd-cli/dist/services/version-report.d.ts +44 -0
  438. package/pd-cli/dist/services/version-report.d.ts.map +1 -0
  439. package/pd-cli/dist/services/version-report.js +152 -0
  440. package/pd-cli/dist/services/version-report.js.map +1 -0
  441. package/pd-cli/package.json +1 -0
  442. package/plugin/dist/bundle.js +868 -936
  443. package/plugin/dist/core/init.d.ts +2 -1
  444. package/plugin/dist/core/principle-application-ledger.d.ts +10 -0
  445. package/plugin/dist/core/product-telemetry-trigger.d.ts +14 -0
  446. package/plugin/dist/core/thinking-os-parser.d.ts +5 -2
  447. package/plugin/dist/governance-audit.js +386 -0
  448. package/plugin/dist/hooks/gate-block-helper.d.ts +25 -1
  449. package/plugin/dist/hooks/gate.d.ts +22 -0
  450. package/plugin/dist/rulehost-evidence.js +832 -0
  451. package/plugin/dist/templates/langs/en/principles/THINKING_OS.md +53 -45
  452. package/plugin/dist/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  453. package/plugin/dist/templates/langs/zh/principles/THINKING_OS.md +62 -46
  454. package/plugin/dist/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  455. package/plugin/dist/templates/workspace/.principles/THINKING_OS.md +66 -38
  456. package/plugin/openclaw.plugin.json +1 -1
  457. package/plugin/package.json +1 -1
  458. package/plugin/templates/langs/en/principles/THINKING_OS.md +53 -45
  459. package/plugin/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  460. package/plugin/templates/langs/zh/principles/THINKING_OS.md +62 -46
  461. package/plugin/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  462. package/plugin/templates/workspace/.principles/THINKING_OS.md +66 -38
@@ -8,6 +8,7 @@ import { PageLoading } from "../../components/layout/page-loading.js";
8
8
  import { SectionTitle } from "../../components/layout/section-title.js";
9
9
  import { Button } from "../../components/ui/button.js";
10
10
  import { fetchPrincipleDetail, fetchApprovalsGrouped, fetchLifecycleMetrics, fetchPrincipleTrajectory, fetchPrincipleGovernance, fetchPrincipleReceipts, approveApproval, rejectApproval, editApproval, } from "../../api.js";
11
+ import { ReceiptCoverageDisclosure, getReceiptSourceStatusLabelKey } from "../../components/receipts/ReceiptCoverageDisclosure.js";
11
12
  import { formatDate } from "../../utils/format-date.js";
12
13
  // ── Runtime validation (H section) ──────────────────────────────────────────
13
14
  function isString(v) {
@@ -113,6 +114,38 @@ export function getReceiptPresentation(effectCount) {
113
114
  ? { headlineKey: 'principles.detail.receipts.headline', showZeroEffectExplanation: false }
114
115
  : { headlineKey: 'principles.detail.receipts.headlinePresence', showZeroEffectExplanation: true };
115
116
  }
117
+ export const GOVERNANCE_BLOCK_I18N_KEYS = {
118
+ recoveryReason: 'principles.detail.governance.reason.recovery_required',
119
+ recoveryNextAction: 'principles.detail.governance.next.inspect_recovery',
120
+ noDecisionReason: 'principles.detail.governance.actionsNotAuthorized',
121
+ nextActionLabel: 'principles.detail.governance.nextActionLabel',
122
+ };
123
+ /**
124
+ * Returns `null` when decision controls may render; otherwise the reason they
125
+ * must stay hidden.
126
+ */
127
+ export function deriveGovernanceControlBlock(input) {
128
+ const { governance, governanceUnavailable } = input;
129
+ if (governance === null) {
130
+ // Flag-off keeps the pre-projection experience: controls stay available and
131
+ // no blocked notice is shown (ERR-102: disabled ≠ unavailable).
132
+ if (governanceUnavailable === null)
133
+ return null;
134
+ return governanceUnavailable.nextAction === undefined
135
+ ? { source: 'server', reason: governanceUnavailable.reason }
136
+ : { source: 'server', reason: governanceUnavailable.reason, nextAction: governanceUnavailable.nextAction };
137
+ }
138
+ if (governance.attention.primary === 'owner_required')
139
+ return null;
140
+ if (governance.attention.primary === 'recovery_required') {
141
+ return {
142
+ source: 'i18n',
143
+ reasonKey: GOVERNANCE_BLOCK_I18N_KEYS.recoveryReason,
144
+ nextActionKey: GOVERNANCE_BLOCK_I18N_KEYS.recoveryNextAction,
145
+ };
146
+ }
147
+ return { source: 'i18n', reasonKey: GOVERNANCE_BLOCK_I18N_KEYS.noDecisionReason };
148
+ }
116
149
  export function PrincipleDetailPage() {
117
150
  const { t, i18n } = useTranslation("pages");
118
151
  const { id } = useParams();
@@ -235,13 +268,21 @@ export function PrincipleDetailPage() {
235
268
  isActionable = true;
236
269
  }
237
270
  }
238
- const governanceOwnerRequired = governance !== null && governance.attention.primary === 'owner_required';
239
- const showDecisionControls = governance === null ? governanceUnavailable === null : governanceOwnerRequired;
271
+ // PRI-582: the projection authorizes the decision controls. When it cannot,
272
+ // controls are hidden together with a truthful reason instead of the generic
273
+ // “no Owner decision is required” copy, which inverted the real cause.
274
+ const governanceBlock = deriveGovernanceControlBlock({ governance, governanceUnavailable });
275
+ const showDecisionControls = governanceBlock === null;
240
276
  if (!showDecisionControls) {
241
277
  isActionable = false;
242
- reasonKey = 'principles.detail.governance.actionsNotAuthorized';
243
- defaultReason = 'No current Owner decision is required.';
244
278
  }
279
+ const governanceBlockedNextAction = governanceBlock === null
280
+ ? undefined
281
+ : governanceBlock.source === 'server'
282
+ ? governanceBlock.nextAction
283
+ : governanceBlock.nextActionKey === undefined
284
+ ? undefined
285
+ : t(governanceBlock.nextActionKey);
245
286
  const handleApprove = () => {
246
287
  if (!isActionable)
247
288
  return;
@@ -426,7 +467,7 @@ export function PrincipleDetailPage() {
426
467
  effectCount: receipts.effectCount,
427
468
  lastEffectAt: receipts.lastEffectAt ? formatDate(receipts.lastEffectAt, i18n.language) : '',
428
469
  })
429
- : t('principles.detail.receipts.headlinePresence') }), _jsx("span", { "data-testid": "receipt-history-counts", className: "font-mono text-[11px] text-ink-3", children: t('principles.detail.receipts.counts', { effectCount: receipts.effectCount, presenceCount: receipts.presenceCount }) })] }), receiptPresentation?.showZeroEffectExplanation && (_jsx("p", { "data-testid": "receipt-history-zero-effect", className: "mt-2 text-[12px] leading-relaxed text-ink-3", children: t('principles.detail.receipts.zeroEffect') })), receipts.events.length > 0 ? (_jsx("ul", { className: "mt-3 space-y-1.5", children: receipts.events.map((event, index) => (_jsxs("li", { className: `flex flex-wrap items-baseline gap-2 text-[13px] ${event.level === 'presence' ? 'text-ink-4' : 'text-ink-2'}`, children: [_jsx("span", { className: "font-mono text-[11px] text-ink-4", children: event.createdAt.slice(0, 16).replace('T', ' ') }), _jsx("span", { className: "font-mono text-[11px]", children: t(`principles.detail.receipts.kind.${event.kind}`, { defaultValue: event.kind }) }), event.digest && _jsx("span", { className: "min-w-0 flex-1 truncate", title: event.digest, children: event.digest })] }, `${event.createdAt}-${index}`))) })) : (_jsx("p", { className: "mt-2 text-[13px] text-ink-3", children: t('principles.detail.receipts.empty') })), _jsx("p", { className: "mt-3 text-[11px] leading-relaxed text-ink-4", children: t('principles.detail.receipts.note') })] })) : (_jsxs("div", { "data-testid": "receipt-history-degraded", className: "rounded-[var(--radius-md)] border border-amber/30 bg-amber/5 p-4", role: "status", children: [_jsx("p", { className: "text-[13px] text-ink-2", children: receipts.reason ?? t('principles.detail.receipts.unavailableReason') }), receipts.nextAction && _jsx("p", { className: "mt-1 text-[12px] text-ink-3", children: receipts.nextAction })] }))] })), _jsxs("section", { className: "mb-8", children: [_jsx(SectionTitle, { children: t("principles.detail.channel") }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("principles.detail.channelPromptReversible") })] }), _jsxs("section", { className: "mb-8", children: [_jsx(SectionTitle, { children: t("principles.detail.whyExists") }), _jsxs("div", { className: "space-y-3 mb-6", children: [_jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.applicable", { defaultValue: "适用场景" }) }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: principle.triggerPattern || t("principles.detail.notSpecified", { defaultValue: "未指定" }) })] }), _jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.expectedBehavior", { defaultValue: "预期行为" }) }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: principle.action || t("principles.detail.notSpecified", { defaultValue: "未指定" }) })] })] }), principle.derivedFromPainIds.length > 0 && (_jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.evidence") }), _jsxs("div", { className: "mt-2 flex items-center gap-3 flex-wrap", children: [_jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("principles.detail.evidenceCount", {
470
+ : t('principles.detail.receipts.headlinePresence') }), _jsx("span", { "data-testid": "receipt-history-counts", className: "font-mono text-[11px] text-ink-3", children: t('principles.detail.receipts.counts', { effectCount: receipts.effectCount, presenceCount: receipts.presenceCount }) })] }), receiptPresentation?.showZeroEffectExplanation && (_jsx("p", { "data-testid": "receipt-history-zero-effect", className: "mt-2 text-[12px] leading-relaxed text-ink-3", children: t('principles.detail.receipts.zeroEffect') })), receipts.events.length > 0 ? (_jsx("ul", { className: "mt-3 space-y-1.5", children: receipts.events.map((event, index) => (_jsxs("li", { className: `flex flex-wrap items-baseline gap-2 text-[13px] ${event.level === 'presence' ? 'text-ink-4' : 'text-ink-2'}`, children: [_jsx("span", { className: "font-mono text-[11px] text-ink-4", children: event.createdAt.slice(0, 16).replace('T', ' ') }), _jsx("span", { className: "font-mono text-[11px]", children: t(`principles.detail.receipts.kind.${event.kind}`, { defaultValue: event.kind }) }), event.digest && _jsx("span", { className: "min-w-0 flex-1 truncate", title: event.digest, children: event.digest })] }, `${event.createdAt}-${index}`))) })) : (_jsx("p", { className: "mt-2 text-[13px] text-ink-3", children: t('principles.detail.receipts.empty') })), _jsx("p", { className: "mt-3 text-[11px] leading-relaxed text-ink-4", children: t('principles.detail.receipts.note') }), _jsx("div", { className: "mt-3 border-t border-line pt-3", children: _jsx(ReceiptCoverageDisclosure, { coverage: receipts.coverage }) })] })) : (_jsxs("div", { "data-testid": "receipt-history-degraded", className: "rounded-[var(--radius-md)] border border-amber/30 bg-amber/5 p-4", role: "status", children: [_jsx("h3", { className: "text-[13px] font-semibold text-ink", children: i18n.t(getReceiptSourceStatusLabelKey(receipts.coverage.sourceStatus)) }), _jsx("p", { className: "mt-1 text-[13px] text-ink-2", children: receipts.reason ?? t('principles.detail.receipts.unavailableReason') }), receipts.nextAction && _jsx("p", { className: "mt-1 text-[12px] text-ink-3", children: receipts.nextAction })] }))] })), _jsxs("section", { className: "mb-8", children: [_jsx(SectionTitle, { children: t("principles.detail.channel") }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("principles.detail.channelPromptReversible") })] }), _jsxs("section", { className: "mb-8", children: [_jsx(SectionTitle, { children: t("principles.detail.whyExists") }), _jsxs("div", { className: "space-y-3 mb-6", children: [_jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.applicable", { defaultValue: "适用场景" }) }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: principle.triggerPattern || t("principles.detail.notSpecified", { defaultValue: "未指定" }) })] }), _jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.expectedBehavior", { defaultValue: "预期行为" }) }), _jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: principle.action || t("principles.detail.notSpecified", { defaultValue: "未指定" }) })] })] }), principle.derivedFromPainIds.length > 0 && (_jsxs("div", { children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.evidence") }), _jsxs("div", { className: "mt-2 flex items-center gap-3 flex-wrap", children: [_jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("principles.detail.evidenceCount", {
430
471
  defaultValue: "已关联 {{count}} 条证据记录",
431
472
  count: principle.derivedFromPainIds.length,
432
473
  }) }), _jsx(Button, { variant: "ghost", size: "sm", onClick: async () => {
@@ -456,5 +497,7 @@ export function PrincipleDetailPage() {
456
497
  // Fallback: show loading state or no-data message
457
498
  ['evidence', 'diagnosis', 'proposal', 'review', 'deploy', 'behavior'].map((key) => (_jsxs("div", { className: "flex gap-4", children: [_jsx("span", { className: "font-mono text-[12px] text-ink-3 min-w-[80px]", children: t(STAGE_LABEL_KEYS[key] ?? `principles.detail.stage${key}`, { defaultValue: key }) }), _jsx("div", { className: "flex-1", children: _jsx("p", { className: "text-ink-4 text-[13px]", children: trajectory === null
458
499
  ? t("principles.detail.trajectoryLoadFailed", { defaultValue: "无法加载轨迹数据" })
459
- : "—" }) })] }, key)))) }), hasRules && lifecycle && (_jsxs("div", { className: "mt-6 pt-4 border-t border-line", children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.lifecycleMetrics", { defaultValue: "生命周期指标" }) }), _jsx("p", { className: "text-amber text-[12px] font-mono mt-1 mb-3", children: t("principles.detail.lifecycleNote") }), lifecycle.adherence.insufficientData ? (_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed", children: t("principles.detail.insufficientData") })) : (_jsxs("div", { children: [_jsxs("p", { className: "text-ink-2 text-[14px]", children: [t("principles.detail.adherenceRate", { defaultValue: "遵守率" }), ": ", lifecycle.adherence.rate !== null ? `${(lifecycle.adherence.rate * 100).toFixed(1)}%` : "—"] }), _jsx("p", { className: "text-ink-3 text-[12px] mt-1", children: lifecycle.adherence.note })] })), lifecycle.ruleMetrics.length > 0 && (_jsx("div", { className: "mt-3", children: lifecycle.ruleMetrics.map((rm) => (_jsxs("div", { className: "flex gap-3 text-[12px] font-mono text-ink-3", children: [_jsx("span", { children: rm.ruleId }), _jsxs("span", { children: [t("principles.detail.triggered", { defaultValue: "触发" }), ": ", rm.triggered] })] }, rm.ruleId))) }))] })), hasRules && !lifecycle && (_jsx("div", { className: "mt-6 pt-4 border-t border-line", children: _jsx("p", { className: "text-ink-3 text-[13px]", children: t("principles.detail.lifecycleLoadFailed", { defaultValue: "无法加载生命周期指标。你可以稍后重试。" }) }) }))] })] }), showDecisionControls && (_jsxs("div", { className: "border-t border-line pt-6 mt-6", children: [_jsx(SectionTitle, { children: t("principles.detail.decisionTitle", { defaultValue: "决策操作" }) }), _jsxs("div", { className: "flex gap-3 flex-wrap items-center", children: [_jsx(Button, { variant: "default", onClick: handleApprove, disabled: !isActionable || actionLoading, children: t("principles.detail.approve") }), _jsx(Button, { variant: "outline", onClick: handleEdit, disabled: !isActionable || actionLoading, children: t("principles.detail.editAction", { defaultValue: "编辑" }) }), _jsx(Button, { variant: "outline", onClick: handlePark, disabled: true, children: t("principles.detail.park") }), _jsx(Button, { variant: "destructive", onClick: handleReject, disabled: !isActionable || actionLoading, children: t("principles.detail.reject") }), _jsxs("span", { className: "text-ink-4 text-[13px]", children: ["(", t("principles.detail.parkUnavailable", { defaultValue: "暂存尚未可用" }), ")"] })] }), !isActionable && (_jsxs("p", { className: "text-danger text-[13px] mt-3 font-mono", children: [t("principles.detail.unactionableReasonPrefix", { defaultValue: "不可操作原因: " }), t(reasonKey, { defaultValue: defaultReason })] })), isActionable && showConfirm && (_jsxs("div", { className: "mt-4 p-3 bg-gov/5 border border-gov/20 rounded-[var(--radius-md)]", children: [_jsx("p", { className: "text-ink-2 text-[13px] mb-3", children: t("principles.detail.confirmApprove") }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: confirmApprove, disabled: actionLoading, children: t("principles.detail.confirm") }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelConfirm, children: t("principles.detail.cancel") })] })] })), isActionable && showRejectInput && (_jsxs("div", { className: "mt-4 p-3 border border-danger/20 rounded-[var(--radius-md)]", children: [_jsx("label", { className: "block font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-2", children: t("principles.detail.rejectReasonLabel", { defaultValue: "拒绝原因" }) }), _jsx("textarea", { value: rejectReason, onChange: (e) => setRejectReason(e.target.value), placeholder: t("principles.detail.rejectReasonPlaceholder"), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] min-h-[80px] resize-y focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": t("principles.detail.rejectReasonPlaceholder") }), _jsxs("div", { className: "flex gap-2 mt-2", children: [_jsx(Button, { variant: "destructive", size: "sm", onClick: confirmReject, disabled: !rejectReason.trim() || actionLoading, children: t("principles.detail.confirmReject") }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelReject, children: t("principles.detail.cancel") })] })] })), isActionable && showEditInput && (_jsxs("div", { className: "mt-4 p-3 border border-gov/20 rounded-[var(--radius-md)]", children: [_jsx("label", { className: "block font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-2", children: t("principles.detail.editReasonLabel", { defaultValue: "编辑原因" }) }), _jsxs("div", { className: "mb-2 text-ink-4 text-[12px] font-mono", children: [t("principles.detail.currentArtifactLabel", { defaultValue: "当前工件" }), ": ", currentArtifactId] }), _jsx("input", { type: "text", value: newArtifactId, onChange: (e) => setNewArtifactId(e.target.value), placeholder: t("principles.detail.editNewArtifactPlaceholder", { defaultValue: "输入新的已验证工件 ID" }), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] mb-2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": t("principles.detail.editNewArtifactPlaceholder", { defaultValue: "输入新的已验证工件 ID" }) }), _jsx("textarea", { value: editReason, onChange: (e) => setEditReason(e.target.value), placeholder: t("principles.detail.editReasonPlaceholder", { defaultValue: "请说明编辑原因" }), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] min-h-[80px] resize-y focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov" }), _jsxs("div", { className: "flex gap-2 mt-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: confirmEdit, disabled: !editReason.trim() || !newArtifactId.trim() || actionLoading, children: t("principles.detail.confirmEdit", { defaultValue: "确认编辑" }) }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelEdit, children: t("principles.detail.cancel") })] })] }))] }))] }) }));
500
+ : "—" }) })] }, key)))) }), hasRules && lifecycle && (_jsxs("div", { className: "mt-6 pt-4 border-t border-line", children: [_jsx("span", { className: "font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3", children: t("principles.detail.lifecycleMetrics", { defaultValue: "生命周期指标" }) }), _jsx("p", { className: "text-amber text-[12px] font-mono mt-1 mb-3", children: t("principles.detail.lifecycleNote") }), lifecycle.adherence.insufficientData ? (_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed", children: t("principles.detail.insufficientData") })) : (_jsxs("div", { children: [_jsxs("p", { className: "text-ink-2 text-[14px]", children: [t("principles.detail.adherenceRate", { defaultValue: "遵守率" }), ": ", lifecycle.adherence.rate !== null ? `${(lifecycle.adherence.rate * 100).toFixed(1)}%` : "—"] }), _jsx("p", { className: "text-ink-3 text-[12px] mt-1", children: lifecycle.adherence.note })] })), lifecycle.ruleMetrics.length > 0 && (_jsx("div", { className: "mt-3", children: lifecycle.ruleMetrics.map((rm) => (_jsxs("div", { className: "flex gap-3 text-[12px] font-mono text-ink-3", children: [_jsx("span", { children: rm.ruleId }), _jsxs("span", { children: [t("principles.detail.triggered", { defaultValue: "触发" }), ": ", rm.triggered] })] }, rm.ruleId))) }))] })), hasRules && !lifecycle && (_jsx("div", { className: "mt-6 pt-4 border-t border-line", children: _jsx("p", { className: "text-ink-3 text-[13px]", children: t("principles.detail.lifecycleLoadFailed", { defaultValue: "无法加载生命周期指标。你可以稍后重试。" }) }) }))] })] }), showDecisionControls && (_jsxs("div", { className: "border-t border-line pt-6 mt-6", children: [_jsx(SectionTitle, { children: t("principles.detail.decisionTitle", { defaultValue: "决策操作" }) }), _jsxs("div", { className: "flex gap-3 flex-wrap items-center", children: [_jsx(Button, { variant: "default", onClick: handleApprove, disabled: !isActionable || actionLoading, children: t("principles.detail.approve") }), _jsx(Button, { variant: "outline", onClick: handleEdit, disabled: !isActionable || actionLoading, children: t("principles.detail.editAction", { defaultValue: "编辑" }) }), _jsx(Button, { variant: "outline", onClick: handlePark, disabled: true, children: t("principles.detail.park") }), _jsx(Button, { variant: "destructive", onClick: handleReject, disabled: !isActionable || actionLoading, children: t("principles.detail.reject") }), _jsxs("span", { className: "text-ink-4 text-[13px]", children: ["(", t("principles.detail.parkUnavailable", { defaultValue: "暂存尚未可用" }), ")"] })] }), !isActionable && (_jsxs("p", { className: "text-danger text-[13px] mt-3 font-mono", children: [t("principles.detail.unactionableReasonPrefix", { defaultValue: "不可操作原因: " }), t(reasonKey, { defaultValue: defaultReason })] })), isActionable && showConfirm && (_jsxs("div", { className: "mt-4 p-3 bg-gov/5 border border-gov/20 rounded-[var(--radius-md)]", children: [_jsx("p", { className: "text-ink-2 text-[13px] mb-3", children: t("principles.detail.confirmApprove") }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: confirmApprove, disabled: actionLoading, children: t("principles.detail.confirm") }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelConfirm, children: t("principles.detail.cancel") })] })] })), isActionable && showRejectInput && (_jsxs("div", { className: "mt-4 p-3 border border-danger/20 rounded-[var(--radius-md)]", children: [_jsx("label", { className: "block font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-2", children: t("principles.detail.rejectReasonLabel", { defaultValue: "拒绝原因" }) }), _jsx("textarea", { value: rejectReason, onChange: (e) => setRejectReason(e.target.value), placeholder: t("principles.detail.rejectReasonPlaceholder"), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] min-h-[80px] resize-y focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": t("principles.detail.rejectReasonPlaceholder") }), _jsxs("div", { className: "flex gap-2 mt-2", children: [_jsx(Button, { variant: "destructive", size: "sm", onClick: confirmReject, disabled: !rejectReason.trim() || actionLoading, children: t("principles.detail.confirmReject") }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelReject, children: t("principles.detail.cancel") })] })] })), isActionable && showEditInput && (_jsxs("div", { className: "mt-4 p-3 border border-gov/20 rounded-[var(--radius-md)]", children: [_jsx("label", { className: "block font-mono text-[11px] uppercase tracking-[0.08em] text-ink-3 mb-2", children: t("principles.detail.editReasonLabel", { defaultValue: "编辑原因" }) }), _jsxs("div", { className: "mb-2 text-ink-4 text-[12px] font-mono", children: [t("principles.detail.currentArtifactLabel", { defaultValue: "当前工件" }), ": ", currentArtifactId] }), _jsx("input", { type: "text", value: newArtifactId, onChange: (e) => setNewArtifactId(e.target.value), placeholder: t("principles.detail.editNewArtifactPlaceholder", { defaultValue: "输入新的已验证工件 ID" }), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] mb-2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov", "aria-label": t("principles.detail.editNewArtifactPlaceholder", { defaultValue: "输入新的已验证工件 ID" }) }), _jsx("textarea", { value: editReason, onChange: (e) => setEditReason(e.target.value), placeholder: t("principles.detail.editReasonPlaceholder", { defaultValue: "请说明编辑原因" }), className: "w-full border border-line rounded-[var(--radius-md)] bg-surface text-ink px-3 py-2 text-[13px] min-h-[80px] resize-y focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gov" }), _jsxs("div", { className: "flex gap-2 mt-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: confirmEdit, disabled: !editReason.trim() || !newArtifactId.trim() || actionLoading, children: t("principles.detail.confirmEdit", { defaultValue: "确认编辑" }) }), _jsx(Button, { variant: "outline", size: "sm", onClick: cancelEdit, children: t("principles.detail.cancel") })] })] }))] })), governanceBlock !== null && (_jsxs("div", { className: "border-t border-line pt-6 mt-6", "data-testid": "governance-decision-blocked", children: [_jsx(SectionTitle, { children: t("principles.detail.decisionTitle", { defaultValue: "决策操作" }) }), _jsx("p", { className: "text-danger text-[13px] mt-3 font-mono", "data-testid": "governance-decision-blocked-reason", children: governanceBlock.source === 'server'
501
+ ? governanceBlock.reason
502
+ : t(governanceBlock.reasonKey) }), governanceBlockedNextAction !== undefined && (_jsxs("p", { className: "text-ink-3 text-[13px] mt-1 font-mono", "data-testid": "governance-decision-blocked-next-action", children: [_jsx("span", { className: "font-medium", children: t(GOVERNANCE_BLOCK_I18N_KEYS.nextActionLabel) }), " ", governanceBlockedNextAction] }))] }))] }) }));
460
503
  }
@@ -7,7 +7,7 @@ import { cn } from "../../../lib/utils.js";
7
7
  import { PageShell } from "../../components/layout/page-shell.js";
8
8
  import { PageLoading } from "../../components/layout/page-loading.js";
9
9
  import { SectionTitle } from "../../components/layout/section-title.js";
10
- import { getToken, setToken, fetchWorkspaces, addWorkspace, removeWorkspace, syncWorkspace, fetchOutputLanguage, updateOutputLanguage, fetchConfigSummary, patchFeatureFlag, } from "../../api.js";
10
+ import { getToken, setToken, fetchWorkspaces, addWorkspace, removeWorkspace, syncWorkspace, fetchOutputLanguage, updateOutputLanguage, fetchConfigSummary, patchFeatureFlag, fetchOwnerIdentity, registerOwnerIdentity, unregisterOwnerIdentity, } from "../../api.js";
11
11
  import { resetOnboardingState } from "../../utils/onboarding-state.js";
12
12
  // ── Runtime validators (H section / ERR-001/005/009/013) ─────────────────────
13
13
  /** Type guard: is this a non-null object with own properties (not inherited)? */
@@ -81,6 +81,11 @@ export function SettingsPage() {
81
81
  const [errorMessage, setErrorMessage] = useState(null);
82
82
  // Auth token state
83
83
  const [tokenInput, setTokenInput] = useState("");
84
+ // ADR-0022 (PRI-578): Owner identity registration state
85
+ const [ownerIdentity, setOwnerIdentity] = useState(null);
86
+ const [ownerIdInput, setOwnerIdInput] = useState("");
87
+ const [credentialIdInput, setCredentialIdInput] = useState("");
88
+ const [ownerActionPending, setOwnerActionPending] = useState(false);
84
89
  // Workspace state
85
90
  const [workspaces, setWorkspaces] = useState([]);
86
91
  const [addName, setAddName] = useState("");
@@ -122,6 +127,12 @@ export function SettingsPage() {
122
127
  }
123
128
  }
124
129
  // Non-fatal: if language load fails, keep default zh-CN
130
+ // ADR-0022 (PRI-578): Load owner identity status
131
+ const ownerResult = await fetchOwnerIdentity();
132
+ if (ownerResult.success && ownerResult.data) {
133
+ setOwnerIdentity(ownerResult.data);
134
+ }
135
+ // Non-fatal: failures keep the section collapsed to its loading state
125
136
  setLoadingState("loaded");
126
137
  }, []);
127
138
  useEffect(() => {
@@ -146,6 +157,47 @@ export function SettingsPage() {
146
157
  setOnboardingFlagEnabled(flag.enabled);
147
158
  }, [t]);
148
159
  useEffect(() => { void loadOnboardingFlag(); }, [loadOnboardingFlag]);
160
+ // ── ADR-0022 (PRI-578): owner identity handlers ─────────────────────────
161
+ const handleRegisterOwner = useCallback(async () => {
162
+ if (ownerIdInput.trim().length === 0 || credentialIdInput.trim().length === 0) {
163
+ toast.error(t("pages.settings.ownerIdentity.required"));
164
+ return;
165
+ }
166
+ setOwnerActionPending(true);
167
+ try {
168
+ const result = await registerOwnerIdentity(ownerIdInput.trim(), credentialIdInput.trim());
169
+ if (!result.success) {
170
+ toast.error(t("pages.settings.ownerIdentity.operationFailed"));
171
+ return;
172
+ }
173
+ const refresh = await fetchOwnerIdentity();
174
+ if (refresh.success && refresh.data)
175
+ setOwnerIdentity(refresh.data);
176
+ setOwnerIdInput("");
177
+ setCredentialIdInput("");
178
+ toast.success(t("pages.settings.ownerIdentity.registered"));
179
+ }
180
+ finally {
181
+ setOwnerActionPending(false);
182
+ }
183
+ }, [ownerIdInput, credentialIdInput, t]);
184
+ const handleUnregisterOwner = useCallback(async () => {
185
+ setOwnerActionPending(true);
186
+ try {
187
+ const result = await unregisterOwnerIdentity();
188
+ if (!result.success) {
189
+ toast.error(t("pages.settings.ownerIdentity.operationFailed"));
190
+ return;
191
+ }
192
+ const refresh = await fetchOwnerIdentity();
193
+ if (refresh.success && refresh.data)
194
+ setOwnerIdentity(refresh.data);
195
+ toast.success(t("pages.settings.ownerIdentity.unregistered"));
196
+ }
197
+ finally {
198
+ setOwnerActionPending(false);
199
+ }
200
+ }, [t]);
149
201
  // ── Auth token handlers ────────────────────────────────────────────────
150
202
  const handleSaveToken = useCallback(async () => {
151
203
  const trimmed = tokenInput.trim();
@@ -259,7 +311,20 @@ export function SettingsPage() {
259
311
  return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.settings.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.settings.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.settings.loadError") }), errorMessage && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMessage }))] })] }));
260
312
  }
261
313
  // ── Loaded state ─────────────────────────────────────────────────────────
262
- 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.settings.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.settings.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.settings.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-auth", children: [_jsx(SectionTitle, { id: "section-auth", children: t("pages.settings.auth") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("label", { htmlFor: "bearer-token-input", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.bearerToken") }), _jsx("input", { id: "bearer-token-input", type: "password", value: tokenInput, onChange: (e) => setTokenInput(e.target.value), placeholder: t("pages.settings.enterAccessToken"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" }), _jsxs("div", { className: "flex items-center justify-between mt-3", children: [_jsx("button", { onClick: handleSaveToken, disabled: tokenInput.trim().length === 0, 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 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.save") }), _jsx("span", { className: "text-ink-4 text-[12px]", children: t("pages.settings.tokenSessionOnly") })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-principle-language", children: [_jsx(SectionTitle, { id: "section-principle-language", children: t("pages.settings.principleLanguage") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.settings.principleLanguageDescription") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("label", { htmlFor: "output-language-select", className: "text-sm font-medium text-ink", children: [t("pages.settings.principleLanguage"), ":"] }), _jsxs("select", { id: "output-language-select", value: outputLanguage, onChange: (e) => handleOutputLanguageChange(e.target.value), className: "border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov", children: [_jsx("option", { value: "zh-CN", children: t("pages.settings.languageZhCN") }), _jsx("option", { value: "en", children: t("pages.settings.languageEn") })] })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-sound-alerts", children: [_jsx(SectionTitle, { id: "section-sound-alerts", children: t("pages.settings.notifications") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "sound-alerts-toggle", className: "block text-sm font-medium text-ink", children: t("pages.settings.soundAlerts") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("pages.settings.soundAlertsDescription") })] }), _jsx("button", { id: "sound-alerts-toggle", type: "button", role: "switch", "aria-checked": soundEnabled, onClick: () => setSoundEnabled(!soundEnabled), className: cn("relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", soundEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", soundEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-workspaces", children: [_jsx(SectionTitle, { id: "section-workspaces", children: t("pages.settings.workspace") }), workspaces.length > 0 ? (_jsx("div", { className: "space-y-[10px] mb-5", children: workspaces.map((ws) => (_jsx("article", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium text-ink text-sm", children: ws.name }), _jsx("div", { className: "text-ink-3 text-[13px] mt-1 font-mono break-all", children: ws.path }), _jsxs("div", { className: "text-ink-4 text-[12px] mt-1", children: [t("pages.settings.lastSync"), ":", " ", ws.lastSync ?? "—"] })] }), _jsx("div", { className: "flex items-center gap-2 shrink-0", children: confirmRemove?.workspaceName === ws.name ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-ink-2 text-[12px]", children: t("pages.settings.confirmDeleteDescription", {
314
+ 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.settings.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.settings.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.settings.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-auth", children: [_jsx(SectionTitle, { id: "section-auth", children: t("pages.settings.auth") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("label", { htmlFor: "bearer-token-input", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.bearerToken") }), _jsx("input", { id: "bearer-token-input", type: "password", value: tokenInput, onChange: (e) => setTokenInput(e.target.value), placeholder: t("pages.settings.enterAccessToken"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" }), _jsxs("div", { className: "flex items-center justify-between mt-3", children: [_jsx("button", { onClick: handleSaveToken, disabled: tokenInput.trim().length === 0, 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 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.save") }), _jsx("span", { className: "text-ink-4 text-[12px]", children: t("pages.settings.tokenSessionOnly") })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-owner-identity", children: [_jsx(SectionTitle, { id: "section-owner-identity", children: t("pages.settings.ownerIdentity.title") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.settings.ownerIdentity.intro") }), ownerIdentity === null ? (_jsx("div", { className: "text-ink-4 text-[12px]", children: t("pages.settings.ownerIdentity.loading") })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2 text-[13px] mb-2", "data-testid": "owner-identity-status", children: [_jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${ownerIdentity.resolved.source === "none"
315
+ ? "bg-amber text-ink"
316
+ : ownerIdentity.resolved.source === "invalid_env"
317
+ ? "bg-danger text-paper"
318
+ : "bg-green text-ink"}`, role: "status", children: ownerIdentity.resolved.source === "none"
319
+ ? t("pages.settings.ownerIdentity.statusMissing")
320
+ : ownerIdentity.resolved.source === "invalid_env"
321
+ ? t("pages.settings.ownerIdentity.statusInvalid")
322
+ : t("pages.settings.ownerIdentity.statusConfigured") }), _jsxs("span", { className: "text-ink-3 text-[12px]", children: [ownerIdentity.resolved.source === "env" && t("pages.settings.ownerIdentity.sourceEnv"), ownerIdentity.resolved.source === "file" && t("pages.settings.ownerIdentity.sourceFile"), ownerIdentity.resolved.source === "invalid_env" && t("pages.settings.ownerIdentity.sourceInvalid"), ownerIdentity.resolved.source === "none" && t("pages.settings.ownerIdentity.sourceNone")] })] }), _jsxs("div", { className: "flex items-center gap-2 text-[13px] mb-2", "data-testid": "owner-governance-readiness", "data-ready": ownerIdentity.governance.ownerIdentityConfiguration === "configured" ? "true" : "false", children: [_jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${ownerIdentity.governance.ownerIdentityConfiguration === "configured" ? "bg-green text-ink" : "bg-amber text-ink"}`, role: "status", children: ownerIdentity.governance.ownerIdentityConfiguration === "configured"
323
+ ? t("pages.settings.ownerIdentity.governanceReady")
324
+ : t("pages.settings.ownerIdentity.governanceNotReady") }), ownerIdentity.governance.ownerIdentityConfiguration !== "configured" && (_jsx("span", { className: "text-ink-3 text-[12px]", children: ownerIdentity.governance.authenticationMode === "no_auth"
325
+ ? t("pages.settings.ownerIdentity.governanceReasonTokenAuth")
326
+ : t("pages.settings.ownerIdentity.governanceReasonIdentity") }))] }), ownerIdentity.governance.ownerIdentityConfiguration !== "configured" &&
327
+ ownerIdentity.governance.authenticationMode === "no_auth" && (_jsx("div", { className: "text-ink-4 text-[12px] mb-3", "data-testid": "owner-governance-next-action", children: t("pages.settings.ownerIdentity.governanceNextActionTokenAuth") })), ownerIdentity.resolved.error !== undefined && (_jsx("div", { className: "text-danger text-[12px] mb-3", "data-testid": "owner-identity-error", children: ownerIdentity.resolved.error })), ownerIdentity.resolved.source === "invalid_env" && (_jsx("div", { className: "text-ink-4 text-[12px] mb-3", "data-testid": "owner-identity-invalid-env-hint", children: t("pages.settings.ownerIdentity.invalidEnvHint") })), ownerIdentity.resolved.source === "file" && ownerIdentity.fileRecord !== null && (_jsxs("div", { className: "text-ink-4 text-[12px] mb-3 font-mono", children: [t("pages.settings.ownerIdentity.ownerIdLabel"), ": ", ownerIdentity.fileRecord.ownerId, " \u00B7", " ", t("pages.settings.ownerIdentity.registeredAt"), " ", ownerIdentity.fileRecord.registeredAt.slice(0, 10)] })), ownerIdentity.fileError !== undefined && (_jsx("div", { className: "text-danger text-[12px] mb-3", "data-testid": "owner-identity-file-error", children: ownerIdentity.fileError })), ownerIdentity.resolved.source === "env" ? (_jsx("div", { className: "text-ink-4 text-[12px]", children: t("pages.settings.ownerIdentity.envHint") })) : (_jsxs("div", { className: "mt-3", children: [_jsx("label", { htmlFor: "owner-id-input", className: "block text-sm font-medium text-ink mb-1", children: t("pages.settings.ownerIdentity.ownerIdLabel") }), _jsx("input", { id: "owner-id-input", type: "text", value: ownerIdInput, onChange: (e) => setOwnerIdInput(e.target.value), disabled: ownerActionPending, placeholder: "owner-alice", className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov disabled:opacity-50" }), _jsx("label", { htmlFor: "credential-id-input", className: "block text-sm font-medium text-ink mt-3 mb-1", children: t("pages.settings.ownerIdentity.credentialIdLabel") }), _jsx("input", { id: "credential-id-input", type: "text", value: credentialIdInput, onChange: (e) => setCredentialIdInput(e.target.value), disabled: ownerActionPending, placeholder: "cred-...", className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov disabled:opacity-50" }), _jsxs("div", { className: "flex items-center gap-2 mt-3", children: [_jsx("button", { type: "button", onClick: handleRegisterOwner, disabled: ownerActionPending, 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 disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.ownerIdentity.register") }), ownerIdentity.resolved.source === "file" && (_jsx("button", { type: "button", onClick: handleUnregisterOwner, disabled: ownerActionPending, className: "border border-line text-ink-3 rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-surface transition-colors disabled:opacity-50 disabled:cursor-not-allowed", children: t("pages.settings.ownerIdentity.unregister") }))] })] }))] }))] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-principle-language", children: [_jsx(SectionTitle, { id: "section-principle-language", children: t("pages.settings.principleLanguage") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.settings.principleLanguageDescription") }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("label", { htmlFor: "output-language-select", className: "text-sm font-medium text-ink", children: [t("pages.settings.principleLanguage"), ":"] }), _jsxs("select", { id: "output-language-select", value: outputLanguage, onChange: (e) => handleOutputLanguageChange(e.target.value), className: "border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov", children: [_jsx("option", { value: "zh-CN", children: t("pages.settings.languageZhCN") }), _jsx("option", { value: "en", children: t("pages.settings.languageEn") })] })] })] })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-sound-alerts", children: [_jsx(SectionTitle, { id: "section-sound-alerts", children: t("pages.settings.notifications") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { children: [_jsx("label", { htmlFor: "sound-alerts-toggle", className: "block text-sm font-medium text-ink", children: t("pages.settings.soundAlerts") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("pages.settings.soundAlertsDescription") })] }), _jsx("button", { id: "sound-alerts-toggle", type: "button", role: "switch", "aria-checked": soundEnabled, onClick: () => setSoundEnabled(!soundEnabled), className: cn("relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", soundEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", soundEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-workspaces", children: [_jsx(SectionTitle, { id: "section-workspaces", children: t("pages.settings.workspace") }), workspaces.length > 0 ? (_jsx("div", { className: "space-y-[10px] mb-5", children: workspaces.map((ws) => (_jsx("article", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-start justify-between gap-4", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium text-ink text-sm", children: ws.name }), _jsx("div", { className: "text-ink-3 text-[13px] mt-1 font-mono break-all", children: ws.path }), _jsxs("div", { className: "text-ink-4 text-[12px] mt-1", children: [t("pages.settings.lastSync"), ":", " ", ws.lastSync ?? "—"] })] }), _jsx("div", { className: "flex items-center gap-2 shrink-0", children: confirmRemove?.workspaceName === ws.name ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-ink-2 text-[12px]", children: t("pages.settings.confirmDeleteDescription", {
263
328
  name: ws.name,
264
329
  }) }), _jsx("button", { onClick: () => handleRemoveWorkspace(ws.name), 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", children: t("common.confirm") }), _jsx("button", { onClick: () => setConfirmRemove(null), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("common.cancel") })] })) : (_jsxs(_Fragment, { children: [_jsx("button", { onClick: () => handleSyncWorkspace(ws.name), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.syncWorkspace") }), _jsx("button", { onClick: () => setConfirmRemove({ workspaceName: ws.name }), className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.removeWorkspace") })] })) })] }) }, ws.name))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3 mb-5", children: "\u2014" })), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-end gap-3", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("label", { htmlFor: "add-workspace-name", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.name") }), _jsx("input", { id: "add-workspace-name", type: "text", value: addName, onChange: (e) => setAddName(e.target.value), placeholder: t("pages.settings.addNamePlaceholder"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" })] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("label", { htmlFor: "add-workspace-path", className: "block text-sm font-medium text-ink mb-2", children: t("pages.settings.path") }), _jsx("input", { id: "add-workspace-path", type: "text", value: addPath, onChange: (e) => setAddPath(e.target.value), placeholder: t("pages.settings.addPathPlaceholder"), className: "w-full border border-line bg-surface rounded-[3px] px-3 py-2 text-sm text-ink focus:outline-none focus:border-gov focus:ring-1 focus:ring-gov" })] }), _jsx("button", { onClick: handleAddWorkspace, disabled: addName.trim().length === 0 || addPath.trim().length === 0, 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 disabled:opacity-50 disabled:cursor-not-allowed shrink-0 focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("pages.settings.addWorkspace") })] }) })] }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-onboarding-flag", children: [_jsx(SectionTitle, { id: "section-onboarding-flag", children: t("components.onboardingFlag.title") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("label", { htmlFor: "onboarding-flag-toggle", className: "block text-sm font-medium text-ink", children: t("components.onboardingFlag.label") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mt-1", children: t("components.onboardingFlag.description") })] }), _jsx("button", { id: "onboarding-flag-toggle", type: "button", role: "switch", "aria-checked": onboardingFlagEnabled ?? false, "aria-label": t("components.onboardingFlag.toggleAriaLabel"), onClick: handleToggleOnboardingFlag, disabled: onboardingFlagEnabled === null, className: cn("relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2 disabled:opacity-50 disabled:cursor-not-allowed", onboardingFlagEnabled ? "bg-gov" : "bg-line"), children: _jsx("span", { className: cn("inline-block h-4 w-4 transform rounded-full bg-paper transition-transform", onboardingFlagEnabled ? "translate-x-6" : "translate-x-1") }) })] }) })] }), _jsxs("section", { "aria-labelledby": "section-onboarding-reset", children: [_jsx(SectionTitle, { id: "section-onboarding-reset", children: t("components.onboardingReset.title") }), _jsx("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: _jsx("button", { onClick: handleResetOnboarding, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: t("components.onboardingReset.resetButton") }) })] })] }) }));
265
330
  }
@@ -179,13 +179,13 @@ export function UpdatePage() {
179
179
  }
180
180
  // ── Loaded state ─────────────────────────────────────────────────────────
181
181
  const isUpToDate = statusData ? !statusData.hasUpdate : true;
182
- return (_jsxs(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.update.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.update.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.update.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-update-status", children: [_jsx(SectionTitle, { id: "section-update-status", children: t("pages.update.currentVersion") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.currentVersion") }), _jsx("span", { className: "font-mono text-[13px] text-ink", children: statusData?.currentVersion ?? "—" })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.latestVersion") }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px] text-ink", children: statusData?.latestVersion ?? "—" }), isUpToDate ? (_jsx("span", { className: "inline-flex items-center border border-green/35 text-green rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.upToDate") })) : (_jsx("span", { className: "inline-flex items-center border border-amber/35 text-amber rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.updateAvailable") }))] })] })] }), statusData?.error && (_jsxs("div", { className: "mt-4 pt-3 border-t border-line text-[12px] text-ink-4 font-mono", children: [t("pages.update.checkError"), ": ", statusData.error] })), statusData?.syncPending && (_jsx("div", { className: "mt-4 p-3 rounded-[4px] border border-amber/30 bg-amber/5", children: _jsx("p", { className: "text-[12px] text-amber leading-relaxed", children: t("pages.update.syncPending", { pluginVersion: statusData.pluginLatestVersion ?? "" }) }) })), statusData?.codexInstalled && (_jsx("div", { className: "mt-4 p-3 rounded-[4px] border border-amber/30 bg-amber/5", children: _jsx("p", { className: "text-[12px] text-amber leading-relaxed", children: t("pages.update.codexWarning") }) })), statusData?.changelog && statusData.hasUpdate && (_jsxs("div", { className: "mt-4 p-4 rounded-[4px] border border-line bg-surface/50", children: [_jsx("p", { className: "text-[12px] font-mono text-ink-3 uppercase tracking-wide mb-2", children: t("pages.update.whatsNew") }), _jsx("div", { className: "text-[13px] text-ink-2 leading-relaxed max-h-[300px] overflow-y-auto whitespace-pre-wrap", children: statusData.changelog })] })), _jsxs("div", { className: "mt-5 pt-4 border-t border-line flex items-center gap-3 flex-wrap", children: [_jsx("button", { type: "button", onClick: handleCheckForUpdates, disabled: checking || fullUpdating, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: checking ? t("pages.update.checking") : t("pages.update.checkForUpdates") }), !isUpToDate && (_jsx("button", { type: "button", onClick: () => setShowFullUpdateDialog(true), disabled: checking || fullUpdating, className: "bg-gov text-white rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:bg-gov/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: fullUpdating ? (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), t("pages.update.updating")] })) : (t("pages.update.applyUpdate")) }))] }), updateResult && (_jsx("div", { className: `mt-4 p-4 rounded-[6px] border animate-[pdFadeIn_400ms_ease-out] ${updateResult.success ? 'bg-green/5 border-green/20' : 'bg-red/5 border-red/20'}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [updateResult.success ? (_jsx(CheckCircle2, { className: "h-6 w-6 text-green shrink-0 mt-0.5 animate-[pdFadeIn_600ms_ease-out]", style: { transform: 'scale(1)', animationFillMode: 'both' } })) : (_jsx(XCircle, { className: "h-6 w-6 text-red shrink-0 mt-0.5" })), _jsxs("div", { className: "flex-1 min-w-0", children: [updateResult.success && updateResult.fromVersion && updateResult.newVersion && (_jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [_jsx("span", { className: "font-mono text-[13px] text-ink-3 line-through", children: updateResult.fromVersion }), _jsx(ArrowRight, { className: "h-3.5 w-3.5 text-green" }), _jsx("span", { className: "font-mono text-[13px] text-green font-medium", children: updateResult.newVersion })] })), _jsx("p", { className: `text-[13px] ${updateResult.success ? 'text-green' : 'text-red'}`, children: updateResult.message }), updateResult.success && updateResult.updatedFiles && updateResult.updatedFiles.length > 0 && (_jsx("p", { className: "mt-1 text-[12px] text-ink-4 font-mono", children: t("pages.update.filesUpdated", { count: updateResult.updatedFiles.length }) })), updateResult.success && !updateResult.requiresRestart && (_jsx("p", { className: "mt-2 text-[12px] font-mono text-ink-4", children: t("pages.update.restartHint") })), updateResult.success && updateResult.requiresRestart && (_jsx("p", { className: "mt-2 p-2 rounded-[3px] bg-amber/5 border border-amber/20 text-[12px] text-amber leading-relaxed", children: t("pages.update.fullUpdateRestartPrompt") })), updateResult.success && updateResult.partialUpdate && (_jsx("p", { className: "mt-1 text-[12px] text-amber leading-relaxed", children: t("pages.update.partialUpdateHint") })), !updateResult.success && updateResult.nextAction && (_jsx("p", { className: "mt-1 text-[12px] text-ink-4 font-mono leading-relaxed", children: updateResult.nextAction })), !updateResult.success && (_jsxs("div", { className: "mt-2 flex items-center gap-2", children: [/network|fetch|timeout|ECONNREFUSED|ENOTFOUND/i.test(updateResult.message) && (_jsx("p", { className: "text-[12px] text-ink-4 font-mono", children: t("pages.update.networkErrorHint") })), _jsx("button", { type: "button", onClick: handleApplyUpdate, disabled: updating, className: "text-[12px] text-red underline hover:text-red/80 disabled:opacity-50", children: t("pages.update.retry") })] }))] })] }) }))] })] }), _jsxs("section", { "aria-labelledby": "section-update-history", children: [_jsx(SectionTitle, { id: "section-update-history", children: t("pages.update.history") }), historyErrorReason ? (_jsxs("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: [t("pages.update.loadError"), " (", historyErrorReason, ")"] })) : historyData && historyData.updates.length > 0 ? (_jsx("div", { className: "space-y-[10px]", children: historyData.updates.map((entry) => (_jsx("article", { className: "bg-panel border border-line rounded-[6px] px-5 py-4", children: _jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex items-center border border-line rounded-[2px] px-[7px] py-1 font-mono text-[11px] text-ink-3 bg-surface/80 uppercase", children: t("pages.update.version") }), _jsxs("span", { className: "font-mono text-[13px] text-ink", children: [entry.fromVersion, " \u2192 ", entry.toVersion] }), !entry.success && (_jsx("span", { className: "inline-flex items-center border border-red/35 text-red rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.failed") }))] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: formatDate(entry.timestamp, i18n.language, {
183
- year: "numeric",
184
- month: "short",
185
- day: "numeric",
186
- hour: "2-digit",
187
- minute: "2-digit",
188
- }) }), entry.backupPath && (_jsxs("button", { type: "button", onClick: () => setShowRollbackDialog(entry.backupPath), disabled: rollingBack || updating, className: "flex items-center gap-1 border border-line bg-surface text-ink-3 rounded-[3px] px-[8px] py-[4px] text-[11px] hover:text-ink hover:border-line-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed", title: t("pages.update.rollback"), children: [_jsx(RotateCcw, { className: "h-3 w-3" }), t("pages.update.rollback")] }))] })] }) }, entry.id))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: t("pages.update.noHistory") }))] })] }), _jsx(AlertDialog, { open: showFullUpdateDialog, onOpenChange: setShowFullUpdateDialog, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t("pages.update.confirmFullUpdateTitle") }), _jsx(AlertDialogDescription, { children: t("pages.update.confirmFullUpdateDesc") })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t("common.cancel") }), _jsx(AlertDialogAction, { onClick: handleApplyFullUpdate, children: t("pages.update.applyFullUpdate") })] })] }) }), _jsx(AlertDialog, { open: showRollbackDialog !== null, onOpenChange: (open) => { if (!open)
182
+ return (_jsxs(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.update.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.update.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.update.subtitle") }), _jsxs("section", { className: "mb-8", "aria-labelledby": "section-update-status", children: [_jsx(SectionTitle, { id: "section-update-status", children: t("pages.update.currentVersion") }), _jsxs("div", { className: "bg-panel border border-line rounded-[6px] p-5", children: [_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.currentVersion") }), _jsx("span", { className: "font-mono text-[13px] text-ink", children: statusData?.currentVersion ?? "—" })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: t("pages.update.latestVersion") }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[13px] text-ink", children: statusData?.latestVersion ?? "—" }), isUpToDate ? (_jsx("span", { className: "inline-flex items-center border border-green/35 text-green rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.upToDate") })) : (_jsx("span", { className: "inline-flex items-center border border-amber/35 text-amber rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.updateAvailable") }))] })] })] }), statusData?.error && (_jsxs("div", { className: "mt-4 pt-3 border-t border-line text-[12px] text-ink-4 font-mono", children: [t("pages.update.checkError"), ": ", statusData.error] })), statusData?.syncPending && (_jsx("div", { className: "mt-4 p-3 rounded-[4px] border border-amber/30 bg-amber/5", children: _jsx("p", { className: "text-[12px] text-amber leading-relaxed", children: t("pages.update.syncPending", { pluginVersion: statusData.pluginLatestVersion ?? "" }) }) })), statusData?.codexInstalled && (_jsx("div", { className: "mt-4 p-3 rounded-[4px] border border-amber/30 bg-amber/5", children: _jsx("p", { className: "text-[12px] text-amber leading-relaxed", children: t("pages.update.codexWarning") }) })), statusData?.changelog && statusData.hasUpdate && (_jsxs("div", { className: "mt-4 p-4 rounded-[4px] border border-line bg-surface/50", children: [_jsx("p", { className: "text-[12px] font-mono text-ink-3 uppercase tracking-wide mb-2", children: t("pages.update.whatsNew") }), _jsx("div", { className: "text-[13px] text-ink-2 leading-relaxed max-h-[300px] overflow-y-auto whitespace-pre-wrap", children: statusData.changelog })] })), _jsxs("div", { className: "mt-5 pt-4 border-t border-line flex items-center gap-3 flex-wrap", children: [_jsx("button", { type: "button", onClick: handleCheckForUpdates, disabled: checking || fullUpdating, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:border-line-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: checking ? t("pages.update.checking") : t("pages.update.checkForUpdates") }), !isUpToDate && (_jsx("button", { type: "button", onClick: () => setShowFullUpdateDialog(true), disabled: checking || fullUpdating, className: "bg-gov text-white rounded-[3px] px-[14px] py-[6px] text-[12.5px] hover:bg-gov/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: fullUpdating ? (_jsxs("span", { className: "flex items-center gap-1.5", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), t("pages.update.updating")] })) : (t("pages.update.applyUpdate")) }))] }), updateResult && (_jsx("div", { className: `mt-4 p-4 rounded-[6px] border animate-[pdFadeIn_400ms_ease-out] ${updateResult.success ? 'bg-green/5 border-green/20' : 'bg-red/5 border-red/20'}`, children: _jsxs("div", { className: "flex items-start gap-3", children: [updateResult.success ? (_jsx(CheckCircle2, { className: "h-6 w-6 text-green shrink-0 mt-0.5 animate-[pdFadeIn_600ms_ease-out]", style: { transform: 'scale(1)', animationFillMode: 'both' } })) : (_jsx(XCircle, { className: "h-6 w-6 text-red shrink-0 mt-0.5" })), _jsxs("div", { className: "flex-1 min-w-0", children: [updateResult.success && updateResult.fromVersion && updateResult.newVersion && (_jsxs("div", { className: "flex items-center gap-2 mb-1.5", children: [_jsx("span", { className: "font-mono text-[13px] text-ink-3 line-through", children: updateResult.fromVersion }), _jsx(ArrowRight, { className: "h-3.5 w-3.5 text-green" }), _jsx("span", { className: "font-mono text-[13px] text-green font-medium", children: updateResult.newVersion })] })), _jsx("p", { className: `text-[13px] ${updateResult.success ? 'text-green' : 'text-red'}`, children: updateResult.message }), updateResult.success && updateResult.updatedFiles && updateResult.updatedFiles.length > 0 && (_jsx("p", { className: "mt-1 text-[12px] text-ink-4 font-mono", children: t("pages.update.filesUpdated", { count: updateResult.updatedFiles.length }) })), updateResult.success && !updateResult.requiresRestart && (_jsx("p", { className: "mt-2 text-[12px] font-mono text-ink-4", children: t("pages.update.restartHint") })), updateResult.success && updateResult.requiresRestart && (_jsx("p", { className: "mt-2 p-2 rounded-[3px] bg-amber/5 border border-amber/20 text-[12px] text-amber leading-relaxed", children: t("pages.update.fullUpdateRestartPrompt") })), updateResult.success && updateResult.partialUpdate && (_jsx("p", { className: "mt-1 text-[12px] text-amber leading-relaxed", children: t("pages.update.partialUpdateHint") })), !updateResult.success && updateResult.nextAction && (_jsx("p", { className: "mt-1 text-[12px] text-ink-4 font-mono leading-relaxed", children: updateResult.nextAction })), !updateResult.success && (_jsxs("div", { className: "mt-2 flex items-center gap-2", children: [/network|fetch|timeout|ECONNREFUSED|ENOTFOUND/i.test(updateResult.message) && (_jsx("p", { className: "text-[12px] text-ink-4 font-mono", children: t("pages.update.networkErrorHint") })), _jsx("button", { type: "button", onClick: handleApplyUpdate, disabled: updating, className: "text-[12px] text-red underline hover:text-red/80 disabled:opacity-50", children: t("pages.update.retry") })] }))] })] }) }))] })] }), _jsxs("section", { "aria-labelledby": "section-update-history", children: [_jsx(SectionTitle, { id: "section-update-history", children: t("pages.update.history") }), historyErrorReason ? (_jsxs("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: [t("pages.update.loadError"), " (", historyErrorReason, ")"] })) : historyData && historyData.updates.length > 0 ? (_jsx("div", { className: "space-y-[10px]", children: historyData.updates.map((entry) => (_jsxs("article", { className: "bg-panel border border-line rounded-[6px] px-5 py-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex items-center border border-line rounded-[2px] px-[7px] py-1 font-mono text-[11px] text-ink-3 bg-surface/80 uppercase", children: t("pages.update.version") }), _jsxs("span", { className: "font-mono text-[13px] text-ink", children: [entry.fromVersion, " \u2192 ", entry.toVersion] }), _jsx("span", { className: "inline-flex items-center border border-line rounded-[2px] px-[7px] py-1 font-mono text-[11px] text-ink-3 bg-surface/80 uppercase", children: t(`pages.update.historyKind.${entry.kind}`) }), !entry.success && entry.kind !== 'refusal' && (_jsx("span", { className: "inline-flex items-center border border-red/35 text-red rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase", children: t("pages.update.failed") }))] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("span", { className: "text-ink-3 text-[13px]", children: formatDate(entry.timestamp, i18n.language, {
183
+ year: "numeric",
184
+ month: "short",
185
+ day: "numeric",
186
+ hour: "2-digit",
187
+ minute: "2-digit",
188
+ }) }), entry.backupPath && (_jsxs("button", { type: "button", onClick: () => setShowRollbackDialog(entry.backupPath), disabled: rollingBack || updating, className: "flex items-center gap-1 border border-line bg-surface text-ink-3 rounded-[3px] px-[8px] py-[4px] text-[11px] hover:text-ink hover:border-line-2 transition-colors disabled:opacity-50 disabled:cursor-not-allowed", title: t("pages.update.rollback"), children: [_jsx(RotateCcw, { className: "h-3 w-3" }), t("pages.update.rollback")] }))] })] }), (entry.reason || entry.nextAction) && (_jsxs("div", { className: "mt-3 border-t border-line pt-3 text-[12px] leading-relaxed text-ink-3", children: [entry.reason && _jsx("p", { children: entry.reason }), entry.nextAction && _jsx("p", { className: "mt-1 text-ink-2", children: entry.nextAction })] }))] }, entry.id))) })) : (_jsx("div", { className: "text-ink-3 text-[13px] leading-relaxed py-3", children: t("pages.update.noHistory") }))] })] }), _jsx(AlertDialog, { open: showFullUpdateDialog, onOpenChange: setShowFullUpdateDialog, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t("pages.update.confirmFullUpdateTitle") }), _jsx(AlertDialogDescription, { children: t("pages.update.confirmFullUpdateDesc") })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t("common.cancel") }), _jsx(AlertDialogAction, { onClick: handleApplyFullUpdate, children: t("pages.update.applyFullUpdate") })] })] }) }), _jsx(AlertDialog, { open: showRollbackDialog !== null, onOpenChange: (open) => { if (!open)
189
189
  setShowRollbackDialog(null); }, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: t("pages.update.confirmRollbackTitle") }), _jsx(AlertDialogDescription, { children: t("pages.update.confirmRollbackDesc") })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: t("common.cancel") }), _jsx(AlertDialogAction, { onClick: () => { if (showRollbackDialog)
190
190
  handleRollback(showRollbackDialog); }, children: t("pages.update.rollback") })] })] }) }), rollbackResult && (_jsxs("div", { className: `fixed bottom-4 right-4 max-w-md p-3 rounded-[4px] text-[13px] z-50 ${rollbackResult.success ? 'bg-green/10 border border-green/20 text-green' : 'bg-red/10 border border-red/20 text-red'}`, children: [_jsx("p", { children: rollbackResult.message }), rollbackResult.success && (_jsx("p", { className: "mt-1 text-[12px] font-mono opacity-80", children: t("pages.update.restartHintAfterRollback") }))] }))] }));
191
191
  }
@@ -78,7 +78,6 @@ const LOCAL_LABELS = {
78
78
  'evolution_worker': '进化工作器',
79
79
  'empathy_observer': '共情观察器',
80
80
  'painEvidenceAdmission': '痛点证据准入',
81
- 'pain_evidence_admission': '痛点证据准入',
82
81
  'diagnostician_async_cli': '诊断器异步 CLI',
83
82
  'diagnostician_core_grounding': '诊断器核心锚定',
84
83
  'internalization_core_grounding': '内化核心锚定',
@@ -8,8 +8,12 @@
8
8
  * - Uses `Object.hasOwn()` for untrusted object keys (Rule 5)
9
9
  * - Graceful degradation includes a reason (Rule 9)
10
10
  */
11
- import type { OwnerGovernanceView } from '@principles/core/runtime-v2';
11
+ import type { GovernanceExperienceSnapshot, OwnerGovernanceView } from '@principles/core/runtime-v2';
12
+ import type { FeedbackChannelId } from '../../shared/feedback-channel-ids.js';
13
+ import type { FeedbackChannelStatus, FeedbackChannelsData, FeedbackSubmitResult } from '../../shared/feedback-contract.js';
14
+ export type { FeedbackChannelId, FeedbackChannelStatus, FeedbackChannelsData, FeedbackSubmitResult };
12
15
  export declare function validateOwnerGovernanceView(value: unknown): OwnerGovernanceView | null;
16
+ export declare function validateGovernanceExperienceSnapshot(value: unknown): GovernanceExperienceSnapshot | null;
13
17
  /**
14
18
  * Best-effort error envelope validator.
15
19
  *
@@ -52,27 +56,11 @@ export interface DeleteEnvelopeData {
52
56
  deleted: boolean;
53
57
  }
54
58
  export declare function validateDeleteEnvelope(v: unknown): DeleteEnvelopeData | null;
55
- export type FeedbackChannelId = 'ingest' | 'github' | 'email' | 'file';
56
- export interface FeedbackChannelStatusData {
57
- id: FeedbackChannelId;
58
- available: boolean;
59
- reason?: string;
60
- nextAction?: string;
61
- }
62
- export interface FeedbackChannelsData {
63
- channels: FeedbackChannelStatusData[];
64
- }
59
+ /** Legacy UI alias for the shared contract type. */
60
+ export type FeedbackChannelStatusData = FeedbackChannelStatus;
61
+ /** Legacy UI alias for the shared contract type. */
62
+ export type FeedbackSubmitResultData = FeedbackSubmitResult;
65
63
  export declare function validateFeedbackChannels(v: unknown): FeedbackChannelsData | null;
66
- export interface FeedbackSubmitResultData {
67
- ok: boolean;
68
- alreadySubmitted: boolean;
69
- status: string;
70
- submittedVia?: string;
71
- trackingId?: string;
72
- externalUrl?: string;
73
- writeBackFailed?: boolean;
74
- nextAction?: string;
75
- }
76
64
  export declare function validateFeedbackSubmitResult(v: unknown): FeedbackSubmitResultData | null;
77
65
  interface WorkspaceConfigData {
78
66
  workspaceName: string;
@@ -240,6 +228,8 @@ export interface RecoveryResultData {
240
228
  newStatus: string;
241
229
  /** 'recovered' (failed→pending) | 'requeued' (needs_human_review→pending) */
242
230
  result: string;
231
+ /** True when the recovery force-reset an exhausted attempt budget */
232
+ forceApplied?: boolean;
243
233
  nextAction?: string;
244
234
  }
245
235
  export declare function validateRecoveryResult(v: unknown): RecoveryResultData | null;
@@ -403,8 +393,13 @@ export interface UpdateHistoryEntryData {
403
393
  fromVersion: string;
404
394
  toVersion: string;
405
395
  success: boolean;
396
+ kind: UpdateHistoryKind;
406
397
  backupPath?: string;
398
+ reason?: string;
399
+ nextAction?: string;
407
400
  }
401
+ export declare const UPDATE_HISTORY_KINDS: readonly ['update', 'reinstall', 'legacy_migration', 'rollback', 'refusal', 'failure', 'recovery', 'unknown'];
402
+ export type UpdateHistoryKind = (typeof UPDATE_HISTORY_KINDS)[number];
408
403
  export declare function validateUpdateHistoryEntry(v: unknown): UpdateHistoryEntryData | null;
409
404
  export interface UpdateHistoryData {
410
405
  updates: UpdateHistoryEntryData[];
@@ -778,3 +773,40 @@ export interface IntentVersionData {
778
773
  versions: IntentVersionEntry[];
779
774
  }
780
775
  export declare function validateIntentVersions(v: unknown): IntentVersionData | null;
776
+ export interface OwnerIdentityResolvedData {
777
+ ownerId: string | null;
778
+ credentialId: string | null;
779
+ source: 'env' | 'file' | 'none' | 'invalid_env';
780
+ /** Machine-readable reason (partial env pair, unreadable file). No identity values. */
781
+ error?: string;
782
+ }
783
+ export interface OwnerIdentityRecordData {
784
+ schemaVersion: number;
785
+ ownerId: string;
786
+ credentialId: string;
787
+ registeredAt: string;
788
+ }
789
+ /** Canonical governance readiness — mirrors core OwnerConfigSnapshot. */
790
+ export interface OwnerGovernanceReadinessData {
791
+ authenticationMode: 'authenticated' | 'no_auth';
792
+ ownerIdentityConfiguration: 'configured' | 'missing';
793
+ }
794
+ export interface OwnerIdentityViewData {
795
+ resolved: OwnerIdentityResolvedData;
796
+ fileRecord: OwnerIdentityRecordData | null;
797
+ fileError?: string;
798
+ governance: OwnerGovernanceReadinessData;
799
+ }
800
+ export declare function validateOwnerIdentityView(v: unknown): OwnerIdentityViewData | null;
801
+ export interface OwnerIdentityRegisterData {
802
+ record: OwnerIdentityRecordData;
803
+ source: 'file';
804
+ governance: OwnerGovernanceReadinessData;
805
+ }
806
+ export declare function validateOwnerIdentityRegister(v: unknown): OwnerIdentityRegisterData | null;
807
+ export interface OwnerIdentityUnregisterData {
808
+ ok: boolean;
809
+ source: 'none';
810
+ governance: OwnerGovernanceReadinessData;
811
+ }
812
+ export declare function validateOwnerIdentityUnregister(v: unknown): OwnerIdentityUnregisterData | null;