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
@@ -3,7 +3,7 @@ import * as fs from 'fs';
3
3
  import * as path from 'path';
4
4
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
5
5
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
6
- import { atomicWriteFileSync } from '../utils/io.js';
6
+ import { atomicWriteFileSync, normalizeCommandArgs } from '../utils/io.js';
7
7
  import type { ContextInjectionConfig} from '../types.js';
8
8
  import { defaultContextConfig } from '../types.js';
9
9
  import { loadContextInjectionConfig } from '../hooks/prompt.js';
@@ -305,7 +305,7 @@ function showHelp(isZh: boolean): string {
305
305
 
306
306
  export function handleContextCommand(ctx: PluginCommandContext): PluginCommandResult {
307
307
  const workspaceDir = getWorkspaceDir(ctx);
308
- const args = (ctx.args || '').trim().split(/\s+/);
308
+ const args = normalizeCommandArgs(ctx.args).trim().split(/\s+/);
309
309
  const subCommand = args[0]?.toLowerCase() || 'status';
310
310
  const value = args[1]?.toLowerCase() || '';
311
311
 
@@ -21,6 +21,7 @@ import {
21
21
  } from '../core/principle-tree-ledger.js';
22
22
  import type { Implementation, ImplementationLifecycleState } from '../types/principle-tree-schema.js';
23
23
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
24
+ import { normalizeCommandArgs } from '../utils/io.js';
24
25
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
25
26
 
26
27
  /**
@@ -139,7 +140,7 @@ export function handleDisableImplCommand(ctx: PluginCommandContext): PluginComma
139
140
  const lang = (ctx.config?.language as string) || 'en';
140
141
  const isZh = lang === 'zh';
141
142
 
142
- const args = (ctx.args || '').trim();
143
+ const args = normalizeCommandArgs(ctx.args).trim();
143
144
 
144
145
  // Parse args: [implId] [--reason "..."]
145
146
  const parts = args.split(/\s+/);
@@ -1,6 +1,6 @@
1
1
  import * as path from 'path';
2
2
  import type { EvolutionReducerImpl } from '../core/evolution-reducer.js';
3
- import type { InternalizationRouteRecommendation } from '../core/principle-internalization/internalization-routing-policy.js';
3
+ import type { LifecycleRouteRecommendation } from '@principles/core/runtime-v2';
4
4
  import { WorkflowFunnelLoader } from '../core/workflow-funnel-loader.js';
5
5
  import { resolvePdPath } from '../core/paths.js';
6
6
  import { WorkspaceContext } from '../core/workspace-context.js';
@@ -33,7 +33,7 @@ function formatSources(
33
33
  }
34
34
 
35
35
  function formatRouteRecommendations(
36
- recommendations: InternalizationRouteRecommendation[],
36
+ recommendations: LifecycleRouteRecommendation[],
37
37
  emptyLabel: string,
38
38
  ): string {
39
39
  if (recommendations.length === 0) {
@@ -57,7 +57,7 @@ function buildEnglishOutput(
57
57
  warnings: string[],
58
58
  stats: ReturnType<EvolutionReducerImpl['getStats']>,
59
59
  summary: ReturnType<typeof RuntimeSummaryService.getSummary>,
60
- recommendations: InternalizationRouteRecommendation[],
60
+ recommendations: LifecycleRouteRecommendation[],
61
61
  ): string {
62
62
  const lines: string[] = [
63
63
  'Evolution Status',
@@ -78,13 +78,13 @@ function buildEnglishOutput(
78
78
  `- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'}, queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'}, eligible ${summary.phase3.evolutionEligible}, reference_only ${summary.phase3.evolutionReferenceOnly}, rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? ` (reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? ` (${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
79
79
  `- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
80
80
  '',
81
- // D: Heartbeat Diagnostician chain — separated from evolution/nocturnal
81
+ // D: Heartbeat Diagnostician chain
82
82
  'Heartbeat Diagnostician (Pain → Principle)',
83
- `- Pending tasks: ${summary.heartbeatDiagnosis.pendingTasks}`,
84
- `- Tasks written today: ${summary.heartbeatDiagnosis.tasksWrittenToday}`,
85
- `- Reports written today: ${summary.heartbeatDiagnosis.reportsWrittenToday}`,
86
- `- Candidates created today: ${summary.heartbeatDiagnosis.candidatesCreatedToday}`,
87
- `- Heartbeats injected today: ${summary.heartbeatDiagnosis.heartbeatsInjectedToday}`,
83
+ `- Pending tasks: ${summary.runtimeDiagnosis.pendingTasks}`,
84
+ `- Tasks written today: ${summary.runtimeDiagnosis.tasksWrittenToday}`,
85
+ `- Reports written today: ${summary.runtimeDiagnosis.reportsWrittenToday}`,
86
+ `- Candidates created today: ${summary.runtimeDiagnosis.candidatesCreatedToday}`,
87
+ `- Heartbeats injected today: ${summary.runtimeDiagnosis.heartbeatsInjectedToday}`,
88
88
  '',
89
89
  'Principles',
90
90
  `- candidate principles: ${stats.candidateCount}`,
@@ -129,7 +129,7 @@ function buildChineseOutput(
129
129
  warnings: string[],
130
130
  stats: ReturnType<EvolutionReducerImpl['getStats']>,
131
131
  summary: ReturnType<typeof RuntimeSummaryService.getSummary>,
132
- recommendations: InternalizationRouteRecommendation[],
132
+ recommendations: LifecycleRouteRecommendation[],
133
133
  ): string {
134
134
  const lines: string[] = [
135
135
  '进化状态',
@@ -150,13 +150,13 @@ function buildChineseOutput(
150
150
  `- Phase 3: ready ${summary.phase3.phase3ShadowEligible ? 'yes' : 'no'},queueTruthReady ${summary.phase3.queueTruthReady ? 'yes' : 'no'},eligible ${summary.phase3.evolutionEligible},reference_only ${summary.phase3.evolutionReferenceOnly},rejected ${summary.phase3.evolutionRejected}${summary.phase3.evolutionReferenceOnlyReasons.length > 0 ? ` (reference ${summary.phase3.evolutionReferenceOnlyReasons.slice(0, 2).join(', ')})` : ''}${summary.phase3.evolutionRejectedReasons.length > 0 ? ` (${summary.phase3.evolutionRejectedReasons.slice(0, 3).join(', ')})` : ''}`,
151
151
  `- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
152
152
  '',
153
- // D: Heartbeat Diagnostician chain — separated from evolution/nocturnal
153
+ // D: Heartbeat Diagnostician chain
154
154
  '心跳诊断链路(Pain → 原则)',
155
- `- 等待处理: ${summary.heartbeatDiagnosis.pendingTasks}`,
156
- `- 今日写入任务: ${summary.heartbeatDiagnosis.tasksWrittenToday}`,
157
- `- 今日写入报告: ${summary.heartbeatDiagnosis.reportsWrittenToday}`,
158
- `- 今日创建候选: ${summary.heartbeatDiagnosis.candidatesCreatedToday}`,
159
- `- 今日心跳注入: ${summary.heartbeatDiagnosis.heartbeatsInjectedToday}`,
155
+ `- 等待处理: ${summary.runtimeDiagnosis.pendingTasks}`,
156
+ `- 今日写入任务: ${summary.runtimeDiagnosis.tasksWrittenToday}`,
157
+ `- 今日写入报告: ${summary.runtimeDiagnosis.reportsWrittenToday}`,
158
+ `- 今日创建候选: ${summary.runtimeDiagnosis.candidatesCreatedToday}`,
159
+ `- 今日心跳注入: ${summary.runtimeDiagnosis.heartbeatsInjectedToday}`,
160
160
  '',
161
161
  '原则统计',
162
162
  `- 候选原则: ${stats.candidateCount}`,
@@ -1,7 +1,7 @@
1
1
  import { WorkspaceContext } from '../core/workspace-context.js';
2
2
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
3
+ import { normalizeCommandArgs } from '../utils/io.js';
3
4
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
4
- import { exportORPOSamples, listExports } from '../core/nocturnal-export.js';
5
5
 
6
6
  function isZh(ctx: PluginCommandContext): boolean {
7
7
  return String(ctx.config?.language || 'en').startsWith('zh');
@@ -10,77 +10,17 @@ function isZh(ctx: PluginCommandContext): boolean {
10
10
  export function handleExportCommand(ctx: PluginCommandContext): PluginCommandResult {
11
11
  const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'export');
12
12
  const zh = isZh(ctx);
13
- const args = (ctx.args || '').trim();
13
+ const args = normalizeCommandArgs(ctx.args).trim();
14
14
  const parts = args.split(/\s+/).filter(Boolean);
15
15
  const [subcommand = 'corrections'] = parts;
16
16
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
17
17
 
18
18
  try {
19
- if (subcommand === 'orpo') {
20
- // Nocturnal ORPO export
21
- // Usage: pd-export orpo [--family=<targetModelFamily>]
22
- const familyArg = parts.find((p) => p.startsWith('--family='));
23
- const targetModelFamily = familyArg ? familyArg.split('=')[1] : undefined;
24
-
25
- const result = exportORPOSamples(workspaceDir, targetModelFamily);
26
-
27
- if (!result.success) {
28
- const reasonMap: Record<string, string> = {
29
- no_approved_samples: zh
30
- ? '没有已批准的样本'
31
- : 'No approved samples',
32
- family_mismatch: zh
33
- ? '没有找到指定模型家族的已批准样本'
34
- : 'No approved samples for the specified target model family',
35
- all_samples_missing_artifacts: zh
36
- ? '所有样本的 artifact 文件都缺失'
37
- : 'All sample artifact files are missing',
38
- };
39
- return {
40
- text: zh
41
- ? `ORPO 导出失败: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`
42
- : `ORPO export failed: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`,
43
- };
44
- }
45
-
46
-
47
-
48
- return {
49
- text: zh
50
- ? `已导出 ORPO 决策点样本到 ${result.manifest!.exportPath},` +
51
- `共 ${result.manifest!.sampleCount} 条,模型家族: ${result.manifest!.targetModelFamily},` +
52
- `数据集指纹: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`
53
- : `Exported ORPO decision-point samples to ${result.manifest!.exportPath}, ` +
54
- `${result.manifest!.sampleCount} samples, target: ${result.manifest!.targetModelFamily}, ` +
55
- `dataset fingerprint: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`,
56
- };
57
- }
58
-
59
- if (subcommand === 'orpo-list') {
60
- // List previous ORPO exports
61
- const exports = listExports(workspaceDir);
62
- if (exports.length === 0) {
63
- return {
64
- text: zh
65
- ? '没有找到 ORPO 导出记录。'
66
- : 'No ORPO exports found.',
67
- };
68
- }
69
- const lines = exports.slice(0, 10).map((e) =>
70
- `- ${e.exportId.substring(0, 8)}... | ${e.sampleCount} samples | ${e.targetModelFamily} | ${new Date(e.createdAt).toLocaleDateString()}`
71
- );
72
- return {
73
- text: zh
74
- ? `ORPO 导出记录:\n${lines.join('\n')}`
75
- : `ORPO exports:\n${lines.join('\n')}`,
76
- };
77
- }
78
-
79
19
  if (subcommand !== 'analytics' && subcommand !== 'corrections') {
80
20
  return {
81
21
  text: zh
82
- ? '无效的导出类型。请使用 `analytics`、`corrections [--redacted]` 或 `orpo [--family=<target>]`。'
83
- : 'Invalid export target. Use `analytics`, `corrections [--redacted]`, or `orpo [--family=<target>]`',
22
+ ? '无效的导出类型。请使用 `analytics` 或 `corrections [--redacted]`。'
23
+ : 'Invalid export target. Use `analytics` or `corrections [--redacted]`',
84
24
  };
85
25
  }
86
26
 
@@ -104,11 +44,16 @@ export function handleExportCommand(ctx: PluginCommandContext): PluginCommandRes
104
44
  ? `已导出纠错样本到 ${result.filePath},模式 ${result.mode},共 ${result.count} 条。`
105
45
  : `Exported correction samples to ${result.filePath} (mode=${result.mode}, count=${result.count}).`,
106
46
  };
107
- } catch {
47
+ } catch (err) {
48
+ console.error('[pd-export] Export failed:', {
49
+ subcommand,
50
+ error: err instanceof Error ? err.message : String(err),
51
+ stack: err instanceof Error ? err.stack : undefined,
52
+ });
108
53
  return {
109
54
  text: zh
110
- ? '导出失败,请检查日志。'
111
- : 'Export failed. Check logs.',
55
+ ? `导出失败 (${subcommand}): ${err instanceof Error ? err.message : String(err)}`
56
+ : `Export failed (${subcommand}): ${err instanceof Error ? err.message : String(err)}`,
112
57
  };
113
58
  }
114
59
  }
@@ -1,8 +1,12 @@
1
1
  import { resetFriction, getSession } from '../core/session-tracker.js';
2
2
  import { WorkspaceContext } from '../core/workspace-context.js';
3
3
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+ import { normalizeCommandArgs } from '../utils/io.js';
4
5
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
5
6
  import type { EmpathyEventStats } from '../types/event-types.js';
7
+ import type { EvolutionLoopEvent } from '../core/evolution-types.js';
8
+ import { computeHash } from '../utils/hashing.js';
9
+ import { PainToPrincipleService, PrincipleTreeLedgerAdapter } from '@principles/core/runtime-v2';
6
10
 
7
11
  /**
8
12
  * Creates a visual progress bar (e.g., [██████░░░░])
@@ -100,7 +104,7 @@ export function handlePainCommand(ctx: PluginCommandContext): PluginCommandResul
100
104
  const isZh = lang === 'zh';
101
105
  const { sessionId } = ctx as SessionAwareCommandContext;
102
106
 
103
- const args = (ctx.args || '').trim();
107
+ const args = normalizeCommandArgs(ctx.args).trim();
104
108
 
105
109
  // Handle empathy subcommand
106
110
  if (args.startsWith('empathy')) {
@@ -267,3 +271,89 @@ function handleEmpathySubcommand(
267
271
 
268
272
  return { text };
269
273
  }
274
+
275
+ export async function handlePainReportCommand(ctx: PluginCommandContext): Promise<PluginCommandResult> {
276
+ const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'pain-report');
277
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
278
+ const lang = (ctx.config?.language as string) || 'en';
279
+ const isZh = lang === 'zh';
280
+ const { sessionId } = ctx as SessionAwareCommandContext;
281
+ const args = normalizeCommandArgs(ctx.args).trim();
282
+
283
+ if (!args) {
284
+ return {
285
+ text: isZh
286
+ ? '❌ 请提供 pain reason。用法: `/pd-pain <描述你遇到的问题>`'
287
+ : '❌ Please provide a pain reason. Usage: `/pd-pain <describe the issue you encountered>`',
288
+ };
289
+ }
290
+
291
+ if (!sessionId || sessionId === 'unknown') {
292
+ return {
293
+ text: isZh
294
+ ? '❌ 无法获取当前会话 ID。请在 OpenClaw 对话会话中使用此命令。'
295
+ : '❌ Session ID not available. Please use this command in an OpenClaw chat session.',
296
+ };
297
+ }
298
+
299
+ const painId = `manual_${Date.now()}_${computeHash(sessionId).slice(0, 8)}`;
300
+ const painData = {
301
+ painId,
302
+ painType: 'user_frustration' as const,
303
+ source: 'manual',
304
+ reason: args,
305
+ score: 90,
306
+ sessionId,
307
+ agentId: 'openclaw-host',
308
+ provenance: 'openclaw_context_bound' as const,
309
+ };
310
+
311
+ try {
312
+ const ledgerAdapter = new PrincipleTreeLedgerAdapter({ stateDir: wctx.stateDir });
313
+ const service = new PainToPrincipleService({
314
+ workspaceDir: wctx.workspaceDir,
315
+ stateDir: wctx.stateDir,
316
+ ledgerAdapter,
317
+ owner: 'openclaw-plugin',
318
+ autoIntakeEnabled: true,
319
+ });
320
+
321
+ const result = await service.recordPain({
322
+ painId: painData.painId,
323
+ painType: painData.painType,
324
+ source: painData.source,
325
+ reason: painData.reason,
326
+ score: painData.score,
327
+ sessionId: painData.sessionId,
328
+ agentId: painData.agentId,
329
+ provenance: painData.provenance,
330
+ recordObservability: true,
331
+ });
332
+
333
+ if (result.status === 'succeeded') {
334
+ wctx.evolutionReducer.emitSync({
335
+ ts: new Date().toISOString(),
336
+ type: 'pain_detected',
337
+ data: painData,
338
+ } as EvolutionLoopEvent);
339
+
340
+ return {
341
+ text: isZh
342
+ ? `✅ Pain 已记录 (context-bound)\n\n📋 **Pain ID**: ${painId}\n📝 **Reason**: ${args}\n🔗 **Provenance**: openclaw_context_bound\n📌 **Session**: ${sessionId}\n\n系统将基于当前会话上下文进行诊断。`
343
+ : `✅ Pain recorded (context-bound)\n\n📋 **Pain ID**: ${painId}\n📝 **Reason**: ${args}\n🔗 **Provenance**: openclaw_context_bound\n📌 **Session**: ${sessionId}\n\nThe system will diagnose using current session context.`,
344
+ };
345
+ }
346
+
347
+ return {
348
+ text: isZh
349
+ ? `⚠️ Pain 记录未成功 (status: ${result.status})。请检查系统日志或使用 \`/pd-status\` 查看状态。`
350
+ : `⚠️ Pain recording not accepted (status: ${result.status}). Check system logs or use \`/pd-status\` for status.`,
351
+ };
352
+ } catch (err) {
353
+ return {
354
+ text: isZh
355
+ ? `❌ Pain 记录失败: ${String(err)}。请检查系统日志或重试。`
356
+ : `❌ Failed to record pain: ${String(err)}. Check system logs or try again.`,
357
+ };
358
+ }
359
+ }
@@ -1,11 +1,12 @@
1
1
  import { WorkspaceContext } from '../core/workspace-context.js';
2
2
  import type { PluginCommandContext } from '../openclaw-sdk.js';
3
+ import { normalizeCommandArgs } from '../utils/io.js';
3
4
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
4
5
 
5
6
 
6
7
  export function handlePrincipleRollbackCommand(ctx: PluginCommandContext): { text: string } {
7
8
  const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'principle-rollback');
8
- const argText = (ctx.args || '').trim();
9
+ const argText = normalizeCommandArgs(ctx.args).trim();
9
10
  const [principleId = '', ...reasonParts] = argText.split(/\s+/);
10
11
  const reason = (reasonParts.join(' ') || 'manual rollback').trim();
11
12
  const isZh = (ctx.config?.language as string)?.startsWith('zh');
@@ -14,6 +14,9 @@
14
14
  * VALIDATION:
15
15
  * - Candidate must have at least one replay report with 'pass' decision
16
16
  * - Only candidate -> active is valid for promotion
17
+ * - NOTE (PRI-230): The legacy replay generation path has been retired.
18
+ * This command is temporarily unavailable for implementations without
19
+ * pre-existing replay reports until a Runtime V2 replay entry is wired.
17
20
  */
18
21
 
19
22
  import * as fs from 'fs';
@@ -28,6 +31,7 @@ import {
28
31
  } from '../core/principle-tree-ledger.js';
29
32
  import { WorkspaceContext } from '../core/workspace-context.js';
30
33
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
34
+ import { normalizeCommandArgs } from '../utils/io.js';
31
35
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
32
36
  import type { Implementation, ImplementationLifecycleState } from '../types/principle-tree-schema.js';
33
37
  import { withLock } from '../utils/file-lock.js';
@@ -99,35 +103,6 @@ function _handleShowReport(
99
103
  return { text: formatReplayReport(report) };
100
104
  }
101
105
 
102
- interface RunReplayOptions {
103
- workspaceDir: string;
104
- stateDir: string;
105
- implId: string;
106
- isZh: boolean;
107
- }
108
-
109
- function _handleRunReplay(options: RunReplayOptions): PluginCommandResult {
110
- const { workspaceDir, stateDir, implId, isZh } = options;
111
- const engine = new ReplayEngine(workspaceDir, stateDir);
112
-
113
- try {
114
- const report = engine.runReplayForImplementation(implId);
115
- let text = formatReplayReport(report);
116
- if (report.sampleFingerprints.length === 0) {
117
- text += isZh
118
- ? '\n⚠️ 未找到已分类的 replay 样本。报告已生成,但当前结果只反映空样本集。\n'
119
- : '\n⚠️ No classified replay samples were found. The report was generated, but it only reflects an empty sample set.\n';
120
- }
121
- return { text };
122
- } catch (error: unknown) {
123
- return {
124
- text: isZh
125
- ? `❌ 回放评估失败: ${String(error)}`
126
- : `❌ Replay evaluation failed: ${String(error)}`,
127
- };
128
- }
129
- }
130
-
131
106
  interface PromoteImplOptions {
132
107
  workspaceDir: string;
133
108
  stateDir: string;
@@ -162,8 +137,8 @@ function _handlePromoteImpl(options: PromoteImplOptions): PluginCommandResult {
162
137
  if (!engine.hasPassingReport(implId)) {
163
138
  return {
164
139
  text: isZh
165
- ? `❌ 实现 ${implId} 没有通过的回放报告,无法晋升。\n\n请先运行回放评估。`
166
- : `❌ Implementation ${implId} has no passing replay report. Promotion rejected.\n\nPlease run a replay evaluation first.`,
140
+ ? `❌ 实现 ${implId} 没有通过的回放报告,晋升被拒绝。\n\nLegacy replay 生成路径已在 PRI-230 退役,当前无可用的 replay 证据生成入口。该命令暂不可用于没有既有 replay 报告的实现。`
141
+ : `❌ Implementation ${implId} has no passing replay report. Promotion rejected.\n\nThe legacy replay generation path was retired in PRI-230; no replay evidence generation entry is currently available. This command is temporarily unavailable for implementations without pre-existing replay reports.`,
167
142
  };
168
143
  }
169
144
 
@@ -256,7 +231,7 @@ export function handlePromoteImplCommand(ctx: PluginCommandContext): PluginComma
256
231
  const lang = (ctx.config?.language as string) || 'en';
257
232
  const isZh = lang === 'zh';
258
233
 
259
- const args = (ctx.args || '').trim().split(/\s+/);
234
+ const args = normalizeCommandArgs(ctx.args).trim().split(/\s+/);
260
235
  const subcommand = args[0] || '';
261
236
  const implId = args[1] || '';
262
237
 
@@ -275,16 +250,5 @@ export function handlePromoteImplCommand(ctx: PluginCommandContext): PluginComma
275
250
  return _handleShowReport(stateDir, implId, isZh);
276
251
  }
277
252
 
278
- if (subcommand === 'eval') {
279
- if (!implId) {
280
- return {
281
- text: isZh
282
- ? '请指定要评估的实现ID: /pd-promote-impl eval <implId>'
283
- : 'Please specify an implementation ID: /pd-promote-impl eval <implId>',
284
- };
285
- }
286
- return _handleRunReplay({ workspaceDir, stateDir, implId, isZh });
287
- }
288
-
289
253
  return _handlePromoteImpl({ workspaceDir, stateDir, implId: subcommand, isZh });
290
254
  }
@@ -25,6 +25,7 @@ import {
25
25
  } from '../core/principle-tree-ledger.js';
26
26
  import type { Implementation } from '../types/principle-tree-schema.js';
27
27
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
28
+ import { normalizeCommandArgs } from '../utils/io.js';
28
29
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
29
30
 
30
31
  /**
@@ -50,7 +51,7 @@ export function handleRollbackImplCommand(ctx: PluginCommandContext): PluginComm
50
51
  const lang = (ctx.config?.language as string) || 'en';
51
52
  const isZh = lang === 'zh';
52
53
 
53
- const args = (ctx.args || '').trim();
54
+ const args = normalizeCommandArgs(ctx.args).trim();
54
55
 
55
56
  // Parse args
56
57
  const subcommand = args.split(/\s+/)[0] || '';
@@ -1,6 +1,7 @@
1
1
  import { WorkspaceContext } from '../core/workspace-context.js';
2
2
  import { resetFriction } from '../core/session-tracker.js';
3
3
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+ import { normalizeCommandArgs } from '../utils/io.js';
4
5
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
5
6
 
6
7
  /**
@@ -26,7 +27,7 @@ export function handleRollbackCommand(ctx: PluginCommandContext): PluginCommandR
26
27
  const isZh = lang === 'zh';
27
28
  const { sessionId } = ctx as SessionAwareCommandContext;
28
29
 
29
- const args = (ctx.args || '').trim();
30
+ const args = normalizeCommandArgs(ctx.args).trim();
30
31
 
31
32
  if (!args) {
32
33
  return {
@@ -1,5 +1,6 @@
1
1
  import { WorkspaceContext } from '../core/workspace-context.js';
2
2
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
3
+ import { normalizeCommandArgs } from '../utils/io.js';
3
4
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
4
5
 
5
6
  function isZh(ctx: PluginCommandContext): boolean {
@@ -9,7 +10,7 @@ function isZh(ctx: PluginCommandContext): boolean {
9
10
  export function handleSamplesCommand(ctx: PluginCommandContext): PluginCommandResult {
10
11
  const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'samples');
11
12
  const zh = isZh(ctx);
12
- const args = (ctx.args || '').trim();
13
+ const args = normalizeCommandArgs(ctx.args).trim();
13
14
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
14
15
 
15
16
  if (args.startsWith('review ')) {
@@ -1,6 +1,7 @@
1
1
 
2
2
  import * as fs from 'fs';
3
3
  import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+ import { normalizeCommandArgs } from '../utils/io.js';
4
5
  import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
5
6
  import { WorkspaceContext } from '../core/workspace-context.js';
6
7
 
@@ -162,7 +163,7 @@ function formatAuditReport(wctx: WorkspaceContext): string {
162
163
  export function handleThinkingOs(ctx: PluginCommandContext): PluginCommandResult {
163
164
  const workspaceDir = getWorkspaceDir(ctx);
164
165
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
165
- const args = (ctx.args || '').trim();
166
+ const args = normalizeCommandArgs(ctx.args).trim();
166
167
  const subCommand = args.split(/\s+/)[0]?.toLowerCase();
167
168
  const rest = args.slice(subCommand?.length || 0).trim();
168
169
 
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Domain-Specific Errors for Principles Disciple
3
- *
3
+ *
4
4
  * These errors provide semantic meaning to failure modes,
5
5
  * making it easier to distinguish between:
6
6
  * - Lock contention (resource busy)
@@ -9,18 +9,34 @@
9
9
  * - Configuration issues
10
10
  */
11
11
 
12
+ import type { PDErrorCategory } from '@principles/core';
13
+
14
+ /** Maps legacy PdError codes to canonical PDErrorCategory values. */
15
+ const codeToCategory: Record<string, PDErrorCategory> = {
16
+ LOCK_UNAVAILABLE: 'lease_conflict',
17
+ PATH_RESOLUTION_ERROR: 'workspace_invalid',
18
+ WORKSPACE_NOT_FOUND: 'workspace_invalid',
19
+ SAMPLE_NOT_FOUND: 'storage_unavailable',
20
+ CONFIGURATION_ERROR: 'input_invalid',
21
+ DEPENDENCY_ERROR: 'runtime_unavailable',
22
+ EVOLUTION_PROCESSING_ERROR: 'execution_failed',
23
+ TRAJECTORY_ERROR: 'storage_unavailable',
24
+ };
25
+
12
26
  /**
13
27
  * Base class for all Principles Disciple errors
14
28
  */
15
29
  export class PdError extends Error {
30
+ readonly category: PDErrorCategory;
31
+
16
32
  constructor(
17
33
  message: string,
18
-
19
34
  public readonly code: string,
20
35
  options?: { cause?: unknown }
21
36
  ) {
22
37
  super(message, options);
23
38
  this.name = 'PdError';
39
+ this.category = codeToCategory[code] ?? 'execution_failed';
24
40
  }
25
41
  }
26
42
 
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Diagnostician 协议常量
3
3
  *
4
- * 用于 evolution-worker.ts(后台心跳)和 prompt.ts(实时路径)
4
+ * 用于 Runtime V2 diagnostician prompt
5
5
  * 与 templates/langs/zh/skills/pd-diagnostician/SKILL.md 保持一致
6
6
  */
7
7
 
@@ -13,7 +13,7 @@
13
13
  export const DIAGNOSTICIAN_PROTOCOL_SUMMARY = `## Diagnostic Protocol (5 Whys)
14
14
 
15
15
  **Phase 1 - Evidence Gathering**:
16
- - Read .state/.pain_flag for full pain context
16
+ - Use the task input/context provided by Runtime V2 for pain context
17
17
  - Read .state/logs/events.jsonl recent entries
18
18
  - Search codebase for error patterns from Reason field
19
19
  - Record all evidence sources (file:line)
@@ -58,4 +58,5 @@ export const WRITE_TOOLS = new Set<string>([
58
58
  ...LOW_RISK_WRITE_TOOL_NAMES,
59
59
  'delete_file',
60
60
  'move_file',
61
- ]);
61
+ ]);
62
+