principles-disciple 1.8.1 → 1.8.2

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 (470) hide show
  1. package/ADVANCED_CONFIG_ZH.md +97 -0
  2. package/AGENT_INSTALL.md +173 -0
  3. package/AGENT_INSTALL_EN.md +173 -0
  4. package/INSTALL.md +256 -0
  5. package/SKILL.md +63 -0
  6. package/docs/COMMAND_REFERENCE.md +76 -0
  7. package/docs/COMMAND_REFERENCE_EN.md +79 -0
  8. package/esbuild.config.js +75 -0
  9. package/openclaw.plugin.json +4 -4
  10. package/package.json +11 -13
  11. package/scripts/build-web.mjs +46 -0
  12. package/scripts/install-dependencies.cjs +47 -0
  13. package/scripts/sync-plugin.mjs +802 -0
  14. package/scripts/verify-build.mjs +109 -0
  15. package/src/agents/nocturnal-dreamer.md +152 -0
  16. package/src/agents/nocturnal-philosopher.md +138 -0
  17. package/src/agents/nocturnal-reflector.md +126 -0
  18. package/src/agents/nocturnal-scribe.md +164 -0
  19. package/src/commands/capabilities.ts +85 -0
  20. package/{dist/commands/context.js → src/commands/context.ts} +78 -38
  21. package/src/commands/evolution-status.ts +146 -0
  22. package/src/commands/export.ts +111 -0
  23. package/src/commands/focus.ts +533 -0
  24. package/src/commands/nocturnal-review.ts +311 -0
  25. package/src/commands/nocturnal-rollout.ts +763 -0
  26. package/src/commands/nocturnal-train.ts +1002 -0
  27. package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
  28. package/src/commands/principle-rollback.ts +27 -0
  29. package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
  30. package/src/commands/samples.ts +60 -0
  31. package/src/commands/strategy.ts +38 -0
  32. package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
  33. package/src/commands/workflow-debug.ts +128 -0
  34. package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
  35. package/src/config/errors.ts +163 -0
  36. package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
  37. package/src/constants/diagnostician.ts +66 -0
  38. package/src/constants/tools.ts +62 -0
  39. package/src/core/adaptive-thresholds.ts +476 -0
  40. package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
  41. package/{dist/core/config.js → src/core/config.ts} +158 -46
  42. package/src/core/control-ui-db.ts +435 -0
  43. package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
  44. package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
  45. package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
  46. package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
  47. package/src/core/empathy-keyword-matcher.ts +327 -0
  48. package/src/core/empathy-types.ts +218 -0
  49. package/src/core/event-log.ts +544 -0
  50. package/src/core/evolution-engine.ts +612 -0
  51. package/src/core/evolution-logger.ts +353 -0
  52. package/src/core/evolution-migration.ts +77 -0
  53. package/src/core/evolution-reducer.ts +731 -0
  54. package/src/core/evolution-types.ts +456 -0
  55. package/src/core/external-training-contract.ts +527 -0
  56. package/src/core/focus-history.ts +1458 -0
  57. package/src/core/hygiene/tracker.ts +117 -0
  58. package/{dist/core/init.js → src/core/init.ts} +39 -26
  59. package/src/core/local-worker-routing.ts +617 -0
  60. package/{dist/core/migration.js → src/core/migration.ts} +18 -11
  61. package/src/core/model-deployment-registry.ts +722 -0
  62. package/src/core/model-training-registry.ts +813 -0
  63. package/src/core/nocturnal-arbiter.ts +706 -0
  64. package/src/core/nocturnal-candidate-scoring.ts +392 -0
  65. package/src/core/nocturnal-compliance.ts +1075 -0
  66. package/src/core/nocturnal-dataset.ts +668 -0
  67. package/src/core/nocturnal-executability.ts +428 -0
  68. package/src/core/nocturnal-export.ts +390 -0
  69. package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
  70. package/src/core/nocturnal-trajectory-extractor.ts +484 -0
  71. package/src/core/nocturnal-trinity.ts +1384 -0
  72. package/src/core/pain.ts +122 -0
  73. package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
  74. package/{dist/core/paths.js → src/core/paths.ts} +13 -4
  75. package/src/core/principle-training-state.ts +450 -0
  76. package/src/core/profile.ts +226 -0
  77. package/src/core/promotion-gate.ts +822 -0
  78. package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
  79. package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +175 -62
  80. package/src/core/shadow-observation-registry.ts +534 -0
  81. package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
  82. package/src/core/thinking-models.ts +217 -0
  83. package/src/core/training-program.ts +630 -0
  84. package/src/core/trajectory-types.ts +243 -0
  85. package/src/core/trajectory.ts +1673 -0
  86. package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
  87. package/src/hooks/bash-risk.ts +171 -0
  88. package/src/hooks/edit-verification.ts +295 -0
  89. package/src/hooks/gate-block-helper.ts +160 -0
  90. package/src/hooks/gate.ts +210 -0
  91. package/src/hooks/gfi-gate.ts +177 -0
  92. package/src/hooks/lifecycle.ts +326 -0
  93. package/{dist/hooks/llm.js → src/hooks/llm.ts} +160 -80
  94. package/src/hooks/message-sanitize.ts +45 -0
  95. package/src/hooks/pain.ts +384 -0
  96. package/src/hooks/progressive-trust-gate.ts +174 -0
  97. package/src/hooks/prompt.ts +920 -0
  98. package/src/hooks/subagent.ts +207 -0
  99. package/src/hooks/thinking-checkpoint.ts +73 -0
  100. package/src/hooks/trajectory-collector.ts +290 -0
  101. package/src/http/principles-console-route.ts +716 -0
  102. package/src/i18n/commands.ts +117 -0
  103. package/src/index.ts +694 -0
  104. package/src/service/central-database.ts +831 -0
  105. package/src/service/control-ui-query-service.ts +888 -0
  106. package/src/service/evolution-query-service.ts +405 -0
  107. package/src/service/evolution-worker.ts +1646 -0
  108. package/src/service/health-query-service.ts +836 -0
  109. package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +235 -79
  110. package/src/service/nocturnal-service.ts +1015 -0
  111. package/src/service/nocturnal-target-selector.ts +532 -0
  112. package/src/service/phase3-input-filter.ts +237 -0
  113. package/src/service/runtime-summary-service.ts +757 -0
  114. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
  115. package/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
  116. package/src/service/subagent-workflow/index.ts +51 -0
  117. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
  118. package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
  119. package/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
  120. package/src/service/subagent-workflow/workflow-store.ts +328 -0
  121. package/src/service/trajectory-service.ts +15 -0
  122. package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
  123. package/src/tools/deep-reflect.ts +349 -0
  124. package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
  125. package/src/types/event-types.ts +453 -0
  126. package/src/types/hygiene-types.ts +31 -0
  127. package/src/types/principle-tree-schema.ts +244 -0
  128. package/src/types/runtime-summary.ts +49 -0
  129. package/src/types.ts +74 -0
  130. package/src/utils/file-lock.ts +391 -0
  131. package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
  132. package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
  133. package/src/utils/io.ts +110 -0
  134. package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
  135. package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
  136. package/src/utils/subagent-probe.ts +94 -0
  137. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  138. package/templates/pain_settings.json +2 -1
  139. package/tests/README.md +120 -0
  140. package/tests/build-artifacts.test.ts +111 -0
  141. package/tests/commands/evolution-status.test.ts +222 -0
  142. package/tests/commands/evolver.test.ts +22 -0
  143. package/tests/commands/export.test.ts +78 -0
  144. package/tests/commands/nocturnal-review.test.ts +448 -0
  145. package/tests/commands/nocturnal-train.test.ts +97 -0
  146. package/tests/commands/pain.test.ts +108 -0
  147. package/tests/commands/samples.test.ts +65 -0
  148. package/tests/commands/strategy.test.ts +34 -0
  149. package/tests/commands/thinking-os.test.ts +88 -0
  150. package/tests/core/adaptive-thresholds.test.ts +261 -0
  151. package/tests/core/config-service.test.ts +89 -0
  152. package/tests/core/config.test.ts +90 -0
  153. package/tests/core/control-ui-db.test.ts +75 -0
  154. package/tests/core/core-template-guidance.test.ts +21 -0
  155. package/tests/core/detection-funnel.test.ts +63 -0
  156. package/tests/core/detection-service.test.ts +50 -0
  157. package/tests/core/dictionary-service.test.ts +116 -0
  158. package/tests/core/dictionary.test.ts +168 -0
  159. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  160. package/tests/core/event-log.test.ts +181 -0
  161. package/tests/core/evolution-e2e.test.ts +58 -0
  162. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  163. package/tests/core/evolution-engine.test.ts +562 -0
  164. package/tests/core/evolution-logger.test.ts +148 -0
  165. package/tests/core/evolution-migration.test.ts +50 -0
  166. package/tests/core/evolution-paths.test.ts +21 -0
  167. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  168. package/tests/core/evolution-reducer.test.ts +180 -0
  169. package/tests/core/evolution-types-loop.test.ts +48 -0
  170. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  171. package/tests/core/external-training-contract.test.ts +463 -0
  172. package/tests/core/focus-history.test.ts +682 -0
  173. package/tests/core/init-flatten.test.ts +69 -0
  174. package/tests/core/init-refactor.test.ts +87 -0
  175. package/tests/core/init-v1.3.test.ts +46 -0
  176. package/tests/core/init.test.ts +190 -0
  177. package/tests/core/local-worker-routing.test.ts +757 -0
  178. package/tests/core/migration.test.ts +84 -0
  179. package/tests/core/model-deployment-registry.test.ts +845 -0
  180. package/tests/core/model-training-registry.test.ts +889 -0
  181. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  182. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  183. package/tests/core/nocturnal-compliance.test.ts +646 -0
  184. package/tests/core/nocturnal-dataset.test.ts +892 -0
  185. package/tests/core/nocturnal-executability.test.ts +357 -0
  186. package/tests/core/nocturnal-export.test.ts +462 -0
  187. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  188. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  189. package/tests/core/nocturnal-trinity.test.ts +953 -0
  190. package/tests/core/pain.test.ts +33 -0
  191. package/tests/core/path-resolver.test.ts +57 -0
  192. package/tests/core/paths-refactor.test.ts +42 -0
  193. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  194. package/tests/core/principle-training-state.test.ts +712 -0
  195. package/tests/core/profile.test.ts +56 -0
  196. package/tests/core/promotion-gate.test.ts +556 -0
  197. package/tests/core/risk-calculator.test.ts +168 -0
  198. package/tests/core/session-tracker.test.ts +191 -0
  199. package/tests/core/training-program.test.ts +472 -0
  200. package/tests/core/trajectory.test.ts +265 -0
  201. package/tests/core/workspace-context-factory.test.ts +18 -0
  202. package/tests/core/workspace-context.test.ts +134 -0
  203. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  204. package/tests/fixtures/production-compatibility.test.ts +147 -0
  205. package/tests/fixtures/production-mock-generator.ts +282 -0
  206. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  207. package/tests/hooks/bash-risk.test.ts +81 -0
  208. package/tests/hooks/edit-verification.test.ts +678 -0
  209. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  210. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  211. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  212. package/tests/hooks/gate.test.ts +271 -0
  213. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  214. package/tests/hooks/gfi-gate.test.ts +669 -0
  215. package/tests/hooks/lifecycle.test.ts +248 -0
  216. package/tests/hooks/llm.test.ts +308 -0
  217. package/tests/hooks/message-sanitize.test.ts +36 -0
  218. package/tests/hooks/pain.test.ts +141 -0
  219. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  220. package/tests/hooks/prompt.test.ts +1411 -0
  221. package/tests/hooks/subagent.test.ts +467 -0
  222. package/tests/hooks/thinking-gate.test.ts +313 -0
  223. package/tests/http/principles-console-route.test.ts +140 -0
  224. package/tests/hygiene-tracker.test.ts +77 -0
  225. package/tests/index.integration.test.ts +179 -0
  226. package/tests/index.shadow-routing.integration.test.ts +140 -0
  227. package/tests/index.test.ts +9 -0
  228. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  229. package/tests/service/control-ui-query-service.test.ts +121 -0
  230. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  231. package/tests/service/evolution-worker.test.ts +585 -0
  232. package/tests/service/nocturnal-runtime.test.ts +470 -0
  233. package/tests/service/nocturnal-service.test.ts +577 -0
  234. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  235. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  236. package/tests/service/phase3-input-filter.test.ts +289 -0
  237. package/tests/service/runtime-summary-service.test.ts +919 -0
  238. package/tests/task-compliance.test.ts +166 -0
  239. package/tests/test-utils.ts +48 -0
  240. package/tests/tools/critique-prompt.test.ts +260 -0
  241. package/tests/tools/deep-reflect.test.ts +232 -0
  242. package/tests/tools/model-index.test.ts +246 -0
  243. package/tests/ui/app.test.tsx +114 -0
  244. package/tests/utils/file-lock.test.ts +407 -0
  245. package/tests/utils/hashing.test.ts +32 -0
  246. package/tests/utils/io.test.ts +39 -0
  247. package/tests/utils/nlp.test.ts +53 -0
  248. package/tests/utils/plugin-logger.test.ts +156 -0
  249. package/tsconfig.json +16 -0
  250. package/tsconfig.tsbuildinfo +1 -0
  251. package/ui/src/App.tsx +45 -0
  252. package/ui/src/api.ts +216 -0
  253. package/ui/src/charts.tsx +586 -0
  254. package/ui/src/components/ErrorState.tsx +6 -0
  255. package/ui/src/components/Loading.tsx +13 -0
  256. package/ui/src/components/ProtectedRoute.tsx +12 -0
  257. package/ui/src/components/Shell.tsx +91 -0
  258. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  259. package/ui/src/components/index.ts +5 -0
  260. package/ui/src/context/auth.tsx +80 -0
  261. package/ui/src/context/theme.tsx +66 -0
  262. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  263. package/ui/src/i18n/ui.ts +363 -0
  264. package/ui/src/main.tsx +16 -0
  265. package/ui/src/pages/EvolutionPage.tsx +352 -0
  266. package/ui/src/pages/FeedbackPage.tsx +140 -0
  267. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  268. package/ui/src/pages/LoginPage.tsx +88 -0
  269. package/ui/src/pages/OverviewPage.tsx +238 -0
  270. package/ui/src/pages/SamplesPage.tsx +174 -0
  271. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  272. package/ui/src/styles.css +1661 -0
  273. package/ui/src/types.ts +368 -0
  274. package/ui/src/utils/format.ts +15 -0
  275. package/vitest.config.ts +23 -0
  276. package/dist/commands/capabilities.d.ts +0 -3
  277. package/dist/commands/capabilities.js +0 -73
  278. package/dist/commands/context.d.ts +0 -5
  279. package/dist/commands/evolution-status.d.ts +0 -4
  280. package/dist/commands/evolution-status.js +0 -117
  281. package/dist/commands/evolver.d.ts +0 -9
  282. package/dist/commands/evolver.js +0 -26
  283. package/dist/commands/export.d.ts +0 -2
  284. package/dist/commands/export.js +0 -98
  285. package/dist/commands/focus.d.ts +0 -14
  286. package/dist/commands/focus.js +0 -457
  287. package/dist/commands/nocturnal-review.d.ts +0 -24
  288. package/dist/commands/nocturnal-review.js +0 -265
  289. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  290. package/dist/commands/nocturnal-rollout.js +0 -671
  291. package/dist/commands/nocturnal-train.d.ts +0 -25
  292. package/dist/commands/nocturnal-train.js +0 -919
  293. package/dist/commands/pain.d.ts +0 -5
  294. package/dist/commands/principle-rollback.d.ts +0 -4
  295. package/dist/commands/principle-rollback.js +0 -22
  296. package/dist/commands/rollback.d.ts +0 -19
  297. package/dist/commands/samples.d.ts +0 -2
  298. package/dist/commands/samples.js +0 -55
  299. package/dist/commands/strategy.d.ts +0 -3
  300. package/dist/commands/strategy.js +0 -29
  301. package/dist/commands/thinking-os.d.ts +0 -2
  302. package/dist/config/defaults/runtime.d.ts +0 -40
  303. package/dist/config/errors.d.ts +0 -84
  304. package/dist/config/errors.js +0 -94
  305. package/dist/config/index.js +0 -7
  306. package/dist/constants/diagnostician.d.ts +0 -12
  307. package/dist/constants/diagnostician.js +0 -56
  308. package/dist/constants/tools.d.ts +0 -17
  309. package/dist/constants/tools.js +0 -54
  310. package/dist/core/adaptive-thresholds.d.ts +0 -186
  311. package/dist/core/adaptive-thresholds.js +0 -300
  312. package/dist/core/config-service.d.ts +0 -15
  313. package/dist/core/config.d.ts +0 -129
  314. package/dist/core/control-ui-db.d.ts +0 -95
  315. package/dist/core/control-ui-db.js +0 -292
  316. package/dist/core/detection-funnel.d.ts +0 -33
  317. package/dist/core/detection-service.d.ts +0 -15
  318. package/dist/core/dictionary-service.d.ts +0 -15
  319. package/dist/core/dictionary.d.ts +0 -38
  320. package/dist/core/event-log.d.ts +0 -82
  321. package/dist/core/event-log.js +0 -463
  322. package/dist/core/evolution-engine.d.ts +0 -118
  323. package/dist/core/evolution-engine.js +0 -464
  324. package/dist/core/evolution-logger.d.ts +0 -137
  325. package/dist/core/evolution-logger.js +0 -256
  326. package/dist/core/evolution-migration.d.ts +0 -5
  327. package/dist/core/evolution-migration.js +0 -65
  328. package/dist/core/evolution-reducer.d.ts +0 -98
  329. package/dist/core/evolution-reducer.js +0 -465
  330. package/dist/core/evolution-types.d.ts +0 -287
  331. package/dist/core/evolution-types.js +0 -78
  332. package/dist/core/external-training-contract.d.ts +0 -276
  333. package/dist/core/external-training-contract.js +0 -269
  334. package/dist/core/focus-history.d.ts +0 -210
  335. package/dist/core/focus-history.js +0 -1185
  336. package/dist/core/hygiene/tracker.d.ts +0 -22
  337. package/dist/core/hygiene/tracker.js +0 -106
  338. package/dist/core/init.d.ts +0 -12
  339. package/dist/core/local-worker-routing.d.ts +0 -175
  340. package/dist/core/local-worker-routing.js +0 -525
  341. package/dist/core/migration.d.ts +0 -6
  342. package/dist/core/model-deployment-registry.d.ts +0 -218
  343. package/dist/core/model-deployment-registry.js +0 -503
  344. package/dist/core/model-training-registry.d.ts +0 -295
  345. package/dist/core/model-training-registry.js +0 -475
  346. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  347. package/dist/core/nocturnal-arbiter.js +0 -534
  348. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  349. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  350. package/dist/core/nocturnal-compliance.d.ts +0 -175
  351. package/dist/core/nocturnal-compliance.js +0 -824
  352. package/dist/core/nocturnal-dataset.d.ts +0 -224
  353. package/dist/core/nocturnal-dataset.js +0 -443
  354. package/dist/core/nocturnal-executability.d.ts +0 -85
  355. package/dist/core/nocturnal-executability.js +0 -331
  356. package/dist/core/nocturnal-export.d.ts +0 -124
  357. package/dist/core/nocturnal-export.js +0 -275
  358. package/dist/core/nocturnal-paths.d.ts +0 -124
  359. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  360. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  361. package/dist/core/nocturnal-trinity.d.ts +0 -311
  362. package/dist/core/nocturnal-trinity.js +0 -880
  363. package/dist/core/pain.d.ts +0 -4
  364. package/dist/core/pain.js +0 -70
  365. package/dist/core/path-resolver.d.ts +0 -46
  366. package/dist/core/paths.d.ts +0 -65
  367. package/dist/core/principle-training-state.d.ts +0 -121
  368. package/dist/core/principle-training-state.js +0 -321
  369. package/dist/core/profile.d.ts +0 -62
  370. package/dist/core/profile.js +0 -210
  371. package/dist/core/promotion-gate.d.ts +0 -238
  372. package/dist/core/promotion-gate.js +0 -529
  373. package/dist/core/risk-calculator.d.ts +0 -22
  374. package/dist/core/session-tracker.d.ts +0 -101
  375. package/dist/core/shadow-observation-registry.d.ts +0 -217
  376. package/dist/core/shadow-observation-registry.js +0 -308
  377. package/dist/core/system-logger.d.ts +0 -8
  378. package/dist/core/thinking-models.d.ts +0 -38
  379. package/dist/core/thinking-models.js +0 -170
  380. package/dist/core/training-program.d.ts +0 -233
  381. package/dist/core/training-program.js +0 -433
  382. package/dist/core/trajectory.d.ts +0 -411
  383. package/dist/core/trajectory.js +0 -1307
  384. package/dist/core/workspace-context.d.ts +0 -71
  385. package/dist/hooks/bash-risk.d.ts +0 -57
  386. package/dist/hooks/bash-risk.js +0 -137
  387. package/dist/hooks/edit-verification.d.ts +0 -62
  388. package/dist/hooks/edit-verification.js +0 -256
  389. package/dist/hooks/gate-block-helper.d.ts +0 -44
  390. package/dist/hooks/gate-block-helper.js +0 -119
  391. package/dist/hooks/gate.d.ts +0 -24
  392. package/dist/hooks/gate.js +0 -173
  393. package/dist/hooks/gfi-gate.d.ts +0 -40
  394. package/dist/hooks/gfi-gate.js +0 -113
  395. package/dist/hooks/lifecycle.d.ts +0 -5
  396. package/dist/hooks/lifecycle.js +0 -284
  397. package/dist/hooks/llm.d.ts +0 -13
  398. package/dist/hooks/message-sanitize.d.ts +0 -3
  399. package/dist/hooks/message-sanitize.js +0 -37
  400. package/dist/hooks/pain.d.ts +0 -5
  401. package/dist/hooks/pain.js +0 -301
  402. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  403. package/dist/hooks/progressive-trust-gate.js +0 -134
  404. package/dist/hooks/prompt.d.ts +0 -49
  405. package/dist/hooks/prompt.js +0 -905
  406. package/dist/hooks/subagent.d.ts +0 -10
  407. package/dist/hooks/subagent.js +0 -387
  408. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  409. package/dist/hooks/thinking-checkpoint.js +0 -51
  410. package/dist/hooks/trajectory-collector.d.ts +0 -32
  411. package/dist/hooks/trajectory-collector.js +0 -256
  412. package/dist/http/principles-console-route.d.ts +0 -9
  413. package/dist/http/principles-console-route.js +0 -681
  414. package/dist/i18n/commands.d.ts +0 -26
  415. package/dist/i18n/commands.js +0 -116
  416. package/dist/index.d.ts +0 -7
  417. package/dist/index.js +0 -581
  418. package/dist/service/central-database.d.ts +0 -104
  419. package/dist/service/central-database.js +0 -649
  420. package/dist/service/control-ui-query-service.d.ts +0 -221
  421. package/dist/service/control-ui-query-service.js +0 -543
  422. package/dist/service/empathy-observer-manager.d.ts +0 -88
  423. package/dist/service/empathy-observer-manager.js +0 -414
  424. package/dist/service/evolution-query-service.d.ts +0 -155
  425. package/dist/service/evolution-query-service.js +0 -258
  426. package/dist/service/evolution-worker.d.ts +0 -101
  427. package/dist/service/evolution-worker.js +0 -975
  428. package/dist/service/health-query-service.d.ts +0 -170
  429. package/dist/service/health-query-service.js +0 -662
  430. package/dist/service/nocturnal-runtime.d.ts +0 -183
  431. package/dist/service/nocturnal-service.d.ts +0 -163
  432. package/dist/service/nocturnal-service.js +0 -787
  433. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  434. package/dist/service/nocturnal-target-selector.js +0 -315
  435. package/dist/service/phase3-input-filter.d.ts +0 -73
  436. package/dist/service/phase3-input-filter.js +0 -172
  437. package/dist/service/runtime-summary-service.d.ts +0 -122
  438. package/dist/service/runtime-summary-service.js +0 -485
  439. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  440. package/dist/service/subagent-workflow/index.d.ts +0 -4
  441. package/dist/service/subagent-workflow/index.js +0 -3
  442. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  443. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  444. package/dist/service/subagent-workflow/types.js +0 -11
  445. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  446. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  447. package/dist/service/trajectory-service.d.ts +0 -2
  448. package/dist/service/trajectory-service.js +0 -15
  449. package/dist/tools/critique-prompt.d.ts +0 -14
  450. package/dist/tools/deep-reflect.d.ts +0 -39
  451. package/dist/tools/deep-reflect.js +0 -350
  452. package/dist/tools/model-index.d.ts +0 -9
  453. package/dist/types/event-types.d.ts +0 -306
  454. package/dist/types/event-types.js +0 -106
  455. package/dist/types/hygiene-types.d.ts +0 -20
  456. package/dist/types/hygiene-types.js +0 -12
  457. package/dist/types/runtime-summary.d.ts +0 -47
  458. package/dist/types/runtime-summary.js +0 -1
  459. package/dist/types.d.ts +0 -50
  460. package/dist/types.js +0 -22
  461. package/dist/utils/file-lock.d.ts +0 -71
  462. package/dist/utils/file-lock.js +0 -309
  463. package/dist/utils/glob-match.d.ts +0 -28
  464. package/dist/utils/hashing.d.ts +0 -9
  465. package/dist/utils/io.d.ts +0 -6
  466. package/dist/utils/io.js +0 -106
  467. package/dist/utils/nlp.d.ts +0 -9
  468. package/dist/utils/plugin-logger.d.ts +0 -39
  469. package/dist/utils/subagent-probe.d.ts +0 -34
  470. package/dist/utils/subagent-probe.js +0 -81
