principles-disciple 1.72.0 → 1.73.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 (309) hide show
  1. package/openclaw.plugin.json +10 -5
  2. package/package.json +17 -19
  3. package/scripts/acceptance-test.mjs +16 -73
  4. package/scripts/sync-plugin.mjs +382 -77
  5. package/src/commands/archive-impl.ts +2 -1
  6. package/src/commands/capabilities.ts +2 -2
  7. package/src/commands/context.ts +2 -2
  8. package/src/commands/disable-impl.ts +2 -1
  9. package/src/commands/evolution-status.ts +16 -16
  10. package/src/commands/export.ts +12 -67
  11. package/src/commands/pain.ts +91 -1
  12. package/src/commands/principle-rollback.ts +2 -1
  13. package/src/commands/promote-impl.ts +7 -43
  14. package/src/commands/rollback-impl.ts +2 -1
  15. package/src/commands/rollback.ts +2 -1
  16. package/src/commands/samples.ts +2 -1
  17. package/src/commands/thinking-os.ts +2 -1
  18. package/src/config/errors.ts +18 -2
  19. package/src/constants/diagnostician.ts +2 -2
  20. package/src/constants/tools.ts +2 -1
  21. package/src/core/__tests__/focus-history.test.ts +210 -0
  22. package/src/core/config.ts +1 -1
  23. package/src/core/confirm-first-gate.ts +255 -0
  24. package/src/core/correction-cue-learner.ts +2 -136
  25. package/src/core/correction-types.ts +16 -88
  26. package/src/core/dictionary.ts +19 -20
  27. package/src/core/empathy-keyword-matcher.ts +17 -289
  28. package/src/core/empathy-types.ts +18 -229
  29. package/src/core/event-log.ts +38 -132
  30. package/src/core/evolution-reducer.ts +21 -2
  31. package/src/core/evolution-types.ts +76 -464
  32. package/src/core/file-store.ts +80 -0
  33. package/src/core/focus-history.ts +228 -955
  34. package/src/core/local-worker-routing.ts +34 -314
  35. package/src/core/merge-gate-audit.ts +0 -195
  36. package/src/core/pain-diagnostic-gate.ts +154 -0
  37. package/src/core/pain-signal.ts +21 -138
  38. package/src/core/pain.ts +15 -88
  39. package/src/core/pd-task-reconciler.ts +26 -115
  40. package/src/core/pd-task-service.ts +9 -9
  41. package/src/core/pd-task-types.ts +23 -127
  42. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  43. package/src/core/principle-compiler/code-validator.ts +15 -42
  44. package/src/core/principle-compiler/compiler.ts +100 -15
  45. package/src/core/principle-compiler/index.ts +5 -2
  46. package/src/core/principle-compiler/template-generator.ts +4 -104
  47. package/src/core/principle-injection.ts +10 -202
  48. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  49. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  50. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  51. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  52. package/src/core/principle-tree-ledger.ts +8 -6
  53. package/src/core/reflection/reflection-context.ts +14 -109
  54. package/src/core/replay-engine.ts +8 -500
  55. package/src/core/rule-host-helpers.ts +5 -35
  56. package/src/core/rule-host-types.ts +10 -82
  57. package/src/core/rule-host.ts +6 -63
  58. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  59. package/src/core/session-tracker.ts +87 -101
  60. package/src/core/shadow-observation-registry.ts +19 -48
  61. package/src/core/trajectory.ts +3 -1
  62. package/src/core/workflow-funnel-loader.ts +62 -68
  63. package/src/core/workspace-context.ts +46 -0
  64. package/src/core/workspace-dir-service.ts +1 -1
  65. package/src/core/workspace-dir-validation.ts +18 -9
  66. package/src/hooks/AGENTS.md +1 -1
  67. package/src/hooks/gate-block-helper.ts +46 -44
  68. package/src/hooks/gate.ts +207 -7
  69. package/src/hooks/lifecycle.ts +30 -32
  70. package/src/hooks/llm.ts +60 -32
  71. package/src/hooks/pain.ts +297 -103
  72. package/src/hooks/prompt.ts +459 -439
  73. package/src/hooks/subagent.ts +2 -29
  74. package/src/i18n/commands.ts +2 -10
  75. package/src/index.ts +95 -85
  76. package/src/openclaw-sdk.ts +311 -0
  77. package/src/service/central-database.ts +8 -4
  78. package/src/service/evolution-queue-migration.ts +2 -1
  79. package/src/service/evolution-worker.ts +163 -1786
  80. package/src/service/internalization-trigger-adapter.ts +302 -0
  81. package/src/service/keyword-optimization-service.ts +4 -4
  82. package/src/service/monitoring-query-service.ts +1 -215
  83. package/src/service/queue-io.ts +60 -331
  84. package/src/service/runtime-summary-service.ts +59 -16
  85. package/src/service/subagent-workflow/index.ts +0 -41
  86. package/src/service/subagent-workflow/types.ts +9 -120
  87. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  88. package/src/service/workflow-watchdog.ts +0 -43
  89. package/src/types/event-payload.ts +16 -74
  90. package/src/types/event-types.ts +39 -547
  91. package/src/types/hygiene-types.ts +7 -30
  92. package/src/types/principle-tree-schema.ts +20 -222
  93. package/src/types/queue.ts +15 -70
  94. package/src/types/runtime-summary.ts +5 -49
  95. package/src/utils/io.ts +10 -0
  96. package/src/utils/retry.ts +1 -1
  97. package/src/utils/shadow-fingerprint.ts +2 -2
  98. package/src/utils/workspace-resolver.ts +50 -0
  99. package/templates/langs/en/core/AGENTS.md +2 -2
  100. package/templates/langs/en/core/BOOT.md +1 -1
  101. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  102. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  103. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  104. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  105. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  107. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  108. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  109. package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
  110. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  111. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  112. package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  113. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  114. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  115. package/templates/langs/zh/core/AGENTS.md +2 -2
  116. package/templates/langs/zh/core/BOOT.md +1 -1
  117. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  118. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  119. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  120. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  121. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  127. package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
  128. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  129. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  130. package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  131. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  132. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  133. package/tests/build-artifacts.test.ts +1 -3
  134. package/tests/commands/evolution-status.test.ts +0 -118
  135. package/tests/core/bootstrap-rules.test.ts +1 -1
  136. package/tests/core/config.test.ts +1 -1
  137. package/tests/core/event-log.test.ts +35 -0
  138. package/tests/core/evolution-engine.test.ts +610 -0
  139. package/tests/core/file-store.test.ts +102 -0
  140. package/tests/core/focus-history.test.ts +203 -11
  141. package/tests/core/merge-gate-audit.test.ts +2 -169
  142. package/tests/core/model-deployment-registry.test.ts +7 -1
  143. package/tests/core/model-training-registry.test.ts +19 -0
  144. package/tests/core/observability.test.ts +0 -1
  145. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  146. package/tests/core/pain.test.ts +0 -1
  147. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  148. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  149. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  150. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  151. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  152. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  153. package/tests/core/reflection-context.test.ts +0 -14
  154. package/tests/core/replay-engine.test.ts +127 -215
  155. package/tests/core/rule-host-helpers.test.ts +2 -2
  156. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  157. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  158. package/tests/core/workspace-dir-validation.test.ts +8 -1
  159. package/tests/core-anti-growth.test.ts +192 -0
  160. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  161. package/tests/hooks/confirm-first-gate.test.ts +333 -0
  162. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  163. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  164. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  165. package/tests/hooks/pain.test.ts +269 -12
  166. package/tests/hooks/prompt-characterization.test.ts +500 -0
  167. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  168. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  169. package/tests/index.test.ts +94 -1
  170. package/tests/integration/auto-entry-gate.test.ts +248 -0
  171. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  172. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  173. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  174. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  175. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  176. package/tests/service/central-database.test.ts +457 -0
  177. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  178. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  179. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  180. package/tests/service/monitoring-query-service.test.ts +1 -47
  181. package/tests/service/queue-io.test.ts +1 -62
  182. package/tests/service/runtime-summary-service.test.ts +3 -1
  183. package/tests/service/workflow-watchdog.test.ts +0 -91
  184. package/tests/utils/file-lock.test.ts +5 -3
  185. package/tests/utils/session-key.test.ts +52 -0
  186. package/tests/utils/subagent-probe.test.ts +48 -1
  187. package/vitest.config.ts +4 -11
  188. package/.planning/codebase/ARCHITECTURE.md +0 -157
  189. package/.planning/codebase/CONCERNS.md +0 -145
  190. package/.planning/codebase/CONVENTIONS.md +0 -148
  191. package/.planning/codebase/INTEGRATIONS.md +0 -81
  192. package/.planning/codebase/STACK.md +0 -87
  193. package/.planning/codebase/STRUCTURE.md +0 -193
  194. package/.planning/codebase/TESTING.md +0 -243
  195. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  196. package/docs/COMMAND_REFERENCE.md +0 -76
  197. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  198. package/scripts/build-web.mjs +0 -46
  199. package/scripts/diagnose-nocturnal.mjs +0 -537
  200. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  201. package/src/commands/nocturnal-review.ts +0 -322
  202. package/src/commands/nocturnal-rollout.ts +0 -790
  203. package/src/commands/nocturnal-train.ts +0 -986
  204. package/src/commands/pd-reflect.ts +0 -88
  205. package/src/core/adaptive-thresholds.ts +0 -478
  206. package/src/core/diagnostician-task-store.ts +0 -192
  207. package/src/core/nocturnal-arbiter.ts +0 -715
  208. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  209. package/src/core/nocturnal-artificer.ts +0 -257
  210. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  211. package/src/core/nocturnal-compliance.ts +0 -1146
  212. package/src/core/nocturnal-dataset.ts +0 -763
  213. package/src/core/nocturnal-executability.ts +0 -428
  214. package/src/core/nocturnal-export.ts +0 -499
  215. package/src/core/nocturnal-paths.ts +0 -240
  216. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  217. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  218. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  219. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  220. package/src/core/nocturnal-trinity-types.ts +0 -218
  221. package/src/core/nocturnal-trinity.ts +0 -2680
  222. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  223. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  224. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  225. package/src/http/principles-console-route.ts +0 -709
  226. package/src/service/central-health-service.ts +0 -49
  227. package/src/service/central-overview-service.ts +0 -138
  228. package/src/service/control-ui-query-service.ts +0 -900
  229. package/src/service/cooldown-strategy.ts +0 -97
  230. package/src/service/evolution-pain-context.ts +0 -79
  231. package/src/service/evolution-query-service.ts +0 -407
  232. package/src/service/health-query-service.ts +0 -1038
  233. package/src/service/nocturnal-config.ts +0 -214
  234. package/src/service/nocturnal-runtime.ts +0 -734
  235. package/src/service/nocturnal-service.ts +0 -1605
  236. package/src/service/nocturnal-target-selector.ts +0 -545
  237. package/src/service/sleep-cycle.ts +0 -157
  238. package/src/service/startup-reconciler.ts +0 -112
  239. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  240. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  241. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  242. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  243. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  244. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  245. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  246. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  247. package/src/tools/write-pain-flag.ts +0 -215
  248. package/tests/commands/nocturnal-review.test.ts +0 -448
  249. package/tests/commands/nocturnal-train.test.ts +0 -97
  250. package/tests/commands/pd-reflect.test.ts +0 -49
  251. package/tests/core/adaptive-thresholds.test.ts +0 -261
  252. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  253. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  254. package/tests/core/nocturnal-artificer.test.ts +0 -241
  255. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  256. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  257. package/tests/core/nocturnal-compliance.test.ts +0 -646
  258. package/tests/core/nocturnal-dataset.test.ts +0 -892
  259. package/tests/core/nocturnal-e2e.test.ts +0 -234
  260. package/tests/core/nocturnal-executability.test.ts +0 -357
  261. package/tests/core/nocturnal-export.test.ts +0 -517
  262. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  263. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  264. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  265. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  266. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  267. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  268. package/tests/core/pain-auto-repair.test.ts +0 -96
  269. package/tests/core/pain-integration.test.ts +0 -510
  270. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  271. package/tests/http/principles-console-route.test.ts +0 -162
  272. package/tests/integration/chaos-resilience.test.ts +0 -348
  273. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  274. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  275. package/tests/service/control-ui-query-service.test.ts +0 -121
  276. package/tests/service/cooldown-strategy.test.ts +0 -164
  277. package/tests/service/data-endpoints-regression.test.ts +0 -834
  278. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  279. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  280. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  281. package/tests/service/nocturnal-runtime.test.ts +0 -473
  282. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  283. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  284. package/tests/service/startup-reconciler.test.ts +0 -148
  285. package/tests/tools/write-pain-flag.test.ts +0 -358
  286. package/ui/src/App.tsx +0 -45
  287. package/ui/src/api.ts +0 -220
  288. package/ui/src/charts.tsx +0 -955
  289. package/ui/src/components/ErrorState.tsx +0 -6
  290. package/ui/src/components/Loading.tsx +0 -13
  291. package/ui/src/components/ProtectedRoute.tsx +0 -12
  292. package/ui/src/components/Shell.tsx +0 -91
  293. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  294. package/ui/src/components/index.ts +0 -5
  295. package/ui/src/context/auth.tsx +0 -80
  296. package/ui/src/context/theme.tsx +0 -66
  297. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  298. package/ui/src/i18n/ui.ts +0 -473
  299. package/ui/src/main.tsx +0 -16
  300. package/ui/src/pages/EvolutionPage.tsx +0 -333
  301. package/ui/src/pages/FeedbackPage.tsx +0 -138
  302. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  303. package/ui/src/pages/LoginPage.tsx +0 -89
  304. package/ui/src/pages/OverviewPage.tsx +0 -599
  305. package/ui/src/pages/SamplesPage.tsx +0 -174
  306. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  307. package/ui/src/styles.css +0 -2020
  308. package/ui/src/types.ts +0 -384
  309. package/ui/src/utils/format.ts +0 -15
