create-principles-disciple 1.94.0 → 1.96.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/console/dist/server/config/WorkspaceConfigStore.js +2 -1
- package/console/dist/server/config/pd-config-store.d.ts +33 -0
- package/console/dist/server/config/pd-config-store.js +196 -0
- package/console/dist/server/index.js +19 -4
- package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
- package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
- package/console/dist/server/models/HealthCheckModel.js +5 -3
- package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
- package/console/dist/server/models/IntentDecisionModel.js +207 -0
- package/console/dist/server/models/IntentPageModel.d.ts +52 -0
- package/console/dist/server/models/IntentPageModel.js +292 -0
- package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
- package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
- package/console/dist/server/models/WorkspaceService.d.ts +0 -28
- package/console/dist/server/models/WorkspaceService.js +0 -115
- package/console/dist/server/routes/config.js +55 -1
- package/console/dist/server/routes/intent-decisions.d.ts +33 -0
- package/console/dist/server/routes/intent-decisions.js +499 -0
- package/console/dist/server/routes/intent.d.ts +7 -0
- package/console/dist/server/routes/intent.js +223 -0
- package/console/dist/server/routes/principles.js +67 -1
- package/console/dist/server/routes/update.d.ts +0 -1
- package/console/dist/server/routes/update.js +14 -11
- package/console/dist/types.d.ts +1 -0
- package/console/dist/ui/App.js +2 -60
- package/console/dist/ui/api.d.ts +58 -18
- package/console/dist/ui/api.js +78 -6
- package/console/dist/ui/components/layout/app-sidebar.js +13 -12
- package/console/dist/ui/components/ui/badge.d.ts +1 -1
- package/console/dist/ui/components/ui/button.d.ts +1 -1
- package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
- package/console/dist/ui/components/ui/shiny-text.js +46 -0
- package/console/dist/ui/i18n/en.json +306 -3
- package/console/dist/ui/i18n/zh-CN.json +306 -3
- package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
- package/console/dist/ui/pages/control-center/AgentCard.d.ts +31 -0
- package/console/dist/ui/pages/control-center/AgentCard.js +156 -0
- package/console/dist/ui/pages/control-center/AgentGroup.d.ts +26 -0
- package/console/dist/ui/pages/control-center/AgentGroup.js +38 -0
- package/console/dist/ui/pages/control-center/ControlCenterPage.js +103 -41
- package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
- package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
- package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +17 -0
- package/console/dist/ui/pages/control-center/WorkflowDiagram.js +55 -0
- package/console/dist/ui/pages/debt/DebtPage.js +219 -2
- package/console/dist/ui/pages/focus/FocusPage.js +2 -1
- package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +67 -0
- package/console/dist/ui/pages/intent/IntentOnboarding.js +289 -0
- package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
- package/console/dist/ui/pages/intent/IntentPage.js +258 -0
- package/console/dist/ui/pages/pain/PainPage.js +234 -4
- package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
- package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
- package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
- package/console/dist/ui/utils/agent-metadata.d.ts +58 -0
- package/console/dist/ui/utils/agent-metadata.js +275 -0
- package/console/dist/ui/utils/control-center-helpers.d.ts +19 -0
- package/console/dist/ui/utils/control-center-helpers.js +37 -0
- package/console/dist/ui/utils/validators.d.ts +200 -0
- package/console/dist/ui/utils/validators.js +563 -0
- package/console/dist/web/assets/app.css +498 -3
- package/console/dist/web/assets/app.js +5063 -1418
- package/console/package.json +3 -0
- package/core/dist/principle-tree-ledger.d.ts +55 -4
- package/core/dist/principle-tree-ledger.d.ts.map +1 -1
- package/core/dist/principle-tree-ledger.js +472 -13
- package/core/dist/principle-tree-ledger.js.map +1 -1
- package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
- package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
- package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
- package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
- package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
- package/core/dist/prompt-builder/size-guard.d.ts +1 -0
- package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
- package/core/dist/prompt-builder/size-guard.js +21 -0
- package/core/dist/prompt-builder/size-guard.js.map +1 -1
- package/core/dist/prompt-builder/types.d.ts +2 -0
- package/core/dist/prompt-builder/types.d.ts.map +1 -1
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +143 -65
- package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +85 -7
- package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
- package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js +70 -0
- package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js +136 -1
- package/core/dist/runtime-v2/__tests__/golden-trace.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +105 -0
- package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
- package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
- package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
- package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
- package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
- package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts +2 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js +211 -0
- package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
- package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
- package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
- package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
- package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
- package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
- package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +158 -1
- package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts +11 -0
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +55 -11
- package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
- package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
- package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
- package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
- package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
- package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician-output.js +16 -0
- package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
- package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
- package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +23 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js +246 -0
- package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +9 -0
- package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/index.d.ts +2 -0
- package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/index.js +2 -0
- package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
- package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
- package/{plugin/dist/core/surface-guard.d.ts → core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts} +15 -5
- package/core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts.map +1 -0
- package/{plugin/dist/core/surface-guard.js → core/dist/runtime-v2/feature-flags/surface-guard-policy.js} +14 -2
- package/core/dist/runtime-v2/feature-flags/surface-guard-policy.js.map +1 -0
- package/core/dist/runtime-v2/golden-trace-replay-validator.js +1 -1
- package/core/dist/runtime-v2/golden-trace-replay-validator.js.map +1 -1
- package/core/dist/runtime-v2/golden-trace.d.ts +19 -3
- package/core/dist/runtime-v2/golden-trace.d.ts.map +1 -1
- package/core/dist/runtime-v2/golden-trace.js +2 -0
- package/core/dist/runtime-v2/golden-trace.js.map +1 -1
- package/core/dist/runtime-v2/index.d.ts +21 -4
- package/core/dist/runtime-v2/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/index.js +21 -3
- package/core/dist/runtime-v2/index.js.map +1 -1
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js +88 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +181 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
- package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
- package/core/dist/runtime-v2/intent/index.d.ts +8 -0
- package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/index.js +8 -0
- package/core/dist/runtime-v2/intent/index.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-browser.d.ts +23 -0
- package/core/dist/runtime-v2/intent/intent-browser.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-browser.js +21 -0
- package/core/dist/runtime-v2/intent/intent-browser.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
- package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
- package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.d.ts +28 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.js +21 -0
- package/core/dist/runtime-v2/intent/intent-doc-version.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc.d.ts +35 -0
- package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-doc.js +158 -0
- package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
- package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-hash.d.ts +2 -0
- package/core/dist/runtime-v2/intent/intent-hash.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-hash.js +10 -0
- package/core/dist/runtime-v2/intent/intent-hash.js.map +1 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
- package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
- package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +41 -1
- package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js +130 -2
- package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js +228 -0
- package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +41 -11
- package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
- package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
- package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js +135 -0
- package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js.map +1 -1
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
- package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
- package/core/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/adversarial-case.js +24 -0
- package/core/dist/runtime-v2/internalization/adversarial-case.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-output.d.ts +10 -0
- package/core/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-output.js +45 -0
- package/core/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +2 -2
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +7 -2
- package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
- package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts +66 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.js +183 -0
- package/core/dist/runtime-v2/internalization/behavior-example-pack.js.map +1 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
- package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
- package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-output.d.ts +8 -0
- package/core/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-output.js +10 -0
- package/core/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +17 -0
- package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/evaluator-runner.js +118 -24
- package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js +1 -1
- package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js.map +1 -1
- package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
- package/core/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
- package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts +55 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts.map +1 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js +131 -0
- package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js.map +1 -0
- package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-observability.js +280 -56
- package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
- package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
- package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
- package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
- package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
- package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
- package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
- package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js +95 -0
- package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/risk/index.d.ts +7 -0
- package/core/dist/runtime-v2/risk/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/index.js +6 -0
- package/core/dist/runtime-v2/risk/index.js.map +1 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts +18 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.js +47 -0
- package/core/dist/runtime-v2/risk/risk-calculator-policy.js.map +1 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
- package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
- package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js +83 -0
- package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/index.d.ts +7 -0
- package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/index.js +6 -0
- package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts +28 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js +88 -0
- package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
- package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
- package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
- package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/core/dist/runtime-v2/store/sqlite-connection.js +138 -12
- package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts +2 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js +149 -0
- package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js.map +1 -0
- package/core/dist/runtime-v2/thinking-models/index.d.ts +3 -0
- package/core/dist/runtime-v2/thinking-models/index.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/index.js +3 -0
- package/core/dist/runtime-v2/thinking-models/index.js.map +1 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts +73 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts.map +1 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js +227 -0
- package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js.map +1 -0
- package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js +40 -1
- package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js +28 -1
- package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts +3 -0
- package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts.map +1 -1
- package/core/dist/runtime-v2/tools/artificer-output-typebox.js +3 -0
- package/core/dist/runtime-v2/tools/artificer-output-typebox.js.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
- package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-payload.js +0 -12
- package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
- package/core/dist/runtime-v2/types/event-types.d.ts +5 -34
- package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/event-types.js +0 -19
- package/core/dist/runtime-v2/types/event-types.js.map +1 -1
- package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
- package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
- package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
- package/core/dist/runtime-v2/types/index.d.ts +5 -5
- package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/index.js +5 -3
- package/core/dist/runtime-v2/types/index.js.map +1 -1
- package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
- package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
- package/core/dist/runtime-v2/types/ledger-store.js +10 -5
- package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
- package/core/dist/workflow-funnel-loader.d.ts +2 -2
- package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
- package/core/package.json +4 -0
- package/dist/installer.d.ts.map +1 -1
- package/dist/installer.js +16 -0
- package/dist/installer.js.map +1 -1
- package/package.json +1 -1
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +237 -0
- package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
- package/pd-cli/dist/commands/intent.d.ts +76 -0
- package/pd-cli/dist/commands/intent.d.ts.map +1 -0
- package/pd-cli/dist/commands/intent.js +411 -0
- package/pd-cli/dist/commands/intent.js.map +1 -0
- package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
- package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
- package/pd-cli/dist/commands/runtime-init.js +264 -0
- package/pd-cli/dist/commands/runtime-init.js.map +1 -0
- package/pd-cli/dist/index.js +25 -0
- package/pd-cli/dist/index.js.map +1 -1
- package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
- package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
- package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
- package/pd-cli/package.json +1 -0
- package/plugin/dist/commands/pain.js +2 -0
- package/plugin/dist/core/behavior-example-pack-assembler.d.ts +43 -0
- package/plugin/dist/core/behavior-example-pack-assembler.js +247 -0
- package/plugin/dist/core/control-ui-db.d.ts +11 -0
- package/plugin/dist/core/control-ui-db.js +40 -16
- package/plugin/dist/core/event-log.js +0 -5
- package/plugin/dist/core/intent-doc-reader-adapter.d.ts +36 -0
- package/plugin/dist/core/intent-doc-reader-adapter.js +76 -0
- package/plugin/dist/core/intent-doc-reader.d.ts +89 -0
- package/plugin/dist/core/intent-doc-reader.js +210 -0
- package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
- package/plugin/dist/core/principle-tree-ledger.js +39 -524
- package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
- package/plugin/dist/core/rule-context-assembler.d.ts +45 -0
- package/plugin/dist/core/rule-context-assembler.js +148 -0
- package/plugin/dist/core/thinking-models.d.ts +12 -57
- package/plugin/dist/core/thinking-models.js +18 -224
- package/plugin/dist/core/trajectory-types.d.ts +18 -0
- package/plugin/dist/core/trajectory.d.ts +50 -2
- package/plugin/dist/core/trajectory.js +435 -254
- package/plugin/dist/core/workspace-context.d.ts +2 -3
- package/plugin/dist/hooks/gate.js +59 -2
- package/plugin/dist/hooks/pain.js +5 -0
- package/plugin/dist/hooks/prompt-helpers.d.ts +19 -1
- package/plugin/dist/hooks/prompt-helpers.js +39 -2
- package/plugin/dist/hooks/prompt-types.d.ts +8 -0
- package/plugin/dist/hooks/prompt.js +81 -21
- package/plugin/dist/index.d.ts +3 -1
- package/plugin/dist/index.js +10 -6
- package/plugin/dist/service/runtime-summary-service.js +1 -1
- package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
- package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
- package/plugin/dist/types/event-types.d.ts +1 -1
- package/plugin/package.json +6 -3
- package/plugin/scripts/acceptance-test.mjs +3 -3
- package/plugin/dist/core/evolution-migration.d.ts +0 -5
- package/plugin/dist/core/evolution-migration.js +0 -65
- package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
- package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
- package/plugin/dist/core/risk-calculator.d.ts +0 -22
- package/plugin/dist/core/risk-calculator.js +0 -88
- package/plugin/dist/core/rule-host-helpers.d.ts +0 -8
- package/plugin/dist/core/rule-host-helpers.js +0 -7
- package/plugin/dist/core/rule-host-types.d.ts +0 -7
- package/plugin/dist/core/rule-host-types.js +0 -7
- package/plugin/dist/core/schema/db-types.d.ts +0 -11
- package/plugin/dist/core/schema/db-types.js +0 -5
- package/plugin/dist/core/schema/index.d.ts +0 -17
- package/plugin/dist/core/schema/index.js +0 -15
- package/plugin/dist/core/schema/migration-runner.d.ts +0 -53
- package/plugin/dist/core/schema/migration-runner.js +0 -170
- package/plugin/dist/core/schema/migrations/001-init-trajectory.d.ts +0 -6
- package/plugin/dist/core/schema/migrations/001-init-trajectory.js +0 -190
- package/plugin/dist/core/schema/migrations/002-init-central.d.ts +0 -5
- package/plugin/dist/core/schema/migrations/002-init-central.js +0 -108
- package/plugin/dist/core/schema/migrations/003-init-workflow.d.ts +0 -5
- package/plugin/dist/core/schema/migrations/003-init-workflow.js +0 -50
- package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +0 -8
- package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.js +0 -66
- package/plugin/dist/core/schema/migrations/index.d.ts +0 -16
- package/plugin/dist/core/schema/migrations/index.js +0 -27
- package/plugin/dist/core/schema/schema-definitions.d.ts +0 -46
- package/plugin/dist/core/schema/schema-definitions.js +0 -599
- package/plugin/dist/service/central-database.d.ts +0 -138
- package/plugin/dist/service/central-database.js +0 -731
- package/plugin/dist/service/central-sync-service.d.ts +0 -8
- package/plugin/dist/service/central-sync-service.js +0 -71
- package/plugin/scripts/db-migrate.mjs +0 -170
- package/plugin/scripts/validate-live-path.ts +0 -462
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-484 — Phase 5 Task 28 — BehaviorExamplePackAssembler (plugin I/O)
|
|
3
|
+
*
|
|
4
|
+
* Reads pain lineage + trajectory rows from TrajectoryDatabase and assembles
|
|
5
|
+
* a validated BehaviorExamplePack for the Artificer. Fail loud on any gap
|
|
6
|
+
* (missing pain, empty trajectory, invalid pack) — no silent fallback.
|
|
7
|
+
*
|
|
8
|
+
* Err-prevention:
|
|
9
|
+
* - ERR-001: every DB row field validated as `unknown` (no `as` bypass on
|
|
10
|
+
* parsed params_json or row casts).
|
|
11
|
+
* - ERR-069: Artificer shared schema — invalid pack must fail loud.
|
|
12
|
+
* - ERR-026: reuses production TrajectoryDatabase (no hand-written DDL).
|
|
13
|
+
* - rc-2: structural type guards, no `as T` on parsed input.
|
|
14
|
+
* - rc-5: Object.hasOwn over `in`.
|
|
15
|
+
* - rc-9: every failure path throws a structured Error with a clear reason.
|
|
16
|
+
*
|
|
17
|
+
* Spec: docs/superpowers/specs/2026-06-27-rulecode-context-vision-design.md §7.2
|
|
18
|
+
*
|
|
19
|
+
* Boundary: this module is I/O. Pure logic (type + validator) lives in
|
|
20
|
+
* `@principles/core/runtime-v2` → `behavior-example-pack.ts`.
|
|
21
|
+
*/
|
|
22
|
+
import { validateBehaviorExamplePack, } from '@principles/core/runtime-v2';
|
|
23
|
+
import { TrajectoryRegistry } from './trajectory.js';
|
|
24
|
+
// ── internal constants ─────────────────────────────────────────────────────
|
|
25
|
+
const MAX_POSITIVES = 3;
|
|
26
|
+
const MAX_EVIDENCE_REFS = 5;
|
|
27
|
+
const HISTORY_LIMIT = 100;
|
|
28
|
+
const PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
29
|
+
// ── type guards (rc-2: no `as` bypass) ─────────────────────────────────────
|
|
30
|
+
function isPlainObject(value) {
|
|
31
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
32
|
+
}
|
|
33
|
+
function hasNoProtoKeys(value) {
|
|
34
|
+
for (const key of Object.keys(value)) {
|
|
35
|
+
if (PROTO_KEYS.has(key))
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
// ── BehaviorExamplePackAssembler ───────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Plugin I/O assembler: pain lineage + trajectory → validated BehaviorExamplePack.
|
|
43
|
+
*
|
|
44
|
+
* Lifecycle: cheap to construct; obtains TrajectoryDatabase via the registry.
|
|
45
|
+
* Dispose is the registry's responsibility (singleton per workspace).
|
|
46
|
+
*/
|
|
47
|
+
export class BehaviorExamplePackAssembler {
|
|
48
|
+
db;
|
|
49
|
+
constructor(opts) {
|
|
50
|
+
// TrajectoryRegistry.get returns the workspace-wide singleton; do NOT
|
|
51
|
+
// dispose it here. The caller (typically a workspace lifecycle hook)
|
|
52
|
+
// owns dispose.
|
|
53
|
+
this.db = TrajectoryRegistry.get(opts.workspaceDir);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Assemble a BehaviorExamplePack from the pain lineage anchored at
|
|
57
|
+
* `input.sourcePainId`.
|
|
58
|
+
*
|
|
59
|
+
* Fail-loud contract (spec §7.2, ERR-069):
|
|
60
|
+
* - pain event not found → throws
|
|
61
|
+
* - empty trajectory → throws
|
|
62
|
+
* - no failing tool call to anchor sourceNegativeCase → throws
|
|
63
|
+
* - no successful tool call for positiveCounterexamples → throws
|
|
64
|
+
* - assembled pack fails validateBehaviorExamplePack → throws
|
|
65
|
+
*/
|
|
66
|
+
assemble(input) {
|
|
67
|
+
// ── 1. Look up the anchoring pain event ──
|
|
68
|
+
const pain = this.db.getPainEventByCanonicalId(input.sourcePainId);
|
|
69
|
+
if (!pain) {
|
|
70
|
+
throw new Error(`[BehaviorExamplePackAssembler] pain event not found for canonical_pain_id="${input.sourcePainId}" (ERR-069 fail loud)`);
|
|
71
|
+
}
|
|
72
|
+
// ── 2. Pull the recent trajectory for the pain's session ──
|
|
73
|
+
// getRuleHostContextRows returns rows WITH params_json (which
|
|
74
|
+
// listToolCallsForSession does not), so we use it here.
|
|
75
|
+
const ctxResult = this.db.getRuleHostContextRows(pain.sessionId, HISTORY_LIMIT);
|
|
76
|
+
const rows = ctxResult.rows;
|
|
77
|
+
if (rows.length === 0) {
|
|
78
|
+
throw new Error(`[BehaviorExamplePackAssembler] empty trajectory (no tool calls) for sessionId="${pain.sessionId}" (pain=${input.sourcePainId}, ERR-069 fail loud)`);
|
|
79
|
+
}
|
|
80
|
+
// ── 3. Partition into failures (negative candidates) and successes (positives) ──
|
|
81
|
+
const failures = [];
|
|
82
|
+
const successes = [];
|
|
83
|
+
for (const row of rows) {
|
|
84
|
+
if (row.outcome === 'failure') {
|
|
85
|
+
failures.push(row);
|
|
86
|
+
}
|
|
87
|
+
else if (row.outcome === 'success') {
|
|
88
|
+
successes.push(row);
|
|
89
|
+
}
|
|
90
|
+
// 'blocked' rows are not used as either positive or negative cases.
|
|
91
|
+
}
|
|
92
|
+
if (failures.length === 0) {
|
|
93
|
+
throw new Error(`[BehaviorExamplePackAssembler] no failing tool call in sessionId="${pain.sessionId}" — cannot build sourceNegativeCase (pain=${input.sourcePainId}, ERR-069 fail loud)`);
|
|
94
|
+
}
|
|
95
|
+
if (successes.length === 0) {
|
|
96
|
+
throw new Error(`[BehaviorExamplePackAssembler] no successful tool call in sessionId="${pain.sessionId}" — cannot build positiveCounterexamples (pain=${input.sourcePainId}, ERR-069 fail loud)`);
|
|
97
|
+
}
|
|
98
|
+
// ── 4. Build sourceNegativeCase from the most recent failure ──
|
|
99
|
+
const sourceFailure = failures[failures.length - 1];
|
|
100
|
+
if (!sourceFailure) {
|
|
101
|
+
// Defensive: should be unreachable due to the failures.length === 0 check
|
|
102
|
+
// above, but noUncheckedIndexedAccess requires the guard.
|
|
103
|
+
throw new Error(`[BehaviorExamplePackAssembler] internal error: sourceFailure undefined (pain=${input.sourcePainId})`);
|
|
104
|
+
}
|
|
105
|
+
const sourceNegativeCase = buildCaseFromRow(sourceFailure, 'negative', 'block', input.projectDir);
|
|
106
|
+
// ── 5. Build positiveCounterexamples from successes (≤3, most recent first) ──
|
|
107
|
+
const positiveRows = successes.slice(-MAX_POSITIVES); // most recent ≤3
|
|
108
|
+
const positiveCounterexamples = [];
|
|
109
|
+
for (const row of positiveRows) {
|
|
110
|
+
positiveCounterexamples.push(buildCaseFromRow(row, 'positive', 'allow', input.projectDir));
|
|
111
|
+
}
|
|
112
|
+
// ── 6. Build evidenceRefs from pain events + gate blocks (≤5) ──
|
|
113
|
+
const evidenceRefs = [];
|
|
114
|
+
const sessionPainEvents = this.db.listPainEventsForSession(pain.sessionId);
|
|
115
|
+
for (const p of sessionPainEvents) {
|
|
116
|
+
if (evidenceRefs.length >= MAX_EVIDENCE_REFS)
|
|
117
|
+
break;
|
|
118
|
+
evidenceRefs.push(`pain:${p.id}`);
|
|
119
|
+
}
|
|
120
|
+
const gateBlocks = this.db.listGateBlocksForSession(pain.sessionId);
|
|
121
|
+
for (const g of gateBlocks) {
|
|
122
|
+
if (evidenceRefs.length >= MAX_EVIDENCE_REFS)
|
|
123
|
+
break;
|
|
124
|
+
evidenceRefs.push(`gate:${g.id}`);
|
|
125
|
+
}
|
|
126
|
+
if (evidenceRefs.length === 0) {
|
|
127
|
+
// The anchor pain event itself always provides at least one evidenceRef.
|
|
128
|
+
evidenceRefs.push(`pain:${pain.id}`);
|
|
129
|
+
}
|
|
130
|
+
// ── 7. Apply redaction (spec §7.2: "经过脱敏") ──
|
|
131
|
+
const redactionResult = redactParams(sourceNegativeCase.params, input.projectDir);
|
|
132
|
+
const redactedNegativeCase = {
|
|
133
|
+
...sourceNegativeCase,
|
|
134
|
+
params: redactionResult.redacted,
|
|
135
|
+
};
|
|
136
|
+
const redactedPositives = positiveCounterexamples.map((c) => {
|
|
137
|
+
const r = redactParams(c.params, input.projectDir);
|
|
138
|
+
return { ...c, params: r.redacted };
|
|
139
|
+
});
|
|
140
|
+
const redactionNotes = [...redactionResult.notes];
|
|
141
|
+
// ── 8. Assemble the pack ──
|
|
142
|
+
const pack = {
|
|
143
|
+
sourceNegativeCase: redactedNegativeCase,
|
|
144
|
+
ownerDesiredOutcome: input.ownerDesiredOutcome,
|
|
145
|
+
positiveCounterexamples: redactedPositives,
|
|
146
|
+
evidenceRefs,
|
|
147
|
+
redactionNotes,
|
|
148
|
+
};
|
|
149
|
+
// ── 9. Validate — fail loud (ERR-069) ──
|
|
150
|
+
const validation = validateBehaviorExamplePack(pack);
|
|
151
|
+
if (!validation.valid) {
|
|
152
|
+
throw new Error(`[BehaviorExamplePackAssembler] assembled pack failed validateBehaviorExamplePack: ${validation.errors.join('; ')} (ERR-069 fail loud)`);
|
|
153
|
+
}
|
|
154
|
+
return pack;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ── internal: case builder ─────────────────────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Build a GoldenTraceCaseInput from a trajectory tool_call row.
|
|
160
|
+
*
|
|
161
|
+
* ERR-001: parses params_json as unknown and structurally validates (must be
|
|
162
|
+
* a plain object without proto-pollution keys). Throws on malformed input
|
|
163
|
+
* (rc-9: no silent fallback).
|
|
164
|
+
*/
|
|
165
|
+
function buildCaseFromRow(row, kind, expectedDecision, _projectDir) {
|
|
166
|
+
if (typeof row.toolName !== 'string' || row.toolName.length === 0) {
|
|
167
|
+
throw new Error(`[BehaviorExamplePackAssembler] row id=${row.id}: toolName must be a non-empty string (rc-9 fail loud)`);
|
|
168
|
+
}
|
|
169
|
+
if (typeof row.paramsJson !== 'string') {
|
|
170
|
+
throw new Error(`[BehaviorExamplePackAssembler] row id=${row.id}: paramsJson must be a string (rc-9 fail loud)`);
|
|
171
|
+
}
|
|
172
|
+
let parsedParams;
|
|
173
|
+
try {
|
|
174
|
+
parsedParams = JSON.parse(row.paramsJson);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
throw new Error(`[BehaviorExamplePackAssembler] row id=${row.id}: paramsJson is not valid JSON (rc-9 fail loud)`);
|
|
178
|
+
}
|
|
179
|
+
if (!isPlainObject(parsedParams)) {
|
|
180
|
+
throw new Error(`[BehaviorExamplePackAssembler] row id=${row.id}: paramsJson must parse to a non-array object (rc-9 fail loud)`);
|
|
181
|
+
}
|
|
182
|
+
if (!hasNoProtoKeys(parsedParams)) {
|
|
183
|
+
throw new Error(`[BehaviorExamplePackAssembler] row id=${row.id}: paramsJson must not carry prototype-pollution keys (ERR-076, rc-9 fail loud)`);
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
caseId: `case-${kind}-${row.id}`,
|
|
187
|
+
kind,
|
|
188
|
+
toolName: row.toolName,
|
|
189
|
+
params: parsedParams,
|
|
190
|
+
expectedDecision,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Redact sensitive fields from tool call params before they enter the pack.
|
|
195
|
+
*
|
|
196
|
+
* First-version policy:
|
|
197
|
+
* - Absolute paths outside the project tree → replaced with `<redacted:absolute-path>`
|
|
198
|
+
* - String values that look like secrets (long base64 / AKIA-style keys / etc.)
|
|
199
|
+
* → replaced with `<redacted:secret>`
|
|
200
|
+
*
|
|
201
|
+
* Records each redaction in `notes` so the Artificer and the owner can see
|
|
202
|
+
* what was stripped (spec §7.2: redactionNotes is part of the pack contract).
|
|
203
|
+
*/
|
|
204
|
+
function redactParams(params, projectDir) {
|
|
205
|
+
const notes = [];
|
|
206
|
+
const redacted = {};
|
|
207
|
+
for (const key of Object.keys(params)) {
|
|
208
|
+
if (PROTO_KEYS.has(key))
|
|
209
|
+
continue; // defense in depth (ERR-076)
|
|
210
|
+
const value = params[key];
|
|
211
|
+
if (typeof value !== 'string') {
|
|
212
|
+
redacted[key] = value;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
// Path-like values
|
|
216
|
+
if (looksLikeAbsolutePath(value) && !value.startsWith(projectDir)) {
|
|
217
|
+
redacted[key] = '<redacted:absolute-path>';
|
|
218
|
+
notes.push(`redacted absolute path in field "${key}" (outside project tree)`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
// Secret-like values (AWS keys, long base64 tokens, etc.)
|
|
222
|
+
if (looksLikeSecret(value)) {
|
|
223
|
+
redacted[key] = '<redacted:secret>';
|
|
224
|
+
notes.push(`redacted possible secret in field "${key}"`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
redacted[key] = value;
|
|
228
|
+
}
|
|
229
|
+
return { redacted, notes };
|
|
230
|
+
}
|
|
231
|
+
function looksLikeAbsolutePath(value) {
|
|
232
|
+
// POSIX absolute path or Windows drive path
|
|
233
|
+
return value.startsWith('/') || /^[A-Za-z]:[\\/]/.test(value);
|
|
234
|
+
}
|
|
235
|
+
const SECRET_PATTERNS = [
|
|
236
|
+
/AKIA[0-9A-Z]{16}/, // AWS access key ID
|
|
237
|
+
/[A-Za-z0-9+/]{40,}/, // long base64-ish token (≥40 chars, no spaces)
|
|
238
|
+
];
|
|
239
|
+
function looksLikeSecret(value) {
|
|
240
|
+
if (value.length < 20)
|
|
241
|
+
return false; // too short to be a real secret
|
|
242
|
+
for (const pattern of SECRET_PATTERNS) {
|
|
243
|
+
if (pattern.test(value))
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
@@ -102,5 +102,16 @@ export declare class ControlUiDatabase {
|
|
|
102
102
|
run(sql: string, ...params: unknown[]): void;
|
|
103
103
|
restoreRawText(inlineText?: string | null, blobRef?: string | null): string;
|
|
104
104
|
private initSchema;
|
|
105
|
+
/**
|
|
106
|
+
* Create or replace a view, tolerating missing dependency tables.
|
|
107
|
+
*
|
|
108
|
+
* Views in ControlUiDatabase depend on tables created by TrajectoryDatabase
|
|
109
|
+
* (assistant_turns, tool_calls, pain_events, user_turns, correction_samples).
|
|
110
|
+
* If ControlUiDatabase is constructed before TrajectoryDatabase has created
|
|
111
|
+
* those tables, CREATE VIEW would throw. We DROP+CREATE with try/catch so
|
|
112
|
+
* missing-dependency views are skipped with a warning (rc-9: surfaced via
|
|
113
|
+
* console.info) rather than aborting schema initialization.
|
|
114
|
+
*/
|
|
115
|
+
private createViewSafely;
|
|
105
116
|
private withWrite;
|
|
106
117
|
}
|
|
@@ -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
|
}
|
|
@@ -69,8 +69,6 @@ export class EventLog {
|
|
|
69
69
|
recordPainSignal(sessionId, data) {
|
|
70
70
|
this.record('pain_signal', 'detected', sessionId, data);
|
|
71
71
|
}
|
|
72
|
-
// recordRuleMatch removed (PRI-451 Wave 1): dead code. Its only effect was
|
|
73
|
-
// incrementing stats.pain.rulesMatched (also dead, removed in Wave 1.5).
|
|
74
72
|
recordRulePromotion(data) {
|
|
75
73
|
this.record('rule_promotion', 'promoted', undefined, data);
|
|
76
74
|
}
|
|
@@ -350,9 +348,6 @@ export class EventLog {
|
|
|
350
348
|
stats.empathy.rollbackCount++;
|
|
351
349
|
stats.empathy.rolledBackScore += data.originalScore || 0;
|
|
352
350
|
}
|
|
353
|
-
// rule_match handler removed (PRI-451 Wave 1.5): recordRuleMatch is gone
|
|
354
|
-
// (Wave 1.1), so no rule_match events are emitted; stats.pain.rulesMatched
|
|
355
|
-
// was its only consumer and is also removed.
|
|
356
351
|
else if (entry.type === 'rule_promotion') {
|
|
357
352
|
// stats.pain.candidatesPromoted removed (PRI-451 Wave 1.5): dead counter.
|
|
358
353
|
stats.evolution.rulesPromoted++;
|
|
@@ -0,0 +1,36 @@
|
|
|
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, IntentLang } from '@principles/core/runtime-v2';
|
|
21
|
+
/**
|
|
22
|
+
* Detect which language's INTENT file exists on disk.
|
|
23
|
+
* Priority: zh-CN first, then en. Defaults to zh-CN if neither exists.
|
|
24
|
+
*
|
|
25
|
+
* This lets hooks avoid hardcoding a single language — the Owner may have
|
|
26
|
+
* created either INTENT.zh-CN.md or INTENT.en.md.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveIntentLang(workspaceDir: string): IntentLang;
|
|
29
|
+
/**
|
|
30
|
+
* Create an IntentDocReader bound to a specific workspace and language.
|
|
31
|
+
*
|
|
32
|
+
* The returned reader is stateless beyond the (workspace, lang) binding — each
|
|
33
|
+
* `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
|
|
34
|
+
* the TTL+mtime cache keyed by `${workspaceDir}:${lang}`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createIntentDocReader(workspaceDir: string, lang: IntentLang): IntentDocReader;
|
|
@@ -0,0 +1,76 @@
|
|
|
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 * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { safeReadIntentDoc } from './intent-doc-reader.js';
|
|
23
|
+
import { getIntentFilename, } from '@principles/core/runtime-v2';
|
|
24
|
+
const INTENT_DIR = '.principles';
|
|
25
|
+
/**
|
|
26
|
+
* Detect which language's INTENT file exists on disk.
|
|
27
|
+
* Priority: zh-CN first, then en. Defaults to zh-CN if neither exists.
|
|
28
|
+
*
|
|
29
|
+
* This lets hooks avoid hardcoding a single language — the Owner may have
|
|
30
|
+
* created either INTENT.zh-CN.md or INTENT.en.md.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveIntentLang(workspaceDir) {
|
|
33
|
+
const zhPath = path.join(workspaceDir, INTENT_DIR, getIntentFilename('zh-CN'));
|
|
34
|
+
if (fs.existsSync(zhPath))
|
|
35
|
+
return 'zh-CN';
|
|
36
|
+
const enPath = path.join(workspaceDir, INTENT_DIR, getIntentFilename('en'));
|
|
37
|
+
if (fs.existsSync(enPath))
|
|
38
|
+
return 'en';
|
|
39
|
+
return 'zh-CN';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create an IntentDocReader bound to a specific workspace and language.
|
|
43
|
+
*
|
|
44
|
+
* The returned reader is stateless beyond the (workspace, lang) binding — each
|
|
45
|
+
* `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
|
|
46
|
+
* the TTL+mtime cache keyed by `${workspaceDir}:${lang}`.
|
|
47
|
+
*/
|
|
48
|
+
export function createIntentDocReader(workspaceDir, lang) {
|
|
49
|
+
return {
|
|
50
|
+
readIntentDoc() {
|
|
51
|
+
const result = safeReadIntentDoc(workspaceDir, lang);
|
|
52
|
+
if (result.ok && result.doc) {
|
|
53
|
+
const doc = result.doc;
|
|
54
|
+
const reference = {
|
|
55
|
+
raw: typeof doc.raw === 'string' ? doc.raw : '',
|
|
56
|
+
contentHash: typeof doc.contentHash === 'string' ? doc.contentHash : '',
|
|
57
|
+
path: typeof doc.path === 'string' ? doc.path : '',
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
found: true,
|
|
62
|
+
flagEnabled: true,
|
|
63
|
+
doc: reference,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Degraded path — preserve structured reason + nextAction (EP-03 / ERR-002)
|
|
67
|
+
return {
|
|
68
|
+
ok: false,
|
|
69
|
+
found: result.found,
|
|
70
|
+
flagEnabled: result.flagEnabled,
|
|
71
|
+
reason: result.reason,
|
|
72
|
+
nextAction: result.nextAction,
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
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, type IntentLang } 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
|
+
*
|
|
59
|
+
* - No args: clear the whole cache.
|
|
60
|
+
* - workspaceDir only: delete all entries for that workspace (any lang).
|
|
61
|
+
* Keys are formatted as `${workspaceDir}:${lang}`, so we match by prefix.
|
|
62
|
+
* - workspaceDir + lang: delete the single `${workspaceDir}:${lang}` entry.
|
|
63
|
+
*
|
|
64
|
+
* Note: prompt.ts resetPromptStateForTest passes workspaceDir only — the
|
|
65
|
+
* previous signature treated it as a literal cache key, which never matched
|
|
66
|
+
* the `${workspaceDir}:${lang}` format and silently left entries behind.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resetIntentDocCacheForTest(workspaceDir?: string, lang?: IntentLang): void;
|
|
69
|
+
/**
|
|
70
|
+
* Safely read INTENT.md for prompt injection.
|
|
71
|
+
*
|
|
72
|
+
* Contract (SPEC §12):
|
|
73
|
+
* 1. Flag check FIRST via loadFeatureFlagFromConfig. Flag off → flag_disabled
|
|
74
|
+
* WITHOUT any fs access to INTENT.md.
|
|
75
|
+
* 2. Flag on → check TTL + mtime cache. If cached and fresh → return cached.
|
|
76
|
+
* 3. Otherwise → stat the file (oversized check), read, parse, validate, cache.
|
|
77
|
+
* 4. Never throws — all errors return structured reason + nextAction.
|
|
78
|
+
*
|
|
79
|
+
* @param workspaceDir - Absolute path to the workspace root
|
|
80
|
+
* @param lang - Mandatory language code ('zh-CN' | 'en'); selects INTENT.${lang}.md
|
|
81
|
+
* @param options - Optional logger for debug-level diagnostics
|
|
82
|
+
* @returns SafeReadIntentDocResult (never throws)
|
|
83
|
+
*/
|
|
84
|
+
export declare function safeReadIntentDoc(workspaceDir: string, lang: IntentLang, options?: {
|
|
85
|
+
logger?: {
|
|
86
|
+
debug?: (msg: string) => void;
|
|
87
|
+
warn?: (msg: string) => void;
|
|
88
|
+
};
|
|
89
|
+
}): SafeReadIntentDocResult;
|