@@ -0,0 +1,85 @@
1
+ import { execSync } from 'child_process';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
5
+ import { WorkspaceContext } from '../core/workspace-context.js';
6
+
7
+ const TOOLS_TO_SCAN = [
8
+ { name: 'rg', cmd: ['rg', '--version'] },
9
+ { name: 'sg', cmd: ['sg', '--version'] },
10
+ { name: 'fd', cmd: ['fd', '--version'] },
11
+ { name: 'qmd', cmd: ['qmd', '--version'] },
12
+ { name: 'ast-grep', cmd: ['ast-grep', '--version'] },
13
+ { name: 'shellcheck', cmd: ['shellcheck', '--version'] },
14
+ ];
15
+
16
+ function scanEnvironment(wctx: WorkspaceContext): any {
17
+ const tools: Record<string, { available: boolean; version?: string }> = {};
18
+
19
+ for (const tool of TOOLS_TO_SCAN) {
20
+ try {
21
+ const output = execSync(tool.cmd.join(' '), { stdio: ['ignore', 'pipe', 'ignore'] }).toString();
22
+ tools[tool.name] = {
23
+ available: true,
24
+ version: output.split('\n')[0].trim(),
25
+ };
26
+ } catch (_e) {
27
+ tools[tool.name] = { available: false };
28
+ }
29
+ }
30
+
31
+ const capabilities = {
32
+ platform: process.platform,
33
+ arch: process.arch,
34
+ node: process.version,
35
+ tools,
36
+ timestamp: new Date().toISOString(),
37
+ };
38
+
39
+ const capsPath = wctx.resolve('SYSTEM_CAPABILITIES');
40
+ const capsDir = path.dirname(capsPath);
41
+ if (!fs.existsSync(capsDir)) {
42
+ fs.mkdirSync(capsDir, { recursive: true });
43
+ }
44
+ fs.writeFileSync(capsPath, JSON.stringify(capabilities, null, 2), 'utf8');
45
+
46
+ return capabilities;
47
+ }
48
+
49
+ export function handleBootstrapTools(ctx: PluginCommandContext): PluginCommandResult {
50
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
51
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
52
+
53
+ try {
54
+ const caps = scanEnvironment(wctx);
55
+ const toolsMap = caps.tools as Record<string, { available: boolean }>;
56
+ const available = Object.entries(toolsMap)
57
+ .filter(([, data]) => data.available)
58
+ .map(([name]) => `\`${name}\``)
59
+ .join(', ');
60
+
61
+ return {
62
+ text:
63
+ `🔍 Environment perception complete.\n` +
64
+ `**Detected tools:** ${available || '(none)'}\n` +
65
+ `**Platform:** ${process.platform}\n` +
66
+ `Capabilities saved to \`.state/SYSTEM_CAPABILITIES.json\`.`,
67
+ };
68
+ } catch (err) {
69
+ return { text: `❌ bootstrap-tools failed: ${err instanceof Error ? err.message : String(err)}` };
70
+ }
71
+ }
72
+
73
+ export function handleResearchTools(ctx: PluginCommandContext): PluginCommandResult {
74
+ const category = ctx.args?.trim() || "modern high-performance CLI tools for coding and architecture";
75
+
76
+ return {
77
+ text:
78
+ `🚀 **Tool Evolution Research Initiated**\n\n` +
79
+ `**Instructions for Agent:**\n` +
80
+ `1. Use \`google_web_search\` or \`web_search_exa\` to find the latest tools in the category: "${category}".\n` +
81
+ `2. Compare findings with current capabilities in \`.state/SYSTEM_CAPABILITIES.json\`.\n` +
82
+ `3. Focus on tools that improve speed (like \`rg\`, \`sg\`), documentation (like \`qmd\`), or automation.\n` +
83
+ `4. Output a "Tool Upgrade Proposal" with installation commands and justification.`,
84
+ };
85
+ }
@@ -1,49 +1,56 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { defaultContextConfig } from '../types.js';
3
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+ import { ContextInjectionConfig, defaultContextConfig } from '../types.js';
4
5
  import { loadContextInjectionConfig } from '../hooks/prompt.js';
