create-principles-disciple 1.93.0 → 1.94.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.
Files changed (228) hide show
  1. package/console/dist/server/config/pd-config-store.d.ts +7 -1
  2. package/console/dist/server/config/pd-config-store.js +11 -1
  3. package/console/dist/server/index.js +10 -6
  4. package/console/dist/server/models/ApprovalsConsoleModel.js +4 -12
  5. package/console/dist/server/routes/feedback-reports.js +1 -1
  6. package/core/dist/index.d.ts +2 -2
  7. package/core/dist/index.d.ts.map +1 -1
  8. package/core/dist/index.js +1 -1
  9. package/core/dist/index.js.map +1 -1
  10. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts +2 -0
  11. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
  12. package/core/dist/prompt-builder/__tests__/model-config.test.js +158 -0
  13. package/core/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
  14. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts +2 -0
  15. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
  16. package/core/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
  17. package/core/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
  18. package/core/dist/prompt-builder/index.d.ts +3 -0
  19. package/core/dist/prompt-builder/index.d.ts.map +1 -1
  20. package/core/dist/prompt-builder/index.js +2 -0
  21. package/core/dist/prompt-builder/index.js.map +1 -1
  22. package/core/dist/prompt-builder/model-config.d.ts +42 -0
  23. package/core/dist/prompt-builder/model-config.d.ts.map +1 -0
  24. package/core/dist/prompt-builder/model-config.js +84 -0
  25. package/core/dist/prompt-builder/model-config.js.map +1 -0
  26. package/core/dist/prompt-builder/xml-escape.d.ts +12 -0
  27. package/core/dist/prompt-builder/xml-escape.d.ts.map +1 -0
  28. package/core/dist/prompt-builder/xml-escape.js +19 -0
  29. package/core/dist/prompt-builder/xml-escape.js.map +1 -0
  30. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +87 -16
  31. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  32. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts +2 -0
  33. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts.map +1 -0
  34. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +395 -0
  35. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -0
  36. package/core/dist/runtime-v2/bridge-result-shaper.d.ts +53 -0
  37. package/core/dist/runtime-v2/bridge-result-shaper.d.ts.map +1 -0
  38. package/core/dist/runtime-v2/bridge-result-shaper.js +117 -0
  39. package/core/dist/runtime-v2/bridge-result-shaper.js.map +1 -0
  40. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
  41. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
  42. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
  43. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
  44. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
  45. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
  46. package/core/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
  47. package/core/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
  48. package/core/dist/runtime-v2/detection/index.d.ts +10 -0
  49. package/core/dist/runtime-v2/detection/index.d.ts.map +1 -0
  50. package/core/dist/runtime-v2/detection/index.js +9 -0
  51. package/core/dist/runtime-v2/detection/index.js.map +1 -0
  52. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts +12 -0
  53. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
  54. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +181 -0
  55. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
  56. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
  57. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
  58. package/core/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
  59. package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
  60. package/core/dist/runtime-v2/evidence-triage/index.js +3 -0
  61. package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
  62. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +128 -0
  63. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
  64. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +203 -0
  65. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
  66. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts +4 -0
  67. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
  68. package/core/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
  69. package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
  70. package/core/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
  71. package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
  72. package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -1
  73. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +33 -4
  74. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  75. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  76. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +9 -2
  77. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  78. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts +15 -0
  79. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts.map +1 -0
  80. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js +450 -0
  81. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js.map +1 -0
  82. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts +13 -0
  83. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts.map +1 -0
  84. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js +243 -0
  85. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js.map +1 -0
  86. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts +12 -0
  87. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts.map +1 -0
  88. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js +172 -0
  89. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js.map +1 -0
  90. package/core/dist/runtime-v2/index.d.ts +8 -4
  91. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  92. package/core/dist/runtime-v2/index.js +4 -2
  93. package/core/dist/runtime-v2/index.js.map +1 -1
  94. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts +2 -0
  95. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts.map +1 -0
  96. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +306 -0
  97. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -0
  98. package/core/dist/runtime-v2/internalization/index.d.ts +0 -16
  99. package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  100. package/core/dist/runtime-v2/internalization/index.js +0 -8
  101. package/core/dist/runtime-v2/internalization/index.js.map +1 -1
  102. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
  103. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
  104. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
  105. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
  106. package/core/dist/runtime-v2/pain-gate/index.d.ts +10 -0
  107. package/core/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
  108. package/core/dist/runtime-v2/pain-gate/index.js +9 -0
  109. package/core/dist/runtime-v2/pain-gate/index.js.map +1 -0
  110. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +121 -0
  111. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
  112. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +157 -0
  113. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
  114. package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  115. package/core/dist/runtime-v2/pain-signal-bridge.js +14 -88
  116. package/core/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  117. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  118. package/core/dist/runtime-v2/pain-signal-observability.js +15 -5
  119. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  120. package/core/dist/runtime-v2/types/event-types.d.ts +0 -27
  121. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  122. package/core/dist/runtime-v2/types/event-types.js +2 -17
  123. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  124. package/core/dist/runtime-v2/types/index.d.ts +2 -2
  125. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  126. package/core/dist/runtime-v2/types/index.js +3 -1
  127. package/core/dist/runtime-v2/types/index.js.map +1 -1
  128. package/core/dist/runtime-v2/types/pain-signal.d.ts +2 -2
  129. package/core/dist/runtime-v2/types/pain-signal.js +2 -2
  130. package/dist/mvp-config.d.ts +0 -10
  131. package/dist/mvp-config.d.ts.map +1 -1
  132. package/dist/mvp-config.js +0 -65
  133. package/dist/mvp-config.js.map +1 -1
  134. package/package.json +1 -1
  135. package/pd-cli/dist/commands/mvp-smoke.js +1 -1
  136. package/pd-cli/dist/commands/mvp-smoke.js.map +1 -1
  137. package/pd-cli/dist/commands/rulecode.js +1 -1
  138. package/pd-cli/dist/commands/rulecode.js.map +1 -1
  139. package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
  140. package/pd-cli/dist/commands/runtime-canary.js +10 -11
  141. package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
  142. package/pd-cli/dist/commands/runtime-internalization-queue.d.ts.map +1 -1
  143. package/pd-cli/dist/commands/runtime-internalization-queue.js +13 -16
  144. package/pd-cli/dist/commands/runtime-internalization-queue.js.map +1 -1
  145. package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  146. package/pd-cli/dist/commands/runtime-internalization-run-once.js +3 -0
  147. package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
  148. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
  149. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +61 -7
  150. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
  151. package/pd-cli/dist/commands/runtime.js +1 -1
  152. package/pd-cli/dist/commands/runtime.js.map +1 -1
  153. package/pd-cli/dist/index.js +67 -34
  154. package/pd-cli/dist/index.js.map +1 -1
  155. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts +2 -0
  156. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts.map +1 -0
  157. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js +314 -0
  158. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js.map +1 -0
  159. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +20 -12
  160. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  161. package/pd-cli/dist/services/rulehost-readiness.d.ts +62 -0
  162. package/pd-cli/dist/services/rulehost-readiness.d.ts.map +1 -0
  163. package/pd-cli/dist/services/rulehost-readiness.js +214 -0
  164. package/pd-cli/dist/services/rulehost-readiness.js.map +1 -0
  165. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts +1 -1
  166. package/pd-cli/dist/services/runtime-adapter-resolver.js +3 -3
  167. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  168. package/plugin/dist/commands/evolution-status.js +0 -2
  169. package/plugin/dist/core/detection-funnel.d.ts +25 -11
  170. package/plugin/dist/core/detection-funnel.js +32 -80
  171. package/plugin/dist/core/event-log.d.ts +1 -3
  172. package/plugin/dist/core/event-log.js +10 -21
  173. package/plugin/dist/core/evolution-reducer.d.ts +0 -8
  174. package/plugin/dist/core/evolution-reducer.js +9 -19
  175. package/plugin/dist/core/pain-diagnostic-gate.d.ts +37 -28
  176. package/plugin/dist/core/pain-diagnostic-gate.js +53 -89
  177. package/plugin/dist/core/pain.d.ts +0 -63
  178. package/plugin/dist/core/pain.js +0 -167
  179. package/plugin/dist/core/paths.d.ts +0 -1
  180. package/plugin/dist/core/paths.js +2 -1
  181. package/plugin/dist/core/schema/migrations/001-init-trajectory.js +3 -6
  182. package/plugin/dist/core/schema/schema-definitions.js +4 -9
  183. package/plugin/dist/core/trajectory.d.ts +0 -16
  184. package/plugin/dist/core/trajectory.js +9 -60
  185. package/plugin/dist/hooks/after-tool-call-helpers.d.ts +4 -1
  186. package/plugin/dist/hooks/after-tool-call-helpers.js +13 -17
  187. package/plugin/dist/hooks/gate-block-helper.js +57 -17
  188. package/plugin/dist/hooks/lifecycle.js +3 -6
  189. package/plugin/dist/hooks/llm.js +66 -26
  190. package/plugin/dist/hooks/pain.d.ts +3 -1
  191. package/plugin/dist/hooks/pain.js +119 -49
  192. package/plugin/dist/hooks/prompt-helpers.d.ts +87 -0
  193. package/plugin/dist/hooks/prompt-helpers.js +251 -0
  194. package/plugin/dist/hooks/prompt-types.d.ts +66 -0
  195. package/plugin/dist/hooks/prompt-types.js +12 -0
  196. package/plugin/dist/hooks/prompt.d.ts +7 -38
  197. package/plugin/dist/hooks/prompt.js +361 -325
  198. package/plugin/dist/hooks/raw-observation-adapter.d.ts +9 -50
  199. package/plugin/dist/hooks/raw-observation-adapter.js +9 -164
  200. package/plugin/dist/hooks/raw-observation-types.d.ts +6 -57
  201. package/plugin/dist/hooks/raw-observation-types.js +5 -9
  202. package/plugin/dist/hooks/triage-adapter.js +6 -26
  203. package/plugin/dist/hooks/trigger-cooldown-tracker.d.ts +12 -0
  204. package/plugin/dist/hooks/trigger-cooldown-tracker.js +25 -0
  205. package/plugin/dist/service/evolution-worker.js +6 -64
  206. package/plugin/dist/service/runtime-summary-service.d.ts +0 -2
  207. package/plugin/dist/service/runtime-summary-service.js +0 -4
  208. package/plugin/dist/types/event-types.d.ts +1 -1
  209. package/plugin/scripts/sync-plugin.mjs +33 -22
  210. package/plugin/scripts/validate-live-path.ts +0 -18
  211. package/plugin/templates/langs/en/skills/pd-cli-operator/SKILL.md +20 -11
  212. package/plugin/templates/langs/en/skills/pd-runtime-v2/SKILL.md +10 -0
  213. package/plugin/templates/langs/zh/skills/pd-cli-operator/SKILL.md +20 -11
  214. package/plugin/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +10 -0
  215. package/console/dist/server/config/feature-flags.d.ts +0 -25
  216. package/console/dist/server/config/feature-flags.js +0 -101
  217. package/pd-cli/dist/commands/central-sync.d.ts +0 -10
  218. package/pd-cli/dist/commands/central-sync.d.ts.map +0 -1
  219. package/pd-cli/dist/commands/central-sync.js +0 -32
  220. package/pd-cli/dist/commands/central-sync.js.map +0 -1
  221. package/pd-cli/dist/services/feature-flag-loader.d.ts +0 -6
  222. package/pd-cli/dist/services/feature-flag-loader.d.ts.map +0 -1
  223. package/pd-cli/dist/services/feature-flag-loader.js +0 -53
  224. package/pd-cli/dist/services/feature-flag-loader.js.map +0 -1
  225. package/plugin/dist/core/observability.d.ts +0 -40
  226. package/plugin/dist/core/observability.js +0 -164
  227. package/plugin/dist/hooks/subagent.d.ts +0 -9
  228. package/plugin/dist/hooks/subagent.js +0 -122
