create-principles-disciple 1.93.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 +40 -1
- package/console/dist/server/config/pd-config-store.js +170 -1
- package/console/dist/server/index.js +28 -10
- package/console/dist/server/models/ApprovalsConsoleModel.js +4 -12
- 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/feedback-reports.js +1 -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/index.d.ts +2 -2
- package/core/dist/index.d.ts.map +1 -1
- package/core/dist/index.js +1 -1
- package/core/dist/index.js.map +1 -1
- 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__/model-config.test.d.ts +2 -0
- package/core/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
- package/core/dist/prompt-builder/__tests__/model-config.test.js +158 -0
- package/core/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
- 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/__tests__/xml-escape.test.d.ts +2 -0
- package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
- package/core/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
- package/core/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
- 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/index.d.ts +3 -0
- package/core/dist/prompt-builder/index.d.ts.map +1 -1
- package/core/dist/prompt-builder/index.js +2 -0
- package/core/dist/prompt-builder/index.js.map +1 -1
- package/core/dist/prompt-builder/model-config.d.ts +42 -0
- package/core/dist/prompt-builder/model-config.d.ts.map +1 -0
- package/core/dist/prompt-builder/model-config.js +84 -0
- package/core/dist/prompt-builder/model-config.js.map +1 -0
- 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/prompt-builder/xml-escape.d.ts +12 -0
- package/core/dist/prompt-builder/xml-escape.d.ts.map +1 -0
- package/core/dist/prompt-builder/xml-escape.js +19 -0
- package/core/dist/prompt-builder/xml-escape.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +205 -48
- 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.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +500 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -0
- 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/bridge-result-shaper.d.ts +53 -0
- package/core/dist/runtime-v2/bridge-result-shaper.d.ts.map +1 -0
- package/core/dist/runtime-v2/bridge-result-shaper.js +117 -0
- package/core/dist/runtime-v2/bridge-result-shaper.js.map +1 -0
- package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
- package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
- package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
- package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
- package/core/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
- package/core/dist/runtime-v2/detection/index.d.ts +10 -0
- package/core/dist/runtime-v2/detection/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/detection/index.js +9 -0
- package/core/dist/runtime-v2/detection/index.js.map +1 -0
- 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/__tests__/observation-resolver.test.d.ts +12 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +181 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
- package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
- package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/index.js +3 -0
- package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +128 -0
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +203 -0
- package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
- 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/evidence-triage/triage-policy.d.ts +4 -0
- package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
- package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
- package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +56 -4
- 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 +11 -2
- 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/feedback/__tests__/redact-sensitive.test.d.ts +15 -0
- package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js +450 -0
- package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js.map +1 -0
- package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts +13 -0
- package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js +243 -0
- package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js.map +1 -0
- package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts +12 -0
- package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js +172 -0
- package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js.map +1 -0
- package/core/dist/runtime-v2/index.d.ts +15 -6
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +15 -4
- 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__/c2-live-runner-chain.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +306 -0
- package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.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/internalization/index.d.ts +0 -16
- package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/index.js +0 -8
- package/core/dist/runtime-v2/internalization/index.js.map +1 -1
- package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
- package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
- package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/pain-gate/index.d.ts +10 -0
- package/core/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/pain-gate/index.js +9 -0
- package/core/dist/runtime-v2/pain-gate/index.js.map +1 -0
- package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +121 -0
- package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +157 -0
- package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
- package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-bridge.js +14 -88
- package/core/dist/runtime-v2/pain-signal-bridge.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 +272 -61
- 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 -61
- package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-types.js +2 -36
- 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 +7 -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/runtime-v2/types/pain-signal.d.ts +2 -2
- package/core/dist/runtime-v2/types/pain-signal.js +2 -2
- 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/dist/mvp-config.d.ts +0 -10
- package/dist/mvp-config.d.ts.map +1 -1
- package/dist/mvp-config.js +0 -65
- package/dist/mvp-config.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/mvp-smoke.js +1 -1
- package/pd-cli/dist/commands/mvp-smoke.js.map +1 -1
- package/pd-cli/dist/commands/rulecode.js +1 -1
- package/pd-cli/dist/commands/rulecode.js.map +1 -1
- package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-canary.js +10 -11
- package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
- 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/commands/runtime-internalization-queue.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-queue.js +13 -16
- package/pd-cli/dist/commands/runtime-internalization-queue.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-once.js +3 -0
- package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +61 -7
- package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
- package/pd-cli/dist/commands/runtime.js +1 -1
- package/pd-cli/dist/commands/runtime.js.map +1 -1
- package/pd-cli/dist/index.js +92 -34
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts +2 -0
- package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts.map +1 -0
- package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js +314 -0
- package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js.map +1 -0
- package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +20 -12
- package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.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/dist/services/rulehost-readiness.d.ts +62 -0
- package/pd-cli/dist/services/rulehost-readiness.d.ts.map +1 -0
- package/pd-cli/dist/services/rulehost-readiness.js +214 -0
- package/pd-cli/dist/services/rulehost-readiness.js.map +1 -0
- package/pd-cli/dist/services/runtime-adapter-resolver.d.ts +1 -1
- package/pd-cli/dist/services/runtime-adapter-resolver.js +3 -3
- package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
- package/pd-cli/package.json +1 -0
- package/plugin/dist/commands/evolution-status.js +0 -2
- 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/detection-funnel.d.ts +25 -11
- package/plugin/dist/core/detection-funnel.js +32 -80
- package/plugin/dist/core/event-log.d.ts +1 -3
- package/plugin/dist/core/event-log.js +5 -21
- package/plugin/dist/core/evolution-reducer.d.ts +0 -8
- package/plugin/dist/core/evolution-reducer.js +9 -19
- 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/pain-diagnostic-gate.d.ts +37 -28
- package/plugin/dist/core/pain-diagnostic-gate.js +53 -89
- package/plugin/dist/core/pain.d.ts +0 -63
- package/plugin/dist/core/pain.js +0 -167
- package/plugin/dist/core/paths.d.ts +0 -1
- package/plugin/dist/core/paths.js +2 -1
- 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/schema/migrations/001-init-trajectory.js +3 -6
- package/plugin/dist/core/schema/schema-definitions.js +4 -9
- package/plugin/dist/core/trajectory.d.ts +16 -16
- package/plugin/dist/core/trajectory.js +338 -311
- package/plugin/dist/core/workspace-context.d.ts +2 -3
- package/plugin/dist/hooks/after-tool-call-helpers.d.ts +4 -1
- package/plugin/dist/hooks/after-tool-call-helpers.js +13 -17
- package/plugin/dist/hooks/gate-block-helper.js +57 -17
- package/plugin/dist/hooks/lifecycle.js +3 -6
- package/plugin/dist/hooks/llm.js +66 -26
- package/plugin/dist/hooks/pain.d.ts +3 -1
- package/plugin/dist/hooks/pain.js +124 -49
- package/plugin/dist/hooks/prompt-helpers.d.ts +105 -0
- package/plugin/dist/hooks/prompt-helpers.js +288 -0
- package/plugin/dist/hooks/prompt-types.d.ts +74 -0
- package/plugin/dist/hooks/prompt-types.js +12 -0
- package/plugin/dist/hooks/prompt.d.ts +7 -38
- package/plugin/dist/hooks/prompt.js +433 -338
- package/plugin/dist/hooks/raw-observation-adapter.d.ts +9 -50
- package/plugin/dist/hooks/raw-observation-adapter.js +9 -164
- package/plugin/dist/hooks/raw-observation-types.d.ts +6 -57
- package/plugin/dist/hooks/raw-observation-types.js +5 -9
- package/plugin/dist/hooks/triage-adapter.js +6 -26
- package/plugin/dist/hooks/trigger-cooldown-tracker.d.ts +12 -0
- package/plugin/dist/hooks/trigger-cooldown-tracker.js +25 -0
- package/plugin/dist/index.d.ts +3 -1
- package/plugin/dist/index.js +9 -5
- package/plugin/dist/service/evolution-worker.js +6 -64
- package/plugin/dist/service/runtime-summary-service.d.ts +0 -2
- package/plugin/dist/service/runtime-summary-service.js +1 -5
- 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/scripts/sync-plugin.mjs +33 -22
- package/plugin/templates/langs/en/skills/pd-cli-operator/SKILL.md +20 -11
- package/plugin/templates/langs/en/skills/pd-runtime-v2/SKILL.md +10 -0
- package/plugin/templates/langs/zh/skills/pd-cli-operator/SKILL.md +20 -11
- package/plugin/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +10 -0
- package/console/dist/server/config/feature-flags.d.ts +0 -25
- package/console/dist/server/config/feature-flags.js +0 -101
- package/pd-cli/dist/commands/central-sync.d.ts +0 -10
- package/pd-cli/dist/commands/central-sync.d.ts.map +0 -1
- package/pd-cli/dist/commands/central-sync.js +0 -32
- package/pd-cli/dist/commands/central-sync.js.map +0 -1
- package/pd-cli/dist/services/feature-flag-loader.d.ts +0 -6
- package/pd-cli/dist/services/feature-flag-loader.d.ts.map +0 -1
- package/pd-cli/dist/services/feature-flag-loader.js +0 -53
- package/pd-cli/dist/services/feature-flag-loader.js.map +0 -1
- package/plugin/dist/core/observability.d.ts +0 -40
- package/plugin/dist/core/observability.js +0 -164
- 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/hooks/subagent.d.ts +0 -9
- package/plugin/dist/hooks/subagent.js +0 -122
- 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 -480
|
@@ -180,9 +180,15 @@ export class ControlUiDatabase {
|
|
|
180
180
|
ON thinking_model_events(assistant_turn_id);
|
|
181
181
|
CREATE INDEX IF NOT EXISTS idx_thinking_model_events_run_id
|
|
182
182
|
ON thinking_model_events(run_id);
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
`);
|
|
184
|
+
// Views depend on tables owned by TrajectoryDatabase (assistant_turns, tool_calls,
|
|
185
|
+
// pain_events, user_turns, correction_samples). If ControlUiDatabase is constructed
|
|
186
|
+
// before TrajectoryDatabase has run initSchema (e.g. llm_output is the first hook
|
|
187
|
+
// triggered on a fresh workspace), CREATE VIEW would throw and break the hook.
|
|
188
|
+
// Wrap each view creation in try/catch so missing-dependency views are skipped with
|
|
189
|
+
// a warning rather than aborting schema initialization (rc-9: no silent fallback —
|
|
190
|
+
// failures are surfaced via console.info).
|
|
191
|
+
this.createViewSafely('v_thinking_model_usage', `
|
|
186
192
|
WITH totals AS (
|
|
187
193
|
SELECT COUNT(*) AS assistant_turns FROM assistant_turns
|
|
188
194
|
),
|
|
@@ -205,10 +211,9 @@ export class ControlUiDatabase {
|
|
|
205
211
|
ELSE ROUND(CAST(usage_rows.distinct_turns AS REAL) / CAST(totals.assistant_turns AS REAL), 4)
|
|
206
212
|
END AS coverage_rate
|
|
207
213
|
FROM usage_rows, totals
|
|
208
|
-
ORDER BY usage_rows.hits DESC, usage_rows.model_id ASC
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
CREATE VIEW v_thinking_model_effectiveness AS
|
|
214
|
+
ORDER BY usage_rows.hits DESC, usage_rows.model_id ASC
|
|
215
|
+
`);
|
|
216
|
+
this.createViewSafely('v_thinking_model_effectiveness', `
|
|
212
217
|
WITH event_windows AS (
|
|
213
218
|
SELECT
|
|
214
219
|
e.id,
|
|
@@ -274,10 +279,9 @@ export class ControlUiDatabase {
|
|
|
274
279
|
) THEN 1 ELSE 0 END) AS correction_sample_windows
|
|
275
280
|
FROM bounded_windows b
|
|
276
281
|
GROUP BY b.model_id
|
|
277
|
-
ORDER BY events DESC, model_id ASC
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
CREATE VIEW v_thinking_model_scenarios AS
|
|
282
|
+
ORDER BY events DESC, model_id ASC
|
|
283
|
+
`);
|
|
284
|
+
this.createViewSafely('v_thinking_model_scenarios', `
|
|
281
285
|
SELECT
|
|
282
286
|
e.model_id AS model_id,
|
|
283
287
|
CAST(j.value AS TEXT) AS scenario,
|
|
@@ -290,19 +294,39 @@ export class ControlUiDatabase {
|
|
|
290
294
|
END
|
|
291
295
|
) AS j
|
|
292
296
|
GROUP BY e.model_id, CAST(j.value AS TEXT)
|
|
293
|
-
ORDER BY hits DESC, scenario ASC
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
CREATE VIEW v_thinking_model_daily_trend AS
|
|
297
|
+
ORDER BY hits DESC, scenario ASC
|
|
298
|
+
`);
|
|
299
|
+
this.createViewSafely('v_thinking_model_daily_trend', `
|
|
297
300
|
SELECT
|
|
298
301
|
substr(created_at, 1, 10) AS day,
|
|
299
302
|
model_id,
|
|
300
303
|
COUNT(*) AS hits
|
|
301
304
|
FROM thinking_model_events
|
|
302
305
|
GROUP BY substr(created_at, 1, 10), model_id
|
|
303
|
-
ORDER BY day ASC, model_id ASC
|
|
306
|
+
ORDER BY day ASC, model_id ASC
|
|
304
307
|
`);
|
|
305
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Create or replace a view, tolerating missing dependency tables.
|
|
311
|
+
*
|
|
312
|
+
* Views in ControlUiDatabase depend on tables created by TrajectoryDatabase
|
|
313
|
+
* (assistant_turns, tool_calls, pain_events, user_turns, correction_samples).
|
|
314
|
+
* If ControlUiDatabase is constructed before TrajectoryDatabase has created
|
|
315
|
+
* those tables, CREATE VIEW would throw. We DROP+CREATE with try/catch so
|
|
316
|
+
* missing-dependency views are skipped with a warning (rc-9: surfaced via
|
|
317
|
+
* console.info) rather than aborting schema initialization.
|
|
318
|
+
*/
|
|
319
|
+
createViewSafely(viewName, viewBody) {
|
|
320
|
+
try {
|
|
321
|
+
this.db.exec(`DROP VIEW IF EXISTS ${viewName};`);
|
|
322
|
+
this.db.exec(`CREATE VIEW ${viewName} AS ${viewBody};`);
|
|
323
|
+
}
|
|
324
|
+
catch (err) {
|
|
325
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
326
|
+
// rc-9: surface the failure — do not silently swallow
|
|
327
|
+
console.info(`[PD:ControlUiDatabase] view ${viewName} creation skipped: ${message}. It will be created on next TrajectoryDatabase initSchema().`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
306
330
|
withWrite(fn) {
|
|
307
331
|
return withLock(this.dbPath, fn, { lockSuffix: '.trajectory.lock', lockStaleMs: 30000 });
|
|
308
332
|
}
|
|
@@ -1,24 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection Funnel — PRI-446 thin adapter
|
|
3
|
+
*
|
|
4
|
+
* The pure three-layer funnel logic (LRU cache, async queue, layer dispatch)
|
|
5
|
+
* now lives in principles-core
|
|
6
|
+
* (runtime-v2/detection/detection-funnel-policy.ts). This file is a thin shell
|
|
7
|
+
* that wires DetectionFunnelCore with the two environment-coupled dependencies
|
|
8
|
+
* the plugin owns:
|
|
9
|
+
* - crypto.createHash (the L2 cache key hasher)
|
|
10
|
+
* - PainDictionary.match (the L1 exact matcher)
|
|
11
|
+
* - shouldIgnorePainProtocolText (the protocol-token gate)
|
|
12
|
+
*
|
|
13
|
+
* It re-exports DetectionFunnel (same class name + constructor signature) and
|
|
14
|
+
* DetectionResult so DetectionService, llm.ts, and evolution-worker keep working
|
|
15
|
+
* unchanged.
|
|
16
|
+
*
|
|
17
|
+
* ERR checklist:
|
|
18
|
+
* - ERR-011: this is a thin adapter delegating to core pure logic.
|
|
19
|
+
*/
|
|
1
20
|
import { type PainDictionary } from './dictionary.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
severity?: number;
|
|
5
|
-
ruleId?: string;
|
|
6
|
-
source: 'l1_exact' | 'l2_cache' | 'l3_async_queued' | 'l3_semantic_hit';
|
|
7
|
-
}
|
|
21
|
+
import { type DetectionResult } from '@principles/core/runtime-v2';
|
|
22
|
+
export type { DetectionResult };
|
|
8
23
|
/**
|
|
9
24
|
* Orchestrates the three-layer detection funnel for pain signals.
|
|
25
|
+
*
|
|
26
|
+
* Delegates to the core DetectionFunnelCore, injecting the crypto hasher,
|
|
27
|
+
* the dictionary matcher, and the protocol-token gate.
|
|
10
28
|
*/
|
|
11
29
|
export declare class DetectionFunnel {
|
|
12
|
-
private readonly
|
|
13
|
-
private asyncQueue;
|
|
14
|
-
private readonly dictionary;
|
|
30
|
+
private readonly core;
|
|
15
31
|
constructor(dictionary: PainDictionary);
|
|
16
32
|
/**
|
|
17
33
|
* Detects pain in the given text using L1 (Exact), L2 (Cache), and L3 (Async).
|
|
18
34
|
*/
|
|
19
35
|
detect(text: string): DetectionResult;
|
|
20
|
-
private static computeHash;
|
|
21
|
-
private enqueueAsync;
|
|
22
36
|
/**
|
|
23
37
|
* Internal method for the worker to update the cache after a semantic hit.
|
|
24
38
|
*/
|
|
@@ -1,104 +1,56 @@
|
|
|
1
|
-
import { createHash } from 'crypto';
|
|
2
|
-
import { shouldIgnorePainProtocolText } from './dictionary.js';
|
|
3
1
|
/**
|
|
4
|
-
*
|
|
2
|
+
* Detection Funnel — PRI-446 thin adapter
|
|
3
|
+
*
|
|
4
|
+
* The pure three-layer funnel logic (LRU cache, async queue, layer dispatch)
|
|
5
|
+
* now lives in principles-core
|
|
6
|
+
* (runtime-v2/detection/detection-funnel-policy.ts). This file is a thin shell
|
|
7
|
+
* that wires DetectionFunnelCore with the two environment-coupled dependencies
|
|
8
|
+
* the plugin owns:
|
|
9
|
+
* - crypto.createHash (the L2 cache key hasher)
|
|
10
|
+
* - PainDictionary.match (the L1 exact matcher)
|
|
11
|
+
* - shouldIgnorePainProtocolText (the protocol-token gate)
|
|
12
|
+
*
|
|
13
|
+
* It re-exports DetectionFunnel (same class name + constructor signature) and
|
|
14
|
+
* DetectionResult so DetectionService, llm.ts, and evolution-worker keep working
|
|
15
|
+
* unchanged.
|
|
16
|
+
*
|
|
17
|
+
* ERR checklist:
|
|
18
|
+
* - ERR-011: this is a thin adapter delegating to core pure logic.
|
|
5
19
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
constructor(maxSize = 100) {
|
|
10
|
-
this.cache = new Map();
|
|
11
|
-
this.maxSize = maxSize;
|
|
12
|
-
}
|
|
13
|
-
get(key) {
|
|
14
|
-
const item = this.cache.get(key);
|
|
15
|
-
if (item !== undefined) {
|
|
16
|
-
// Refresh: delete and re-insert
|
|
17
|
-
this.cache.delete(key);
|
|
18
|
-
this.cache.set(key, item);
|
|
19
|
-
}
|
|
20
|
-
return item;
|
|
21
|
-
}
|
|
22
|
-
set(key, value) {
|
|
23
|
-
if (this.cache.has(key)) {
|
|
24
|
-
this.cache.delete(key);
|
|
25
|
-
}
|
|
26
|
-
else if (this.cache.size >= this.maxSize) {
|
|
27
|
-
// Remove the oldest (first) item
|
|
28
|
-
const firstKey = this.cache.keys().next().value;
|
|
29
|
-
if (firstKey !== undefined) {
|
|
30
|
-
this.cache.delete(firstKey);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
this.cache.set(key, value);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
20
|
+
import { createHash } from 'crypto';
|
|
21
|
+
import { shouldIgnorePainProtocolText } from './dictionary.js';
|
|
22
|
+
import { DetectionFunnelCore, } from '@principles/core/runtime-v2';
|
|
36
23
|
/**
|
|
37
24
|
* Orchestrates the three-layer detection funnel for pain signals.
|
|
25
|
+
*
|
|
26
|
+
* Delegates to the core DetectionFunnelCore, injecting the crypto hasher,
|
|
27
|
+
* the dictionary matcher, and the protocol-token gate.
|
|
38
28
|
*/
|
|
39
29
|
export class DetectionFunnel {
|
|
40
|
-
|
|
41
|
-
asyncQueue = [];
|
|
42
|
-
dictionary;
|
|
30
|
+
core;
|
|
43
31
|
constructor(dictionary) {
|
|
44
|
-
this.
|
|
32
|
+
this.core = new DetectionFunnelCore({
|
|
33
|
+
match: (text) => dictionary.match(text),
|
|
34
|
+
hash: (text) => createHash('sha256').update(text).digest('hex'),
|
|
35
|
+
shouldIgnoreProtocol: shouldIgnorePainProtocolText,
|
|
36
|
+
});
|
|
45
37
|
}
|
|
46
38
|
/**
|
|
47
39
|
* Detects pain in the given text using L1 (Exact), L2 (Cache), and L3 (Async).
|
|
48
40
|
*/
|
|
49
41
|
detect(text) {
|
|
50
|
-
|
|
51
|
-
return { detected: false, source: 'l1_exact' };
|
|
52
|
-
}
|
|
53
|
-
// --- Layer 1: Exact Match (Sync) ---
|
|
54
|
-
const exactMatch = this.dictionary.match(text);
|
|
55
|
-
if (exactMatch) {
|
|
56
|
-
return {
|
|
57
|
-
detected: true,
|
|
58
|
-
severity: exactMatch.severity,
|
|
59
|
-
ruleId: exactMatch.ruleId,
|
|
60
|
-
source: 'l1_exact'
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
// --- Layer 2: LRU Cache (Sync) ---
|
|
64
|
-
const hash = DetectionFunnel.computeHash(text);
|
|
65
|
-
const cached = this.cache.get(hash);
|
|
66
|
-
if (cached) {
|
|
67
|
-
return {
|
|
68
|
-
detected: cached.detected,
|
|
69
|
-
severity: cached.severity,
|
|
70
|
-
source: 'l2_cache'
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
// --- Layer 3: Async Semantic Queue ---
|
|
74
|
-
this.enqueueAsync(text);
|
|
75
|
-
return {
|
|
76
|
-
detected: false,
|
|
77
|
-
source: 'l3_async_queued'
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
static computeHash(text) {
|
|
81
|
-
return createHash('sha256').update(text).digest('hex');
|
|
82
|
-
}
|
|
83
|
-
enqueueAsync(text) {
|
|
84
|
-
if (this.asyncQueue.length < 1000) {
|
|
85
|
-
this.asyncQueue.push(text);
|
|
86
|
-
}
|
|
87
|
-
// Worker will pick this up and perform semantic search via createMemorySearchTool
|
|
42
|
+
return this.core.detect(text);
|
|
88
43
|
}
|
|
89
44
|
/**
|
|
90
45
|
* Internal method for the worker to update the cache after a semantic hit.
|
|
91
46
|
*/
|
|
92
47
|
updateCache(text, result) {
|
|
93
|
-
|
|
94
|
-
this.cache.set(hash, result);
|
|
48
|
+
this.core.updateCache(text, result);
|
|
95
49
|
}
|
|
96
50
|
/**
|
|
97
51
|
* Retrieves and clears the current asynchronous queue.
|
|
98
52
|
*/
|
|
99
53
|
flushQueue() {
|
|
100
|
-
|
|
101
|
-
this.asyncQueue = [];
|
|
102
|
-
return queue;
|
|
54
|
+
return this.core.flushQueue();
|
|
103
55
|
}
|
|
104
56
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EventLogEntry, DailyStats, EmpathyEventStats, ToolCallEventData, PainSignalEventData,
|
|
1
|
+
import type { EventLogEntry, DailyStats, EmpathyEventStats, ToolCallEventData, PainSignalEventData, RulePromotionEventData, HookExecutionEventData, GateBlockEventData, GateBypassEventData, PlanApprovalEventData, EvolutionTaskEventData, EmpathyRollbackEventData, DiagnosisTaskEventData, HeartbeatDiagnosisEventData, DiagnosticianReportEventData, PrincipleCandidateEventData, RuleEnforcedEventData, RuleHostEvaluatedEventData, RuleHostBlockedEventData, RuleHostRequireApprovalEventData, RuleHostAutoCorrectProposedEventData, RuleHostAutoCorrectAppliedEventData, RuntimeV2PromptActivationsInjectedEventData, RuleHostUnhealthyEventData } from '../types/event-types.js';
|
|
2
2
|
import type { PluginLogger } from '../openclaw-sdk.js';
|
|
3
3
|
export declare class EventLog {
|
|
4
4
|
private readonly logsDir;
|
|
@@ -11,7 +11,6 @@ export declare class EventLog {
|
|
|
11
11
|
private flushTimer?;
|
|
12
12
|
private currentEventsFile;
|
|
13
13
|
private currentDate;
|
|
14
|
-
private readonly painScoreSums;
|
|
15
14
|
constructor(stateDir: string, logger?: PluginLogger);
|
|
16
15
|
private getEventsFile;
|
|
17
16
|
private getTodayStr;
|
|
@@ -19,7 +18,6 @@ export declare class EventLog {
|
|
|
19
18
|
private cleanupOldEventFiles;
|
|
20
19
|
recordToolCall(sessionId: string | undefined, data: ToolCallEventData): void;
|
|
21
20
|
recordPainSignal(sessionId: string | undefined, data: PainSignalEventData): void;
|
|
22
|
-
recordRuleMatch(sessionId: string | undefined, data: RuleMatchEventData): void;
|
|
23
21
|
recordRulePromotion(data: RulePromotionEventData): void;
|
|
24
22
|
recordHookExecution(data: HookExecutionEventData, opts?: {
|
|
25
23
|
flushImmediately?: boolean;
|
|
@@ -15,7 +15,8 @@ export class EventLog {
|
|
|
15
15
|
flushTimer;
|
|
16
16
|
currentEventsFile;
|
|
17
17
|
currentDate;
|
|
18
|
-
painScoreSums
|
|
18
|
+
// painScoreSums map removed (PRI-451 Wave 1.5): it only fed the dead
|
|
19
|
+
// stats.pain.avgScore counter, which is also removed.
|
|
19
20
|
constructor(stateDir, logger) {
|
|
20
21
|
this.logsDir = path.join(stateDir, 'logs');
|
|
21
22
|
if (!fs.existsSync(this.logsDir)) {
|
|
@@ -68,9 +69,6 @@ export class EventLog {
|
|
|
68
69
|
recordPainSignal(sessionId, data) {
|
|
69
70
|
this.record('pain_signal', 'detected', sessionId, data);
|
|
70
71
|
}
|
|
71
|
-
recordRuleMatch(sessionId, data) {
|
|
72
|
-
this.record('rule_match', 'detected', sessionId, data);
|
|
73
|
-
}
|
|
74
72
|
recordRulePromotion(data) {
|
|
75
73
|
this.record('rule_promotion', 'promoted', undefined, data);
|
|
76
74
|
}
|
|
@@ -293,16 +291,8 @@ export class EventLog {
|
|
|
293
291
|
}
|
|
294
292
|
else if (entry.type === 'pain_signal') {
|
|
295
293
|
const data = entry.data;
|
|
296
|
-
stats.pain.
|
|
297
|
-
|
|
298
|
-
if (data.source) {
|
|
299
|
-
stats.pain.signalsBySource[data.source] = (stats.pain.signalsBySource[data.source] || 0) + 1;
|
|
300
|
-
}
|
|
301
|
-
const currentSum = this.painScoreSums.get(entry.date) ?? 0;
|
|
302
|
-
this.painScoreSums.set(entry.date, currentSum + (data.score || 0));
|
|
303
|
-
stats.pain.avgScore = stats.pain.signalsDetected > 0
|
|
304
|
-
? Math.round((currentSum + (data.score || 0)) / stats.pain.signalsDetected)
|
|
305
|
-
: 0;
|
|
294
|
+
// stats.pain.* counters removed (PRI-451 Wave 1.5): no live reader.
|
|
295
|
+
// The user_empathy aggregation below (stats.empathy.*) is LIVE and stays.
|
|
306
296
|
if (data.source === 'user_empathy') {
|
|
307
297
|
if (data.deduped) {
|
|
308
298
|
stats.empathy.dedupedCount++;
|
|
@@ -358,14 +348,8 @@ export class EventLog {
|
|
|
358
348
|
stats.empathy.rollbackCount++;
|
|
359
349
|
stats.empathy.rolledBackScore += data.originalScore || 0;
|
|
360
350
|
}
|
|
361
|
-
else if (entry.type === 'rule_match') {
|
|
362
|
-
const data = entry.data;
|
|
363
|
-
if (data.ruleId) {
|
|
364
|
-
stats.pain.rulesMatched[data.ruleId] = (stats.pain.rulesMatched[data.ruleId] || 0) + 1;
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
351
|
else if (entry.type === 'rule_promotion') {
|
|
368
|
-
stats.pain.candidatesPromoted
|
|
352
|
+
// stats.pain.candidatesPromoted removed (PRI-451 Wave 1.5): dead counter.
|
|
369
353
|
stats.evolution.rulesPromoted++;
|
|
370
354
|
}
|
|
371
355
|
else if (entry.type === 'evolution_task') {
|
|
@@ -52,20 +52,12 @@ export declare class EvolutionReducerImpl implements EvolutionReducer {
|
|
|
52
52
|
private readonly failureStreak;
|
|
53
53
|
private lastPromotedAt;
|
|
54
54
|
private isReplaying;
|
|
55
|
-
/** Registered pain_detected callbacks (e.g., PainSignalBridge). */
|
|
56
|
-
private readonly _painCallbacks;
|
|
57
55
|
constructor(opts: {
|
|
58
56
|
workspaceDir: string;
|
|
59
57
|
stateDir?: string;
|
|
60
58
|
});
|
|
61
59
|
emit(event: EvolutionLoopEvent): void;
|
|
62
60
|
emitSync(event: EvolutionLoopEvent): void;
|
|
63
|
-
/**
|
|
64
|
-
* Register a callback for 'pain_detected' events.
|
|
65
|
-
* The callback is invoked synchronously within emitSync() after applyEvent completes.
|
|
66
|
-
* HG-4: Callbacks are fire-and-forget from the emitSync perspective.
|
|
67
|
-
*/
|
|
68
|
-
on(callback: (event: EvolutionLoopEvent) => void): void;
|
|
69
61
|
getEventLog(): EvolutionLoopEvent[];
|
|
70
62
|
getCandidatePrinciples(): Principle[];
|
|
71
63
|
getProbationPrinciples(): Principle[];
|
|
@@ -38,8 +38,9 @@ export class EvolutionReducerImpl {
|
|
|
38
38
|
failureStreak = new Map();
|
|
39
39
|
lastPromotedAt = null;
|
|
40
40
|
isReplaying = false;
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
// _painCallbacks pub/sub removed (PRI-451 Wave 1): no code ever registered a
|
|
42
|
+
// callback via .on(). The pain_detected → PainSignalBridge bridge happens via
|
|
43
|
+
// emitPainDetectedEvent (hooks/pain.ts), not this pub/sub layer.
|
|
43
44
|
constructor(opts) {
|
|
44
45
|
this.workspaceDir = opts.workspaceDir;
|
|
45
46
|
this.stateDir = opts.stateDir;
|
|
@@ -77,14 +78,9 @@ export class EvolutionReducerImpl {
|
|
|
77
78
|
}
|
|
78
79
|
// Performance: sweepExpiredProbation() moved to getProbationPrinciples() for lazy cleanup
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
* HG-4: Callbacks are fire-and-forget from the emitSync perspective.
|
|
84
|
-
*/
|
|
85
|
-
on(callback) {
|
|
86
|
-
this._painCallbacks.push(callback);
|
|
87
|
-
}
|
|
81
|
+
// on(callback) pub/sub registration removed (PRI-451 Wave 1): dead code —
|
|
82
|
+
// no caller ever registered a callback. pain_detected events still flow via
|
|
83
|
+
// emitPainDetectedEvent → PainSignalBridge, unaffected.
|
|
88
84
|
getEventLog() {
|
|
89
85
|
return [...this.memoryEvents];
|
|
90
86
|
}
|
|
@@ -522,15 +518,9 @@ export class EvolutionReducerImpl {
|
|
|
522
518
|
if (!this.isReplaying) {
|
|
523
519
|
this.onPainDetected(event.data, event.ts);
|
|
524
520
|
}
|
|
525
|
-
//
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
cb(event);
|
|
529
|
-
}
|
|
530
|
-
catch {
|
|
531
|
-
// Keep the evolution loop resilient — callback errors must not propagate
|
|
532
|
-
}
|
|
533
|
-
}
|
|
521
|
+
// _painCallbacks dispatch removed (PRI-451 Wave 1): no callback was ever
|
|
522
|
+
// registered via .on() (also removed). The pain_detected → PainSignalBridge
|
|
523
|
+
// bridge flows through emitPainDetectedEvent (hooks/pain.ts), not here.
|
|
534
524
|
return;
|
|
535
525
|
case 'candidate_created':
|
|
536
526
|
this.onCandidateCreated(event.data, event.ts);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-468 — Plugin adapter implementing the core `IntentDocReader` port.
|
|
3
|
+
*
|
|
4
|
+
* Bridges the plugin-owned `safeReadIntentDoc()` I/O function to the
|
|
5
|
+
* core-owned `IntentDocReader` interface so Stage A (in core) can read
|
|
6
|
+
* INTENT.md without core performing any filesystem I/O.
|
|
7
|
+
*
|
|
8
|
+
* This adapter only MAPS types — it adds no new I/O, no new flag checks,
|
|
9
|
+
* and no new telemetry. The underlying `safeReadIntentDoc()` already
|
|
10
|
+
* performs the flag-first check (SPEC §12), TTL+mtime cache, and size cap.
|
|
11
|
+
*
|
|
12
|
+
* ERR checklist:
|
|
13
|
+
* EP-01 / ERR-001: never `as` — field-by-field mapping with typeof checks
|
|
14
|
+
* EP-02 / ERR-025: plugin I/O file, whitelisted in architecture-regression
|
|
15
|
+
* EP-03 / ERR-002: every degraded path flows through with reason + nextAction
|
|
16
|
+
*
|
|
17
|
+
* Architecture: this file is I/O (delegates to fs-reading safeReadIntentDoc).
|
|
18
|
+
* It will be added to KNOWN_PLUGIN_CORE_FILES in architecture-regression.test.ts.
|
|
19
|
+
*/
|
|
20
|
+
import type { IntentDocReader } from '@principles/core/runtime-v2';
|
|
21
|
+
/**
|
|
22
|
+
* Create an IntentDocReader bound to a specific workspace.
|
|
23
|
+
*
|
|
24
|
+
* The returned reader is stateless beyond the workspace binding — each
|
|
25
|
+
* `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
|
|
26
|
+
* the TTL+mtime cache.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createIntentDocReader(workspaceDir: string): IntentDocReader;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-468 — Plugin adapter implementing the core `IntentDocReader` port.
|
|
3
|
+
*
|
|
4
|
+
* Bridges the plugin-owned `safeReadIntentDoc()` I/O function to the
|
|
5
|
+
* core-owned `IntentDocReader` interface so Stage A (in core) can read
|
|
6
|
+
* INTENT.md without core performing any filesystem I/O.
|
|
7
|
+
*
|
|
8
|
+
* This adapter only MAPS types — it adds no new I/O, no new flag checks,
|
|
9
|
+
* and no new telemetry. The underlying `safeReadIntentDoc()` already
|
|
10
|
+
* performs the flag-first check (SPEC §12), TTL+mtime cache, and size cap.
|
|
11
|
+
*
|
|
12
|
+
* ERR checklist:
|
|
13
|
+
* EP-01 / ERR-001: never `as` — field-by-field mapping with typeof checks
|
|
14
|
+
* EP-02 / ERR-025: plugin I/O file, whitelisted in architecture-regression
|
|
15
|
+
* EP-03 / ERR-002: every degraded path flows through with reason + nextAction
|
|
16
|
+
*
|
|
17
|
+
* Architecture: this file is I/O (delegates to fs-reading safeReadIntentDoc).
|
|
18
|
+
* It will be added to KNOWN_PLUGIN_CORE_FILES in architecture-regression.test.ts.
|
|
19
|
+
*/
|
|
20
|
+
import { safeReadIntentDoc } from './intent-doc-reader.js';
|
|
21
|
+
/**
|
|
22
|
+
* Create an IntentDocReader bound to a specific workspace.
|
|
23
|
+
*
|
|
24
|
+
* The returned reader is stateless beyond the workspace binding — each
|
|
25
|
+
* `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
|
|
26
|
+
* the TTL+mtime cache.
|
|
27
|
+
*/
|
|
28
|
+
export function createIntentDocReader(workspaceDir) {
|
|
29
|
+
return {
|
|
30
|
+
readIntentDoc() {
|
|
31
|
+
const result = safeReadIntentDoc(workspaceDir);
|
|
32
|
+
if (result.ok && result.doc) {
|
|
33
|
+
const doc = result.doc;
|
|
34
|
+
const reference = {
|
|
35
|
+
raw: typeof doc.raw === 'string' ? doc.raw : '',
|
|
36
|
+
contentHash: typeof doc.contentHash === 'string' ? doc.contentHash : '',
|
|
37
|
+
path: typeof doc.path === 'string' ? doc.path : '',
|
|
38
|
+
};
|
|
39
|
+
return {
|
|
40
|
+
ok: true,
|
|
41
|
+
found: true,
|
|
42
|
+
flagEnabled: true,
|
|
43
|
+
doc: reference,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Degraded path — preserve structured reason + nextAction (EP-03 / ERR-002)
|
|
47
|
+
return {
|
|
48
|
+
ok: false,
|
|
49
|
+
found: result.found,
|
|
50
|
+
flagEnabled: result.flagEnabled,
|
|
51
|
+
reason: result.reason,
|
|
52
|
+
nextAction: result.nextAction,
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-467 — safeReadIntentDoc: plugin I/O wrapper for reading INTENT.md.
|
|
3
|
+
*
|
|
4
|
+
* Reads `.principles/INTENT.md` with:
|
|
5
|
+
* - Feature flag check FIRST (SPEC §12: flag off → flag_disabled without fs)
|
|
6
|
+
* - TTL + mtime cache (60s TTL, mtime check) mirroring prompt.ts cachedReadFile
|
|
7
|
+
* - 32KB size cap (INTENT_MAX_BYTES)
|
|
8
|
+
* - Never throws — all errors return structured `reason` + `nextAction`
|
|
9
|
+
*
|
|
10
|
+
* Trust boundary (SPEC §12.2):
|
|
11
|
+
* - Raw content is returned for the pure builder to escape; this reader does
|
|
12
|
+
* NOT escape or bound the content for prompt injection. The pure builder
|
|
13
|
+
* `buildIntentFrictionBlock` handles escaping + bounding.
|
|
14
|
+
*
|
|
15
|
+
* ERR checklist:
|
|
16
|
+
* EP-01 / ERR-001, ERR-005: raw content validated with typeof, never `as`
|
|
17
|
+
* EP-02 / ERR-025, ERR-070: production path; plugin I/O file in the whitelist
|
|
18
|
+
* EP-03 / ERR-002, ERR-014: every degraded path returns structured reason + nextAction
|
|
19
|
+
* EP-09: tests use real fs writes in temp dirs
|
|
20
|
+
*
|
|
21
|
+
* Architecture: this file is I/O (fs, path). It is whitelisted in
|
|
22
|
+
* architecture-regression.test.ts KNOWN_PLUGIN_CORE_FILES.
|
|
23
|
+
*/
|
|
24
|
+
import { type IntentDocSections, type IntentDocWarning } from '@principles/core/runtime-v2';
|
|
25
|
+
export type SafeReadIntentDocReason = 'flag_disabled' | 'not_found' | 'oversized' | 'read_error';
|
|
26
|
+
export interface IntentDoc {
|
|
27
|
+
/** Raw INTENT.md content (unescaped — caller escapes for prompt injection). */
|
|
28
|
+
raw: string;
|
|
29
|
+
/** Parsed sections from the raw content. */
|
|
30
|
+
sections: IntentDocSections;
|
|
31
|
+
/** SHA-256 content hash for deduplication and audit. */
|
|
32
|
+
contentHash: string;
|
|
33
|
+
/** Absolute path to the INTENT.md file. */
|
|
34
|
+
path: string;
|
|
35
|
+
/** ISO timestamp when the doc was read. */
|
|
36
|
+
readAt: string;
|
|
37
|
+
/** Validation warnings (missing/empty/too_vague sections). */
|
|
38
|
+
warnings: IntentDocWarning[];
|
|
39
|
+
}
|
|
40
|
+
export interface SafeReadIntentDocResult {
|
|
41
|
+
/** True when the doc was successfully read and parsed. */
|
|
42
|
+
ok: boolean;
|
|
43
|
+
/** True when the INTENT.md file exists on disk. */
|
|
44
|
+
found: boolean;
|
|
45
|
+
/** True when the intent_engineering flag is enabled. */
|
|
46
|
+
flagEnabled: boolean;
|
|
47
|
+
/** The parsed IntentDoc, present only when ok=true. */
|
|
48
|
+
doc?: IntentDoc;
|
|
49
|
+
/** Structured reason for a degraded path (present when ok=false). */
|
|
50
|
+
reason?: SafeReadIntentDocReason;
|
|
51
|
+
/** Next action for the operator (present when ok=false). */
|
|
52
|
+
nextAction?: string;
|
|
53
|
+
/** Validation warnings (always present, empty when no warnings). */
|
|
54
|
+
warnings: IntentDocWarning[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reset the intent doc cache for test isolation.
|
|
58
|
+
* Call in beforeEach() to ensure tests don't pollute each other.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resetIntentDocCacheForTest(workspaceDir?: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Safely read INTENT.md for prompt injection.
|
|
63
|
+
*
|
|
64
|
+
* Contract (SPEC §12):
|
|
65
|
+
* 1. Flag check FIRST via loadFeatureFlagFromConfig. Flag off → flag_disabled
|
|
66
|
+
* WITHOUT any fs access to INTENT.md.
|
|
67
|
+
* 2. Flag on → check TTL + mtime cache. If cached and fresh → return cached.
|
|
68
|
+
* 3. Otherwise → stat the file (oversized check), read, parse, validate, cache.
|
|
69
|
+
* 4. Never throws — all errors return structured reason + nextAction.
|
|
70
|
+
*
|
|
71
|
+
* @param workspaceDir - Absolute path to the workspace root
|
|
72
|
+
* @param options - Optional logger for debug-level diagnostics
|
|
73
|
+
* @returns SafeReadIntentDocResult (never throws)
|
|
74
|
+
*/
|
|
75
|
+
export declare function safeReadIntentDoc(workspaceDir: string, options?: {
|
|
76
|
+
logger?: {
|
|
77
|
+
debug?: (msg: string) => void;
|
|
78
|
+
warn?: (msg: string) => void;
|
|
79
|
+
};
|
|
80
|
+
}): SafeReadIntentDocResult;
|