create-principles-disciple 1.94.0 → 1.95.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 +159 -0
- package/console/dist/server/index.js +18 -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 +18 -0
- package/console/dist/server/models/IntentPageModel.js +90 -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 +3 -0
- package/console/dist/server/routes/intent.js +35 -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/ui/App.js +2 -7
- package/console/dist/ui/api.d.ts +44 -18
- package/console/dist/ui/api.js +44 -5
- package/console/dist/ui/components/layout/app-sidebar.js +2 -1
- 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 +167 -3
- package/console/dist/ui/i18n/zh-CN.json +167 -3
- package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +28 -2
- 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/debt/DebtPage.js +219 -2
- package/console/dist/ui/pages/focus/FocusPage.js +2 -1
- package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
- package/console/dist/ui/pages/intent/IntentPage.js +147 -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/validators.d.ts +163 -0
- package/console/dist/ui/utils/validators.js +433 -0
- package/console/dist/web/assets/app.css +138 -0
- package/console/dist/web/assets/app.js +3124 -1288
- 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 +118 -32
- package/core/dist/runtime-v2/__tests__/architecture-regression.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__/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/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 +65 -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.map +1 -1
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +33 -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/feature-flag-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +2 -0
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.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/core/dist/runtime-v2/index.d.ts +9 -4
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +12 -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.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 +91 -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 +6 -0
- package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/index.js +6 -0
- package/core/dist/runtime-v2/intent/index.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.d.ts +19 -0
- package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc.js +70 -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-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__/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/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/pain-signal-observability.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-observability.js +257 -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/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/index.d.ts +6 -0
- package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/index.js +5 -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/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 +124 -12
- package/core/dist/runtime-v2/store/sqlite-connection.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/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 +166 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
- package/pd-cli/dist/commands/intent.d.ts +59 -0
- package/pd-cli/dist/commands/intent.d.ts.map +1 -0
- package/pd-cli/dist/commands/intent.js +350 -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/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 +28 -0
- package/plugin/dist/core/intent-doc-reader-adapter.js +56 -0
- package/plugin/dist/core/intent-doc-reader.d.ts +80 -0
- package/plugin/dist/core/intent-doc-reader.js +189 -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/trajectory.d.ts +16 -0
- package/plugin/dist/core/trajectory.js +332 -254
- package/plugin/dist/core/workspace-context.d.ts +2 -3
- 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 +80 -21
- package/plugin/dist/index.d.ts +3 -1
- package/plugin/dist/index.js +9 -5
- 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/principle-tree-ledger-adapter.d.ts +0 -32
- package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
- 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/validate-live-path.ts +0 -462
|
@@ -357,6 +357,15 @@ export function validateAgentBindingUpdate(v) {
|
|
|
357
357
|
return null;
|
|
358
358
|
return { agent: v.agent, runtimeProfile: v.runtimeProfile, enabled: v.enabled };
|
|
359
359
|
}
|
|
360
|
+
export function validateFeatureFlagUpdate(v) {
|
|
361
|
+
if (!isObject(v))
|
|
362
|
+
return null;
|
|
363
|
+
if (!Object.hasOwn(v, 'feature') || !isString(v.feature))
|
|
364
|
+
return null;
|
|
365
|
+
if (!Object.hasOwn(v, 'enabled') || !isBoolean(v.enabled))
|
|
366
|
+
return null;
|
|
367
|
+
return { feature: v.feature, enabled: v.enabled };
|
|
368
|
+
}
|
|
360
369
|
export function validateReadinessCheck(v) {
|
|
361
370
|
if (!isObject(v))
|
|
362
371
|
return null;
|
|
@@ -934,6 +943,320 @@ const VALID_EVIDENCE_CHAIN_STATES = new Set([
|
|
|
934
943
|
'malformed',
|
|
935
944
|
'degraded',
|
|
936
945
|
]);
|
|
946
|
+
// ── Intent Tension (PRI-469, SPEC §16) ───────────────────────────────────────
|
|
947
|
+
//
|
|
948
|
+
// Frontend mirror of the core IntentTension type. `confidence` is forbidden
|
|
949
|
+
// (SPEC §16.3) — validateIntentTension rejects any object carrying it.
|
|
950
|
+
// This validator is the Console's trust boundary: untrusted JSON from the API
|
|
951
|
+
// is narrowed here before any UI code touches it (ERR-001).
|
|
952
|
+
const VALID_INTENT_TENSION_SOURCES = ['none', 'action_drift', 'intent_suspect', 'healthy_tension'];
|
|
953
|
+
const VALID_EVIDENCE_STRENGTHS = ['weak', 'moderate', 'strong'];
|
|
954
|
+
const VALID_INTENT_RELATED_FIELDS = [
|
|
955
|
+
'why',
|
|
956
|
+
'desired_outcome',
|
|
957
|
+
'non_negotiables',
|
|
958
|
+
'stop_escalation',
|
|
959
|
+
'current_strategic_focus',
|
|
960
|
+
];
|
|
961
|
+
const VALID_SUGGESTED_OWNER_ACTIONS = [
|
|
962
|
+
'confirm_drift',
|
|
963
|
+
'revise_intent',
|
|
964
|
+
'observe',
|
|
965
|
+
'dismiss',
|
|
966
|
+
'promote_to_principle',
|
|
967
|
+
'promote_to_rulehost',
|
|
968
|
+
];
|
|
969
|
+
/**
|
|
970
|
+
* Validate an untrusted `intentTension` object from the EvidenceChain API
|
|
971
|
+
* response. Returns `null` when malformed; the caller (validateEvidenceChainRecord)
|
|
972
|
+
* treats a `null` intentTension as "not present" so the record is still usable.
|
|
973
|
+
*
|
|
974
|
+
* SPEC §16.3: `confidence` is forbidden — explicitly rejected here.
|
|
975
|
+
* SPEC §16.4: evidence is capped at 3 items; we accept up to 3 and reject
|
|
976
|
+
* arrays with non-string elements (ERR-005/007).
|
|
977
|
+
*/
|
|
978
|
+
export function validateIntentTension(v) {
|
|
979
|
+
if (!isObject(v))
|
|
980
|
+
return null;
|
|
981
|
+
// SPEC §16.3: confidence is forbidden on intentTension.
|
|
982
|
+
if (Object.hasOwn(v, 'confidence'))
|
|
983
|
+
return null;
|
|
984
|
+
// Required fields (ERR-009: fail loud when missing or wrong type)
|
|
985
|
+
if (!Object.hasOwn(v, 'source') || !isString(v.source))
|
|
986
|
+
return null;
|
|
987
|
+
if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
|
|
988
|
+
return null;
|
|
989
|
+
if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
|
|
990
|
+
return null;
|
|
991
|
+
if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
|
|
992
|
+
return null;
|
|
993
|
+
if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
|
|
994
|
+
return null;
|
|
995
|
+
const relatedIntentFields = [];
|
|
996
|
+
for (const f of v.relatedIntentFields) {
|
|
997
|
+
if (typeof f !== 'string')
|
|
998
|
+
return null;
|
|
999
|
+
if (!VALID_INTENT_RELATED_FIELDS.includes(f))
|
|
1000
|
+
return null;
|
|
1001
|
+
relatedIntentFields.push(f);
|
|
1002
|
+
}
|
|
1003
|
+
if (!Object.hasOwn(v, 'evidence') || !Array.isArray(v.evidence))
|
|
1004
|
+
return null;
|
|
1005
|
+
const evidence = [];
|
|
1006
|
+
for (const e of v.evidence) {
|
|
1007
|
+
if (typeof e !== 'string')
|
|
1008
|
+
return null;
|
|
1009
|
+
evidence.push(e);
|
|
1010
|
+
}
|
|
1011
|
+
// SPEC §16.4: cap at 3. Server-side already truncates, but the frontend
|
|
1012
|
+
// must not trust that — enforce the cap here too (defense in depth).
|
|
1013
|
+
const truncatedEvidence = evidence.slice(0, 3);
|
|
1014
|
+
if (!Object.hasOwn(v, 'explanation') || !isString(v.explanation))
|
|
1015
|
+
return null;
|
|
1016
|
+
if (v.explanation.length === 0)
|
|
1017
|
+
return null;
|
|
1018
|
+
if (!Object.hasOwn(v, 'suggestedOwnerAction') || !isString(v.suggestedOwnerAction))
|
|
1019
|
+
return null;
|
|
1020
|
+
if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.suggestedOwnerAction))
|
|
1021
|
+
return null;
|
|
1022
|
+
const result = {
|
|
1023
|
+
source: v.source,
|
|
1024
|
+
evidenceStrength: v.evidenceStrength,
|
|
1025
|
+
relatedIntentFields,
|
|
1026
|
+
evidence: truncatedEvidence,
|
|
1027
|
+
explanation: v.explanation,
|
|
1028
|
+
suggestedOwnerAction: v.suggestedOwnerAction,
|
|
1029
|
+
};
|
|
1030
|
+
// Optional: intentDocHash
|
|
1031
|
+
if (Object.hasOwn(v, 'intentDocHash')) {
|
|
1032
|
+
if (!isString(v.intentDocHash))
|
|
1033
|
+
return null;
|
|
1034
|
+
result.intentDocHash = v.intentDocHash;
|
|
1035
|
+
}
|
|
1036
|
+
return result;
|
|
1037
|
+
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Validate an untrusted IntentDecisionRecord object from the API.
|
|
1040
|
+
* Returns null when malformed (Rule 3: fail loud on missing/wrong-type fields).
|
|
1041
|
+
*
|
|
1042
|
+
* Enum fields (source, evidenceStrength, ownerAction) are validated against
|
|
1043
|
+
* the same sets used by validateIntentTension. relatedIntentFields elements
|
|
1044
|
+
* are validated against VALID_INTENT_RELATED_FIELDS.
|
|
1045
|
+
*/
|
|
1046
|
+
export function validateIntentDecisionRecord(v) {
|
|
1047
|
+
if (!isObject(v))
|
|
1048
|
+
return null;
|
|
1049
|
+
// Required fields (ERR-009: fail loud when missing or wrong type)
|
|
1050
|
+
if (!Object.hasOwn(v, 'id') || !isString(v.id))
|
|
1051
|
+
return null;
|
|
1052
|
+
if (!Object.hasOwn(v, 'source') || !isString(v.source))
|
|
1053
|
+
return null;
|
|
1054
|
+
if (!VALID_INTENT_TENSION_SOURCES.includes(v.source))
|
|
1055
|
+
return null;
|
|
1056
|
+
if (!Object.hasOwn(v, 'evidenceStrength') || !isString(v.evidenceStrength))
|
|
1057
|
+
return null;
|
|
1058
|
+
if (!VALID_EVIDENCE_STRENGTHS.includes(v.evidenceStrength))
|
|
1059
|
+
return null;
|
|
1060
|
+
if (!Object.hasOwn(v, 'relatedIntentFields') || !Array.isArray(v.relatedIntentFields))
|
|
1061
|
+
return null;
|
|
1062
|
+
const relatedIntentFields = [];
|
|
1063
|
+
for (const f of v.relatedIntentFields) {
|
|
1064
|
+
if (typeof f !== 'string')
|
|
1065
|
+
return null;
|
|
1066
|
+
if (!VALID_INTENT_RELATED_FIELDS.includes(f))
|
|
1067
|
+
return null;
|
|
1068
|
+
relatedIntentFields.push(f);
|
|
1069
|
+
}
|
|
1070
|
+
if (!Object.hasOwn(v, 'ownerAction') || !isString(v.ownerAction))
|
|
1071
|
+
return null;
|
|
1072
|
+
if (!VALID_SUGGESTED_OWNER_ACTIONS.includes(v.ownerAction))
|
|
1073
|
+
return null;
|
|
1074
|
+
if (!Object.hasOwn(v, 'evidenceRefs') || !Array.isArray(v.evidenceRefs))
|
|
1075
|
+
return null;
|
|
1076
|
+
const evidenceRefs = [];
|
|
1077
|
+
for (const e of v.evidenceRefs) {
|
|
1078
|
+
if (typeof e !== 'string')
|
|
1079
|
+
return null;
|
|
1080
|
+
evidenceRefs.push(e);
|
|
1081
|
+
}
|
|
1082
|
+
if (!Object.hasOwn(v, 'createdAt') || !isString(v.createdAt))
|
|
1083
|
+
return null;
|
|
1084
|
+
const result = {
|
|
1085
|
+
id: v.id,
|
|
1086
|
+
source: v.source,
|
|
1087
|
+
evidenceStrength: v.evidenceStrength,
|
|
1088
|
+
relatedIntentFields,
|
|
1089
|
+
ownerAction: v.ownerAction,
|
|
1090
|
+
evidenceRefs,
|
|
1091
|
+
createdAt: v.createdAt,
|
|
1092
|
+
};
|
|
1093
|
+
// Optional fields — fail loud when present but wrong type (ERR-009)
|
|
1094
|
+
if (Object.hasOwn(v, 'painId')) {
|
|
1095
|
+
if (!isString(v.painId))
|
|
1096
|
+
return null;
|
|
1097
|
+
result.painId = v.painId;
|
|
1098
|
+
}
|
|
1099
|
+
if (Object.hasOwn(v, 'taskId')) {
|
|
1100
|
+
if (!isString(v.taskId))
|
|
1101
|
+
return null;
|
|
1102
|
+
result.taskId = v.taskId;
|
|
1103
|
+
}
|
|
1104
|
+
if (Object.hasOwn(v, 'runId')) {
|
|
1105
|
+
if (!isString(v.runId))
|
|
1106
|
+
return null;
|
|
1107
|
+
result.runId = v.runId;
|
|
1108
|
+
}
|
|
1109
|
+
if (Object.hasOwn(v, 'intentDocHash')) {
|
|
1110
|
+
if (!isString(v.intentDocHash))
|
|
1111
|
+
return null;
|
|
1112
|
+
result.intentDocHash = v.intentDocHash;
|
|
1113
|
+
}
|
|
1114
|
+
if (Object.hasOwn(v, 'resultingCandidateId')) {
|
|
1115
|
+
if (!isString(v.resultingCandidateId))
|
|
1116
|
+
return null;
|
|
1117
|
+
result.resultingCandidateId = v.resultingCandidateId;
|
|
1118
|
+
}
|
|
1119
|
+
if (Object.hasOwn(v, 'resultingRuleCandidateId')) {
|
|
1120
|
+
if (!isString(v.resultingRuleCandidateId))
|
|
1121
|
+
return null;
|
|
1122
|
+
result.resultingRuleCandidateId = v.resultingRuleCandidateId;
|
|
1123
|
+
}
|
|
1124
|
+
if (Object.hasOwn(v, 'patchProposalId')) {
|
|
1125
|
+
if (!isString(v.patchProposalId))
|
|
1126
|
+
return null;
|
|
1127
|
+
result.patchProposalId = v.patchProposalId;
|
|
1128
|
+
}
|
|
1129
|
+
return result;
|
|
1130
|
+
}
|
|
1131
|
+
/**
|
|
1132
|
+
* Validate a list of IntentDecisionRecord objects. Returns null if any
|
|
1133
|
+
* element is malformed (ERR-005/007: validate array element types).
|
|
1134
|
+
*/
|
|
1135
|
+
export function validateIntentDecisionList(v) {
|
|
1136
|
+
return validateArray(v, validateIntentDecisionRecord);
|
|
1137
|
+
}
|
|
1138
|
+
/**
|
|
1139
|
+
* Validate the POST /api/v1/intent-decisions response envelope.
|
|
1140
|
+
* Shape: { record: IntentDecisionRecord, created: boolean }
|
|
1141
|
+
*/
|
|
1142
|
+
export function validateIntentDecisionResult(v) {
|
|
1143
|
+
if (!isObject(v))
|
|
1144
|
+
return null;
|
|
1145
|
+
if (!Object.hasOwn(v, 'record'))
|
|
1146
|
+
return null;
|
|
1147
|
+
const record = validateIntentDecisionRecord(v.record);
|
|
1148
|
+
if (record === null)
|
|
1149
|
+
return null;
|
|
1150
|
+
if (!Object.hasOwn(v, 'created') || !isBoolean(v.created))
|
|
1151
|
+
return null;
|
|
1152
|
+
return { record, created: v.created };
|
|
1153
|
+
}
|
|
1154
|
+
/**
|
|
1155
|
+
* Validate the GET /api/v1/intent-decisions/summary response.
|
|
1156
|
+
* All 6 count keys must be present with non-negative finite numbers.
|
|
1157
|
+
* lastDecisionAt: null is valid, string is valid, anything else returns null.
|
|
1158
|
+
*/
|
|
1159
|
+
export function validateIntentDecisionSummary(v) {
|
|
1160
|
+
if (!isObject(v))
|
|
1161
|
+
return null;
|
|
1162
|
+
if (!Object.hasOwn(v, 'counts') || !isObject(v.counts))
|
|
1163
|
+
return null;
|
|
1164
|
+
const { counts } = v;
|
|
1165
|
+
// Explicit per-key checks so isNumber type guards narrow each property.
|
|
1166
|
+
if (!Object.hasOwn(counts, 'confirm_drift') || !isNumber(counts.confirm_drift) || counts.confirm_drift < 0)
|
|
1167
|
+
return null;
|
|
1168
|
+
if (!Object.hasOwn(counts, 'revise_intent') || !isNumber(counts.revise_intent) || counts.revise_intent < 0)
|
|
1169
|
+
return null;
|
|
1170
|
+
if (!Object.hasOwn(counts, 'observe') || !isNumber(counts.observe) || counts.observe < 0)
|
|
1171
|
+
return null;
|
|
1172
|
+
if (!Object.hasOwn(counts, 'dismiss') || !isNumber(counts.dismiss) || counts.dismiss < 0)
|
|
1173
|
+
return null;
|
|
1174
|
+
if (!Object.hasOwn(counts, 'promote_to_principle') || !isNumber(counts.promote_to_principle) || counts.promote_to_principle < 0)
|
|
1175
|
+
return null;
|
|
1176
|
+
if (!Object.hasOwn(counts, 'promote_to_rulehost') || !isNumber(counts.promote_to_rulehost) || counts.promote_to_rulehost < 0)
|
|
1177
|
+
return null;
|
|
1178
|
+
// lastDecisionAt: null or string
|
|
1179
|
+
if (!Object.hasOwn(v, 'lastDecisionAt'))
|
|
1180
|
+
return null;
|
|
1181
|
+
const { lastDecisionAt } = v;
|
|
1182
|
+
if (lastDecisionAt !== null && !isString(lastDecisionAt))
|
|
1183
|
+
return null;
|
|
1184
|
+
return {
|
|
1185
|
+
counts: {
|
|
1186
|
+
confirm_drift: counts.confirm_drift,
|
|
1187
|
+
revise_intent: counts.revise_intent,
|
|
1188
|
+
observe: counts.observe,
|
|
1189
|
+
dismiss: counts.dismiss,
|
|
1190
|
+
promote_to_principle: counts.promote_to_principle,
|
|
1191
|
+
promote_to_rulehost: counts.promote_to_rulehost,
|
|
1192
|
+
},
|
|
1193
|
+
lastDecisionAt,
|
|
1194
|
+
};
|
|
1195
|
+
}
|
|
1196
|
+
const FOLLOW_UP_RESPONSE_TYPES = new Set([
|
|
1197
|
+
'link_candidate',
|
|
1198
|
+
'guide_rulehost',
|
|
1199
|
+
'generate_patch_proposal',
|
|
1200
|
+
]);
|
|
1201
|
+
/**
|
|
1202
|
+
* Validate the POST /api/v1/intent-decisions/:id/follow-up response.
|
|
1203
|
+
*
|
|
1204
|
+
* The response is a discriminated union on the `type` field. Each branch has
|
|
1205
|
+
* its own required fields (Rule 3: fail loud on missing required fields).
|
|
1206
|
+
*
|
|
1207
|
+
* Common required fields: `type`, `decisionId`.
|
|
1208
|
+
* - link_candidate: + `record` (IntentDecisionRecordData), `linkedCandidateId`
|
|
1209
|
+
* - guide_rulehost: + `cliCommand`, `note`
|
|
1210
|
+
* - generate_patch_proposal: + `record`, `patchProposal: { id, markdown }`
|
|
1211
|
+
*/
|
|
1212
|
+
export function validateFollowUpResponse(v) {
|
|
1213
|
+
if (!isObject(v))
|
|
1214
|
+
return null;
|
|
1215
|
+
if (!Object.hasOwn(v, 'type') || !isString(v.type))
|
|
1216
|
+
return null;
|
|
1217
|
+
if (!FOLLOW_UP_RESPONSE_TYPES.has(v.type))
|
|
1218
|
+
return null;
|
|
1219
|
+
if (!Object.hasOwn(v, 'decisionId') || !isString(v.decisionId))
|
|
1220
|
+
return null;
|
|
1221
|
+
const typedType = v.type;
|
|
1222
|
+
const { decisionId } = v;
|
|
1223
|
+
if (typedType === 'link_candidate') {
|
|
1224
|
+
if (!Object.hasOwn(v, 'record'))
|
|
1225
|
+
return null;
|
|
1226
|
+
const record = validateIntentDecisionRecord(v.record);
|
|
1227
|
+
if (record === null)
|
|
1228
|
+
return null;
|
|
1229
|
+
if (!Object.hasOwn(v, 'linkedCandidateId') || !isString(v.linkedCandidateId))
|
|
1230
|
+
return null;
|
|
1231
|
+
return { type: 'link_candidate', decisionId, record, linkedCandidateId: v.linkedCandidateId };
|
|
1232
|
+
}
|
|
1233
|
+
if (typedType === 'guide_rulehost') {
|
|
1234
|
+
if (!Object.hasOwn(v, 'cliCommand') || !isString(v.cliCommand))
|
|
1235
|
+
return null;
|
|
1236
|
+
if (!Object.hasOwn(v, 'note') || !isString(v.note))
|
|
1237
|
+
return null;
|
|
1238
|
+
return { type: 'guide_rulehost', decisionId, cliCommand: v.cliCommand, note: v.note };
|
|
1239
|
+
}
|
|
1240
|
+
// generate_patch_proposal
|
|
1241
|
+
if (!Object.hasOwn(v, 'record'))
|
|
1242
|
+
return null;
|
|
1243
|
+
const record = validateIntentDecisionRecord(v.record);
|
|
1244
|
+
if (record === null)
|
|
1245
|
+
return null;
|
|
1246
|
+
if (!Object.hasOwn(v, 'patchProposal') || !isObject(v.patchProposal))
|
|
1247
|
+
return null;
|
|
1248
|
+
const pp = v.patchProposal;
|
|
1249
|
+
if (!Object.hasOwn(pp, 'id') || !isString(pp.id))
|
|
1250
|
+
return null;
|
|
1251
|
+
if (!Object.hasOwn(pp, 'markdown') || !isString(pp.markdown))
|
|
1252
|
+
return null;
|
|
1253
|
+
return {
|
|
1254
|
+
type: 'generate_patch_proposal',
|
|
1255
|
+
decisionId,
|
|
1256
|
+
record,
|
|
1257
|
+
patchProposal: { id: pp.id, markdown: pp.markdown },
|
|
1258
|
+
};
|
|
1259
|
+
}
|
|
937
1260
|
function validateEvidenceChainRecord(v) {
|
|
938
1261
|
if (!isObject(v))
|
|
939
1262
|
return null;
|
|
@@ -1040,6 +1363,20 @@ function validateEvidenceChainRecord(v) {
|
|
|
1040
1363
|
return null;
|
|
1041
1364
|
result.dreamerTaskStatus = v.dreamerTaskStatus;
|
|
1042
1365
|
}
|
|
1366
|
+
// PRI-469: intentTension (optional). When present but malformed, we DROP
|
|
1367
|
+
// the intentTension field but keep the rest of the record (the Owner still
|
|
1368
|
+
// sees the pain evidence). This matches the core's graceful-degradation
|
|
1369
|
+
// behavior where a malformed intentTension is omitted rather than failing
|
|
1370
|
+
// the entire record. The degradedReason on the record (if any) explains
|
|
1371
|
+
// what happened.
|
|
1372
|
+
if (Object.hasOwn(v, 'intentTension')) {
|
|
1373
|
+
const tension = validateIntentTension(v.intentTension);
|
|
1374
|
+
if (tension !== null) {
|
|
1375
|
+
result.intentTension = tension;
|
|
1376
|
+
}
|
|
1377
|
+
// If tension === null, we intentionally do NOT return null here — the
|
|
1378
|
+
// record is still valid, just without intentTension.
|
|
1379
|
+
}
|
|
1043
1380
|
return result;
|
|
1044
1381
|
}
|
|
1045
1382
|
export function validateEvidenceChain(v) {
|
|
@@ -1193,3 +1530,99 @@ export function validateTrajectoryData(v) {
|
|
|
1193
1530
|
}
|
|
1194
1531
|
return result;
|
|
1195
1532
|
}
|
|
1533
|
+
// ── Intent Page (PRI-466) ────────────────────────────────────────────────────
|
|
1534
|
+
const VALID_INTENT_REASONS = ['flag_disabled', 'not_found', 'read_error', 'parse_error', 'oversized'];
|
|
1535
|
+
const VALID_INTENT_WARNING_CODES = ['missing_section', 'empty_section', 'too_vague', 'oversized', 'parse_failed'];
|
|
1536
|
+
const VALID_INTENT_SECTION_KEYS = ['why', 'desiredOutcome', 'nonNegotiables', 'stopEscalation', 'currentStrategicFocus'];
|
|
1537
|
+
export function validateIntentWarning(v) {
|
|
1538
|
+
if (!isObject(v))
|
|
1539
|
+
return null;
|
|
1540
|
+
if (!Object.hasOwn(v, 'code') || !isString(v.code))
|
|
1541
|
+
return null;
|
|
1542
|
+
if (!VALID_INTENT_WARNING_CODES.includes(v.code))
|
|
1543
|
+
return null;
|
|
1544
|
+
if (!Object.hasOwn(v, 'message') || !isString(v.message))
|
|
1545
|
+
return null;
|
|
1546
|
+
const result = { code: v.code, message: v.message };
|
|
1547
|
+
// Runtime Contract Rule #3: fail loud on wrong-type optional fields,
|
|
1548
|
+
// consistent with validateIntentSummary's optional-field handling.
|
|
1549
|
+
if (Object.hasOwn(v, 'section')) {
|
|
1550
|
+
if (!isString(v.section))
|
|
1551
|
+
return null;
|
|
1552
|
+
result.section = v.section;
|
|
1553
|
+
}
|
|
1554
|
+
return result;
|
|
1555
|
+
}
|
|
1556
|
+
export function validateIntentSections(v) {
|
|
1557
|
+
if (!isObject(v))
|
|
1558
|
+
return null;
|
|
1559
|
+
const result = {};
|
|
1560
|
+
for (const key of VALID_INTENT_SECTION_KEYS) {
|
|
1561
|
+
if (Object.hasOwn(v, key)) {
|
|
1562
|
+
const val = v[key];
|
|
1563
|
+
if (val !== null && !isString(val))
|
|
1564
|
+
return null;
|
|
1565
|
+
if (isString(val)) {
|
|
1566
|
+
result[key] = val;
|
|
1567
|
+
}
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
return result;
|
|
1571
|
+
}
|
|
1572
|
+
export function validateIntentSummary(v) {
|
|
1573
|
+
if (!isObject(v))
|
|
1574
|
+
return null;
|
|
1575
|
+
// Required fields
|
|
1576
|
+
if (!Object.hasOwn(v, 'ok') || !isBoolean(v.ok))
|
|
1577
|
+
return null;
|
|
1578
|
+
if (!Object.hasOwn(v, 'found') || !isBoolean(v.found))
|
|
1579
|
+
return null;
|
|
1580
|
+
if (!Object.hasOwn(v, 'flagEnabled') || !isBoolean(v.flagEnabled))
|
|
1581
|
+
return null;
|
|
1582
|
+
if (!Object.hasOwn(v, 'warnings') || !Array.isArray(v.warnings))
|
|
1583
|
+
return null;
|
|
1584
|
+
const warnings = validateArray(v.warnings, validateIntentWarning);
|
|
1585
|
+
if (warnings === null)
|
|
1586
|
+
return null;
|
|
1587
|
+
const result = {
|
|
1588
|
+
ok: v.ok,
|
|
1589
|
+
found: v.found,
|
|
1590
|
+
flagEnabled: v.flagEnabled,
|
|
1591
|
+
warnings,
|
|
1592
|
+
};
|
|
1593
|
+
// Optional fields — validate type if present, fail loud on wrong type
|
|
1594
|
+
if (Object.hasOwn(v, 'reason')) {
|
|
1595
|
+
if (!isString(v.reason))
|
|
1596
|
+
return null;
|
|
1597
|
+
if (!VALID_INTENT_REASONS.includes(v.reason))
|
|
1598
|
+
return null;
|
|
1599
|
+
result.reason = v.reason;
|
|
1600
|
+
}
|
|
1601
|
+
if (Object.hasOwn(v, 'nextAction')) {
|
|
1602
|
+
if (!isString(v.nextAction))
|
|
1603
|
+
return null;
|
|
1604
|
+
result.nextAction = v.nextAction;
|
|
1605
|
+
}
|
|
1606
|
+
if (Object.hasOwn(v, 'path')) {
|
|
1607
|
+
if (!isString(v.path))
|
|
1608
|
+
return null;
|
|
1609
|
+
result.path = v.path;
|
|
1610
|
+
}
|
|
1611
|
+
if (Object.hasOwn(v, 'contentHash')) {
|
|
1612
|
+
if (!isString(v.contentHash))
|
|
1613
|
+
return null;
|
|
1614
|
+
result.contentHash = v.contentHash;
|
|
1615
|
+
}
|
|
1616
|
+
if (Object.hasOwn(v, 'lastEditedAt')) {
|
|
1617
|
+
if (!isString(v.lastEditedAt))
|
|
1618
|
+
return null;
|
|
1619
|
+
result.lastEditedAt = v.lastEditedAt;
|
|
1620
|
+
}
|
|
1621
|
+
if (Object.hasOwn(v, 'sections')) {
|
|
1622
|
+
const sections = validateIntentSections(v.sections);
|
|
1623
|
+
if (sections === null)
|
|
1624
|
+
return null;
|
|
1625
|
+
result.sections = sections;
|
|
1626
|
+
}
|
|
1627
|
+
return result;
|
|
1628
|
+
}
|