6
+
5
7
  /**
6
8
  * Get workspace directory from context
7
9
  */
8
- function getWorkspaceDir(ctx) {
9
- const workspaceDir = ctx.config?.workspaceDir || process.cwd();
10
+ function getWorkspaceDir(ctx: PluginCommandContext): string {
11
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
10
12
  if (!workspaceDir) {
11
13
  throw new Error('[PD:Context] workspaceDir is required but not provided');
12
14
  }
13
15
  return workspaceDir;
14
16
  }
17
+
15
18
  /**
16
19
  * Save context injection config to PROFILE.json
17
20
  */
18
- function saveConfig(workspaceDir, config) {
21
+ function saveConfig(workspaceDir: string, config: ContextInjectionConfig): boolean {
19
22
  const profilePath = path.join(workspaceDir, '.principles', 'PROFILE.json');
23
+
20
24
  try {
21
25
  // Ensure directory exists
22
26
  const dir = path.dirname(profilePath);
23
27
  if (!fs.existsSync(dir)) {
24
28
  fs.mkdirSync(dir, { recursive: true });
25
29
  }
30
+
26
31
  // Load existing profile or create new one
27
- let profile = {};
32
+ let profile: Record<string, unknown> = {};
28
33
  if (fs.existsSync(profilePath)) {
29
34
  const raw = fs.readFileSync(profilePath, 'utf-8');
30
35
  profile = JSON.parse(raw);
31
36
  }
37
+
32
38
  // Update contextInjection
33
39
  profile.contextInjection = config;
40
+
34
41
  // Write back
35
42
  fs.writeFileSync(profilePath, JSON.stringify(profile, null, 2), 'utf-8');
36
43
  return true;
37
- }
38
- catch (e) {
44
+ } catch (e) {
39
45
  console.error(`[PD:Context] Failed to save config: ${String(e)}`);
40
46
  return false;
41
47
  }
42
48
  }
49
+
43
50
  /**
44
51
  * Format project focus value for display
45
52
  */
46
- function formatProjectFocus(value, isZh) {
53
+ function formatProjectFocus(value: 'full' | 'summary' | 'off', isZh: boolean): string {
47
54
  const labels = {
48
55
  full: { zh: '📦 完整', en: '📦 Full' },
49
56
  summary: { zh: '📝 摘要', en: '📝 Summary' },
@@ -51,11 +58,13 @@ function formatProjectFocus(value, isZh) {
51
58
  };
52
59
  return labels[value][isZh ? 'zh' : 'en'];
53
60
  }
61
+
54
62
  /**
55
63
  * Show current context injection status
56
64
  */
57
- function showStatus(workspaceDir, isZh) {
65
+ function showStatus(workspaceDir: string, isZh: boolean): string {
58
66
  const config = loadContextInjectionConfig(workspaceDir);
67
+
59
68
  if (isZh) {
60
69
  return `
61
70
  📊 **上下文注入状态**
@@ -69,8 +78,7 @@ function showStatus(workspaceDir, isZh) {
69
78
 
70
79
  💡 输入 \`/pd-context help\` 查看更多选项
71
80
  `.trim();
72
- }
73
- else {
81
+ } else {
74
82
  return `
75
83
  📊 **Context Injection Status**
76
84
 
@@ -85,75 +93,95 @@ function showStatus(workspaceDir, isZh) {
85
93
  `.trim();
86
94
  }
87
95
  }
96
+
88
97
  /**
89
98
  * Toggle a boolean setting
90
99
  */
91
- function toggleSetting(workspaceDir, key, value, isZh) {
100
+ function toggleSetting(
101
+ workspaceDir: string,
102
+ key: 'thinkingOs' | 'reflectionLog',
103
+ value: string,
104
+ isZh: boolean
105
+ ): string {
92
106
  const config = loadContextInjectionConfig(workspaceDir);
93
107
  const oldValue = config[key];
108
+
94
109
  if (value === 'on') {
95
110
  config[key] = true;
96
- }
97
- else if (value === 'off') {
111
+ } else if (value === 'off') {
98
112
  config[key] = false;
99
- }
100
- else {
101
- return isZh
113
+ } else {
114
+ return isZh
102
115
  ? `❌ 无效值: "${value}"。使用 "on" 或 "off"。`
103
116
  : `❌ Invalid value: "${value}". Use "on" or "off".`;
104
117
  }
118
+
105
119
  const newValue = config[key];
106
- const keyName = isZh
120
+ const keyName = isZh
107
121
  ? { thinkingOs: '思维模型', reflectionLog: '反思日志' }[key]
108
122
  : key;
123
+
109
124
  // No change needed
110
125
  if (oldValue === newValue) {
111
126
  return isZh
112
127
  ? `ℹ️ ${keyName} 已经是 ${newValue ? '开启' : '关闭'} 状态`
113
128
  : `ℹ️ ${keyName} is already ${newValue ? 'ON' : 'OFF'}`;
114
129
  }
130
+
115
131
  if (saveConfig(workspaceDir, config)) {
116
132
  // Verify the save by re-reading
117
133
  const verifyConfig = loadContextInjectionConfig(workspaceDir);
118
134
  const verifyValue = verifyConfig[key];
135
+
119
136
  if (verifyValue !== newValue) {
120
137
  return isZh
121
138
  ? `⚠️ ${keyName} 保存后验证失败,请重试`
122
139
  : `⚠️ ${keyName} verification failed after save, please retry`;
123
140
  }
141
+
124
142
  const arrow = isZh ? '→' : '→';
125
143
  const oldLabel = oldValue ? (isZh ? '开启' : 'ON') : (isZh ? '关闭' : 'OFF');
126
144
  const newLabel = newValue ? (isZh ? '开启' : 'ON') : (isZh ? '关闭' : 'OFF');
145
+
127
146
  return isZh
128
147
  ? `✅ ${keyName} 已更新: ${oldLabel} ${arrow} ${newLabel}\n\n💡 下次对话时生效`
129
148
  : `✅ ${keyName} updated: ${oldLabel} ${arrow} ${newLabel}\n\n💡 Takes effect on next turn`;
130
- }
131
- else {
149
+ } else {
132
150
  return isZh
133
151
  ? `❌ 保存配置失败`
134
152
  : `❌ Failed to save configuration`;
135
153
  }
136
154
  }
155
+
137
156
  /**
138
157
  * Set project focus mode
139
158
  */
140
- function setProjectFocus(workspaceDir, value, isZh) {
159
+ function setProjectFocus(
160
+ workspaceDir: string,
161
+ value: string,
162
+ isZh: boolean
163
+ ): string {
141
164
  const config = loadContextInjectionConfig(workspaceDir);
142
165
  const oldValue = config.projectFocus;
143
- const validModes = ['full', 'summary', 'off'];
144
- if (!validModes.includes(value)) {
166
+ const validModes = ['full', 'summary', 'off'] as const;
167
+ type FocusMode = typeof validModes[number];
168
+
169
+ if (!validModes.includes(value as FocusMode)) {
145
170
  return isZh
146
171
  ? `❌ 无效值: "${value}"。使用 "full"、"summary" 或 "off"。`
147
172
  : `❌ Invalid value: "${value}". Use "full", "summary", or "off".`;
148
173
  }
149
- const newValue = value;
174
+
175
+ const newValue = value as FocusMode;
150
176
  config.projectFocus = newValue;
177
+
151
178
  // No change needed
152
179
  if (oldValue === newValue) {
153
180
  return isZh
154
181
  ? `ℹ️ 项目上下文已经是 ${formatProjectFocus(newValue, isZh)} 状态`
155
182
  : `ℹ️ Project context is already ${formatProjectFocus(newValue, isZh)}`;
156
183
  }
184
+
157
185
  if (saveConfig(workspaceDir, config)) {
158
186
  // Verify the save by re-reading
159
187
  const verifyConfig = loadContextInjectionConfig(workspaceDir);
@@ -162,22 +190,29 @@ function setProjectFocus(workspaceDir, value, isZh) {
162
190
  ? `⚠️ 项目上下文保存后验证失败,请重试`
163
191
  : `⚠️ Project context verification failed after save, please retry`;
164
192
  }
193
+
165
194
  const arrow = '→';
195
+
166
196
  return isZh
167
- ? `✅ 项目上下文已更新: ${formatProjectFocus(oldValue, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 下次对话时生效`
168
- : `✅ Project context updated: ${formatProjectFocus(oldValue, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 Takes effect on next turn`;
169
- }
170
- else {
197
+ ? `✅ 项目上下文已更新: ${formatProjectFocus(oldValue as FocusMode, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 下次对话时生效`
198
+ : `✅ Project context updated: ${formatProjectFocus(oldValue as FocusMode, isZh)} ${arrow} ${formatProjectFocus(newValue, isZh)}\n\n💡 Takes effect on next turn`;
199
+ } else {
171
200
  return isZh
172
201
  ? `❌ 保存配置失败`
173
202
  : `❌ Failed to save configuration`;
174
203
  }
175
204
  }
205
+
176
206
  /**
177
207
  * Apply a preset configuration
178
208
  */
179
- function applyPreset(workspaceDir, preset, isZh) {
180
- let config;
209
+ function applyPreset(
210
+ workspaceDir: string,
211
+ preset: 'minimal' | 'standard' | 'full',
212
+ isZh: boolean
213
+ ): string {
214
+ let config: ContextInjectionConfig;
215
+
181
216
  switch (preset) {
182
217
  case 'minimal':
183
218
  config = {
@@ -204,6 +239,7 @@ function applyPreset(workspaceDir, preset, isZh) {
204
239
  };
205
240
  break;
206
241
  }
242
+
207
243
  if (saveConfig(workspaceDir, config)) {
208
244
  const presetName = isZh
209
245
  ? { minimal: '最小模式', standard: '标准模式', full: '完整模式' }[preset]
@@ -211,17 +247,17 @@ function applyPreset(workspaceDir, preset, isZh) {
211
247
  return isZh
212
248
  ? `✅ 已应用预设: ${presetName}\n\n${showStatus(workspaceDir, isZh)}`
213
249
  : `✅ Applied preset: ${presetName}\n\n${showStatus(workspaceDir, isZh)}`;
214
- }
215
- else {
250
+ } else {
216
251
  return isZh
217
252
  ? `❌ 保存配置失败`
218
253
  : `❌ Failed to save configuration`;
219
254
  }
220
255
  }
256
+
221
257
  /**
222
258
  * Show help message
223
259
  */
224
- function showHelp(isZh) {
260
+ function showHelp(isZh: boolean): string {
225
261
  if (isZh) {
226
262
  return `
227
263
  📖 **/pd-context 命令帮助**
@@ -241,8 +277,7 @@ function showHelp(isZh) {
241
277
 
242
278
  **注意**: 核心原则始终注入,不可关闭。
243
279
  `.trim();
244
- }
245
- else {
280
+ } else {
246
281
  return `
247
282
  📖 **/pd-context Command Help**
248
283
 
@@ -263,17 +298,21 @@ function showHelp(isZh) {
263
298
  `.trim();
264
299
  }
265
300
  }
301
+
266
302
  /**
267
303
  * Main command handler
268
304
  */
269
- export function handleContextCommand(ctx) {
305
+ export function handleContextCommand(ctx: PluginCommandContext): PluginCommandResult {
270
306
  const workspaceDir = getWorkspaceDir(ctx);
271
307
  const args = (ctx.args || '').trim().split(/\s+/);
272
308
  const subCommand = args[0]?.toLowerCase() || 'status';
273
309
  const value = args[1]?.toLowerCase() || '';
310
+
274
311
  // Detect language from context
275
- const isZh = ctx.config?.language === 'zh';
276
- let result;
312
+ const isZh = (ctx.config?.language as string) === 'zh';
313
+
314
+ let result: string;
315
+
277
316
  switch (subCommand) {
278
317
  case 'status':
279
318
  result = showStatus(workspaceDir, isZh);
@@ -298,5 +337,6 @@ export function handleContextCommand(ctx) {
298
337
  default:
299
338
  result = showHelp(isZh);
300
339
  }
340
+
301
341
  return { text: result };
302
342
  }
@@ -0,0 +1,146 @@
1
+ import { EvolutionReducerImpl } from '../core/evolution-reducer.js';
2
+ import { normalizeLanguage } from '../i18n/commands.js';
3
+ import { RuntimeSummaryService } from '../service/runtime-summary-service.js';
4
+ import type { PluginCommandContext } from '../openclaw-sdk.js';
5
+
6
+ function formatNumber(value: number | null): string {
7
+ if (value === null || Number.isNaN(value)) {
8
+ return '--';
9
+ }
10
+ return Number.isInteger(value) ? String(value) : value.toFixed(1);
11
+ }
12
+
13
+ function formatSources(
14
+ sources: Array<{ source: string; score?: number }>
15
+ ): string {
16
+ if (sources.length === 0) {
17
+ return '--';
18
+ }
19
+
20
+ return sources
21
+ .map((source) =>
22
+ source.score === undefined
23
+ ? source.source
24
+ : `${source.source}(${formatNumber(source.score)})`
25
+ )
26
+ .join(', ');
27
+ }
28
+
29
+ function buildEnglishOutput(
30
+ workspaceDir: string,
31
+ sessionId: string | null,
32
+ warnings: string[],
33
+ stats: ReturnType<EvolutionReducerImpl['getStats']>,
34
+ summary: ReturnType<typeof RuntimeSummaryService.getSummary>
35
+ ): string {
36
+ const lines: string[] = [
37
+ 'Evolution Status',
38
+ '================',
39
+ '',
40
+ 'Control Plane',
41
+ `- Session GFI: current ${formatNumber(summary.gfi.current)}, peak ${formatNumber(summary.gfi.peak)} (${summary.gfi.dataQuality})`,
42
+ `- GFI Sources: ${formatSources(summary.gfi.sources)}`,
43
+ `- Pain Flag: ${summary.pain.activeFlag ? 'active' : 'inactive'}${summary.pain.activeFlagSource ? ` (${summary.pain.activeFlagSource})` : ''}`,
44
+ `- Last Pain Signal: ${summary.pain.lastSignal ? `${summary.pain.lastSignal.source}${summary.pain.lastSignal.reason ? ` - ${summary.pain.lastSignal.reason}` : ''}` : '--'}`,
45
+ `- Gate Events: blocks ${formatNumber(summary.gate.recentBlocks)}, bypasses ${formatNumber(summary.gate.recentBypasses)} (${summary.gate.dataQuality})`,
46
+ '',
47
+ 'Evolution',
48
+ `- Queue: pending ${summary.evolution.queue.pending}, in_progress ${summary.evolution.queue.inProgress}, completed ${summary.evolution.queue.completed} (${summary.evolution.dataQuality})`,
49
+ `- Legacy Directive File: ${summary.phase3.legacyDirectiveFilePresent ? 'present' : 'missing'} (compatibility-only display artifact)`,
50
+ `- Note: Legacy directive file is NOT a truth source for Phase 3 eligibility. Queue is the only authoritative execution truth source.`,
51
+ `- Active Evolution Task: ${summary.evolution.directive.taskPreview ?? '--'}`,
52
+ `- 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(', ')})` : ''}`,
53
+ `- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
54
+ '',
55
+ 'Principles',
56
+ `- candidate principles: ${stats.candidateCount}`,
57
+ `- probation principles: ${stats.probationCount}`,
58
+ `- active principles: ${stats.activeCount}`,
59
+ `- deprecated principles: ${stats.deprecatedCount}`,
60
+ `- last promoted: ${stats.lastPromotedAt ?? 'none'}`,
61
+ '',
62
+ 'Metadata',
63
+ `- workspace: ${workspaceDir}`,
64
+ `- session: ${sessionId ?? '--'} (${summary.metadata.selectedSessionReason})`,
65
+ `- generatedAt: ${summary.metadata.generatedAt}`,
66
+ ];
67
+
68
+ if (warnings.length > 0) {
69
+ lines.push('', 'Warnings');
70
+ for (const warning of warnings) {
71
+ lines.push(`- ${warning}`);
72
+ }
73
+ }
74
+
75
+ return lines.join('\n');
76
+ }
77
+
78
+ function buildChineseOutput(
79
+ workspaceDir: string,
80
+ sessionId: string | null,
81
+ warnings: string[],
82
+ stats: ReturnType<EvolutionReducerImpl['getStats']>,
83
+ summary: ReturnType<typeof RuntimeSummaryService.getSummary>
84
+ ): string {
85
+ const lines: string[] = [
86
+ '进化状态',
87
+ '================',
88
+ '',
89
+ '控制面',
90
+ `- 会话 GFI: 当前 ${formatNumber(summary.gfi.current)},峰值 ${formatNumber(summary.gfi.peak)}(${summary.gfi.dataQuality})`,
91
+ `- GFI 来源: ${formatSources(summary.gfi.sources)}`,
92
+ `- Pain Flag: ${summary.pain.activeFlag ? 'active' : 'inactive'}${summary.pain.activeFlagSource ? `(${summary.pain.activeFlagSource})` : ''}`,
93
+ `- 最近 Pain 信号: ${summary.pain.lastSignal ? `${summary.pain.lastSignal.source}${summary.pain.lastSignal.reason ? ` - ${summary.pain.lastSignal.reason}` : ''}` : '--'}`,
94
+ `- Gate 事件: block ${formatNumber(summary.gate.recentBlocks)},bypass ${formatNumber(summary.gate.recentBypasses)}(${summary.gate.dataQuality})`,
95
+ '',
96
+ '进化',
97
+ `- 队列: pending ${summary.evolution.queue.pending},in_progress ${summary.evolution.queue.inProgress},completed ${summary.evolution.queue.completed}(${summary.evolution.dataQuality})`,
98
+ `- Legacy Directive File: ${summary.phase3.legacyDirectiveFilePresent ? 'present' : 'missing'} (兼容仅显示产物)`,
99
+ `- 注:Legacy directive file 不是 Phase 3 合格性的真实源。队列是唯一权威的执行真实源。`,
100
+ `- Active Evolution Task: ${summary.evolution.directive.taskPreview ?? '--'}`,
101
+ `- 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(', ')})` : ''}`,
102
+ `- Phase 3 Legacy Directive File: ${summary.phase3.directiveStatus} (${summary.phase3.directiveIgnoredReason})`,
103
+ '',
104
+ '原则统计',
105
+ `- 候选原则: ${stats.candidateCount}`,
106
+ `- 观察期原则: ${stats.probationCount}`,
107
+ `- 生效原则: ${stats.activeCount}`,
108
+ `- 已废弃原则: ${stats.deprecatedCount}`,
109
+ `- 最近晋升: ${stats.lastPromotedAt ?? '无'}`,
110
+ '',
111
+ '元数据',
112
+ `- 工作区: ${workspaceDir}`,
113
+ `- Session: ${sessionId ?? '--'}(${summary.metadata.selectedSessionReason})`,
114
+ `- 生成时间: ${summary.metadata.generatedAt}`,
115
+ ];
116
+
117
+ if (warnings.length > 0) {
118
+ lines.push('', '警告');
119
+ for (const warning of warnings) {
120
+ lines.push(`- ${warning}`);
121
+ }
122
+ }
123
+
124
+ return lines.join('\n');
125
+ }
126
+
127
+ export function handleEvolutionStatusCommand(ctx: PluginCommandContext): { text: string } {
128
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
129
+ const sessionId = (ctx as { sessionId?: string | null }).sessionId ?? null;
130
+ const reducer = new EvolutionReducerImpl({ workspaceDir });
131
+ const stats = reducer.getStats();
132
+ const summary = RuntimeSummaryService.getSummary(workspaceDir, { sessionId });
133
+ const rawLang = (ctx.config?.language as string) || 'en';
134
+ const lang = normalizeLanguage(rawLang);
135
+ const warnings = summary.metadata.warnings.slice(0, 12);
136
+
137
+ if (lang === 'zh') {
138
+ return {
139
+ text: buildChineseOutput(workspaceDir, summary.metadata.sessionId, warnings, stats, summary),
140
+ };
141
+ }
142
+
143
+ return {
144
+ text: buildEnglishOutput(workspaceDir, summary.metadata.sessionId, warnings, stats, summary),
145
+ };
146
+ }
@@ -0,0 +1,111 @@
1
+ import { WorkspaceContext } from '../core/workspace-context.js';
2
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
3
+ import { exportORPOSamples, listExports } from '../core/nocturnal-export.js';
4
+
5
+ function isZh(ctx: PluginCommandContext): boolean {
6
+ return String(ctx.config?.language || 'en').startsWith('zh');
7
+ }
8
+
9
+ export function handleExportCommand(ctx: PluginCommandContext): PluginCommandResult {
10
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
11
+ const zh = isZh(ctx);
12
+ const args = (ctx.args || '').trim();
13
+ const parts = args.split(/\s+/).filter(Boolean);
14
+ const [subcommand = 'corrections'] = parts;
15
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
16
+
17
+ try {
18
+ if (subcommand === 'orpo') {
19
+ // Nocturnal ORPO export
20
+ // Usage: pd-export orpo [--family=<targetModelFamily>]
21
+ const familyArg = parts.find((p) => p.startsWith('--family='));
22
+ const targetModelFamily = familyArg ? familyArg.split('=')[1] : undefined;
23
+
24
+ const result = exportORPOSamples(workspaceDir, targetModelFamily);
25
+
26
+ if (!result.success) {
27
+ const reasonMap: Record<string, string> = {
28
+ no_approved_samples: zh
29
+ ? '没有已批准的样本'
30
+ : 'No approved samples',
31
+ family_mismatch: zh
32
+ ? '没有找到指定模型家族的已批准样本'
33
+ : 'No approved samples for the specified target model family',
34
+ all_samples_missing_artifacts: zh
35
+ ? '所有样本的 artifact 文件都缺失'
36
+ : 'All sample artifact files are missing',
37
+ };
38
+ return {
39
+ text: zh
40
+ ? `ORPO 导出失败: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`
41
+ : `ORPO export failed: ${reasonMap[result.emptyReason ?? ''] ?? result.error}`,
42
+ };
43
+ }
44
+
45
+ return {
46
+ text: zh
47
+ ? `已导出 ORPO 决策点样本到 ${result.manifest!.exportPath},` +
48
+ `共 ${result.manifest!.sampleCount} 条,模型家族: ${result.manifest!.targetModelFamily},` +
49
+ `数据集指纹: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`
50
+ : `Exported ORPO decision-point samples to ${result.manifest!.exportPath}, ` +
51
+ `${result.manifest!.sampleCount} samples, target: ${result.manifest!.targetModelFamily}, ` +
52
+ `dataset fingerprint: ${result.manifest!.datasetFingerprint.substring(0, 16)}...`,
53
+ };
54
+ }
55
+
56
+ if (subcommand === 'orpo-list') {
57
+ // List previous ORPO exports
58
+ const exports = listExports(workspaceDir);
59
+ if (exports.length === 0) {
60
+ return {
61
+ text: zh
62
+ ? '没有找到 ORPO 导出记录。'
63
+ : 'No ORPO exports found.',
64
+ };
65
+ }
66
+ const lines = exports.slice(0, 10).map((e) =>
67
+ `- ${e.exportId.substring(0, 8)}... | ${e.sampleCount} samples | ${e.targetModelFamily} | ${new Date(e.createdAt).toLocaleDateString()}`
68
+ );
69
+ return {
70
+ text: zh
71
+ ? `ORPO 导出记录:\n${lines.join('\n')}`
72
+ : `ORPO exports:\n${lines.join('\n')}`,
73
+ };
74
+ }
75
+
76
+ if (subcommand !== 'analytics' && subcommand !== 'corrections') {
77
+ return {
78
+ text: zh
79
+ ? '无效的导出类型。请使用 `analytics`、`corrections [--redacted]` 或 `orpo [--family=<target>]`。'
80
+ : 'Invalid export target. Use `analytics`, `corrections [--redacted]`, or `orpo [--family=<target>]`',
81
+ };
82
+ }
83
+
84
+ if (subcommand === 'analytics') {
85
+ const result = wctx.trajectory.exportAnalytics();
86
+ return {
87
+ text: zh
88
+ ? `已导出 analytics 快照到 ${result.filePath},共 ${result.count} 条聚合记录。`
89
+ : `Exported analytics snapshot to ${result.filePath} (${result.count} aggregated rows).`,
90
+ };
91
+ }
92
+
93
+ const redacted = args.includes('--redacted');
94
+ const result = wctx.trajectory.exportCorrections({
95
+ mode: redacted ? 'redacted' : 'raw',
96
+ approvedOnly: true,
97
+ });
98
+
99
+ return {
100
+ text: zh
101
+ ? `已导出纠错样本到 ${result.filePath},模式 ${result.mode},共 ${result.count} 条。`
102
+ : `Exported correction samples to ${result.filePath} (mode=${result.mode}, count=${result.count}).`,
103
+ };
104
+ } catch {
105
+ return {
106
+ text: zh
107
+ ? '导出失败,请检查日志。'
108
+ : 'Export failed. Check logs.',
109
+ };
110
+ }
111
+ }