principles-disciple 1.72.0 → 1.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/openclaw.plugin.json +10 -5
  2. package/package.json +17 -19
  3. package/scripts/acceptance-test.mjs +16 -73
  4. package/scripts/sync-plugin.mjs +382 -77
  5. package/src/commands/archive-impl.ts +2 -1
  6. package/src/commands/capabilities.ts +2 -2
  7. package/src/commands/context.ts +2 -2
  8. package/src/commands/disable-impl.ts +2 -1
  9. package/src/commands/evolution-status.ts +16 -16
  10. package/src/commands/export.ts +12 -67
  11. package/src/commands/pain.ts +91 -1
  12. package/src/commands/principle-rollback.ts +2 -1
  13. package/src/commands/promote-impl.ts +7 -43
  14. package/src/commands/rollback-impl.ts +2 -1
  15. package/src/commands/rollback.ts +2 -1
  16. package/src/commands/samples.ts +2 -1
  17. package/src/commands/thinking-os.ts +2 -1
  18. package/src/config/errors.ts +18 -2
  19. package/src/constants/diagnostician.ts +2 -2
  20. package/src/constants/tools.ts +2 -1
  21. package/src/core/__tests__/focus-history.test.ts +210 -0
  22. package/src/core/config.ts +1 -1
  23. package/src/core/confirm-first-gate.ts +255 -0
  24. package/src/core/correction-cue-learner.ts +2 -136
  25. package/src/core/correction-types.ts +16 -88
  26. package/src/core/dictionary.ts +19 -20
  27. package/src/core/empathy-keyword-matcher.ts +17 -289
  28. package/src/core/empathy-types.ts +18 -229
  29. package/src/core/event-log.ts +38 -132
  30. package/src/core/evolution-reducer.ts +21 -2
  31. package/src/core/evolution-types.ts +76 -464
  32. package/src/core/file-store.ts +80 -0
  33. package/src/core/focus-history.ts +228 -955
  34. package/src/core/local-worker-routing.ts +34 -314
  35. package/src/core/merge-gate-audit.ts +0 -195
  36. package/src/core/pain-diagnostic-gate.ts +154 -0
  37. package/src/core/pain-signal.ts +21 -138
  38. package/src/core/pain.ts +15 -88
  39. package/src/core/pd-task-reconciler.ts +26 -115
  40. package/src/core/pd-task-service.ts +9 -9
  41. package/src/core/pd-task-types.ts +23 -127
  42. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  43. package/src/core/principle-compiler/code-validator.ts +15 -42
  44. package/src/core/principle-compiler/compiler.ts +100 -15
  45. package/src/core/principle-compiler/index.ts +5 -2
  46. package/src/core/principle-compiler/template-generator.ts +4 -104
  47. package/src/core/principle-injection.ts +10 -202
  48. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  49. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  50. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  51. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  52. package/src/core/principle-tree-ledger.ts +8 -6
  53. package/src/core/reflection/reflection-context.ts +14 -109
  54. package/src/core/replay-engine.ts +8 -500
  55. package/src/core/rule-host-helpers.ts +5 -35
  56. package/src/core/rule-host-types.ts +10 -82
  57. package/src/core/rule-host.ts +6 -63
  58. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  59. package/src/core/session-tracker.ts +87 -101
  60. package/src/core/shadow-observation-registry.ts +19 -48
  61. package/src/core/trajectory.ts +3 -1
  62. package/src/core/workflow-funnel-loader.ts +62 -68
  63. package/src/core/workspace-context.ts +46 -0
  64. package/src/core/workspace-dir-service.ts +1 -1
  65. package/src/core/workspace-dir-validation.ts +18 -9
  66. package/src/hooks/AGENTS.md +1 -1
  67. package/src/hooks/gate-block-helper.ts +46 -44
  68. package/src/hooks/gate.ts +207 -7
  69. package/src/hooks/lifecycle.ts +30 -32
  70. package/src/hooks/llm.ts +60 -32
  71. package/src/hooks/pain.ts +297 -103
  72. package/src/hooks/prompt.ts +459 -439
  73. package/src/hooks/subagent.ts +2 -29
  74. package/src/i18n/commands.ts +2 -10
  75. package/src/index.ts +95 -85
  76. package/src/openclaw-sdk.ts +311 -0
  77. package/src/service/central-database.ts +8 -4
  78. package/src/service/evolution-queue-migration.ts +2 -1
  79. package/src/service/evolution-worker.ts +163 -1786
  80. package/src/service/internalization-trigger-adapter.ts +302 -0
  81. package/src/service/keyword-optimization-service.ts +4 -4
  82. package/src/service/monitoring-query-service.ts +1 -215
  83. package/src/service/queue-io.ts +60 -331
  84. package/src/service/runtime-summary-service.ts +59 -16
  85. package/src/service/subagent-workflow/index.ts +0 -41
  86. package/src/service/subagent-workflow/types.ts +9 -120
  87. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  88. package/src/service/workflow-watchdog.ts +0 -43
  89. package/src/types/event-payload.ts +16 -74
  90. package/src/types/event-types.ts +39 -547
  91. package/src/types/hygiene-types.ts +7 -30
  92. package/src/types/principle-tree-schema.ts +20 -222
  93. package/src/types/queue.ts +15 -70
  94. package/src/types/runtime-summary.ts +5 -49
  95. package/src/utils/io.ts +10 -0
  96. package/src/utils/retry.ts +1 -1
  97. package/src/utils/shadow-fingerprint.ts +2 -2
  98. package/src/utils/workspace-resolver.ts +50 -0
  99. package/templates/langs/en/core/AGENTS.md +2 -2
  100. package/templates/langs/en/core/BOOT.md +1 -1
  101. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  102. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  103. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  104. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  105. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  107. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  108. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  109. package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
  110. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  111. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  112. package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  113. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  114. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  115. package/templates/langs/zh/core/AGENTS.md +2 -2
  116. package/templates/langs/zh/core/BOOT.md +1 -1
  117. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  118. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  119. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  120. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  121. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  127. package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
  128. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  129. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  130. package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  131. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  132. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  133. package/tests/build-artifacts.test.ts +1 -3
  134. package/tests/commands/evolution-status.test.ts +0 -118
  135. package/tests/core/bootstrap-rules.test.ts +1 -1
  136. package/tests/core/config.test.ts +1 -1
  137. package/tests/core/event-log.test.ts +35 -0
  138. package/tests/core/evolution-engine.test.ts +610 -0
  139. package/tests/core/file-store.test.ts +102 -0
  140. package/tests/core/focus-history.test.ts +203 -11
  141. package/tests/core/merge-gate-audit.test.ts +2 -169
  142. package/tests/core/model-deployment-registry.test.ts +7 -1
  143. package/tests/core/model-training-registry.test.ts +19 -0
  144. package/tests/core/observability.test.ts +0 -1
  145. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  146. package/tests/core/pain.test.ts +0 -1
  147. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  148. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  149. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  150. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  151. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  152. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  153. package/tests/core/reflection-context.test.ts +0 -14
  154. package/tests/core/replay-engine.test.ts +127 -215
  155. package/tests/core/rule-host-helpers.test.ts +2 -2
  156. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  157. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  158. package/tests/core/workspace-dir-validation.test.ts +8 -1
  159. package/tests/core-anti-growth.test.ts +192 -0
  160. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  161. package/tests/hooks/confirm-first-gate.test.ts +333 -0
  162. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  163. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  164. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  165. package/tests/hooks/pain.test.ts +269 -12
  166. package/tests/hooks/prompt-characterization.test.ts +500 -0
  167. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  168. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  169. package/tests/index.test.ts +94 -1
  170. package/tests/integration/auto-entry-gate.test.ts +248 -0
  171. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  172. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  173. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  174. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  175. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  176. package/tests/service/central-database.test.ts +457 -0
  177. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  178. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  179. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  180. package/tests/service/monitoring-query-service.test.ts +1 -47
  181. package/tests/service/queue-io.test.ts +1 -62
  182. package/tests/service/runtime-summary-service.test.ts +3 -1
  183. package/tests/service/workflow-watchdog.test.ts +0 -91
  184. package/tests/utils/file-lock.test.ts +5 -3
  185. package/tests/utils/session-key.test.ts +52 -0
  186. package/tests/utils/subagent-probe.test.ts +48 -1
  187. package/vitest.config.ts +4 -11
  188. package/.planning/codebase/ARCHITECTURE.md +0 -157
  189. package/.planning/codebase/CONCERNS.md +0 -145
  190. package/.planning/codebase/CONVENTIONS.md +0 -148
  191. package/.planning/codebase/INTEGRATIONS.md +0 -81
  192. package/.planning/codebase/STACK.md +0 -87
  193. package/.planning/codebase/STRUCTURE.md +0 -193
  194. package/.planning/codebase/TESTING.md +0 -243
  195. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  196. package/docs/COMMAND_REFERENCE.md +0 -76
  197. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  198. package/scripts/build-web.mjs +0 -46
  199. package/scripts/diagnose-nocturnal.mjs +0 -537
  200. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  201. package/src/commands/nocturnal-review.ts +0 -322
  202. package/src/commands/nocturnal-rollout.ts +0 -790
  203. package/src/commands/nocturnal-train.ts +0 -986
  204. package/src/commands/pd-reflect.ts +0 -88
  205. package/src/core/adaptive-thresholds.ts +0 -478
  206. package/src/core/diagnostician-task-store.ts +0 -192
  207. package/src/core/nocturnal-arbiter.ts +0 -715
  208. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  209. package/src/core/nocturnal-artificer.ts +0 -257
  210. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  211. package/src/core/nocturnal-compliance.ts +0 -1146
  212. package/src/core/nocturnal-dataset.ts +0 -763
  213. package/src/core/nocturnal-executability.ts +0 -428
  214. package/src/core/nocturnal-export.ts +0 -499
  215. package/src/core/nocturnal-paths.ts +0 -240
  216. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  217. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  218. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  219. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  220. package/src/core/nocturnal-trinity-types.ts +0 -218
  221. package/src/core/nocturnal-trinity.ts +0 -2680
  222. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  223. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  224. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  225. package/src/http/principles-console-route.ts +0 -709
  226. package/src/service/central-health-service.ts +0 -49
  227. package/src/service/central-overview-service.ts +0 -138
  228. package/src/service/control-ui-query-service.ts +0 -900
  229. package/src/service/cooldown-strategy.ts +0 -97
  230. package/src/service/evolution-pain-context.ts +0 -79
  231. package/src/service/evolution-query-service.ts +0 -407
  232. package/src/service/health-query-service.ts +0 -1038
  233. package/src/service/nocturnal-config.ts +0 -214
  234. package/src/service/nocturnal-runtime.ts +0 -734
  235. package/src/service/nocturnal-service.ts +0 -1605
  236. package/src/service/nocturnal-target-selector.ts +0 -545
  237. package/src/service/sleep-cycle.ts +0 -157
  238. package/src/service/startup-reconciler.ts +0 -112
  239. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  240. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  241. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  242. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  243. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  244. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  245. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  246. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  247. package/src/tools/write-pain-flag.ts +0 -215
  248. package/tests/commands/nocturnal-review.test.ts +0 -448
  249. package/tests/commands/nocturnal-train.test.ts +0 -97
  250. package/tests/commands/pd-reflect.test.ts +0 -49
  251. package/tests/core/adaptive-thresholds.test.ts +0 -261
  252. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  253. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  254. package/tests/core/nocturnal-artificer.test.ts +0 -241
  255. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  256. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  257. package/tests/core/nocturnal-compliance.test.ts +0 -646
  258. package/tests/core/nocturnal-dataset.test.ts +0 -892
  259. package/tests/core/nocturnal-e2e.test.ts +0 -234
  260. package/tests/core/nocturnal-executability.test.ts +0 -357
  261. package/tests/core/nocturnal-export.test.ts +0 -517
  262. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  263. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  264. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  265. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  266. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  267. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  268. package/tests/core/pain-auto-repair.test.ts +0 -96
  269. package/tests/core/pain-integration.test.ts +0 -510
  270. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  271. package/tests/http/principles-console-route.test.ts +0 -162
  272. package/tests/integration/chaos-resilience.test.ts +0 -348
  273. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  274. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  275. package/tests/service/control-ui-query-service.test.ts +0 -121
  276. package/tests/service/cooldown-strategy.test.ts +0 -164
  277. package/tests/service/data-endpoints-regression.test.ts +0 -834
  278. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  279. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  280. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  281. package/tests/service/nocturnal-runtime.test.ts +0 -473
  282. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  283. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  284. package/tests/service/startup-reconciler.test.ts +0 -148
  285. package/tests/tools/write-pain-flag.test.ts +0 -358
  286. package/ui/src/App.tsx +0 -45
  287. package/ui/src/api.ts +0 -220
  288. package/ui/src/charts.tsx +0 -955
  289. package/ui/src/components/ErrorState.tsx +0 -6
  290. package/ui/src/components/Loading.tsx +0 -13
  291. package/ui/src/components/ProtectedRoute.tsx +0 -12
  292. package/ui/src/components/Shell.tsx +0 -91
  293. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  294. package/ui/src/components/index.ts +0 -5
  295. package/ui/src/context/auth.tsx +0 -80
  296. package/ui/src/context/theme.tsx +0 -66
  297. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  298. package/ui/src/i18n/ui.ts +0 -473
  299. package/ui/src/main.tsx +0 -16
  300. package/ui/src/pages/EvolutionPage.tsx +0 -333
  301. package/ui/src/pages/FeedbackPage.tsx +0 -138
  302. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  303. package/ui/src/pages/LoginPage.tsx +0 -89
  304. package/ui/src/pages/OverviewPage.tsx +0 -599
  305. package/ui/src/pages/SamplesPage.tsx +0 -174
  306. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  307. package/ui/src/styles.css +0 -2020
  308. package/ui/src/types.ts +0 -384
  309. package/ui/src/utils/format.ts +0 -15
