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,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Metadata — Control Center agent grouping & role descriptions
|
|
3
|
-
*
|
|
4
|
-
* Pure data module (no React, no I/O). Defines:
|
|
5
|
-
* - Which dependency cluster each of the 9 internal agents belongs to
|
|
6
|
-
* - Bilingual role / detail / impact / tech-detail text for progressive disclosure
|
|
7
|
-
* - Whether toggling the agent off requires inline confirmation (isCore)
|
|
8
|
-
*
|
|
9
|
-
* Content source: design-prototype/control-center.html (approved prototype).
|
|
10
|
-
* Agent names match INTERNAL_AGENT_NAMES from @principles/core (camelCase).
|
|
11
|
-
*
|
|
12
|
-
* ERR entries:
|
|
13
|
-
* - rc-1: pure static data, no untrusted input
|
|
14
|
-
* - rc-2: no `as` bypasses
|
|
15
|
-
* - rc-5: consumers use Object.hasOwn() to look up metadata by agent name
|
|
16
|
-
*/
|
|
17
|
-
// ── Group order (matches render order on the page) ───────────────────────────
|
|
18
|
-
export const GROUP_ORDER = [
|
|
19
|
-
'core_trio',
|
|
20
|
-
'code_chain',
|
|
21
|
-
'quality_polish',
|
|
22
|
-
'sidechain',
|
|
23
|
-
];
|
|
24
|
-
// ── Group metadata ───────────────────────────────────────────────────────────
|
|
25
|
-
export const AGENT_GROUPS = [
|
|
26
|
-
{
|
|
27
|
-
id: 'core_trio',
|
|
28
|
-
labelZh: '核心三件套',
|
|
29
|
-
labelEn: 'Core Trio',
|
|
30
|
-
tag: 'must',
|
|
31
|
-
tagLabelZh: '必须一起开',
|
|
32
|
-
tagLabelEn: 'Must together',
|
|
33
|
-
hintZh: '关掉任何一个,PD 都无法把错误转化为原则',
|
|
34
|
-
hintEn: 'Disabling any one breaks the error-to-principle pipeline',
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
id: 'code_chain',
|
|
38
|
-
labelZh: '代码实现链',
|
|
39
|
-
labelEn: 'Code Chain',
|
|
40
|
-
tag: 'recommend',
|
|
41
|
-
tagLabelZh: '推荐一起开',
|
|
42
|
-
tagLabelEn: 'Recommend together',
|
|
43
|
-
hintZh: '只开 artificer 会降级为纯提示通道;只开 evaluator 无意义',
|
|
44
|
-
hintEn: 'Only artificer degrades to prompt-only; only evaluator is meaningless',
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
id: 'quality_polish',
|
|
48
|
-
labelZh: '质量打磨',
|
|
49
|
-
labelEn: 'Quality Polish',
|
|
50
|
-
tag: 'optional',
|
|
51
|
-
tagLabelZh: '可选 · 单独开关',
|
|
52
|
-
tagLabelEn: 'Optional · toggle individually',
|
|
53
|
-
hintZh: '让原则更精炼,关掉也能用,只是质量略粗',
|
|
54
|
-
hintEn: 'Refines principles; disabling is fine, just slightly rougher quality',
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
id: 'sidechain',
|
|
58
|
-
labelZh: '侧链服务',
|
|
59
|
-
labelEn: 'Sidechain',
|
|
60
|
-
tag: 'independent',
|
|
61
|
-
tagLabelZh: '独立 · 单独开关',
|
|
62
|
-
tagLabelEn: 'Independent · toggle individually',
|
|
63
|
-
hintZh: '不影响主管道,只影响 pain 信号检测精度',
|
|
64
|
-
hintEn: 'Does not affect the main pipeline; only pain signal detection precision',
|
|
65
|
-
},
|
|
66
|
-
];
|
|
67
|
-
// ── Agent metadata (covers all 9 INTERNAL_AGENT_NAMES) ───────────────────────
|
|
68
|
-
export const AGENT_METADATA = {
|
|
69
|
-
diagnostician: {
|
|
70
|
-
name: 'diagnostician',
|
|
71
|
-
group: 'core_trio',
|
|
72
|
-
displayNameZh: '诊断师',
|
|
73
|
-
displayNameEn: 'Diagnostician',
|
|
74
|
-
roleZh: '问"为什么会出错",找到根本原因',
|
|
75
|
-
roleEn: 'Asks "why did it go wrong" and finds the root cause',
|
|
76
|
-
detailZh: '当 Agent 做错了什么,诊断师负责像事故复盘一样追问"为什么",找到根本原因,而不是只记下"出错了"。然后把原因抽象成一条原则候选。\n\n它其实是 3 个子阶段串联:找根因 → 抽象原则 → 决定怎么处理。',
|
|
77
|
-
detailEn: 'When an Agent makes a mistake, the Diagnostician runs a post-mortem asking "why" to find the root cause — not just recording "it failed". It then abstracts the cause into a principle candidate.\n\nIt is actually 3 sub-stages chained: find root cause → abstract principle → decide how to handle.',
|
|
78
|
-
impactLevel: 'danger',
|
|
79
|
-
impactZh: 'Pain 信号无法进入内化管道。诊断是入口,关掉后整个流程瘫痪,无法生成新的原则候选。',
|
|
80
|
-
impactEn: 'Pain signals cannot enter the internalization pipeline. Diagnosis is the entry point; disabling paralyzes the entire flow — no new principle candidates can be generated.',
|
|
81
|
-
techDetailZh: {
|
|
82
|
-
'输入': '`DiagnosticianContextPayload`(pain 信号上下文)',
|
|
83
|
-
'输出': '`DiagnosticianOutputV1` · rootCause / violatedPrinciples / recommendations[] / confidence',
|
|
84
|
-
// PRI-638: the split flag no longer selects an implementation nor
|
|
85
|
-
// disables anything — the capability switch is the agent binding here.
|
|
86
|
-
'编排': '由 `PainSignalBridge` 触发;开关 = 本页面的代理启用开关(`internalAgents.agents.diagnostician.enabled`)',
|
|
87
|
-
'阶段': '`diag_rootcause` → `diag_distiller` → `diag_router`',
|
|
88
|
-
},
|
|
89
|
-
techDetailEn: {
|
|
90
|
-
'Input': '`DiagnosticianContextPayload` (pain signal context)',
|
|
91
|
-
'Output': '`DiagnosticianOutputV1` · rootCause / violatedPrinciples / recommendations[] / confidence',
|
|
92
|
-
// PRI-638: the split flag no longer selects an implementation nor
|
|
93
|
-
// disables anything — the capability switch is the agent binding here.
|
|
94
|
-
'Orchestration': 'Triggered by `PainSignalBridge`; switch = this agent\'s enable toggle (`internalAgents.agents.diagnostician.enabled`)',
|
|
95
|
-
'Stages': '`diag_rootcause` → `diag_distiller` → `diag_router`',
|
|
96
|
-
},
|
|
97
|
-
isCore: true,
|
|
98
|
-
},
|
|
99
|
-
dreamer: {
|
|
100
|
-
name: 'dreamer',
|
|
101
|
-
group: 'core_trio',
|
|
102
|
-
displayNameZh: '梦想家',
|
|
103
|
-
displayNameEn: 'Dreamer',
|
|
104
|
-
roleZh: '想出 2-3 种不同的纠正方案',
|
|
105
|
-
roleEn: 'Proposes 2-3 distinct correction options',
|
|
106
|
-
detailZh: '诊断完成后,梦想家从不同角度提出多个纠正方案——就像 brainstorming,先发散再收敛。每个方案都包含"当时做错了什么 / 应该怎么做 / 为什么"。\n\n它是内化引擎的第一站,接收诊断产物,输出候选方案。',
|
|
107
|
-
detailEn: 'After diagnosis, the Dreamer proposes multiple correction options from different angles — like brainstorming, diverge first then converge. Each option includes "what went wrong / what should be done / why".\n\nIt is the first stop of the internalization engine, receiving diagnosis output and producing candidates.',
|
|
108
|
-
impactLevel: 'danger',
|
|
109
|
-
impactZh: '内化引擎失去入口。Dreamer 是链首,关掉后无候选方案生成,内化瘫痪。',
|
|
110
|
-
impactEn: 'The internalization engine loses its entry point. Dreamer is the chain head; disabling means no candidates are generated — internalization is paralyzed.',
|
|
111
|
-
techDetailZh: {
|
|
112
|
-
'输入': '诊断阶段的 distilled principle / candidate artifact',
|
|
113
|
-
'输出': '`DreamerOutput` · 1-5 个候选,每个含 badDecision / betterDecision / riskLevel / strategicPerspective',
|
|
114
|
-
'注意': '`InternalizationAutoConsumerService` 当前仅自动消费 dreamer,下游需手动触发',
|
|
115
|
-
},
|
|
116
|
-
techDetailEn: {
|
|
117
|
-
'Input': 'Distilled principle / candidate artifact from the diagnosis stage',
|
|
118
|
-
'Output': '`DreamerOutput` · 1-5 candidates, each with badDecision / betterDecision / riskLevel / strategicPerspective',
|
|
119
|
-
'Note': '`InternalizationAutoConsumerService` currently only auto-consumes dreamer; downstream must be triggered manually',
|
|
120
|
-
},
|
|
121
|
-
isCore: true,
|
|
122
|
-
},
|
|
123
|
-
scribe: {
|
|
124
|
-
name: 'scribe',
|
|
125
|
-
group: 'core_trio',
|
|
126
|
-
displayNameZh: '抄写员',
|
|
127
|
-
displayNameEn: 'Scribe',
|
|
128
|
-
roleZh: '把方案写成正式的原则条文',
|
|
129
|
-
roleEn: 'Writes the chosen option into a formal principle statement',
|
|
130
|
-
detailZh: '梦想家给出多个方案后,抄写员负责把选中的方案转写成清晰、可执行的原则条文——就像把会议纪要整理成正式文档。\n\n这条原则文本是后续所有工作的承载者:评估员会反向溯源到这里做质量校验。',
|
|
131
|
-
detailEn: 'After the Dreamer proposes multiple options, the Scribe transforms the selected one into a clear, executable principle statement — like turning meeting notes into a formal document.\n\nThis principle text is the carrier for all downstream work: the Evaluator traces back here for quality checks.',
|
|
132
|
-
impactLevel: 'danger',
|
|
133
|
-
impactZh: '无原则文本产出。Scribe 是原则承载者,关掉后管道断裂,核心瘫痪。',
|
|
134
|
-
impactEn: 'No principle text is produced. Scribe is the principle carrier; disabling breaks the pipeline — core is paralyzed.',
|
|
135
|
-
techDetailZh: {
|
|
136
|
-
'输入': 'Philosopher artifact(或 dreamer 直连)',
|
|
137
|
-
'输出': '`ScribeOutputV1` · principleDraft + sourcePhilosopherArtifactId(lineage 强制校验)',
|
|
138
|
-
'语言': '支持 Owner 偏好语言(`outputLanguage`,PRI-336)',
|
|
139
|
-
},
|
|
140
|
-
techDetailEn: {
|
|
141
|
-
'Input': 'Philosopher artifact (or direct from dreamer)',
|
|
142
|
-
'Output': '`ScribeOutputV1` · principleDraft + sourcePhilosopherArtifactId (lineage enforced)',
|
|
143
|
-
'Language': 'Supports Owner preferred language (`outputLanguage`, PRI-336)',
|
|
144
|
-
},
|
|
145
|
-
isCore: true,
|
|
146
|
-
},
|
|
147
|
-
artificer: {
|
|
148
|
-
name: 'artificer',
|
|
149
|
-
group: 'code_chain',
|
|
150
|
-
displayNameZh: '工匠',
|
|
151
|
-
displayNameEn: 'Artificer',
|
|
152
|
-
roleZh: '把原则变成可执行的拦截代码',
|
|
153
|
-
roleEn: 'Turns the principle into executable interception code',
|
|
154
|
-
detailZh: '原则写好后,工匠负责把它变成代码——一个 `evaluate()` 函数,会在 Agent 发起工具调用时拦截检查。这比"提示词"更刚性、更可靠。\n\n同时生成 golden trace 测试用例,确保代码行为符合预期。',
|
|
155
|
-
detailEn: 'Once the principle is written, the Artificer turns it into code — an `evaluate()` function that intercepts and checks Agent tool calls. This is more rigid and reliable than "prompt wording".\n\nIt also generates golden trace test cases to ensure the code behaves as intended.',
|
|
156
|
-
impactLevel: 'amber',
|
|
157
|
-
impactZh: '降级运行。退回纯 prompt 通道,principle 文本仍可内化,但无 RuleHost 实现代码。',
|
|
158
|
-
impactEn: 'Degraded mode. Falls back to prompt-only channel; principle text can still be internalized, but no RuleHost implementation code.',
|
|
159
|
-
techDetailZh: {
|
|
160
|
-
'输入': 'Scribe artifact(principleDraft)',
|
|
161
|
-
'输出': '`ArtificerRuleOutput` · implementationCode + goldenTraceCases + affectedTools',
|
|
162
|
-
'信任边界': 'activation-capable,LLM 输出作 `unknown` 处理,validateOutput + lineage 通过才 commit',
|
|
163
|
-
'L2 模式': '`rulehost-code-generation` flag 开启 write-test-fix 循环(沙盒回放 → 重试,最多 3 次)',
|
|
164
|
-
},
|
|
165
|
-
techDetailEn: {
|
|
166
|
-
'Input': 'Scribe artifact (principleDraft)',
|
|
167
|
-
'Output': '`ArtificerRuleOutput` · implementationCode + goldenTraceCases + affectedTools',
|
|
168
|
-
'Trust boundary': 'activation-capable; LLM output treated as `unknown`; commit only after validateOutput + lineage pass',
|
|
169
|
-
'L2 mode': '`rulehost-code-generation` flag enables write-test-fix loop (sandbox replay → retry, max 3)',
|
|
170
|
-
},
|
|
171
|
-
isCore: true,
|
|
172
|
-
},
|
|
173
|
-
evaluator: {
|
|
174
|
-
name: 'evaluator',
|
|
175
|
-
group: 'code_chain',
|
|
176
|
-
displayNameZh: '评估员',
|
|
177
|
-
displayNameEn: 'Evaluator',
|
|
178
|
-
roleZh: '审查原则和代码质量,决定能否生效',
|
|
179
|
-
roleEn: 'Reviews principle & code quality, decides whether it can activate',
|
|
180
|
-
detailZh: '工匠写完代码后,评估员做质量审查:原则是否清晰?代码是否符合原则意图?有没有覆盖足够多的场景?\n\n给出 approved / needs_revision / rejected 决策。只有 approved 的原则才能通过 RuleHost 通道激活。',
|
|
181
|
-
detailEn: 'After the Artificer writes the code, the Evaluator does a quality review: is the principle clear? Does the code match the principle intent? Does it cover enough scenarios?\n\nIt returns an approved / needs_revision / rejected decision. Only approved principles can activate via the RuleHost channel.',
|
|
182
|
-
impactLevel: 'amber',
|
|
183
|
-
impactZh: '降级运行。Principle 仍写入,但无 validated 标记,RuleHost 通道无法激活。',
|
|
184
|
-
impactEn: 'Degraded mode. Principle is still written, but without the validated mark — RuleHost channel cannot activate.',
|
|
185
|
-
techDetailZh: {
|
|
186
|
-
'输入': 'Artificer artifact + Scribe artifact(反向溯源 principle 文本)',
|
|
187
|
-
'输出': '`EvaluatorOutputV1/V2` · decision + score + strengths/concerns + codeReview',
|
|
188
|
-
'V2 模式': '运行 adversarial sandbox replay,通过则持久化 `artifactKind: "rule"` artifact',
|
|
189
|
-
},
|
|
190
|
-
techDetailEn: {
|
|
191
|
-
'Input': 'Artificer artifact + Scribe artifact (reverse-traces principle text)',
|
|
192
|
-
'Output': '`EvaluatorOutputV1/V2` · decision + score + strengths/concerns + codeReview',
|
|
193
|
-
'V2 mode': 'Runs adversarial sandbox replay; on pass, persists `artifactKind: "rule"` artifact',
|
|
194
|
-
},
|
|
195
|
-
isCore: true,
|
|
196
|
-
},
|
|
197
|
-
philosopher: {
|
|
198
|
-
name: 'philosopher',
|
|
199
|
-
group: 'quality_polish',
|
|
200
|
-
displayNameZh: '哲学家',
|
|
201
|
-
displayNameEn: 'Philosopher',
|
|
202
|
-
roleZh: '从多个方案中选出最优并精炼',
|
|
203
|
-
roleEn: 'Selects the best option from multiple candidates and refines it',
|
|
204
|
-
detailZh: '梦想家给出多个方案后,哲学家负责收敛——选出最优的一个,精炼成单一原则候选。\n\n关掉它,梦想家的产出会直接交给抄写员,原则可能略粗糙,但人工审批时仍可修改。',
|
|
205
|
-
detailEn: 'After the Dreamer proposes multiple options, the Philosopher converges — selects the best one and refines it into a single principle candidate.\n\nDisabling it means the Dreamer output goes directly to the Scribe; principles may be slightly rougher, but can still be edited during Owner review.',
|
|
206
|
-
impactLevel: 'green',
|
|
207
|
-
impactZh: '无影响。Dreamer 产出直接给 Scribe,质量略粗但人工审批可纠正。属设计预期。',
|
|
208
|
-
impactEn: 'No impact. Dreamer output goes directly to Scribe; slightly rougher quality but Owner review can correct. This is by design.',
|
|
209
|
-
techDetailZh: {
|
|
210
|
-
'MVP 状态': 'MVP-Quiet(ADR-0014 §2.5)。默认关闭,代码保留。',
|
|
211
|
-
'输出': '`PhilosopherOutputV1` · principleCandidate + sourceDreamerArtifactId',
|
|
212
|
-
},
|
|
213
|
-
techDetailEn: {
|
|
214
|
-
'MVP status': 'MVP-Quiet (ADR-0014 §2.5). Off by default; code retained.',
|
|
215
|
-
'Output': '`PhilosopherOutputV1` · principleCandidate + sourceDreamerArtifactId',
|
|
216
|
-
},
|
|
217
|
-
isCore: false,
|
|
218
|
-
mvpNoteZh: 'MVP-Quiet(ADR-0014 §2.5)。默认关闭,代码保留。',
|
|
219
|
-
mvpNoteEn: 'MVP-Quiet (ADR-0014 §2.5). Off by default; code retained.',
|
|
220
|
-
},
|
|
221
|
-
rolloutReviewer: {
|
|
222
|
-
name: 'rolloutReviewer',
|
|
223
|
-
group: 'quality_polish',
|
|
224
|
-
displayNameZh: '上线评审员',
|
|
225
|
-
displayNameEn: 'Rollout Reviewer',
|
|
226
|
-
roleZh: '原则生效前的最后一道审查',
|
|
227
|
-
roleEn: 'Final review before a principle goes live',
|
|
228
|
-
detailZh: '评估员通过后,上线评审员做最终把关——评估上线风险、安全检查,决定是否真的推向 rollout。\n\n它在 MVP_CORE_TASK_KINDS 白名单中(队列可见),但 auto-consumer 不会自动推进它——作为原则进入 approval 队列前的最后一道人工关,由 Owner 手动触发。',
|
|
229
|
-
detailEn: 'After the Evaluator passes, the Rollout Reviewer does the final gate — assessing rollout risks and safety checks, deciding whether to actually push to rollout.\n\nIt is in the MVP_CORE_TASK_KINDS whitelist (visible in the queue), but the auto-consumer does NOT advance it — it is the last manual Owner gate before the approval queue, triggered by hand.',
|
|
230
|
-
impactLevel: 'green',
|
|
231
|
-
impactZh: '手动触发的最后关。不被 auto-consumer 自动消费。',
|
|
232
|
-
impactEn: 'Manual last gate. Not auto-consumed by the auto-consumer.',
|
|
233
|
-
techDetailZh: {
|
|
234
|
-
'MVP 状态': 'MVP-Core(手动)。在 `MVP_CORE_TASK_KINDS` 中,但不被 auto-consumer 自动推进——由 Owner 手动触发(`pd runtime internalization run-once --runner rollout_reviewer`)。',
|
|
235
|
-
'输出': '`RolloutReviewerOutputV1` · approve_rollout / needs_revision / reject + rolloutRisks + safetyChecks',
|
|
236
|
-
'实现': '唯一不继承 `BasePeerRunner` 的 peer runner',
|
|
237
|
-
},
|
|
238
|
-
techDetailEn: {
|
|
239
|
-
'MVP status': 'MVP-Core (manual). In `MVP_CORE_TASK_KINDS`, but NOT auto-advanced — triggered by hand (pd runtime internalization run-once --runner rollout_reviewer).',
|
|
240
|
-
'Output': '`RolloutReviewerOutputV1` · approve_rollout / needs_revision / reject + rolloutRisks + safetyChecks',
|
|
241
|
-
'Implementation': 'The only peer runner that does not extend `BasePeerRunner`',
|
|
242
|
-
},
|
|
243
|
-
isCore: true,
|
|
244
|
-
mvpNoteZh: 'MVP-Core(手动触发)。在白名单中但不被 auto-consumer 自动消费。',
|
|
245
|
-
mvpNoteEn: 'MVP-Core (manual trigger). In the whitelist but not auto-consumed.',
|
|
246
|
-
},
|
|
247
|
-
correctionObserver: {
|
|
248
|
-
name: 'correctionObserver',
|
|
249
|
-
group: 'sidechain',
|
|
250
|
-
displayNameZh: '纠正观察员',
|
|
251
|
-
displayNameEn: 'Correction Observer',
|
|
252
|
-
roleZh: '后台优化"纠错关键词",减少误报',
|
|
253
|
-
roleEn: 'Background optimizer for "correction keywords", reducing false positives',
|
|
254
|
-
detailZh: 'PD 用一组关键词检测 Agent 是否在被纠正。但关键词会过时或误报。纠正观察员定期审查历史,自动调整关键词权重,衰减误报。\n\n它在后台每 15 分钟跑一次,不影响主管道。',
|
|
255
|
-
detailEn: 'PD uses a set of keywords to detect whether an Agent is being corrected. But keywords go stale or produce false positives. The Correction Observer periodically reviews history, auto-adjusting keyword weights and decaying false positives.\n\nIt runs in the background every 15 minutes and does not affect the main pipeline.',
|
|
256
|
-
impactLevel: 'amber',
|
|
257
|
-
impactZh: '纠错关键词停止自优化。确定性 pain 检测仍工作,但误报会逐步累积。',
|
|
258
|
-
impactEn: 'Correction keywords stop self-optimizing. Deterministic pain detection still works, but false positives gradually accumulate.',
|
|
259
|
-
techDetailZh: {},
|
|
260
|
-
techDetailEn: {},
|
|
261
|
-
isCore: true,
|
|
262
|
-
// action link removed in PRI-819: it pointed at the retired signal-keywords
|
|
263
|
-
// page (every endpoint was a stub); keyword learning is automatic via
|
|
264
|
-
// correctionObserver → keyword store → governance-signal-admission.
|
|
265
|
-
},
|
|
266
|
-
// empathyObserver card removed in PRI-819: the agent had no runtime consumer;
|
|
267
|
-
// empathy detection lives in signalCollector (keyword + LLM deep judgment).
|
|
268
|
-
signalCollector: {
|
|
269
|
-
name: 'signalCollector',
|
|
270
|
-
group: 'sidechain',
|
|
271
|
-
displayNameZh: '信号采集器',
|
|
272
|
-
displayNameEn: 'Signal Collector',
|
|
273
|
-
roleZh: '统一捕捉用户纠正与情绪反馈(合并原 correction + empathy)',
|
|
274
|
-
roleEn: 'Unified capture of user corrections and emotional feedback (merges former correction + empathy)',
|
|
275
|
-
detailZh: '以前有两套并行的用户反馈检测:correction(抓"你错了")和 empathy(抓情绪挫败),词库重叠且各自维护。\n\n信号采集器把两者合并成一套:关键词快扫 + 本地 LLM 深度判断,按信号强度分流——明确纠错直接触发诊断,情绪推测走 GFI 累积。',
|
|
276
|
-
detailEn: 'Previously there were two parallel user-feedback detectors: correction (catching "you are wrong") and empathy (catching emotional frustration), with overlapping keyword stores maintained separately.\n\nThe Signal Collector merges them into one: keyword fast-scan + local LLM deep judgment, routed by signal strength — explicit corrections trigger diagnosis directly, emotional inference accumulates via GFI.',
|
|
277
|
-
impactLevel: 'amber',
|
|
278
|
-
impactZh: '退回纯关键词检测(高精度短语仍工作),LLM 深度判断关闭。歧义词和未命中场景召回率下降。',
|
|
279
|
-
impactEn: 'Falls back to keyword-only detection (high-precision phrases still work); LLM deep judgment disabled. Recall drops for ambiguous terms and missed cases.',
|
|
280
|
-
techDetailZh: {},
|
|
281
|
-
techDetailEn: {},
|
|
282
|
-
isCore: false,
|
|
283
|
-
},
|
|
284
|
-
};
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { type ApprovalRecordData } from './validators.js';
|
|
2
|
-
export type ApprovalReviewGuard = {
|
|
3
|
-
schemaVersion: 'approval-review-v1';
|
|
4
|
-
approvalId: string;
|
|
5
|
-
artifactId: string;
|
|
6
|
-
channel: 'prompt' | 'code_tool_hook' | 'defer_archive';
|
|
7
|
-
} & ({
|
|
8
|
-
artifactState: 'present';
|
|
9
|
-
artifactDigest: string;
|
|
10
|
-
} | {
|
|
11
|
-
artifactState: 'missing';
|
|
12
|
-
});
|
|
13
|
-
export interface ApprovalReviewData {
|
|
14
|
-
approval: ApprovalRecordData;
|
|
15
|
-
expectedReview: ApprovalReviewGuard;
|
|
16
|
-
material: {
|
|
17
|
-
availability: 'available' | 'missing' | 'unreadable';
|
|
18
|
-
artifactId: string;
|
|
19
|
-
statement: string | null;
|
|
20
|
-
rationale: string | null;
|
|
21
|
-
targetBehavior: string | null;
|
|
22
|
-
scope: string[];
|
|
23
|
-
risks: string[] | null;
|
|
24
|
-
exactBody: {
|
|
25
|
-
kind: 'principle' | 'rule_code';
|
|
26
|
-
text: string;
|
|
27
|
-
} | null;
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
export declare function validateApprovalReview(value: unknown): ApprovalReviewData | null;
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { validateApprovalRecordDirect } from './validators.js';
|
|
2
|
-
function record(v) { return v !== null && typeof v === 'object' && !Array.isArray(v); }
|
|
3
|
-
export function validateApprovalReview(value) {
|
|
4
|
-
if (!record(value) || value.writeGuardVersion !== 'approval-review-v1' || !record(value.review))
|
|
5
|
-
return null;
|
|
6
|
-
const approval = validateApprovalRecordDirect(value);
|
|
7
|
-
const guard = value.review.expectedReview;
|
|
8
|
-
const { material } = value.review;
|
|
9
|
-
if (!approval || !record(guard) || guard.schemaVersion !== 'approval-review-v1' || guard.approvalId !== approval.approvalId
|
|
10
|
-
|| guard.artifactId !== approval.artifactId || guard.channel !== approval.channel
|
|
11
|
-
|| !['prompt', 'code_tool_hook', 'defer_archive'].includes(String(guard.channel))
|
|
12
|
-
|| (guard.artifactState !== 'present' && guard.artifactState !== 'missing')
|
|
13
|
-
|| (guard.artifactState === 'present' && (typeof guard.artifactDigest !== 'string' || !/^sha256:[a-f0-9]{64}$/.test(guard.artifactDigest)))
|
|
14
|
-
|| !record(material) || material.artifactId !== approval.artifactId
|
|
15
|
-
|| !['available', 'missing', 'unreadable'].includes(String(material.availability))
|
|
16
|
-
|| (material.statement !== null && typeof material.statement !== 'string')
|
|
17
|
-
|| (material.rationale !== null && typeof material.rationale !== 'string')
|
|
18
|
-
|| (material.targetBehavior !== null && typeof material.targetBehavior !== 'string')
|
|
19
|
-
|| !Array.isArray(material.scope) || !material.scope.every(item => typeof item === 'string')
|
|
20
|
-
|| (material.risks !== null && (!Array.isArray(material.risks) || !material.risks.every(item => typeof item === 'string'))))
|
|
21
|
-
return null;
|
|
22
|
-
if (guard.artifactState === 'missing' && (material.availability !== 'missing' || material.exactBody !== null || material.statement !== null || Object.hasOwn(guard, 'artifactDigest')))
|
|
23
|
-
return null;
|
|
24
|
-
if (guard.artifactState === 'present' && material.availability === 'missing')
|
|
25
|
-
return null;
|
|
26
|
-
const body = material.exactBody;
|
|
27
|
-
let exactBody = null;
|
|
28
|
-
if (body !== null) {
|
|
29
|
-
if (!record(body) || (body.kind !== 'principle' && body.kind !== 'rule_code') || typeof body.text !== 'string')
|
|
30
|
-
return null;
|
|
31
|
-
exactBody = { kind: body.kind, text: body.text };
|
|
32
|
-
}
|
|
33
|
-
const { channel } = guard;
|
|
34
|
-
if (channel !== 'prompt' && channel !== 'code_tool_hook' && channel !== 'defer_archive')
|
|
35
|
-
return null;
|
|
36
|
-
// The reader treats a material body as present exactly when availability says so;
|
|
37
|
-
// a payload that disagrees must fail loud rather than render the wrong preview.
|
|
38
|
-
if ((material.availability === 'available') !== (exactBody !== null))
|
|
39
|
-
return null;
|
|
40
|
-
if (exactBody !== null && (channel === 'code_tool_hook') !== (exactBody.kind === 'rule_code'))
|
|
41
|
-
return null;
|
|
42
|
-
const expectedReview = guard.artifactState === 'present' && typeof guard.artifactDigest === 'string'
|
|
43
|
-
? { schemaVersion: 'approval-review-v1', approvalId: approval.approvalId, artifactId: approval.artifactId, channel, artifactState: 'present', artifactDigest: guard.artifactDigest }
|
|
44
|
-
: { schemaVersion: 'approval-review-v1', approvalId: approval.approvalId, artifactId: approval.artifactId, channel, artifactState: 'missing' };
|
|
45
|
-
const { availability } = material;
|
|
46
|
-
if (availability !== 'available' && availability !== 'missing' && availability !== 'unreadable')
|
|
47
|
-
return null;
|
|
48
|
-
return { approval, expectedReview, material: { availability, artifactId: approval.artifactId, statement: material.statement,
|
|
49
|
-
rationale: material.rationale, targetBehavior: material.targetBehavior, scope: material.scope, risks: material.risks, exactBody } };
|
|
50
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approval warning localization (PRI-908).
|
|
3
|
-
*
|
|
4
|
-
* Approve responses carry non-fatal warnings as raw English technical strings
|
|
5
|
-
* (PRI-890, rc-9). This module maps known warning codes to Owner-facing i18n
|
|
6
|
-
* templates; unrecognized text falls back to the raw string so information is
|
|
7
|
-
* never lost. Dependency-free like blocker-localization.ts so UI tests can
|
|
8
|
-
* exercise the real behavior directly.
|
|
9
|
-
*/
|
|
10
|
-
export type TranslateFn = (key: string, opts?: Record<string, unknown>) => string;
|
|
11
|
-
export interface LocalizedApprovalWarning {
|
|
12
|
-
/** Stable machine code when recognized, otherwise 'unknown'. */
|
|
13
|
-
code: string;
|
|
14
|
-
/** Localized headline, or the raw server text when the code is unknown. */
|
|
15
|
-
title: string;
|
|
16
|
-
/** Localized plain-language body; present only for recognized codes. */
|
|
17
|
-
body?: string;
|
|
18
|
-
/** Raw server text, for the expandable details line (rc-9: never dropped). */
|
|
19
|
-
detail: string;
|
|
20
|
-
/** Whether to offer the Owner a jump to the activation page. */
|
|
21
|
-
activationAction: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* The server joins per-record warnings with "; " (ApprovalsConsoleModel.approve),
|
|
25
|
-
* so one successWarnings entry can carry several codes. Split only where a
|
|
26
|
-
* segment STARTS with a new "code:" pattern — "; the activation is committed"
|
|
27
|
-
* inside a message body must not split. Unrecognized text stays one segment.
|
|
28
|
-
*/
|
|
29
|
-
export declare function splitApprovalWarnings(joined: string): string[];
|
|
30
|
-
/**
|
|
31
|
-
* Localize one server warning. Unknown codes degrade to the raw server text
|
|
32
|
-
* verbatim (title === detail) — never a placeholder, never dropped (rc-9).
|
|
33
|
-
*/
|
|
34
|
-
export declare function localizeApprovalWarning(warning: string, t: TranslateFn): LocalizedApprovalWarning;
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Approval warning localization (PRI-908).
|
|
3
|
-
*
|
|
4
|
-
* Approve responses carry non-fatal warnings as raw English technical strings
|
|
5
|
-
* (PRI-890, rc-9). This module maps known warning codes to Owner-facing i18n
|
|
6
|
-
* templates; unrecognized text falls back to the raw string so information is
|
|
7
|
-
* never lost. Dependency-free like blocker-localization.ts so UI tests can
|
|
8
|
-
* exercise the real behavior directly.
|
|
9
|
-
*/
|
|
10
|
-
/** A warning is "<code>: <free text>" — the code itself is always snake_case. */
|
|
11
|
-
function splitWarningCode(warning) {
|
|
12
|
-
const trimmed = warning.trim();
|
|
13
|
-
const separator = trimmed.indexOf(':');
|
|
14
|
-
if (separator === -1)
|
|
15
|
-
return { code: 'unknown', message: trimmed };
|
|
16
|
-
const head = trimmed.slice(0, separator);
|
|
17
|
-
if (!/^[a-z][a-z0-9_]*$/.test(head))
|
|
18
|
-
return { code: 'unknown', message: trimmed };
|
|
19
|
-
return { code: head, message: trimmed.slice(separator + 1).trim() };
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* The server joins per-record warnings with "; " (ApprovalsConsoleModel.approve),
|
|
23
|
-
* so one successWarnings entry can carry several codes. Split only where a
|
|
24
|
-
* segment STARTS with a new "code:" pattern — "; the activation is committed"
|
|
25
|
-
* inside a message body must not split. Unrecognized text stays one segment.
|
|
26
|
-
*/
|
|
27
|
-
export function splitApprovalWarnings(joined) {
|
|
28
|
-
return joined.split(/;\s*(?=[a-z][a-z0-9_]*:\s)/).map((segment) => segment.trim()).filter((segment) => segment.length > 0);
|
|
29
|
-
}
|
|
30
|
-
/** Digits immediately after `prefix`, ended by any non-digit — else null. */
|
|
31
|
-
function intAfterPrefix(message, prefix) {
|
|
32
|
-
const start = message.indexOf(prefix);
|
|
33
|
-
if (start === -1)
|
|
34
|
-
return null;
|
|
35
|
-
const valueStart = start + prefix.length;
|
|
36
|
-
let end = valueStart;
|
|
37
|
-
while (end < message.length && message.charCodeAt(end) >= 48 && message.charCodeAt(end) <= 57)
|
|
38
|
-
end += 1;
|
|
39
|
-
if (end === valueStart)
|
|
40
|
-
return null;
|
|
41
|
-
return Number(message.slice(valueStart, end));
|
|
42
|
-
}
|
|
43
|
-
/** Digit run between `startMarker` and `endMarker` (first occurrence) — else null. */
|
|
44
|
-
function captureDigitsAfter(message, startMarker, endMarker) {
|
|
45
|
-
const start = message.indexOf(startMarker);
|
|
46
|
-
if (start === -1)
|
|
47
|
-
return null;
|
|
48
|
-
const valueStart = start + startMarker.length;
|
|
49
|
-
let end = valueStart;
|
|
50
|
-
while (end < message.length && message.charCodeAt(end) >= 48 && message.charCodeAt(end) <= 57)
|
|
51
|
-
end += 1;
|
|
52
|
-
if (end === valueStart)
|
|
53
|
-
return null;
|
|
54
|
-
if (message.indexOf(endMarker, end) !== end)
|
|
55
|
-
return null;
|
|
56
|
-
return Number(message.slice(valueStart, end));
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Localize one server warning. Unknown codes degrade to the raw server text
|
|
60
|
-
* verbatim (title === detail) — never a placeholder, never dropped (rc-9).
|
|
61
|
-
*/
|
|
62
|
-
export function localizeApprovalWarning(warning, t) {
|
|
63
|
-
const { code, message } = splitWarningCode(warning);
|
|
64
|
-
const base = { code, detail: warning.trim() };
|
|
65
|
-
if (code === 'injection_budget_excluded') {
|
|
66
|
-
const budget = intAfterPrefix(message, '(');
|
|
67
|
-
// The server reports "<injected>/<eligible> eligible injected"; the digit
|
|
68
|
-
// precedes the label, so parse the ratio directly instead of scanning after it.
|
|
69
|
-
const injectedMatch = /(\d+)\/(\d+) eligible/.exec(message);
|
|
70
|
-
const injectedCount = injectedMatch?.[1] !== undefined ? Number(injectedMatch[1]) : null;
|
|
71
|
-
return {
|
|
72
|
-
...base,
|
|
73
|
-
title: t('pages.focus.approveWarning.budgetExcludedTitle'),
|
|
74
|
-
// PRI-875 precedent: a template with placeholders is only safe to use
|
|
75
|
-
// when every value was parsed — otherwise fall back to the
|
|
76
|
-
// placeholder-free variant so no raw "{{budget}}" ever reaches the UI.
|
|
77
|
-
body: budget !== null && injectedCount !== null
|
|
78
|
-
? t('pages.focus.approveWarning.budgetExcludedBody', { budget, earlierCount: injectedCount })
|
|
79
|
-
: t('pages.focus.approveWarning.budgetExcludedBodySimple'),
|
|
80
|
-
activationAction: true,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// PR-1894: the activation is merely rotated out of the CURRENT window, not
|
|
84
|
-
// starved. This is the common case on a live fair-rotation workspace and the
|
|
85
|
-
// copy must NOT tell the Owner to deactivate healthy older principles.
|
|
86
|
-
if (code === 'injection_budget_queued') {
|
|
87
|
-
const budget = intAfterPrefix(message, '(');
|
|
88
|
-
const turnsMatch = /within at most (\d+) consecutive user turns/.exec(message);
|
|
89
|
-
const turns = turnsMatch?.[1] !== undefined ? Number(turnsMatch[1]) : null;
|
|
90
|
-
return {
|
|
91
|
-
...base,
|
|
92
|
-
title: t('pages.focus.approveWarning.queuedTitle'),
|
|
93
|
-
body: budget !== null && turns !== null
|
|
94
|
-
? t('pages.focus.approveWarning.queuedBody', { budget, turns })
|
|
95
|
-
: t('pages.focus.approveWarning.queuedBodySimple'),
|
|
96
|
-
activationAction: false,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
if (code === 'injection_excluded_non_budget') {
|
|
100
|
-
return {
|
|
101
|
-
...base,
|
|
102
|
-
title: t('pages.focus.approveWarning.excludedTitle'),
|
|
103
|
-
body: t('pages.focus.approveWarning.excludedNonBudgetBody'),
|
|
104
|
-
activationAction: true,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
if (code === 'injection_budget_check_failed') {
|
|
108
|
-
return {
|
|
109
|
-
...base,
|
|
110
|
-
title: t('pages.focus.approveWarning.checkFailedTitle'),
|
|
111
|
-
body: t('pages.focus.approveWarning.checkFailedBody'),
|
|
112
|
-
activationAction: true,
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
// PD_PROMPT_CAPACITY_V1 AC-02/R-A3: 超长是与 truncated 无关的独立事实——
|
|
116
|
-
// 批准后反馈必须直接说"这条本身装不下",而不是笼统的预算排除。
|
|
117
|
-
if (code === 'injection_oversized') {
|
|
118
|
-
// server text: "... exceeds the cap (2000 chars, measured in UTF-16 ..."
|
|
119
|
-
const costDigits = captureDigitsAfter(message, '(', ' chars');
|
|
120
|
-
return {
|
|
121
|
-
...base,
|
|
122
|
-
title: t('pages.focus.approveWarning.oversizedTitle'),
|
|
123
|
-
body: costDigits !== null
|
|
124
|
-
? t('pages.focus.approveWarning.oversizedBody', { cost: costDigits })
|
|
125
|
-
: t('pages.focus.approveWarning.oversizedBodySimple'),
|
|
126
|
-
activationAction: true,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// AC-01: 路由事实无法确认时,批准后反馈明说"未确认"并列出各宿主预测,
|
|
130
|
-
// 不猜测 FIFO 或轮转。
|
|
131
|
-
if (code === 'injection_capacity_unconfirmed') {
|
|
132
|
-
return {
|
|
133
|
-
...base,
|
|
134
|
-
title: t('pages.focus.approveWarning.capacityUnconfirmedTitle'),
|
|
135
|
-
body: t('pages.focus.approveWarning.capacityUnconfirmedBody'),
|
|
136
|
-
activationAction: true,
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
if (code === 'ledger_activate_skipped' || code === 'ledger_activate_failed') {
|
|
140
|
-
return {
|
|
141
|
-
...base,
|
|
142
|
-
title: t('pages.focus.approveWarning.ledgerTitle'),
|
|
143
|
-
body: t('pages.focus.approveWarning.ledgerBody'),
|
|
144
|
-
activationAction: false,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
return { ...base, title: warning.trim(), activationAction: false };
|
|
148
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Presentation-side grouping for the governance card's per-task lists (PRI-903).
|
|
3
|
-
*
|
|
4
|
-
* `governance.attention.items` and `governance.dataQuality.issues` are produced
|
|
5
|
-
* one-entry-per-task by the core governance projection — the data layer is
|
|
6
|
-
* correct, and its per-entry sourceRefs stay intact there. Rendering those
|
|
7
|
-
* arrays 1:1 still floods the card with dozens of identical sentences when many
|
|
8
|
-
* historical tasks share one reasonCode, drowning genuine single anomalies.
|
|
9
|
-
* Grouping here is presentation-only.
|
|
10
|
-
*/
|
|
11
|
-
export interface HasReasonCode {
|
|
12
|
-
reasonCode: string;
|
|
13
|
-
}
|
|
14
|
-
export interface ReasonGroup {
|
|
15
|
-
reasonCode: string;
|
|
16
|
-
/** How many entries share this reasonCode; integer ≥ 1 by construction. */
|
|
17
|
-
count: number;
|
|
18
|
-
}
|
|
19
|
-
export type TranslateFn = (key: string, opts?: Record<string, unknown>) => string;
|
|
20
|
-
/**
|
|
21
|
-
* Localize one grouped list line (PRI-903 review round).
|
|
22
|
-
*
|
|
23
|
-
* `templatePrefix` is the i18n block holding the per-reasonCode sentence
|
|
24
|
-
* (e.g. `principles.detail.governance.attention`). The count suffix is appended
|
|
25
|
-
* only when the reason recurs; its `{{n}}` template receives the group count,
|
|
26
|
-
* which is a locally derived integer — never raw unknown data.
|
|
27
|
-
*/
|
|
28
|
-
export declare function formatGroupedReasonLine(t: TranslateFn, templatePrefix: string, group: ReasonGroup): string;
|
|
29
|
-
/**
|
|
30
|
-
* Group items by reasonCode. Smaller groups sort first so singleton anomalies
|
|
31
|
-
* (one failed task, one missing verdict) surface above large historical groups
|
|
32
|
-
* of identical text. The sort is stable, so equal-count groups keep the order
|
|
33
|
-
* in which their reason first appears in the projection input.
|
|
34
|
-
*/
|
|
35
|
-
export declare function groupByReasonCode(items: HasReasonCode[]): ReasonGroup[];
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Presentation-side grouping for the governance card's per-task lists (PRI-903).
|
|
3
|
-
*
|
|
4
|
-
* `governance.attention.items` and `governance.dataQuality.issues` are produced
|
|
5
|
-
* one-entry-per-task by the core governance projection — the data layer is
|
|
6
|
-
* correct, and its per-entry sourceRefs stay intact there. Rendering those
|
|
7
|
-
* arrays 1:1 still floods the card with dozens of identical sentences when many
|
|
8
|
-
* historical tasks share one reasonCode, drowning genuine single anomalies.
|
|
9
|
-
* Grouping here is presentation-only.
|
|
10
|
-
*/
|
|
11
|
-
const SAME_REASON_COUNT_KEY = 'principles.detail.governance.sameReasonCount';
|
|
12
|
-
/**
|
|
13
|
-
* Localize one grouped list line (PRI-903 review round).
|
|
14
|
-
*
|
|
15
|
-
* `templatePrefix` is the i18n block holding the per-reasonCode sentence
|
|
16
|
-
* (e.g. `principles.detail.governance.attention`). The count suffix is appended
|
|
17
|
-
* only when the reason recurs; its `{{n}}` template receives the group count,
|
|
18
|
-
* which is a locally derived integer — never raw unknown data.
|
|
19
|
-
*/
|
|
20
|
-
export function formatGroupedReasonLine(t, templatePrefix, group) {
|
|
21
|
-
const sentence = t(`${templatePrefix}.${group.reasonCode}`, { defaultValue: group.reasonCode });
|
|
22
|
-
return group.count > 1 ? sentence + t(SAME_REASON_COUNT_KEY, { n: group.count }) : sentence;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Group items by reasonCode. Smaller groups sort first so singleton anomalies
|
|
26
|
-
* (one failed task, one missing verdict) surface above large historical groups
|
|
27
|
-
* of identical text. The sort is stable, so equal-count groups keep the order
|
|
28
|
-
* in which their reason first appears in the projection input.
|
|
29
|
-
*/
|
|
30
|
-
export function groupByReasonCode(items) {
|
|
31
|
-
const counts = new Map();
|
|
32
|
-
for (const item of items) {
|
|
33
|
-
counts.set(item.reasonCode, (counts.get(item.reasonCode) ?? 0) + 1);
|
|
34
|
-
}
|
|
35
|
-
const seen = new Set();
|
|
36
|
-
const groups = [];
|
|
37
|
-
for (const item of items) {
|
|
38
|
-
if (seen.has(item.reasonCode))
|
|
39
|
-
continue;
|
|
40
|
-
seen.add(item.reasonCode);
|
|
41
|
-
const count = counts.get(item.reasonCode);
|
|
42
|
-
if (count !== undefined)
|
|
43
|
-
groups.push({ reasonCode: item.reasonCode, count });
|
|
44
|
-
}
|
|
45
|
-
return groups.sort((a, b) => a.count - b.count);
|
|
46
|
-
}
|