create-principles-disciple 1.94.0 → 1.96.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/WorkspaceConfigStore.js +2 -1
- package/console/dist/server/config/pd-config-store.d.ts +33 -0
- package/console/dist/server/config/pd-config-store.js +196 -0
- package/console/dist/server/index.js +19 -4
- package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
- package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
- package/console/dist/server/models/HealthCheckModel.js +5 -3
- package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
- package/console/dist/server/models/IntentDecisionModel.js +207 -0
- package/console/dist/server/models/IntentPageModel.d.ts +52 -0
- package/console/dist/server/models/IntentPageModel.js +292 -0
- package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
- package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
- package/console/dist/server/models/WorkspaceService.d.ts +0 -28
- package/console/dist/server/models/WorkspaceService.js +0 -115
- package/console/dist/server/routes/config.js +55 -1
- package/console/dist/server/routes/intent-decisions.d.ts +33 -0
- package/console/dist/server/routes/intent-decisions.js +499 -0
- package/console/dist/server/routes/intent.d.ts +7 -0
- package/console/dist/server/routes/intent.js +223 -0
- package/console/dist/server/routes/principles.js +67 -1
- package/console/dist/server/routes/update.d.ts +0 -1
- package/console/dist/server/routes/update.js +14 -11
- package/console/dist/types.d.ts +1 -0
- package/console/dist/ui/App.js +2 -60
- package/console/dist/ui/api.d.ts +58 -18
- package/console/dist/ui/api.js +78 -6
- package/console/dist/ui/components/layout/app-sidebar.js +13 -12
- package/console/dist/ui/components/ui/badge.d.ts +1 -1
- package/console/dist/ui/components/ui/button.d.ts +1 -1
- package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
- package/console/dist/ui/components/ui/shiny-text.js +46 -0
- package/console/dist/ui/i18n/en.json +306 -3
- package/console/dist/ui/i18n/zh-CN.json +306 -3
- package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +31 -0
- package/console/dist/ui/pages/control-center/AgentCard.js +156 -0
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +26 -0
- package/console/dist/ui/pages/control-center/AgentGroup.js +38 -0
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +103 -41
- package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
- package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +17 -0
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +55 -0
- package/console/dist/ui/pages/debt/DebtPage.js +219 -2
- package/console/dist/ui/pages/focus/FocusPage.js +2 -1
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +67 -0
- package/console/dist/ui/pages/intent/IntentOnboarding.js +289 -0
- package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
- package/console/dist/ui/pages/intent/IntentPage.js +258 -0
- package/console/dist/ui/pages/pain/PainPage.js +234 -4
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
- package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
- package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
- package/console/dist/ui/utils/agent-metadata.d.ts +58 -0
- package/console/dist/ui/utils/agent-metadata.js +275 -0
- package/console/dist/ui/utils/control-center-helpers.d.ts +19 -0
- package/console/dist/ui/utils/control-center-helpers.js +37 -0
- package/console/dist/ui/utils/validators.d.ts +200 -0
- package/console/dist/ui/utils/validators.js +563 -0
- package/console/dist/web/assets/app.css +498 -3
- package/console/dist/web/assets/app.js +5063 -1418
- package/console/package.json +3 -0
- package/core/dist/principle-tree-ledger.d.ts +55 -4
- package/core/dist/principle-tree-ledger.d.ts.map +1 -1
- package/core/dist/principle-tree-ledger.js +472 -13
- package/core/dist/principle-tree-ledger.js.map +1 -1
- package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
- package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
- package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
- package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
- package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
- package/core/dist/prompt-builder/size-guard.d.ts +1 -0
- package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
- package/core/dist/prompt-builder/size-guard.js +21 -0
- package/core/dist/prompt-builder/size-guard.js.map +1 -1
- package/core/dist/prompt-builder/types.d.ts +2 -0
- package/core/dist/prompt-builder/types.d.ts.map +1 -1
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +143 -65
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +85 -7
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js +70 -0
- package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js +136 -1
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +105 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
- package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js +211 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
- package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -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-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
- package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
- 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 +6 -0
- 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.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +158 -1
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts +11 -0
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +55 -11
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
- package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
- package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician-output.js +16 -0
- package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +23 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js +246 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js.map +1 -0
- 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 +9 -0
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/index.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/index.js +2 -0
- package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
- package/{plugin/dist/core/surface-guard.d.ts → core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts} +15 -5
- package/core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts.map +1 -0
- package/{plugin/dist/core/surface-guard.js → core/dist/runtime-v2/feature-flags/surface-guard-policy.js} +14 -2
- package/core/dist/runtime-v2/feature-flags/surface-guard-policy.js.map +1 -0
- package/core/dist/runtime-v2/golden-trace-replay-validator.js +1 -1
- package/core/dist/runtime-v2/golden-trace-replay-validator.js.map +1 -1
- package/core/dist/runtime-v2/golden-trace.d.ts +19 -3
- package/core/dist/runtime-v2/golden-trace.d.ts.map +1 -1
- package/core/dist/runtime-v2/golden-trace.js +2 -0
- package/core/dist/runtime-v2/golden-trace.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +21 -4
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +21 -3
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js +88 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +181 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/index.d.ts +8 -0
- package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/index.js +8 -0
- package/core/dist/runtime-v2/intent/index.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-browser.d.ts +23 -0
- package/core/dist/runtime-v2/intent/intent-browser.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-browser.js +21 -0
- package/core/dist/runtime-v2/intent/intent-browser.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.d.ts +28 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.js +21 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc.d.ts +35 -0
- package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc.js +158 -0
- package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-hash.d.ts +2 -0
- package/core/dist/runtime-v2/intent/intent-hash.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-hash.js +10 -0
- package/core/dist/runtime-v2/intent/intent-hash.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +41 -1
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js +130 -2
- package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js +228 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +41 -11
- package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js +135 -0
- package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/adversarial-case.js +24 -0
- package/core/dist/runtime-v2/internalization/adversarial-case.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-output.d.ts +10 -0
- package/core/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-output.js +45 -0
- package/core/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +2 -2
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +7 -2
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts +66 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.js +183 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.js.map +1 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
- package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-output.d.ts +8 -0
- package/core/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-output.js +10 -0
- package/core/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +17 -0
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.js +118 -24
- package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js.map +1 -1
- package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts +55 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js +131 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.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 +280 -56
- package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -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 +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -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/principle-tree/ledger-codec.js.map +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js +95 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/risk/index.d.ts +7 -0
- package/core/dist/runtime-v2/risk/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/index.js +6 -0
- package/core/dist/runtime-v2/risk/index.js.map +1 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts +18 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.js +47 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.js.map +1 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js +83 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/index.d.ts +7 -0
- package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/index.js +6 -0
- package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts +28 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js +88 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
- package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js +138 -12
- package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js +149 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/thinking-models/index.d.ts +3 -0
- package/core/dist/runtime-v2/thinking-models/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/index.js +3 -0
- package/core/dist/runtime-v2/thinking-models/index.js.map +1 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts +73 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js +227 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js.map +1 -0
- package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js +40 -1
- package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js +28 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts +3 -0
- package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-output-typebox.js +3 -0
- package/core/dist/runtime-v2/tools/artificer-output-typebox.js.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
- package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.js +0 -12
- package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
- package/core/dist/runtime-v2/types/event-types.d.ts +5 -34
- package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-types.js +0 -19
- package/core/dist/runtime-v2/types/event-types.js.map +1 -1
- package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
- package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
- package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
- package/core/dist/runtime-v2/types/index.d.ts +5 -5
- package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/index.js +5 -3
- package/core/dist/runtime-v2/types/index.js.map +1 -1
- package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
- package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/ledger-store.js +10 -5
- package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
- package/core/dist/workflow-funnel-loader.d.ts +2 -2
- package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
- package/core/package.json +4 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +16 -0
- package/dist/installer.js.map +1 -1
- package/package.json +1 -1
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +237 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
- package/pd-cli/dist/commands/intent.d.ts +76 -0
- package/pd-cli/dist/commands/intent.d.ts.map +1 -0
- package/pd-cli/dist/commands/intent.js +411 -0
- package/pd-cli/dist/commands/intent.js.map +1 -0
- package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
- package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-init.js +264 -0
- package/pd-cli/dist/commands/runtime-init.js.map +1 -0
- package/pd-cli/dist/index.js +25 -0
- package/pd-cli/dist/index.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 +6 -0
- package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
- package/pd-cli/package.json +1 -0
- package/plugin/dist/commands/pain.js +2 -0
- package/plugin/dist/core/behavior-example-pack-assembler.d.ts +43 -0
- package/plugin/dist/core/behavior-example-pack-assembler.js +247 -0
- package/plugin/dist/core/control-ui-db.d.ts +11 -0
- package/plugin/dist/core/control-ui-db.js +40 -16
- package/plugin/dist/core/event-log.js +0 -5
- package/plugin/dist/core/intent-doc-reader-adapter.d.ts +36 -0
- package/plugin/dist/core/intent-doc-reader-adapter.js +76 -0
- package/plugin/dist/core/intent-doc-reader.d.ts +89 -0
- package/plugin/dist/core/intent-doc-reader.js +210 -0
- package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
- package/plugin/dist/core/principle-tree-ledger.js +39 -524
- package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
- package/plugin/dist/core/rule-context-assembler.d.ts +45 -0
- package/plugin/dist/core/rule-context-assembler.js +148 -0
- package/plugin/dist/core/thinking-models.d.ts +12 -57
- package/plugin/dist/core/thinking-models.js +18 -224
- package/plugin/dist/core/trajectory-types.d.ts +18 -0
- package/plugin/dist/core/trajectory.d.ts +50 -2
- package/plugin/dist/core/trajectory.js +435 -254
- package/plugin/dist/core/workspace-context.d.ts +2 -3
- package/plugin/dist/hooks/gate.js +59 -2
- package/plugin/dist/hooks/pain.js +5 -0
- package/plugin/dist/hooks/prompt-helpers.d.ts +19 -1
- package/plugin/dist/hooks/prompt-helpers.js +39 -2
- package/plugin/dist/hooks/prompt-types.d.ts +8 -0
- package/plugin/dist/hooks/prompt.js +81 -21
- package/plugin/dist/index.d.ts +3 -1
- package/plugin/dist/index.js +10 -6
- package/plugin/dist/service/runtime-summary-service.js +1 -1
- package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
- package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
- package/plugin/dist/types/event-types.d.ts +1 -1
- package/plugin/package.json +6 -3
- package/plugin/scripts/acceptance-test.mjs +3 -3
- package/plugin/dist/core/evolution-migration.d.ts +0 -5
- package/plugin/dist/core/evolution-migration.js +0 -65
- package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
- package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
- package/plugin/dist/core/risk-calculator.d.ts +0 -22
- package/plugin/dist/core/risk-calculator.js +0 -88
- package/plugin/dist/core/rule-host-helpers.d.ts +0 -8
- package/plugin/dist/core/rule-host-helpers.js +0 -7
- package/plugin/dist/core/rule-host-types.d.ts +0 -7
- package/plugin/dist/core/rule-host-types.js +0 -7
- package/plugin/dist/core/schema/db-types.d.ts +0 -11
- package/plugin/dist/core/schema/db-types.js +0 -5
- package/plugin/dist/core/schema/index.d.ts +0 -17
- package/plugin/dist/core/schema/index.js +0 -15
- package/plugin/dist/core/schema/migration-runner.d.ts +0 -53
- package/plugin/dist/core/schema/migration-runner.js +0 -170
- package/plugin/dist/core/schema/migrations/001-init-trajectory.d.ts +0 -6
- package/plugin/dist/core/schema/migrations/001-init-trajectory.js +0 -190
- package/plugin/dist/core/schema/migrations/002-init-central.d.ts +0 -5
- package/plugin/dist/core/schema/migrations/002-init-central.js +0 -108
- package/plugin/dist/core/schema/migrations/003-init-workflow.d.ts +0 -5
- package/plugin/dist/core/schema/migrations/003-init-workflow.js +0 -50
- package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +0 -8
- package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.js +0 -66
- package/plugin/dist/core/schema/migrations/index.d.ts +0 -16
- package/plugin/dist/core/schema/migrations/index.js +0 -27
- package/plugin/dist/core/schema/schema-definitions.d.ts +0 -46
- package/plugin/dist/core/schema/schema-definitions.js +0 -599
- package/plugin/dist/service/central-database.d.ts +0 -138
- package/plugin/dist/service/central-database.js +0 -731
- package/plugin/dist/service/central-sync-service.d.ts +0 -8
- package/plugin/dist/service/central-sync-service.js +0 -71
- package/plugin/scripts/db-migrate.mjs +0 -170
- package/plugin/scripts/validate-live-path.ts +0 -462
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect, useCallback } from "react";
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
4
|
import { toast } from "sonner";
|
|
@@ -6,8 +6,12 @@ import { PageShell } from "../../components/layout/page-shell.js";
|
|
|
6
6
|
import { PageLoading } from "../../components/layout/page-loading.js";
|
|
7
7
|
import { SectionTitle } from "../../components/layout/section-title.js";
|
|
8
8
|
import { fetchConfigSummary, fetchConfigCatalog, updateAgentBinding, updateDefaultRuntime, } from "../../api.js";
|
|
9
|
-
import { computeOverallReadiness, groupAgentsByReadiness, redactDiagnosticsForCopy, } from "../../utils/control-center-helpers.js";
|
|
9
|
+
import { computeOverallReadiness, groupAgentsByReadiness, groupAgentsByDependency, isKnownAgentName, redactDiagnosticsForCopy, } from "../../utils/control-center-helpers.js";
|
|
10
10
|
import { enumLabel } from "../../utils/enum-labels.js";
|
|
11
|
+
import { EmpathyObserverCostHint } from "./EmpathyObserverCostHint.js";
|
|
12
|
+
import { WorkflowDiagram } from "./WorkflowDiagram.js";
|
|
13
|
+
import { AgentGroup } from "./AgentGroup.js";
|
|
14
|
+
import { AGENT_GROUPS, AGENT_METADATA, } from "../../utils/agent-metadata.js";
|
|
11
15
|
// ── Runtime validators (H section / ERR-001/005/009/013) ─────────────────────
|
|
12
16
|
function validateSource(raw) {
|
|
13
17
|
if (typeof raw !== "string")
|
|
@@ -76,7 +80,18 @@ function validateRedactedRuntimeProfileSummary(raw) {
|
|
|
76
80
|
const apiKeyEnv = Object.hasOwn(raw, "apiKeyEnv") && typeof raw.apiKeyEnv === "string"
|
|
77
81
|
? raw.apiKeyEnv
|
|
78
82
|
: undefined;
|
|
79
|
-
|
|
83
|
+
// provider/model are optional (set by backend redactPdConfig for both
|
|
84
|
+
// pi-ai and openclaw profiles). Extract so EmpathyObserverCostHint can
|
|
85
|
+
// show the active model without parsing the label string. Aligns with
|
|
86
|
+
// the canonical validator in validators.ts (EP-01: validate fields that
|
|
87
|
+
// actually exist in the target type).
|
|
88
|
+
const provider = Object.hasOwn(raw, "provider") && typeof raw.provider === "string"
|
|
89
|
+
? raw.provider
|
|
90
|
+
: undefined;
|
|
91
|
+
const model = Object.hasOwn(raw, "model") && typeof raw.model === "string"
|
|
92
|
+
? raw.model
|
|
93
|
+
: undefined;
|
|
94
|
+
return { id, type, label, apiKeyEnv, provider, model, readiness };
|
|
80
95
|
}
|
|
81
96
|
function validateRedactedAgentSummary(raw) {
|
|
82
97
|
if (!isRecord(raw))
|
|
@@ -272,46 +287,70 @@ function readinessTagClasses(readiness) {
|
|
|
272
287
|
}
|
|
273
288
|
}
|
|
274
289
|
// ── Sub-components ───────────────────────────────────────────────────────────
|
|
275
|
-
|
|
290
|
+
/**
|
|
291
|
+
* CompactStatusBar — 紧凑状态条(替代 OverallStatusCard)
|
|
292
|
+
*
|
|
293
|
+
* 取自原型 control-center.html 第 153-168 行。一行展示:
|
|
294
|
+
* 已启用 N/M · 未就绪 N 项 · 核心管道 状态 · [需配置] pill
|
|
295
|
+
*
|
|
296
|
+
* 核心管道状态 = core_trio + code_chain 中已启用代理的就绪情况:
|
|
297
|
+
* - paralyzed: core_trio 任一 disabled 或有 not_ready
|
|
298
|
+
* - degraded: 有 needs_setup
|
|
299
|
+
* - ok: 全 ready
|
|
300
|
+
*
|
|
301
|
+
* rc-2: 用 Object.hasOwn 守卫 agent.name 查 AGENT_METADATA(无 as 绕过)
|
|
302
|
+
*/
|
|
303
|
+
function CompactStatusBar({ readiness, agents, }) {
|
|
276
304
|
const { t } = useTranslation();
|
|
277
305
|
const enabledCount = agents.filter((a) => a.enabled).length;
|
|
278
306
|
const totalCount = agents.length;
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
307
|
+
const notReadyCount = agents.filter((a) => a.enabled && a.readiness !== "ready").length;
|
|
308
|
+
// 核心管道状态:core_trio + code_chain 中已启用代理
|
|
309
|
+
// rc-2: 用 isKnownAgentName 类型守卫缩窄,不用 as 绕过
|
|
310
|
+
const coreAgents = agents.filter((a) => {
|
|
311
|
+
if (!isKnownAgentName(a.name))
|
|
312
|
+
return false;
|
|
313
|
+
const meta = AGENT_METADATA[a.name];
|
|
314
|
+
return meta.group === "core_trio" || meta.group === "code_chain";
|
|
315
|
+
});
|
|
316
|
+
const enabledCoreAgents = coreAgents.filter((a) => a.enabled);
|
|
317
|
+
const coreTrioAgents = coreAgents.filter((a) => {
|
|
318
|
+
if (!isKnownAgentName(a.name))
|
|
319
|
+
return false;
|
|
320
|
+
const meta = AGENT_METADATA[a.name];
|
|
321
|
+
return meta.group === "core_trio";
|
|
322
|
+
});
|
|
323
|
+
const codeChainAgents = coreAgents.filter((a) => {
|
|
324
|
+
if (!isKnownAgentName(a.name))
|
|
325
|
+
return false;
|
|
326
|
+
const meta = AGENT_METADATA[a.name];
|
|
327
|
+
return meta.group === "code_chain";
|
|
328
|
+
});
|
|
329
|
+
const coreTrioAnyDisabled = coreTrioAgents.some((a) => !a.enabled);
|
|
330
|
+
const codeChainAnyDisabled = codeChainAgents.some((a) => !a.enabled);
|
|
331
|
+
const coreAnyNotReady = enabledCoreAgents.some((a) => a.readiness === "not_ready");
|
|
332
|
+
const coreAnyNeedsSetup = enabledCoreAgents.some((a) => a.readiness === "needs_setup");
|
|
333
|
+
// 状态优先级(per AGENT_METADATA.impactZh):
|
|
334
|
+
// - paralyzed: core_trio 任一 disabled 或 enabled 但 not_ready
|
|
335
|
+
// (core_trio 是入口,关掉任何一个整个管道瘫痪)
|
|
336
|
+
// - degraded: code_chain 任一 disabled(降级运行,非瘫痪)
|
|
337
|
+
// 或 enabled 但 needs_setup
|
|
338
|
+
// - ok: 全 ready
|
|
339
|
+
//
|
|
340
|
+
// needsConfig 标记仅用于 readiness 异常(not_ready / needs_setup),
|
|
341
|
+
// 不用于主动 disabled — 主动 disable 是 owner 的有意决策,不是配置缺失。
|
|
342
|
+
let corePipelineKey;
|
|
343
|
+
const needsConfig = coreAnyNotReady || coreAnyNeedsSetup;
|
|
344
|
+
if (coreTrioAnyDisabled || coreAnyNotReady) {
|
|
345
|
+
corePipelineKey = "pages.controlCenter.status.corePipelineParalyzed";
|
|
296
346
|
}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}, disabled: isSaving, className: "bg-surface border border-line rounded-[3px] px-2 py-1 text-[12.5px] text-ink focus:outline-none focus:border-gov disabled:opacity-50", "aria-label": t("pages.controlCenter.profileLabel"), children: profiles.map((p) => (_jsx("option", { value: p.id, children: p.label }, p.id))) }) }), _jsx("button", { type: "button", onClick: () => {
|
|
305
|
-
onBindingChange(agent.name, agent.runtimeProfileId, !agent.enabled);
|
|
306
|
-
}, disabled: isSaving, className: agent.enabled
|
|
307
|
-
? "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors disabled:opacity-50"
|
|
308
|
-
: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:border-line-2 transition-colors disabled:opacity-50", "aria-label": agent.enabled
|
|
309
|
-
? t("pages.controlCenter.agentDisabled")
|
|
310
|
-
: t("pages.controlCenter.agentEnabled"), children: isSaving
|
|
311
|
-
? t("pages.controlCenter.saving")
|
|
312
|
-
: agent.enabled
|
|
313
|
-
? t("pages.controlCenter.on")
|
|
314
|
-
: t("pages.controlCenter.off") })] }));
|
|
347
|
+
else if (codeChainAnyDisabled || coreAnyNeedsSetup) {
|
|
348
|
+
corePipelineKey = "pages.controlCenter.status.corePipelineDegraded";
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
corePipelineKey = "pages.controlCenter.status.corePipelineOk";
|
|
352
|
+
}
|
|
353
|
+
return (_jsxs("div", { className: "mt-5 px-[16px] py-[11px] bg-surface border border-line-2 rounded-[4px] flex items-center gap-[16px] text-[12.5px] text-ink-3 flex-wrap", children: [_jsxs("div", { className: "flex items-center gap-[6px]", children: [_jsx("span", { className: "text-ink-4 font-mono text-[11px] uppercase tracking-[0.04em]", children: t("pages.controlCenter.status.enabled") }), _jsxs("span", { className: "text-ink font-semibold", children: [_jsx("span", { className: "font-mono", children: enabledCount }), " /", " ", _jsx("span", { className: "font-mono", children: totalCount })] })] }), _jsxs("div", { className: "flex items-center gap-[6px]", children: [_jsx("span", { className: "text-ink-4 font-mono text-[11px] uppercase tracking-[0.04em]", children: t("pages.controlCenter.status.notReady") }), _jsx("span", { className: "text-ink font-semibold", children: _jsx("span", { className: "font-mono", children: notReadyCount }) })] }), _jsxs("div", { className: "flex items-center gap-[6px]", children: [_jsx("span", { className: "text-ink-4 font-mono text-[11px] uppercase tracking-[0.04em]", children: t("pages.controlCenter.status.corePipeline") }), _jsx("span", { className: "text-ink font-semibold", children: t(corePipelineKey) })] }), needsConfig && (_jsx("span", { className: "ml-auto px-[9px] py-[3px] rounded-[2px] text-[10.5px] font-mono tracking-[0.02em] font-medium border border-amber text-amber bg-amber/10", children: t("pages.controlCenter.status.needsConfig") }))] }));
|
|
315
354
|
}
|
|
316
355
|
function DefaultRuntimeSelector({ currentDefault, profiles, onDefaultChange, saving, }) {
|
|
317
356
|
const { t } = useTranslation();
|
|
@@ -357,7 +396,7 @@ function AdvancedDiagnostics({ config, }) {
|
|
|
357
396
|
}) })] }), _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: handleCopy, className: "border border-line bg-surface text-ink rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:border-line-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", children: copied ? "✓" : t("pages.controlCenter.copyDiagnostics") }), _jsx("span", { className: "text-ink-4 text-[12px]", children: t("pages.controlCenter.redactedNote") })] })] })] }));
|
|
358
397
|
}
|
|
359
398
|
export function ControlCenterPage() {
|
|
360
|
-
const { t } = useTranslation();
|
|
399
|
+
const { t, i18n } = useTranslation();
|
|
361
400
|
const [configData, setConfigData] = useState(null);
|
|
362
401
|
const [catalogData, setCatalogData] = useState(null);
|
|
363
402
|
const [loadingState, setLoadingState] = useState("loading");
|
|
@@ -445,5 +484,28 @@ export function ControlCenterPage() {
|
|
|
445
484
|
};
|
|
446
485
|
const overallReadiness = computeOverallReadiness(diagnostics);
|
|
447
486
|
const availableProfiles = catalogData?.profiles ?? configData.runtimeProfiles;
|
|
448
|
-
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.controlCenter.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.controlCenter.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.controlCenter.subtitle") }), _jsx(
|
|
487
|
+
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.controlCenter.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.controlCenter.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.controlCenter.subtitle") }), _jsx(WorkflowDiagram, {}), _jsx(CompactStatusBar, { readiness: overallReadiness, agents: configData.agents }), (() => {
|
|
488
|
+
const empathyAgent = configData.agents.find((a) => a.name === "empathyObserver" && a.enabled);
|
|
489
|
+
if (!empathyAgent)
|
|
490
|
+
return null;
|
|
491
|
+
let acked = false;
|
|
492
|
+
try {
|
|
493
|
+
acked = localStorage.getItem("pd.empathyObserver.costAck") === "true";
|
|
494
|
+
}
|
|
495
|
+
catch {
|
|
496
|
+
// localStorage unavailable (privacy mode) → not acked → render
|
|
497
|
+
}
|
|
498
|
+
if (acked)
|
|
499
|
+
return null;
|
|
500
|
+
return (_jsx(EmpathyObserverCostHint, { agent: empathyAgent, profiles: availableProfiles }));
|
|
501
|
+
})(), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-agents", children: [_jsx(SectionTitle, { id: "section-agents", children: t("pages.controlCenter.internalAgents") }), _jsx("p", { className: "text-ink-3 text-[13px] leading-relaxed mb-3", children: t("pages.controlCenter.internalAgentsDescription") }), (() => {
|
|
502
|
+
const { groups, unknown } = groupAgentsByDependency(configData.agents);
|
|
503
|
+
const locale = i18n.language.startsWith("en")
|
|
504
|
+
? "en"
|
|
505
|
+
: "zh-CN";
|
|
506
|
+
return (_jsxs(_Fragment, { children: [AGENT_GROUPS.map((groupMeta) => (_jsx(AgentGroup, { groupMeta: groupMeta, agents: groups[groupMeta.id], profiles: availableProfiles, onBindingChange: handleBindingChange, saving: savingAgent, locale: locale }, groupMeta.id))), unknown.length > 0 && (_jsx("div", { className: "mt-3 px-3 py-2 border border-amber/30 border-l-2 border-l-amber rounded-[4px] bg-amber/10 text-[12.5px] text-ink-3", children: t("pages.controlCenter.unknownAgentsWarning", {
|
|
507
|
+
count: unknown.length,
|
|
508
|
+
names: unknown.map((a) => a.name).join(", "),
|
|
509
|
+
}) }))] }));
|
|
510
|
+
})()] }), _jsxs("section", { className: "mt-8", "aria-labelledby": "section-default-runtime", children: [_jsx(SectionTitle, { id: "section-default-runtime", children: t("pages.controlCenter.defaultRuntime") }), _jsx(DefaultRuntimeSelector, { currentDefault: configData.defaultRuntime, profiles: availableProfiles, onDefaultChange: handleDefaultRuntimeChange, saving: savingDefault })] }), _jsx("section", { className: "mt-8", "aria-labelledby": "section-diagnostics", children: _jsx(AdvancedDiagnostics, { config: configData }) }), _jsx("p", { className: "mt-10 pt-[18px] border-t border-line-2 text-ink-4 text-[12px] leading-[1.6] max-w-[60ch] font-mono", children: t("pages.controlCenter.footerNote") })] }) }));
|
|
449
511
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RedactedAgentSummary, RedactedRuntimeProfileSummary } from "../../api.js";
|
|
2
|
+
/**
|
|
3
|
+
* EmpathyObserverCostHint — spec 2026-06-27 §4
|
|
4
|
+
*
|
|
5
|
+
* A克制、可关闭的提示条,告知 Owner:启用 empathyObserver 后会有持续的
|
|
6
|
+
* LLM 调用与 token 成本,以及当前使用的 provider/model。
|
|
7
|
+
*
|
|
8
|
+
* 双层 gate(spec §4.1):
|
|
9
|
+
* - Gate 1(父组件 ControlCenterPage):仅当 empathyObserver 已启用且
|
|
10
|
+
* localStorage 未 ack 时才挂载本组件。
|
|
11
|
+
* - Gate 2(本组件):维护 visible 内部状态,承载"知道了"dismiss 行为。
|
|
12
|
+
*
|
|
13
|
+
* 该组件不修改后端任何代码、不修改 prompt.ts、不修改 resolveEmpathyObserver。
|
|
14
|
+
* 纯前端 localStorage 控制,清掉就重新出现,fail-open(隐私模式仍可见)。
|
|
15
|
+
*
|
|
16
|
+
* ERR entries (spec §8):
|
|
17
|
+
* - ERR-001/ERR-005: 消费 ControlCenterPage 已经过 type guard 的数据,无 untrusted 原始数据
|
|
18
|
+
* - ERR-009/ERR-010: provider/model 取不到时用 '—' 显式降级
|
|
19
|
+
* - ERR-013: localStorage 读取与写入用 try/catch 包裹
|
|
20
|
+
*/
|
|
21
|
+
interface EmpathyObserverCostHintProps {
|
|
22
|
+
/** empathyObserver agent row (already validated by parent) */
|
|
23
|
+
agent: RedactedAgentSummary;
|
|
24
|
+
/** runtime profiles — used to resolve provider/model */
|
|
25
|
+
profiles: RedactedRuntimeProfileSummary[];
|
|
26
|
+
}
|
|
27
|
+
export declare function EmpathyObserverCostHint({ agent, profiles, }: EmpathyObserverCostHintProps): import("react/jsx-runtime").JSX.Element | null;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { enumLabel } from "../../utils/enum-labels.js";
|
|
5
|
+
const COST_ACK_KEY = "pd.empathyObserver.costAck";
|
|
6
|
+
export function EmpathyObserverCostHint({ agent, profiles, }) {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
// Gate 2: dismiss 后不再渲染。localStorage ack 时初始即隐藏。
|
|
9
|
+
const [visible, setVisible] = useState(() => {
|
|
10
|
+
try {
|
|
11
|
+
return localStorage.getItem(COST_ACK_KEY) !== "true";
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// 隐私模式 / localStorage 不可用 → fail-open:默认可见
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
if (!visible)
|
|
19
|
+
return null;
|
|
20
|
+
// Resolve provider/model from the agent's runtime profile.
|
|
21
|
+
// agent.runtimeProfileId is always present (validated by parent).
|
|
22
|
+
const profile = profiles.find((p) => p.id === agent.runtimeProfileId);
|
|
23
|
+
const provider = profile?.provider ?? "—";
|
|
24
|
+
const model = profile?.model ?? "—";
|
|
25
|
+
const handleAck = () => {
|
|
26
|
+
try {
|
|
27
|
+
localStorage.setItem(COST_ACK_KEY, "true");
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// 隐私模式等:写入失败不影响 dismiss 体验,下次仍会出现(fail-open)
|
|
31
|
+
}
|
|
32
|
+
setVisible(false);
|
|
33
|
+
};
|
|
34
|
+
return (_jsxs("div", { className: "bg-surface/60 border border-amber/20 border-l-2 border-l-amber rounded-[6px] px-3 py-2 mt-4", children: [_jsx("p", { className: "text-ink-2 text-[14px] leading-relaxed", children: t("pages.controlCenter.empathyCostHint.body", {
|
|
35
|
+
provider,
|
|
36
|
+
model,
|
|
37
|
+
}) }), _jsx("p", { className: "text-ink-3 text-[12px] mt-1 leading-relaxed", children: t("pages.controlCenter.empathyCostHint.muted") }), _jsx("div", { className: "mt-2 flex justify-end", children: _jsx("button", { type: "button", onClick: handleAck, className: "border border-gov bg-gov text-paper rounded-[3px] px-[14px] py-[6px] text-[12.5px] font-medium hover:bg-gov-2 transition-colors focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "aria-label": t("pages.controlCenter.empathyCostHint.ack"), children: t("pages.controlCenter.empathyCostHint.ack") }) }), _jsx("span", { className: "sr-only", children: enumLabel("featureId", "empathy_observer", t) })] }));
|
|
38
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowDiagram — PD 行为回路 4 阶段图
|
|
3
|
+
*
|
|
4
|
+
* 纯展示组件,所有文本来自 i18n。Phase 03(Owner 审批)用虚线边框 +
|
|
5
|
+
* gov 色调高亮,强调"人在治理中心"(品牌 Principle 3)。
|
|
6
|
+
*
|
|
7
|
+
* 视觉规格取自 design-prototype/control-center.html 第 115-151 行。
|
|
8
|
+
*
|
|
9
|
+
* rc 合规:
|
|
10
|
+
* - rc-1: 纯展示组件,消费 i18n 字符串(已受控),无 untrusted 数据
|
|
11
|
+
* - rc-8: 无 JSON 序列化路径
|
|
12
|
+
*
|
|
13
|
+
* 品牌约束(PRI-CR1 B.4.4):
|
|
14
|
+
* - 禁止 translateY / scale hover 效果(仅 rotate 允许用于箭头朝向)
|
|
15
|
+
* - 无硬编码十六进制色值,全用 token
|
|
16
|
+
*/
|
|
17
|
+
export declare function WorkflowDiagram(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useTranslation } from "react-i18next";
|
|
3
|
+
import { ChevronRight, RefreshCw } from "lucide-react";
|
|
4
|
+
/**
|
|
5
|
+
* WorkflowDiagram — PD 行为回路 4 阶段图
|
|
6
|
+
*
|
|
7
|
+
* 纯展示组件,所有文本来自 i18n。Phase 03(Owner 审批)用虚线边框 +
|
|
8
|
+
* gov 色调高亮,强调"人在治理中心"(品牌 Principle 3)。
|
|
9
|
+
*
|
|
10
|
+
* 视觉规格取自 design-prototype/control-center.html 第 115-151 行。
|
|
11
|
+
*
|
|
12
|
+
* rc 合规:
|
|
13
|
+
* - rc-1: 纯展示组件,消费 i18n 字符串(已受控),无 untrusted 数据
|
|
14
|
+
* - rc-8: 无 JSON 序列化路径
|
|
15
|
+
*
|
|
16
|
+
* 品牌约束(PRI-CR1 B.4.4):
|
|
17
|
+
* - 禁止 translateY / scale hover 效果(仅 rotate 允许用于箭头朝向)
|
|
18
|
+
* - 无硬编码十六进制色值,全用 token
|
|
19
|
+
*/
|
|
20
|
+
export function WorkflowDiagram() {
|
|
21
|
+
const { t } = useTranslation();
|
|
22
|
+
const phases = [
|
|
23
|
+
{
|
|
24
|
+
num: "01",
|
|
25
|
+
nameKey: "pages.controlCenter.workflow.phase01",
|
|
26
|
+
descKey: "pages.controlCenter.workflow.phase01Desc",
|
|
27
|
+
isHuman: false,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
num: "02",
|
|
31
|
+
nameKey: "pages.controlCenter.workflow.phase02",
|
|
32
|
+
descKey: "pages.controlCenter.workflow.phase02Desc",
|
|
33
|
+
isHuman: false,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
num: "03",
|
|
37
|
+
nameKey: "pages.controlCenter.workflow.phase03",
|
|
38
|
+
descKey: "pages.controlCenter.workflow.phase03Desc",
|
|
39
|
+
isHuman: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
num: "04",
|
|
43
|
+
nameKey: "pages.controlCenter.workflow.phase04",
|
|
44
|
+
descKey: "pages.controlCenter.workflow.phase04Desc",
|
|
45
|
+
isHuman: false,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
return (_jsxs("div", { className: "mt-8 bg-surface border border-line-2 rounded-[8px] px-[22px] py-[18px]", children: [_jsxs("div", { className: "flex items-center gap-2 mb-4", children: [_jsx("span", { className: "text-[11px] font-mono uppercase tracking-[0.1em] text-ink-4 font-medium", children: t("pages.controlCenter.workflow.title") }), _jsx("span", { className: "text-[11px] font-mono uppercase tracking-[0.1em] text-ink-4", children: t("pages.controlCenter.workflow.subtitle") }), _jsx("span", { className: "flex-1 h-px bg-line-2", "aria-hidden": "true" })] }), _jsx("div", { className: "grid grid-cols-[1fr_24px_1fr_24px_1fr_24px_1fr] items-stretch", children: phases.map((phase, idx) => (_jsxs("div", { className: "contents", children: [_jsxs("div", { className: phase.isHuman
|
|
49
|
+
? "px-[10px] py-[12px] text-center flex flex-col gap-[5px] justify-center border border-dashed border-gov bg-gov/10 rounded-[4px]"
|
|
50
|
+
: "px-[10px] py-[12px] text-center flex flex-col gap-[5px] justify-center bg-paper-2 border border-line-2 rounded-[4px]", children: [_jsx("div", { className: "text-[10px] font-mono text-ink-4 tracking-[0.06em]", children: phase.num }), _jsx("div", { className: phase.isHuman
|
|
51
|
+
? "text-[14px] font-semibold text-gov tracking-[-0.005em]"
|
|
52
|
+
: "text-[14px] font-semibold text-ink tracking-[-0.005em]", children: t(phase.nameKey) }), _jsx("div", { className: phase.isHuman
|
|
53
|
+
? "text-[11.5px] text-gov-2 italic leading-[1.45] whitespace-pre-line"
|
|
54
|
+
: "text-[11.5px] text-ink-3 leading-[1.45] whitespace-pre-line", children: t(phase.descKey) })] }), idx < phases.length - 1 && (_jsx("div", { className: "flex items-center justify-center text-ink-4 font-mono", children: _jsx(ChevronRight, { className: "w-[18px] h-[18px]", "aria-hidden": "true" }) }))] }, phase.num))) }), _jsxs("div", { className: "mt-[14px] pt-[12px] border-t border-line-2 flex items-center gap-[10px] text-[11.5px] text-ink-4 font-mono leading-[1.5]", children: [_jsx(RefreshCw, { className: "w-[14px] h-[14px] text-gov shrink-0", "aria-hidden": "true" }), _jsx("span", { children: t("pages.controlCenter.workflow.loopHint") })] })] }));
|
|
55
|
+
}
|
|
@@ -1,5 +1,222 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { toast } from "sonner";
|
|
2
5
|
import { PageShell } from "../../components/layout/page-shell.js";
|
|
6
|
+
import { PageLoading } from "../../components/layout/page-loading.js";
|
|
7
|
+
import { SectionTitle } from "../../components/layout/section-title.js";
|
|
8
|
+
import { ShinyText } from "../../components/ui/shiny-text.js";
|
|
9
|
+
import { Button } from "../../components/ui/button.js";
|
|
10
|
+
import { AlertTriangle, Archive, Trash2 } from "lucide-react";
|
|
11
|
+
import { fetchPrinciples, fetchAllActivations, fetchGovernanceQueue, archivePrinciple, unarchivePrinciple, disableActivation, } from "../../api.js";
|
|
12
|
+
import { validatePrinciplesList, validateActivations, validateGovernanceQueue, } from "../../utils/validators.js";
|
|
13
|
+
// ── Debt Card Component (Handles its own J.1 confirmation state) ──────────────
|
|
14
|
+
function DebtCard({ item, onArchive, onDeactivate, isProcessing, }) {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const [confirmAction, setConfirmAction] = useState(null);
|
|
17
|
+
const [selectedActivationId, setSelectedActivationId] = useState(null);
|
|
18
|
+
const handleArchiveClick = () => {
|
|
19
|
+
setConfirmAction("archive");
|
|
20
|
+
};
|
|
21
|
+
const handleDeactivateClick = (activationId) => {
|
|
22
|
+
setSelectedActivationId(activationId);
|
|
23
|
+
setConfirmAction("deactivate");
|
|
24
|
+
};
|
|
25
|
+
const handleCancel = () => {
|
|
26
|
+
setConfirmAction(null);
|
|
27
|
+
setSelectedActivationId(null);
|
|
28
|
+
};
|
|
29
|
+
const handleConfirm = async () => {
|
|
30
|
+
if (confirmAction === "archive") {
|
|
31
|
+
await onArchive(item.id);
|
|
32
|
+
}
|
|
33
|
+
else if (confirmAction === "deactivate" && selectedActivationId) {
|
|
34
|
+
await onDeactivate(selectedActivationId, item.id);
|
|
35
|
+
}
|
|
36
|
+
setConfirmAction(null);
|
|
37
|
+
setSelectedActivationId(null);
|
|
38
|
+
};
|
|
39
|
+
// Render natural language reason based on debt type
|
|
40
|
+
const renderReason = () => {
|
|
41
|
+
if (item.type === "never_activated") {
|
|
42
|
+
return (_jsx("span", { className: "text-ink-2", children: t("pages.debt.reasonNeverActivated") }));
|
|
43
|
+
}
|
|
44
|
+
if (item.type === "stagnant") {
|
|
45
|
+
return (_jsxs("span", { className: "text-ink-2", children: [t("pages.debt.reasonStagnant"), item.daysSince !== undefined && (_jsxs("span", { className: "text-amber font-semibold ml-1", children: ["(", t("pages.debt.daysSinceAgo", { count: item.daysSince }), ")"] }))] }));
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
};
|
|
49
|
+
const isStagnant = item.type === "stagnant";
|
|
50
|
+
return (_jsx("article", { className: "p-5 bg-panel border border-line rounded-[6px] hover:border-line-2 transition-colors relative", "aria-label": t("pages.debt.principleAriaLabel", { id: item.id }), children: _jsxs("div", { className: "flex flex-col md:flex-row md:items-start gap-4", children: [_jsxs("div", { className: "flex-1 space-y-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-mono text-[11px] uppercase px-2 py-0.5 bg-line rounded text-ink-3", children: item.id }), _jsx("span", { className: `font-mono text-[11px] uppercase px-2 py-0.5 rounded ${isStagnant
|
|
51
|
+
? "bg-amber/10 text-amber"
|
|
52
|
+
: "bg-danger/10 text-danger"}`, children: isStagnant ? t("pages.focus.summaryStagnation") : t("pages.sidebar.debt") })] }), _jsxs("div", { className: "space-y-1", children: [_jsx("p", { className: "text-ink text-[15px] font-medium leading-relaxed", children: item.text }), item.triggerPattern && (_jsxs("p", { className: "text-ink-3 text-[13px] font-mono leading-relaxed", children: [t("principles.detail.triggerLabel", { defaultValue: "Trigger:" }), " ", item.triggerPattern] }))] }), _jsxs("div", { className: "flex items-start gap-2 pt-1", children: [_jsx(AlertTriangle, { className: "w-4 h-4 text-amber shrink-0 mt-0.5", "aria-hidden": "true" }), _jsxs("div", { className: "text-[13px] leading-relaxed", children: [_jsxs("span", { className: "font-semibold text-ink-3", children: [t("pages.debt.suggestedAction"), ": "] }), renderReason()] })] })] }), _jsx("div", { className: "flex flex-col gap-2 shrink-0 md:w-48", children: !confirmAction ? (_jsxs(_Fragment, { children: [_jsxs("button", { onClick: handleArchiveClick, disabled: isProcessing, className: "w-full inline-flex items-center justify-center gap-1.5 border border-line bg-surface text-ink hover:border-line-2 transition-colors rounded-[3px] px-[14px] py-[6px] text-[12.5px] focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "data-testid": `archive-btn-${item.id}`, children: [_jsx(Archive, { className: "w-4 h-4 text-ink-3", "aria-hidden": "true" }), t("pages.debt.actionArchive")] }), item.activeActivationRecords && item.activeActivationRecords.length > 0 ? (item.activeActivationRecords.map((ar) => (_jsxs("button", { onClick: () => handleDeactivateClick(ar.id), disabled: isProcessing, className: "w-full inline-flex items-center justify-center gap-1.5 border border-danger/20 bg-surface text-danger hover:bg-danger/5 transition-colors rounded-[3px] px-[14px] py-[6px] text-[12.5px] focus-visible:outline-2 focus-visible:outline-gov focus-visible:outline-offset-2", "data-testid": `deactivate-btn-${ar.id}`, children: [_jsx(Trash2, { className: "w-4 h-4 text-danger/80", "aria-hidden": "true" }), t("pages.debt.actionDeactivate"), " (", ar.channel, ")"] }, ar.id)))) : (_jsx("button", { disabled: true, className: "w-full inline-flex items-center justify-center gap-1.5 border border-line bg-surface/50 text-ink-4 cursor-not-allowed rounded-[3px] px-[14px] py-[6px] text-[12.5px]", title: t("pages.debt.demoteTooltip"), children: t("pages.debt.actionKeep") }))] })) : (_jsxs("div", { className: "flex flex-col gap-2 p-3 bg-surface border border-amber/20 rounded-[4px] w-full", role: "alert", "data-testid": `confirm-bar-${item.id}`, children: [_jsx("p", { className: "text-ink-2 text-[12px] leading-relaxed", children: confirmAction === "archive"
|
|
53
|
+
? t("pages.debt.confirmArchive")
|
|
54
|
+
: t("pages.debt.confirmDeactivate") }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { variant: "default", size: "sm", onClick: handleConfirm, disabled: isProcessing, className: "flex-1 text-[12px] py-1", "data-testid": `confirm-btn-${item.id}`, children: t("common.confirm") }), _jsx(Button, { variant: "outline", size: "sm", onClick: handleCancel, className: "flex-1 text-[12px] py-1", children: t("common.cancel") })] })] })) })] }) }));
|
|
55
|
+
}
|
|
56
|
+
// ── Main Page Component ──────────────────────────────────────────────────────
|
|
3
57
|
export function DebtPage() {
|
|
4
|
-
|
|
58
|
+
const { t } = useTranslation();
|
|
59
|
+
const [loadingState, setLoadingState] = useState("loading");
|
|
60
|
+
const [errorMessage, setErrorMessage] = useState(null);
|
|
61
|
+
const [debtItems, setDebtItems] = useState([]);
|
|
62
|
+
const [isProcessing, setIsProcessing] = useState(false);
|
|
63
|
+
const loadData = useCallback(async () => {
|
|
64
|
+
setLoadingState("loading");
|
|
65
|
+
setErrorMessage(null);
|
|
66
|
+
try {
|
|
67
|
+
const [principlesRes, activationsRes, govQueueRes] = await Promise.all([
|
|
68
|
+
fetchPrinciples("all"),
|
|
69
|
+
fetchAllActivations(),
|
|
70
|
+
fetchGovernanceQueue(),
|
|
71
|
+
]);
|
|
72
|
+
// Handle raw response validation (EP-01 / EP-03)
|
|
73
|
+
if (!principlesRes.success) {
|
|
74
|
+
setLoadingState("error");
|
|
75
|
+
setErrorMessage(principlesRes.error || "Failed to fetch principles");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!activationsRes.success) {
|
|
79
|
+
setLoadingState("error");
|
|
80
|
+
setErrorMessage(activationsRes.error || "Failed to fetch activations");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!govQueueRes.success) {
|
|
84
|
+
setLoadingState("error");
|
|
85
|
+
setErrorMessage(govQueueRes.error || "Failed to fetch governance queue");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const validatedPrinciples = validatePrinciplesList(principlesRes.data);
|
|
89
|
+
const validatedActivations = validateActivations(activationsRes.data);
|
|
90
|
+
const validatedGovQueue = validateGovernanceQueue(govQueueRes.data);
|
|
91
|
+
if (!validatedPrinciples || !validatedActivations || !validatedGovQueue) {
|
|
92
|
+
setLoadingState("error");
|
|
93
|
+
setErrorMessage("Data validation failed: unexpected response shape");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Filter and build the debt list (no-complexity heuristics)
|
|
97
|
+
const allPrinciples = validatedPrinciples.principles;
|
|
98
|
+
const allActivations = validatedActivations.activations;
|
|
99
|
+
const stagnationSignals = validatedGovQueue.stagnationSignals;
|
|
100
|
+
const items = [];
|
|
101
|
+
// 1. Identify "Never Activated" Principles
|
|
102
|
+
// An active principle with status === 'active' is never activated if it has no active activations.
|
|
103
|
+
const activePrinciples = allPrinciples.filter((p) => p.status === "active");
|
|
104
|
+
for (const p of activePrinciples) {
|
|
105
|
+
const principleActivations = allActivations.filter((a) => a.principleId === p.id);
|
|
106
|
+
const hasActiveActivation = principleActivations.some((a) => a.status === "active");
|
|
107
|
+
if (!hasActiveActivation) {
|
|
108
|
+
// It qualifies as never-activated debt
|
|
109
|
+
items.push({
|
|
110
|
+
id: p.id,
|
|
111
|
+
text: p.text,
|
|
112
|
+
triggerPattern: p.triggerPattern,
|
|
113
|
+
type: "never_activated",
|
|
114
|
+
status: p.status,
|
|
115
|
+
activeActivationRecords: principleActivations.filter((a) => a.status === "active"),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// 2. Identify "Stagnant" Principle Approvals (stagnant for > 7 days)
|
|
120
|
+
for (const signal of stagnationSignals) {
|
|
121
|
+
// Skip if we already added it (should not overlap, but to be safe)
|
|
122
|
+
if (items.some((item) => item.id === signal.principleId)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const p = allPrinciples.find((p) => p.id === signal.principleId);
|
|
126
|
+
if (p) {
|
|
127
|
+
items.push({
|
|
128
|
+
id: p.id,
|
|
129
|
+
text: p.text,
|
|
130
|
+
triggerPattern: p.triggerPattern,
|
|
131
|
+
type: "stagnant",
|
|
132
|
+
daysSince: signal.daysSince,
|
|
133
|
+
status: p.status,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
setDebtItems(items);
|
|
138
|
+
setLoadingState("loaded");
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
setLoadingState("error");
|
|
142
|
+
setErrorMessage(e instanceof Error ? e.message : String(e));
|
|
143
|
+
}
|
|
144
|
+
}, []);
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
loadData();
|
|
147
|
+
}, [loadData]);
|
|
148
|
+
// Archive Action: calls POST /api/principles/:id/archive and triggers J.2 Undo toast
|
|
149
|
+
const handleArchive = async (principleId) => {
|
|
150
|
+
setIsProcessing(true);
|
|
151
|
+
const result = await archivePrinciple(principleId);
|
|
152
|
+
if (result.success) {
|
|
153
|
+
// Remove it from the local view immediately
|
|
154
|
+
setDebtItems((prev) => prev.filter((item) => item.id !== principleId));
|
|
155
|
+
// J.2 Undo Toast: 5 seconds countdown action link
|
|
156
|
+
toast.success(t("pages.debt.archiveSuccess"), {
|
|
157
|
+
description: t("pages.activation.disableSuccessDescription", { id: principleId, defaultValue: `Principle ${principleId} archived` }),
|
|
158
|
+
action: {
|
|
159
|
+
label: t("pages.debt.undoAction"),
|
|
160
|
+
onClick: async () => {
|
|
161
|
+
const undoResult = await unarchivePrinciple(principleId);
|
|
162
|
+
if (undoResult.success) {
|
|
163
|
+
toast.success(t("pages.debt.undoSuccess"));
|
|
164
|
+
loadData(); // Reload to restore the principle in list
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
toast.error(t("pages.debt.undoFailed"));
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
duration: 5000,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
toast.error(t("pages.debt.archiveFailed"), {
|
|
176
|
+
description: result.error,
|
|
177
|
+
duration: 8000,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
setIsProcessing(false);
|
|
181
|
+
};
|
|
182
|
+
// Deactivate Action: calls POST /api/v1/activations/:id/disable
|
|
183
|
+
const handleDeactivate = async (activationId, principleId) => {
|
|
184
|
+
setIsProcessing(true);
|
|
185
|
+
const result = await disableActivation(activationId);
|
|
186
|
+
if (result.success) {
|
|
187
|
+
// Update local state by filtering out this deactivated record
|
|
188
|
+
setDebtItems((prev) => prev
|
|
189
|
+
.map((item) => {
|
|
190
|
+
if (item.id !== principleId)
|
|
191
|
+
return item;
|
|
192
|
+
const updatedActivations = item.activeActivationRecords?.filter((ar) => ar.id !== activationId);
|
|
193
|
+
return {
|
|
194
|
+
...item,
|
|
195
|
+
activeActivationRecords: updatedActivations,
|
|
196
|
+
};
|
|
197
|
+
}));
|
|
198
|
+
toast.success(t("pages.debt.deactivateSuccess"), {
|
|
199
|
+
description: t("pages.activation.disableSuccessDescription", { id: principleId }),
|
|
200
|
+
duration: 5000,
|
|
201
|
+
});
|
|
202
|
+
loadData(); // reload fresh state
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
toast.error(t("pages.debt.deactivateFailed"), {
|
|
206
|
+
description: result.error,
|
|
207
|
+
duration: 8000,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
setIsProcessing(false);
|
|
211
|
+
};
|
|
212
|
+
// ── Loading state ──────────────────────────────────────────────────────────
|
|
213
|
+
if (loadingState === "loading") {
|
|
214
|
+
return (_jsx(PageShell, { children: _jsx(PageLoading, { cardCount: 3, label: t("common.loading") }) }));
|
|
215
|
+
}
|
|
216
|
+
// ── Error state (ERR-002: degradation with explanation) ────────────────────
|
|
217
|
+
if (loadingState === "error") {
|
|
218
|
+
return (_jsxs(PageShell, { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.debt.eyebrow") }), _jsx("h1", { className: "text-[29px] font-semibold tracking-tight text-ink mb-2", children: t("pages.debt.title") }), _jsxs("div", { className: "mt-6 p-4 bg-panel border border-line rounded-[6px] text-ink-2 text-sm", children: [_jsx("p", { children: t("pages.debt.loadError") }), errorMessage && (_jsx("p", { className: "mt-2 text-ink-4 text-[13px] font-mono", children: errorMessage }))] })] }));
|
|
219
|
+
}
|
|
220
|
+
// ── Loaded state ───────────────────────────────────────────────────────────
|
|
221
|
+
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out] space-y-6", children: [_jsxs("div", { children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.debt.eyebrow") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: debtItems.length === 0, children: t("pages.debt.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed", children: t("pages.debt.subtitle") })] }), _jsx("section", { "aria-label": t("pages.debt.listAriaLabel"), className: "space-y-[14px]", children: debtItems.length > 0 ? (_jsxs(_Fragment, { children: [_jsxs(SectionTitle, { id: "section-debt-list", children: [t("pages.sidebar.debt"), " (", debtItems.length, ")"] }), _jsx("div", { className: "space-y-[14px]", children: debtItems.map((item) => (_jsx(DebtCard, { item: item, onArchive: handleArchive, onDeactivate: handleDeactivate, isProcessing: isProcessing }, `${item.id}-${item.type}`))) })] })) : (_jsxs("div", { className: "p-8 text-center bg-panel border border-line border-dashed rounded-[6px] space-y-3", role: "status", children: [_jsx("p", { className: "text-ink-2 font-medium text-[16px]", children: t("pages.debt.emptyTitle") }), _jsx("p", { className: "text-ink-3 text-[13px] max-w-[500px] mx-auto leading-relaxed", children: t("pages.debt.emptyDescription") })] })) })] }) }));
|
|
5
222
|
}
|
|
@@ -7,6 +7,7 @@ import { PageShell } from "../../components/layout/page-shell.js";
|
|
|
7
7
|
import { PageLoading } from "../../components/layout/page-loading.js";
|
|
8
8
|
import { SectionTitle } from "../../components/layout/section-title.js";
|
|
9
9
|
import { DailyThoughtCard } from "../../components/focus/daily-thought-card.js";
|
|
10
|
+
import { ShinyText } from "../../components/ui/shiny-text.js";
|
|
10
11
|
import { fetchGovernanceQueue, fetchApprovalsGrouped, approveApproval, rejectApproval, editApproval, } from "../../api.js";
|
|
11
12
|
export function summarizeDecisionResults(results) {
|
|
12
13
|
const failures = results.filter((result) => !result.success);
|
|
@@ -414,7 +415,7 @@ export function FocusPage() {
|
|
|
414
415
|
// Map codes to i18n text
|
|
415
416
|
const stateReason = getStateReasonText(stateReasonCode, t, pendingCount);
|
|
416
417
|
const nextAction = getNextActionText(nextActionCode, t);
|
|
417
|
-
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.focus.eyebrow") }), _jsx("h1",
|
|
418
|
+
return (_jsx(PageShell, { children: _jsxs("div", { className: "animate-[pdFadeIn_400ms_ease-out]", children: [_jsx("div", { className: "font-mono text-[12px] tracking-[0.14em] text-ink-3 uppercase mb-3", children: t("pages.focus.eyebrow") }), _jsx(ShinyText, { as: "h1", className: "text-[29px] font-semibold tracking-tight text-ink mb-2", duration: 4.5, brightness: 0.5, disabled: pendingCount === 0, children: t("pages.focus.title") }), _jsx("p", { className: "text-ink-3 text-[14px] max-w-[760px] leading-relaxed mb-7", children: t("pages.focus.subtitle") }), _jsxs("div", { className: "mb-7 px-[18px] py-[14px] bg-panel border border-line rounded-[6px]", children: [_jsx("div", { className: "flex items-center gap-2 mb-1", children: _jsx("span", { className: `inline-flex items-center rounded-[2px] px-[7px] py-1 font-mono text-[11px] uppercase ${governanceState === "owner_review_ready"
|
|
418
419
|
? "bg-gov/10 text-gov border border-gov/20"
|
|
419
420
|
: governanceState === "degraded"
|
|
420
421
|
? "bg-amber/10 text-amber border border-amber/20"
|