principles-disciple 1.72.0 → 1.74.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 (319) hide show
  1. package/INSTALL.md +1 -3
  2. package/openclaw.plugin.json +10 -5
  3. package/package.json +17 -19
  4. package/scripts/acceptance-test.mjs +16 -73
  5. package/scripts/sync-plugin.mjs +382 -77
  6. package/src/commands/archive-impl.ts +2 -1
  7. package/src/commands/capabilities.ts +2 -2
  8. package/src/commands/context.ts +2 -2
  9. package/src/commands/disable-impl.ts +2 -1
  10. package/src/commands/evolution-status.ts +16 -16
  11. package/src/commands/export.ts +12 -67
  12. package/src/commands/pain.ts +91 -1
  13. package/src/commands/principle-rollback.ts +2 -1
  14. package/src/commands/promote-impl.ts +7 -43
  15. package/src/commands/rollback-impl.ts +2 -1
  16. package/src/commands/rollback.ts +2 -1
  17. package/src/commands/samples.ts +2 -1
  18. package/src/commands/thinking-os.ts +2 -1
  19. package/src/config/errors.ts +18 -2
  20. package/src/constants/diagnostician.ts +2 -2
  21. package/src/constants/tools.ts +2 -1
  22. package/src/core/__tests__/focus-history.test.ts +210 -0
  23. package/src/core/config.ts +1 -1
  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 +29 -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/migration.ts +0 -1
  37. package/src/core/pain-diagnostic-gate.ts +154 -0
  38. package/src/core/pain-signal.ts +21 -138
  39. package/src/core/pain.ts +15 -88
  40. package/src/core/path-resolver.ts +0 -1
  41. package/src/core/paths.ts +0 -1
  42. package/src/core/pd-task-reconciler.ts +26 -115
  43. package/src/core/pd-task-service.ts +9 -9
  44. package/src/core/pd-task-types.ts +23 -127
  45. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  46. package/src/core/principle-compiler/code-validator.ts +15 -42
  47. package/src/core/principle-compiler/compiler.ts +100 -15
  48. package/src/core/principle-compiler/index.ts +5 -2
  49. package/src/core/principle-compiler/template-generator.ts +4 -104
  50. package/src/core/principle-injection.ts +10 -202
  51. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  52. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  53. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  54. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  55. package/src/core/principle-tree-ledger.ts +8 -6
  56. package/src/core/reflection/reflection-context.ts +14 -109
  57. package/src/core/replay-engine.ts +8 -500
  58. package/src/core/rule-host-helpers.ts +5 -35
  59. package/src/core/rule-host-types.ts +10 -82
  60. package/src/core/rule-host.ts +6 -63
  61. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  62. package/src/core/session-tracker.ts +87 -101
  63. package/src/core/shadow-observation-registry.ts +19 -48
  64. package/src/core/trajectory.ts +3 -1
  65. package/src/core/workflow-funnel-loader.ts +62 -68
  66. package/src/core/workspace-context.ts +46 -0
  67. package/src/core/workspace-dir-service.ts +1 -1
  68. package/src/core/workspace-dir-validation.ts +18 -9
  69. package/src/hooks/AGENTS.md +1 -1
  70. package/src/hooks/gate-block-helper.ts +71 -64
  71. package/src/hooks/gate.ts +183 -31
  72. package/src/hooks/lifecycle.ts +30 -32
  73. package/src/hooks/llm.ts +60 -32
  74. package/src/hooks/pain.ts +297 -103
  75. package/src/hooks/prompt.ts +400 -440
  76. package/src/hooks/subagent.ts +2 -29
  77. package/src/i18n/commands.ts +2 -10
  78. package/src/index.ts +95 -85
  79. package/src/openclaw-sdk.ts +311 -0
  80. package/src/service/central-database.ts +8 -4
  81. package/src/service/evolution-queue-migration.ts +2 -1
  82. package/src/service/evolution-worker.ts +163 -1786
  83. package/src/service/internalization-trigger-adapter.ts +302 -0
  84. package/src/service/keyword-optimization-service.ts +4 -4
  85. package/src/service/monitoring-query-service.ts +1 -215
  86. package/src/service/queue-io.ts +60 -331
  87. package/src/service/runtime-summary-service.ts +59 -16
  88. package/src/service/subagent-workflow/index.ts +0 -41
  89. package/src/service/subagent-workflow/types.ts +9 -120
  90. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  91. package/src/service/workflow-watchdog.ts +0 -43
  92. package/src/types/event-payload.ts +16 -74
  93. package/src/types/event-types.ts +38 -547
  94. package/src/types/hygiene-types.ts +7 -30
  95. package/src/types/principle-tree-schema.ts +20 -222
  96. package/src/types/queue.ts +15 -70
  97. package/src/types/runtime-summary.ts +5 -49
  98. package/src/utils/io.ts +8 -20
  99. package/src/utils/retry.ts +1 -1
  100. package/src/utils/shadow-fingerprint.ts +2 -2
  101. package/src/utils/workspace-resolver.ts +50 -0
  102. package/templates/langs/en/core/AGENTS.md +7 -7
  103. package/templates/langs/en/core/BOOT.md +1 -1
  104. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  105. package/templates/langs/en/principles/THINKING_OS.md +3 -2
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  107. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  108. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  109. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  110. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  111. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  112. package/templates/langs/en/skills/evolve-task/SKILL.md +3 -3
  113. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  114. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  115. package/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
  116. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  117. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  118. package/templates/langs/zh/core/AGENTS.md +7 -7
  119. package/templates/langs/zh/core/BOOT.md +1 -1
  120. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  121. package/templates/langs/zh/principles/THINKING_OS.md +3 -2
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  127. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  128. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  129. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  130. package/templates/langs/zh/skills/evolve-task/SKILL.md +4 -4
  131. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  132. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  133. package/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
  134. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  135. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  136. package/tests/build-artifacts.test.ts +1 -3
  137. package/tests/commands/evolution-status.test.ts +0 -118
  138. package/tests/core/bootstrap-rules.test.ts +1 -1
  139. package/tests/core/config.test.ts +1 -1
  140. package/tests/core/event-log.test.ts +35 -0
  141. package/tests/core/evolution-engine.test.ts +610 -0
  142. package/tests/core/file-store.test.ts +102 -0
  143. package/tests/core/focus-history.test.ts +203 -11
  144. package/tests/core/merge-gate-audit.test.ts +2 -169
  145. package/tests/core/migration.test.ts +7 -7
  146. package/tests/core/model-deployment-registry.test.ts +7 -1
  147. package/tests/core/model-training-registry.test.ts +19 -0
  148. package/tests/core/observability.test.ts +0 -1
  149. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  150. package/tests/core/pain.test.ts +0 -1
  151. package/tests/core/path-resolver.test.ts +1 -1
  152. package/tests/core/paths-refactor.test.ts +0 -22
  153. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  154. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  155. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  156. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  157. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  158. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  159. package/tests/core/reflection-context.test.ts +0 -14
  160. package/tests/core/replay-engine.test.ts +127 -215
  161. package/tests/core/rule-host-helpers.test.ts +2 -2
  162. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  163. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  164. package/tests/core/workspace-context.test.ts +2 -2
  165. package/tests/core/workspace-dir-validation.test.ts +8 -1
  166. package/tests/core-anti-growth.test.ts +191 -0
  167. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  168. package/tests/hooks/confirm-first-removal.test.ts +188 -0
  169. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  170. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  171. package/tests/hooks/gate-no-path-write-tool.test.ts +172 -0
  172. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  173. package/tests/hooks/pain.test.ts +269 -12
  174. package/tests/hooks/prompt-characterization.test.ts +500 -0
  175. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  176. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  177. package/tests/index.test.ts +94 -1
  178. package/tests/integration/auto-entry-gate.test.ts +248 -0
  179. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  180. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  181. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  182. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  183. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  184. package/tests/service/central-database.test.ts +457 -0
  185. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  186. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  187. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  188. package/tests/service/monitoring-query-service.test.ts +1 -47
  189. package/tests/service/queue-io.test.ts +1 -62
  190. package/tests/service/runtime-summary-service.test.ts +3 -1
  191. package/tests/service/workflow-watchdog.test.ts +0 -91
  192. package/tests/utils/file-lock.test.ts +5 -3
  193. package/tests/utils/session-key.test.ts +52 -0
  194. package/tests/utils/subagent-probe.test.ts +48 -1
  195. package/vitest.config.ts +4 -11
  196. package/.planning/codebase/ARCHITECTURE.md +0 -157
  197. package/.planning/codebase/CONCERNS.md +0 -145
  198. package/.planning/codebase/CONVENTIONS.md +0 -148
  199. package/.planning/codebase/INTEGRATIONS.md +0 -81
  200. package/.planning/codebase/STACK.md +0 -87
  201. package/.planning/codebase/STRUCTURE.md +0 -193
  202. package/.planning/codebase/TESTING.md +0 -243
  203. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  204. package/docs/COMMAND_REFERENCE.md +0 -76
  205. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  206. package/scripts/build-web.mjs +0 -46
  207. package/scripts/diagnose-nocturnal.mjs +0 -537
  208. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  209. package/src/commands/nocturnal-review.ts +0 -322
  210. package/src/commands/nocturnal-rollout.ts +0 -790
  211. package/src/commands/nocturnal-train.ts +0 -986
  212. package/src/commands/pd-reflect.ts +0 -88
  213. package/src/core/adaptive-thresholds.ts +0 -478
  214. package/src/core/diagnostician-task-store.ts +0 -192
  215. package/src/core/nocturnal-arbiter.ts +0 -715
  216. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  217. package/src/core/nocturnal-artificer.ts +0 -257
  218. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  219. package/src/core/nocturnal-compliance.ts +0 -1146
  220. package/src/core/nocturnal-dataset.ts +0 -763
  221. package/src/core/nocturnal-executability.ts +0 -428
  222. package/src/core/nocturnal-export.ts +0 -499
  223. package/src/core/nocturnal-paths.ts +0 -240
  224. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  225. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  226. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  227. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  228. package/src/core/nocturnal-trinity-types.ts +0 -218
  229. package/src/core/nocturnal-trinity.ts +0 -2680
  230. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  231. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  232. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  233. package/src/http/principles-console-route.ts +0 -709
  234. package/src/service/central-health-service.ts +0 -49
  235. package/src/service/central-overview-service.ts +0 -138
  236. package/src/service/control-ui-query-service.ts +0 -900
  237. package/src/service/cooldown-strategy.ts +0 -97
  238. package/src/service/evolution-pain-context.ts +0 -79
  239. package/src/service/evolution-query-service.ts +0 -407
  240. package/src/service/health-query-service.ts +0 -1038
  241. package/src/service/nocturnal-config.ts +0 -214
  242. package/src/service/nocturnal-runtime.ts +0 -734
  243. package/src/service/nocturnal-service.ts +0 -1605
  244. package/src/service/nocturnal-target-selector.ts +0 -545
  245. package/src/service/sleep-cycle.ts +0 -157
  246. package/src/service/startup-reconciler.ts +0 -112
  247. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  248. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  249. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  250. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  251. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  252. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  253. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  254. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  255. package/src/tools/write-pain-flag.ts +0 -215
  256. package/templates/langs/en/skills/plan-script/SKILL.md +0 -32
  257. package/templates/langs/zh/skills/plan-script/SKILL.md +0 -32
  258. package/tests/commands/nocturnal-review.test.ts +0 -448
  259. package/tests/commands/nocturnal-train.test.ts +0 -97
  260. package/tests/commands/pd-reflect.test.ts +0 -49
  261. package/tests/core/adaptive-thresholds.test.ts +0 -261
  262. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  263. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  264. package/tests/core/nocturnal-artificer.test.ts +0 -241
  265. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  266. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  267. package/tests/core/nocturnal-compliance.test.ts +0 -646
  268. package/tests/core/nocturnal-dataset.test.ts +0 -892
  269. package/tests/core/nocturnal-e2e.test.ts +0 -234
  270. package/tests/core/nocturnal-executability.test.ts +0 -357
  271. package/tests/core/nocturnal-export.test.ts +0 -517
  272. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  273. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  274. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  275. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  276. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  277. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  278. package/tests/core/pain-auto-repair.test.ts +0 -96
  279. package/tests/core/pain-integration.test.ts +0 -510
  280. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  281. package/tests/http/principles-console-route.test.ts +0 -162
  282. package/tests/integration/chaos-resilience.test.ts +0 -348
  283. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  284. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  285. package/tests/service/control-ui-query-service.test.ts +0 -121
  286. package/tests/service/cooldown-strategy.test.ts +0 -164
  287. package/tests/service/data-endpoints-regression.test.ts +0 -834
  288. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  289. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  290. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  291. package/tests/service/nocturnal-runtime.test.ts +0 -473
  292. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  293. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  294. package/tests/service/startup-reconciler.test.ts +0 -148
  295. package/tests/tools/write-pain-flag.test.ts +0 -358
  296. package/ui/src/App.tsx +0 -45
  297. package/ui/src/api.ts +0 -220
  298. package/ui/src/charts.tsx +0 -955
  299. package/ui/src/components/ErrorState.tsx +0 -6
  300. package/ui/src/components/Loading.tsx +0 -13
  301. package/ui/src/components/ProtectedRoute.tsx +0 -12
  302. package/ui/src/components/Shell.tsx +0 -91
  303. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  304. package/ui/src/components/index.ts +0 -5
  305. package/ui/src/context/auth.tsx +0 -80
  306. package/ui/src/context/theme.tsx +0 -66
  307. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  308. package/ui/src/i18n/ui.ts +0 -473
  309. package/ui/src/main.tsx +0 -16
  310. package/ui/src/pages/EvolutionPage.tsx +0 -333
  311. package/ui/src/pages/FeedbackPage.tsx +0 -138
  312. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  313. package/ui/src/pages/LoginPage.tsx +0 -89
  314. package/ui/src/pages/OverviewPage.tsx +0 -599
  315. package/ui/src/pages/SamplesPage.tsx +0 -174
  316. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  317. package/ui/src/styles.css +0 -2020
  318. package/ui/src/types.ts +0 -384
  319. 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;