create-principles-disciple 1.124.2 → 1.125.1

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.
Files changed (120) hide show
  1. package/console/dist/server/config/pd-config-store.js +23 -11
  2. package/core/dist/index.d.ts +3 -3
  3. package/core/dist/index.js +3 -3
  4. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +93 -0
  5. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  6. package/core/dist/runtime-v2/config/__tests__/pd-config-provenance.test.d.ts +24 -0
  7. package/core/dist/runtime-v2/config/__tests__/pd-config-provenance.test.d.ts.map +1 -0
  8. package/core/dist/runtime-v2/config/__tests__/pd-config-provenance.test.js +208 -0
  9. package/core/dist/runtime-v2/config/__tests__/pd-config-provenance.test.js.map +1 -0
  10. package/core/dist/runtime-v2/config/index.d.ts +1 -1
  11. package/core/dist/runtime-v2/config/index.d.ts.map +1 -1
  12. package/core/dist/runtime-v2/config/index.js.map +1 -1
  13. package/core/dist/runtime-v2/config/pd-config-effective.d.ts.map +1 -1
  14. package/core/dist/runtime-v2/config/pd-config-effective.js +10 -2
  15. package/core/dist/runtime-v2/config/pd-config-effective.js.map +1 -1
  16. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts +3 -1
  17. package/core/dist/runtime-v2/config/pd-config-feature-flags.d.ts.map +1 -1
  18. package/core/dist/runtime-v2/config/pd-config-feature-flags.js +2 -0
  19. package/core/dist/runtime-v2/config/pd-config-feature-flags.js.map +1 -1
  20. package/core/dist/runtime-v2/config/pd-config-types.d.ts +4 -0
  21. package/core/dist/runtime-v2/config/pd-config-types.d.ts.map +1 -1
  22. package/core/dist/runtime-v2/config/pd-config-types.js +23 -0
  23. package/core/dist/runtime-v2/config/pd-config-types.js.map +1 -1
  24. package/core/dist/runtime-v2/config/pd-config-validate.d.ts.map +1 -1
  25. package/core/dist/runtime-v2/config/pd-config-validate.js +12 -1
  26. package/core/dist/runtime-v2/config/pd-config-validate.js.map +1 -1
  27. package/core/dist/runtime-v2/feature-flags/__tests__/installer-config-parity.test.js +4 -3
  28. package/core/dist/runtime-v2/feature-flags/__tests__/installer-config-parity.test.js.map +1 -1
  29. package/core/dist/runtime-v2/index.d.ts +2 -0
  30. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  31. package/core/dist/runtime-v2/index.js.map +1 -1
  32. package/core/dist/runtime-v2/pain-signal-bridge.d.ts +8 -1
  33. package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  34. package/core/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  35. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  36. package/core/dist/runtime-v2/pain-signal-observability.js +25 -10
  37. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  38. package/core/package.json +0 -1
  39. package/dist/mvp-config.d.ts.map +1 -1
  40. package/dist/mvp-config.js +30 -20
  41. package/dist/mvp-config.js.map +1 -1
  42. package/host-runtime/dist/governance-signal-admission.js +11 -5
  43. package/host-runtime/dist/index.d.ts +3 -0
  44. package/host-runtime/dist/index.js +1 -0
  45. package/host-runtime/dist/production-pain-evidence.d.ts +7 -0
  46. package/host-runtime/dist/production-pain-evidence.js +9 -4
  47. package/package.json +1 -1
  48. package/pd-cli/dist/commands/pain-list.d.ts +45 -0
  49. package/pd-cli/dist/commands/pain-list.d.ts.map +1 -0
  50. package/pd-cli/dist/commands/pain-list.js +165 -0
  51. package/pd-cli/dist/commands/pain-list.js.map +1 -0
  52. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -1
  53. package/pd-cli/dist/commands/runtime-init.js +12 -1
  54. package/pd-cli/dist/commands/runtime-init.js.map +1 -1
  55. package/pd-cli/dist/index.js +11 -0
  56. package/pd-cli/dist/index.js.map +1 -1
  57. package/plugin/dist/bundle.js +399 -395
  58. package/plugin/dist/core/trajectory-types.d.ts +2 -0
  59. package/plugin/dist/governance-audit.js +1 -1
  60. package/plugin/dist/rulehost-evidence.js +9 -7
  61. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts +0 -2
  62. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.d.ts.map +0 -1
  63. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.js +0 -346
  64. package/core/dist/adapters/__tests__/code-review-pain-adapter.test.js.map +0 -1
  65. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts +0 -2
  66. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.d.ts.map +0 -1
  67. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.js +0 -290
  68. package/core/dist/adapters/__tests__/openclaw-pain-adapter.test.js.map +0 -1
  69. package/core/dist/adapters/__tests__/writing-pain-adapter.test.d.ts +0 -2
  70. package/core/dist/adapters/__tests__/writing-pain-adapter.test.d.ts.map +0 -1
  71. package/core/dist/adapters/__tests__/writing-pain-adapter.test.js +0 -239
  72. package/core/dist/adapters/__tests__/writing-pain-adapter.test.js.map +0 -1
  73. package/core/dist/adapters/code-review/code-review-pain-adapter.d.ts +0 -13
  74. package/core/dist/adapters/code-review/code-review-pain-adapter.d.ts.map +0 -1
  75. package/core/dist/adapters/code-review/code-review-pain-adapter.js +0 -139
  76. package/core/dist/adapters/code-review/code-review-pain-adapter.js.map +0 -1
  77. package/core/dist/adapters/code-review/index.d.ts +0 -6
  78. package/core/dist/adapters/code-review/index.d.ts.map +0 -1
  79. package/core/dist/adapters/code-review/index.js +0 -2
  80. package/core/dist/adapters/code-review/index.js.map +0 -1
  81. package/core/dist/adapters/code-review/review-event-types.d.ts +0 -54
  82. package/core/dist/adapters/code-review/review-event-types.d.ts.map +0 -1
  83. package/core/dist/adapters/code-review/review-event-types.js +0 -8
  84. package/core/dist/adapters/code-review/review-event-types.js.map +0 -1
  85. package/core/dist/adapters/coding/index.d.ts +0 -6
  86. package/core/dist/adapters/coding/index.d.ts.map +0 -1
  87. package/core/dist/adapters/coding/index.js +0 -5
  88. package/core/dist/adapters/coding/index.js.map +0 -1
  89. package/core/dist/adapters/coding/openclaw-event-types.d.ts +0 -26
  90. package/core/dist/adapters/coding/openclaw-event-types.d.ts.map +0 -1
  91. package/core/dist/adapters/coding/openclaw-event-types.js +0 -9
  92. package/core/dist/adapters/coding/openclaw-event-types.js.map +0 -1
  93. package/core/dist/adapters/coding/openclaw-pain-adapter.d.ts +0 -27
  94. package/core/dist/adapters/coding/openclaw-pain-adapter.d.ts.map +0 -1
  95. package/core/dist/adapters/coding/openclaw-pain-adapter.js +0 -102
  96. package/core/dist/adapters/coding/openclaw-pain-adapter.js.map +0 -1
  97. package/core/dist/adapters/writing/index.d.ts +0 -6
  98. package/core/dist/adapters/writing/index.d.ts.map +0 -1
  99. package/core/dist/adapters/writing/index.js +0 -5
  100. package/core/dist/adapters/writing/index.js.map +0 -1
  101. package/core/dist/adapters/writing/writing-pain-adapter.d.ts +0 -22
  102. package/core/dist/adapters/writing/writing-pain-adapter.d.ts.map +0 -1
  103. package/core/dist/adapters/writing/writing-pain-adapter.js +0 -62
  104. package/core/dist/adapters/writing/writing-pain-adapter.js.map +0 -1
  105. package/core/dist/adapters/writing/writing-types.d.ts +0 -34
  106. package/core/dist/adapters/writing/writing-types.d.ts.map +0 -1
  107. package/core/dist/adapters/writing/writing-types.js +0 -9
  108. package/core/dist/adapters/writing/writing-types.js.map +0 -1
  109. package/core/dist/pain-signal-adapter.d.ts +0 -37
  110. package/core/dist/pain-signal-adapter.d.ts.map +0 -1
  111. package/core/dist/pain-signal-adapter.js +0 -2
  112. package/core/dist/pain-signal-adapter.js.map +0 -1
  113. package/core/dist/pain-signal.d.ts +0 -16
  114. package/core/dist/pain-signal.d.ts.map +0 -1
  115. package/core/dist/pain-signal.js +0 -15
  116. package/core/dist/pain-signal.js.map +0 -1
  117. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts +0 -2
  118. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.d.ts.map +0 -1
  119. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js +0 -150
  120. package/core/dist/runtime-v2/__tests__/pain-signal-unification.test.js.map +0 -1
@@ -69,6 +69,8 @@ export interface TrajectoryPainEventInput {
69
69
  canonicalPainId?: string;
70
70
  /** PRI-406: Runtime V2 diagnostician task ID linked to this pain event. */
71
71
  runtimeTaskId?: string;
72
+ /** PRI-640: Host attribution ('openclaw' | 'codex'); omit for manual/legacy (persists NULL = unknown). */
73
+ hostKind?: 'openclaw' | 'codex';
72
74
  }