@@ -1,11 +1,8 @@
1
1
  import type { PluginHookSubagentEndedEvent, PluginHookSubagentContext, PluginLogger, OpenClawPluginApi } from '../openclaw-sdk.js';
2
- import { buildPainFlag, writePainFlag } from '../core/pain.js';
3
2
  import { WorkspaceContext } from '../core/workspace-context.js';
4
3
  import { extractAgentIdFromSessionKey } from '../utils/session-key.js';
5
- // No longer needed — diagnostician runs via HEARTBEAT, not subagent
6
4
  import { recordEvolutionSuccess } from '../core/evolution-engine.js';
7
5
  import { WorkflowStore } from '../service/subagent-workflow/workflow-store.js';
8
- import { EmpathyObserverWorkflowManager } from '../service/subagent-workflow/empathy-observer-workflow-manager.js';
9
6
  import type { WorkflowManager } from '../service/subagent-workflow/types.js';
10
7
 
11
8
  /**
@@ -16,24 +13,8 @@ import type { WorkflowManager } from '../service/subagent-workflow/types.js';
16
13
 
17
14
  function createWorkflowManagerForType(
18
15
  workflowType: string,
19
- workspaceDir: string,
20
- logger: HookLogger,
21
- subagent: NonNullable<OpenClawPluginApi['runtime']>['subagent'],
22
16
  ): WorkflowManager | null {
23
- const loggerAdapter: PluginLogger = {
24
- info: (m: string) => logger.info(String(m)),
25
- warn: (m: string) => logger.warn(String(m)),
26
- error: (m: string) => logger.error(String(m)),
27
- debug: () => { /* no-op */ },
28
- };
29
-
30
17
  switch (workflowType) {
31
- case 'empathy-observer':
32
- return new EmpathyObserverWorkflowManager({
33
- workspaceDir,
34
- logger: loggerAdapter,
35
- subagent,
36
- });
37
18
  default:
38
19
  return null;
39
20
  }
