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
@@ -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
+