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.
- package/_release/product-identity.json +1 -1
- package/codex-adapter/package.json +1 -1
- package/core/dist/runtime-v2/evidence-triage/index.d.ts +1 -3
- package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/index.js +1 -2
- package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +0 -19
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +0 -25
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +2 -2
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +1 -1
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/telemetry-event.d.ts +2 -2
- package/core/dist/telemetry-event.d.ts.map +1 -1
- package/core/dist/telemetry-event.js +4 -5
- package/core/dist/telemetry-event.js.map +1 -1
- package/core/dist/trajectory-store.d.ts.map +1 -1
- package/core/dist/trajectory-store.js +4 -44
- package/core/dist/trajectory-store.js.map +1 -1
- package/core/package.json +1 -1
- package/host-runtime/package.json +1 -1
- package/package.json +4 -4
- package/plugin/dist/bundle.js +460 -460
- package/plugin/dist/core/config.d.ts +0 -2
- package/plugin/dist/core/trajectory.d.ts +0 -6
- package/plugin/dist/hooks/llm.d.ts +0 -1
- package/plugin/dist/hooks/prompt-helpers.d.ts +2 -1
- package/plugin/dist/hooks/raw-observation-adapter.d.ts +6 -4
- package/plugin/dist/hooks/triage-adapter.d.ts +1 -1
- package/plugin/dist/openclaw.plugin.json +1 -1
- package/plugin/dist/rulehost-evidence.js +6 -6
- package/plugin/dist/templates/pain_settings.json +0 -2
- package/plugin/openclaw.plugin.json +1 -1
- package/plugin/package.json +1 -1
- package/plugin/templates/pain_settings.json +0 -2
- package/release-manager/package.json +4 -4
- package/workbuddy-adapter/package.json +1 -1
- package/console/dist/ui/App.d.ts +0 -1
- package/console/dist/ui/App.js +0 -172
- package/console/dist/ui/api.d.ts +0 -611
- package/console/dist/ui/api.js +0 -1094
- package/console/dist/ui/components/auth/login-form.d.ts +0 -4
- package/console/dist/ui/components/auth/login-form.js +0 -142
- package/console/dist/ui/components/auth/splash-screen.d.ts +0 -9
- package/console/dist/ui/components/auth/splash-screen.js +0 -22
- package/console/dist/ui/components/error-boundary.d.ts +0 -15
- package/console/dist/ui/components/error-boundary.js +0 -30
- package/console/dist/ui/components/focus/daily-thought-card.d.ts +0 -1
- package/console/dist/ui/components/focus/daily-thought-card.js +0 -41
- package/console/dist/ui/components/language-switcher.d.ts +0 -2
- package/console/dist/ui/components/language-switcher.js +0 -17
- package/console/dist/ui/components/layout/app-sidebar.d.ts +0 -27
- package/console/dist/ui/components/layout/app-sidebar.js +0 -128
- package/console/dist/ui/components/layout/page-loading.d.ts +0 -13
- package/console/dist/ui/components/layout/page-loading.js +0 -14
- package/console/dist/ui/components/layout/page-shell.d.ts +0 -12
- package/console/dist/ui/components/layout/page-shell.js +0 -11
- package/console/dist/ui/components/layout/section-title.d.ts +0 -10
- package/console/dist/ui/components/layout/section-title.js +0 -9
- package/console/dist/ui/components/notifications/NotificationProvider.d.ts +0 -14
- package/console/dist/ui/components/notifications/NotificationProvider.js +0 -136
- package/console/dist/ui/components/notifications/favicon-badge.d.ts +0 -3
- package/console/dist/ui/components/notifications/favicon-badge.js +0 -68
- package/console/dist/ui/components/notifications/notification-reducer.d.ts +0 -9
- package/console/dist/ui/components/notifications/notification-reducer.js +0 -9
- package/console/dist/ui/components/notifications/sound-storage.d.ts +0 -3
- package/console/dist/ui/components/notifications/sound-storage.js +0 -37
- package/console/dist/ui/components/notifications/useNotifications.d.ts +0 -1
- package/console/dist/ui/components/notifications/useNotifications.js +0 -9
- package/console/dist/ui/components/onboarding/CircuitDiagram.d.ts +0 -8
- package/console/dist/ui/components/onboarding/CircuitDiagram.js +0 -18
- package/console/dist/ui/components/onboarding/DemoResultView.d.ts +0 -22
- package/console/dist/ui/components/onboarding/DemoResultView.js +0 -33
- package/console/dist/ui/components/onboarding/SlashCommandsCard.d.ts +0 -16
- package/console/dist/ui/components/onboarding/SlashCommandsCard.js +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.d.ts +0 -20
- package/console/dist/ui/components/onboarding/slashCommands.js +0 -22
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.d.ts +0 -6
- package/console/dist/ui/components/receipts/ReceiptCoverageDisclosure.js +0 -66
- package/console/dist/ui/components/theme-provider.d.ts +0 -14
- package/console/dist/ui/components/theme-provider.js +0 -40
- package/console/dist/ui/components/theme-toggle.d.ts +0 -2
- package/console/dist/ui/components/theme-toggle.js +0 -11
- package/console/dist/ui/components/ui/alert-dialog.d.ts +0 -20
- package/console/dist/ui/components/ui/alert-dialog.js +0 -26
- package/console/dist/ui/components/ui/badge.d.ts +0 -9
- package/console/dist/ui/components/ui/badge.js +0 -22
- package/console/dist/ui/components/ui/button.d.ts +0 -11
- package/console/dist/ui/components/ui/button.js +0 -34
- package/console/dist/ui/components/ui/card.d.ts +0 -8
- package/console/dist/ui/components/ui/card.js +0 -16
- package/console/dist/ui/components/ui/charts.d.ts +0 -51
- package/console/dist/ui/components/ui/charts.js +0 -72
- package/console/dist/ui/components/ui/dialog.d.ts +0 -19
- package/console/dist/ui/components/ui/dialog.js +0 -22
- package/console/dist/ui/components/ui/input.d.ts +0 -3
- package/console/dist/ui/components/ui/input.js +0 -8
- package/console/dist/ui/components/ui/markdown.d.ts +0 -24
- package/console/dist/ui/components/ui/markdown.js +0 -119
- package/console/dist/ui/components/ui/progress-bar.d.ts +0 -20
- package/console/dist/ui/components/ui/progress-bar.js +0 -38
- package/console/dist/ui/components/ui/select.d.ts +0 -13
- package/console/dist/ui/components/ui/select.js +0 -26
- package/console/dist/ui/components/ui/separator.d.ts +0 -3
- package/console/dist/ui/components/ui/separator.js +0 -6
- package/console/dist/ui/components/ui/sheet.d.ts +0 -25
- package/console/dist/ui/components/ui/sheet.js +0 -37
- package/console/dist/ui/components/ui/shiny-text.d.ts +0 -28
- package/console/dist/ui/components/ui/shiny-text.js +0 -46
- package/console/dist/ui/components/ui/skeleton.d.ts +0 -3
- package/console/dist/ui/components/ui/skeleton.js +0 -6
- package/console/dist/ui/components/ui/sonner.d.ts +0 -3
- package/console/dist/ui/components/ui/sonner.js +0 -13
- package/console/dist/ui/components/ui/tooltip.d.ts +0 -7
- package/console/dist/ui/components/ui/tooltip.js +0 -10
- package/console/dist/ui/data/daily-thoughts.d.ts +0 -15
- package/console/dist/ui/data/daily-thoughts.js +0 -164
- package/console/dist/ui/hooks/useNotificationSound.d.ts +0 -12
- package/console/dist/ui/hooks/useNotificationSound.js +0 -74
- package/console/dist/ui/i18n/en.json +0 -2399
- package/console/dist/ui/i18n/index.d.ts +0 -2
- package/console/dist/ui/i18n/index.js +0 -32
- package/console/dist/ui/i18n/zh-CN.json +0 -2399
- package/console/dist/ui/main.d.ts +0 -1
- package/console/dist/ui/main.js +0 -9
- package/console/dist/ui/pages/ReportProblemValidators.d.ts +0 -144
- package/console/dist/ui/pages/ReportProblemValidators.js +0 -418
- package/console/dist/ui/pages/activation/ActivationPage.d.ts +0 -1
- package/console/dist/ui/pages/activation/ActivationPage.js +0 -512
- package/console/dist/ui/pages/activation/ActivationValidators.d.ts +0 -20
- package/console/dist/ui/pages/activation/ActivationValidators.js +0 -160
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +0 -31
- package/console/dist/ui/pages/control-center/AgentCard.js +0 -212
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +0 -26
- package/console/dist/ui/pages/control-center/AgentGroup.js +0 -38
- package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +0 -1
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +0 -509
- package/console/dist/ui/pages/control-center/DesignGatePanel.d.ts +0 -1
- package/console/dist/ui/pages/control-center/DesignGatePanel.js +0 -137
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.d.ts +0 -31
- package/console/dist/ui/pages/control-center/RuntimeProfileManager.js +0 -199
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +0 -17
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +0 -55
- package/console/dist/ui/pages/debt/DebtPage.d.ts +0 -2
- package/console/dist/ui/pages/debt/DebtPage.js +0 -222
- package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +0 -2
- package/console/dist/ui/pages/design-system/DesignSystemPage.js +0 -30
- package/console/dist/ui/pages/examiner/ExaminerPage.d.ts +0 -15
- package/console/dist/ui/pages/examiner/ExaminerPage.js +0 -158
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.d.ts +0 -1
- package/console/dist/ui/pages/failed-tasks/FailedTasksPage.js +0 -421
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.d.ts +0 -24
- package/console/dist/ui/pages/focus/ApprovalSubjectReading.js +0 -133
- package/console/dist/ui/pages/focus/FocusPage.d.ts +0 -123
- package/console/dist/ui/pages/focus/FocusPage.js +0 -567
- package/console/dist/ui/pages/focus/OwnerDecisionCard.d.ts +0 -9
- package/console/dist/ui/pages/focus/OwnerDecisionCard.js +0 -111
- package/console/dist/ui/pages/focus/OwnerWorkbench.d.ts +0 -19
- package/console/dist/ui/pages/focus/OwnerWorkbench.js +0 -75
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.d.ts +0 -34
- package/console/dist/ui/pages/focus/RuleCandidateBindingPanel.js +0 -298
- package/console/dist/ui/pages/focus/focus-validation.d.ts +0 -40
- package/console/dist/ui/pages/focus/focus-validation.js +0 -211
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +0 -67
- package/console/dist/ui/pages/intent/IntentOnboarding.js +0 -289
- package/console/dist/ui/pages/intent/IntentPage.d.ts +0 -1
- package/console/dist/ui/pages/intent/IntentPage.js +0 -252
- package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +0 -59
- package/console/dist/ui/pages/pain/PainEvidenceValidators.js +0 -125
- package/console/dist/ui/pages/pain/PainPage.d.ts +0 -1
- package/console/dist/ui/pages/pain/PainPage.js +0 -420
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +0 -175
- package/console/dist/ui/pages/pain/pain-card-helpers.js +0 -181
- package/console/dist/ui/pages/principles/CorePrinciplesPage.d.ts +0 -10
- package/console/dist/ui/pages/principles/CorePrinciplesPage.js +0 -59
- package/console/dist/ui/pages/principles/PrincipleDetailPage.d.ts +0 -60
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +0 -602
- package/console/dist/ui/pages/principles/PrinciplesPage.d.ts +0 -1
- package/console/dist/ui/pages/principles/PrinciplesPage.js +0 -327
- package/console/dist/ui/pages/principles/PrinciplesViewNav.d.ts +0 -8
- package/console/dist/ui/pages/principles/PrinciplesViewNav.js +0 -15
- package/console/dist/ui/pages/report-problem/ReportProblemPage.d.ts +0 -1
- package/console/dist/ui/pages/report-problem/ReportProblemPage.js +0 -467
- package/console/dist/ui/pages/settings/SettingsPage.d.ts +0 -4
- package/console/dist/ui/pages/settings/SettingsPage.js +0 -457
- package/console/dist/ui/pages/settings/UpdatePage.d.ts +0 -1
- package/console/dist/ui/pages/settings/UpdatePage.js +0 -215
- package/console/dist/ui/pages/welcome/WelcomePage.d.ts +0 -5
- package/console/dist/ui/pages/welcome/WelcomePage.js +0 -187
- package/console/dist/ui/utils/agent-metadata.d.ts +0 -71
- package/console/dist/ui/utils/agent-metadata.js +0 -284
- package/console/dist/ui/utils/approval-review.d.ts +0 -30
- package/console/dist/ui/utils/approval-review.js +0 -50
- package/console/dist/ui/utils/approval-warning-localization.d.ts +0 -34
- package/console/dist/ui/utils/approval-warning-localization.js +0 -148
- package/console/dist/ui/utils/attention-presentation.d.ts +0 -35
- package/console/dist/ui/utils/attention-presentation.js +0 -46
- package/console/dist/ui/utils/blocker-localization.d.ts +0 -23
- package/console/dist/ui/utils/blocker-localization.js +0 -36
- package/console/dist/ui/utils/control-center-helpers.d.ts +0 -79
- package/console/dist/ui/utils/control-center-helpers.js +0 -189
- package/console/dist/ui/utils/enum-labels.d.ts +0 -50
- package/console/dist/ui/utils/enum-labels.js +0 -171
- package/console/dist/ui/utils/format-date.d.ts +0 -11
- package/console/dist/ui/utils/format-date.js +0 -17
- package/console/dist/ui/utils/onboarding-state.d.ts +0 -25
- package/console/dist/ui/utils/onboarding-state.js +0 -77
- package/console/dist/ui/utils/reading-layout.d.ts +0 -20
- package/console/dist/ui/utils/reading-layout.js +0 -46
- package/console/dist/ui/utils/rule-binding-validators.d.ts +0 -13
- package/console/dist/ui/utils/rule-binding-validators.js +0 -188
- package/console/dist/ui/utils/runtime-mode.d.ts +0 -11
- package/console/dist/ui/utils/runtime-mode.js +0 -11
- package/console/dist/ui/utils/token-storage.d.ts +0 -22
- package/console/dist/ui/utils/token-storage.js +0 -47
- package/console/dist/ui/utils/validators.d.ts +0 -1178
- package/console/dist/ui/utils/validators.js +0 -3297
- package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts +0 -126
- package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts.map +0 -1
- package/core/dist/runtime-v2/evidence-triage/admission-events.js +0 -159
- package/core/dist/runtime-v2/evidence-triage/admission-events.js.map +0 -1
- package/plugin/dist/core/detection-funnel.d.ts +0 -47
- package/plugin/dist/core/detection-service.d.ts +0 -15
- package/release-manager/dist/bootstrap-entry.d.ts +0 -2
- package/release-manager/dist/bootstrap-entry.d.ts.map +0 -1
- package/release-manager/dist/bootstrap-entry.js.map +0 -1
- package/release-manager/dist/i18n.d.ts +0 -6
- package/release-manager/dist/i18n.d.ts.map +0 -1
- package/release-manager/dist/i18n.js.map +0 -1
- package/release-manager/dist/index.d.ts +0 -7
- package/release-manager/dist/index.d.ts.map +0 -1
- package/release-manager/dist/index.js +0 -656
- package/release-manager/dist/index.js.map +0 -1
- package/release-manager/dist/installer.d.ts +0 -629
- package/release-manager/dist/installer.d.ts.map +0 -1
- package/release-manager/dist/installer.js.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.d.ts +0 -39
- package/release-manager/dist/installers/codex-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/codex-host-installer.js.map +0 -1
- package/release-manager/dist/installers/index.d.ts +0 -51
- package/release-manager/dist/installers/index.d.ts.map +0 -1
- package/release-manager/dist/installers/index.js.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.d.ts +0 -14
- package/release-manager/dist/installers/openclaw-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/openclaw-host-installer.js.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts +0 -335
- package/release-manager/dist/installers/workbuddy-host-installer.d.ts.map +0 -1
- package/release-manager/dist/installers/workbuddy-host-installer.js.map +0 -1
- package/release-manager/dist/mvp-config.d.ts +0 -233
- package/release-manager/dist/mvp-config.d.ts.map +0 -1
- package/release-manager/dist/mvp-config.js.map +0 -1
- package/release-manager/dist/prompts.d.ts +0 -43
- package/release-manager/dist/prompts.d.ts.map +0 -1
- package/release-manager/dist/prompts.js +0 -268
- package/release-manager/dist/prompts.js.map +0 -1
- package/release-manager/dist/skill-language.d.ts +0 -32
- package/release-manager/dist/skill-language.d.ts.map +0 -1
- package/release-manager/dist/skill-language.js.map +0 -1
- package/release-manager/dist/uninstaller.d.ts +0 -68
- package/release-manager/dist/uninstaller.d.ts.map +0 -1
- package/release-manager/dist/uninstaller.js +0 -746
- package/release-manager/dist/uninstaller.js.map +0 -1
- package/release-manager/dist/update/apply-payload.d.ts +0 -143
- package/release-manager/dist/update/apply-payload.d.ts.map +0 -1
- package/release-manager/dist/update/apply-payload.js.map +0 -1
- package/release-manager/dist/update/atomic-file.d.ts +0 -35
- package/release-manager/dist/update/atomic-file.d.ts.map +0 -1
- package/release-manager/dist/update/atomic-file.js.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.d.ts +0 -21
- package/release-manager/dist/update/bootstrap-executor.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-executor.js.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.d.ts +0 -56
- package/release-manager/dist/update/bootstrap-protocol.d.ts.map +0 -1
- package/release-manager/dist/update/bootstrap-protocol.js.map +0 -1
- package/release-manager/dist/update/channel-metadata.d.ts +0 -28
- package/release-manager/dist/update/channel-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/channel-metadata.js.map +0 -1
- package/release-manager/dist/update/channel-promotion.d.ts +0 -39
- package/release-manager/dist/update/channel-promotion.d.ts.map +0 -1
- package/release-manager/dist/update/channel-promotion.js +0 -55
- package/release-manager/dist/update/channel-promotion.js.map +0 -1
- package/release-manager/dist/update/console-surface.d.ts +0 -19
- package/release-manager/dist/update/console-surface.d.ts.map +0 -1
- package/release-manager/dist/update/console-surface.js.map +0 -1
- package/release-manager/dist/update/data-compatibility.d.ts +0 -35
- package/release-manager/dist/update/data-compatibility.d.ts.map +0 -1
- package/release-manager/dist/update/data-compatibility.js +0 -45
- package/release-manager/dist/update/data-compatibility.js.map +0 -1
- package/release-manager/dist/update/install-layout.d.ts +0 -105
- package/release-manager/dist/update/install-layout.d.ts.map +0 -1
- package/release-manager/dist/update/install-layout.js.map +0 -1
- package/release-manager/dist/update/product-identity.d.ts +0 -70
- package/release-manager/dist/update/product-identity.d.ts.map +0 -1
- package/release-manager/dist/update/product-identity.js.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.d.ts +0 -31
- package/release-manager/dist/update/release-asset-manifest.d.ts.map +0 -1
- package/release-manager/dist/update/release-asset-manifest.js.map +0 -1
- package/release-manager/dist/update/release-identity.d.ts +0 -33
- package/release-manager/dist/update/release-identity.d.ts.map +0 -1
- package/release-manager/dist/update/release-identity.js.map +0 -1
- package/release-manager/dist/update/release-manager-authority.d.ts +0 -39
- package/release-manager/dist/update/release-manager-authority.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager-authority.js.map +0 -1
- package/release-manager/dist/update/release-manager.d.ts +0 -156
- package/release-manager/dist/update/release-manager.d.ts.map +0 -1
- package/release-manager/dist/update/release-manager.js.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.d.ts +0 -199
- package/release-manager/dist/update/release-metadata-publisher.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-publisher.js +0 -478
- package/release-manager/dist/update/release-metadata-publisher.js.map +0 -1
- package/release-manager/dist/update/release-metadata-source.d.ts +0 -85
- package/release-manager/dist/update/release-metadata-source.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata-source.js.map +0 -1
- package/release-manager/dist/update/release-metadata.d.ts +0 -60
- package/release-manager/dist/update/release-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/release-metadata.js.map +0 -1
- package/release-manager/dist/update/release-policy.d.ts +0 -51
- package/release-manager/dist/update/release-policy.d.ts.map +0 -1
- package/release-manager/dist/update/release-policy.js.map +0 -1
- package/release-manager/dist/update/rollback-policy.d.ts +0 -56
- package/release-manager/dist/update/rollback-policy.d.ts.map +0 -1
- package/release-manager/dist/update/rollback-policy.js +0 -61
- package/release-manager/dist/update/rollback-policy.js.map +0 -1
- package/release-manager/dist/update/transaction-journal.d.ts +0 -212
- package/release-manager/dist/update/transaction-journal.d.ts.map +0 -1
- package/release-manager/dist/update/transaction-journal.js.map +0 -1
- package/release-manager/dist/update/trust-metadata.d.ts +0 -55
- package/release-manager/dist/update/trust-metadata.d.ts.map +0 -1
- package/release-manager/dist/update/trust-metadata.js.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.d.ts +0 -99
- package/release-manager/dist/update/trust-root-provisioning.d.ts.map +0 -1
- package/release-manager/dist/update/trust-root-provisioning.js.map +0 -1
- package/release-manager/dist/update/update-history.d.ts +0 -46
- package/release-manager/dist/update/update-history.d.ts.map +0 -1
- package/release-manager/dist/update/update-history.js +0 -123
- package/release-manager/dist/update/update-history.js.map +0 -1
- package/release-manager/dist/utils/config-file-io.d.ts +0 -34
- package/release-manager/dist/utils/config-file-io.d.ts.map +0 -1
- package/release-manager/dist/utils/config-file-io.js.map +0 -1
- package/release-manager/dist/utils/env.d.ts +0 -94
- package/release-manager/dist/utils/env.d.ts.map +0 -1
- package/release-manager/dist/utils/env.js.map +0 -1
- package/release-manager/dist/utils/logger.d.ts +0 -15
- package/release-manager/dist/utils/logger.d.ts.map +0 -1
- package/release-manager/dist/utils/logger.js.map +0 -1
- package/release-manager/dist/utils/workspace-divergence.d.ts +0 -36
- package/release-manager/dist/utils/workspace-divergence.d.ts.map +0 -1
- 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
|