@@ -113,7 +94,7 @@ export async function handleSubagentEnded(
113
94
  // triggers notifyWaitResult → finalizeOnce / terminal transition.
114
95
  const subagentRuntime = ctx.api?.runtime?.subagent;
115
96
  if (subagentRuntime) {
116
- const mgr = createWorkflowManagerForType(workflow.workflow_type, workspaceDir, logger, subagentRuntime);
97
+ const mgr = createWorkflowManagerForType(workflow.workflow_type);
117
98
  if (mgr) {
118
99
  await mgr.notifyLifecycleEvent(workflow.workflow_id, 'subagent_ended', { outcome: mappedOutcome });
119
100
  mgr.dispose();
@@ -146,15 +127,7 @@ export async function handleSubagentEnded(
146
127
  const score = scoreSettings.subagent_error_penalty;
147
128
  const reason = `Subagent session ${targetSessionKey} ended with error`;
148
129
 
149
- writePainFlag(workspaceDir, buildPainFlag({
150
- source: 'subagent_error',
151
- score: String(score),
152
- reason,
153
- is_risky: true,
154
- session_id: ctx.sessionId || '',
155
- agent_id: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey) || '',
156
- }));
157
-
130
+ // Emit pain via Runtime v2 chain (M8: no .pain_flag file)
158
131
  emitSubagentPainEvent(wctx, {
159
132
  source: `subagent_error`,
160
133
  reason,
@@ -37,10 +37,6 @@ export const commandDescriptions: Record<string, Record<SupportedLanguage, strin
37
37
  zh: '管理思维模型 [status|propose|audit]',
38
38
  en: 'Manage Thinking OS [status|propose|audit]'
39
39
  },
40
- 'pd-reflect': {
41
- zh: '手动触发 Nocturnal 睡眠反射(跳过 idle 检测)',
42
- en: 'Manually trigger Nocturnal sleep reflection (bypass idle check)'
43
- },
44
40
  'pd-daily': {
45
41
  zh: '配置并发送进化日报',
46
42
  en: 'Configure and send daily evolution report'
@@ -78,17 +74,13 @@ export const commandDescriptions: Record<string, Record<SupportedLanguage, strin
78
74
  en: 'Rollback empathy event penalty <event-id>|last'
79
75
  },
80
76
  'pd-export': {
81
- zh: '导出数据 [analytics|corrections --redacted|orpo --family=<model>|orpo-list]',
82
- en: 'Export data [analytics|corrections --redacted|orpo --family=<model>|orpo-list]'
77
+ zh: '导出数据 [analytics|corrections --redacted]',
78
+ en: 'Export data [analytics|corrections --redacted]'
83
79
  },
84
80
  'pd-samples': {
85
81
  zh: '查看或审核纠错样本 [review approve|reject <sample-id> [note]]',
86
82
  en: 'List or review correction samples [review approve|reject <sample-id> [note]]'
87
83
  },
88
- 'pd-nocturnal-review': {
89
- zh: '审核 nocturnal 数据集样本 [list|show|approve|reject|set-family|stats]',
90
- en: 'Review nocturnal dataset samples [list|show|approve|reject|set-family|stats]'
91
- }
92
84
  };
93
85
 
94
86
  /**
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type {
2
2
  OpenClawPluginApi,
3
+ PluginCommandContext,
3
4
  PluginHookBeforePromptBuildEvent,
4
5
  PluginHookAgentContext,
5
6
  PluginHookBeforePromptBuildResult,
@@ -31,22 +32,18 @@ import * as TrajectoryCollector from './hooks/trajectory-collector.js';
31
32
  import { handleInitStrategy, handleManageOkr } from './commands/strategy.js';
32
33
  import { handleBootstrapTools, handleResearchTools } from './commands/capabilities.js';
33
34
  import { handleThinkingOs } from './commands/thinking-os.js';
34
- import { handlePainCommand } from './commands/pain.js';
35
+ import { handlePainCommand, handlePainReportCommand } from './commands/pain.js';
35
36
  import { handleContextCommand } from './commands/context.js';
36
37
  import { handleFocusCommand } from './commands/focus.js';
37
38
  import { handleRollbackCommand } from './commands/rollback.js';
38
39
  import { handlePromoteImplCommand } from './commands/promote-impl.js';
39
40
  import { handleDisableImplCommand } from './commands/disable-impl.js';
40
- import { handlePdReflect } from './commands/pd-reflect.js';
41
41
  import { handleArchiveImplCommand } from './commands/archive-impl.js';
42
42
  import { handleRollbackImplCommand } from './commands/rollback-impl.js';
43
43
  import { handleEvolutionStatusCommand } from './commands/evolution-status.js';
44
44
  import { handlePrincipleRollbackCommand } from './commands/principle-rollback.js';
45
45
  import { handleExportCommand } from './commands/export.js';
46
46
  import { handleSamplesCommand } from './commands/samples.js';
47
- import { handleNocturnalReviewCommand } from './commands/nocturnal-review.js';
48
- import { handleNocturnalTrainCommand } from './commands/nocturnal-train.js';
49
- import { handleNocturnalRolloutCommand } from './commands/nocturnal-rollout.js';
50
47
  import { handleWorkflowDebugCommand } from './commands/workflow-debug.js';
51
48
  import { EvolutionWorkerService } from './service/evolution-worker.js';
52
49
  import { TrajectoryService } from './service/trajectory-service.js';
@@ -55,22 +52,22 @@ import { CentralSyncService } from './service/central-sync-service.js';
55
52
  import { ensureWorkspaceTemplates } from './core/init.js';
56
53
  import { migrateDirectoryStructure } from './core/migration.js';
57
54
  import { SystemLogger } from './core/system-logger.js';
58
- import { createWritePainFlagTool } from './tools/write-pain-flag.js';
59
55
  import { PathResolver } from './core/path-resolver.js';
60
- import { createPrinciplesConsoleRoute } from './http/principles-console-route.js';
61
- import { extractAgentIdFromSessionKey } from './utils/session-key.js';
62
56
  import { resolveCommandWorkspaceDir, resolveToolHookWorkspaceDirSafe } from './utils/workspace-resolver.js';
63
57
  import { computeRuntimeShadowTaskFingerprint, PD_LOCAL_PROFILES } from './utils/shadow-fingerprint.js';
64
58
  import type { WorkerProfile } from './core/model-deployment-registry.js';
65
59
  import { validateWorkspaceDir } from './core/workspace-dir-validation.js';
66
60
  import { resolveWorkspaceDirFromApi } from './core/path-resolver.js';
67
- import { resolveRequiredWorkspaceDir } from './core/workspace-dir-service.js';
68
61
 
69
62
  // Track initialization to avoid repeated calls
70
63
  let workspaceInitialized = false;
71
64
  // Track started evolution workers — one per workspace
72
65
  const startedWorkspaces = new Set<string>();
73
66
 
67
+ const HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION =
68
+ 'verify gateway plugin activation and hook workspace binding; ' +
69
+ 'migrate live hook workspace resolution to PD-owned canonical configuration before relying on config-based recovery';
70
+
74
71
  // Map from childSessionKey → shadowObservationId
75
72
  // Used to complete shadow observations when subagent ends
76
73
  const pendingShadowObservations = new Map<string, string>();
@@ -82,7 +79,6 @@ const plugin = {
82
79
  register(api: OpenClawPluginApi) {
83
80
  api.logger.info(`Principles Disciple Plugin registered. (Path: ${api.rootDir ?? '(unknown)'})`);
84
81
  PathResolver.setExtensionRoot(api.rootDir ?? '.');
85
- api.registerHttpRoute(createPrinciplesConsoleRoute(api));
86
82
 
87
83
  // ── Startup Health Check: Verify workspaceDir resolution ──
88
84
  // Catches OpenClaw context bugs early (e.g., missing workspaceDir in tool hooks)
@@ -106,7 +102,16 @@ const plugin = {
106
102
  'before_prompt_build',
107
103
  async (event: PluginHookBeforePromptBuildEvent, ctx: PluginHookAgentContext): Promise<PluginHookBeforePromptBuildResult | void> => {
108
104
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'before_prompt_build');
109
- if (!workspaceDir) return;
105
+ if (!workspaceDir) {
106
+ api.logger.error(
107
+ `[PD:before_prompt_build] workspaceDir resolution failed. ` +
108
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'} ` +
109
+ `sessionKey=${ctx.sessionKey ?? '(missing)'}. ` +
110
+ `Hook skipped — no mutation will occur. ` +
111
+ `NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
112
+ );
113
+ return;
114
+ }
110
115
  try {
111
116
  if (!workspaceInitialized) {
112
117
  migrateDirectoryStructure(api, workspaceDir);
@@ -131,7 +136,7 @@ const plugin = {
131
136
  api.logger.info(`[PD] EvolutionWorker started for workspace: ${workspaceDir}`);
132
137
  }
133
138
 
134
- const result = await handleBeforePromptBuild(event, { ...ctx, api, workspaceDir });
139
+ const result = await handleBeforePromptBuild(event, { ...ctx, api: api as Parameters<typeof handleBeforePromptBuild>[1]['api'], workspaceDir });
135
140
 
136
141
  // Record success
137
142
  WorkspaceContext.fromHookContext({ workspaceDir }).eventLog.recordHookExecution({
@@ -156,7 +161,16 @@ const plugin = {
156
161
  'before_tool_call',
157
162
  (event: PluginHookBeforeToolCallEvent, ctx: PluginHookToolContext): PluginHookBeforeToolCallResult | void => {
158
163
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'before_tool_call');
159
- if (!workspaceDir) return;
164
+ if (!workspaceDir) {
165
+ api.logger.error(
166
+ `[PD:before_tool_call] workspaceDir resolution failed. ` +
167
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'} ` +
168
+ `sessionKey=${ctx.sessionKey ?? '(missing)'}. ` +
169
+ `Hook skipped — security gate bypassed. ` +
170
+ `NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
171
+ );
172
+ return;
173
+ }
160
174
  try {
161
175
  const pluginConfig = api.pluginConfig ?? {};
162
176
  const {logger} = api;
@@ -182,7 +196,16 @@ const plugin = {
182
196
  'after_tool_call',
183
197
  (event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext): void => {
184
198
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'after_tool_call');
185
- if (!workspaceDir) return;
199
+ if (!workspaceDir) {
200
+ api.logger.error(
201
+ `[PD:after_tool_call] workspaceDir resolution failed. ` +
202
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'} ` +
203
+ `sessionKey=${ctx.sessionKey ?? '(missing)'}. ` +
204
+ `Hook skipped — pain detection bypassed. ` +
205
+ `NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
206
+ );
207
+ return;
208
+ }
186
209
  try {
187
210
  const pluginConfig = api.pluginConfig ?? {};
188
211
  // Pass api separately to handleAfterToolCall to maintain type safety
@@ -205,8 +228,17 @@ const plugin = {
205
228
  api.on(
206
229
  'llm_output',
207
230
  (event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext): void => {
208
- const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx as unknown as Record<string, unknown>, api, 'llm_output');
209
- if (!workspaceDir) return;
231
+ const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'llm_output');
232
+ if (!workspaceDir) {
233
+ api.logger.error(
234
+ `[PD:llm_output] workspaceDir resolution failed. ` +
235
+ `agentId=${ctx.agentId ?? '(missing)'} ` +
236
+ `sessionId=${ctx.sessionId ?? '(missing)'}. ` +
237
+ `Hook skipped — LLM analysis bypassed. ` +
238
+ `NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
239
+ );
240
+ return;
241
+ }
210
242
  try {
211
243
  handleLlmOutput(event, { ...ctx, workspaceDir });
212
244
 
@@ -245,7 +277,7 @@ const plugin = {
245
277
  'llm_output',
246
278
  (event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext): void => {
247
279
  try {
248
- const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx as unknown as Record<string, unknown>, api, 'trajectory.llm_output');
280
+ const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'trajectory.llm_output');
249
281
  if (!workspaceDir) return;
250
282
  TrajectoryCollector.handleLlmOutput(event, { ...ctx, workspaceDir });
251
283
  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Reason: catch binding intentionally unused
@@ -341,19 +373,40 @@ const plugin = {
341
373
  // ── Hook: Lifecycle ──
342
374
  api.on('before_reset', (event: PluginHookBeforeResetEvent, ctx: PluginHookAgentContext) => {
343
375
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'before_reset');
344
- if (!workspaceDir) return;
376
+ if (!workspaceDir) {
377
+ api.logger.error(
378
+ `[PD:before_reset] workspaceDir resolution failed. ` +
379
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'}. ` +
380
+ `Hook skipped. NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
381
+ );
382
+ return;
383
+ }
345
384
  return handleBeforeReset(event, { ...ctx, workspaceDir });
346
385
  });
347
386
 
348
387
  api.on('before_compaction', (event: PluginHookBeforeCompactionEvent, ctx: PluginHookAgentContext) => {
349
388
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'before_compaction');
350
- if (!workspaceDir) return;
389
+ if (!workspaceDir) {
390
+ api.logger.error(
391
+ `[PD:before_compaction] workspaceDir resolution failed. ` +
392
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'}. ` +
393
+ `Hook skipped. NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
394
+ );
395
+ return;
396
+ }
351
397
  return handleBeforeCompaction(event, { ...ctx, workspaceDir });
352
398
  });
353
399
 
354
400
  api.on('after_compaction', (event: PluginHookAfterCompactionEvent, ctx: PluginHookAgentContext) => {
355
401
  const workspaceDir = resolveToolHookWorkspaceDirSafe(ctx, api, 'after_compaction');
356
- if (!workspaceDir) return;
402
+ if (!workspaceDir) {
403
+ api.logger.error(
404
+ `[PD:after_compaction] workspaceDir resolution failed. ` +
405
+ `agentId=${ctx.agentId ?? '(missing)'} sessionId=${ctx.sessionId ?? '(missing)'}. ` +
406
+ `Hook skipped. NextAction: ${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}`,
407
+ );
408
+ return;
409
+ }
357
410
  return handleAfterCompaction(event, { ...ctx, workspaceDir });
358
411
  });
359
412
 
@@ -399,17 +452,6 @@ const plugin = {
399
452
 
400
453
  registerCommandWithAlias('pd-thinking', 'pdt', getCommandDescription('pd-thinking', language), (ctx: any) => handleThinkingOs(ctx), { acceptsArgs: true });
401
454
 
402
- registerCommandWithAlias('pd-reflect', 'pdrl', getCommandDescription('pd-reflect', language), (ctx: any) => {
403
- try {
404
- // Resolve agentId from sessionKey (if available), fallback to 'main'
405
- const agentId = extractAgentIdFromSessionKey(ctx.sessionKey) ?? 'main';
406
- const workspaceDir = resolveRequiredWorkspaceDir(api, { ...ctx, agentId }, { source: 'pd-reflect', fallbackAgentId: 'main' });
407
- return handlePdReflect.handler({ ...ctx, api, workspaceDir });
408
- } catch (err) {
409
- api.logger.error(`[PD:pd-reflect] Command failed: ${String(err)}`);
410
- return { text: language === 'zh' ? '命令执行失败,请查看日志。' : 'Command failed. Check logs.' };
411
- }
412
- });
413
455
  registerCommandWithAlias('pd-daily', 'pdd', getCommandDescription('pd-daily', language), () => ({
414
456
  text: language === 'zh'
415
457
  ? "请执行 pd-daily 技能来配置并发送进化日报。系统将引导你完成配置流程,包括发送时间、渠道和报告风格偏好。"
@@ -437,7 +479,6 @@ const plugin = {
437
479
  |--------|--------|------|
438
480
  | \`/pdk\` | \`/pd-okr\` | OKR 目标管理 |
439
481
  | \`/pdt\` | \`/pd-thinking\` | 思维模型管理 |
440
- | \`/pdrl\` | \`/pd-reflect\` | 手动触发反思 |
441
482
  | \`/pdd\` | \`/pd-daily\` | 进化日报 |
442
483
  | \`/pdg\` | \`/pd-grooming\` | 工作区清理 |
443
484
 
@@ -449,7 +490,6 @@ const plugin = {
449
490
  | \`/pd-focus\` | 焦点文件管理 |
450
491
  | \`/pd-export\` | 导出数据 |
451
492
  | \`/pd-samples\` | 审核纠错样本 |
452
- | \`/pd-nocturnal-review\` | 审核 nocturnal 样本 |
453
493
  | \`/pd-rollback\` | 回滚情绪事件惩罚 |
454
494
  | \`/pd-principle-rollback\` | 回滚原则 |
455
495
  | \`/pd-help\` | 显示本帮助 |
@@ -470,7 +510,6 @@ const plugin = {
470
510
  |-------|------|---------|
471
511
  | \`/pdk\` | \`/pd-okr\` | OKR goal management |
472
512
  | \`/pdt\` | \`/pd-thinking\` | Mental model management |
473
- | \`/pdrl\` | \`/pd-reflect\` | Manual reflection trigger |
474
513
  | \`/pdd\` | \`/pd-daily\` | Evolution report |
475
514
  | \`/pdg\` | \`/pd-grooming\` | Workspace cleanup |
476
515
 
@@ -482,7 +521,6 @@ const plugin = {
482
521
  | \`/pd-focus\` | Focus file management |
483
522
  | \`/pd-export\` | Export data |
484
523
  | \`/pd-samples\` | Review correction samples |
485
- | \`/pd-nocturnal-review\` | Review nocturnal samples |
486
524
  | \`/pd-rollback\` | Rollback empathy penalty |
487
525
  | \`/pd-principle-rollback\` | Rollback principle |
488
526
  | \`/pd-help\` | Show this help |
@@ -507,6 +545,25 @@ const plugin = {
507
545
  }
508
546
  });
509
547
 
548
+ api.registerCommand({
549
+ name: "pd-pain",
550
+ description: language === 'zh'
551
+ ? '从 OpenClaw 会话中报告 pain(context-bound provenance)'
552
+ : 'Report pain from OpenClaw session (context-bound provenance)',
553
+ acceptsArgs: true,
554
+ handler: async (ctx) => {
555
+ try {
556
+ const workspaceDir = resolveCommandWorkspaceDir(api, ctx);
557
+ ctx.workspaceDir = workspaceDir;
558
+ if (ctx.config) ctx.config.workspaceDir = workspaceDir;
559
+ return await handlePainReportCommand(ctx);
560
+ } catch (err) {
561
+ api.logger.error(`[PD] Command /pd-pain failed: ${String(err)}`);
562
+ return { text: language === 'zh' ? "命令执行失败,请检查日志。" : "Command failed. Check logs." };
563
+ }
564
+ }
565
+ });
566
+
510
567
  api.registerCommand({
511
568
  name: "pd-context",
512
569
  description: getCommandDescription('pd-context', language),
@@ -620,54 +677,6 @@ const plugin = {
620
677
  }
621
678
  });
622
679
 
623
- api.registerCommand({
624
- name: "pd-nocturnal-review",
625
- description: 'Review nocturnal dataset samples [list|show|approve|reject|set-family|stats]',
626
- acceptsArgs: true,
627
- handler: (ctx) => {
628
- try {
629
- const workspaceDir = resolveCommandWorkspaceDir(api, ctx);
630
- if (ctx.config) ctx.config.workspaceDir = workspaceDir;
631
- return handleNocturnalReviewCommand(ctx);
632
- } catch (err) {
633
- api.logger.error(`[PD] Command /pd-nocturnal-review failed: ${String(err)}`);
634
- return { text: language === 'zh' ? "Nocturnal review 命令执行失败,请检查日志。" : "Nocturnal review command failed. Check logs." };
635
- }
636
- }
637
- });
638
-
639
- api.registerCommand({
640
- name: "nocturnal-train",
641
- description: 'Nocturnal training operations [create-experiment|show-experiment|import-result|attach-eval|show-lineage|list-experiments|list-checkpoints|stats]',
642
- acceptsArgs: true,
643
- handler: (ctx) => {
644
- try {
645
- const workspaceDir = resolveCommandWorkspaceDir(api, ctx);
646
- if (ctx.config) ctx.config.workspaceDir = workspaceDir;
647
- return handleNocturnalTrainCommand(ctx);
648
- } catch (err) {
649
- api.logger.error(`[PD] Command /nocturnal-train failed: ${String(err)}`);
650
- return { text: language === 'zh' ? "Nocturnal train 命令执行失败,请检查日志。" : "Nocturnal train command failed. Check logs." };
651
- }
652
- }
653
- });
654
-
655
- api.registerCommand({
656
- name: "nocturnal-rollout",
657
- description: 'Nocturnal rollout and promotion [evaluate-promotion|advance-promotion|bind|enable-routing|disable-routing|rollback|status|show-promotion]',
658
- acceptsArgs: true,
659
- handler: (ctx) => {
660
- try {
661
- const workspaceDir = resolveCommandWorkspaceDir(api, ctx);
662
- if (ctx.config) ctx.config.workspaceDir = workspaceDir;
663
- return handleNocturnalRolloutCommand(ctx);
664
- } catch (err) {
665
- api.logger.error(`[PD] Command /nocturnal-rollout failed: ${String(err)}`);
666
- return { text: language === 'zh' ? "Nocturnal rollout 命令执行失败,请检查日志。" : "Nocturnal rollout command failed. Check logs." };
667
- }
668
- }
669
- });
670
-
671
680
  api.registerCommand({
672
681
  name: "pd-workflow-debug",
673
682
  description: 'Debug helper workflow state and events [workflowId]',
@@ -676,7 +685,7 @@ const plugin = {
676
685
  try {
677
686
  const workspaceDir = resolveCommandWorkspaceDir(api, ctx);
678
687
  if (ctx.config) ctx.config.workspaceDir = workspaceDir;
679
- return handleWorkflowDebugCommand(ctx);
688
+ return handleWorkflowDebugCommand(ctx as PluginCommandContext & { args?: string });
680
689
  } catch (err) {
681
690
  api.logger.error(`[PD] Command /pd-workflow-debug failed: ${String(err)}`);
682
691
  return { text: `Workflow debug command failed: ${String(err)}` };
@@ -749,8 +758,9 @@ const plugin = {
749
758
  }
750
759
  });
751
760
 
752
- api.registerTool(createWritePainFlagTool(api));
753
761
  }
754
762
  };
755
763
 
764
+ export { PrincipleTreeLedgerAdapter } from './core/principle-tree-ledger-adapter.js';
765
+
756
766
  export default plugin;