create-principles-disciple 1.82.0 → 1.83.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/console/dist/server/config/pd-config-store.d.ts +135 -0
- package/console/dist/server/config/pd-config-store.js +660 -0
- package/console/dist/server/index.js +40 -389
- package/console/dist/server/models/ActivationsConsoleModel.d.ts +33 -0
- package/console/dist/server/models/ActivationsConsoleModel.js +112 -0
- package/console/dist/server/models/ApprovalsConsoleModel.d.ts +5 -0
- package/console/dist/server/models/ApprovalsConsoleModel.js +14 -0
- package/console/dist/server/models/ApprovalsGroupedConsoleModel.d.ts +25 -0
- package/console/dist/server/models/ApprovalsGroupedConsoleModel.js +126 -0
- package/console/dist/server/models/ConsoleLifecycleDatasource.d.ts +13 -0
- package/console/dist/server/models/ConsoleLifecycleDatasource.js +73 -0
- package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +58 -0
- package/console/dist/server/models/EvidenceChainConsoleModel.js +493 -0
- package/console/dist/server/models/GovernanceConsoleModel.d.ts +74 -0
- package/console/dist/server/models/GovernanceConsoleModel.js +246 -0
- package/console/dist/server/models/HealthCheckModel.d.ts +0 -4
- package/console/dist/server/models/HealthCheckModel.js +49 -80
- package/console/dist/server/models/LifecycleConsoleModel.d.ts +19 -0
- package/console/dist/server/models/LifecycleConsoleModel.js +55 -0
- package/console/dist/server/models/PrincipleClassifier.d.ts +41 -0
- package/console/dist/server/models/PrincipleClassifier.js +100 -0
- package/console/dist/server/models/PrinciplesConsoleModel.d.ts +12 -1
- package/console/dist/server/models/PrinciplesConsoleModel.js +53 -6
- package/console/dist/server/models/WorkspaceService.d.ts +2 -1
- package/console/dist/server/models/WorkspaceService.js +51 -23
- package/console/dist/server/routes/activations.d.ts +3 -0
- package/console/dist/server/routes/activations.js +111 -0
- package/console/dist/server/routes/approvals-grouped.d.ts +3 -0
- package/console/dist/server/routes/approvals-grouped.js +32 -0
- package/console/dist/server/routes/approvals.js +28 -4
- package/console/dist/server/routes/config.d.ts +27 -0
- package/console/dist/server/routes/config.js +213 -0
- package/console/dist/server/routes/evidence-chain.d.ts +9 -0
- package/console/dist/server/routes/evidence-chain.js +32 -0
- package/console/dist/server/routes/governance.d.ts +3 -0
- package/console/dist/server/routes/governance.js +32 -0
- package/console/dist/server/routes/{evolution.d.ts → lifecycle.d.ts} +2 -2
- package/console/dist/server/routes/lifecycle.js +48 -0
- package/console/dist/server/routes/principles.js +74 -1
- package/console/dist/server/routes/workspaces.js +8 -1
- package/console/dist/server/utils/response.d.ts +1 -1
- package/console/dist/server/utils/response.js +6 -2
- package/console/dist/types.d.ts +1 -0
- package/console/dist/ui/App.js +116 -40
- package/console/dist/ui/api.d.ts +88 -501
- package/console/dist/ui/api.js +139 -162
- package/console/dist/ui/components/approval-card.js +1 -1
- package/console/dist/ui/components/approval-detail-dialog.js +1 -1
- package/console/dist/ui/components/auth/login-form.d.ts +3 -0
- package/console/dist/ui/components/auth/login-form.js +36 -0
- package/console/dist/ui/components/auth/splash-screen.d.ts +8 -0
- package/console/dist/ui/components/auth/splash-screen.js +22 -0
- package/console/dist/ui/components/layout/app-sidebar.d.ts +1 -0
- package/console/dist/ui/components/layout/app-sidebar.js +56 -0
- package/console/dist/ui/components/layout/page-shell.d.ts +11 -0
- package/console/dist/ui/components/layout/page-shell.js +10 -0
- package/console/dist/ui/components/layout/section-title.d.ts +10 -0
- package/console/dist/ui/components/layout/section-title.js +9 -0
- package/console/dist/ui/components/theme-provider.d.ts +1 -1
- package/console/dist/ui/components/theme-provider.js +13 -8
- package/console/dist/ui/components/theme-toggle.js +2 -21
- package/console/dist/ui/components/ui/badge.d.ts +1 -1
- package/console/dist/ui/components/ui/badge.js +7 -5
- package/console/dist/ui/components/ui/button.d.ts +2 -2
- package/console/dist/ui/components/ui/button.js +12 -11
- package/console/dist/ui/components/ui/card.js +6 -6
- package/console/dist/ui/components/ui/sheet.d.ts +1 -1
- package/console/dist/ui/i18n/en.json +401 -343
- package/console/dist/ui/i18n/index.js +2 -2
- package/console/dist/ui/i18n/zh-CN.json +406 -348
- package/console/dist/ui/main.d.ts +1 -1
- package/console/dist/ui/main.js +1 -0
- package/console/dist/ui/pages/activation/ActivationPage.d.ts +1 -0
- package/console/dist/ui/pages/activation/ActivationPage.js +150 -0
- package/console/dist/ui/pages/activation/ActivationValidators.d.ts +20 -0
- package/console/dist/ui/pages/activation/ActivationValidators.js +156 -0
- package/console/dist/ui/pages/control-center/ControlCenterPage.d.ts +1 -0
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +447 -0
- package/console/dist/ui/pages/debt/DebtPage.d.ts +1 -0
- package/console/dist/ui/pages/debt/DebtPage.js +5 -0
- package/console/dist/ui/pages/design-system/DesignSystemPage.d.ts +1 -0
- package/console/dist/ui/pages/design-system/DesignSystemPage.js +30 -0
- package/console/dist/ui/pages/focus/FocusPage.d.ts +1 -0
- package/console/dist/ui/pages/focus/FocusPage.js +265 -0
- package/console/dist/ui/pages/pain/PainEvidenceValidators.d.ts +59 -0
- package/console/dist/ui/pages/pain/PainEvidenceValidators.js +125 -0
- package/console/dist/ui/pages/pain/PainPage.js +136 -0
- package/console/dist/ui/pages/principles/PrincipleDetailPage.js +264 -0
- package/console/dist/ui/pages/principles/PrinciplesPage.js +244 -0
- package/console/dist/ui/pages/report-problem/ReportProblemPage.js +245 -0
- package/console/dist/ui/pages/settings/SettingsPage.d.ts +4 -0
- package/console/dist/ui/pages/settings/SettingsPage.js +202 -0
- package/console/dist/ui/pages/settings/UpdatePage.d.ts +5 -0
- package/console/dist/ui/pages/settings/UpdatePage.js +168 -0
- package/console/dist/ui/utils/control-center-helpers.d.ts +58 -0
- package/console/dist/ui/utils/control-center-helpers.js +152 -0
- package/console/dist/ui/utils/validators.d.ts +350 -0
- package/console/dist/ui/utils/validators.js +995 -0
- package/console/dist/web/assets/app.css +672 -902
- package/console/dist/web/assets/app.js +6404 -15347
- package/console/dist/web/assets/jetbrains-mono-cyrillic-400-normal-C5JECUCT.woff2 +0 -0
- package/console/dist/web/assets/jetbrains-mono-cyrillic-400-normal-FGCZYWMY.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-cyrillic-ext-400-normal-C7IFWGF6.woff2 +0 -0
- package/console/dist/web/assets/jetbrains-mono-cyrillic-ext-400-normal-PWXUA557.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-greek-400-normal-JJNQZMPZ.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-greek-400-normal-O7JTTR3P.woff2 +0 -0
- package/console/dist/web/assets/jetbrains-mono-latin-400-normal-3OOWLGQ2.woff2 +0 -0
- package/console/dist/web/assets/jetbrains-mono-latin-400-normal-WDD34GPP.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-latin-ext-400-normal-55RNMRQS.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-latin-ext-400-normal-JVR3IR4Z.woff2 +0 -0
- package/console/dist/web/assets/jetbrains-mono-vietnamese-400-normal-7ULXAK72.woff +0 -0
- package/console/dist/web/assets/jetbrains-mono-vietnamese-400-normal-KU7YLUPA.woff2 +0 -0
- package/console/package.json +2 -1
- package/core/dist/runtime-v2/__tests__/admission-gate.test.js +49 -0
- package/core/dist/runtime-v2/__tests__/admission-gate.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +16 -1
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts +21 -0
- package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.js +354 -0
- package/core/dist/runtime-v2/__tests__/evidence-sanitizer.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/language-directive.test.d.ts +12 -0
- package/core/dist/runtime-v2/__tests__/language-directive.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/language-directive.test.js +162 -0
- package/core/dist/runtime-v2/__tests__/language-directive.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +23 -1
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js +48 -3
- package/core/dist/runtime-v2/__tests__/pain-to-principle-service.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +13 -1
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts +12 -0
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js +194 -0
- package/core/dist/runtime-v2/__tests__/resolve-runtime-config-from-pd-config.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/runtime-config-boundary.test.js +5 -3
- package/core/dist/runtime-v2/__tests__/runtime-config-boundary.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +1 -0
- package/core/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js +54 -0
- package/core/dist/runtime-v2/activation/__tests__/approval-queue.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/memory-activation-state-store.test.js +15 -2
- package/core/dist/runtime-v2/activation/__tests__/memory-activation-state-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js +10 -0
- package/core/dist/runtime-v2/activation/__tests__/prompt-activation-reader-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +17 -2
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +36 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/activation-dispatcher.js +1 -1
- package/core/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
- package/core/dist/runtime-v2/activation/activation-types.d.ts +10 -0
- package/core/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/activation-types.js.map +1 -1
- package/core/dist/runtime-v2/activation/approval-queue.d.ts +6 -0
- package/core/dist/runtime-v2/activation/approval-queue.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/approval-queue.js +3 -0
- package/core/dist/runtime-v2/activation/approval-queue.js.map +1 -1
- package/core/dist/runtime-v2/activation/memory-activation-state-store.d.ts +2 -0
- package/core/dist/runtime-v2/activation/memory-activation-state-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/memory-activation-state-store.js +17 -1
- package/core/dist/runtime-v2/activation/memory-activation-state-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/memory-approval-store.d.ts +6 -0
- package/core/dist/runtime-v2/activation/memory-approval-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/memory-approval-store.js +16 -0
- package/core/dist/runtime-v2/activation/memory-approval-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js +1 -1
- package/core/dist/runtime-v2/activation/prompt-activation-reader-contract.js.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts +2 -0
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +34 -6
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts +6 -0
- package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js +10 -0
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
- package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js +51 -1
- package/core/dist/runtime-v2/adapter/__tests__/json-extractor.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js +145 -0
- package/core/dist/runtime-v2/adapter/__tests__/openclaw-cli-runtime-adapter.test.js.map +1 -1
- package/core/dist/runtime-v2/adapter/json-extractor.d.ts +13 -0
- package/core/dist/runtime-v2/adapter/json-extractor.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/json-extractor.js +103 -0
- package/core/dist/runtime-v2/adapter/json-extractor.js.map +1 -1
- package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts +4 -2
- package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.d.ts.map +1 -1
- package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js +57 -5
- package/core/dist/runtime-v2/adapter/openclaw-cli-runtime-adapter.js.map +1 -1
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts +18 -0
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js +633 -0
- package/core/dist/runtime-v2/config/__tests__/pd-config-agent-binding.test.js.map +1 -0
- package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js +92 -0
- package/core/dist/runtime-v2/config/__tests__/pd-config-validation-edge-cases.test.js.map +1 -1
- package/core/dist/runtime-v2/config/index.d.ts +3 -1
- package/core/dist/runtime-v2/config/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/index.js +1 -0
- package/core/dist/runtime-v2/config/index.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts +93 -0
- package/core/dist/runtime-v2/config/pd-config-agent-binding.d.ts.map +1 -0
- package/core/dist/runtime-v2/config/pd-config-agent-binding.js +184 -0
- package/core/dist/runtime-v2/config/pd-config-agent-binding.js.map +1 -0
- package/core/dist/runtime-v2/config/pd-config-defaults.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-defaults.js +2 -0
- package/core/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-effective.js +3 -0
- package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-types.d.ts +8 -0
- package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts +13 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js +97 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js.map +1 -0
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +3 -2
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician-prompt-builder.js +6 -4
- package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/evidence-sanitizer.d.ts +57 -0
- package/core/dist/runtime-v2/evidence-sanitizer.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-sanitizer.js +213 -0
- package/core/dist/runtime-v2/evidence-sanitizer.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.d.ts +7 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js +170 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/admission-events.test.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts +18 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js +277 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/source-descriptors.test.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts +13 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +264 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts +16 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js +316 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/trigger-controller.test.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts +126 -0
- package/core/dist/runtime-v2/evidence-triage/admission-events.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/admission-events.js +159 -0
- package/core/dist/runtime-v2/evidence-triage/admission-events.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/index.d.ts +16 -0
- package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/index.js +13 -0
- package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +48 -0
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +131 -0
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts +32 -0
- package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/triage-policy.js +95 -0
- package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/trigger-controller.d.ts +116 -0
- package/core/dist/runtime-v2/evidence-triage/trigger-controller.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/trigger-controller.js +218 -0
- package/core/dist/runtime-v2/evidence-triage/trigger-controller.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/types.d.ts +65 -0
- package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/types.js +38 -0
- package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +10 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +1 -0
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +8 -1
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +7 -1
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.d.ts +12 -0
- package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.js +83 -0
- package/core/dist/runtime-v2/internalization/__tests__/scribe-prompt-language.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts +10 -0
- package/core/dist/runtime-v2/internalization/scribe-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-prompt-builder.js +13 -1
- package/core/dist/runtime-v2/internalization/scribe-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts +3 -0
- package/core/dist/runtime-v2/internalization/scribe-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/scribe-runner.js +2 -0
- package/core/dist/runtime-v2/internalization/scribe-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization-chain-integrity-read-model.js +1 -1
- package/core/dist/runtime-v2/internalization-chain-integrity-read-model.js.map +1 -1
- package/core/dist/runtime-v2/language-directive.d.ts +80 -0
- package/core/dist/runtime-v2/language-directive.d.ts.map +1 -0
- package/core/dist/runtime-v2/language-directive.js +108 -0
- package/core/dist/runtime-v2/language-directive.js.map +1 -0
- package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-observability.js +24 -11
- package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +16 -0
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js +97 -6
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/core/dist/runtime-v2/pain-to-principle-service.d.ts +7 -0
- package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
- package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.d.ts.map +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.js +14 -0
- package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
- package/core/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js +40 -0
- package/core/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/runner/base-peer-runner.js +1 -0
- package/core/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/core/dist/runtime-v2/runner/diagnostician-runner-options.d.ts +10 -0
- package/core/dist/runtime-v2/runner/diagnostician-runner-options.d.ts.map +1 -1
- package/core/dist/runtime-v2/runner/diagnostician-runner-options.js +1 -0
- package/core/dist/runtime-v2/runner/diagnostician-runner-options.js.map +1 -1
- package/core/dist/runtime-v2/runner/diagnostician-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/runner/diagnostician-runner.js +28 -4
- package/core/dist/runtime-v2/runner/diagnostician-runner.js.map +1 -1
- package/core/dist/runtime-v2/runner/peer-runner-types.d.ts +9 -0
- package/core/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.integration.test.js +34 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.integration.test.js.map +1 -1
- package/core/dist/runtime-v2/store/runtime-state-manager.js +1 -0
- package/core/dist/runtime-v2/store/runtime-state-manager.js.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js +9 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js +1 -1
- package/core/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/core/dist/runtime-v2/task-status.d.ts +4 -4
- package/core/dist/runtime-v2/task-status.d.ts.map +1 -1
- package/core/dist/runtime-v2/task-status.js +2 -2
- package/core/dist/runtime-v2/task-status.js.map +1 -1
- package/core/package.json +1 -1
- package/package.json +2 -2
- package/pd-cli/dist/commands/console.d.ts +2 -0
- package/pd-cli/dist/commands/console.d.ts.map +1 -1
- package/pd-cli/dist/commands/console.js +6 -1
- package/pd-cli/dist/commands/console.js.map +1 -1
- package/pd-cli/dist/commands/diagnose.d.ts.map +1 -1
- package/pd-cli/dist/commands/diagnose.js +18 -1
- package/pd-cli/dist/commands/diagnose.js.map +1 -1
- package/pd-cli/dist/commands/pain-evidence.d.ts +41 -0
- package/pd-cli/dist/commands/pain-evidence.d.ts.map +1 -0
- package/pd-cli/dist/commands/pain-evidence.js +177 -0
- package/pd-cli/dist/commands/pain-evidence.js.map +1 -0
- package/pd-cli/dist/commands/pain-record.d.ts.map +1 -1
- package/pd-cli/dist/commands/pain-record.js +24 -9
- package/pd-cli/dist/commands/pain-record.js.map +1 -1
- package/pd-cli/dist/commands/pain-retry.d.ts +19 -0
- package/pd-cli/dist/commands/pain-retry.d.ts.map +1 -0
- package/pd-cli/dist/commands/pain-retry.js +485 -0
- package/pd-cli/dist/commands/pain-retry.js.map +1 -0
- package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-once.js +59 -9
- package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
- package/pd-cli/dist/commands/runtime-uat.d.ts +1 -0
- package/pd-cli/dist/commands/runtime-uat.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-uat.guard.test.d.ts +2 -0
- package/pd-cli/dist/commands/runtime-uat.guard.test.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-uat.guard.test.js +155 -0
- package/pd-cli/dist/commands/runtime-uat.guard.test.js.map +1 -0
- package/pd-cli/dist/commands/runtime-uat.js +29 -3
- package/pd-cli/dist/commands/runtime-uat.js.map +1 -1
- package/pd-cli/dist/config-reader.d.ts +25 -0
- package/pd-cli/dist/config-reader.d.ts.map +1 -0
- package/pd-cli/dist/config-reader.js +109 -0
- package/pd-cli/dist/config-reader.js.map +1 -0
- package/pd-cli/dist/index.js +40 -5
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/console-launcher.d.ts.map +1 -1
- package/pd-cli/dist/services/console-launcher.js +29 -15
- package/pd-cli/dist/services/console-launcher.js.map +1 -1
- package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/demo-story-a-runner.js +1 -0
- package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
- package/pd-cli/dist/utils/production-workspace-guard.d.ts +77 -0
- package/pd-cli/dist/utils/production-workspace-guard.d.ts.map +1 -0
- package/pd-cli/dist/utils/production-workspace-guard.js +170 -0
- package/pd-cli/dist/utils/production-workspace-guard.js.map +1 -0
- package/pd-cli/dist/utils/production-workspace-guard.test.d.ts +2 -0
- package/pd-cli/dist/utils/production-workspace-guard.test.d.ts.map +1 -0
- package/pd-cli/dist/utils/production-workspace-guard.test.js +95 -0
- package/pd-cli/dist/utils/production-workspace-guard.test.js.map +1 -0
- package/pd-cli/package.json +1 -1
- package/plugin/dist/commands/pain.js +27 -2
- package/plugin/dist/core/pain-diagnostic-gate.d.ts +6 -0
- package/plugin/dist/core/pain-diagnostic-gate.js +9 -0
- package/plugin/dist/hooks/after-tool-call-helpers.d.ts +90 -0
- package/plugin/dist/hooks/after-tool-call-helpers.js +486 -0
- package/plugin/dist/hooks/after-tool-call-types.d.ts +92 -0
- package/plugin/dist/hooks/after-tool-call-types.js +13 -0
- package/plugin/dist/hooks/gate-block-helper.js +73 -29
- package/plugin/dist/hooks/llm.js +49 -29
- package/plugin/dist/hooks/message-sanitize.d.ts +21 -0
- package/plugin/dist/hooks/message-sanitize.js +30 -0
- package/plugin/dist/hooks/pain.d.ts +26 -3
- package/plugin/dist/hooks/pain.js +165 -425
- package/plugin/dist/hooks/prompt.js +3 -2
- package/plugin/dist/hooks/trajectory-evidence.d.ts +11 -0
- package/plugin/dist/hooks/trajectory-evidence.js +65 -0
- package/plugin/dist/hooks/triage-adapter.d.ts +82 -0
- package/plugin/dist/hooks/triage-adapter.js +121 -0
- package/console/dist/server/models/EventLogReadModel.d.ts +0 -33
- package/console/dist/server/models/EventLogReadModel.js +0 -218
- package/console/dist/server/models/EvolutionConsoleModel.d.ts +0 -79
- package/console/dist/server/models/EvolutionConsoleModel.js +0 -179
- package/console/dist/server/models/FeedbackConsoleModel.d.ts +0 -38
- package/console/dist/server/models/FeedbackConsoleModel.js +0 -129
- package/console/dist/server/models/GateConsoleModel.d.ts +0 -50
- package/console/dist/server/models/GateConsoleModel.js +0 -151
- package/console/dist/server/models/OverviewConsoleModel.d.ts +0 -22
- package/console/dist/server/models/OverviewConsoleModel.js +0 -202
- package/console/dist/server/models/PipelineStatsModel.d.ts +0 -35
- package/console/dist/server/models/PipelineStatsModel.js +0 -129
- package/console/dist/server/models/SampleConsoleModel.d.ts +0 -21
- package/console/dist/server/models/SampleConsoleModel.js +0 -188
- package/console/dist/server/models/ThinkingModelsConsoleModel.d.ts +0 -22
- package/console/dist/server/models/ThinkingModelsConsoleModel.js +0 -75
- package/console/dist/server/routes/agents.d.ts +0 -3
- package/console/dist/server/routes/agents.js +0 -442
- package/console/dist/server/routes/central.d.ts +0 -5
- package/console/dist/server/routes/central.js +0 -31
- package/console/dist/server/routes/events.d.ts +0 -10
- package/console/dist/server/routes/events.js +0 -99
- package/console/dist/server/routes/evolution.js +0 -73
- package/console/dist/server/routes/feedback.d.ts +0 -3
- package/console/dist/server/routes/feedback.js +0 -65
- package/console/dist/server/routes/gates.d.ts +0 -3
- package/console/dist/server/routes/gates.js +0 -52
- package/console/dist/server/routes/overview.d.ts +0 -3
- package/console/dist/server/routes/overview.js +0 -49
- package/console/dist/server/routes/pipeline.d.ts +0 -3
- package/console/dist/server/routes/pipeline.js +0 -33
- package/console/dist/server/routes/samples.d.ts +0 -3
- package/console/dist/server/routes/samples.js +0 -101
- package/console/dist/server/routes/thinking-models.d.ts +0 -3
- package/console/dist/server/routes/thinking-models.js +0 -54
- package/console/dist/ui/components/app-sidebar.d.ts +0 -7
- package/console/dist/ui/components/app-sidebar.js +0 -75
- package/console/dist/ui/components/compare-view.d.ts +0 -7
- package/console/dist/ui/components/compare-view.js +0 -32
- package/console/dist/ui/components/data-freshness-indicator.d.ts +0 -10
- package/console/dist/ui/components/data-freshness-indicator.js +0 -63
- package/console/dist/ui/components/health-diagnostic-card.d.ts +0 -15
- package/console/dist/ui/components/health-diagnostic-card.js +0 -42
- package/console/dist/ui/components/page-header.d.ts +0 -10
- package/console/dist/ui/components/page-header.js +0 -37
- package/console/dist/ui/hooks/useAutoRefresh.d.ts +0 -13
- package/console/dist/ui/hooks/useAutoRefresh.js +0 -64
- package/console/dist/ui/hooks/useBookmarks.d.ts +0 -6
- package/console/dist/ui/hooks/useBookmarks.js +0 -43
- package/console/dist/ui/hooks/useDebounce.d.ts +0 -2
- package/console/dist/ui/hooks/useDebounce.js +0 -32
- package/console/dist/ui/hooks/useKeyboardNavigation.d.ts +0 -14
- package/console/dist/ui/hooks/useKeyboardNavigation.js +0 -75
- package/console/dist/ui/pages/AgentsPage.d.ts +0 -1
- package/console/dist/ui/pages/AgentsPage.js +0 -167
- package/console/dist/ui/pages/ApprovalsPage.d.ts +0 -1
- package/console/dist/ui/pages/ApprovalsPage.js +0 -123
- package/console/dist/ui/pages/CentralPage.d.ts +0 -1
- package/console/dist/ui/pages/CentralPage.js +0 -57
- package/console/dist/ui/pages/DataFlowPage.d.ts +0 -1
- package/console/dist/ui/pages/DataFlowPage.js +0 -158
- package/console/dist/ui/pages/EventLogPage.d.ts +0 -1
- package/console/dist/ui/pages/EventLogPage.js +0 -176
- package/console/dist/ui/pages/EvolutionPage.d.ts +0 -1
- package/console/dist/ui/pages/EvolutionPage.js +0 -118
- package/console/dist/ui/pages/FeedbackPage.d.ts +0 -1
- package/console/dist/ui/pages/FeedbackPage.js +0 -46
- package/console/dist/ui/pages/GatesPage.d.ts +0 -1
- package/console/dist/ui/pages/GatesPage.js +0 -31
- package/console/dist/ui/pages/LoginPage.d.ts +0 -5
- package/console/dist/ui/pages/LoginPage.js +0 -39
- package/console/dist/ui/pages/OverviewPage.d.ts +0 -1
- package/console/dist/ui/pages/OverviewPage.js +0 -50
- package/console/dist/ui/pages/PainPage.js +0 -50
- package/console/dist/ui/pages/PrincipleDetailPage.js +0 -145
- package/console/dist/ui/pages/PrinciplesPage.js +0 -322
- package/console/dist/ui/pages/ReportProblemPage.js +0 -186
- package/console/dist/ui/pages/SamplesPage.d.ts +0 -1
- package/console/dist/ui/pages/SamplesPage.js +0 -105
- package/console/dist/ui/pages/SettingsPage.d.ts +0 -1
- package/console/dist/ui/pages/SettingsPage.js +0 -86
- package/console/dist/ui/pages/TasksPage.d.ts +0 -1
- package/console/dist/ui/pages/TasksPage.js +0 -373
- package/console/dist/ui/pages/ThinkingModelsPage.d.ts +0 -1
- package/console/dist/ui/pages/ThinkingModelsPage.js +0 -32
- package/console/dist/ui/pages/UpdatePage.d.ts +0 -1
- package/console/dist/ui/pages/UpdatePage.js +0 -142
- /package/console/dist/ui/pages/{PainPage.d.ts → pain/PainPage.d.ts} +0 -0
- /package/console/dist/ui/pages/{PrincipleDetailPage.d.ts → principles/PrincipleDetailPage.d.ts} +0 -0
- /package/console/dist/ui/pages/{PrinciplesPage.d.ts → principles/PrinciplesPage.d.ts} +0 -0
- /package/console/dist/ui/pages/{ReportProblemPage.d.ts → report-problem/ReportProblemPage.d.ts} +0 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EvidenceChainConsoleModel — read model for the Behavior Evidence page.
|
|
3
|
+
*
|
|
4
|
+
* Reads real pain/evidence/diagnosis chain data from:
|
|
5
|
+
* - pain_events table in trajectory.db
|
|
6
|
+
* - tasks table in state.db (diagnostician tasks)
|
|
7
|
+
* - principle_candidates table in state.db
|
|
8
|
+
* - principle ledger JSON
|
|
9
|
+
*
|
|
10
|
+
* Returns structured EvidenceChainRecord items that the frontend can
|
|
11
|
+
* render as single-record cards with proper state grouping.
|
|
12
|
+
*
|
|
13
|
+
* Privacy boundary (G.2 / F.3 / F.5):
|
|
14
|
+
* - No raw prompt, chat, trajectory, token, full absolute path, or stack trace
|
|
15
|
+
* - All summaries go through sanitizeString from evidence-sanitizer
|
|
16
|
+
* - Degraded paths include structured reason + nextAction (ERR-002)
|
|
17
|
+
*
|
|
18
|
+
* ERR checklist:
|
|
19
|
+
* - ERR-001/005: All DB rows treated as unknown, runtime validation with typeof guards
|
|
20
|
+
* - ERR-002: Degraded paths include reason + nextAction, never silent fallback
|
|
21
|
+
* - ERR-009/010: Required fields fail loud
|
|
22
|
+
* - ERR-014/016/017: Evidence previews bounded via sanitizeString
|
|
23
|
+
* - ERR-013: Use Object.hasOwn() for untrusted object keys
|
|
24
|
+
*/
|
|
25
|
+
import { SqliteConnection, sanitizeString } from '@principles/core/runtime-v2';
|
|
26
|
+
import * as fs from 'node:fs';
|
|
27
|
+
import * as path from 'node:path';
|
|
28
|
+
import Database from 'better-sqlite3';
|
|
29
|
+
// ── Helpers ────────────────────────────────────────────────────────────────────
|
|
30
|
+
function isString(value) {
|
|
31
|
+
return typeof value === 'string';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runtime type guard: check if a value is a plain object (Record<string, unknown>).
|
|
35
|
+
* Rejects null, arrays, primitives. Used instead of `as Record<string, unknown>`
|
|
36
|
+
* on untrusted DB rows and parsed JSON (ERR-001/005).
|
|
37
|
+
*/
|
|
38
|
+
function isRecord(value) {
|
|
39
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Coerce an array of unknown values (e.g. better-sqlite3 .all() result)
|
|
43
|
+
* into an array of Record<string, unknown> with runtime validation.
|
|
44
|
+
* Filters out any non-record entries instead of casting the whole array (ERR-001).
|
|
45
|
+
*/
|
|
46
|
+
function coerceRowsToRecords(rows) {
|
|
47
|
+
const result = [];
|
|
48
|
+
for (const row of rows) {
|
|
49
|
+
if (isRecord(row)) {
|
|
50
|
+
result.push(row);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Safe own-property getter for untrusted records (ERR-013).
|
|
57
|
+
* Uses Object.hasOwn() instead of `in` to avoid prototype-chain matches.
|
|
58
|
+
* Returns undefined when key is absent — caller decides whether that's an error.
|
|
59
|
+
*/
|
|
60
|
+
function getOwnValue(record, key) {
|
|
61
|
+
return Object.hasOwn(record, key) ? record[key] : undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Read an own string property from an untrusted record.
|
|
65
|
+
* Returns undefined when key is absent or value is not a string.
|
|
66
|
+
*/
|
|
67
|
+
function readOwnString(record, key) {
|
|
68
|
+
const value = getOwnValue(record, key);
|
|
69
|
+
return isString(value) ? value : undefined;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read an own string-array property from an untrusted record.
|
|
73
|
+
* Returns empty array when key is absent, value is not an array,
|
|
74
|
+
* or array contains non-string elements (ERR-005/007).
|
|
75
|
+
*/
|
|
76
|
+
function readOwnStringArray(record, key) {
|
|
77
|
+
const value = getOwnValue(record, key);
|
|
78
|
+
if (!Array.isArray(value))
|
|
79
|
+
return [];
|
|
80
|
+
return value.filter(isString);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Coerce a value to string — handles SQLite INTEGER PRIMARY KEY returning number.
|
|
84
|
+
* Returns empty string only for null/undefined; numbers are stringified.
|
|
85
|
+
*/
|
|
86
|
+
function coerceToString(value) {
|
|
87
|
+
if (typeof value === 'string')
|
|
88
|
+
return value;
|
|
89
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
90
|
+
return String(value);
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
function isMissingTableError(err) {
|
|
94
|
+
if (!(err instanceof Error))
|
|
95
|
+
return false;
|
|
96
|
+
return err.message.includes('no such table');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Map pain_events source to a display-friendly sourceKind.
|
|
100
|
+
* Manual sources are highest confidence; hook/system sources are evidence-only by default.
|
|
101
|
+
*/
|
|
102
|
+
function mapSourceKind(source) {
|
|
103
|
+
switch (source) {
|
|
104
|
+
case 'manual':
|
|
105
|
+
case 'owner_explicit_cli':
|
|
106
|
+
case 'owner_explicit_chat':
|
|
107
|
+
return 'manual';
|
|
108
|
+
case 'tool_call':
|
|
109
|
+
case 'hook':
|
|
110
|
+
return 'tool_call';
|
|
111
|
+
case 'rulehost':
|
|
112
|
+
case 'gate':
|
|
113
|
+
return 'rulehost';
|
|
114
|
+
case 'empathy':
|
|
115
|
+
case 'empathy_inferred':
|
|
116
|
+
return 'empathy_inferred';
|
|
117
|
+
case 'review':
|
|
118
|
+
case 'review_finding':
|
|
119
|
+
return 'review';
|
|
120
|
+
default:
|
|
121
|
+
return source || 'unknown';
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Determine admission decision based on source kind (PEAT-B1 defaults).
|
|
126
|
+
* Owner-explicit manual pain → store_signal (admitted).
|
|
127
|
+
* Tool failures, dispatch errors, provider failures → evidence_only.
|
|
128
|
+
* Empathy inferred → owner_confirmation_required.
|
|
129
|
+
*/
|
|
130
|
+
function inferAdmissionDecision(sourceKind) {
|
|
131
|
+
switch (sourceKind) {
|
|
132
|
+
case 'manual':
|
|
133
|
+
case 'review':
|
|
134
|
+
return 'store_signal';
|
|
135
|
+
case 'empathy_inferred':
|
|
136
|
+
return 'owner_confirmation_required';
|
|
137
|
+
default:
|
|
138
|
+
return 'evidence_only';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function determineState(links) {
|
|
142
|
+
const { sourceKind, linkedTaskStatus, linkedCandidateId, linkedPrincipleId } = links;
|
|
143
|
+
// If linked to a principle, internalization has started
|
|
144
|
+
if (linkedPrincipleId) {
|
|
145
|
+
return 'internalization_started';
|
|
146
|
+
}
|
|
147
|
+
// If linked to a candidate, candidate was generated
|
|
148
|
+
if (linkedCandidateId) {
|
|
149
|
+
return 'candidate_generated';
|
|
150
|
+
}
|
|
151
|
+
// If linked to a task, check task status
|
|
152
|
+
if (linkedTaskStatus) {
|
|
153
|
+
switch (linkedTaskStatus) {
|
|
154
|
+
case 'pending':
|
|
155
|
+
case 'queued':
|
|
156
|
+
return 'diagnosis_queued';
|
|
157
|
+
case 'running':
|
|
158
|
+
return 'diagnosis_running';
|
|
159
|
+
case 'succeeded':
|
|
160
|
+
return 'diagnosis_succeeded';
|
|
161
|
+
case 'failed':
|
|
162
|
+
return 'diagnosis_failed';
|
|
163
|
+
case 'retry_wait':
|
|
164
|
+
return 'diagnosis_retry_wait';
|
|
165
|
+
case 'needs_human_review':
|
|
166
|
+
return 'diagnosis_failed';
|
|
167
|
+
default:
|
|
168
|
+
return 'diagnosis_queued';
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// No task linked — check admission decision
|
|
172
|
+
const admission = inferAdmissionDecision(sourceKind);
|
|
173
|
+
if (admission === 'store_signal') {
|
|
174
|
+
return 'pain_recorded';
|
|
175
|
+
}
|
|
176
|
+
return 'evidence_only';
|
|
177
|
+
}
|
|
178
|
+
function readLedgerPrinciples(workspaceDir) {
|
|
179
|
+
const ledgerPath = path.join(workspaceDir, '.state', 'principle_training_state.json');
|
|
180
|
+
if (!fs.existsSync(ledgerPath))
|
|
181
|
+
return { principles: [] };
|
|
182
|
+
let content;
|
|
183
|
+
try {
|
|
184
|
+
content = fs.readFileSync(ledgerPath, 'utf-8');
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return {
|
|
188
|
+
principles: [],
|
|
189
|
+
degradedReason: 'Failed to read principle ledger file',
|
|
190
|
+
nextAction: 'Check file permissions for .state/principle_training_state.json',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (!content || content.trim() === '')
|
|
194
|
+
return { principles: [] };
|
|
195
|
+
let parsed;
|
|
196
|
+
try {
|
|
197
|
+
parsed = JSON.parse(content);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return {
|
|
201
|
+
principles: [],
|
|
202
|
+
degradedReason: 'Principle ledger contains invalid JSON',
|
|
203
|
+
nextAction: 'Review .state/principle_training_state.json for syntax errors. Consider restoring from backup or re-running internalization.',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (!isRecord(parsed)) {
|
|
207
|
+
return {
|
|
208
|
+
principles: [],
|
|
209
|
+
degradedReason: 'Principle ledger root is not a JSON object',
|
|
210
|
+
nextAction: 'Review .state/principle_training_state.json structure. Expected { _tree: { principles: {...} } } or { tree: { principles: {...} } }.',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const treeValue = Object.hasOwn(parsed, '_tree')
|
|
214
|
+
? getOwnValue(parsed, '_tree')
|
|
215
|
+
: Object.hasOwn(parsed, 'tree')
|
|
216
|
+
? getOwnValue(parsed, 'tree')
|
|
217
|
+
: parsed;
|
|
218
|
+
if (!isRecord(treeValue)) {
|
|
219
|
+
return {
|
|
220
|
+
principles: [],
|
|
221
|
+
degradedReason: 'Principle ledger tree is not a JSON object',
|
|
222
|
+
nextAction: 'Review .state/principle_training_state.json structure. The _tree or tree field must be an object.',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const principlesValue = getOwnValue(treeValue, 'principles');
|
|
226
|
+
if (!isRecord(principlesValue)) {
|
|
227
|
+
return {
|
|
228
|
+
principles: [],
|
|
229
|
+
degradedReason: 'Principle ledger principles field is missing or not an object',
|
|
230
|
+
nextAction: 'Review .state/principle_training_state.json structure. Expected principles to be an object.',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
const result = [];
|
|
234
|
+
for (const [, entry] of Object.entries(principlesValue)) {
|
|
235
|
+
if (isRecord(entry)) {
|
|
236
|
+
result.push({
|
|
237
|
+
id: readOwnString(entry, 'id') ?? '',
|
|
238
|
+
derivedFromPainIds: readOwnStringArray(entry, 'derivedFromPainIds'),
|
|
239
|
+
text: readOwnString(entry, 'text'),
|
|
240
|
+
status: readOwnString(entry, 'status'),
|
|
241
|
+
createdAt: readOwnString(entry, 'createdAt'),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { principles: result };
|
|
246
|
+
}
|
|
247
|
+
// ── Model ──────────────────────────────────────────────────────────────────────
|
|
248
|
+
export class EvidenceChainConsoleModel {
|
|
249
|
+
readConnection = null;
|
|
250
|
+
workspaceDir;
|
|
251
|
+
constructor(workspaceDir) {
|
|
252
|
+
this.workspaceDir = workspaceDir;
|
|
253
|
+
}
|
|
254
|
+
getReadConnection() {
|
|
255
|
+
if (!this.readConnection) {
|
|
256
|
+
this.readConnection = new SqliteConnection({ workspaceDir: this.workspaceDir, readonly: true });
|
|
257
|
+
}
|
|
258
|
+
return this.readConnection;
|
|
259
|
+
}
|
|
260
|
+
async getEvidenceChain() {
|
|
261
|
+
const generatedAt = new Date().toISOString();
|
|
262
|
+
const records = [];
|
|
263
|
+
const degradedReasons = [];
|
|
264
|
+
const degradedNextActions = [];
|
|
265
|
+
// ── 1. Read pain_events from trajectory.db ────────────────────────────
|
|
266
|
+
const trajectoryDbPath = path.join(this.workspaceDir, '.state', 'trajectory.db');
|
|
267
|
+
let painEvents = [];
|
|
268
|
+
let trajectoryDbAvailable = false;
|
|
269
|
+
if (fs.existsSync(trajectoryDbPath)) {
|
|
270
|
+
let trajDb = null;
|
|
271
|
+
try {
|
|
272
|
+
trajDb = new Database(trajectoryDbPath, { readonly: true });
|
|
273
|
+
painEvents = coerceRowsToRecords(trajDb.prepare('SELECT id, session_id, source, score, reason, severity, origin, confidence, text, created_at FROM pain_events ORDER BY created_at DESC LIMIT 100').all());
|
|
274
|
+
trajectoryDbAvailable = true;
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
if (isMissingTableError(err)) {
|
|
278
|
+
degradedReasons.push('pain_events table not found in trajectory database');
|
|
279
|
+
degradedNextActions.push('This workspace may not have recorded any pain signals yet.');
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
degradedReasons.push('Failed to read trajectory database');
|
|
283
|
+
degradedNextActions.push('Check workspace state directory integrity.');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
finally {
|
|
287
|
+
trajDb?.close();
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
degradedReasons.push('Trajectory database not found');
|
|
292
|
+
degradedNextActions.push('PD has not recorded any pain signals in this workspace yet.');
|
|
293
|
+
}
|
|
294
|
+
// ── 2. Read diagnostician tasks from state.db ─────────────────────────
|
|
295
|
+
const stateDbPath = path.join(this.workspaceDir, '.pd', 'state.db');
|
|
296
|
+
let taskMap = new Map();
|
|
297
|
+
let stateDbAvailable = false;
|
|
298
|
+
if (fs.existsSync(stateDbPath)) {
|
|
299
|
+
try {
|
|
300
|
+
const conn = this.getReadConnection();
|
|
301
|
+
const db = conn.getDb();
|
|
302
|
+
const tasks = coerceRowsToRecords(db.prepare("SELECT task_id, status, last_error, created_at FROM tasks WHERE task_kind = 'diagnostician' ORDER BY created_at DESC").all());
|
|
303
|
+
for (const task of tasks) {
|
|
304
|
+
const taskId = isString(task.task_id) ? task.task_id : '';
|
|
305
|
+
// Diagnostician task IDs follow pattern "diagnosis_<painId>"
|
|
306
|
+
const painId = taskId.startsWith('diagnosis_') ? taskId.slice('diagnosis_'.length) : taskId;
|
|
307
|
+
taskMap.set(painId, {
|
|
308
|
+
taskId,
|
|
309
|
+
status: isString(task.status) ? task.status : 'unknown',
|
|
310
|
+
lastError: isString(task.last_error) ? task.last_error : null,
|
|
311
|
+
createdAt: isString(task.created_at) ? task.created_at : '',
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
stateDbAvailable = true;
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
if (isMissingTableError(err)) {
|
|
318
|
+
degradedReasons.push('Tasks table not found in state database');
|
|
319
|
+
degradedNextActions.push('Workspace may need initialization via pd config doctor.');
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
degradedReasons.push('Failed to read state database');
|
|
323
|
+
degradedNextActions.push('Check workspace .pd directory integrity.');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
degradedReasons.push('State database not found');
|
|
329
|
+
degradedNextActions.push('PD runtime has not been initialized in this workspace.');
|
|
330
|
+
}
|
|
331
|
+
// ── 3. Read candidates from state.db ──────────────────────────────────
|
|
332
|
+
let candidateMap = new Map(); // painId → candidateId
|
|
333
|
+
if (stateDbAvailable) {
|
|
334
|
+
try {
|
|
335
|
+
const conn = this.getReadConnection();
|
|
336
|
+
const db = conn.getDb();
|
|
337
|
+
const candidates = coerceRowsToRecords(db.prepare('SELECT candidate_id, task_id FROM principle_candidates').all());
|
|
338
|
+
for (const c of candidates) {
|
|
339
|
+
const candidateId = isString(c.candidate_id) ? c.candidate_id : '';
|
|
340
|
+
const taskId = isString(c.task_id) ? c.task_id : '';
|
|
341
|
+
// Reverse-map: taskId → painId
|
|
342
|
+
const painId = taskId.startsWith('diagnosis_') ? taskId.slice('diagnosis_'.length) : '';
|
|
343
|
+
if (painId && candidateId) {
|
|
344
|
+
candidateMap.set(painId, candidateId);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
if (isMissingTableError(err)) {
|
|
350
|
+
degradedReasons.push('Candidates table not found in state database');
|
|
351
|
+
degradedNextActions.push('Candidate and internalization chain links are unavailable. Workspace may need initialization.');
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
degradedReasons.push('Failed to read candidates table');
|
|
355
|
+
degradedNextActions.push('Check state database integrity.');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// ── 4. Read ledger principles ─────────────────────────────────────────
|
|
360
|
+
const ledgerResult = readLedgerPrinciples(this.workspaceDir);
|
|
361
|
+
const ledgerPrinciples = ledgerResult.principles;
|
|
362
|
+
if (ledgerResult.degradedReason) {
|
|
363
|
+
degradedReasons.push(ledgerResult.degradedReason);
|
|
364
|
+
degradedNextActions.push(ledgerResult.nextAction ?? 'Review principle ledger file.');
|
|
365
|
+
}
|
|
366
|
+
const painToPrincipleMap = new Map(); // painId → principleId
|
|
367
|
+
for (const p of ledgerPrinciples) {
|
|
368
|
+
for (const painId of p.derivedFromPainIds ?? []) {
|
|
369
|
+
painToPrincipleMap.set(painId, p.id);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// ── 5. Build evidence chain records from pain_events ──────────────────
|
|
373
|
+
for (const event of painEvents) {
|
|
374
|
+
// SQLite INTEGER PRIMARY KEY returns number, not string — must coerce
|
|
375
|
+
const eventId = coerceToString(event.id);
|
|
376
|
+
if (!eventId)
|
|
377
|
+
continue; // Skip records with no valid id (ERR-009: fail loud)
|
|
378
|
+
const source = isString(event.source) ? event.source : 'unknown';
|
|
379
|
+
const reason = isString(event.reason) ? event.reason : '';
|
|
380
|
+
const text = isString(event.text) ? event.text : '';
|
|
381
|
+
const createdAt = isString(event.created_at) ? event.created_at : '';
|
|
382
|
+
const score = typeof event.score === 'number' ? event.score : 0;
|
|
383
|
+
const sourceKind = mapSourceKind(source);
|
|
384
|
+
// Use id as a stable painId reference
|
|
385
|
+
const painId = `pain_${eventId}`;
|
|
386
|
+
// Look up linked task, candidate, principle
|
|
387
|
+
const linkedTask = taskMap.get(painId);
|
|
388
|
+
const linkedCandidateId = candidateMap.get(painId) || undefined;
|
|
389
|
+
const linkedPrincipleId = painToPrincipleMap.get(painId) || undefined;
|
|
390
|
+
// Determine state
|
|
391
|
+
const state = determineState({
|
|
392
|
+
sourceKind,
|
|
393
|
+
linkedTaskStatus: linkedTask?.status,
|
|
394
|
+
linkedCandidateId,
|
|
395
|
+
linkedPrincipleId,
|
|
396
|
+
});
|
|
397
|
+
// Build bounded, sanitized summary
|
|
398
|
+
const rawSummary = text || reason || `Pain signal (source: ${source}, score: ${score})`;
|
|
399
|
+
const summary = sanitizeString(rawSummary, this.workspaceDir);
|
|
400
|
+
const record = {
|
|
401
|
+
id: painId,
|
|
402
|
+
sourceKind,
|
|
403
|
+
observedAt: createdAt,
|
|
404
|
+
state,
|
|
405
|
+
summary,
|
|
406
|
+
admissionDecision: inferAdmissionDecision(sourceKind),
|
|
407
|
+
};
|
|
408
|
+
if (linkedTask) {
|
|
409
|
+
record.linkedTaskId = linkedTask.taskId;
|
|
410
|
+
record.linkedTaskStatus = linkedTask.status;
|
|
411
|
+
if (linkedTask.lastError && (state === 'diagnosis_failed' || state === 'diagnosis_retry_wait')) {
|
|
412
|
+
record.failureReason = sanitizeString(linkedTask.lastError, this.workspaceDir);
|
|
413
|
+
record.nextAction = state === 'diagnosis_retry_wait'
|
|
414
|
+
? 'Diagnosis is waiting for automatic retry. Check pipeline status if it stays in this state.'
|
|
415
|
+
: 'Diagnosis failed. Check the error details and retry if appropriate.';
|
|
416
|
+
}
|
|
417
|
+
else if (state === 'diagnosis_succeeded' && !linkedCandidateId) {
|
|
418
|
+
record.nextAction = 'Diagnosis completed. A candidate principle may be generated shortly.';
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
if (linkedCandidateId) {
|
|
422
|
+
record.linkedCandidateId = linkedCandidateId;
|
|
423
|
+
}
|
|
424
|
+
if (linkedPrincipleId) {
|
|
425
|
+
record.linkedPrincipleId = linkedPrincipleId;
|
|
426
|
+
}
|
|
427
|
+
records.push(record);
|
|
428
|
+
}
|
|
429
|
+
// ── 6. Also include tasks that have no matching pain_event ─────────────
|
|
430
|
+
// This catches manual pain that was recorded directly through the bridge
|
|
431
|
+
// without a trajectory.db entry (e.g., pd pain record)
|
|
432
|
+
const coveredPainIds = new Set(records.map(r => r.id));
|
|
433
|
+
for (const [painId, task] of taskMap.entries()) {
|
|
434
|
+
if (coveredPainIds.has(painId))
|
|
435
|
+
continue;
|
|
436
|
+
const linkedCandidateId = candidateMap.get(painId) || undefined;
|
|
437
|
+
const linkedPrincipleId = painToPrincipleMap.get(painId) || undefined;
|
|
438
|
+
const state = determineState({
|
|
439
|
+
sourceKind: 'manual',
|
|
440
|
+
linkedTaskStatus: task.status,
|
|
441
|
+
linkedCandidateId,
|
|
442
|
+
linkedPrincipleId,
|
|
443
|
+
});
|
|
444
|
+
records.push({
|
|
445
|
+
id: painId,
|
|
446
|
+
sourceKind: 'manual',
|
|
447
|
+
observedAt: task.createdAt,
|
|
448
|
+
state,
|
|
449
|
+
summary: sanitizeString(`Manual pain signal (task: ${task.taskId})`, this.workspaceDir),
|
|
450
|
+
admissionDecision: 'store_signal',
|
|
451
|
+
linkedTaskId: task.taskId,
|
|
452
|
+
linkedTaskStatus: task.status,
|
|
453
|
+
linkedCandidateId,
|
|
454
|
+
linkedPrincipleId,
|
|
455
|
+
failureReason: (task.lastError && (state === 'diagnosis_failed' || state === 'diagnosis_retry_wait'))
|
|
456
|
+
? sanitizeString(task.lastError, this.workspaceDir)
|
|
457
|
+
: undefined,
|
|
458
|
+
nextAction: (state === 'diagnosis_retry_wait')
|
|
459
|
+
? 'Diagnosis is waiting for automatic retry.'
|
|
460
|
+
: (state === 'diagnosis_failed')
|
|
461
|
+
? 'Diagnosis failed. Check error details and retry.'
|
|
462
|
+
: undefined,
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
// Sort by observedAt descending
|
|
466
|
+
records.sort((a, b) => b.observedAt.localeCompare(a.observedAt));
|
|
467
|
+
// ── 7. Build response ─────────────────────────────────────────────────
|
|
468
|
+
const response = {
|
|
469
|
+
records,
|
|
470
|
+
generatedAt,
|
|
471
|
+
};
|
|
472
|
+
if (degradedReasons.length > 0) {
|
|
473
|
+
response.degradedReason = degradedReasons.join('; ');
|
|
474
|
+
response.nextAction = degradedNextActions.join(' ');
|
|
475
|
+
}
|
|
476
|
+
// Note when evidence-only sources exist but no pain signals
|
|
477
|
+
if (records.length === 0 && trajectoryDbAvailable && stateDbAvailable) {
|
|
478
|
+
response.note = 'PD has not captured any displayable behavior evidence in this workspace yet.';
|
|
479
|
+
}
|
|
480
|
+
return response;
|
|
481
|
+
}
|
|
482
|
+
dispose() {
|
|
483
|
+
if (this.readConnection) {
|
|
484
|
+
try {
|
|
485
|
+
this.readConnection.close();
|
|
486
|
+
}
|
|
487
|
+
catch (err) {
|
|
488
|
+
console.warn('EvidenceChainConsoleModel.dispose: failed to close connection:', err instanceof Error ? err.message : String(err));
|
|
489
|
+
}
|
|
490
|
+
this.readConnection = null;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface StagnationSignal {
|
|
2
|
+
type: 'no_pain' | 'never_activated';
|
|
3
|
+
principleId: string;
|
|
4
|
+
daysSince: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* System state indicator for the governance focus page.
|
|
8
|
+
*
|
|
9
|
+
* - `none`: No governance data exists (workspace not initialized or empty).
|
|
10
|
+
* - `in_progress`: PD has recorded pipeline activity (tasks, candidates) but
|
|
11
|
+
* no owner-ready decision items are available yet.
|
|
12
|
+
* - `owner_review_ready`: At least one pending approval awaits owner review.
|
|
13
|
+
* - `degraded`: Pipeline or data source is degraded — decisions may be
|
|
14
|
+
* incomplete or delayed.
|
|
15
|
+
*/
|
|
16
|
+
export type GovernanceState = 'none' | 'in_progress' | 'owner_review_ready' | 'degraded';
|
|
17
|
+
/**
|
|
18
|
+
* Machine-readable codes for degraded signals.
|
|
19
|
+
* Frontend maps these via i18n; `reason` is English debug text.
|
|
20
|
+
*/
|
|
21
|
+
export type DegradedReasonCode = 'task_retry_wait' | 'task_failed' | 'approval_table_missing';
|
|
22
|
+
export type DegradedNextActionCode = 'check_task_status' | 'fix_and_retry' | 'run_integrity_check';
|
|
23
|
+
export interface DegradedSignal {
|
|
24
|
+
/** Machine-readable code for i18n mapping */
|
|
25
|
+
reasonCode: DegradedReasonCode;
|
|
26
|
+
/** Machine-readable code for i18n mapping */
|
|
27
|
+
nextActionCode: DegradedNextActionCode;
|
|
28
|
+
/** English debug text with dynamic details (task kind, error) */
|
|
29
|
+
reason: string;
|
|
30
|
+
/** English debug text for next action */
|
|
31
|
+
nextAction: string;
|
|
32
|
+
/** Source of the degraded signal, e.g. 'internalization_task', 'source_unavailable' */
|
|
33
|
+
source: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Machine-readable codes for governance state reason/nextAction.
|
|
37
|
+
* Frontend maps these via i18n; some codes support interpolation
|
|
38
|
+
* (e.g. {{count}} from pendingReviewCount).
|
|
39
|
+
*/
|
|
40
|
+
export type StateReasonCode = 'state_db_missing' | 'no_pipeline_activity' | 'pending_approvals' | 'pipeline_active' | 'consumed_candidates' | 'degraded_state';
|
|
41
|
+
export type NextActionCode = 'run_config_doctor' | 'wait_for_pipeline' | 'review_approvals' | 'check_degraded_signals' | 'check_pipeline_status';
|
|
42
|
+
export interface GovernanceQueueResponse {
|
|
43
|
+
/** Number of pending approvals awaiting owner review */
|
|
44
|
+
pendingReviewCount: number;
|
|
45
|
+
/** Number of high/critical risk pending approvals */
|
|
46
|
+
behaviorDeviationCount: number;
|
|
47
|
+
/** Stagnation signals for approvals older than 7 days */
|
|
48
|
+
stagnationSignals: StagnationSignal[];
|
|
49
|
+
/** Overall governance state */
|
|
50
|
+
governanceState: GovernanceState;
|
|
51
|
+
/** Machine-readable code for i18n mapping */
|
|
52
|
+
stateReasonCode: StateReasonCode;
|
|
53
|
+
/** Machine-readable code for i18n mapping */
|
|
54
|
+
nextActionCode: NextActionCode;
|
|
55
|
+
/** English debug text (fallback / logging) */
|
|
56
|
+
stateReason: string;
|
|
57
|
+
/** English debug text (fallback / logging) */
|
|
58
|
+
nextAction: string;
|
|
59
|
+
/** Human-readable summary of pipeline activity when state is 'in_progress' */
|
|
60
|
+
inProgressSummary?: string;
|
|
61
|
+
/** Degraded signals when state is 'degraded' */
|
|
62
|
+
degradedSignals?: DegradedSignal[];
|
|
63
|
+
generatedAt: string;
|
|
64
|
+
/** Present when data is degraded/missing rather than genuinely zero */
|
|
65
|
+
note?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare class GovernanceConsoleModel {
|
|
68
|
+
private readConnection;
|
|
69
|
+
private readonly workspaceDir;
|
|
70
|
+
constructor(workspaceDir: string);
|
|
71
|
+
private getReadConnection;
|
|
72
|
+
getGovernanceQueue(): Promise<GovernanceQueueResponse>;
|
|
73
|
+
dispose(): void;
|
|
74
|
+
}
|