create-principles-disciple 1.146.4 → 1.146.7

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 (350) hide show
  1. package/_release/product-identity.json +1 -1
  2. package/codex-adapter/package.json +1 -1
  3. package/core/dist/runtime-v2/evidence-triage/index.d.ts +1 -3
  4. package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
  5. package/core/dist/runtime-v2/evidence-triage/index.js +1 -2
  6. package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
  7. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +0 -19
  8. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -1
  9. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +0 -25
  10. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -1
  11. package/core/dist/runtime-v2/index.d.ts +2 -2
  12. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  13. package/core/dist/runtime-v2/index.js +1 -1
  14. package/core/dist/runtime-v2/index.js.map +1 -1
  15. package/core/dist/telemetry-event.d.ts +2 -2
  16. package/core/dist/telemetry-event.d.ts.map +1 -1
  17. package/core/dist/telemetry-event.js +4 -5
  18. package/core/dist/telemetry-event.js.map +1 -1
  19. package/core/dist/trajectory-store.d.ts.map +1 -1
  20. package/core/dist/trajectory-store.js +4 -44
  21. package/core/dist/trajectory-store.js.map +1 -1
  22. package/core/package.json +1 -1
  23. package/host-runtime/package.json +1 -1
  24. package/package.json +4 -4
  25. package/plugin/dist/bundle.js +460 -460
  26. package/plugin/dist/core/config.d.ts +0 -2
  27. package/plugin/dist/core/trajectory.d.ts +0 -6
  28. package/plugin/dist/hooks/llm.d.ts +0 -1
  29. package/plugin/dist/hooks/prompt-helpers.d.ts +2 -1
  30. package/plugin/dist/hooks/raw-observation-adapter.d.ts +6 -4
  31. package/plugin/dist/hooks/triage-adapter.d.ts +1 -1
  32. package/plugin/dist/openclaw.plugin.json +1 -1
  33. package/plugin/dist/rulehost-evidence.js +6 -6
  34. package/plugin/dist/templates/pain_settings.json +0 -2
  35. package/plugin/openclaw.plugin.json +1 -1
  36. package/plugin/package.json +1 -1
  37. package/plugin/templates/pain_settings.json +0 -2
  38. package/release-manager/package.json +4 -4
  39. package/workbuddy-adapter/package.json +1 -1
  40. package/console/dist/ui/App.d.ts +0 -1
  41. package/console/dist/ui/App.js +0 -172
  42. package/console/dist/ui/api.d.ts +0 -611
  43. package/console/dist/ui/api.js +0 -1094
  44. package/console/dist/ui/components/auth/login-form.d.ts +0 -4
  45. package/console/dist/ui/components/auth/login-form.js +0 -142
  46. package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
  47. package/console/dist/ui/components/auth/splash-screen.js +0 -22
  48. package/console/dist/ui/components/error-boundary.d.ts +0 -15
  49. package/console/dist/ui/components/error-boundary.js +0 -30
  50. package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
  51. package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
  52. package/console/dist/ui/components/language-switcher.d.ts +0 -2
  53. package/console/dist/ui/components/language-switcher.js +0 -17
  54. package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
  55. package/console/dist/ui/components/layout/app-sidebar.js +0 -128
  56. package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
  57. package/console/dist/ui/components/layout/page-loading.js +0 -14
  58. package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
  59. package/console/dist/ui/components/layout/page-shell.js +0 -11
  60. package/console/dist/ui/components/layout/section-title.d.ts +0 -10
  61. package/console/dist/ui/components/layout/section-title.js +0 -9
  62. package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
  63. package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
  64. package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
  65. package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
  66. package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
  67. package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
  68. package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
  69. package/console/dist/ui/components/notifications/sound-storage.js +0 -37
  70. package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
  71. package/console/dist/ui/components/notifications/useNotifications.js +0 -9
  72. package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
  73. package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
  74. package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
  75. package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
  76. package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
  77. package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
  78. package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
  79. package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
  80. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
  81. package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
  82. package/console/dist/ui/components/theme-provider.d.ts +0 -14
  83. package/console/dist/ui/components/theme-provider.js +0 -40
  84. package/console/dist/ui/components/theme-toggle.d.ts +0 -2
  85. package/console/dist/ui/components/theme-toggle.js +0 -11
  86. package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
  87. package/console/dist/ui/components/ui/alert-dialog.js +0 -26
  88. package/console/dist/ui/components/ui/badge.d.ts +0 -9
  89. package/console/dist/ui/components/ui/badge.js +0 -22
  90. package/console/dist/ui/components/ui/button.d.ts +0 -11
  91. package/console/dist/ui/components/ui/button.js +0 -34
  92. package/console/dist/ui/components/ui/card.d.ts +0 -8
  93. package/console/dist/ui/components/ui/card.js +0 -16
  94. package/console/dist/ui/components/ui/charts.d.ts +0 -51
  95. package/console/dist/ui/components/ui/charts.js +0 -72
  96. package/console/dist/ui/components/ui/dialog.d.ts +0 -19
  97. package/console/dist/ui/components/ui/dialog.js +0 -22
  98. package/console/dist/ui/components/ui/input.d.ts +0 -3
  99. package/console/dist/ui/components/ui/input.js +0 -8
  100. package/console/dist/ui/components/ui/markdown.d.ts +0 -24
  101. package/console/dist/ui/components/ui/markdown.js +0 -119
  102. package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
  103. package/console/dist/ui/components/ui/progress-bar.js +0 -38
  104. package/console/dist/ui/components/ui/select.d.ts +0 -13
  105. package/console/dist/ui/components/ui/select.js +0 -26
  106. package/console/dist/ui/components/ui/separator.d.ts +0 -3
  107. package/console/dist/ui/components/ui/separator.js +0 -6
  108. package/console/dist/ui/components/ui/sheet.d.ts +0 -25
  109. package/console/dist/ui/components/ui/sheet.js +0 -37
  110. package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
  111. package/console/dist/ui/components/ui/shiny-text.js +0 -46
  112. package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
  113. package/console/dist/ui/components/ui/skeleton.js +0 -6
  114. package/console/dist/ui/components/ui/sonner.d.ts +0 -3
  115. package/console/dist/ui/components/ui/sonner.js +0 -13
  116. package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
  117. package/console/dist/ui/components/ui/tooltip.js +0 -10
  118. package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
  119. package/console/dist/ui/data/daily-thoughts.js +0 -164
  120. package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
  121. package/console/dist/ui/hooks/useNotificationSound.js +0 -74
  122. package/console/dist/ui/i18n/en.json +0 -2399
  123. package/console/dist/ui/i18n/index.d.ts +0 -2
  124. package/console/dist/ui/i18n/index.js +0 -32
  125. package/console/dist/ui/i18n/zh-CN.json +0 -2399
  126. package/console/dist/ui/main.d.ts +0 -1
  127. package/console/dist/ui/main.js +0 -9
  128. package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
  129. package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
  130. package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
  131. package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
  132. package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
  133. package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
  134. package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
  135. package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
  136. package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
  137. package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
  138. package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
  139. package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
  140. package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
  141. package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
  142. package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
  143. package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
  144. package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
  145. package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
  146. package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
  147. package/console/dist/ui/pages/debt/DebtPage.js +0 -222
  148. package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
  149. package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
  150. package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
  151. package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
  152. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
  153. package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
  154. package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
  155. package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
  156. package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
  157. package/console/dist/ui/pages/focus/FocusPage.js +0 -567
  158. package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
  159. package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
  160. package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
  161. package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
  162. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
  163. package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
  164. package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
  165. package/console/dist/ui/pages/focus/focus-validation.js +0 -211
  166. package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
  167. package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
  168. package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
  169. package/console/dist/ui/pages/intent/IntentPage.js +0 -252
  170. package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
  171. package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
  172. package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
  173. package/console/dist/ui/pages/pain/PainPage.js +0 -420
  174. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
  175. package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
  176. package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
  177. package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
  178. package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
  179. package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
  180. package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
  181. package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
  182. package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
  183. package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
  184. package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
  185. package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
  186. package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
  187. package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
  188. package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
  189. package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
  190. package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
  191. package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
  192. package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
  193. package/console/dist/ui/utils/agent-metadata.js +0 -284
  194. package/console/dist/ui/utils/approval-review.d.ts +0 -30
  195. package/console/dist/ui/utils/approval-review.js +0 -50
  196. package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
  197. package/console/dist/ui/utils/approval-warning-localization.js +0 -148
  198. package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
  199. package/console/dist/ui/utils/attention-presentation.js +0 -46
  200. package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
  201. package/console/dist/ui/utils/blocker-localization.js +0 -36
  202. package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
  203. package/console/dist/ui/utils/control-center-helpers.js +0 -189
  204. package/console/dist/ui/utils/enum-labels.d.ts +0 -50
  205. package/console/dist/ui/utils/enum-labels.js +0 -171
  206. package/console/dist/ui/utils/format-date.d.ts +0 -11
  207. package/console/dist/ui/utils/format-date.js +0 -17
  208. package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
  209. package/console/dist/ui/utils/onboarding-state.js +0 -77
  210. package/console/dist/ui/utils/reading-layout.d.ts +0 -20
  211. package/console/dist/ui/utils/reading-layout.js +0 -46
  212. package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
  213. package/console/dist/ui/utils/rule-binding-validators.js +0 -188
  214. package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
  215. package/console/dist/ui/utils/runtime-mode.js +0 -11
  216. package/console/dist/ui/utils/token-storage.d.ts +0 -22
  217. package/console/dist/ui/utils/token-storage.js +0 -47
  218. package/console/dist/ui/utils/validators.d.ts +0 -1178
  219. package/console/dist/ui/utils/validators.js +0 -3297
  220. package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts +0 -126
  221. package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts.map +0 -1
  222. package/core/dist/runtime-v2/evidence-triage/admission-events.js +0 -159
  223. package/core/dist/runtime-v2/evidence-triage/admission-events.js.map +0 -1
  224. package/plugin/dist/core/detection-funnel.d.ts +0 -47
  225. package/plugin/dist/core/detection-service.d.ts +0 -15
  226. package/release-manager/dist/bootstrap-entry.d.ts +0 -2
  227. package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
  228. package/release-manager/dist/bootstrap-entry.js.map +0 -1
  229. package/release-manager/dist/i18n.d.ts +0 -6
  230. package/release-manager/dist/i18n.d.ts.map +0 -1
  231. package/release-manager/dist/i18n.js.map +0 -1
  232. package/release-manager/dist/index.d.ts +0 -7
  233. package/release-manager/dist/index.d.ts.map +0 -1
  234. package/release-manager/dist/index.js +0 -656
  235. package/release-manager/dist/index.js.map +0 -1
  236. package/release-manager/dist/installer.d.ts +0 -629
  237. package/release-manager/dist/installer.d.ts.map +0 -1
  238. package/release-manager/dist/installer.js.map +0 -1
  239. package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
  240. package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
  241. package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
  242. package/release-manager/dist/installers/index.d.ts +0 -51
  243. package/release-manager/dist/installers/index.d.ts.map +0 -1
  244. package/release-manager/dist/installers/index.js.map +0 -1
  245. package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
  246. package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
  247. package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
  248. package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
  249. package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
  250. package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
  251. package/release-manager/dist/mvp-config.d.ts +0 -233
  252. package/release-manager/dist/mvp-config.d.ts.map +0 -1
  253. package/release-manager/dist/mvp-config.js.map +0 -1
  254. package/release-manager/dist/prompts.d.ts +0 -43
  255. package/release-manager/dist/prompts.d.ts.map +0 -1
  256. package/release-manager/dist/prompts.js +0 -268
  257. package/release-manager/dist/prompts.js.map +0 -1
  258. package/release-manager/dist/skill-language.d.ts +0 -32
  259. package/release-manager/dist/skill-language.d.ts.map +0 -1
  260. package/release-manager/dist/skill-language.js.map +0 -1
  261. package/release-manager/dist/uninstaller.d.ts +0 -68
  262. package/release-manager/dist/uninstaller.d.ts.map +0 -1
  263. package/release-manager/dist/uninstaller.js +0 -746
  264. package/release-manager/dist/uninstaller.js.map +0 -1
  265. package/release-manager/dist/update/apply-payload.d.ts +0 -143
  266. package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
  267. package/release-manager/dist/update/apply-payload.js.map +0 -1
  268. package/release-manager/dist/update/atomic-file.d.ts +0 -35
  269. package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
  270. package/release-manager/dist/update/atomic-file.js.map +0 -1
  271. package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
  272. package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
  273. package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
  274. package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
  275. package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
  276. package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
  277. package/release-manager/dist/update/channel-metadata.d.ts +0 -28
  278. package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
  279. package/release-manager/dist/update/channel-metadata.js.map +0 -1
  280. package/release-manager/dist/update/channel-promotion.d.ts +0 -39
  281. package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
  282. package/release-manager/dist/update/channel-promotion.js +0 -55
  283. package/release-manager/dist/update/channel-promotion.js.map +0 -1
  284. package/release-manager/dist/update/console-surface.d.ts +0 -19
  285. package/release-manager/dist/update/console-surface.d.ts.map +0 -1
  286. package/release-manager/dist/update/console-surface.js.map +0 -1
  287. package/release-manager/dist/update/data-compatibility.d.ts +0 -35
  288. package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
  289. package/release-manager/dist/update/data-compatibility.js +0 -45
  290. package/release-manager/dist/update/data-compatibility.js.map +0 -1
  291. package/release-manager/dist/update/install-layout.d.ts +0 -105
  292. package/release-manager/dist/update/install-layout.d.ts.map +0 -1
  293. package/release-manager/dist/update/install-layout.js.map +0 -1
  294. package/release-manager/dist/update/product-identity.d.ts +0 -70
  295. package/release-manager/dist/update/product-identity.d.ts.map +0 -1
  296. package/release-manager/dist/update/product-identity.js.map +0 -1
  297. package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
  298. package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
  299. package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
  300. package/release-manager/dist/update/release-identity.d.ts +0 -33
  301. package/release-manager/dist/update/release-identity.d.ts.map +0 -1
  302. package/release-manager/dist/update/release-identity.js.map +0 -1
  303. package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
  304. package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
  305. package/release-manager/dist/update/release-manager-authority.js.map +0 -1
  306. package/release-manager/dist/update/release-manager.d.ts +0 -156
  307. package/release-manager/dist/update/release-manager.d.ts.map +0 -1
  308. package/release-manager/dist/update/release-manager.js.map +0 -1
  309. package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
  310. package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
  311. package/release-manager/dist/update/release-metadata-publisher.js +0 -478
  312. package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
  313. package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
  314. package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
  315. package/release-manager/dist/update/release-metadata-source.js.map +0 -1
  316. package/release-manager/dist/update/release-metadata.d.ts +0 -60
  317. package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
  318. package/release-manager/dist/update/release-metadata.js.map +0 -1
  319. package/release-manager/dist/update/release-policy.d.ts +0 -51
  320. package/release-manager/dist/update/release-policy.d.ts.map +0 -1
  321. package/release-manager/dist/update/release-policy.js.map +0 -1
  322. package/release-manager/dist/update/rollback-policy.d.ts +0 -56
  323. package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
  324. package/release-manager/dist/update/rollback-policy.js +0 -61
  325. package/release-manager/dist/update/rollback-policy.js.map +0 -1
  326. package/release-manager/dist/update/transaction-journal.d.ts +0 -212
  327. package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
  328. package/release-manager/dist/update/transaction-journal.js.map +0 -1
  329. package/release-manager/dist/update/trust-metadata.d.ts +0 -55
  330. package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
  331. package/release-manager/dist/update/trust-metadata.js.map +0 -1
  332. package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
  333. package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
  334. package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
  335. package/release-manager/dist/update/update-history.d.ts +0 -46
  336. package/release-manager/dist/update/update-history.d.ts.map +0 -1
  337. package/release-manager/dist/update/update-history.js +0 -123
  338. package/release-manager/dist/update/update-history.js.map +0 -1
  339. package/release-manager/dist/utils/config-file-io.d.ts +0 -34
  340. package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
  341. package/release-manager/dist/utils/config-file-io.js.map +0 -1
  342. package/release-manager/dist/utils/env.d.ts +0 -94
  343. package/release-manager/dist/utils/env.d.ts.map +0 -1
  344. package/release-manager/dist/utils/env.js.map +0 -1
  345. package/release-manager/dist/utils/logger.d.ts +0 -15
  346. package/release-manager/dist/utils/logger.d.ts.map +0 -1
  347. package/release-manager/dist/utils/logger.js.map +0 -1
  348. package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
  349. package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
  350. package/release-manager/dist/utils/workspace-divergence.js.map +0 -1
