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
|
@@ -0,0 +1,189 @@
|
|
|
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 * as fs from 'node:fs';
|
|
25
|
+
import * as path from 'node:path';
|
|
26
|
+
import { INTENT_MAX_BYTES, parseIntentDocSections, computeIntentContentHash, validateIntentDocSections, } from '@principles/core/runtime-v2';
|
|
27
|
+
import { loadFeatureFlagFromConfig } from './pd-config-loader.js';
|
|
28
|
+
// ── Constants ────────────────────────────────────────────────────────────────
|
|
29
|
+
const INTENT_FILENAME = 'INTENT.md';
|
|
30
|
+
const INTENT_DIR = '.principles';
|
|
31
|
+
const INTENT_CACHE_TTL_MS = 60_000; // 1 minute (SPEC §12.1)
|
|
32
|
+
// ── Module-level cache (per-workspace) ───────────────────────────────────────
|
|
33
|
+
const _intentDocCache = new Map();
|
|
34
|
+
/**
|
|
35
|
+
* Reset the intent doc cache for test isolation.
|
|
36
|
+
* Call in beforeEach() to ensure tests don't pollute each other.
|
|
37
|
+
*/
|
|
38
|
+
export function resetIntentDocCacheForTest(workspaceDir) {
|
|
39
|
+
if (workspaceDir) {
|
|
40
|
+
_intentDocCache.delete(workspaceDir);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
_intentDocCache.clear();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
47
|
+
function getIntentFilePath(workspaceDir) {
|
|
48
|
+
return path.join(workspaceDir, INTENT_DIR, INTENT_FILENAME);
|
|
49
|
+
}
|
|
50
|
+
function buildDocFromRaw(raw, filePath, readAt) {
|
|
51
|
+
const sections = parseIntentDocSections(raw);
|
|
52
|
+
const warnings = validateIntentDocSections(sections);
|
|
53
|
+
const contentHash = computeIntentContentHash(raw);
|
|
54
|
+
return {
|
|
55
|
+
raw,
|
|
56
|
+
sections,
|
|
57
|
+
contentHash,
|
|
58
|
+
path: filePath,
|
|
59
|
+
readAt,
|
|
60
|
+
warnings,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ── Main entrypoint ──────────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Safely read INTENT.md for prompt injection.
|
|
66
|
+
*
|
|
67
|
+
* Contract (SPEC §12):
|
|
68
|
+
* 1. Flag check FIRST via loadFeatureFlagFromConfig. Flag off → flag_disabled
|
|
69
|
+
* WITHOUT any fs access to INTENT.md.
|
|
70
|
+
* 2. Flag on → check TTL + mtime cache. If cached and fresh → return cached.
|
|
71
|
+
* 3. Otherwise → stat the file (oversized check), read, parse, validate, cache.
|
|
72
|
+
* 4. Never throws — all errors return structured reason + nextAction.
|
|
73
|
+
*
|
|
74
|
+
* @param workspaceDir - Absolute path to the workspace root
|
|
75
|
+
* @param options - Optional logger for debug-level diagnostics
|
|
76
|
+
* @returns SafeReadIntentDocResult (never throws)
|
|
77
|
+
*/
|
|
78
|
+
export function safeReadIntentDoc(workspaceDir, options) {
|
|
79
|
+
// SPEC §12 — Flag check FIRST. Flag off → no fs access, no cache access.
|
|
80
|
+
const flagResult = loadFeatureFlagFromConfig(workspaceDir, 'intent_engineering', options?.logger);
|
|
81
|
+
if (!flagResult.enabled) {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
found: false,
|
|
85
|
+
flagEnabled: false,
|
|
86
|
+
reason: 'flag_disabled',
|
|
87
|
+
nextAction: 'Enable the intent_engineering feature flag in .pd/config.yaml to read INTENT.md.',
|
|
88
|
+
warnings: [],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const filePath = getIntentFilePath(workspaceDir);
|
|
92
|
+
const now = Date.now();
|
|
93
|
+
// Check cache freshness (TTL + mtime)
|
|
94
|
+
const cached = _intentDocCache.get(workspaceDir);
|
|
95
|
+
if (cached && (now - cached.loadedAt) < INTENT_CACHE_TTL_MS) {
|
|
96
|
+
// Cache is within TTL. Verify mtime hasn't changed.
|
|
97
|
+
try {
|
|
98
|
+
const stat = fs.statSync(filePath);
|
|
99
|
+
if (stat.mtimeMs === cached.mtime) {
|
|
100
|
+
// Cache hit — return cached doc
|
|
101
|
+
return {
|
|
102
|
+
ok: true,
|
|
103
|
+
found: true,
|
|
104
|
+
flagEnabled: true,
|
|
105
|
+
doc: cached.doc,
|
|
106
|
+
warnings: cached.doc.warnings,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// File may have been deleted since caching. Fall through to not_found path.
|
|
112
|
+
// Don't return cached doc if the file no longer exists.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Fresh read path
|
|
116
|
+
try {
|
|
117
|
+
// Check existence first
|
|
118
|
+
if (!fs.existsSync(filePath)) {
|
|
119
|
+
// Invalidate stale cache entry if any
|
|
120
|
+
_intentDocCache.delete(workspaceDir);
|
|
121
|
+
return {
|
|
122
|
+
ok: false,
|
|
123
|
+
found: false,
|
|
124
|
+
flagEnabled: true,
|
|
125
|
+
reason: 'not_found',
|
|
126
|
+
nextAction: 'Create .principles/INTENT.md using "pd intent init".',
|
|
127
|
+
warnings: [],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const stat = fs.statSync(filePath);
|
|
131
|
+
// SPEC §12 — 32KB size cap
|
|
132
|
+
if (stat.size > INTENT_MAX_BYTES) {
|
|
133
|
+
_intentDocCache.delete(workspaceDir);
|
|
134
|
+
return {
|
|
135
|
+
ok: false,
|
|
136
|
+
found: true,
|
|
137
|
+
flagEnabled: true,
|
|
138
|
+
reason: 'oversized',
|
|
139
|
+
nextAction: `INTENT.md exceeds ${INTENT_MAX_BYTES} bytes (${stat.size} bytes). Reduce content.`,
|
|
140
|
+
warnings: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
144
|
+
// PRI-467 review fix (P2): TOCTOU guard — re-check actual byte length
|
|
145
|
+
// after readFileSync. The file may have grown between statSync() and
|
|
146
|
+
// readFileSync(), bypassing the stat.size oversized check. Without this,
|
|
147
|
+
// an oversized file would enter parse/hash/cache as ok:true.
|
|
148
|
+
const actualBytes = Buffer.byteLength(raw, 'utf8');
|
|
149
|
+
if (actualBytes > INTENT_MAX_BYTES) {
|
|
150
|
+
_intentDocCache.delete(workspaceDir);
|
|
151
|
+
return {
|
|
152
|
+
ok: false,
|
|
153
|
+
found: true,
|
|
154
|
+
flagEnabled: true,
|
|
155
|
+
reason: 'oversized',
|
|
156
|
+
nextAction: `INTENT.md exceeds ${INTENT_MAX_BYTES} bytes (${actualBytes} bytes after read). Reduce content.`,
|
|
157
|
+
warnings: [],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const doc = buildDocFromRaw(raw, filePath, new Date(now).toISOString());
|
|
161
|
+
// Update cache
|
|
162
|
+
_intentDocCache.set(workspaceDir, {
|
|
163
|
+
doc,
|
|
164
|
+
mtime: stat.mtimeMs,
|
|
165
|
+
loadedAt: now,
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
ok: true,
|
|
169
|
+
found: true,
|
|
170
|
+
flagEnabled: true,
|
|
171
|
+
doc,
|
|
172
|
+
warnings: doc.warnings,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
// ERR-002 — graceful degradation with reason + nextAction
|
|
177
|
+
_intentDocCache.delete(workspaceDir);
|
|
178
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
179
|
+
options?.logger?.warn?.(`[PD:Intent] safeReadIntentDoc failed: workspace=${workspaceDir}, error=${message}`);
|
|
180
|
+
return {
|
|
181
|
+
ok: false,
|
|
182
|
+
found: false,
|
|
183
|
+
flagEnabled: true,
|
|
184
|
+
reason: 'read_error',
|
|
185
|
+
nextAction: 'Check filesystem permissions for .principles/INTENT.md.',
|
|
186
|
+
warnings: [],
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -1,30 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Pain Diagnostic Gate — PRI-446 thin adapter
|
|
3
|
+
*
|
|
4
|
+
* @deprecated PRI-454 — Gate A (PainDiagnosticGate) is superseded by Gate B
|
|
5
|
+
* (TriggerController + EvidenceTriage). This module remains as the rollback
|
|
6
|
+
* path when `painEvidenceAdmission` or `painEvidenceAdmissionDefault` flags
|
|
7
|
+
* are OFF. Do not add new callers. New admission logic must use
|
|
8
|
+
* `evaluateTriggerController` from runtime-v2/evidence-triage.
|
|
9
|
+
*
|
|
10
|
+
* Disposition: Archive (do not delete) per PRI-454 plan step 6.
|
|
11
|
+
* Removal conditions: Both flags confirmed ON in production for 30 days,
|
|
12
|
+
* and all 5 MVP paths verified on Gate B. See
|
|
13
|
+
* docs/plans/2026-06-pain-evidence-admission-track.md.
|
|
14
|
+
*
|
|
15
|
+
* The pure decision logic (threshold tree, cooldown comparison, episode-key
|
|
16
|
+
* construction) now lives in principles-core
|
|
17
|
+
* (runtime-v2/pain-gate/pain-diagnostic-gate-policy.ts). This file is the
|
|
18
|
+
* stateful adapter that owns:
|
|
19
|
+
* - the cooldown Map (lastDiagnosedAtByEpisode)
|
|
20
|
+
* - Date.now() injection
|
|
21
|
+
* - SystemLogger for unknown-source telemetry
|
|
22
|
+
*
|
|
23
|
+
* It preserves the original export names (evaluatePainDiagnosticGate,
|
|
24
|
+
* isCooldownActiveForEpisode, resetPainDiagnosticGateForTest) so all 5 callers
|
|
25
|
+
* (gate-block-helper, llm, pain, prompt x2) and the characterization test keep
|
|
26
|
+
* working unchanged.
|
|
27
|
+
*
|
|
28
|
+
* ERR checklist:
|
|
29
|
+
* - ERR-011: this is a stateful adapter delegating to core pure logic.
|
|
30
|
+
*/
|
|
31
|
+
import { type PainDiagnosticSource, type PainDiagnosticGateReason, type PainDiagnosticGateInput, type PainDiagnosticGateDecision } from '@principles/core/runtime-v2';
|
|
32
|
+
export type { PainDiagnosticSource, PainDiagnosticGateReason, PainDiagnosticGateInput, PainDiagnosticGateDecision, };
|
|
28
33
|
export declare function resetPainDiagnosticGateForTest(): void;
|
|
29
34
|
/**
|
|
30
35
|
* Check whether cooldown is currently active for a given episode.
|
|
@@ -32,5 +37,9 @@ export declare function resetPainDiagnosticGateForTest(): void;
|
|
|
32
37
|
* with the PainDiagnosticGate's cooldown state.
|
|
33
38
|
*/
|
|
34
39
|
export declare function isCooldownActiveForEpisode(source: string, sessionId: string | undefined, errorHash: string | undefined, cooldownMs?: number): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Evaluate the pain diagnostic gate. Delegates the pure decision to core and,
|
|
42
|
+
* when the decision is to diagnose, records the current time against the
|
|
43
|
+
* episode so subsequent calls within the cooldown window are suppressed.
|
|
44
|
+
*/
|
|
35
45
|
export declare function evaluatePainDiagnosticGate(input: PainDiagnosticGateInput): PainDiagnosticGateDecision;
|
|
36
|
-
export {};
|
|
@@ -1,42 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pain Diagnostic Gate — PRI-446 thin adapter
|
|
3
|
+
*
|
|
4
|
+
* @deprecated PRI-454 — Gate A (PainDiagnosticGate) is superseded by Gate B
|
|
5
|
+
* (TriggerController + EvidenceTriage). This module remains as the rollback
|
|
6
|
+
* path when `painEvidenceAdmission` or `painEvidenceAdmissionDefault` flags
|
|
7
|
+
* are OFF. Do not add new callers. New admission logic must use
|
|
8
|
+
* `evaluateTriggerController` from runtime-v2/evidence-triage.
|
|
9
|
+
*
|
|
10
|
+
* Disposition: Archive (do not delete) per PRI-454 plan step 6.
|
|
11
|
+
* Removal conditions: Both flags confirmed ON in production for 30 days,
|
|
12
|
+
* and all 5 MVP paths verified on Gate B. See
|
|
13
|
+
* docs/plans/2026-06-pain-evidence-admission-track.md.
|
|
14
|
+
*
|
|
15
|
+
* The pure decision logic (threshold tree, cooldown comparison, episode-key
|
|
16
|
+
* construction) now lives in principles-core
|
|
17
|
+
* (runtime-v2/pain-gate/pain-diagnostic-gate-policy.ts). This file is the
|
|
18
|
+
* stateful adapter that owns:
|
|
19
|
+
* - the cooldown Map (lastDiagnosedAtByEpisode)
|
|
20
|
+
* - Date.now() injection
|
|
21
|
+
* - SystemLogger for unknown-source telemetry
|
|
22
|
+
*
|
|
23
|
+
* It preserves the original export names (evaluatePainDiagnosticGate,
|
|
24
|
+
* isCooldownActiveForEpisode, resetPainDiagnosticGateForTest) so all 5 callers
|
|
25
|
+
* (gate-block-helper, llm, pain, prompt x2) and the characterization test keep
|
|
26
|
+
* working unchanged.
|
|
27
|
+
*
|
|
28
|
+
* ERR checklist:
|
|
29
|
+
* - ERR-011: this is a stateful adapter delegating to core pure logic.
|
|
30
|
+
*/
|
|
1
31
|
import { SystemLogger } from './system-logger.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
'tool_failure',
|
|
5
|
-
'dispatch_error',
|
|
6
|
-
'gate_blocked',
|
|
7
|
-
'user_empathy',
|
|
8
|
-
'llm_paralysis',
|
|
9
|
-
'semantic',
|
|
10
|
-
'subagent_error',
|
|
11
|
-
];
|
|
12
|
-
const DEFAULT_COOLDOWN_MS = 15 * 60 * 1000;
|
|
32
|
+
import { evaluatePainDiagnosticGateDecision, normalizedSource, buildEpisodeKey, isCooldownActive as isCooldownActiveCore, } from '@principles/core/runtime-v2';
|
|
33
|
+
// Module-level cooldown state — owned by this adapter (core is stateless).
|
|
13
34
|
const lastDiagnosedAtByEpisode = new Map();
|
|
14
|
-
function normalizedSource(source) {
|
|
15
|
-
if (source.startsWith('llm_') && source !== 'llm_paralysis') {
|
|
16
|
-
return 'semantic';
|
|
17
|
-
}
|
|
18
|
-
if (!PAIN_DIAGNOSTIC_SOURCES.includes(source)) {
|
|
19
|
-
SystemLogger.log('', 'GATE_UNKNOWN_SOURCE', `Unknown pain source: "${source}"`);
|
|
20
|
-
}
|
|
21
|
-
return source;
|
|
22
|
-
}
|
|
23
|
-
function buildEpisodeKey(input) {
|
|
24
|
-
const source = normalizedSource(input.source);
|
|
25
|
-
const sessionId = input.sessionId || 'unknown';
|
|
26
|
-
const hash = input.errorHash || 'no-hash';
|
|
27
|
-
return `${sessionId}:${source}:${hash}`;
|
|
28
|
-
}
|
|
29
|
-
function withinCooldown(input, episodeKey) {
|
|
30
|
-
const cooldownMs = input.cooldownMs ?? DEFAULT_COOLDOWN_MS;
|
|
31
|
-
if (cooldownMs <= 0)
|
|
32
|
-
return false;
|
|
33
|
-
const nowMs = input.nowMs ?? Date.now();
|
|
34
|
-
const last = lastDiagnosedAtByEpisode.get(episodeKey);
|
|
35
|
-
return last !== undefined && nowMs - last < cooldownMs;
|
|
36
|
-
}
|
|
37
|
-
function markDiagnosed(input, episodeKey) {
|
|
38
|
-
lastDiagnosedAtByEpisode.set(episodeKey, input.nowMs ?? Date.now());
|
|
39
|
-
}
|
|
40
35
|
export function resetPainDiagnosticGateForTest() {
|
|
41
36
|
lastDiagnosedAtByEpisode.clear();
|
|
42
37
|
}
|
|
@@ -46,60 +41,29 @@ export function resetPainDiagnosticGateForTest() {
|
|
|
46
41
|
* with the PainDiagnosticGate's cooldown state.
|
|
47
42
|
*/
|
|
48
43
|
export function isCooldownActiveForEpisode(source, sessionId, errorHash, cooldownMs) {
|
|
49
|
-
const episodeKey = buildEpisodeKey({ source, sessionId, errorHash });
|
|
50
|
-
|
|
44
|
+
const episodeKey = buildEpisodeKey({ source, sessionId, errorHash, score: 0, currentGfi: 0 });
|
|
45
|
+
const last = lastDiagnosedAtByEpisode.get(episodeKey);
|
|
46
|
+
const nowMs = Date.now();
|
|
47
|
+
return isCooldownActiveCore({ source, sessionId, errorHash, cooldownMs, nowMs, lastDiagnosedAtMs: last });
|
|
51
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Evaluate the pain diagnostic gate. Delegates the pure decision to core and,
|
|
51
|
+
* when the decision is to diagnose, records the current time against the
|
|
52
|
+
* episode so subsequent calls within the cooldown window are suppressed.
|
|
53
|
+
*/
|
|
52
54
|
export function evaluatePainDiagnosticGate(input) {
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const highGfi = input.thresholds?.highGfi ?? Math.max(highSeverity, painTrigger + 30);
|
|
58
|
-
const repeatedFailure = input.thresholds?.repeatedFailure ?? 4;
|
|
59
|
-
const semanticPain = input.thresholds?.semanticPain ?? Math.max(painTrigger, 60);
|
|
60
|
-
const score = Number.isFinite(input.score) ? input.score : 0;
|
|
61
|
-
const currentGfi = Number.isFinite(input.currentGfi) ? input.currentGfi : 0;
|
|
62
|
-
const consecutiveErrors = Number.isFinite(input.consecutiveErrors) ? input.consecutiveErrors : 0;
|
|
63
|
-
const approve = (reason, detail) => {
|
|
64
|
-
if (withinCooldown(input, episodeKey)) {
|
|
65
|
-
return {
|
|
66
|
-
shouldDiagnose: false,
|
|
67
|
-
reason: 'cooldown',
|
|
68
|
-
episodeKey,
|
|
69
|
-
detail: `recently diagnosed; ${detail}`,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
markDiagnosed(input, episodeKey);
|
|
73
|
-
return { shouldDiagnose: true, reason, episodeKey, detail };
|
|
74
|
-
};
|
|
75
|
-
if (source === 'manual') {
|
|
76
|
-
return approve('manual', 'manual pain signal bypasses automatic gate');
|
|
77
|
-
}
|
|
78
|
-
if (source === 'subagent_error' && score >= painTrigger) {
|
|
79
|
-
return approve('subagent_error', `subagent error score ${score} >= ${painTrigger}`);
|
|
80
|
-
}
|
|
81
|
-
if (source === 'llm_paralysis' && score >= painTrigger) {
|
|
82
|
-
return approve('llm_paralysis', `llm paralysis score ${score} >= ${painTrigger}`);
|
|
83
|
-
}
|
|
84
|
-
if (source === 'gate_blocked' && score >= painTrigger) {
|
|
85
|
-
return approve('gate_blocked', `gate blocked score ${score} >= ${painTrigger}`);
|
|
86
|
-
}
|
|
87
|
-
if ((source === 'user_empathy' || source === 'semantic') && score >= semanticPain) {
|
|
88
|
-
return approve('semantic_pain', `semantic pain score ${score} >= ${semanticPain}`);
|
|
55
|
+
// Surface unknown sources via telemetry (core cannot log).
|
|
56
|
+
const { unknown } = normalizedSource(input.source);
|
|
57
|
+
if (unknown) {
|
|
58
|
+
SystemLogger.log('', 'GATE_UNKNOWN_SOURCE', `Unknown pain source: "${input.source}"`);
|
|
89
59
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return approve('high_gfi', `GFI ${currentGfi.toFixed(1)} >= ${highGfi}`);
|
|
60
|
+
const episodeKey = buildEpisodeKey(input);
|
|
61
|
+
const last = lastDiagnosedAtByEpisode.get(episodeKey);
|
|
62
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
63
|
+
const decision = evaluatePainDiagnosticGateDecision({ ...input, nowMs }, last);
|
|
64
|
+
// Record the diagnosis time when approved (matches prior markDiagnosed behavior).
|
|
65
|
+
if (decision.shouldDiagnose) {
|
|
66
|
+
lastDiagnosedAtByEpisode.set(episodeKey, nowMs);
|
|
98
67
|
}
|
|
99
|
-
return
|
|
100
|
-
shouldDiagnose: false,
|
|
101
|
-
reason: 'below_gate',
|
|
102
|
-
episodeKey,
|
|
103
|
-
detail: `score=${score}; gfi=${currentGfi.toFixed(1)}; consecutive=${consecutiveErrors}`,
|
|
104
|
-
};
|
|
68
|
+
return decision;
|
|
105
69
|
}
|
|
@@ -1,67 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Required fields — every pain flag MUST have these.
|
|
3
|
-
*/
|
|
4
|
-
export interface PainFlagData {
|
|
5
|
-
/** What triggered this pain signal (e.g., tool_failure, human_intervention, intercept_extraction) */
|
|
6
|
-
source: string;
|
|
7
|
-
/** Pain score 0-100 */
|
|
8
|
-
score: string;
|
|
9
|
-
/** ISO 8601 timestamp */
|
|
10
|
-
time: string;
|
|
11
|
-
/** Human-readable reason / error description */
|
|
12
|
-
reason: string;
|
|
13
|
-
/** Session ID — identifies which conversation this happened in */
|
|
14
|
-
session_id: string;
|
|
15
|
-
/** Agent ID — identifies which agent (main, builder, diagnostician, etc.) */
|
|
16
|
-
agent_id: string;
|
|
17
|
-
/** Whether this involves risky operation ('true' / 'false') */
|
|
18
|
-
is_risky: string;
|
|
19
|
-
/** Correlation trace ID (for linking events across the pipeline) */
|
|
20
|
-
trace_id: string;
|
|
21
|
-
/** Preview of the text that triggered this pain */
|
|
22
|
-
trigger_text_preview: string;
|
|
23
|
-
/** Trajectory pain_events row ID (set by recordPainEvent) */
|
|
24
|
-
pain_event_id?: string;
|
|
25
|
-
}
|
|
26
|
-
export interface PainFlagContractResult {
|
|
27
|
-
status: 'missing' | 'valid' | 'invalid';
|
|
28
|
-
format: 'missing' | 'empty' | 'kv' | 'json' | 'invalid_json';
|
|
29
|
-
data: Record<string, string>;
|
|
30
|
-
missingFields: string[];
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Builds legacy pain flag data for compatibility tests and historical readers.
|
|
34
|
-
* Do not use this to create new Runtime V2 diagnosis requests.
|
|
35
|
-
*/
|
|
36
|
-
export declare function buildPainFlag(input: {
|
|
37
|
-
source: string;
|
|
38
|
-
score: string;
|
|
39
|
-
time?: string;
|
|
40
|
-
reason: string;
|
|
41
|
-
session_id?: string;
|
|
42
|
-
agent_id?: string;
|
|
43
|
-
is_risky?: boolean;
|
|
44
|
-
trace_id?: string;
|
|
45
|
-
trigger_text_preview?: string;
|
|
46
|
-
pain_event_id?: string;
|
|
47
|
-
}): PainFlagData;
|
|
48
|
-
/**
|
|
49
|
-
* Validates a pain flag read from disk.
|
|
50
|
-
* Returns list of missing required fields — empty string means all present.
|
|
51
|
-
*/
|
|
52
|
-
export declare function validatePainFlag(data: Record<string, string>): string[];
|
|
53
1
|
export declare function computePainScore(rc: number, isSpiral: boolean, missingTestCommand: boolean, softScore: number, projectDir?: string): number;
|
|
54
|
-
export declare function painSeverityLabel(painScore: number, isSpiral?: boolean, projectDir?: string): string;
|
|
55
|
-
/**
|
|
56
|
-
* Reads and validates the legacy pain flag file.
|
|
57
|
-
*
|
|
58
|
-
* - If file doesn't exist → returns {}
|
|
59
|
-
* - If file is JSON format → converts to KV in memory only
|
|
60
|
-
* - If file is KV format → validates required fields, logs warning if missing
|
|
61
|
-
* - If file has unknown fields → silently ignores them (forward-compatible)
|
|
62
|
-
*/
|
|
63
|
-
export declare function readPainFlagData(projectDir: string): Record<string, string>;
|
|
64
|
-
export declare function readPainFlagContract(projectDir: string): PainFlagContractResult;
|
|
65
2
|
/**
|
|
66
3
|
* Track principle value metrics when a pain signal is written.
|
|
67
4
|
* This is observation-only — it does NOT affect the pain flag write flow.
|
package/plugin/dist/core/pain.js
CHANGED
|
@@ -1,44 +1,5 @@
|
|
|
1
|
-
import * as fs from 'fs';
|
|
2
|
-
import { parseKvLines } from '../utils/io.js';
|
|
3
1
|
import { resolvePdPath } from './paths.js';
|
|
4
2
|
import { ConfigService } from './config-service.js';
|
|
5
|
-
import { SystemLogger } from './system-logger.js';
|
|
6
|
-
/**
|
|
7
|
-
* Builds legacy pain flag data for compatibility tests and historical readers.
|
|
8
|
-
* Do not use this to create new Runtime V2 diagnosis requests.
|
|
9
|
-
*/
|
|
10
|
-
export function buildPainFlag(input) {
|
|
11
|
-
// Omit optional fields when not provided — prevents writing empty lines to disk
|
|
12
|
-
// which causes agent confusion (SKILL.md vs reality drift)
|
|
13
|
-
return {
|
|
14
|
-
source: input.source,
|
|
15
|
-
score: input.score,
|
|
16
|
-
time: input.time || new Date().toISOString(),
|
|
17
|
-
reason: input.reason,
|
|
18
|
-
session_id: input.session_id ?? '',
|
|
19
|
-
agent_id: input.agent_id ?? '',
|
|
20
|
-
is_risky: input.is_risky ? 'true' : 'false',
|
|
21
|
-
trace_id: input.trace_id ?? '',
|
|
22
|
-
trigger_text_preview: input.trigger_text_preview ?? '',
|
|
23
|
-
pain_event_id: input.pain_event_id,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Validates a pain flag read from disk.
|
|
28
|
-
* Returns list of missing required fields — empty string means all present.
|
|
29
|
-
*/
|
|
30
|
-
export function validatePainFlag(data) {
|
|
31
|
-
const missing = [];
|
|
32
|
-
// Only source/score/time/reason are truly required — session_id/agent_id
|
|
33
|
-
// may be empty in automated contexts (heartbeat, background workers)
|
|
34
|
-
const required = ['source', 'score', 'time', 'reason'];
|
|
35
|
-
for (const field of required) {
|
|
36
|
-
if (!data[field] || data[field].trim() === '') {
|
|
37
|
-
missing.push(field);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
return missing;
|
|
41
|
-
}
|
|
42
3
|
export function computePainScore(rc, isSpiral, missingTestCommand, softScore, projectDir) {
|
|
43
4
|
let score = Math.max(0, softScore || 0);
|
|
44
5
|
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
@@ -59,134 +20,6 @@ export function computePainScore(rc, isSpiral, missingTestCommand, softScore, pr
|
|
|
59
20
|
}
|
|
60
21
|
return Math.min(100, score);
|
|
61
22
|
}
|
|
62
|
-
export function painSeverityLabel(painScore, isSpiral = false, projectDir) {
|
|
63
|
-
if (isSpiral) {
|
|
64
|
-
return "critical";
|
|
65
|
-
}
|
|
66
|
-
const stateDir = projectDir ? resolvePdPath(projectDir, 'STATE_DIR') : undefined;
|
|
67
|
-
const config = stateDir ? ConfigService.get(stateDir) : null;
|
|
68
|
-
const thresholds = config ? config.get('severity_thresholds') : {
|
|
69
|
-
high: 70,
|
|
70
|
-
medium: 40,
|
|
71
|
-
low: 20
|
|
72
|
-
};
|
|
73
|
-
if (painScore >= thresholds.high) {
|
|
74
|
-
return "high";
|
|
75
|
-
}
|
|
76
|
-
else if (painScore >= thresholds.medium) {
|
|
77
|
-
return "medium";
|
|
78
|
-
}
|
|
79
|
-
else if (painScore >= thresholds.low) {
|
|
80
|
-
return "low";
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
return "info";
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Converts a JSON pain flag object to KV format.
|
|
88
|
-
*/
|
|
89
|
-
function convertJsonToKv(json) {
|
|
90
|
-
const kvData = {};
|
|
91
|
-
const fieldMap = {
|
|
92
|
-
source: 'source',
|
|
93
|
-
score: 'score',
|
|
94
|
-
time: 'time',
|
|
95
|
-
timestamp: 'time',
|
|
96
|
-
reason: 'reason',
|
|
97
|
-
session_id: 'session_id',
|
|
98
|
-
sessionId: 'session_id',
|
|
99
|
-
agent_id: 'agent_id',
|
|
100
|
-
agentId: 'agent_id',
|
|
101
|
-
is_risky: 'is_risky',
|
|
102
|
-
isRisky: 'is_risky',
|
|
103
|
-
severity: 'severity',
|
|
104
|
-
painId: 'pain_id',
|
|
105
|
-
};
|
|
106
|
-
for (const [jsonKey, kvKey] of Object.entries(fieldMap)) {
|
|
107
|
-
if (json[jsonKey] !== undefined) {
|
|
108
|
-
kvData[kvKey] = String(json[jsonKey]);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
for (const [key, value] of Object.entries(json)) {
|
|
112
|
-
if (fieldMap[key] === undefined && value !== undefined && value !== null) {
|
|
113
|
-
kvData[key] = String(value);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
return kvData;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Reads and validates the legacy pain flag file.
|
|
120
|
-
*
|
|
121
|
-
* - If file doesn't exist → returns {}
|
|
122
|
-
* - If file is JSON format → converts to KV in memory only
|
|
123
|
-
* - If file is KV format → validates required fields, logs warning if missing
|
|
124
|
-
* - If file has unknown fields → silently ignores them (forward-compatible)
|
|
125
|
-
*/
|
|
126
|
-
export function readPainFlagData(projectDir) {
|
|
127
|
-
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
128
|
-
try {
|
|
129
|
-
if (!fs.existsSync(painFlagPath)) {
|
|
130
|
-
return {};
|
|
131
|
-
}
|
|
132
|
-
const content = fs.readFileSync(painFlagPath, "utf-8").trim();
|
|
133
|
-
if (!content) {
|
|
134
|
-
return {};
|
|
135
|
-
}
|
|
136
|
-
// Detect JSON format. Legacy compatibility only: parse in memory and do not
|
|
137
|
-
// rewrite .pain_flag, because Runtime V2 must not create or repair this file.
|
|
138
|
-
if (content.startsWith('{')) {
|
|
139
|
-
let json;
|
|
140
|
-
try {
|
|
141
|
-
json = JSON.parse(content);
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_CORRUPT', 'Pain flag file contains invalid JSON');
|
|
145
|
-
return {};
|
|
146
|
-
}
|
|
147
|
-
const kvData = convertJsonToKv(json);
|
|
148
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_LEGACY_JSON_READ', `Read legacy JSON pain flag in memory (${Object.keys(json).length} fields)`);
|
|
149
|
-
return kvData;
|
|
150
|
-
}
|
|
151
|
-
// KV format — parse and validate
|
|
152
|
-
const data = parseKvLines(content);
|
|
153
|
-
const missing = validatePainFlag(data);
|
|
154
|
-
if (missing.length > 0) {
|
|
155
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_INCOMPLETE', `Pain flag missing required fields: ${missing.join(', ')}`);
|
|
156
|
-
}
|
|
157
|
-
return data;
|
|
158
|
-
}
|
|
159
|
-
catch (e) {
|
|
160
|
-
SystemLogger.log(projectDir, 'PAIN_FLAG_READ_ERROR', `Failed to read pain flag: ${String(e)}`);
|
|
161
|
-
return {};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
export function readPainFlagContract(projectDir) {
|
|
165
|
-
const data = readPainFlagData(projectDir);
|
|
166
|
-
if (Object.keys(data).length === 0) {
|
|
167
|
-
const painFlagPath = resolvePdPath(projectDir, 'PAIN_FLAG');
|
|
168
|
-
if (!fs.existsSync(painFlagPath)) {
|
|
169
|
-
return { status: 'missing', format: 'missing', data: {}, missingFields: [] };
|
|
170
|
-
}
|
|
171
|
-
const raw = fs.readFileSync(painFlagPath, 'utf-8').trim();
|
|
172
|
-
if (!raw) {
|
|
173
|
-
return { status: 'missing', format: 'empty', data: {}, missingFields: [] };
|
|
174
|
-
}
|
|
175
|
-
return {
|
|
176
|
-
status: 'invalid',
|
|
177
|
-
format: raw.startsWith('{') ? 'invalid_json' : 'kv',
|
|
178
|
-
data: {},
|
|
179
|
-
missingFields: ['unparseable'],
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
const missing = validatePainFlag(data);
|
|
183
|
-
return {
|
|
184
|
-
status: missing.length > 0 ? 'invalid' : 'valid',
|
|
185
|
-
format: 'kv',
|
|
186
|
-
data,
|
|
187
|
-
missingFields: missing,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
23
|
/**
|
|
191
24
|
* Track principle value metrics when a pain signal is written.
|
|
192
25
|
* This is observation-only — it does NOT affect the pain flag write flow.
|