@@ -1,164 +0,0 @@
1
- /**
2
- * Observability Baselines for the Evolution SDK.
3
- *
4
- * Provides calculateBaselines() which measures the current state of the
5
- * principle evolution system across four dimensions:
6
- *
7
- * 1. Principle Stock: total count of principles in the ledger
8
- * 2. Structure: average sub-principles (rules) and implementations per principle
9
- * 3. Association Rate: principles created / total pain events recorded
10
- * 4. Internalization Rate: internalized principles / total principles
11
- *
12
- * Results are logged via SystemLogger and persisted to .state/baselines.json.
13
- */
14
- import * as fs from 'fs';
15
- import * as path from 'path';
16
- import { loadLedger } from './principle-tree-ledger.js';
17
- import { SystemLogger } from './system-logger.js';
18
- import { atomicWriteFileSync } from '../utils/io.js';
19
- // ---------------------------------------------------------------------------
20
- // Constants
21
- // ---------------------------------------------------------------------------
22
- const BASELINES_FILE = 'baselines.json';
23
- // ---------------------------------------------------------------------------
24
- // Implementation
25
- // ---------------------------------------------------------------------------
26
- /**
27
- * Calculate observability baselines for the principle evolution system.
28
- *
29
- * Reads the principle ledger from stateDir, computes metrics across four
30
- * dimensions (Stock, Structure, Association, Internalization), logs a summary
31
- * via SystemLogger, and persists results to .state/baselines.json.
32
- *
33
- * @param stateDir - The .state directory containing the principle ledger
34
- * @param workspaceDir - Optional workspace dir for SystemLogger routing
35
- * @returns The computed baselines
36
- */
37
- export function calculateBaselines(stateDir, workspaceDir) {
38
- const ledger = loadLedger(stateDir);
39
- const { tree, trainingStore } = ledger;
40
- const principles = Object.values(tree.principles);
41
- const rules = Object.values(tree.rules);
42
- const implementations = Object.values(tree.implementations);
43
- const principleStock = principles.length;
44
- const totalRules = rules.length;
45
- const totalImplementations = implementations.length;
46
- // Structure metrics
47
- const avgRulesPerPrinciple = principleStock > 0
48
- ? totalRules / principleStock
49
- : 0;
50
- const avgImplementationsPerRule = totalRules > 0
51
- ? totalImplementations / totalRules
52
- : 0;
53
- // Count pain events from trajectory DB
54
- const totalPainEvents = countPainEvents(stateDir);
55
- // Association Rate: how many principles were created per pain event
56
- const associationRate = totalPainEvents > 0
57
- ? principleStock / totalPainEvents
58
- : 0;
59
- // Internalization Rate from training store
60
- // Filter to only entries whose principleId still exists in the ledger tree
61
- // to avoid orphaned/deleted entries inflating the ratio
62
- const trainingEntries = Object.values(trainingStore);
63
- const activePrincipleIds = new Set(Object.keys(tree.principles));
64
- const activeEntries = trainingEntries.filter((entry) => activePrincipleIds.has(entry.principleId));
65
- const internalizedCount = activeEntries.filter((entry) => entry.internalizationStatus === 'internalized').length;
66
- const internalizationRate = principleStock > 0
67
- ? internalizedCount / principleStock
68
- : 0;
69
- // Status distribution
70
- const statusDistribution = {};
71
- for (const p of principles) {
72
- statusDistribution[p.status] = (statusDistribution[p.status] ?? 0) + 1;
73
- }
74
- // Priority distribution
75
- const priorityDistribution = {};
76
- for (const p of principles) {
77
- priorityDistribution[p.priority] = (priorityDistribution[p.priority] ?? 0) + 1;
78
- }
79
- // Internalization status distribution from training store
80
- const internalizationDistribution = {};
81
- for (const entry of trainingEntries) {
82
- internalizationDistribution[entry.internalizationStatus] =
83
- (internalizationDistribution[entry.internalizationStatus] ?? 0) + 1;
84
- }
85
- const baselines = {
86
- calculatedAt: new Date().toISOString(),
87
- principleStock,
88
- totalRules,
89
- totalImplementations,
90
- avgRulesPerPrinciple: roundTo3(avgRulesPerPrinciple),
91
- avgImplementationsPerRule: roundTo3(avgImplementationsPerRule),
92
- totalPainEvents,
93
- associationRate: roundTo3(associationRate),
94
- internalizedCount,
95
- internalizationRate: roundTo3(internalizationRate),
96
- statusDistribution,
97
- priorityDistribution,
98
- internalizationDistribution,
99
- };
100
- // Log summary
101
- SystemLogger.log(workspaceDir, 'OBSERVABILITY_BASELINES', formatBaselineSummary(baselines));
102
- // Persist to .state/baselines.json
103
- persistBaselines(stateDir, baselines);
104
- return baselines;
105
- }
106
- // ---------------------------------------------------------------------------
107
- // Internal helpers
108
- // ---------------------------------------------------------------------------
109
- function roundTo3(n) {
110
- return Math.round(n * 1000) / 1000;
111
- }
112
- function formatBaselineSummary(b) {
113
- return [
114
- `Principle Stock: ${b.principleStock}`,
115
- `Structure: ${b.avgRulesPerPrinciple} rules/principle, ${b.avgImplementationsPerRule} impls/rule`,
116
- `Association Rate: ${b.associationRate} (${b.principleStock} principles / ${b.totalPainEvents} pain events)`,
117
- `Internalization Rate: ${b.internalizationRate} (${b.internalizedCount}/${b.principleStock})`,
118
- ].join(' | ');
119
- }
120
- /**
121
- * Count pain events from the trajectory SQLite database.
122
- * Returns 0 if the database is unavailable or the table doesn't exist.
123
- */
124
- function countPainEvents(stateDir) {
125
- const dbPath = path.join(stateDir, 'trajectory.db');
126
- if (!fs.existsSync(dbPath)) {
127
- return 0;
128
- }
129
- try {
130
- // Use dynamic import for better-sqlite3 to avoid hard dependency
131
- // at module load time. If not available, return 0.
132
- const Database = require('better-sqlite3');
133
- const db = new Database(dbPath, { readonly: true });
134
- try {
135
- const row = db.prepare('SELECT COUNT(*) as count FROM pain_events').get();
136
- return row?.count ?? 0;
137
- }
138
- finally {
139
- db.close();
140
- }
141
- }
142
- catch (err) {
143
- // better-sqlite3 not available, or table doesn't exist — log and return 0
144
- SystemLogger.log(stateDir, 'OBSERVABILITY_SQL_ERROR', `countPainEvents failed: ${String(err)}`);
145
- return 0;
146
- }
147
- }
148
- /**
149
- * Persist baselines to .state/baselines.json atomically.
150
- */
151
- function persistBaselines(stateDir, baselines) {
152
- try {
153
- const filePath = path.join(stateDir, BASELINES_FILE);
154
- const dir = path.dirname(filePath);
155
- if (!fs.existsSync(dir)) {
156
- fs.mkdirSync(dir, { recursive: true });
157
- }
158
- atomicWriteFileSync(filePath, JSON.stringify(baselines, null, 2));
159
- }
160
- catch {
161
- // Baselines persistence is best-effort — don't crash the caller
162
- // (the SystemLogger call above already logged the values)
163
- }
164
- }
@@ -1,9 +0,0 @@
1
- import type { PluginHookSubagentEndedEvent, PluginHookSubagentContext, OpenClawPluginApi } from '../openclaw-sdk.js';
2
- type SubagentEndedHookContext = PluginHookSubagentContext & {
3
- api?: OpenClawPluginApi;
4
- workspaceDir?: string;
5
- sessionId?: string;
6
- agentId?: string;
7
- };
8
- export declare function handleSubagentEnded(event: PluginHookSubagentEndedEvent, ctx: SubagentEndedHookContext): Promise<void>;
9
- export {};
@@ -1,122 +0,0 @@
1
- import { WorkspaceContext } from '../core/workspace-context.js';
2
- import { extractAgentIdFromSessionKey } from '../utils/session-key.js';
3
- import { recordEvolutionSuccess } from '../core/evolution-engine.js';
4
- import { WorkflowStore } from '../service/subagent-workflow/workflow-store.js';
5
- /**
6
- * Factory to create the appropriate WorkflowManager by workflow_type string.
7
- * Used by the subagent_ended hook to dispatch lifecycle recovery to the right manager.
8
- */
9
- function createWorkflowManagerForType(workflowType) {
10
- switch (workflowType) {
11
- default:
12
- return null;
13
- }
14
- }
15
- const HELPER_WORKFLOW_SESSION_PREFIX = 'agent:main:subagent:workflow-';
16
- // Cleanup expired retry entries periodically
17
- function emitSubagentPainEvent(wctx, payload, logger) {
18
- try {
19
- wctx.evolutionReducer.emitSync({
20
- ts: new Date().toISOString(),
21
- type: 'pain_detected',
22
- data: {
23
- painId: `pain_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,
24
- painType: 'subagent_error',
25
- source: payload.source,
26
- reason: payload.reason,
27
- score: payload.score,
28
- sessionId: payload.sessionId,
29
- agentId: payload.agentId,
30
- },
31
- });
32
- }
33
- catch (e) {
34
- logger.warn(`[PD:Subagent] failed to emit evolution event: ${String(e)}`);
35
- }
36
- }
37
- export async function handleSubagentEnded(event, ctx) {
38
- const { outcome, targetSessionKey } = event;
39
- const { workspaceDir } = ctx;
40
- if (!workspaceDir)
41
- return;
42
- const wctx = WorkspaceContext.fromHookContext(ctx);
43
- const logger = ctx.api?.logger ?? console;
44
- // ── Helper Workflow Lifecycle Notification ──
45
- // When a helper workflow's subagent ends, notify the workflow manager
46
- // so that it can trigger fallback recovery (notifyWaitResult → finalizeOnce)
47
- if (targetSessionKey?.startsWith(HELPER_WORKFLOW_SESSION_PREFIX)) {
48
- try {
49
- const store = new WorkflowStore({ workspaceDir });
50
- const workflow = store.getWorkflowByChildSession(targetSessionKey);
51
- if (workflow && workflow.state !== 'completed' && workflow.state !== 'terminal_error' && workflow.state !== 'expired') {
52
- logger.info(`[PD:Subagent] Helper workflow lifecycle event: workflowId=${workflow.workflow_id}, workflowType=${workflow.workflow_type}, outcome=${outcome}`);
53
- const mappedOutcome = outcome === 'deleted' ? 'deleted' :
54
- outcome === 'killed' ? 'killed' :
55
- outcome === 'reset' ? 'reset' :
56
- outcome === 'error' ? 'error' :
57
- outcome === 'timeout' ? 'timeout' : 'ok';
58
- // Call notifyLifecycleEvent on the appropriate manager so it
59
- // triggers notifyWaitResult → finalizeOnce / terminal transition.
60
- const subagentRuntime = ctx.api?.runtime?.subagent;
61
- if (subagentRuntime) {
62
- const mgr = createWorkflowManagerForType(workflow.workflow_type);
63
- if (mgr) {
64
- await mgr.notifyLifecycleEvent(workflow.workflow_id, 'subagent_ended', { outcome: mappedOutcome });
65
- mgr.dispose();
66
- }
67
- else {
68
- logger.warn(`[PD:Subagent] Unknown workflow type ${workflow.workflow_type} — falling back to store-only event`);
69
- store.recordEvent(workflow.workflow_id, 'subagent_ended', workflow.state, workflow.state, `subagent ended with outcome: ${outcome}`, { outcome: mappedOutcome });
70
- }
71
- }
72
- else {
73
- logger.warn(`[PD:Subagent] Subagent runtime not available — cannot notify manager, falling back to store event`);
74
- store.recordEvent(workflow.workflow_id, 'subagent_ended', workflow.state, workflow.state, `subagent ended with outcome: ${outcome}`, { outcome: mappedOutcome });
75
- }
76
- store.dispose();
77
- return;
78
- }
79
- store.dispose();
80
- }
81
- catch (e) {
82
- logger.warn(`[PD:Subagent] Failed to notify helper workflow lifecycle: ${String(e)}`);
83
- }
84
- }
85
- const { config } = wctx;
86
- // ── Outcome-based EP and Pain Signal handling ──
87
- // OpenClaw v2026.3.23 fixes: timeout may be false positive (fast-finishing workers)
88
- // Only penalize actual errors, not timeout/killed/reset
89
- if (outcome === 'error') {
90
- // Only actual errors trigger penalty
91
- const scoreSettings = config.get('scores');
92
- const score = scoreSettings.subagent_error_penalty;
93
- const reason = `Subagent session ${targetSessionKey} ended with error`;
94
- // Emit pain via Runtime v2 chain (M8: no .pain_flag file)
95
- emitSubagentPainEvent(wctx, {
96
- source: `subagent_error`,
97
- reason,
98
- score,
99
- sessionId: ctx.sessionId,
100
- agentId: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey),
101
- }, logger);
102
- }
103
- if (outcome === 'timeout') {
104
- // OpenClaw v2026.3.23 fix: timeout may be false positive
105
- // Fast-finishing workers are no longer incorrectly reported as timed out
106
- // Do not penalize - the task may have actually succeeded
107
- logger.warn(`[PD:Subagent] Session ${targetSessionKey} timed out - not penalizing (OpenClaw fix applied)`);
108
- }
109
- if (outcome === 'killed' || outcome === 'reset') {
110
- // User-initiated termination or system reset - not an agent failure
111
- logger.info(`[PD:Subagent] Session ${targetSessionKey} ended with ${outcome} - no penalty (user/system action)`);
112
- }
113
- if (outcome === 'ok' || outcome === 'deleted') {
114
- recordEvolutionSuccess(workspaceDir, 'subagent', {
115
- sessionId: ctx.sessionId,
116
- reason: 'subagent_success',
117
- });
118
- }
119
- // ── End of subagent_ended handling ──
120
- // Note: Diagnostician runs via HEARTBEAT (main session LLM), not as a subagent.
121
- // Principle creation happens in evolution-worker.ts marker detection path.
122
- }