@@ -1,322 +0,0 @@
1
- /**
2
- * Nocturnal Review Command — Human Review Queue for Nocturnal Dataset
3
- * =================================================================
4
- *
5
- * PURPOSE: Provide human review gateway before training export.
6
- * Reviews operate on nocturnal dataset records, NOT on artifact files directly.
7
- *
8
- * COMMAND SHAPE:
9
- * pd-nocturnal-review list — list pending review samples
10
- * pd-nocturnal-review approve <fingerprint> [reason] — approve for training
11
- * pd-nocturnal-review reject <fingerprint> [reason] — reject sample
12
- * pd-nocturnal-review show <fingerprint> — show sample lineage summary
13
- * pd-nocturnal-review set-family <fingerprint> <family> — set target model family
14
- * pd-nocturnal-review stats — show dataset statistics
15
- *
16
- * DESIGN CONSTRAINTS:
17
- * - Review state lives in dataset registry, not in artifacts
18
- * - approve/reject require reason (unless default is provided)
19
- * - Rejected samples cannot enter export
20
- * - Superseded samples cannot enter export
21
- * - No Web UI (CLI only)
22
- */
23
-
24
- import * as fs from 'fs';
25
- import * as path from 'path';
26
- import {
27
- listDatasetRecords,
28
- getDatasetRecord,
29
- updateReviewStatus,
30
- updateTargetModelFamily,
31
- getDatasetStats,
32
- type NocturnalDatasetRecord,
33
- type NocturnalReviewStatus,
34
- } from '../core/nocturnal-dataset.js';
35
- import { getPrincipleState, setPrincipleState } from '../core/principle-training-state.js';
36
- import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
37
- import { resolvePluginCommandWorkspaceDir } from '../utils/workspace-resolver.js';
38
-
39
- function isZh(ctx: PluginCommandContext): boolean {
40
- return String(ctx.config?.language || 'en').startsWith('zh');
41
- }
42
-
43
- function formatRecord(record: NocturnalDatasetRecord, includeDetails = false): string {
44
- const lines: string[] = [];
45
-
46
- lines.push(` sampleFingerprint: ${record.sampleFingerprint.substring(0, 16)}...`);
47
- lines.push(` artifactId: ${record.artifactId}`);
48
- lines.push(` sessionId: ${record.sessionId}`);
49
- lines.push(` principleId: ${record.principleId}`);
50
- lines.push(` targetModelFamily: ${record.targetModelFamily ?? '(none)'}`);
51
- lines.push(` reviewStatus: ${record.reviewStatus}`);
52
- if (record.reviewReason) {
53
- lines.push(` reviewReason: ${record.reviewReason}`);
54
- }
55
- lines.push(` createdAt: ${new Date(record.createdAt).toLocaleString('en-US')}`);
56
-
57
- if (includeDetails) {
58
- const {artifactPath} = record;
59
- if (fs.existsSync(artifactPath)) {
60
- try {
61
- const content = fs.readFileSync(artifactPath, 'utf-8');
62
- const artifact = JSON.parse(content);
63
- lines.push(` artifact: ${artifactPath}`);
64
- if (artifact.badDecision) {
65
- lines.push(` badDecision: ${artifact.badDecision.substring(0, 80)}...`);
66
- }
67
- if (artifact.betterDecision) {
68
- lines.push(` betterDecision: ${artifact.betterDecision.substring(0, 80)}...`);
69
- }
70
- if (artifact.rationale) {
71
- lines.push(` rationale: ${artifact.rationale.substring(0, 80)}...`);
72
- }
73
- } catch {
74
- lines.push(` artifact: (could not read)`);
75
- }
76
- } else {
77
- lines.push(` artifact: ${artifactPath} (MISSING)`);
78
- }
79
- }
80
-
81
- return lines.join('\n');
82
- }
83
-
84
- function statusLabel(status: NocturnalReviewStatus, zh: boolean): string {
85
- const labels: Record<NocturnalReviewStatus, { zh: string; en: string }> = {
86
- pending_review: { zh: '待审核', en: 'pending_review' },
87
- approved_for_training: { zh: '已批准', en: 'approved_for_training' },
88
- rejected: { zh: '已拒绝', en: 'rejected' },
89
- superseded: { zh: '已替代', en: 'superseded' },
90
- };
91
- return labels[status][zh ? 'zh' : 'en'];
92
- }
93
-
94
- export function handleNocturnalReviewCommand(ctx: PluginCommandContext): PluginCommandResult {
95
- const workspaceDir = resolvePluginCommandWorkspaceDir(ctx, 'nocturnal-review');
96
- const zh = isZh(ctx);
97
- const args = (ctx.args || '').trim();
98
- const parts = args.split(/\s+/).filter(Boolean);
99
- const [action = 'list'] = parts;
100
-
101
- try {
102
- if (action === 'list') {
103
- const pending = listDatasetRecords(workspaceDir, { reviewStatus: 'pending_review' });
104
- const all = listDatasetRecords(workspaceDir);
105
-
106
- if (pending.length === 0) {
107
- return {
108
- text: zh
109
- ? '没有待审核的 nocturnal 样本。'
110
- : 'No pending nocturnal samples for review.',
111
- };
112
- }
113
-
114
- const lines = pending.map((r) => {
115
- const label = statusLabel(r.reviewStatus, zh);
116
- return `[${label}] ${r.sampleFingerprint.substring(0, 16)}... | ${r.principleId} | ${r.targetModelFamily ?? '(no family)'}`;
117
- });
118
-
119
- return {
120
- text: zh
121
- ? `待审核样本 (${pending.length}/${all.length}):\n${lines.join('\n')}\n\n使用 /pd-nocturnal-review show <fingerprint> 查看详情。`
122
- : `Pending review samples (${pending.length}/${all.length}):\n${lines.join('\n')}\n\nUse /pd-nocturnal-review show <fingerprint> for details.`,
123
- };
124
- }
125
-
126
- if (action === 'show') {
127
- const [, fingerprint] = parts;
128
- if (!fingerprint) {
129
- return {
130
- text: zh
131
- ? '用法: /pd-nocturnal-review show <fingerprint>'
132
- : 'Usage: /pd-nocturnal-review show <fingerprint>',
133
- };
134
- }
135
-
136
- const record = getDatasetRecord(workspaceDir, fingerprint);
137
- if (!record) {
138
- return {
139
- text: zh
140
- ? `未找到样本: ${fingerprint}`
141
- : `Sample not found: ${fingerprint}`,
142
- };
143
- }
144
-
145
- const details = formatRecord(record, true);
146
- return {
147
- text: zh
148
- ? `样本详情:\n${details}`
149
- : `Sample details:\n${details}`,
150
- };
151
- }
152
-
153
- if (action === 'approve') {
154
- const [, fingerprint] = parts;
155
- const reason = parts.slice(2).join(' ') || (zh ? 'Approved by human reviewer' : 'Approved by human reviewer');
156
-
157
- if (!fingerprint) {
158
- return {
159
- text: zh
160
- ? '用法: /pd-nocturnal-review approve <fingerprint> [reason]'
161
- : 'Usage: /pd-nocturnal-review approve <fingerprint> [reason]',
162
- };
163
- }
164
-
165
- const record = getDatasetRecord(workspaceDir, fingerprint);
166
- if (!record) {
167
- return {
168
- text: zh
169
- ? `未找到样本: ${fingerprint}`
170
- : `Sample not found: ${fingerprint}`,
171
- };
172
- }
173
-
174
- if (record.reviewStatus === 'approved_for_training') {
175
- return {
176
- text: zh
177
- ? `样本已是 approved_for_training 状态。`
178
- : `Sample is already approved_for_training.`,
179
- };
180
- }
181
-
182
- if (record.reviewStatus === 'rejected') {
183
- return {
184
- text: zh
185
- ? `样本已被 rejected,需要先重置为 pending_review 才能重新审核。`
186
- : `Sample is rejected. Reset to pending_review first before re-reviewing.`,
187
- };
188
- }
189
-
190
- if (record.reviewStatus === 'superseded') {
191
- return {
192
- text: zh
193
- ? `样本已被 superseded,无法更改。`
194
- : `Sample is superseded and cannot be changed.`,
195
- };
196
- }
197
-
198
- const updated = updateReviewStatus(workspaceDir, fingerprint, 'approved_for_training', reason);
199
-
200
- // #251: Sync approvedSampleCount in training store
201
- try {
202
- const stateDir = path.join(workspaceDir, '.state');
203
- const state = getPrincipleState(stateDir, updated.principleId);
204
- state.approvedSampleCount += 1;
205
- setPrincipleState(stateDir, state);
206
- } catch (err) {
207
- console.warn(`[nocturnal-review] Failed to sync approvedSampleCount for ${updated.principleId}:`, err instanceof Error ? err.stack : err);
208
- }
209
-
210
- return {
211
- text: zh
212
- ? `样本已批准用于训练:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n principleId: ${updated.principleId}\n targetModelFamily: ${updated.targetModelFamily ?? '(none)'}\n reason: ${updated.reviewReason}`
213
- : `Sample approved for training:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n principleId: ${updated.principleId}\n targetModelFamily: ${updated.targetModelFamily ?? '(none)'}\n reason: ${updated.reviewReason}`,
214
- };
215
- }
216
-
217
- if (action === 'reject') {
218
- const [, fingerprint] = parts;
219
- const reason = parts.slice(2).join(' ') || (zh ? 'Rejected by human reviewer' : 'Rejected by human reviewer');
220
-
221
- if (!fingerprint) {
222
- return {
223
- text: zh
224
- ? '用法: /pd-nocturnal-review reject <fingerprint> [reason]'
225
- : 'Usage: /pd-nocturnal-review reject <fingerprint> [reason]',
226
- };
227
- }
228
-
229
- const record = getDatasetRecord(workspaceDir, fingerprint);
230
- if (!record) {
231
- return {
232
- text: zh
233
- ? `未找到样本: ${fingerprint}`
234
- : `Sample not found: ${fingerprint}`,
235
- };
236
- }
237
-
238
- if (record.reviewStatus === 'rejected') {
239
- return {
240
- text: zh
241
- ? `样本已是 rejected 状态。`
242
- : `Sample is already rejected.`,
243
- };
244
- }
245
-
246
- if (record.reviewStatus === 'superseded') {
247
- return {
248
- text: zh
249
- ? `样本已被 superseded,无法更改。`
250
- : `Sample is superseded and cannot be changed.`,
251
- };
252
- }
253
-
254
- const updated = updateReviewStatus(workspaceDir, fingerprint, 'rejected', reason);
255
-
256
- return {
257
- text: zh
258
- ? `样本已拒绝:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n reason: ${updated.reviewReason}`
259
- : `Sample rejected:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n reason: ${updated.reviewReason}`,
260
- };
261
- }
262
-
263
- if (action === 'set-family') {
264
- const [, fingerprint, family] = parts;
265
-
266
- if (!fingerprint || !family) {
267
- return {
268
- text: zh
269
- ? '用法: /pd-nocturnal-review set-family <fingerprint> <model-family>'
270
- : 'Usage: /pd-nocturnal-review set-family <fingerprint> <model-family>',
271
- };
272
- }
273
-
274
- const record = getDatasetRecord(workspaceDir, fingerprint);
275
- if (!record) {
276
- return {
277
- text: zh
278
- ? `未找到样本: ${fingerprint}`
279
- : `Sample not found: ${fingerprint}`,
280
- };
281
- }
282
-
283
- if (record.reviewStatus === 'superseded') {
284
- return {
285
- text: zh
286
- ? `样本已被 superseded,无法修改模型家族。`
287
- : `Sample is superseded and cannot be modified.`,
288
- };
289
- }
290
-
291
- const updated = updateTargetModelFamily(workspaceDir, fingerprint, family);
292
-
293
- return {
294
- text: zh
295
- ? `已设置目标模型家族:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n targetModelFamily: ${updated.targetModelFamily}`
296
- : `Target model family set:\n fingerprint: ${updated.sampleFingerprint.substring(0, 16)}...\n targetModelFamily: ${updated.targetModelFamily}`,
297
- };
298
- }
299
-
300
- if (action === 'stats') {
301
- const stats = getDatasetStats(workspaceDir);
302
-
303
- return {
304
- text: zh
305
- ? `Nocturnal Dataset 统计:\n 总样本数: ${stats.total}\n 待审核: ${stats.pendingReview}\n 已批准训练: ${stats.approvedForTraining}\n 已拒绝: ${stats.rejected}\n 已替代: ${stats.superseded}\n 可导出 (按家族): ${Object.entries(stats.exportReadyByFamily).map(([f, c]) => `${f}: ${c}`).join(', ') || '无'}`
306
- : `Nocturnal Dataset Stats:\n Total: ${stats.total}\n Pending review: ${stats.pendingReview}\n Approved for training: ${stats.approvedForTraining}\n Rejected: ${stats.rejected}\n Superseded: ${stats.superseded}\n Export-ready (by family): ${Object.entries(stats.exportReadyByFamily).map(([f, c]) => `${f}: ${c}`).join(', ') || 'none'}`,
307
- };
308
- }
309
-
310
- return {
311
- text: zh
312
- ? `未知操作: ${action}\n用法:\n /pd-nocturnal-review list\n /pd-nocturnal-review show <fingerprint>\n /pd-nocturnal-review approve <fingerprint> [reason]\n /pd-nocturnal-review reject <fingerprint> [reason]\n /pd-nocturnal-review set-family <fingerprint> <model-family>\n /pd-nocturnal-review stats`
313
- : `Unknown action: ${action}\nUsage:\n /pd-nocturnal-review list\n /pd-nocturnal-review show <fingerprint>\n /pd-nocturnal-review approve <fingerprint> [reason]\n /pd-nocturnal-review reject <fingerprint> [reason]\n /pd-nocturnal-review set-family <fingerprint> <model-family>\n /pd-nocturnal-review stats`,
314
- };
315
- } catch (err) {
316
- return {
317
- text: zh
318
- ? `审核操作失败: ${String(err)}`
319
- : `Review operation failed: ${String(err)}`,
320
- };
321
- }
322
- }