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
@@ -1,32 +1,39 @@
1
- import { resetFriction, getSession } from '../core/session-tracker.js';
1
+ import { trackFriction, resetFriction, getSession } from '../core/session-tracker.js';
2
2
  import { WorkspaceContext } from '../core/workspace-context.js';
3
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+ import type { EmpathyEventStats } from '../types/event-types.js';
5
+
3
6
  /**
4
7
  * Creates a visual progress bar (e.g., [██████░░░░])
5
8
  */
6
- function createProgressBar(value, max, length = 10) {
9
+ function createProgressBar(value: number, max: number, length: number = 10): string {
7
10
  const filledLength = Math.round((value / max) * length);
8
11
  const emptyLength = length - filledLength;
9
12
  return `[${'█'.repeat(filledLength)}${'░'.repeat(emptyLength)}]`;
10
13
  }
14
+
11
15
  /**
12
16
  * Creates a mini bar for daily trends
13
17
  */
14
- function createMiniBar(count, max, length = 6) {
18
+ function createMiniBar(count: number, max: number, length: number = 6): string {
15
19
  const filledLength = Math.round((count / max) * length);
16
20
  return '█'.repeat(filledLength) + '░'.repeat(length - filledLength);
17
21
  }
22
+
18
23
  /**
19
24
  * Format empathy stats for display
20
25
  */
21
- function formatEmpathyCard(stats, range, isZh) {
26
+ function formatEmpathyCard(stats: EmpathyEventStats, range: string, isZh: boolean): string {
22
27
  if (stats.totalEvents === 0 && stats.dedupedCount === 0) {
23
28
  return isZh
24
29
  ? `🫀 **情绪事件统计** (${range})\n 暂无数据`
25
30
  : `🫀 **Empathy Events** (${range})\n No data available`;
26
31
  }
27
- const lines = [];
32
+
33
+ const lines: string[] = [];
28
34
  lines.push(isZh ? `🫀 **情绪事件统计** (${range})` : `🫀 **Empathy Events** (${range})`);
29
35
  lines.push('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
36
+
30
37
  // Total events
31
38
  const totalLabel = isZh ? '📊 总事件' : '📊 Total Events';
32
39
  lines.push(`${totalLabel}: ${stats.totalEvents} 次`);
@@ -34,6 +41,7 @@ function formatEmpathyCard(stats, range, isZh) {
34
41
  lines.push(` ├─ 😠 moderate: ${stats.bySeverity.moderate} 次 (${stats.scoreBySeverity.moderate}分)`);
35
42
  lines.push(` └─ 😡 severe: ${stats.bySeverity.severe} 次 (${stats.scoreBySeverity.severe}分)`);
36
43
  lines.push('');
44
+
37
45
  // Dedupe hit rate
38
46
  const dedupeRate = (stats.dedupeHitRate * 100).toFixed(0);
39
47
  const dedupeLabel = isZh ? '🔄 去重命中率' : '🔄 Dedupe Hit Rate';
@@ -42,12 +50,14 @@ function formatEmpathyCard(stats, range, isZh) {
42
50
  lines.push(isZh ? ' ↳ 避免了重复惩罚' : ' ↳ Prevented duplicate penalties');
43
51
  }
44
52
  lines.push('');
53
+
45
54
  // Rollback info
46
55
  if (stats.rollbackCount > 0) {
47
56
  const rollbackLabel = isZh ? '↩️ 已回滚' : '↩️ Rolled Back';
48
57
  lines.push(`${rollbackLabel}: ${stats.rollbackCount} 次 (${stats.rolledBackScore}分)`);
49
58
  lines.push('');
50
59
  }
60
+
51
61
  // Daily trend
52
62
  if (stats.dailyTrend.length > 1) {
53
63
  const trendLabel = isZh ? '📈 趋势 (按天)' : '📈 Trend (by day)';
@@ -59,28 +69,35 @@ function formatEmpathyCard(stats, range, isZh) {
59
69
  lines.push(` ${dateStr}: ${bar} ${day.count}次`);
60
70
  }
61
71
  }
72
+
62
73
  // Detection mode distribution
63
74
  if (stats.byDetectionMode.structured > 0 || stats.byDetectionMode.legacy_tag > 0) {
64
75
  lines.push('');
65
76
  const modeLabel = isZh ? '🔍 检测模式' : '🔍 Detection Mode';
66
77
  lines.push(`${modeLabel}: 结构化 ${stats.byDetectionMode.structured} | 标签 ${stats.byDetectionMode.legacy_tag}`);
67
78
  }
79
+
68
80
  return lines.join('\n');
69
81
  }
82
+
70
83
  /**
71
84
  * Handles the /pd-status command
72
85
  */
73
- export function handlePainCommand(ctx) {
74
- const workspaceDir = ctx.config?.workspaceDir || process.cwd();
86
+ export function handlePainCommand(ctx: PluginCommandContext): PluginCommandResult {
87
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
88
+
75
89
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
76
- const lang = ctx.config?.language || 'en';
90
+ const lang = (ctx.config?.language as string) || 'en';
77
91
  const isZh = lang === 'zh';
78
- const sessionId = ctx.sessionId;
92
+ const sessionId = (ctx as any).sessionId;
93
+
79
94
  const args = (ctx.args || '').trim();
95
+
80
96
  // Handle empathy subcommand
81
97
  if (args.startsWith('empathy')) {
82
98
  return handleEmpathySubcommand(wctx, args, sessionId, isZh);
83
99
  }
100
+
84
101
  if (args === 'reset') {
85
102
  if (sessionId) {
86
103
  resetFriction(sessionId);
@@ -88,6 +105,7 @@ export function handlePainCommand(ctx) {
88
105
  }
89
106
  return { text: isZh ? `❌ 无法识别当前会话。` : `❌ Session ID not found. Use /pd-status reset in a chat session.` };
90
107
  }
108
+
91
109
  if (args === 'data') {
92
110
  const stats = wctx.trajectory.getDataStats();
93
111
  return {
@@ -96,33 +114,31 @@ export function handlePainCommand(ctx) {
96
114
  : `Trajectory Data Status\n- DB: ${stats.dbPath}\n- assistant turns: ${stats.assistantTurns}\n- user turns: ${stats.userTurns}\n- tool calls: ${stats.toolCalls}\n- pain events: ${stats.painEvents}\n- pending samples: ${stats.pendingSamples}\n- approved samples: ${stats.approvedSamples}\n- blob bytes: ${stats.blobBytes}\n- last ingest: ${stats.lastIngestAt ?? 'none'}`
97
115
  };
98
116
  }
117
+
99
118
  // Default: Show status
100
119
  const session = sessionId ? getSession(sessionId) : undefined;
101
120
  const gfi = session ? session.currentGfi : 0;
102
121
  const dictionary = wctx.dictionary;
103
122
  const stats = dictionary.getStats();
123
+
104
124
  const gfiBar = createProgressBar(gfi, 100, 15);
125
+
105
126
  // Determine Mental Mode (aligned with prompt.ts logic)
106
127
  let mentalMode = '';
107
128
  if (isZh) {
108
- if (gfi >= 70)
109
- mentalMode = '🚑 救赎模式 (HUMBLE_RECOVERY)';
110
- else if (gfi >= 40)
111
- mentalMode = '🤝 安抚模式 (CONCILIATORY)';
112
- else
113
- mentalMode = ' 高效模式 (EFFICIENT)';
114
- }
115
- else {
116
- if (gfi >= 70)
117
- mentalMode = '🚑 HUMBLE_RECOVERY';
118
- else if (gfi >= 40)
119
- mentalMode = '🤝 CONCILIATORY';
120
- else
121
- mentalMode = '⚡ EFFICIENT';
129
+ if (gfi >= 70) mentalMode = '🚑 救赎模式 (HUMBLE_RECOVERY)';
130
+ else if (gfi >= 40) mentalMode = '🤝 安抚模式 (CONCILIATORY)';
131
+ else mentalMode = '⚡ 高效模式 (EFFICIENT)';
132
+ } else {
133
+ if (gfi >= 70) mentalMode = '🚑 HUMBLE_RECOVERY';
134
+ else if (gfi >= 40) mentalMode = '🤝 CONCILIATORY';
135
+ else mentalMode = '⚡ EFFICIENT';
122
136
  }
137
+
123
138
  // Determine health status based on GFI
124
139
  let healthLabel = 'Healthy';
125
140
  let suggestionText = '';
141
+
126
142
  if (isZh) {
127
143
  if (gfi > 80) {
128
144
  healthLabel = '极度疲劳 🔴';
@@ -132,14 +148,10 @@ export function handlePainCommand(ctx) {
132
148
  2. 让 AI 调用 \`deep_reflect\` 工具进行深度反思。
133
149
  3. 如果当前上下文太乱,考虑使用 \`/clear\` 开启新会话。`;
134
150
  }
135
- else if (gfi > 50)
136
- healthLabel = '遇到阻力 🟡';
137
- else if (gfi > 20)
138
- healthLabel = '轻微受挫 🟢';
139
- else
140
- healthLabel = '运转良好 🟢';
141
- }
142
- else {
151
+ else if (gfi > 50) healthLabel = '遇到阻力 🟡';
152
+ else if (gfi > 20) healthLabel = '轻微受挫 🟢';
153
+ else healthLabel = '运转良好 🟢';
154
+ } else {
143
155
  if (gfi > 80) {
144
156
  healthLabel = 'Critical 🔴';
145
157
  suggestionText = `
@@ -148,13 +160,11 @@ export function handlePainCommand(ctx) {
148
160
  2. Ask the AI to use the \`deep_reflect\` tool.
149
161
  4. Consider starting a new session with \`/clear\`.`;
150
162
  }
151
- else if (gfi > 50)
152
- healthLabel = 'High Friction 🟡';
153
- else if (gfi > 20)
154
- healthLabel = 'Minor Issues 🟢';
155
- else
156
- healthLabel = 'Healthy 🟢';
163
+ else if (gfi > 50) healthLabel = 'High Friction 🟡';
164
+ else if (gfi > 20) healthLabel = 'Minor Issues 🟢';
165
+ else healthLabel = 'Healthy 🟢';
157
166
  }
167
+
158
168
  // Get session empathy stats for inline display
159
169
  const sessionEmpathy = sessionId ? wctx.eventLog.getEmpathyStats('session', sessionId) : null;
160
170
  let empathyInline = '';
@@ -163,6 +173,7 @@ export function handlePainCommand(ctx) {
163
173
  ? `\n🫀 **情绪事件 (当前会话)**: ${sessionEmpathy.totalEvents} 次 (${sessionEmpathy.totalPenaltyScore}分)`
164
174
  : `\n🫀 **Empathy Events (Session)**: ${sessionEmpathy.totalEvents} (${sessionEmpathy.totalPenaltyScore}pts)`;
165
175
  }
176
+
166
177
  if (isZh) {
167
178
  let text = `📊 **Principles Disciple - 系统健康度监控**\n`;
168
179
  text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
@@ -173,15 +184,14 @@ export function handlePainCommand(ctx) {
173
184
  text += `\n\n🧠 **痛苦进化词典**: 已吸收 ${stats.totalRules} 条规则\n`;
174
185
  text += ` ↳ 累计帮您拦截了 ${stats.totalHits} 次无效操作\n`;
175
186
  text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
187
+
176
188
  if (suggestionText) {
177
189
  text += suggestionText;
178
- }
179
- else {
190
+ } else {
180
191
  text += `*💡 提示: 使用 \`/pd-status empathy\` 查看详细情绪事件统计。*`;
181
192
  }
182
193
  return { text };
183
- }
184
- else {
194
+ } else {
185
195
  let text = `📊 **Principles Disciple - System Health Monitor**\n`;
186
196
  text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
187
197
  text += `💊 **Current Friction (GFI)**: ${gfiBar} ${gfi}/100\n`;
@@ -191,30 +201,35 @@ export function handlePainCommand(ctx) {
191
201
  text += `\n\n🧠 **Evolution Dictionary**: ${stats.totalRules} active rules\n`;
192
202
  text += ` ↳ Successfully blocked ${stats.totalHits} invalid operations\n`;
193
203
  text += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`;
204
+
194
205
  if (suggestionText) {
195
206
  text += suggestionText;
196
- }
197
- else {
207
+ } else {
198
208
  text += `*💡 Hint: Use \`/pd-status empathy\` to view detailed empathy event statistics.*`;
199
209
  }
200
210
  return { text };
201
211
  }
202
212
  }
213
+
203
214
  /**
204
215
  * Handle /pd-status empathy subcommand
205
216
  */
206
- function handleEmpathySubcommand(wctx, args, sessionId, isZh) {
217
+ function handleEmpathySubcommand(
218
+ wctx: WorkspaceContext,
219
+ args: string,
220
+ sessionId: string | undefined,
221
+ isZh: boolean
222
+ ): PluginCommandResult {
207
223
  // Parse range argument
208
- let range = 'today';
224
+ let range: 'today' | 'week' | 'session' = 'today';
209
225
  if (args.includes('--week') || args.includes('-w')) {
210
226
  range = 'week';
211
- }
212
- else if (args.includes('--session') || args.includes('-s')) {
227
+ } else if (args.includes('--session') || args.includes('-s')) {
213
228
  range = 'session';
214
- }
215
- else if (args.includes('--today') || args.includes('-t')) {
229
+ } else if (args.includes('--today') || args.includes('-t')) {
216
230
  range = 'today';
217
231
  }
232
+
218
233
  // Validate session range
219
234
  if (range === 'session' && !sessionId) {
220
235
  return {
@@ -223,16 +238,20 @@ function handleEmpathySubcommand(wctx, args, sessionId, isZh) {
223
238
  : `❌ Session not found. Use this command in a chat session.`
224
239
  };
225
240
  }
241
+
226
242
  const stats = wctx.eventLog.getEmpathyStats(range, sessionId);
227
243
  const rangeLabel = isZh
228
244
  ? { today: '今天', week: '最近 7 天', session: '当前会话' }[range]
229
245
  : { today: 'Today', week: 'Last 7 Days', session: 'Current Session' }[range];
246
+
230
247
  let text = formatEmpathyCard(stats, rangeLabel, isZh);
248
+
231
249
  // Add usage hint
232
250
  if (range === 'today') {
233
251
  text += isZh
234
252
  ? `\n\n*💡 使用 \`/pd-status empathy --week\` 查看周统计,\`--session\` 查看会话统计。*`
235
253
  : `\n\n*💡 Use \`/pd-status empathy --week\` for weekly stats, \`--session\` for session stats.*`;
236
254
  }
255
+
237
256
  return { text };
238
257
  }
@@ -0,0 +1,27 @@
1
+ import { EvolutionReducerImpl } from '../core/evolution-reducer.js';
2
+ import type { PluginCommandContext } from '../openclaw-sdk.js';
3
+
4
+ export function handlePrincipleRollbackCommand(ctx: PluginCommandContext): { text: string } {
5
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
6
+ const argText = (ctx.args || '').trim();
7
+ const [principleId = '', ...reasonParts] = argText.split(/\s+/);
8
+ const reason = (reasonParts.join(' ') || 'manual rollback').trim();
9
+ const isZh = (ctx.config?.language as string)?.startsWith('zh');
10
+
11
+ if (!principleId) {
12
+ return { text: isZh ? '用法: /pd-principle-rollback <principleId> [reason]' : 'Usage: /pd-principle-rollback <principleId> [reason]' };
13
+ }
14
+
15
+ const reducer = new EvolutionReducerImpl({ workspaceDir });
16
+ const principle = reducer.getPrincipleById(principleId);
17
+ if (!principle) {
18
+ return { text: isZh ? `未找到原则: ${principleId}` : `Principle not found: ${principleId}` };
19
+ }
20
+
21
+ reducer.rollbackPrinciple(principleId, reason);
22
+ return {
23
+ text: isZh
24
+ ? `✅ 已回滚原则 ${principleId}\n原因: ${reason}`
25
+ : `✅ Rolled back principle ${principleId}\nReason: ${reason}`,
26
+ };
27
+ }
@@ -1,19 +1,24 @@
1
1
  import { WorkspaceContext } from '../core/workspace-context.js';
2
2
  import { resetFriction } from '../core/session-tracker.js';
3
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
4
+
3
5
  /**
4
6
  * Handles the /pd-rollback command
5
- *
7
+ *
6
8
  * Usage:
7
9
  * /pd-rollback <event-id> - Rollback a specific empathy event by ID
8
10
  * /pd-rollback last - Rollback the last empathy event in current session
9
11
  */
10
- export function handleRollbackCommand(ctx) {
11
- const workspaceDir = ctx.config?.workspaceDir || process.cwd();
12
+ export function handleRollbackCommand(ctx: PluginCommandContext): PluginCommandResult {
13
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
14
+
12
15
  const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
13
- const lang = ctx.config?.language || 'en';
16
+ const lang = (ctx.config?.language as string) || 'en';
14
17
  const isZh = lang === 'zh';
15
- const sessionId = ctx.sessionId;
18
+ const sessionId = (ctx as any).sessionId;
19
+
16
20
  const args = (ctx.args || '').trim();
21
+
17
22
  if (!args) {
18
23
  return {
19
24
  text: isZh
@@ -29,6 +34,7 @@ Usage:
29
34
  /pd-rollback last - Rollback the last event in current session`
30
35
  };
31
36
  }
37
+
32
38
  if (!sessionId) {
33
39
  return {
34
40
  text: isZh
@@ -36,8 +42,10 @@ Usage:
36
42
  : `❌ Session ID not found. Use this command in a chat session.`
37
43
  };
38
44
  }
39
- let eventId = null;
40
- let triggerMethod = 'user_command';
45
+
46
+ let eventId: string | null = null;
47
+ let triggerMethod: 'user_command' = 'user_command';
48
+
41
49
  if (args === 'last') {
42
50
  // Find the last empathy event in current session
43
51
  eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
@@ -48,13 +56,19 @@ Usage:
48
56
  : `❌ No empathy events found in current session to rollback.`
49
57
  };
50
58
  }
51
- }
52
- else {
59
+ } else {
53
60
  // Use the provided event ID
54
61
  eventId = args;
55
62
  }
63
+
56
64
  // Perform rollback
57
- const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(eventId, sessionId, isZh ? '用户手动回滚' : 'User manual rollback', 'user_command');
65
+ const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
66
+ eventId,
67
+ sessionId,
68
+ isZh ? '用户手动回滚' : 'User manual rollback',
69
+ 'user_command'
70
+ );
71
+
58
72
  if (rolledBackScore === 0) {
59
73
  return {
60
74
  text: isZh
@@ -62,11 +76,13 @@ Usage:
62
76
  : `❌ Failed to rollback event "${eventId}". Event may not exist or was deduped.`
63
77
  };
64
78
  }
79
+
65
80
  // Reduce the GFI by the rolled back score
66
81
  resetFriction(sessionId, workspaceDir, {
67
82
  source: 'user_empathy',
68
83
  amount: rolledBackScore,
69
84
  });
85
+
70
86
  return {
71
87
  text: isZh
72
88
  ? `✅ 已回滚情绪事件
@@ -81,12 +97,18 @@ Usage:
81
97
  💡 Hint: Session friction has been reset.`
82
98
  };
83
99
  }
100
+
84
101
  /**
85
102
  * Handle natural language rollback request
86
103
  * Called from prompt hook when user says things like "撤销刚才的惩罚"
87
104
  */
88
- export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
105
+ export function handleNaturalLanguageRollback(
106
+ wctx: WorkspaceContext,
107
+ sessionId: string | undefined,
108
+ reason: string
109
+ ): { success: boolean; score: number; message: string } {
89
110
  const isZh = wctx.config.get('language') === 'zh';
111
+
90
112
  if (!sessionId) {
91
113
  return {
92
114
  success: false,
@@ -94,6 +116,7 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
94
116
  message: isZh ? '无法识别当前会话' : 'Session not found'
95
117
  };
96
118
  }
119
+
97
120
  const eventId = wctx.eventLog.getLastEmpathyEventId(sessionId);
98
121
  if (!eventId) {
99
122
  return {
@@ -102,7 +125,14 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
102
125
  message: isZh ? '当前会话没有可回滚的情绪事件' : 'No empathy events to rollback'
103
126
  };
104
127
  }
105
- const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(eventId, sessionId, reason, 'natural_language');
128
+
129
+ const rolledBackScore = wctx.eventLog.rollbackEmpathyEvent(
130
+ eventId,
131
+ sessionId,
132
+ reason,
133
+ 'natural_language'
134
+ );
135
+
106
136
  if (rolledBackScore === 0) {
107
137
  return {
108
138
  success: false,
@@ -110,11 +140,13 @@ export function handleNaturalLanguageRollback(wctx, sessionId, reason) {
110
140
  message: isZh ? '回滚失败,事件可能不存在' : 'Rollback failed, event may not exist'
111
141
  };
112
142
  }
143
+
113
144
  // Reduce only the empathy slice instead of wiping the whole session GFI.
114
145
  resetFriction(sessionId, wctx.workspaceDir, {
115
146
  source: 'user_empathy',
116
147
  amount: rolledBackScore,
117
148
  });
149
+
118
150
  return {
119
151
  success: true,
120
152
  score: rolledBackScore,
@@ -0,0 +1,60 @@
1
+ import { WorkspaceContext } from '../core/workspace-context.js';
2
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
3
+
4
+ function isZh(ctx: PluginCommandContext): boolean {
5
+ return String(ctx.config?.language || 'en').startsWith('zh');
6
+ }
7
+
8
+ export function handleSamplesCommand(ctx: PluginCommandContext): PluginCommandResult {
9
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
10
+ const zh = isZh(ctx);
11
+ const args = (ctx.args || '').trim();
12
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
13
+
14
+ if (args.startsWith('review ')) {
15
+ const [, decision = '', sampleId = '', ...noteParts] = args.split(/\s+/);
16
+ if (decision !== 'approve' && decision !== 'reject') {
17
+ return {
18
+ text: zh
19
+ ? '无效的审核动作。请使用 `review approve <sample-id> [note]` 或 `review reject <sample-id> [note]`。'
20
+ : 'Invalid review action. Use `review approve <sample-id> [note]` or `review reject <sample-id> [note]`.',
21
+ };
22
+ }
23
+ if (!sampleId) {
24
+ return {
25
+ text: zh
26
+ ? '缺少 sample-id。'
27
+ : 'Missing sample-id.',
28
+ };
29
+ }
30
+ const normalizedDecision = decision === 'approve' ? 'approved' : 'rejected';
31
+ const note = noteParts.join(' ').trim();
32
+ let record;
33
+ try {
34
+ record = wctx.trajectory.reviewCorrectionSample(sampleId, normalizedDecision, note);
35
+ } catch (error) {
36
+ return {
37
+ text: zh
38
+ ? `审核样本失败:${sampleId}`
39
+ : `Failed to review sample: ${sampleId}`,
40
+ };
41
+ }
42
+ return {
43
+ text: zh
44
+ ? `样本 ${record.sampleId} 已标记为 ${record.reviewStatus}。`
45
+ : `Sample ${record.sampleId} marked as ${record.reviewStatus}.`,
46
+ };
47
+ }
48
+
49
+ const samples = wctx.trajectory.listCorrectionSamples('pending');
50
+ if (samples.length === 0) {
51
+ return { text: zh ? '当前没有待审核纠错样本。' : 'No pending correction samples.' };
52
+ }
53
+
54
+ const lines = samples.map((sample) => `- ${sample.sampleId} | session=${sample.sessionId} | score=${sample.qualityScore}`);
55
+ return {
56
+ text: zh
57
+ ? `待审核纠错样本:\n${lines.join('\n')}`
58
+ : `Pending correction samples:\n${lines.join('\n')}`,
59
+ };
60
+ }
@@ -0,0 +1,38 @@
1
+ import type { PluginCommandContext, PluginCommandResult } from '../openclaw-sdk.js';
2
+ import { WorkspaceContext } from '../core/workspace-context.js';
3
+
4
+ export function handleInitStrategy(ctx: PluginCommandContext): PluginCommandResult {
5
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
6
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
7
+
8
+ const okrDir = wctx.resolve('OKR_DIR').replace(workspaceDir, '').replace(/^\/+/, '');
9
+ const focusPath = wctx.resolve('CURRENT_FOCUS').replace(workspaceDir, '').replace(/^\/+/, '');
10
+ const userContextPath = wctx.resolve('USER_CONTEXT').replace(workspaceDir, '').replace(/^\/+/, '');
11
+
12
+ return {
13
+ text:
14
+ `🎯 **Strategy Initialization**\n\n` +
15
+ `The Agent will now conduct a deep interview to establish your project's vision and strategic OKRs.\n\n` +
16
+ `**Instructions for Agent:** Read \`${okrDir}/\` for existing context. ` +
17
+ `Generate \`${focusPath}\` with the top 1-3 strategic focus areas based on the user interview. ` +
18
+ `Then update \`${userContextPath}\` with key user preferences discovered.`,
19
+ };
20
+ }
21
+
22
+ export function handleManageOkr(ctx: PluginCommandContext): PluginCommandResult {
23
+ const workspaceDir = (ctx.config?.workspaceDir as string) || process.cwd();
24
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir, ...ctx.config });
25
+
26
+ const focusPath = wctx.resolve('CURRENT_FOCUS').replace(workspaceDir, '').replace(/^\/+/, '');
27
+ const weekStatePath = wctx.resolve('WEEK_STATE').replace(workspaceDir, '').replace(/^\/+/, '');
28
+
29
+ return {
30
+ text:
31
+ `📊 **OKR Management**\n\n` +
32
+ `The Agent will analyze recent work and align sub-agent objectives.\n\n` +
33
+ `**Instructions for Agent:** Read \`${focusPath}\` and \`${weekStatePath}\`. ` +
34
+ `Compare them against recent session history. ` +
35
+ `Update OKRs as needed and output a brief alignment report. ` +
36
+ `If OKRs are stale (>7 days), prompt the user for a re-alignment conversation.`,
37
+ };
38
+ }