73
75
  export interface TrajectoryGateBlockInput {
74
76
  sessionId?: string | null;
@@ -353,7 +353,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
353
353
  `);var nT=Object.create(null);nT.principle="principle-ledger";nT.rule="rule-candidate";nT.implementation="implementation-candidate";nT.prompt="prompt-injection-candidate";nT.defer="deferred";lo();lo();lo();_i();var B1={evaluatorRepairBudgetExhausted:"evaluator_repair_budget_exhausted",rolloutRevisionBudgetExhausted:"rollout_revision_budget_exhausted",evaluatorRepairSeedFailed:"evaluator_repair_seed_failed",rolloutActivationCandidateUnresolved:"rollout_activation_candidate_unresolved",rolloutDispatchNotWired:"rollout_dispatch_not_wired",rolloutDispatchRefused:"rollout_dispatch_refused",rolloutRevisionTargetUnresolved:"rollout_revision_target_unresolved",rolloutRevisionRoutingNotWired:"rollout_revision_routing_not_wired",rolloutRevisionReopenFailed:"rollout_revision_reopen_failed",rolloutRevisionIterationMissing:"rollout_revision_iteration_missing",workspaceDirtyStall:"workspace_dirty_stall"},d0t=new Set([B1.evaluatorRepairBudgetExhausted,B1.rolloutRevisionBudgetExhausted]);_i();_i();_i();lo();var x0t={canonicalDiagnosis:{workspaceDir:"/workspace/dogfood",painEvents:[{id:1,source:"manual",reason:"Before declaring a user journey complete verify full observable product surface",text:"Manual record: surface validation missing",created_at:"2026-06-13T10:00:00.000Z",score:90}],tasks:[{task_id:"diagnosis_manual_1",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:01:00.000Z",input_ref:"pain_1",diagnostic_json:JSON.stringify({rootCause:"Verifier checks static patterns but misses real runtime load."})}],candidates:[],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},subRunDiagnosis:{workspaceDir:"/workspace/dogfood",painEvents:[{id:"2",source:"manual",reason:"Verify config file updates before committing",text:"Manual record: verify config changes",created_at:"2026-06-13T10:02:00.000Z",score:80}],tasks:[{task_id:"diag_router-diagnosis_manual_2",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:03:00.000Z",input_ref:"pain_2",diagnostic_json:JSON.stringify({rootCause:"No pre-commit hook runs pd config verification."})}],candidates:[{candidate_id:"cand-subrun-2",task_id:"diag_router-diagnosis_manual_2",title:"Verify config changes before commit",description:"Verify all config files conform to parser constraints prior to commit.",confidence:.95,recommendation_kind:"principle"}],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},asyncPendingWithoutConsumer:{workspaceDir:"/workspace/dogfood",painEvents:[{id:3,source:"manual",reason:"Agent does not pause to clarify when command fails",created_at:"2026-06-13T10:04:00.000Z",score:75}],tasks:[{task_id:"diagnosis_manual_3",task_kind:"diagnostician",status:"pending",created_at:"2026-06-13T10:05:00.000Z",input_ref:"pain_3"}],candidates:[],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},candidateGeneratedNoDreamer:{workspaceDir:"/workspace/dogfood",painEvents:[{id:4,source:"manual",reason:"Auto-consumer should lease tasks correctly",created_at:"2026-06-13T10:06:00.000Z",score:70}],tasks:[{task_id:"diagnosis_manual_4",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:07:00.000Z",input_ref:"pain_4"}],candidates:[{candidate_id:"cand-4",task_id:"diagnosis_manual_4",title:"Lease tasks correctly in auto-consumer",description:"Prevent ready dreamer tasks from staying pending.",confidence:.85,recommendation_kind:"principle"}],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},dreamerPending:{workspaceDir:"/workspace/dogfood",painEvents:[{id:5,source:"manual",reason:"Dreamer pending task scenario",created_at:"2026-06-13T10:08:00.000Z",score:85}],tasks:[{task_id:"diagnosis_manual_5",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:09:00.000Z",input_ref:"pain_5"}],candidates:[{candidate_id:"cand-5",task_id:"diagnosis_manual_5",title:"Dreamer pending title",description:"Dreamer pending description",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-5-prompt",task_kind:"dreamer",status:"pending"}],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},dreamerRunning:{workspaceDir:"/workspace/dogfood",painEvents:[{id:6,source:"manual",reason:"Dreamer running task scenario",created_at:"2026-06-13T10:10:00.000Z",score:85}],tasks:[{task_id:"diagnosis_manual_6",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:11:00.000Z",input_ref:"pain_6"}],candidates:[{candidate_id:"cand-6",task_id:"diagnosis_manual_6",title:"Dreamer running title",description:"Dreamer running description",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-6-prompt",task_kind:"dreamer",status:"running"}],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},dreamerFailed:{workspaceDir:"/workspace/dogfood",painEvents:[{id:7,source:"manual",reason:"Dreamer failed task scenario",created_at:"2026-06-13T10:12:00.000Z",score:85}],tasks:[{task_id:"diagnosis_manual_7",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:13:00.000Z",input_ref:"pain_7"}],candidates:[{candidate_id:"cand-7",task_id:"diagnosis_manual_7",title:"Dreamer failed title",description:"Dreamer failed description",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-7-prompt",task_kind:"dreamer",status:"failed"}],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},dreamerSucceeded:{workspaceDir:"/workspace/dogfood",painEvents:[{id:8,source:"manual",reason:"Dreamer succeeded task scenario",created_at:"2026-06-13T10:14:00.000Z",score:85}],tasks:[{task_id:"diagnosis_manual_8",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:15:00.000Z",input_ref:"pain_8"}],candidates:[{candidate_id:"cand-8",task_id:"diagnosis_manual_8",title:"Dreamer succeeded title",description:"Dreamer succeeded description",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-8-prompt",task_kind:"dreamer",status:"succeeded"}],ledgerPrinciples:[{id:"principle-8",derivedFromPainIds:["pain_8"],status:"candidate",text:"Dreamer succeeded principle text"}],trajectoryDbAvailable:!0,stateDbAvailable:!0},malformedLedgerDegradedJson:{workspaceDir:"/workspace/dogfood",painEvents:[{id:9,source:"manual",reason:"Malformed data handling",created_at:"2026-06-13T10:16:00.000Z",score:80}],tasks:[{task_id:"diagnosis_manual_9",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:17:00.000Z",input_ref:"pain_9",diagnostic_json:"{invalid-json}"}],candidates:[],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},workspaceMismatchWarning:{workspaceDir:"/workspace/dogfood",painEvents:[{id:10,source:"hook",reason:"Workspace mismatch event",created_at:"2026-06-13T10:18:00.000Z",score:60}],tasks:[{task_id:"diagnosis_other_999",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:00:00.000Z",input_ref:"pain_999"}],candidates:[],dreamerTasks:[],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0},autoConsumerSuccess:{workspaceDir:"/workspace/dogfood",painEvents:[{id:11,source:"manual",reason:"Auto-consumer leasing and successor creation success",created_at:"2026-06-13T10:20:00.000Z",score:95}],tasks:[{task_id:"diagnosis_manual_11",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:21:00.000Z",input_ref:"pain_11"}],candidates:[{candidate_id:"cand-11",task_id:"diagnosis_manual_11",title:"Auto-consumer successor task",description:"Verifies that successor philosopher task is created after dreamer success.",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-11-prompt",task_kind:"dreamer",status:"succeeded"}],ledgerPrinciples:[{id:"principle-11",derivedFromPainIds:["pain_11"],status:"active"}],trajectoryDbAvailable:!0,stateDbAvailable:!0},autoConsumerFailure:{workspaceDir:"/workspace/dogfood",painEvents:[{id:12,source:"manual",reason:"Auto-consumer failure persistence check",created_at:"2026-06-13T10:22:00.000Z",score:95}],tasks:[{task_id:"diagnosis_manual_12",task_kind:"diagnostician",status:"succeeded",created_at:"2026-06-13T10:23:00.000Z",input_ref:"pain_12"}],candidates:[{candidate_id:"cand-12",task_id:"diagnosis_manual_12",title:"Auto-consumer failure details",description:"Dreamer failed task description",confidence:.9}],dreamerTasks:[{task_id:"dreamer-cand-12-prompt",task_kind:"dreamer",status:"failed"}],ledgerPrinciples:[],trajectoryDbAvailable:!0,stateDbAvailable:!0}};_i();var Rke={manifestId:"dreamer.v1",schemaVersion:fv,runnerKind:"dreamer",tier0:["pain.summary.headline","diagnosis.summary.headline"],tier1:["pain.summary.category","pain.summary.severity","pain.summary.rootSymptom","diagnosis.summary.rootCause","diagnosis.summary.affectedComponents"],tier2:[],budgetTokens:1500,priority:["diagnosis.summary.rootCause","pain.summary.rootSymptom","pain.summary.category","pain.summary.severity","diagnosis.summary.affectedComponents","pain.summary.headline","diagnosis.summary.headline"]},Cke={manifestId:"scribe.v1",schemaVersion:fv,runnerKind:"scribe",tier0:["philosopher.summary.headline","philosopher.predecessorSummary.headline"],tier1:["philosopher.summary.thesis","philosopher.summary.principleTitle","philosopher.summary.principleScope","philosopher.predecessorSummary.badDecision","philosopher.predecessorSummary.betterDecision","philosopher.predecessorSummary.rationale","philosopher.predecessorSummary.riskLevel","philosopher.predecessorSummary.strategicPerspective"],tier2:[],budgetTokens:1800,priority:["philosopher.summary.principleTitle","philosopher.summary.thesis","philosopher.predecessorSummary.betterDecision","philosopher.predecessorSummary.riskLevel","philosopher.predecessorSummary.rationale","philosopher.summary.principleScope","philosopher.predecessorSummary.badDecision","philosopher.predecessorSummary.strategicPerspective","philosopher.summary.headline","philosopher.predecessorSummary.headline"]},Oke={manifestId:"artificer.v1",schemaVersion:fv,runnerKind:"artificer",tier0:["scribe.summary.headline","scribe.predecessorSummary.headline"],tier1:["scribe.summary.principleText","scribe.summary.scope","scribe.summary.exceptions"],tier2:["dreamer.raw.betterDecision","dreamer.raw.rationale","dreamer.raw.riskLevel"],budgetTokens:2e3,priority:["scribe.summary.principleText","dreamer.raw.betterDecision","scribe.summary.scope","dreamer.raw.rationale","dreamer.raw.riskLevel","scribe.summary.exceptions","scribe.summary.headline","scribe.predecessorSummary.headline"]},j1={manifestId:"evaluator.stage1.v1",schemaVersion:fv,runnerKind:"evaluator",tier0:["artificer.summary.headline","artificer.predecessorSummary.headline"],tier1:["scribe.summary.principleText","scribe.summary.scope","artificer.summary.changedFiles","artificer.summary.apiSurface","artificer.summary.risks","dreamer.summary.badDecision","dreamer.summary.betterDecision","dreamer.summary.rationale","dreamer.summary.riskLevel","pain.summary.rootSymptom","pain.summary.category"],tier2:[],budgetTokens:3e3,priority:["scribe.summary.principleText","dreamer.summary.betterDecision","pain.summary.rootSymptom","artificer.summary.apiSurface","dreamer.summary.riskLevel","dreamer.summary.rationale","scribe.summary.scope","artificer.summary.risks","pain.summary.category","artificer.summary.changedFiles","dreamer.summary.badDecision","artificer.summary.headline","artificer.predecessorSummary.headline"]},Pke={...j1,manifestId:"evaluator.stage2.v1",tier2:["pain.raw.evidence","dreamer.raw.candidates"],budgetTokens:4500,priority:[...j1.priority,"pain.raw.evidence","dreamer.raw.candidates"]},v0t=[Rke,Cke,Oke,j1,Pke],Pxr=Array.from(new Set(v0t.map(e=>e.runnerKind)));lo();_i();lo();_i();lo();_i();lo();_i();lo();_i();lo();lo();_i();lo();_i();_i();import Uwr from"better-sqlite3";import Hwr from"better-sqlite3";import Zwr from"better-sqlite3";var bs;(function(e){e[e.Seed=1]="Seed",e[e.Sprout=2]="Sprout",e[e.Sapling=3]="Sapling",e[e.Tree=4]="Tree",e[e.Forest=5]="Forest"})(bs||(bs={}));var kxt=[{tier:bs.Seed,name:"Seed",requiredPoints:0,permissions:{maxLinesPerWrite:150,maxFilesPerTask:3,allowRiskPath:!1,allowSubagentSpawn:!0}},{tier:bs.Sprout,name:"Sprout",requiredPoints:50,permissions:{maxLinesPerWrite:300,maxFilesPerTask:5,allowRiskPath:!1,allowSubagentSpawn:!0}},{tier:bs.Sapling,name:"Sapling",requiredPoints:200,permissions:{maxLinesPerWrite:500,maxFilesPerTask:10,allowRiskPath:!0,allowSubagentSpawn:!0}},{tier:bs.Tree,name:"Tree",requiredPoints:500,permissions:{maxLinesPerWrite:1e3,maxFilesPerTask:20,allowRiskPath:!0,allowSubagentSpawn:!0}},{tier:bs.Forest,name:"Forest",requiredPoints:1e3,permissions:{maxLinesPerWrite:Number.MAX_SAFE_INTEGER,maxFilesPerTask:Number.MAX_SAFE_INTEGER,allowRiskPath:!0,allowSubagentSpawn:!0}}];var Ext={doubleRewardCooldownMs:3600*1e3,maxRecentEvents:50,difficultyPenalty:{tier4Trivial:.1,tier4Normal:.5,tier5Trivial:.1,tier5Normal:.5}};var Gh=s.Union([s.Literal(bs.Seed),s.Literal(bs.Sprout),s.Literal(bs.Sapling),s.Literal(bs.Tree),s.Literal(bs.Forest)]),gj=s.Object({maxLinesPerWrite:s.Number(),maxFilesPerTask:s.Number(),allowRiskPath:s.Boolean(),allowSubagentSpawn:s.Boolean()}),Sxt=s.Object({tier:Gh,name:s.String(),requiredPoints:s.Number(),permissions:gj}),$ke=s.Union([s.Literal("trivial"),s.Literal("normal"),s.Literal("hard")]),Axt=s.Object({basePoints:s.Number(),description:s.String()}),Fke=s.Union([s.Literal("success"),s.Literal("failure")]),Uke=s.Object({id:s.String(),timestamp:s.String(),type:Fke,taskHash:s.String(),taskDifficulty:$ke,toolName:s.Optional(s.String()),filePath:s.Optional(s.String()),reason:s.Optional(s.String()),pointsAwarded:s.Number(),isDoubleReward:s.Boolean(),sessionId:s.Optional(s.String())}),Wke=s.Object({totalSuccesses:s.Number(),totalFailures:s.Number(),consecutiveSuccesses:s.Number(),consecutiveFailures:s.Number(),doubleRewardsEarned:s.Number(),tierPromotions:s.Number(),pointsByDifficulty:s.Object({trivial:s.Number(),normal:s.Number(),hard:s.Number()})}),qke=s.Tuple([s.String(),s.String()]),Gke=s.Object({version:s.Literal("2.0"),agentId:s.String(),totalPoints:s.Number(),availablePoints:s.Number(),currentTier:Gh,lastDoubleRewardTime:s.Optional(s.String()),recentFailureHashes:s.Array(qke),stats:Wke,recentEvents:s.Array(Uke),lastUpdated:s.String()}),Rxt=s.Object({scorecard:Gke,archivedStats:s.Object({totalEventsProcessed:s.Number(),pointsFromTrivial:s.Number(),pointsFromNormal:s.Number(),pointsFromHard:s.Number()})}),Cxt=s.Object({doubleRewardCooldownMs:s.Number(),maxRecentEvents:s.Number(),difficultyPenalty:s.Object({tier4Trivial:s.Number(),tier4Normal:s.Number(),tier5Trivial:s.Number(),tier5Normal:s.Number()})}),Oxt=s.Object({totalEventsProcessed:s.Number(),pointsFromTrivial:s.Number(),pointsFromNormal:s.Number(),pointsFromHard:s.Number()}),Pxt=s.Object({allowed:s.Boolean(),reason:s.Optional(s.String()),currentTier:s.Optional(Gh),requiredTier:s.Optional(Gh)}),Lxt=s.Object({toolName:s.String(),filePath:s.Optional(s.String()),content:s.Optional(s.String()),lineCount:s.Optional(s.Number()),isRiskPath:s.Optional(s.Boolean())}),Mxt=s.Object({previousTier:Gh,newTier:Gh,totalPoints:s.Number(),timestamp:s.String(),newPermissions:gj}),V1=s.Union([s.Literal("candidate"),s.Literal("probation"),s.Literal("active"),s.Literal("deprecated"),s.Literal("archived")]),yj=s.Union([s.Literal("deterministic"),s.Literal("weak_heuristic"),s.Literal("manual_only")]);var _j=s.Object({applicabilityTags:s.Array(s.String()),positiveSignals:s.Array(s.String()),negativeSignals:s.Array(s.String()),toolSequenceHints:s.Array(s.Array(s.String())),confidence:s.Union([s.Literal("high"),s.Literal("medium"),s.Literal("low")])}),Bke=s.Object({name:s.String(),type:s.Union([s.Literal("hook"),s.Literal("gate"),s.Literal("skill"),s.Literal("test"),s.Literal("prompt")]),triggerCondition:s.String(),enforcement:s.Union([s.Literal("block"),s.Literal("warn"),s.Literal("log")]),action:s.String(),implementationHint:s.Optional(s.String())}),jke=s.Object({painPreventedCount:s.Number(),lastPainPreventedAt:s.Optional(s.String()),calculatedAt:s.String()}),Nxt=s.Object({id:s.String(),version:s.Number(),text:s.String(),source:s.Object({painId:s.String(),painType:s.Union([s.Literal("tool_failure"),s.Literal("dispatch_error"),s.Literal("subagent_error"),s.Literal("user_frustration")]),timestamp:s.String()}),trigger:s.String(),action:s.String(),guardrails:s.Optional(s.Array(s.String())),contextTags:s.Array(s.String()),validation:s.Object({successCount:s.Number(),conflictCount:s.Number()}),status:V1,feedbackScore:s.Number(),usageCount:s.Number(),createdAt:s.String(),activatedAt:s.Optional(s.String()),deprecatedAt:s.Optional(s.String()),evaluability:yj,detectorMetadata:s.Optional(_j),abstractedPrinciple:s.Optional(s.String()),coreAxiomId:s.Optional(s.String()),priority:s.Optional(s.Union([s.Literal("P0"),s.Literal("P1"),s.Literal("P2")])),scope:s.Optional(s.Union([s.Literal("general"),s.Literal("domain")])),domain:s.Optional(s.String()),suggestedRules:s.Optional(s.Array(Bke)),valueMetrics:s.Optional(jke)}),Dxt=s.Union([s.Literal("pain_detected"),s.Literal("candidate_created"),s.Literal("principle_promoted"),s.Literal("principle_deprecated"),s.Literal("principle_rolled_back"),s.Literal("circuit_breaker_opened"),s.Literal("legacy_import")]),hj=s.Object({painId:s.String(),painType:s.Union([s.Literal("tool_failure"),s.Literal("dispatch_error"),s.Literal("subagent_error"),s.Literal("user_frustration")]),source:s.String(),reason:s.String(),score:s.Optional(s.Number()),sessionId:s.Optional(s.String()),agentId:s.Optional(s.String()),taskId:s.Optional(s.String()),traceId:s.Optional(s.String()),provenance:s.Optional(s.Union([s.Literal("host_context_bound"),s.Literal("owner_reported_no_host_trace"),s.Literal("automatic_hook"),s.Literal("openclaw_context_bound")])),hostKind:s.Optional(s.Union([s.Literal("openclaw"),s.Literal("codex")]))}),Kke=s.Object({painId:s.String(),principleId:s.String(),trigger:s.String(),action:s.String(),status:s.Literal("candidate"),painType:s.Optional(s.Union([s.Literal("tool_failure"),s.Literal("dispatch_error"),s.Literal("subagent_error"),s.Literal("user_frustration")])),evaluability:s.Optional(yj),detectorMetadata:s.Optional(_j),abstractedPrinciple:s.Optional(s.String()),coreAxiomId:s.Optional(s.String())}),Hke=s.Object({principleId:s.String(),from:V1,to:V1,reason:s.String(),successCount:s.Optional(s.Number())}),Vke=s.Object({principleId:s.String(),reason:s.String(),triggeredBy:s.Union([s.Literal("auto"),s.Literal("manual")])}),zke=s.Object({principleId:s.String(),reason:s.String(),triggeredBy:s.Union([s.Literal("user_command"),s.Literal("auto_conflict")]),blacklistPattern:s.Optional(s.String()),relatedPainId:s.Optional(s.String())}),Jke=s.Object({taskId:s.String(),painId:s.String(),failCount:s.Number(),reason:s.String(),requireHuman:s.Boolean(),nextRetryAt:s.Optional(s.String())}),Yke=s.Object({sourceFile:s.String(),content:s.String(),contentHash:s.Optional(s.String())}),$xt=s.Union([s.Object({ts:s.String(),type:s.Literal("pain_detected"),data:hj}),s.Object({ts:s.String(),type:s.Literal("pain_recorded"),data:hj}),s.Object({ts:s.String(),type:s.Literal("candidate_created"),data:Kke}),s.Object({ts:s.String(),type:s.Literal("principle_promoted"),data:Hke}),s.Object({ts:s.String(),type:s.Literal("principle_deprecated"),data:Vke}),s.Object({ts:s.String(),type:s.Literal("principle_rolled_back"),data:zke}),s.Object({ts:s.String(),type:s.Literal("circuit_breaker_opened"),data:Jke}),s.Object({ts:s.String(),type:s.Literal("legacy_import"),data:Yke})]);var Xke=s.Object({term:s.String(),weight:s.Number(),source:s.Union([s.Literal("seed"),s.Literal("llm"),s.Literal("user")]),addedAt:s.String(),hitCount:s.Optional(s.Number({minimum:0})),truePositiveCount:s.Optional(s.Number({minimum:0})),falsePositiveCount:s.Optional(s.Number({minimum:0})),lastHitAt:s.Optional(s.String())}),Fxt=s.Object({keywords:s.Array(Xke),version:s.Integer({minimum:0}),lastOptimizedAt:s.String()}),Uxt=s.Object({matched:s.Boolean(),matchedTerms:s.Array(s.String()),score:s.Number({minimum:0,maximum:1}),confidence:s.Number({minimum:0,maximum:1})});var dvt={on_change:"smoke",on_risk_change:"unit",commands:{}},dEe={enabled:!0,spiral_boost:20,min_threshold:15,max_threshold:70,backlog_trigger:6,hard_failure_trigger:1,low_recent_success_boost:15,high_recent_pain_boost:10},mvt={soft_capture_threshold:30,adaptive:{...dEe}},fvt={enabled:!0,heartbeat_stale_hours:72},hvt={enabled:!0,max_file_size_bytes:10*1024*1024,fuzzy_match_enabled:!0,fuzzy_match_threshold:.8,skip_large_file_action:"warn"};var gvt={audit_level:"medium",risk_paths:[],evolution_mode:"realtime",tests:{...dvt},pain:{soft_capture_threshold:mvt.soft_capture_threshold,adaptive:{...dEe}},lifecycle:{...fvt},edit_verification:{...hvt},custom_guards:[]};import*as Mx from"fs";var vEe=3,gbt=50;function bEe(e,t){let n=e+".tmp";Mx.writeFileSync(n,t,"utf8");let r;for(let i=0;i<vEe;i++)try{Mx.renameSync(n,e);return}catch(o){r=o;let a=o.code;if(a==="EPERM"||a==="EBUSY"||a==="EACCES"){if(i<vEe-1){let c=gbt*Math.pow(2,i),u=Date.now()+c,l=!1;for(;Date.now()<u;)if(!l&&Date.now()>=u-10){try{$e("fs").accessSync?.(n)}catch{}l=!0}}continue}break}try{Mx.unlinkSync(n)}catch{}throw r}var wEe=7,z1=class{logsDir;statsFile;logger;statsCache=new Map;eventBuffer=[];maxBufferSize=20;flushIntervalMs=3e4;flushTimer;currentEventsFile;currentDate;constructor(t,n){let r=Gk(t);this.logsDir=iT.join(r,"logs"),ko.existsSync(this.logsDir)||ko.mkdirSync(this.logsDir,{recursive:!0}),this.statsFile=iT.join(this.logsDir,"daily-stats.json"),this.logger=n,this.loadStats(),this.startFlushTimer()}getEventsFile(t){return iT.join(this.logsDir,`events_${t}.jsonl`)}getTodayStr(){return new Date().toISOString().split("T")[0]??""}ensureEventsFile(){let t=this.getTodayStr();return(this.currentDate!==t||!this.currentEventsFile)&&(this.currentDate=t,this.currentEventsFile=this.getEventsFile(t),this.cleanupOldEventFiles(t)),this.currentEventsFile}cleanupOldEventFiles(t){if(!(wEe<=0))try{let n=Date.now()-wEe*24*60*60*1e3,r=ko.readdirSync(this.logsDir);for(let i of r){if(!i.startsWith("events_")||!i.endsWith(".jsonl"))continue;let o=iT.join(this.logsDir,i);ko.statSync(o).mtimeMs<n&&ko.unlinkSync(o)}}catch(n){this.logger?.debug?.(`[PD] Event file cleanup failed (non-blocking): ${String(n)}`)}}recordToolCall(t,n){let r=n.error||n.exitCode!==void 0&&n.exitCode!==0?"failure":"success";this.record("tool_call",r,t,n)}recordPainSignal(t,n){this.record("pain_signal","detected",t,n)}recordRulePromotion(t){this.record("rule_promotion","promoted",void 0,t)}recordGovernanceAction(t,n){this.record("governance_action","approved",void 0,t),n?.flushImmediately&&this.flushEvents()}recordHookExecution(t,n){let r=t.error?"failure":"success";this.record("hook_execution",r,void 0,t),n?.flushImmediately&&this.flushEvents()}recordGateBlock(t,n){this.record("gate_block","blocked",t,n)}recordGateBypass(t,n){this.record("gate_bypass","bypassed",t,n)}recordEvolutionTask(t){this.record("evolution_task","enqueued",void 0,t)}recordEvolutionTaskCompleted(t){this.record("evolution_task","completed",void 0,t)}recordEmpathyRollback(t,n){this.record("empathy_rollback","rolled_back",t,n)}recordError(t,n,r){this.record("error","failure",t,{message:n,...r})}recordWarn(t,n,r){this.record("warn","failure",t,{message:n,...r})}recordDiagnosisTask(t){this.record("diagnosis_task","written",void 0,t)}recordHeartbeatDiagnosis(t){this.record("heartbeat_diagnosis","injected",void 0,t)}recordDiagnosticianReport(t){let n={success:"completed",missing_json:"failure",incomplete_fields:"failure"};this.record("diagnostician_report",n[t.category],void 0,t)}recordPrincipleCandidate(t){this.record("principle_candidate","created",void 0,t)}recordRuleEnforced(t){this.record("rule_enforced","matched",void 0,t)}recordRuleHostEvaluated(t){this.record("rulehost_evaluated","evaluated",void 0,t)}recordRuleHostBlocked(t){this.record("rulehost_blocked","blocked",void 0,t)}recordRuleHostRequireApproval(t){this.record("rulehost_requireApproval","requireApproval",void 0,t)}recordRuleHostAutoCorrectProposed(t){this.record("rulehost_auto_correct_proposed","auto_correct",void 0,t)}recordRuleHostAutoCorrectApplied(t){this.record("rulehost_auto_correct_applied","auto_correct",void 0,t)}recordRuntimeV2ActivationsInjected(t){this.record("runtime_v2_prompt_activations_injected","injected",t.sessionId,t)}recordRuleHostUnhealthy(t){this.record("rulehost_unhealthy","failure",void 0,t)}recordRuleHostSkipped(t){this.record("rulehost_skipped","failure",void 0,t)}redactEventData(t,n){try{if(!new Set(["tool_call","rulehost_evaluated","rulehost_blocked","rulehost_requireApproval","rulehost_auto_correct_proposed","rulehost_auto_correct_applied","rulehost_skipped","rule_enforced","hook_execution","gate_block","gate_bypass"]).has(t))return n;let i={};for(let[o,a]of Object.entries(n))if(typeof a=="string")i[o]=Jp(a);else if(Array.isArray(a))i[o]=a.map(c=>{if(typeof c=="string")return Jp(c);if(typeof c=="object"&&c!==null){let u={};for(let[l,d]of Object.entries(c))u[l]=typeof d=="string"?Jp(d):d;return u}return c});else if(typeof a=="object"&&a!==null){let c={};for(let[u,l]of Object.entries(a))typeof l=="string"?c[u]=Jp(l):c[u]=l;i[o]=c}else i[o]=a;return i}catch(r){return{redactionFailure:!0,redactionStatus:"failed","redaction.status":"failed",redactionReason:(r instanceof Error?r.message.slice(0,200):String(r).slice(0,200))||"unknown error",redactionDataDropped:!0,originalType:t,originalSessionId:n.sessionId??null}}}record(t,n,r,i){let o=new Date,a=this.formatDate(o),c=this.redactEventData(t,i),u={ts:o.toISOString(),date:a,type:t,category:n,sessionId:r,data:c};this.eventBuffer.push(u),this.updateStats(u),this.eventBuffer.length>=this.maxBufferSize&&this.flushEvents()}formatDate(t){return t.toISOString().split("T")[0]??""}loadStats(){if(ko.existsSync(this.statsFile))try{let t=JSON.parse(ko.readFileSync(this.statsFile,"utf-8"));for(let n in t)this.statsCache.set(n,t[n])}catch(t){this.logger&&this.logger.error(`[PD] Failed to load daily-stats.json: ${String(t)}`)}}updateStats(t){let n=this.statsCache.get(t.date);if(n||(n=Rg(t.date),this.statsCache.set(t.date,n)),t.type==="tool_call"){n.tools.total++,t.category==="success"?n.tools.success++:n.tools.failure++;let r=t.data,i=r.gfiAfter??r.gfi;i!==void 0&&(n.gfi.samples++,n.gfi.total+=i,n.gfi.peak=Math.max(n.gfi.peak,i))}else if(t.type==="pain_signal"){let r=t.data;if(r.source==="user_empathy"){if(r.deduped)n.empathy.dedupedCount++;else{n.empathy.totalEvents++,n.empathy.totalPenaltyScore+=r.score||0,r.severity&&(n.empathy.bySeverity[r.severity]++,n.empathy.scoreBySeverity[r.severity]+=r.score||0),r.detection_mode&&n.empathy.byDetectionMode[r.detection_mode]++,r.origin&&n.empathy.byOrigin[r.origin]++;let o=r.confidence??1;o>=.8?n.empathy.confidenceDistribution.high++:o>=.5?n.empathy.confidenceDistribution.medium++:n.empathy.confidenceDistribution.low++}let i=n.empathy.totalEvents+n.empathy.dedupedCount;n.empathy.dedupeHitRate=i>0?n.empathy.dedupedCount/i:0}}else if(t.type==="hook_execution"){let r=t.data;if(n.hooks.total++,t.category==="success"?n.hooks.success++:n.hooks.failure++,r.hook){n.hooks.byType[r.hook]||(n.hooks.byType[r.hook]={total:0,success:0,failure:0});let i=n.hooks.byType[r.hook];i&&(i.total++,t.category==="success"?i.success++:i.failure++)}}else if(t.type==="empathy_rollback"){let r=t.data;n.empathy.rollbackCount++,n.empathy.rolledBackScore+=r.originalScore||0}else if(t.type==="rule_promotion")n.evolution.rulesPromoted++;else if(t.type==="evolution_task")t.category==="completed"?n.evolution.tasksCompleted++:t.category==="enqueued"&&n.evolution.tasksEnqueued++;else if(t.type==="diagnosis_task")n.evolution.diagnosisTasksWritten++;else if(t.type==="heartbeat_diagnosis")n.evolution.heartbeatsInjected++;else if(t.type==="diagnostician_report"){let r=t.data;if(Object.prototype.hasOwnProperty.call(r,"category")){let i=r.category;typeof i=="string"&&(i==="success"||i==="missing_json"||i==="incomplete_fields")&&n.evolution.diagnosticianReportsWritten++,typeof i=="string"&&i==="missing_json"&&n.evolution.reportsMissingJson++,typeof i=="string"&&i==="incomplete_fields"&&n.evolution.reportsIncompleteFields++}else Object.prototype.hasOwnProperty.call(r,"success")&&n.evolution.diagnosticianReportsWritten++}else t.type==="principle_candidate"?n.evolution.principleCandidatesCreated++:t.type==="rule_enforced"?n.evolution.rulesEnforced++:t.type==="rulehost_evaluated"?n.evolution.rulehostEvaluated++:t.type==="rulehost_blocked"?n.evolution.rulehostBlocked++:t.type==="rulehost_requireApproval"?n.evolution.rulehostRequireApproval++:t.type==="rulehost_auto_correct_proposed"?n.evolution.rulehostAutoCorrectProposed++:t.type==="rulehost_auto_correct_applied"&&n.evolution.rulehostAutoCorrectApplied++}startFlushTimer(){this.flushTimer=setInterval(()=>this.flush(),this.flushIntervalMs),this.flushTimer.unref()}flush(){this.flushEvents(),this.flushStats()}getBufferedEvents(){return this.eventBuffer.map(t=>({...t,data:{...t.data}}))}getEventDedupKey(t){let n=typeof t.data?.eventId=="string"?String(t.data.eventId):null;if(n)return`${t.type}:${t.sessionId??"none"}:${n}`;let r=t.data??{};return[t.ts??"no-ts",t.type??"no-type",t.category??"no-category",t.sessionId??"no-session",typeof r.source=="string"?r.source:"no-source",typeof r.toolName=="string"?r.toolName:"no-tool",typeof r.reason=="string"?r.reason:"no-reason"].join("::")}readPersistedEvents(){let t=this.ensureEventsFile();if(!ko.existsSync(t))return[];try{return ko.readFileSync(t,"utf-8").trim().split(`
354
354
  `).filter(r=>r.trim().length>0).map(r=>{try{return JSON.parse(r)}catch(i){return this.logger?.warn?.(`[PD] Corrupted event line skipped: ${String(i).slice(0,100)}`),null}}).filter(r=>r!==null)}catch(n){return this.logger&&this.logger.error(`[PD] Failed to read events file: ${String(n)}`),[]}}getMergedEvents(){let t=new Map;for(let n of[...this.readPersistedEvents(),...this.getBufferedEvents()])t.set(this.getEventDedupKey(n),n);return[...t.values()].sort((n,r)=>n.ts.localeCompare(r.ts))}flushEvents(){if(this.eventBuffer.length===0)return;let t=this.ensureEventsFile(),n=this.eventBuffer.map(r=>JSON.stringify(r)).join(`
355
355
  `)+`
356
- `;try{ko.appendFileSync(t,n,"utf-8"),this.eventBuffer=[]}catch(r){this.logger&&this.logger.error(`[PD] Failed to flush events: ${String(r)}`)}}flushStats(){if(this.statsCache.size===0)return;let t={};this.statsCache.forEach((n,r)=>{t[r]=n});try{bEe(this.statsFile,JSON.stringify(t,null,2))}catch(n){this.logger&&this.logger.error(`[PD] Failed to flush daily-stats.json: ${String(n)}`)}}getDailyStats(t){let n=this.statsCache.get(t);return n||(n=Rg(t),this.statsCache.set(t,n)),n}getEmpathyStats(t,n){let r=new Date,i=this.formatDate(r),o={totalEvents:0,dedupedCount:0,dedupeHitRate:0,totalPenaltyScore:0,rolledBackScore:0,rollbackCount:0,bySeverity:{mild:0,moderate:0,severe:0},scoreBySeverity:{mild:0,moderate:0,severe:0},byDetectionMode:{structured:0,legacy_tag:0},byOrigin:{assistant_self_report:0,user_manual:0,system_infer:0},confidenceDistribution:{high:0,medium:0,low:0},dailyTrend:[]};if(t==="session"&&n)this.aggregateSessionEmpathy(n,o);else if(t==="week")for(let c=0;c<7;c++){let u=new Date(r);u.setDate(u.getDate()-c);let l=this.formatDate(u),d=this.getDailyStats(l);o.totalEvents+=d.empathy.totalEvents,o.dedupedCount+=d.empathy.dedupedCount,o.totalPenaltyScore+=d.empathy.totalPenaltyScore,o.rolledBackScore+=d.empathy.rolledBackScore,o.rollbackCount+=d.empathy.rollbackCount;for(let m of["mild","moderate","severe"])o.bySeverity[m]+=d.empathy.bySeverity[m],o.scoreBySeverity[m]+=d.empathy.scoreBySeverity[m];o.byDetectionMode.structured+=d.empathy.byDetectionMode.structured,o.byDetectionMode.legacy_tag+=d.empathy.byDetectionMode.legacy_tag;for(let m of["assistant_self_report","user_manual","system_infer"])o.byOrigin[m]+=d.empathy.byOrigin[m];o.confidenceDistribution.high+=d.empathy.confidenceDistribution.high,o.confidenceDistribution.medium+=d.empathy.confidenceDistribution.medium,o.confidenceDistribution.low+=d.empathy.confidenceDistribution.low,(d.empathy.totalEvents>0||d.empathy.dedupedCount>0)&&o.dailyTrend.push({date:l,count:d.empathy.totalEvents,score:d.empathy.totalPenaltyScore})}else{let c=this.getDailyStats(i);Object.assign(o,c.empathy),(c.empathy.totalEvents>0||c.empathy.dedupedCount>0)&&(o.dailyTrend=[{date:i,count:c.empathy.totalEvents,score:c.empathy.totalPenaltyScore}])}let a=o.totalEvents+o.dedupedCount;return o.dedupeHitRate=a>0?o.dedupedCount/a:0,o}aggregateSessionEmpathy(t,n){for(let r of this.getMergedEvents())if(r.sessionId===t&&r.type==="pain_signal"){let i=r.data;if(i.source==="user_empathy")if(i.deduped)n.dedupedCount++;else{n.totalEvents++,n.totalPenaltyScore+=i.score||0,i.severity&&(n.bySeverity[i.severity]++,n.scoreBySeverity[i.severity]+=i.score||0),i.detection_mode&&n.byDetectionMode[i.detection_mode]++,i.origin&&n.byOrigin[i.origin]++;let o=i.confidence??1;o>=.8?n.confidenceDistribution.high++:o>=.5?n.confidenceDistribution.medium++:n.confidenceDistribution.low++}}else if(r.sessionId===t&&r.type==="empathy_rollback"){let i=r.data;n.rollbackCount++,n.rolledBackScore+=i.originalScore||0}}rollbackEmpathyEvent(t,n,r,i){let o=this.getMergedEvents(),a=null;for(let u of o)if(u.type==="pain_signal"){let l=u.data;if(l.eventId===t&&l.source==="user_empathy"){a={entry:u,data:l};break}}if(!a||a.data.deduped)return 0;let c=a.data.score||0;return this.recordEmpathyRollback(n,{eventId:t,originalScore:c,originalSessionId:a.entry.sessionId,reason:r,triggeredBy:i}),c}getLastEmpathyEventId(t){let n=this.getMergedEvents();for(let r=n.length-1;r>=0;r--){let i=n[r];if(i&&i.sessionId===t&&i.type==="pain_signal"){let o=i.data;if(o.source==="user_empathy"&&!o.deduped)return o.eventId||null}}return null}findLatestPainSignal(t){let n=this.getMergedEvents();for(let r=n.length-1;r>=0;r--){let i=n[r];if(i&&i.sessionId===t&&i.type==="pain_signal")return i.data}return null}dispose(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),this.flush()}};var ybt=(e,t)=>{let n=new z1(e);try{n.recordGovernanceAction(t,{flushImmediately:!0})}finally{n.dispose()}};async function Q1r(e,t,n,r=ybt){return r(e,t),n()}export{Q1r as authorizeGovernanceAction,ybt as writeGovernanceAction};
356
+ `;try{ko.appendFileSync(t,n,"utf-8"),this.eventBuffer=[]}catch(r){this.logger&&this.logger.error(`[PD] Failed to flush events: ${String(r)}`)}}flushStats(){if(this.statsCache.size===0)return;let t={};this.statsCache.forEach((n,r)=>{t[r]=n});try{bEe(this.statsFile,JSON.stringify(t,null,2))}catch(n){this.logger&&this.logger.error(`[PD] Failed to flush daily-stats.json: ${String(n)}`)}}getDailyStats(t){let n=this.statsCache.get(t);return n||(n=Rg(t),this.statsCache.set(t,n)),n}getEmpathyStats(t,n){let r=new Date,i=this.formatDate(r),o={totalEvents:0,dedupedCount:0,dedupeHitRate:0,totalPenaltyScore:0,rolledBackScore:0,rollbackCount:0,bySeverity:{mild:0,moderate:0,severe:0},scoreBySeverity:{mild:0,moderate:0,severe:0},byDetectionMode:{structured:0,legacy_tag:0},byOrigin:{assistant_self_report:0,user_manual:0,system_infer:0},confidenceDistribution:{high:0,medium:0,low:0},dailyTrend:[]};if(t==="session"&&n)this.aggregateSessionEmpathy(n,o);else if(t==="week")for(let c=0;c<7;c++){let u=new Date(r);u.setDate(u.getDate()-c);let l=this.formatDate(u),d=this.getDailyStats(l);o.totalEvents+=d.empathy.totalEvents,o.dedupedCount+=d.empathy.dedupedCount,o.totalPenaltyScore+=d.empathy.totalPenaltyScore,o.rolledBackScore+=d.empathy.rolledBackScore,o.rollbackCount+=d.empathy.rollbackCount;for(let m of["mild","moderate","severe"])o.bySeverity[m]+=d.empathy.bySeverity[m],o.scoreBySeverity[m]+=d.empathy.scoreBySeverity[m];o.byDetectionMode.structured+=d.empathy.byDetectionMode.structured,o.byDetectionMode.legacy_tag+=d.empathy.byDetectionMode.legacy_tag;for(let m of["assistant_self_report","user_manual","system_infer"])o.byOrigin[m]+=d.empathy.byOrigin[m];o.confidenceDistribution.high+=d.empathy.confidenceDistribution.high,o.confidenceDistribution.medium+=d.empathy.confidenceDistribution.medium,o.confidenceDistribution.low+=d.empathy.confidenceDistribution.low,(d.empathy.totalEvents>0||d.empathy.dedupedCount>0)&&o.dailyTrend.push({date:l,count:d.empathy.totalEvents,score:d.empathy.totalPenaltyScore})}else{let c=this.getDailyStats(i);Object.assign(o,c.empathy),(c.empathy.totalEvents>0||c.empathy.dedupedCount>0)&&(o.dailyTrend=[{date:i,count:c.empathy.totalEvents,score:c.empathy.totalPenaltyScore}])}let a=o.totalEvents+o.dedupedCount;return o.dedupeHitRate=a>0?o.dedupedCount/a:0,o}aggregateSessionEmpathy(t,n){for(let r of this.getMergedEvents())if(r.sessionId===t&&r.type==="pain_signal"){let i=r.data;if(i.source==="user_empathy")if(i.deduped)n.dedupedCount++;else{n.totalEvents++,n.totalPenaltyScore+=i.score||0,i.severity&&(n.bySeverity[i.severity]++,n.scoreBySeverity[i.severity]+=i.score||0),i.detection_mode&&n.byDetectionMode[i.detection_mode]++,i.origin&&n.byOrigin[i.origin]++;let o=i.confidence??1;o>=.8?n.confidenceDistribution.high++:o>=.5?n.confidenceDistribution.medium++:n.confidenceDistribution.low++}}else if(r.sessionId===t&&r.type==="empathy_rollback"){let i=r.data;n.rollbackCount++,n.rolledBackScore+=i.originalScore||0}}rollbackEmpathyEvent(t,n,r,i){let o=this.getMergedEvents(),a=null;for(let u of o)if(u.type==="pain_signal"){let l=u.data;if(l.eventId===t&&l.source==="user_empathy"){a={entry:u,data:l};break}}if(!a||a.data.deduped)return 0;let c=a.data.score||0;return this.recordEmpathyRollback(n,{eventId:t,originalScore:c,originalSessionId:a.entry.sessionId,reason:r,triggeredBy:i}),c}getLastEmpathyEventId(t){let n=this.getMergedEvents();for(let r=n.length-1;r>=0;r--){let i=n[r];if(i&&i.sessionId===t&&i.type==="pain_signal"){let o=i.data;if(o.source==="user_empathy"&&!o.deduped)return o.eventId||null}}return null}findLatestPainSignal(t){let n=this.getMergedEvents();for(let r=n.length-1;r>=0;r--){let i=n[r];if(i&&i.sessionId===t&&i.type==="pain_signal")return i.data}return null}dispose(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),this.flush()}};var ybt=(e,t)=>{let n=new z1(e);try{n.recordGovernanceAction(t,{flushImmediately:!0})}finally{n.dispose()}};async function Z1r(e,t,n,r=ybt){return r(e,t),n()}export{Z1r as authorizeGovernanceAction,ybt as writeGovernanceAction};
357
357
  /*! Bundled license information:
358
358
 
359
359
  web-streams-polyfill/dist/ponyfill.es2018.js:
@@ -416,6 +416,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
416
416
  text TEXT,
417
417
  canonical_pain_id TEXT,
418
418
  runtime_task_id TEXT,
419
+ host_kind TEXT,
419
420
  created_at TEXT NOT NULL
420
421
  );
421
422
  CREATE TABLE IF NOT EXISTS gate_blocks (
@@ -513,7 +514,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
513
514
  metadata_json TEXT,
514
515
  created_at TEXT NOT NULL
515
516
  );
516
- `);try{e.exec("ALTER TABLE pain_events ADD COLUMN text TEXT")}catch(o){let a=o instanceof Error?o.message:String(o);if(!a.includes("duplicate column name")&&!a.includes("no column named"))throw o}for(let o of[{name:"canonical_pain_id",type:"TEXT"},{name:"runtime_task_id",type:"TEXT"}])try{e.exec(`ALTER TABLE pain_events ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}let r=[{table:"assistant_turns",name:"stop_reason",type:"TEXT"},{table:"assistant_turns",name:"thinking_blocks_count",type:"INTEGER"},{table:"tool_calls",name:"result_preview",type:"TEXT"}];for(let o of r)try{e.exec(`ALTER TABLE ${o.table} ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}e.exec(`
517
+ `);try{e.exec("ALTER TABLE pain_events ADD COLUMN text TEXT")}catch(o){let a=o instanceof Error?o.message:String(o);if(!a.includes("duplicate column name")&&!a.includes("no column named"))throw o}for(let o of[{name:"canonical_pain_id",type:"TEXT"},{name:"runtime_task_id",type:"TEXT"},{name:"host_kind",type:"TEXT"}])try{e.exec(`ALTER TABLE pain_events ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}let r=[{table:"assistant_turns",name:"stop_reason",type:"TEXT"},{table:"assistant_turns",name:"thinking_blocks_count",type:"INTEGER"},{table:"tool_calls",name:"result_preview",type:"TEXT"}];for(let o of r)try{e.exec(`ALTER TABLE ${o.table} ADD COLUMN ${o.name} ${o.type}`)}catch(a){let c=a instanceof Error?a.message:String(a);if(!c.includes("duplicate column name")&&!c.includes("no column named"))throw a}e.exec(`
517
518
  CREATE UNIQUE INDEX IF NOT EXISTS idx_pain_events_canonical_pain_id
518
519
  ON pain_events(canonical_pain_id)
519
520
  WHERE canonical_pain_id IS NOT NULL
@@ -568,13 +569,14 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
568
569
  `).run(t.sessionId,t.toolName,t.outcome,t.durationMs??null,t.exitCode??null,t.errorType??null,t.errorMessage??null,t.gfiBefore??null,t.gfiAfter??null,Kh(t.paramsJson),t.resultPreview??null,n);return Number(i.lastInsertRowid)});return t.outcome==="success"&&this.maybeCreateCorrectionSample(t.sessionId),r}recordPainEvent(t){this.recordSession({sessionId:t.sessionId,startedAt:t.createdAt});let n=-1;return this.withWrite(()=>{try{let r=this.db.prepare(`
569
570
  INSERT INTO pain_events (
570
571
  session_id, source, score, reason, severity, origin, confidence, text, created_at,
571
- canonical_pain_id, runtime_task_id
572
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
573
- `).run(t.sessionId,t.source,t.score,t.reason??null,t.severity??null,t.origin??null,t.confidence??null,t.text??null,t.createdAt??Di(),t.canonicalPainId??null,t.runtimeTaskId??null);n=Number(r.lastInsertRowid)}catch(r){if(t.canonicalPainId&&r instanceof Error&&r.message.includes("UNIQUE constraint failed")&&r.message.includes("canonical_pain_id")){this.db.prepare(`
572
+ canonical_pain_id, runtime_task_id, host_kind
573
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
574
+ `).run(t.sessionId,t.source,t.score,t.reason??null,t.severity??null,t.origin??null,t.confidence??null,t.text??null,t.createdAt??Di(),t.canonicalPainId??null,t.runtimeTaskId??null,t.hostKind??null);n=Number(r.lastInsertRowid)}catch(r){if(t.canonicalPainId&&r instanceof Error&&r.message.includes("UNIQUE constraint failed")&&r.message.includes("canonical_pain_id")){this.db.prepare(`
574
575
  UPDATE pain_events
575
- SET runtime_task_id = COALESCE(?, runtime_task_id)
576
+ SET runtime_task_id = COALESCE(?, runtime_task_id),
577
+ host_kind = COALESCE(host_kind, ?)
576
578
  WHERE canonical_pain_id = ?
577
- `).run(t.runtimeTaskId??null,t.canonicalPainId);let i=this.db.prepare("SELECT id FROM pain_events WHERE canonical_pain_id = ?").get(t.canonicalPainId);i&&typeof i=="object"&&Object.hasOwn(i,"id")&&typeof i.id=="number"?n=i.id:n=-1}else throw r}}),n}recordGateBlock(t){this.withWrite(()=>{this.db.prepare(`
579
+ `).run(t.runtimeTaskId??null,t.hostKind??null,t.canonicalPainId);let i=this.db.prepare("SELECT id FROM pain_events WHERE canonical_pain_id = ?").get(t.canonicalPainId);i&&typeof i=="object"&&Object.hasOwn(i,"id")&&typeof i.id=="number"?n=i.id:n=-1}else throw r}}),n}recordGateBlock(t){this.withWrite(()=>{this.db.prepare(`
578
580
  INSERT INTO gate_blocks (session_id, tool_name, file_path, reason, created_at)
579
581
  VALUES (?, ?, ?, ?, ?)
580
582
  `).run(t.sessionId??null,t.toolName,t.filePath??null,t.reason,t.createdAt??Di())})}recordTrustChange(t){this.withWrite(()=>{this.db.prepare(`
@@ -714,7 +716,7 @@ ${n.comment}`:n.comment}this.doc.range[2]=n.offset;break}default:this.errors.pus
714
716
  review_status, export_mode, created_at, updated_at
715
717
  FROM correction_samples
716
718
  WHERE sample_id = ?
717
- `).get(t);if(!a)throw new lI(`${t} (after update)`);return n==="rejected"&&this.recordCorrectionRejectedPain({session_id:a.session_id,quality_score:a.quality_score,diff_excerpt:a.diff_excerpt,principle_ids_json:a.principle_ids_json,created_at:a.created_at}),{sampleId:String(a.sample_id),sessionId:String(a.session_id),badAssistantTurnId:Number(a.bad_assistant_turn_id),userCorrectionTurnId:Number(a.user_correction_turn_id),recoveryToolSpanJson:String(a.recovery_tool_span_json),diffExcerpt:String(a.diff_excerpt??""),principleIdsJson:String(a.principle_ids_json??"[]"),qualityScore:Number(a.quality_score),reviewStatus:a.review_status,exportMode:a.export_mode,createdAt:String(a.created_at),updatedAt:String(a.updated_at)}}recordCorrectionRejectedPain(t){let n=String(t.session_id),r=Number(t.quality_score),i=String(t.diff_excerpt??""),o=String(t.principle_ids_json??"[]"),a=Math.max(0,Math.min(100,Math.round(Number(r)||0))),c=`Correction rejected (quality ${r.toFixed(2)}). Principles: ${o}${i?` \u2014 ${i.slice(0,120)}`:""}`;try{this.recordPainEvent({sessionId:n,source:"correction_rejected",score:a,reason:c,severity:a>=70?"severe":a>=40?"moderate":"mild",origin:"system_infer",text:i||void 0,createdAt:String(t.created_at)})}catch(u){console.warn(`[Trajectory] Failed to record correction_rejected pain event: ${String(u)}`)}}exportCorrections(t){let n=this.db.prepare(`
719
+ `).get(t);if(!a)throw new lI(`${t} (after update)`);return n==="rejected"&&this.recordCorrectionRejectedPain({session_id:a.session_id,quality_score:a.quality_score,diff_excerpt:a.diff_excerpt,principle_ids_json:a.principle_ids_json,created_at:a.created_at}),{sampleId:String(a.sample_id),sessionId:String(a.session_id),badAssistantTurnId:Number(a.bad_assistant_turn_id),userCorrectionTurnId:Number(a.user_correction_turn_id),recoveryToolSpanJson:String(a.recovery_tool_span_json),diffExcerpt:String(a.diff_excerpt??""),principleIdsJson:String(a.principle_ids_json??"[]"),qualityScore:Number(a.quality_score),reviewStatus:a.review_status,exportMode:a.export_mode,createdAt:String(a.created_at),updatedAt:String(a.updated_at)}}recordCorrectionRejectedPain(t){let n=String(t.session_id),r=Number(t.quality_score),i=String(t.diff_excerpt??""),o=String(t.principle_ids_json??"[]"),a=Math.max(0,Math.min(100,Math.round(Number(r)||0))),c=`Correction rejected (quality ${r.toFixed(2)}). Principles: ${o}${i?` \u2014 ${i.slice(0,120)}`:""}`;try{this.recordPainEvent({sessionId:n,source:"correction_rejected",score:a,reason:c,severity:a>=70?"severe":a>=40?"moderate":"mild",origin:"system_infer",text:i||void 0,createdAt:String(t.created_at),hostKind:"openclaw"})}catch(u){console.warn(`[Trajectory] Failed to record correction_rejected pain event: ${String(u)}`)}}exportCorrections(t){let n=this.db.prepare(`
718
720
  SELECT cs.sample_id, cs.session_id, cs.recovery_tool_span_json, cs.diff_excerpt, cs.quality_score,
719
721
  at.raw_text AS assistant_raw_text, at.blob_ref AS assistant_blob_ref, at.sanitized_text,
720
722
  ut.raw_text AS user_raw_text, ut.blob_ref AS user_blob_ref, ut.correction_cue
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=code-review-pain-adapter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-review-pain-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-review-pain-adapter.test.ts"],"names":[],"mappings":""}
@@ -1,346 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { CodeReviewPainAdapter } from '../code-review/code-review-pain-adapter.js';
3
- describe('CodeReviewPainAdapter', () => {
4
- const adapter = new CodeReviewPainAdapter();
5
- const baseFile = {
6
- path: 'src/index.ts',
7
- linesAdded: 10,
8
- linesDeleted: 5,
9
- changeMagnitude: 15,
10
- };
11
- const baseEvent = {
12
- prId: 'pr-1',
13
- repositoryId: 'repo-1',
14
- authorId: 'author-1',
15
- reviewerIds: ['reviewer-1'],
16
- filesChanged: [baseFile],
17
- totalLinesAdded: 10,
18
- totalLinesDeleted: 5,
19
- comments: [],
20
- unresolvedThreadCount: 0,
21
- createdAt: '2026-01-01T00:00:00Z',
22
- reviewAgeDays: 1,
23
- hasTests: true,
24
- hasSecurityReview: true,
25
- isBreakingChange: false,
26
- labels: [],
27
- sessionId: 'sess-123',
28
- };
29
- // ---------------------------------------------------------------------------
30
- // Null-return paths
31
- // ---------------------------------------------------------------------------
32
- it('returns null for missing sessionId', () => {
33
- const event = { ...baseEvent, sessionId: '' };
34
- expect(adapter.capture(event)).toBeNull();
35
- });
36
- it('returns null when sessionId is not a string', () => {
37
- const event = { ...baseEvent, sessionId: 42 };
38
- expect(adapter.capture(event)).toBeNull();
39
- });
40
- it('returns null when no files changed and no comments', () => {
41
- const event = { ...baseEvent, filesChanged: [], comments: [] };
42
- expect(adapter.capture(event)).toBeNull();
43
- });
44
- it('returns null when filesChanged is undefined and no comments', () => {
45
- const { filesChanged: _filesChanged, ...eventWithoutFiles } = baseEvent;
46
- const event = { ...eventWithoutFiles, filesChanged: undefined, comments: [] };
47
- expect(adapter.capture(event)).toBeNull();
48
- });
49
- it('returns null for negative reviewAgeDays', () => {
50
- const event = { ...baseEvent, reviewAgeDays: -1 };
51
- expect(adapter.capture(event)).toBeNull();
52
- });
53
- // ---------------------------------------------------------------------------
54
- // Valid event with process violation
55
- // ---------------------------------------------------------------------------
56
- it('produces high score for process violation (no tests, >2 files, breaking change)', () => {
57
- const event = {
58
- ...baseEvent,
59
- filesChanged: [
60
- { path: 'src/a.ts', linesAdded: 50, linesDeleted: 10, changeMagnitude: 60 },
61
- { path: 'src/b.ts', linesAdded: 30, linesDeleted: 5, changeMagnitude: 35 },
62
- { path: 'src/c.ts', linesAdded: 20, linesDeleted: 5, changeMagnitude: 25 },
63
- ],
64
- totalLinesAdded: 100,
65
- totalLinesDeleted: 20,
66
- hasTests: false,
67
- isBreakingChange: true,
68
- labels: [],
69
- hasSecurityReview: false,
70
- };
71
- const signal = adapter.capture(event);
72
- expect(signal).not.toBeNull();
73
- if (!signal)
74
- throw new Error('Expected non-null signal');
75
- // No tests + >2 files = +35, breaking change without label = +40 → process >= 40
76
- expect(signal.source).toBe('process_violation');
77
- expect(signal.score).toBeGreaterThan(0);
78
- // Severity should be at least medium for process violations
79
- expect(['medium', 'high', 'critical']).toContain(signal.severity);
80
- });
81
- // ---------------------------------------------------------------------------
82
- // Valid event with negative sentiment
83
- // ---------------------------------------------------------------------------
84
- it('produces negative_sentiment trigger when comments are negative', () => {
85
- const negativeComment = {
86
- id: 'c2',
87
- authorId: 'reviewer-1',
88
- body: 'This code is terrible and should be rewritten',
89
- sentimentScore: -80,
90
- createdAt: '2026-01-01T00:00:00Z',
91
- // unresolved: no resolvedAt
92
- };
93
- const event = {
94
- ...baseEvent,
95
- comments: [negativeComment],
96
- unresolvedThreadCount: 1,
97
- hasTests: true,
98
- isBreakingChange: false,
99
- };
100
- const signal = adapter.capture(event);
101
- expect(signal).not.toBeNull();
102
- if (!signal)
103
- throw new Error('Expected non-null signal');
104
- // With negative sentiment comments, source should be negative_sentiment
105
- // provided process violation score < 40
106
- expect(signal.source).toBe('negative_sentiment');
107
- });
108
- // ---------------------------------------------------------------------------
109
- // Valid event with diff complexity
110
- // ---------------------------------------------------------------------------
111
- it('produces diff_complexity trigger for many files with no process violations or negative sentiment', () => {
112
- const manyFiles = Array.from({ length: 10 }, (_, i) => ({
113
- path: `src/file${i}.ts`,
114
- linesAdded: 100,
115
- linesDeleted: 50,
116
- changeMagnitude: 150,
117
- }));
118
- // Use positive-sentiment comments so sentiment score stays below 40 threshold
119
- const positiveComment = {
120
- id: 'c-pos',
121
- authorId: 'reviewer-1',
122
- body: 'Looks great!',
123
- sentimentScore: 80,
124
- createdAt: '2026-01-01T00:00:00Z',
125
- resolvedAt: '2026-01-02T00:00:00Z',
126
- };
127
- const event = {
128
- ...baseEvent,
129
- filesChanged: manyFiles,
130
- totalLinesAdded: 1000,
131
- totalLinesDeleted: 500,
132
- hasTests: true,
133
- isBreakingChange: false,
134
- hasSecurityReview: true,
135
- comments: [positiveComment],
136
- };
137
- const signal = adapter.capture(event);
138
- expect(signal).not.toBeNull();
139
- if (!signal)
140
- throw new Error('Expected non-null signal');
141
- expect(signal.source).toBe('diff_complexity');
142
- });
143
- // ---------------------------------------------------------------------------
144
- // Score clamping
145
- // ---------------------------------------------------------------------------
146
- it('clamps score to 0-100 range', () => {
147
- // Extreme process violations could theoretically push score > 100
148
- const event = {
149
- ...baseEvent,
150
- filesChanged: [
151
- { path: 'security/auth.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
152
- { path: 'security/crypto.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
153
- { path: 'src/main.ts', linesAdded: 300, linesDeleted: 200, changeMagnitude: 500 },
154
- ],
155
- totalLinesAdded: 900,
156
- totalLinesDeleted: 600,
157
- hasTests: false,
158
- isBreakingChange: true,
159
- labels: [],
160
- hasSecurityReview: false,
161
- };
162
- const signal = adapter.capture(event);
163
- expect(signal).not.toBeNull();
164
- if (!signal)
165
- throw new Error('Expected non-null signal');
166
- expect(signal.score).toBeGreaterThanOrEqual(0);
167
- expect(signal.score).toBeLessThanOrEqual(100);
168
- });
169
- // ---------------------------------------------------------------------------
170
- // triggerTextPreview truncation
171
- // ---------------------------------------------------------------------------
172
- it('truncates triggerTextPreview to 200 chars', () => {
173
- const longBody = 'x'.repeat(300);
174
- const negativeComment = {
175
- id: 'c3',
176
- authorId: 'reviewer-1',
177
- body: longBody,
178
- sentimentScore: -90,
179
- createdAt: '2026-01-01T00:00:00Z',
180
- };
181
- const event = {
182
- ...baseEvent,
183
- comments: [negativeComment],
184
- hasTests: true,
185
- isBreakingChange: false,
186
- };
187
- const signal = adapter.capture(event);
188
- expect(signal).not.toBeNull();
189
- if (!signal)
190
- throw new Error('Expected non-null signal');
191
- expect(signal.triggerTextPreview.length).toBeLessThanOrEqual(200);
192
- });
193
- // ---------------------------------------------------------------------------
194
- // PainSignal structure
195
- // ---------------------------------------------------------------------------
196
- it('returns PainSignal with correct structure', () => {
197
- const signal = adapter.capture(baseEvent);
198
- expect(signal).not.toBeNull();
199
- if (!signal)
200
- throw new Error('Expected non-null signal');
201
- expect(typeof signal.source).toBe('string');
202
- expect(typeof signal.score).toBe('number');
203
- expect(signal.timestamp).toBeTruthy();
204
- expect(typeof signal.reason).toBe('string');
205
- expect(signal.sessionId).toBe('sess-123');
206
- expect(signal.agentId).toBe('code-review-evaluator');
207
- expect(signal.domain).toBe('code-review');
208
- expect(typeof signal.severity).toBe('string');
209
- expect(typeof signal.context).toBe('object');
210
- });
211
- // ---------------------------------------------------------------------------
212
- // deriveProcessViolationScore scenarios
213
- // ---------------------------------------------------------------------------
214
- it('adds 35 when no tests and >2 files', () => {
215
- // With no tests + 3 files: +35, no other violations → process = 35 (< 40 threshold)
216
- // So primary trigger should NOT be process_violation
217
- const event = {
218
- ...baseEvent,
219
- filesChanged: [
220
- { path: 'src/a.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
221
- { path: 'src/b.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
222
- { path: 'src/c.ts', linesAdded: 5, linesDeleted: 5, changeMagnitude: 10 },
223
- ],
224
- hasTests: false,
225
- isBreakingChange: false,
226
- hasSecurityReview: true,
227
- totalLinesAdded: 15,
228
- totalLinesDeleted: 15,
229
- labels: [],
230
- };
231
- const signal = adapter.capture(event);
232
- expect(signal).not.toBeNull();
233
- if (!signal)
234
- throw new Error('Expected non-null signal');
235
- // process score is 35, which is < 40, so not process_violation
236
- expect(signal.context.processViolationScore).toBe(35);
237
- expect(signal.source).not.toBe('process_violation');
238
- });
239
- it('adds 40 for breaking change without label', () => {
240
- const event = {
241
- ...baseEvent,
242
- hasTests: true,
243
- isBreakingChange: true,
244
- labels: [],
245
- hasSecurityReview: true,
246
- };
247
- const signal = adapter.capture(event);
248
- expect(signal).not.toBeNull();
249
- if (!signal)
250
- throw new Error('Expected non-null signal');
251
- expect(signal.context.processViolationScore).toBe(40);
252
- expect(signal.source).toBe('process_violation');
253
- });
254
- it('adds 50 for security changes without security review', () => {
255
- const event = {
256
- ...baseEvent,
257
- filesChanged: [{ path: 'security/auth.ts', linesAdded: 10, linesDeleted: 5, changeMagnitude: 15 }],
258
- hasTests: true,
259
- isBreakingChange: false,
260
- hasSecurityReview: false,
261
- labels: [],
262
- };
263
- const signal = adapter.capture(event);
264
- expect(signal).not.toBeNull();
265
- if (!signal)
266
- throw new Error('Expected non-null signal');
267
- expect(signal.context.processViolationScore).toBe(50);
268
- expect(signal.source).toBe('process_violation');
269
- });
270
- it('adds 20 for >500 lines changed without tests', () => {
271
- const event = {
272
- ...baseEvent,
273
- filesChanged: [
274
- { path: 'src/a.ts', linesAdded: 400, linesDeleted: 200, changeMagnitude: 600 },
275
- ],
276
- totalLinesAdded: 400,
277
- totalLinesDeleted: 200,
278
- hasTests: false,
279
- isBreakingChange: false,
280
- hasSecurityReview: true,
281
- labels: [],
282
- };
283
- const signal = adapter.capture(event);
284
- expect(signal).not.toBeNull();
285
- if (!signal)
286
- throw new Error('Expected non-null signal');
287
- // no tests + 1 file (not >2) = 0 for that rule, but >500 lines + no tests = +20
288
- expect(signal.context.processViolationScore).toBe(20);
289
- });
290
- // ---------------------------------------------------------------------------
291
- // deriveSentimentScore recency multiplier
292
- // ---------------------------------------------------------------------------
293
- it('applies recency multiplier when reviewAgeDays > 7', () => {
294
- const negativeComment = {
295
- id: 'c4',
296
- authorId: 'reviewer-1',
297
- body: 'Bad code',
298
- sentimentScore: -50,
299
- createdAt: '2026-01-01T00:00:00Z',
300
- };
301
- const recentEvent = {
302
- ...baseEvent,
303
- comments: [negativeComment],
304
- reviewAgeDays: 3,
305
- hasTests: true,
306
- isBreakingChange: false,
307
- };
308
- const oldEvent = {
309
- ...baseEvent,
310
- comments: [negativeComment],
311
- reviewAgeDays: 10,
312
- hasTests: true,
313
- isBreakingChange: false,
314
- };
315
- const recentSignal = adapter.capture(recentEvent);
316
- const oldSignal = adapter.capture(oldEvent);
317
- expect(recentSignal).not.toBeNull();
318
- if (!recentSignal)
319
- throw new Error('Expected non-null recentSignal');
320
- expect(oldSignal).not.toBeNull();
321
- if (!oldSignal)
322
- throw new Error('Expected non-null oldSignal');
323
- // Older reviews with unresolved negatives should produce higher sentiment pain
324
- expect(oldSignal.context.sentimentScore).toBeGreaterThan(recentSignal.context.sentimentScore);
325
- });
326
- // ---------------------------------------------------------------------------
327
- // traceId fallback
328
- // ---------------------------------------------------------------------------
329
- it('uses "unknown" for traceId when not provided', () => {
330
- const event = { ...baseEvent, traceId: undefined };
331
- const signal = adapter.capture(event);
332
- expect(signal).not.toBeNull();
333
- if (!signal)
334
- throw new Error('Expected non-null signal');
335
- expect(signal.traceId).toBe('unknown');
336
- });
337
- it('uses provided traceId', () => {
338
- const event = { ...baseEvent, traceId: 'trace-abc' };
339
- const signal = adapter.capture(event);
340
- expect(signal).not.toBeNull();
341
- if (!signal)
342
- throw new Error('Expected non-null signal');
343
- expect(signal.traceId).toBe('trace-abc');
344
- });
345
- });
346
- //# sourceMappingURL=code-review-pain-adapter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"code-review-pain-adapter.test.js","sourceRoot":"","sources":["../../../src/adapters/__tests__/code-review-pain-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=openclaw-pain-adapter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openclaw-pain-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/adapters/__tests__/openclaw-pain-adapter.test.ts"],"names":[],"mappings":""}