@@ -1,746 +0,0 @@
1
- /**
2
- * Uninstaller module
3
- *
4
- * ⚠️ Safety principles:
5
- * 1. Only delete plugin system files (~/.openclaw/extensions/principles-disciple)
6
- * 2. Only delete plugin config files (~/.openclaw/principles-disciple.json)
7
- * 3. Never delete any files from user workspace:
8
- * - MD files (AGENTS.md, SOUL.md, etc.)
9
- * - Memory files (.principles/ directory)
10
- * - State files (.state/ directory)
11
- * - Any user data
12
- *
13
- * ADR-0020 §2.3: Multi-host uninstall. Host-side config cleanup (openclaw.json
14
- * entries, ~/.codex/hooks.json entries, wrapper scripts) is delegated to
15
- * HostInstaller.uninstall() implementations. Workspace user data is always
16
- * preserved regardless of host target.
17
- */
18
- import { existsSync, lstatSync, readFileSync } from 'fs';
19
- import fse from 'fs-extra';
20
- import * as path from 'path';
21
- import * as os from 'os';
22
- import { execFileSync } from 'child_process';
23
- import { confirm } from '@inquirer/prompts';
24
- import { logger } from './utils/logger.js';
25
- import { getOpenClawConfigDir, getPluginExtDir, checkOpenClawGateway } from './utils/env.js';
26
- import { getGlobalShimPaths, getInstalledBinDir, getPdRuntimeDir, getPdDir, getPdRuntimeBackupsDir, getInstallManifestPath, isWindows } from './mvp-config.js';
27
- import { parseInstallManifest } from '@principles/install-layout';
28
- import { mergeIntoInstallJson, resolvePdHomePaths } from './update/install-layout.js';
29
- import { readActiveRecord } from './update/transaction-journal.js';
30
- import { setLanguage, t, getLanguage } from './i18n.js';
31
- import { getHostInstallers, WorkBuddyHostInstaller } from './installers/index.js';
32
- /**
33
- * PRI-945: does a filesystem ENTRY exist at p — including a dangling
34
- * symlink/junction whose target is missing? existsSync follows the link and
35
- * returns false for a dangling one, so a removal gate silently strands it.
36
- * lstat checks the link itself. True for any dirent; false on ENOENT/other
37
- * stat error (fail-safe: absent → nothing to remove). Removal itself is
38
- * already dangling-safe (fse.remove → fs.rm {recursive,force} unlinks without
39
- * following the target), so this only fixes the "should I delete" decision.
40
- */
41
- function pathEntryExists(p) {
42
- try {
43
- lstatSync(p);
44
- return true;
45
- }
46
- catch {
47
- return false;
48
- }
49
- }
50
- export function planSharedRuntimeUninstall(host) {
51
- if (host === 'all') {
52
- return { removeSharedRuntime: true, remainingHosts: [], manifestHasTarget: true };
53
- }
54
- try {
55
- const raw = JSON.parse(readFileSync(getInstallManifestPath(), 'utf8'));
56
- const parsed = parseInstallManifest(raw);
57
- if (!parsed.manifest) {
58
- return {
59
- removeSharedRuntime: false,
60
- remainingHosts: [],
61
- manifestHasTarget: false,
62
- warning: `${parsed.error ?? 'install_manifest_malformed'}; shared runtime preserved. Re-run uninstall --host all after repairing ~/.pd/install.json.`,
63
- };
64
- }
65
- const manifestHasTarget = parsed.manifest.hosts.includes(host);
66
- // Unknown host registrations survive an uninstall of a KNOWN host — the
67
- // shared runtime may be serving a newer host this reader cannot name, so
68
- // it is only removable when NO registration (known or unknown) remains.
69
- const remainingHosts = [
70
- ...parsed.manifest.hosts.filter(candidate => candidate !== host),
71
- ...(parsed.manifest.unknownHosts ?? []),
72
- ];
73
- return { removeSharedRuntime: remainingHosts.length === 0, remainingHosts, manifestHasTarget };
74
- }
75
- catch (error) {
76
- return {
77
- removeSharedRuntime: false,
78
- remainingHosts: [],
79
- manifestHasTarget: false,
80
- warning: `install_manifest_unreadable: ${error instanceof Error ? error.message : String(error)}; shared runtime preserved. Re-run uninstall --host all after repairing ~/.pd/install.json.`,
81
- };
82
- }
83
- }
84
- async function detectAndSetLanguage(lang) {
85
- setLanguage(lang === 'en' ? 'en' : 'zh');
86
- }
87
- /**
88
- * Check install status across all hosts (OpenClaw + Codex).
89
- *
90
- * ADR-0020 §2.3: Detects PD install markers for each registered host.
91
- * Returns aggregated status so `pd status` / `npx create-principles-disciple
92
- * status` shows the full picture regardless of which host was selected
93
- * during install.
94
- */
95
- export function checkInstallStatus(host = 'all') {
96
- const configDir = getOpenClawConfigDir();
97
- const lang = getLanguage();
98
- // OpenClaw paths
99
- const openclawPaths = [
100
- { path: getPluginExtDir(), name: lang === 'zh' ? '插件扩展目录' : 'Plugin extension directory', type: 'dir' },
101
- { path: path.join(configDir, 'principles-disciple.json'), name: lang === 'zh' ? 'OpenClaw 配置文件' : 'OpenClaw config file', type: 'file' },
102
- ];
103
- // Codex paths (ADR-0020).
104
- // NOTE: ~/.codex/hooks.json is intentionally NOT in this deletion set.
105
- // It is a shared host config file — CodexHostInstaller.uninstall() removes
106
- // only PD-owned entries (matched by __pd_marker) from it. If it were listed
107
- // here, the generic delete loop below would delete the entire file,
108
- // destroying the user's non-PD Codex hooks. Also, including it would make
109
- // isInstalled=true for any user who merely has a hooks.json, even if PD
110
- // was never installed.
111
- const pdCodexDir = path.join(os.homedir(), '.pd', 'codex');
112
- const codexPaths = [
113
- { path: path.join(pdCodexDir, 'pd-hooks.marker'), name: lang === 'zh' ? 'Codex 安装标记' : 'Codex install marker', type: 'file' },
114
- { path: path.join(pdCodexDir, 'pd-hook-entry.cjs'), name: lang === 'zh' ? 'Codex 钩子入口' : 'Codex hook entry script', type: 'file' },
115
- ];
116
- // WorkBuddy paths (ADR-0020 third host, SPEC workbuddy-host-adapter §6).
117
- // ONLY provably PD-owned artifacts belong here: the PD-owned local
118
- // marketplace directory. Everything else in the WorkBuddy domain is
119
- // deliberately EXCLUDED from the generic delete loop:
120
- // - the governance workspace (~/.workbuddy/pd-workspace) is NEVER a
121
- // deletion candidate — it owns the governance database (OD-07/§18);
122
- // - settings.json / installed_plugins.json / the plugin cache are shared
123
- // or host-owned — WorkBuddyHostInstaller.uninstall() removes only OUR
124
- // entries from them;
125
- // - the shared runtime payload under ~/.pd/runtime is retained per the
126
- // install.json manifest policy (planSharedRuntimeUninstall).
127
- // Review 2026-10-13 S1: without this branch, host==='workbuddy' fell into
128
- // the openclaw+codex union and a WorkBuddy-only uninstall DELETED other
129
- // hosts' files before the host installer ever ran.
130
- const workbuddyPaths = [
131
- { path: path.join(os.homedir(), '.pd', 'workbuddy-marketplace'), name: lang === 'zh' ? 'PD WorkBuddy marketplace(PD 拥有)' : 'PD WorkBuddy marketplace (PD-owned)', type: 'dir' },
132
- ];
133
- const allPaths = host === 'openclaw'
134
- ? openclawPaths
135
- : host === 'codex'
136
- ? codexPaths
137
- : host === 'workbuddy'
138
- ? workbuddyPaths
139
- : [...openclawPaths, ...codexPaths, ...workbuddyPaths];
140
- const checkedPaths = allPaths.map(p => ({
141
- exists: existsSync(p.path),
142
- path: p.path,
143
- name: p.name,
144
- type: p.type,
145
- }));
146
- const isInstalled = checkedPaths.some(p => p.exists);
147
- return { isInstalled, paths: checkedPaths };
148
- }
149
- /**
150
- * 检查 shim 文件是否由 Principles Disciple 创建
151
- * 通过读取文件内容,确认其目标指向 PD 安装目录
152
- */
153
- export function isPdOwnedShim(shimPath) {
154
- try {
155
- const content = readFileSync(shimPath, 'utf-8');
156
- const pdBinDir = getInstalledBinDir();
157
- const pdBinPath = isWindows()
158
- ? path.join(pdBinDir, 'pd.cmd')
159
- : path.join(pdBinDir, 'pd');
160
- if (isWindows()) {
161
- // Windows cmd/ps1 shim 应包含 PD 安装路径
162
- return content.includes(pdBinDir) || content.includes(pdBinPath);
163
- }
164
- else {
165
- // Unix shim 通常是符号链接或脚本,检查是否指向 PD 安装目录
166
- return content.includes(pdBinDir) || content.includes(pdBinPath);
167
- }
168
- }
169
- catch {
170
- return false;
171
- }
172
- }
173
- /**
174
- * Clean up global pd shim files
175
- * Only deletes shims that were created by Principles Disciple
176
- */
177
- async function removeGlobalPdShim() {
178
- const removed = [];
179
- const skipped = [];
180
- const shimPaths = getGlobalShimPaths();
181
- if (shimPaths.length === 0) {
182
- logger.info(t('cannot_detect_npm_global'));
183
- return { removed, skipped };
184
- }
185
- for (const shimPath of shimPaths) {
186
- if (!pathEntryExists(shimPath)) {
187
- skipped.push(shimPath);
188
- continue;
189
- }
190
- if (!isPdOwnedShim(shimPath)) {
191
- logger.warn(`${t('global_command_skip_not_owned')}: ${shimPath}`);
192
- skipped.push(shimPath);
193
- continue;
194
- }
195
- try {
196
- await fse.remove(shimPath);
197
- removed.push(shimPath);
198
- logger.success(`${t('global_command_deleted')}: ${shimPath}`);
199
- }
200
- catch (error) {
201
- logger.warn(`${t('global_command_delete_failed')}: ${shimPath} - ${error instanceof Error ? error.message : String(error)}`);
202
- skipped.push(shimPath);
203
- }
204
- }
205
- return { removed, skipped };
206
- }
207
- /**
208
- * Get user workspace path (for showing preservation notice)
209
- */
210
- function getWorkspacePath() {
211
- const configDir = getOpenClawConfigDir();
212
- const configPath = path.join(configDir, 'principles-disciple.json');
213
- if (!existsSync(configPath))
214
- return null;
215
- // Read and parse JSON directly — require() would execute the file if its
216
- // extension ever changed, and the path must stay inside the config dir.
217
- const resolved = path.resolve(configPath);
218
- if (resolved !== configPath && !resolved.startsWith(configDir + path.sep)) {
219
- return null;
220
- }
221
- try {
222
- const config = JSON.parse(readFileSync(configPath, 'utf-8'));
223
- if (config && typeof config === 'object' && !Array.isArray(config)) {
224
- const workspace = Reflect.get(config, 'workspace');
225
- return typeof workspace === 'string' && workspace.length > 0 ? workspace : null;
226
- }
227
- return null;
228
- }
229
- catch {
230
- return null;
231
- }
232
- }
233
- /**
234
- * Execute uninstall
235
- *
236
- * @param options.force Skip confirmation prompt (dangerous, for scripts only)
237
- * @param options.host ADR-0020 host id: 'openclaw' | 'codex' | 'workbuddy' | 'all' (default 'all')
238
- */
239
- const REMOVE_RETRY_ATTEMPTS = 3;
240
- const REMOVE_RETRY_DELAY_MS = 1000;
241
- /**
242
- * PRI-696: find node processes running the installed PD console server and
243
- * stop them. Without this, a detached auto-launched console keeps native
244
- * modules under ~/.pd/runtime/console locked and the uninstall ends in a
245
- * partial state that only manual PID hunting resolves.
246
- *
247
- * Identification is by command line: the argv must reference the installed
248
- * console server entry (<pdRuntime>/console/dist/server.js) — the same
249
- * command the installer spawns. Never kills anything it cannot attribute.
250
- * ERR-045: argv-array execution only; every value is either a literal or a
251
- * validated JS-side output match, never a shell string.
252
- */
253
- /**
254
- * PRI-710: one RFC4180 CSV line → fields. Handles PowerShell ConvertTo-Csv
255
- * quoting: values are wrapped in double quotes and embedded quotes are
256
- * doubled (""). ConvertTo-Csv does NOT escape backslashes (wmic did), so
257
- * paths arrive verbatim. A comma inside a quoted value must not split.
258
- */
259
- function splitCsvLine(line) {
260
- const fields = [];
261
- let current = '';
262
- let inQuotes = false;
263
- for (let i = 0; i < line.length; i++) {
264
- const char = line.charAt(i);
265
- if (inQuotes) {
266
- if (char === '"') {
267
- if (line.charAt(i + 1) === '"') {
268
- current += '"';
269
- i++;
270
- }
271
- else {
272
- inQuotes = false;
273
- }
274
- }
275
- else {
276
- current += char;
277
- }
278
- }
279
- else if (char === '"' && current === '') {
280
- inQuotes = true;
281
- }
282
- else if (char === ',') {
283
- fields.push(current);
284
- current = '';
285
- }
286
- else {
287
- current += char;
288
- }
289
- }
290
- fields.push(current);
291
- return fields;
292
- }
293
- /**
294
- * PRI-710 (supersedes parseWmicProcessCsv): parse
295
- * `Get-CimInstance Win32_Process | Select-Object ProcessId,CommandLine |
296
- * ConvertTo-Csv -NoTypeInformation` output. Header row is `ProcessId,
297
- * CommandLine` (order as selected); rows without a positive integer PID or
298
- * with an empty CommandLine are skipped. Attribution unchanged: only rows
299
- * whose CommandLine references consoleEntry count. Duplicates are collapsed
300
- * (CIM can surface the same PID twice across brief query windows).
301
- */
302
- export function parseConsoleProcessCsv(output, consoleEntry) {
303
- const results = new Map();
304
- const lines = output.split('\n').map((l) => l.replace(/\r$/, '').trim()).filter((l) => l.length > 0);
305
- let processIdColumn = -1;
306
- let commandLineColumn = -1;
307
- for (const line of lines) {
308
- const fields = splitCsvLine(line);
309
- if (processIdColumn === -1) {
310
- // Header row (first non-empty line): locate columns by name so a
311
- // future property reorder cannot silently misparse PIDs.
312
- processIdColumn = fields.findIndex((f) => f.trim().toLowerCase() === 'processid');
313
- commandLineColumn = fields.findIndex((f) => f.trim().toLowerCase() === 'commandline');
314
- if (processIdColumn === -1 || commandLineColumn === -1) {
315
- // Unrecognized header — refuse to guess column positions (rc-3).
316
- return [];
317
- }
318
- continue;
319
- }
320
- const pidStr = (fields[processIdColumn] ?? '').trim();
321
- const pid = Number.parseInt(pidStr, 10);
322
- if (!Number.isInteger(pid) || pid <= 0 || pid === process.pid)
323
- continue;
324
- const commandLine = (fields[commandLineColumn] ?? '').trim();
325
- if (commandLine === '')
326
- continue;
327
- if (!commandLine.includes(consoleEntry))
328
- continue;
329
- results.set(pid, { pid });
330
- }
331
- return [...results.values()];
332
- }
333
- function findRunningConsoleProcesses() {
334
- const consoleEntry = path.join(getPdRuntimeDir(), 'console', 'dist', 'server.js');
335
- if (!existsSync(consoleEntry))
336
- return [];
337
- try {
338
- // Windows-only: other platforms have no detached-console lock problem
339
- // observed (the EPERM reports so far are all Windows prebuilds).
340
- if (!isWindows())
341
- return [];
342
- // PRI-710: wmic.exe was removed from Windows 11 24H2+ and is not in the
343
- // project command allowlist. Get-CimInstance is the supported successor
344
- // (powershell.exe is allowlisted). The script is passed ENCODED (UTF-16LE
345
- // base64) because Node→PowerShell argv quoting corrupts embedded quotes
346
- // in -Command strings; -EncodedCommand is quote-safe. Output encoding is
347
- // pinned to UTF-8: PowerShell 5.1 pipes use the OEM code page by default
348
- // (cp936 on zh-CN hosts), which would mangle non-ASCII command lines
349
- // before the consoleEntry match. Pipeline is ONE statement (a `|` before
350
- // a `;` separator is an EmptyPipeElement syntax error — caught by the
351
- // PRI-710 real-machine smoke).
352
- const script = [
353
- '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8',
354
- 'Get-CimInstance Win32_Process -Filter "Name=\'node.exe\'" | Select-Object ProcessId,CommandLine | ConvertTo-Csv -NoTypeInformation',
355
- ].join('; ');
356
- const encoded = Buffer.from(script, 'utf16le').toString('base64');
357
- const output = execFileSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-EncodedCommand', encoded], { encoding: 'utf8', timeout: 10_000 });
358
- return parseConsoleProcessCsv(output, consoleEntry);
359
- }
360
- catch {
361
- // PowerShell unavailable/failed — degrade to no-stop; removeWithRetry
362
- // still handles transient locks, and the EPERM path reports the manual
363
- // action.
364
- return [];
365
- }
366
- }
367
- function stopRunningConsoleProcesses() {
368
- const notes = [];
369
- for (const proc of findRunningConsoleProcesses()) {
370
- try {
371
- process.kill(proc.pid, 'SIGTERM');
372
- notes.push(`stopped auto-launched console process (PID ${proc.pid})`);
373
- }
374
- catch {
375
- // Already exited or not ours to kill — removing files will surface any
376
- // remaining lock through the normal EPERM path.
377
- notes.push(`console process PID ${proc.pid} could not be stopped (already exited or access denied)`);
378
- }
379
- }
380
- return notes;
381
- }
382
- async function removeWithRetry(targetPath, _type) {
383
- for (let attempt = 1; attempt <= REMOVE_RETRY_ATTEMPTS; attempt++) {
384
- try {
385
- await fse.remove(targetPath);
386
- return;
387
- }
388
- catch (error) {
389
- const errMsg = error instanceof Error ? error.message : String(error);
390
- const isLockError = errMsg.includes('EPERM') || errMsg.includes('EBUSY') || errMsg.includes('permission');
391
- if (!isLockError || attempt === REMOVE_RETRY_ATTEMPTS)
392
- throw error;
393
- await new Promise(r => setTimeout(r, REMOVE_RETRY_DELAY_MS * attempt));
394
- }
395
- }
396
- }
397
- /**
398
- * PRI-894 / PRI-895: on a full shared-runtime teardown (the last host being
399
- * uninstalled), reclaim the update residue under ~/.pd that the old flow left
400
- * behind: staging/, releases/ and backups/ (a GB-scale disk leak) plus a
401
- * dangling active.json pointing at a release that no longer exists.
402
- *
403
- * This is a §18 destructive path, so deletion is bounded to what can be PROVEN
404
- * safe: it runs only for a full teardown after the runtime dir itself is gone
405
- * (a partial uninstall or a locked runtime preserves everything); it removes
406
- * exactly those three hardcoded directories and never a glob of ~/.pd/* (so
407
- * transactions/ logs/ trust/ channels/ bootstrap/ stay untouched); it deletes
408
- * active.json last and only when readable with a target that is already gone;
409
- * and every removal is failure-open — a locked path lands in deleteErrors
410
- * (result.success=false) and install.json is kept so a re-run can retry.
411
- */
412
- async function reclaimSharedRuntimeResidue(params) {
413
- if (!params.removeSharedRuntime || params.sharedRuntimeRemovalFailed) {
414
- return { reclaimFailed: false };
415
- }
416
- const paths = resolvePdHomePaths(getPdDir());
417
- const backupsDir = getPdRuntimeBackupsDir();
418
- let reclaimFailed = false;
419
- const reclaimed = [];
420
- const preserved = [];
421
- // Read the pointer before touching its targets, so we can decide whether
422
- // releasing it is safe. Absent → null; unreadable/malformed → throw.
423
- // existsSync (follow) is correct HERE: a dangling pointer has no readable
424
- // content, so it stays null and is reclaimed later as a bare link entry.
425
- let active = null;
426
- let activeCorruptReason = null;
427
- if (existsSync(paths.activeRecordPath)) {
428
- try {
429
- active = readActiveRecord(paths.activeRecordPath);
430
- }
431
- catch (err) {
432
- // rc-9: keep WHY the pointer is unreadable so the operator sees it.
433
- activeCorruptReason = err instanceof Error ? err.message : String(err);
434
- }
435
- }
436
- const removeDir = async (dir, name) => {
437
- // PRI-945: lstat, not existsSync — a dangling staging/releases/backups
438
- // junction (interrupted release swap) must still be reclaimed, not skipped.
439
- if (!pathEntryExists(dir))
440
- return;
441
- try {
442
- await removeWithRetry(dir, 'dir');
443
- params.removedDirs.push(dir);
444
- reclaimed.push(`${path.basename(dir)}/`);
445
- }
446
- catch (err) {
447
- reclaimFailed = true;
448
- params.deleteErrors.push({ name, error: err instanceof Error ? err.message : String(err) });
449
- }
450
- };
451
- await removeDir(paths.stagingDir, 'PD update staging');
452
- await removeDir(paths.releasesDir, 'PD update releases');
453
- await removeDir(backupsDir, 'PD update backups');
454
- // PRI-945: lstat, not existsSync — a dangling active.json pointer is still a
455
- // leftover ENTRY to reclaim; the else branch below unlinks it (never following
456
- // the missing target).
457
- if (pathEntryExists(paths.activeRecordPath)) {
458
- if (activeCorruptReason !== null) {
459
- // §18 default-preservation: never delete an unreadable pointer. This is
460
- // intentional (reclaimFailed stays false so install.json is still
461
- // cleaned), so do NOT promise a retry — the file is evidence to remove by
462
- // hand only if the operator is sure.
463
- preserved.push(`active.json is unreadable (${activeCorruptReason}) — kept for diagnosis; remove it manually only if you are sure`);
464
- }
465
- else if (active !== null && existsSync(path.join(paths.releasesDir, active.releaseId))) {
466
- // existsSync (follow) is correct HERE: this asks whether the release
467
- // TARGET still resolves (releases/ removal failed), so the pointer and
468
- // its target must be kept together — not whether the entry exists.
469
- // releases/ removal failed, so the pointer still resolves — keep pointer
470
- // and target together so a re-run can reclaim both.
471
- preserved.push(`active.json still points at releases/${active.releaseId} — kept with its target; re-run to reclaim both`);
472
- }
473
- else {
474
- try {
475
- await removeWithRetry(paths.activeRecordPath, 'file');
476
- params.removedFiles.push(paths.activeRecordPath);
477
- reclaimed.push('active.json');
478
- }
479
- catch (err) {
480
- reclaimFailed = true;
481
- params.deleteErrors.push({ name: 'PD active record', error: err instanceof Error ? err.message : String(err) });
482
- }
483
- }
484
- }
485
- return {
486
- reclaimFailed,
487
- reclaimedNote: reclaimed.length > 0 ? reclaimed.join(', ') : undefined,
488
- preservedNote: preserved.length > 0 ? preserved.join('; ') : undefined,
489
- };
490
- }
491
- export async function uninstall(options = {}) {
492
- await detectAndSetLanguage(options.lang);
493
- const hostTarget = options.host ?? 'all';
494
- const result = {
495
- success: false,
496
- removedDirs: [],
497
- removedFiles: [],
498
- removedGlobalShims: [],
499
- skippedGlobalShims: [],
500
- preservedPaths: [],
501
- };
502
- // PRI-694: refuse BEFORE any probing when we cannot confirm interactively —
503
- // the @inquirer confirm rejects on stdin EOF with an ExitPromptError that
504
- // the global uncaughtException handler swallows ("Goodbye!", exit 0),
505
- // turning the whole uninstall into a silent no-op that looks like success
506
- // in scripts. rc-9: fail loudly with a structured reason instead.
507
- if (!options.force && !process.stdin.isTTY) {
508
- logger.error(t('uninstall_confirmation_required'));
509
- console.log(` ${t('uninstall_confirmation_next')}`);
510
- result.error = t('uninstall_confirmation_required');
511
- return result;
512
- }
513
- try {
514
- const gatewayStatus = hostTarget === 'codex'
515
- ? { isRunning: false, port: undefined, pid: undefined }
516
- : await checkOpenClawGateway();
517
- if (gatewayStatus.isRunning) {
518
- const portInfo = gatewayStatus.port ? ` (port ${gatewayStatus.port})` : '';
519
- const pidInfo = gatewayStatus.pid ? `, PID ${gatewayStatus.pid}` : '';
520
- logger.warn(`OpenClaw gateway is running${portInfo}${pidInfo}.`);
521
- logger.warn(isWindows()
522
- ? '文件可能被占用导致删除失败。建议先关闭 OpenClaw(openclaw gateway stop),然后重新运行卸载。'
523
- : 'Files may be locked. Stop OpenClaw first (openclaw gateway stop), then re-run uninstall.');
524
- console.log('');
525
- }
526
- // 1. Check install status
527
- const status = checkInstallStatus(hostTarget);
528
- const runtimePlan = planSharedRuntimeUninstall(hostTarget);
529
- if (runtimePlan.warning)
530
- logger.warn(runtimePlan.warning);
531
- if (!status.isInstalled && !runtimePlan.manifestHasTarget) {
532
- logger.warn(t('no_install_detected'));
533
- result.success = true;
534
- return result;
535
- }
536
- // 2. Get workspace path and show preservation notice
537
- const workspaceDir = getWorkspacePath();
538
- console.log('\n');
539
- logger.warn(t('uninstall_warning_title'));
540
- console.log(` ${t('uninstall_warning_msg')}`);
541
- console.log('\n');
542
- if (workspaceDir && existsSync(workspaceDir)) {
543
- logger.info(t('workspace_files_preserved'));
544
- console.log(` 📁 ${t('workspace_dir_label')}: ${workspaceDir}`);
545
- console.log(` 📄 ${t('md_files_preserved')}`);
546
- console.log(` 📁 ${t('principles_dir_preserved')}`);
547
- console.log(` 📁 ${t('state_dir_preserved')}`);
548
- console.log('\n');
549
- }
550
- // 3. Show what will be deleted
551
- logger.info(t('plugin_files_will_delete'));
552
- for (const p of status.paths) {
553
- // PRI-945: p.exists is follow-based (via checkInstallStatus, which the
554
- // CLI --check consumer relies on). List a dangling entry too so this
555
- // preview matches what the deletion loop below actually reclaims.
556
- if (p.exists || pathEntryExists(p.path)) {
557
- const icon = p.type === 'dir' ? '📁' : '📄';
558
- console.log(` ${icon} ${p.name}: ${p.path}`);
559
- }
560
- }
561
- console.log('\n');
562
- // 4. Confirm uninstall (unless --force)
563
- if (!options.force) {
564
- const confirmed = await confirm({
565
- message: t('confirm_uninstall'),
566
- default: false,
567
- });
568
- if (!confirmed) {
569
- logger.info(t('uninstall_cancelled'));
570
- result.success = true;
571
- return result;
572
- }
573
- }
574
- // 4b. PRI-696: a running Console (auto-launched by a prior install, kept
575
- // alive detached) locks files under ~/.pd/runtime/console and turns the
576
- // deletion into a partial uninstall. Find PD-identified console processes
577
- // and stop them before deleting — the gateway warning above covers only
578
- // half of the lock sources.
579
- if (hostTarget !== 'codex') {
580
- const stoppedConsoles = stopRunningConsoleProcesses();
581
- for (const note of stoppedConsoles)
582
- logger.info(`[console] ${note}`);
583
- }
584
- // 5. Execute deletion (only plugin system files)
585
- const deleteErrors = [];
586
- for (const p of status.paths) {
587
- // PRI-945 (稳妥 B): do NOT change checkInstallStatus.exists (the CLI
588
- // --check consumer must still see a dangling link as "missing"). Instead
589
- // reclaim a dangling entry at the deletion site: proceed when either the
590
- // resolved target exists OR the link entry itself exists (lstat); the
591
- // remover unlinks it without following a missing target.
592
- if (!p.exists && !pathEntryExists(p.path))
593
- continue;
594
- try {
595
- await removeWithRetry(p.path, p.type);
596
- if (p.type === 'dir') {
597
- result.removedDirs.push(p.path);
598
- }
599
- else {
600
- result.removedFiles.push(p.path);
601
- }
602
- logger.success(`${t('deleted')}: ${p.name}`);
603
- }
604
- catch (error) {
605
- const errMsg = error instanceof Error ? error.message : String(error);
606
- const isPermError = errMsg.includes('EPERM') || errMsg.includes('permission') || errMsg.includes('access denied') || errMsg.includes('EBUSY');
607
- if (isPermError) {
608
- logger.error(`${t('delete_failed')}: ${p.name} - ${errMsg}`);
609
- logger.warn(isWindows()
610
- ? '文件被占用,请先关闭 OpenClaw(openclaw gateway stop),然后手动删除目录或重新运行卸载。'
611
- : 'File is locked. Stop OpenClaw first (openclaw gateway stop), then re-run uninstall or delete manually.');
612
- }
613
- else {
614
- logger.error(`${t('delete_failed')}: ${p.name} - ${errMsg}`);
615
- }
616
- deleteErrors.push({ name: p.name, error: errMsg });
617
- }
618
- }
619
- // 6. The pd shim belongs to the shared runtime. Keep it while another host
620
- // remains attached; otherwise a host-scoped uninstall breaks that host.
621
- if (runtimePlan.removeSharedRuntime) {
622
- console.log('\n');
623
- logger.info(t('cleaning_global_commands'));
624
- const { removed, skipped } = await removeGlobalPdShim();
625
- result.removedGlobalShims = removed;
626
- result.skippedGlobalShims = skipped;
627
- }
628
- else {
629
- logger.info('Keeping the shared pd command because another host still uses the runtime.');
630
- }
631
- // 6.5. ADR-0020 §2.3: Clean up host-side configs via HostInstallers.
632
- // Replaces the old cleanupOpenClawConfig() with multi-host delegation.
633
- // 'all' means "every host PD ever registered with" — WorkBuddy included
634
- // even though its INSTALL is a separate explicit opt-in target (removing
635
- // a registration is cleanup, not opt-in; getHostInstallers('all')
636
- // deliberately stays openclaw+codex for the install direction).
637
- const hostInstallers = hostTarget === 'all'
638
- ? [...getHostInstallers('all'), new WorkBuddyHostInstaller()]
639
- : getHostInstallers(hostTarget);
640
- for (const installer of hostInstallers) {
641
- try {
642
- const ctx = {
643
- language: getLanguage(),
644
- force: options.force === true,
645
- };
646
- const hostResult = await installer.uninstall(ctx);
647
- if (hostResult.success) {
648
- if (hostResult.removedPaths.length > 0) {
649
- logger.success(`Host "${installer.hostId}": cleaned ${hostResult.removedPaths.length} path(s)`);
650
- }
651
- }
652
- else {
653
- logger.warn(`Host "${installer.hostId}" cleanup: ${hostResult.reason ?? 'partial failure'}. Next: ${hostResult.nextAction}`);
654
- }
655
- }
656
- catch (err) {
657
- // rc-9: never silently swallow — surface the failure.
658
- logger.warn(`Host "${installer.hostId}" cleanup threw: ${err instanceof Error ? err.message : String(err)}`);
659
- }
660
- }
661
- // Shared runtime is removed only after the final host is uninstalled.
662
- let sharedRuntimeRemovalFailed = false;
663
- if (runtimePlan.removeSharedRuntime && pathEntryExists(getPdRuntimeDir())) {
664
- try {
665
- await removeWithRetry(getPdRuntimeDir(), 'dir');
666
- result.removedDirs.push(getPdRuntimeDir());
667
- }
668
- catch (err) {
669
- sharedRuntimeRemovalFailed = true;
670
- deleteErrors.push({ name: 'PD shared runtime', error: err instanceof Error ? err.message : String(err) });
671
- }
672
- }
673
- // PRI-894 / PRI-895: reclaim update residue (staging/, releases/, backups/
674
- // and a dangling active.json) while the manifest is still present. It runs
675
- // BEFORE install.json is deleted on purpose: if reclaim fails we keep
676
- // install.json so a re-run still plans a full teardown and retries the
677
- // residue instead of stranding it under a now-missing manifest.
678
- const residueReclaim = await reclaimSharedRuntimeResidue({
679
- removeSharedRuntime: runtimePlan.removeSharedRuntime,
680
- sharedRuntimeRemovalFailed,
681
- deleteErrors,
682
- removedDirs: result.removedDirs,
683
- removedFiles: result.removedFiles,
684
- });
685
- if (residueReclaim.reclaimedNote) {
686
- logger.success(`Reclaimed update residue: ${residueReclaim.reclaimedNote}`);
687
- }
688
- if (residueReclaim.preservedNote) {
689
- logger.warn(`Kept update residue for safety: ${residueReclaim.preservedNote}`);
690
- }
691
- if (runtimePlan.removeSharedRuntime && !sharedRuntimeRemovalFailed && !residueReclaim.reclaimFailed && pathEntryExists(getInstallManifestPath())) {
692
- try {
693
- await removeWithRetry(getInstallManifestPath(), 'file');
694
- result.removedFiles.push(getInstallManifestPath());
695
- }
696
- catch (err) {
697
- deleteErrors.push({ name: 'PD install manifest', error: err instanceof Error ? err.message : String(err) });
698
- }
699
- }
700
- else if (!runtimePlan.removeSharedRuntime && runtimePlan.remainingHosts.length > 0) {
701
- // PRI-709 P0-1: merge instead of replace — a wholesale rewrite dropped
702
- // `workspaces` and every update-side field (channel / autoCheck /
703
- // releaseMetadataUrl).
704
- mergeIntoInstallJson(getInstallManifestPath(), {
705
- layoutVersion: 1,
706
- mode: 'canonical',
707
- hosts: runtimePlan.remainingHosts,
708
- });
709
- }
710
- // 7. Record preserved paths
711
- if (workspaceDir) {
712
- result.preservedPaths.push(workspaceDir);
713
- if (existsSync(path.join(workspaceDir, '.principles'))) {
714
- result.preservedPaths.push(path.join(workspaceDir, '.principles'));
715
- }
716
- if (existsSync(path.join(workspaceDir, '.state'))) {
717
- result.preservedPaths.push(path.join(workspaceDir, '.state'));
718
- }
719
- }
720
- result.success = deleteErrors.length === 0;
721
- if (deleteErrors.length > 0) {
722
- result.error = deleteErrors.map(e => `${e.name}: ${e.error}`).join('; ');
723
- }
724
- console.log('\n');
725
- if (deleteErrors.length > 0) {
726
- logger.warn(t('uninstall_partial') || '卸载部分完成 — 部分文件未能删除,请按上方提示处理。');
727
- }
728
- else {
729
- logger.success(t('uninstall_complete'));
730
- }
731
- console.log('\n');
732
- if (result.preservedPaths.length > 0) {
733
- logger.info(t('personal_data_preserved'));
734
- result.preservedPaths.forEach(p => console.log(` ${p}`));
735
- console.log('\n');
736
- logger.info(t('manual_cleanup_hint'));
737
- }
738
- return result;
739
- }
740
- catch (error) {
741
- result.error = error instanceof Error ? error.message : String(error);
742
- logger.error(`${t('uninstall_failed')}: ${result.error}`);
743
- return result;
744
- }
745
- }
746
- //# sourceMappingURL=uninstaller.js.map