principles-disciple 1.8.1 → 1.8.3

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 (508) 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/en/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  138. package/templates/langs/en/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  139. package/templates/langs/en/skills/ai-sprint-orchestration/SKILL.md +67 -0
  140. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  141. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  142. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  143. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  144. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  145. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  146. package/templates/langs/en/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  147. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  148. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  149. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  150. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  151. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  152. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  153. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  154. package/templates/langs/zh/skills/ai-sprint-orchestration/EXAMPLES.md +63 -0
  155. package/templates/langs/zh/skills/ai-sprint-orchestration/REFERENCE.md +136 -0
  156. package/templates/langs/zh/skills/ai-sprint-orchestration/SKILL.md +67 -0
  157. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +214 -0
  158. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +107 -0
  159. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +107 -0
  160. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +105 -0
  161. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +108 -0
  162. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1-acceptance-checklist.md +58 -0
  163. package/templates/langs/zh/skills/ai-sprint-orchestration/references/workflow-v1.4-work-unit-handoff.md +190 -0
  164. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -0
  165. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/archive.mjs +310 -0
  166. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/contract-enforcement.mjs +683 -0
  167. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/decision.mjs +604 -0
  168. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/state-store.mjs +32 -0
  169. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/lib/task-specs.mjs +707 -0
  170. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +3419 -0
  171. package/templates/langs/zh/skills/ai-sprint-orchestration/test/archive.test.mjs +230 -0
  172. package/templates/langs/zh/skills/ai-sprint-orchestration/test/contract-enforcement.test.mjs +672 -0
  173. package/templates/langs/zh/skills/ai-sprint-orchestration/test/decision.test.mjs +1321 -0
  174. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +1419 -0
  175. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  176. package/templates/pain_settings.json +2 -1
  177. package/tests/README.md +120 -0
  178. package/tests/build-artifacts.test.ts +111 -0
  179. package/tests/commands/evolution-status.test.ts +222 -0
  180. package/tests/commands/evolver.test.ts +22 -0
  181. package/tests/commands/export.test.ts +78 -0
  182. package/tests/commands/nocturnal-review.test.ts +448 -0
  183. package/tests/commands/nocturnal-train.test.ts +97 -0
  184. package/tests/commands/pain.test.ts +108 -0
  185. package/tests/commands/samples.test.ts +65 -0
  186. package/tests/commands/strategy.test.ts +34 -0
  187. package/tests/commands/thinking-os.test.ts +88 -0
  188. package/tests/core/adaptive-thresholds.test.ts +261 -0
  189. package/tests/core/config-service.test.ts +89 -0
  190. package/tests/core/config.test.ts +90 -0
  191. package/tests/core/control-ui-db.test.ts +75 -0
  192. package/tests/core/core-template-guidance.test.ts +21 -0
  193. package/tests/core/detection-funnel.test.ts +63 -0
  194. package/tests/core/detection-service.test.ts +50 -0
  195. package/tests/core/dictionary-service.test.ts +116 -0
  196. package/tests/core/dictionary.test.ts +168 -0
  197. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  198. package/tests/core/event-log.test.ts +181 -0
  199. package/tests/core/evolution-e2e.test.ts +58 -0
  200. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  201. package/tests/core/evolution-engine.test.ts +562 -0
  202. package/tests/core/evolution-logger.test.ts +148 -0
  203. package/tests/core/evolution-migration.test.ts +50 -0
  204. package/tests/core/evolution-paths.test.ts +21 -0
  205. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  206. package/tests/core/evolution-reducer.test.ts +180 -0
  207. package/tests/core/evolution-types-loop.test.ts +48 -0
  208. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  209. package/tests/core/external-training-contract.test.ts +463 -0
  210. package/tests/core/focus-history.test.ts +682 -0
  211. package/tests/core/init-flatten.test.ts +69 -0
  212. package/tests/core/init-refactor.test.ts +87 -0
  213. package/tests/core/init-v1.3.test.ts +46 -0
  214. package/tests/core/init.test.ts +190 -0
  215. package/tests/core/local-worker-routing.test.ts +757 -0
  216. package/tests/core/migration.test.ts +84 -0
  217. package/tests/core/model-deployment-registry.test.ts +845 -0
  218. package/tests/core/model-training-registry.test.ts +889 -0
  219. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  220. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  221. package/tests/core/nocturnal-compliance.test.ts +646 -0
  222. package/tests/core/nocturnal-dataset.test.ts +892 -0
  223. package/tests/core/nocturnal-executability.test.ts +357 -0
  224. package/tests/core/nocturnal-export.test.ts +462 -0
  225. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  226. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  227. package/tests/core/nocturnal-trinity.test.ts +953 -0
  228. package/tests/core/pain.test.ts +33 -0
  229. package/tests/core/path-resolver.test.ts +57 -0
  230. package/tests/core/paths-refactor.test.ts +42 -0
  231. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  232. package/tests/core/principle-training-state.test.ts +712 -0
  233. package/tests/core/profile.test.ts +56 -0
  234. package/tests/core/promotion-gate.test.ts +556 -0
  235. package/tests/core/risk-calculator.test.ts +168 -0
  236. package/tests/core/session-tracker.test.ts +191 -0
  237. package/tests/core/training-program.test.ts +472 -0
  238. package/tests/core/trajectory.test.ts +265 -0
  239. package/tests/core/workspace-context-factory.test.ts +18 -0
  240. package/tests/core/workspace-context.test.ts +134 -0
  241. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  242. package/tests/fixtures/production-compatibility.test.ts +147 -0
  243. package/tests/fixtures/production-mock-generator.ts +282 -0
  244. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  245. package/tests/hooks/bash-risk.test.ts +81 -0
  246. package/tests/hooks/edit-verification.test.ts +678 -0
  247. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  248. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  249. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  250. package/tests/hooks/gate.test.ts +271 -0
  251. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  252. package/tests/hooks/gfi-gate.test.ts +669 -0
  253. package/tests/hooks/lifecycle.test.ts +248 -0
  254. package/tests/hooks/llm.test.ts +308 -0
  255. package/tests/hooks/message-sanitize.test.ts +36 -0
  256. package/tests/hooks/pain.test.ts +141 -0
  257. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  258. package/tests/hooks/prompt.test.ts +1411 -0
  259. package/tests/hooks/subagent.test.ts +467 -0
  260. package/tests/hooks/thinking-gate.test.ts +313 -0
  261. package/tests/http/principles-console-route.test.ts +140 -0
  262. package/tests/hygiene-tracker.test.ts +77 -0
  263. package/tests/index.integration.test.ts +179 -0
  264. package/tests/index.shadow-routing.integration.test.ts +140 -0
  265. package/tests/index.test.ts +9 -0
  266. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  267. package/tests/service/control-ui-query-service.test.ts +121 -0
  268. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  269. package/tests/service/evolution-worker.test.ts +585 -0
  270. package/tests/service/nocturnal-runtime.test.ts +470 -0
  271. package/tests/service/nocturnal-service.test.ts +577 -0
  272. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  273. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  274. package/tests/service/phase3-input-filter.test.ts +289 -0
  275. package/tests/service/runtime-summary-service.test.ts +919 -0
  276. package/tests/task-compliance.test.ts +166 -0
  277. package/tests/test-utils.ts +48 -0
  278. package/tests/tools/critique-prompt.test.ts +260 -0
  279. package/tests/tools/deep-reflect.test.ts +232 -0
  280. package/tests/tools/model-index.test.ts +246 -0
  281. package/tests/ui/app.test.tsx +114 -0
  282. package/tests/utils/file-lock.test.ts +407 -0
  283. package/tests/utils/hashing.test.ts +32 -0
  284. package/tests/utils/io.test.ts +39 -0
  285. package/tests/utils/nlp.test.ts +53 -0
  286. package/tests/utils/plugin-logger.test.ts +156 -0
  287. package/tsconfig.json +16 -0
  288. package/tsconfig.tsbuildinfo +1 -0
  289. package/ui/src/App.tsx +45 -0
  290. package/ui/src/api.ts +216 -0
  291. package/ui/src/charts.tsx +586 -0
  292. package/ui/src/components/ErrorState.tsx +6 -0
  293. package/ui/src/components/Loading.tsx +13 -0
  294. package/ui/src/components/ProtectedRoute.tsx +12 -0
  295. package/ui/src/components/Shell.tsx +91 -0
  296. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  297. package/ui/src/components/index.ts +5 -0
  298. package/ui/src/context/auth.tsx +80 -0
  299. package/ui/src/context/theme.tsx +66 -0
  300. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  301. package/ui/src/i18n/ui.ts +363 -0
  302. package/ui/src/main.tsx +16 -0
  303. package/ui/src/pages/EvolutionPage.tsx +352 -0
  304. package/ui/src/pages/FeedbackPage.tsx +140 -0
  305. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  306. package/ui/src/pages/LoginPage.tsx +88 -0
  307. package/ui/src/pages/OverviewPage.tsx +238 -0
  308. package/ui/src/pages/SamplesPage.tsx +174 -0
  309. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  310. package/ui/src/styles.css +1661 -0
  311. package/ui/src/types.ts +368 -0
  312. package/ui/src/utils/format.ts +15 -0
  313. package/vitest.config.ts +23 -0
  314. package/dist/commands/capabilities.d.ts +0 -3
  315. package/dist/commands/capabilities.js +0 -73
  316. package/dist/commands/context.d.ts +0 -5
  317. package/dist/commands/evolution-status.d.ts +0 -4
  318. package/dist/commands/evolution-status.js +0 -117
  319. package/dist/commands/evolver.d.ts +0 -9
  320. package/dist/commands/evolver.js +0 -26
  321. package/dist/commands/export.d.ts +0 -2
  322. package/dist/commands/export.js +0 -98
  323. package/dist/commands/focus.d.ts +0 -14
  324. package/dist/commands/focus.js +0 -457
  325. package/dist/commands/nocturnal-review.d.ts +0 -24
  326. package/dist/commands/nocturnal-review.js +0 -265
  327. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  328. package/dist/commands/nocturnal-rollout.js +0 -671
  329. package/dist/commands/nocturnal-train.d.ts +0 -25
  330. package/dist/commands/nocturnal-train.js +0 -919
  331. package/dist/commands/pain.d.ts +0 -5
  332. package/dist/commands/principle-rollback.d.ts +0 -4
  333. package/dist/commands/principle-rollback.js +0 -22
  334. package/dist/commands/rollback.d.ts +0 -19
  335. package/dist/commands/samples.d.ts +0 -2
  336. package/dist/commands/samples.js +0 -55
  337. package/dist/commands/strategy.d.ts +0 -3
  338. package/dist/commands/strategy.js +0 -29
  339. package/dist/commands/thinking-os.d.ts +0 -2
  340. package/dist/config/defaults/runtime.d.ts +0 -40
  341. package/dist/config/errors.d.ts +0 -84
  342. package/dist/config/errors.js +0 -94
  343. package/dist/config/index.js +0 -7
  344. package/dist/constants/diagnostician.d.ts +0 -12
  345. package/dist/constants/diagnostician.js +0 -56
  346. package/dist/constants/tools.d.ts +0 -17
  347. package/dist/constants/tools.js +0 -54
  348. package/dist/core/adaptive-thresholds.d.ts +0 -186
  349. package/dist/core/adaptive-thresholds.js +0 -300
  350. package/dist/core/config-service.d.ts +0 -15
  351. package/dist/core/config.d.ts +0 -129
  352. package/dist/core/control-ui-db.d.ts +0 -95
  353. package/dist/core/control-ui-db.js +0 -292
  354. package/dist/core/detection-funnel.d.ts +0 -33
  355. package/dist/core/detection-service.d.ts +0 -15
  356. package/dist/core/dictionary-service.d.ts +0 -15
  357. package/dist/core/dictionary.d.ts +0 -38
  358. package/dist/core/event-log.d.ts +0 -82
  359. package/dist/core/event-log.js +0 -463
  360. package/dist/core/evolution-engine.d.ts +0 -118
  361. package/dist/core/evolution-engine.js +0 -464
  362. package/dist/core/evolution-logger.d.ts +0 -137
  363. package/dist/core/evolution-logger.js +0 -256
  364. package/dist/core/evolution-migration.d.ts +0 -5
  365. package/dist/core/evolution-migration.js +0 -65
  366. package/dist/core/evolution-reducer.d.ts +0 -98
  367. package/dist/core/evolution-reducer.js +0 -465
  368. package/dist/core/evolution-types.d.ts +0 -287
  369. package/dist/core/evolution-types.js +0 -78
  370. package/dist/core/external-training-contract.d.ts +0 -276
  371. package/dist/core/external-training-contract.js +0 -269
  372. package/dist/core/focus-history.d.ts +0 -210
  373. package/dist/core/focus-history.js +0 -1185
  374. package/dist/core/hygiene/tracker.d.ts +0 -22
  375. package/dist/core/hygiene/tracker.js +0 -106
  376. package/dist/core/init.d.ts +0 -12
  377. package/dist/core/local-worker-routing.d.ts +0 -175
  378. package/dist/core/local-worker-routing.js +0 -525
  379. package/dist/core/migration.d.ts +0 -6
  380. package/dist/core/model-deployment-registry.d.ts +0 -218
  381. package/dist/core/model-deployment-registry.js +0 -503
  382. package/dist/core/model-training-registry.d.ts +0 -295
  383. package/dist/core/model-training-registry.js +0 -475
  384. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  385. package/dist/core/nocturnal-arbiter.js +0 -534
  386. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  387. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  388. package/dist/core/nocturnal-compliance.d.ts +0 -175
  389. package/dist/core/nocturnal-compliance.js +0 -824
  390. package/dist/core/nocturnal-dataset.d.ts +0 -224
  391. package/dist/core/nocturnal-dataset.js +0 -443
  392. package/dist/core/nocturnal-executability.d.ts +0 -85
  393. package/dist/core/nocturnal-executability.js +0 -331
  394. package/dist/core/nocturnal-export.d.ts +0 -124
  395. package/dist/core/nocturnal-export.js +0 -275
  396. package/dist/core/nocturnal-paths.d.ts +0 -124
  397. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  398. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  399. package/dist/core/nocturnal-trinity.d.ts +0 -311
  400. package/dist/core/nocturnal-trinity.js +0 -880
  401. package/dist/core/pain.d.ts +0 -4
  402. package/dist/core/pain.js +0 -70
  403. package/dist/core/path-resolver.d.ts +0 -46
  404. package/dist/core/paths.d.ts +0 -65
  405. package/dist/core/principle-training-state.d.ts +0 -121
  406. package/dist/core/principle-training-state.js +0 -321
  407. package/dist/core/profile.d.ts +0 -62
  408. package/dist/core/profile.js +0 -210
  409. package/dist/core/promotion-gate.d.ts +0 -238
  410. package/dist/core/promotion-gate.js +0 -529
  411. package/dist/core/risk-calculator.d.ts +0 -22
  412. package/dist/core/session-tracker.d.ts +0 -101
  413. package/dist/core/shadow-observation-registry.d.ts +0 -217
  414. package/dist/core/shadow-observation-registry.js +0 -308
  415. package/dist/core/system-logger.d.ts +0 -8
  416. package/dist/core/thinking-models.d.ts +0 -38
  417. package/dist/core/thinking-models.js +0 -170
  418. package/dist/core/training-program.d.ts +0 -233
  419. package/dist/core/training-program.js +0 -433
  420. package/dist/core/trajectory.d.ts +0 -411
  421. package/dist/core/trajectory.js +0 -1307
  422. package/dist/core/workspace-context.d.ts +0 -71
  423. package/dist/hooks/bash-risk.d.ts +0 -57
  424. package/dist/hooks/bash-risk.js +0 -137
  425. package/dist/hooks/edit-verification.d.ts +0 -62
  426. package/dist/hooks/edit-verification.js +0 -256
  427. package/dist/hooks/gate-block-helper.d.ts +0 -44
  428. package/dist/hooks/gate-block-helper.js +0 -119
  429. package/dist/hooks/gate.d.ts +0 -24
  430. package/dist/hooks/gate.js +0 -173
  431. package/dist/hooks/gfi-gate.d.ts +0 -40
  432. package/dist/hooks/gfi-gate.js +0 -113
  433. package/dist/hooks/lifecycle.d.ts +0 -5
  434. package/dist/hooks/lifecycle.js +0 -284
  435. package/dist/hooks/llm.d.ts +0 -13
  436. package/dist/hooks/message-sanitize.d.ts +0 -3
  437. package/dist/hooks/message-sanitize.js +0 -37
  438. package/dist/hooks/pain.d.ts +0 -5
  439. package/dist/hooks/pain.js +0 -301
  440. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  441. package/dist/hooks/progressive-trust-gate.js +0 -134
  442. package/dist/hooks/prompt.d.ts +0 -49
  443. package/dist/hooks/prompt.js +0 -905
  444. package/dist/hooks/subagent.d.ts +0 -10
  445. package/dist/hooks/subagent.js +0 -387
  446. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  447. package/dist/hooks/thinking-checkpoint.js +0 -51
  448. package/dist/hooks/trajectory-collector.d.ts +0 -32
  449. package/dist/hooks/trajectory-collector.js +0 -256
  450. package/dist/http/principles-console-route.d.ts +0 -9
  451. package/dist/http/principles-console-route.js +0 -681
  452. package/dist/i18n/commands.d.ts +0 -26
  453. package/dist/i18n/commands.js +0 -116
  454. package/dist/index.d.ts +0 -7
  455. package/dist/index.js +0 -581
  456. package/dist/service/central-database.d.ts +0 -104
  457. package/dist/service/central-database.js +0 -649
  458. package/dist/service/control-ui-query-service.d.ts +0 -221
  459. package/dist/service/control-ui-query-service.js +0 -543
  460. package/dist/service/empathy-observer-manager.d.ts +0 -88
  461. package/dist/service/empathy-observer-manager.js +0 -414
  462. package/dist/service/evolution-query-service.d.ts +0 -155
  463. package/dist/service/evolution-query-service.js +0 -258
  464. package/dist/service/evolution-worker.d.ts +0 -101
  465. package/dist/service/evolution-worker.js +0 -975
  466. package/dist/service/health-query-service.d.ts +0 -170
  467. package/dist/service/health-query-service.js +0 -662
  468. package/dist/service/nocturnal-runtime.d.ts +0 -183
  469. package/dist/service/nocturnal-service.d.ts +0 -163
  470. package/dist/service/nocturnal-service.js +0 -787
  471. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  472. package/dist/service/nocturnal-target-selector.js +0 -315
  473. package/dist/service/phase3-input-filter.d.ts +0 -73
  474. package/dist/service/phase3-input-filter.js +0 -172
  475. package/dist/service/runtime-summary-service.d.ts +0 -122
  476. package/dist/service/runtime-summary-service.js +0 -485
  477. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  478. package/dist/service/subagent-workflow/index.d.ts +0 -4
  479. package/dist/service/subagent-workflow/index.js +0 -3
  480. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  481. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  482. package/dist/service/subagent-workflow/types.js +0 -11
  483. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  484. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  485. package/dist/service/trajectory-service.d.ts +0 -2
  486. package/dist/service/trajectory-service.js +0 -15
  487. package/dist/tools/critique-prompt.d.ts +0 -14
  488. package/dist/tools/deep-reflect.d.ts +0 -39
  489. package/dist/tools/deep-reflect.js +0 -350
  490. package/dist/tools/model-index.d.ts +0 -9
  491. package/dist/types/event-types.d.ts +0 -306
  492. package/dist/types/event-types.js +0 -106
  493. package/dist/types/hygiene-types.d.ts +0 -20
  494. package/dist/types/hygiene-types.js +0 -12
  495. package/dist/types/runtime-summary.d.ts +0 -47
  496. package/dist/types/runtime-summary.js +0 -1
  497. package/dist/types.d.ts +0 -50
  498. package/dist/types.js +0 -22
  499. package/dist/utils/file-lock.d.ts +0 -71
  500. package/dist/utils/file-lock.js +0 -309
  501. package/dist/utils/glob-match.d.ts +0 -28
  502. package/dist/utils/hashing.d.ts +0 -9
  503. package/dist/utils/io.d.ts +0 -6
  504. package/dist/utils/io.js +0 -106
  505. package/dist/utils/nlp.d.ts +0 -9
  506. package/dist/utils/plugin-logger.d.ts +0 -39
  507. package/dist/utils/subagent-probe.d.ts +0 -34
  508. package/dist/utils/subagent-probe.js +0 -81
@@ -1,284 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import * as readline from 'readline';
4
- import { writePainFlag } from '../core/pain.js';
5
- import { WorkspaceContext } from '../core/workspace-context.js';
6
- import { PD_DIRS } from '../core/paths.js';
7
- import { extractWorkingMemory, mergeWorkingMemory } from '../core/focus-history.js';
8
- export async function handleBeforeReset(event, ctx) {
9
- if (!ctx.workspaceDir || !event.messages || event.messages.length === 0) {
10
- return;
11
- }
12
- const wctx = WorkspaceContext.fromHookContext(ctx);
13
- // Auto-summarise pain points before the session is cleared
14
- const painPoints = event.messages.filter((msg) => {
15
- const m = msg;
16
- return (m.role === 'assistant' &&
17
- typeof m.content === 'string' &&
18
- (m.content.includes('error') || m.content.includes('fail') || m.content.includes('blocked')));
19
- });
20
- if (painPoints.length > 0) {
21
- const memoryPath = wctx.resolve('MEMORY_MD');
22
- const summary = `\n## [${new Date().toISOString()}] Session Reset Summary (Reason: ${event.reason ?? 'Manual'})\n` +
23
- `- Encountered ${painPoints.length} potential pain point(s) during this session.\n` +
24
- `- Action: Consider running /reflection to solidify these into principles.\n`;
25
- try {
26
- fs.appendFileSync(memoryPath, summary, 'utf8');
27
- }
28
- catch (_e) {
29
- console.error(`[PD:Lifecycle] Failed to write session reset summary: ${String(_e)}`);
30
- }
31
- }
32
- }
33
- export async function extractPainFromSessionFile(sessionFile, ctx) {
34
- const painPoints = [];
35
- const workspaceDir = ctx.workspaceDir;
36
- if (!workspaceDir)
37
- return;
38
- const wctx = WorkspaceContext.fromHookContext(ctx);
39
- if (!fs.existsSync(sessionFile)) {
40
- if (ctx.logger?.debug)
41
- ctx.logger.debug(`[Pain Extractor] Session file not found: ${sessionFile}`);
42
- return;
43
- }
44
- if (ctx.logger)
45
- ctx.logger.info(`[Pain Extractor] Scanning session transcript for pain signals: ${sessionFile}`);
46
- const fileStream = fs.createReadStream(sessionFile);
47
- const rl = readline.createInterface({
48
- input: fileStream,
49
- crlfDelay: Infinity
50
- });
51
- try {
52
- for await (const line of rl) {
53
- try {
54
- if (!line.trim())
55
- continue;
56
- const msg = JSON.parse(line);
57
- if (msg.role !== 'assistant')
58
- continue;
59
- let text = '';
60
- if (typeof msg.content === 'string') {
61
- text = msg.content;
62
- }
63
- else if (Array.isArray(msg.content)) {
64
- text = msg.content
65
- .filter(c => c && c.type === 'text' && typeof c.text === 'string')
66
- .map(c => c.text)
67
- .join('\n');
68
- }
69
- else if (msg.usage && msg.usage.outputText) {
70
- text = msg.usage.outputText;
71
- }
72
- if (!text)
73
- continue;
74
- if (msg.openclawAbort?.aborted) {
75
- const runIdSafe = msg.openclawAbort?.runId || 'unknown';
76
- if (ctx.logger)
77
- ctx.logger.info(`[Pain Extractor] Detected hard-abort snapshot (runId: ${runIdSafe})`);
78
- painPoints.push(`[FATAL INTERCEPT] 动作被沙箱防御机制强制击落。大模型被击落前的思考流 (未遂动机): ${text.substring(0, 250)}...`);
79
- continue;
80
- }
81
- if (msg.__openclaw?.truncated && msg.__openclaw?.reason === 'oversized') {
82
- if (ctx.logger)
83
- ctx.logger.info(`[Pain Extractor] Detected oversized data truncation placeholder`);
84
- painPoints.push(`[COGNITIVE OVERLOAD] 大模型尝试读取极大体积的输入,已被底层守护程序抹除/折叠防爆。请反思是否读取了不当的文件或日志: ${text.substring(0, 150)}...`);
85
- continue;
86
- }
87
- const lower = text.toLowerCase();
88
- if (lower.includes('i\'m sorry, but i\'m still getting') ||
89
- lower.includes('i apologize for the confusion') ||
90
- lower.includes('this is taking longer than expected')) {
91
- if (ctx.logger?.debug)
92
- ctx.logger.debug(`[Pain Extractor] Detected semantic confusion string.`);
93
- painPoints.push(`[SEMANTIC CONFUSION] ${text.substring(0, 150)}...`);
94
- }
95
- }
96
- catch (e) {
97
- console.error(`[PD:Lifecycle] Error parsing message: ${String(e)}`);
98
- }
99
- }
100
- }
101
- finally {
102
- try {
103
- rl.close();
104
- fileStream.destroy();
105
- }
106
- catch (_e) {
107
- // Ignore cleanup errors
108
- }
109
- }
110
- if (painPoints.length > 0) {
111
- const dateStr = new Date().toISOString().split('T')[0];
112
- const dailyLogPath = path.join(workspaceDir, PD_DIRS.MEMORY, `${dateStr}.md`);
113
- const timestamp = new Date().toISOString();
114
- let entry = `\n## [${timestamp}] Consolidated Pain (Pre-Compaction)\n\n`;
115
- entry += `### Pain Signals extracted from session transcript\n`;
116
- painPoints.slice(-5).forEach((p, idx) => {
117
- entry += `- [Signal ${idx + 1}] ${p.replace(/\n/g, ' ')}\n`;
118
- });
119
- entry += `\n### Diagnosis (Pending)\n- Run /evolve-task to diagnose. Deep dive using memory_search if needed.\n`;
120
- try {
121
- const dir = path.dirname(dailyLogPath);
122
- if (!fs.existsSync(dir))
123
- fs.mkdirSync(dir, { recursive: true });
124
- fs.appendFileSync(dailyLogPath, entry, 'utf8');
125
- const semanticPath = wctx.resolve('SEMANTIC_PAIN');
126
- const semanticDir = path.dirname(semanticPath);
127
- if (!fs.existsSync(semanticDir))
128
- fs.mkdirSync(semanticDir, { recursive: true });
129
- let semanticEntry = `\n### Sample ${timestamp}\n- Source: compaction\n\n\`\`\`\n${painPoints.join('\n---\n')}\n\`\`\`\n`;
130
- fs.appendFileSync(semanticPath, semanticEntry, 'utf8');
131
- const hasFatal = painPoints.some(p => p.includes('[FATAL INTERCEPT]'));
132
- if (hasFatal) {
133
- writePainFlag(workspaceDir, {
134
- source: 'intercept_extraction',
135
- score: '100',
136
- time: new Date().toISOString(),
137
- reason: 'Hard intercept detected in session history compaction.',
138
- is_risky: 'true',
139
- trigger_text_preview: painPoints.find(p => p.includes('[FATAL INTERCEPT]'))?.substring(0, 150) || 'Fatal intercept'
140
- });
141
- }
142
- }
143
- catch (err) {
144
- console.error(`[PD:Lifecycle] Failed to write pain signals: ${String(err)}`);
145
- }
146
- }
147
- }
148
- export async function handleBeforeCompaction(event, ctx) {
149
- if (!ctx.workspaceDir)
150
- return;
151
- const wctx = WorkspaceContext.fromHookContext(ctx);
152
- const dateStr = new Date().toISOString().split('T')[0];
153
- const checkpointPath = path.join(ctx.workspaceDir, PD_DIRS.MEMORY, `${dateStr}.md`);
154
- const log = `\n## [${new Date().toISOString()}] Pre-Compaction Checkpoint\n` +
155
- `- Compacting session with ${event.messageCount} messages.\n` +
156
- `- Ensuring critical state is flushed to disk.\n`;
157
- try {
158
- const dir = path.dirname(checkpointPath);
159
- if (!fs.existsSync(dir))
160
- fs.mkdirSync(dir, { recursive: true });
161
- fs.appendFileSync(checkpointPath, log, 'utf8');
162
- }
163
- catch (_e) {
164
- console.error(`[PD:Lifecycle] Failed to write pre-compaction checkpoint: ${String(_e)}`);
165
- }
166
- // 提取工作记忆(从 sessionFile)
167
- if (event.sessionFile) {
168
- await extractPainFromSessionFile(event.sessionFile, ctx);
169
- // 新增:提取并保存工作记忆
170
- await extractAndSaveWorkingMemory(event.sessionFile, ctx, wctx);
171
- }
172
- }
173
- /**
174
- * 从会话文件提取工作记忆并保存到 CURRENT_FOCUS.md
175
- */
176
- async function extractAndSaveWorkingMemory(sessionFile, ctx, wctx) {
177
- if (!fs.existsSync(sessionFile)) {
178
- if (ctx.logger?.debug)
179
- ctx.logger.debug(`[WorkingMemory] Session file not found: ${sessionFile}`);
180
- return;
181
- }
182
- const messages = [];
183
- let lineCount = 0;
184
- const MAX_LINES = 1000; // 限制处理的行数,避免内存问题
185
- // 读取会话文件
186
- const fileStream = fs.createReadStream(sessionFile);
187
- const rl = readline.createInterface({
188
- input: fileStream,
189
- crlfDelay: Infinity
190
- });
191
- try {
192
- for await (const line of rl) {
193
- if (lineCount >= MAX_LINES)
194
- break;
195
- if (!line.trim())
196
- continue;
197
- lineCount++;
198
- try {
199
- const msg = JSON.parse(line);
200
- messages.push(msg);
201
- }
202
- catch {
203
- // 忽略解析错误
204
- }
205
- }
206
- }
207
- finally {
208
- try {
209
- rl.close();
210
- fileStream.destroy();
211
- }
212
- catch {
213
- // 忽略清理错误
214
- }
215
- }
216
- if (messages.length === 0) {
217
- if (ctx.logger?.debug)
218
- ctx.logger.debug(`[WorkingMemory] No messages found in session file`);
219
- return;
220
- }
221
- // 提取工作记忆
222
- const snapshot = extractWorkingMemory(messages, ctx.workspaceDir);
223
- // 检查是否有有效内容
224
- if (snapshot.artifacts.length === 0 &&
225
- snapshot.activeProblems.length === 0 &&
226
- snapshot.nextActions.length === 0) {
227
- if (ctx.logger?.debug)
228
- ctx.logger.debug(`[WorkingMemory] No working memory to preserve`);
229
- return;
230
- }
231
- // 读取并更新 CURRENT_FOCUS.md
232
- const focusPath = wctx.resolve('CURRENT_FOCUS');
233
- try {
234
- let content = '';
235
- if (fs.existsSync(focusPath)) {
236
- content = fs.readFileSync(focusPath, 'utf-8');
237
- // 备份原文件(防止损坏)
238
- const backupPath = `${focusPath}.wm-backup`;
239
- fs.copyFileSync(focusPath, backupPath);
240
- }
241
- // 合并工作记忆
242
- const updatedContent = mergeWorkingMemory(content, snapshot);
243
- // 确保目录存在
244
- const focusDir = path.dirname(focusPath);
245
- if (!fs.existsSync(focusDir)) {
246
- fs.mkdirSync(focusDir, { recursive: true });
247
- }
248
- // 写入文件
249
- fs.writeFileSync(focusPath, updatedContent, 'utf-8');
250
- if (ctx.logger) {
251
- ctx.logger.info(`[WorkingMemory] Preserved ${snapshot.artifacts.length} artifacts, ` +
252
- `${snapshot.activeProblems.length} problems, ` +
253
- `${snapshot.nextActions.length} next actions to CURRENT_FOCUS.md`);
254
- }
255
- }
256
- catch (err) {
257
- console.error(`[PD:Lifecycle] Failed to save working memory: ${String(err)}`);
258
- // 尝试恢复备份
259
- const backupPath = `${focusPath}.wm-backup`;
260
- if (fs.existsSync(backupPath)) {
261
- try {
262
- fs.copyFileSync(backupPath, focusPath);
263
- if (ctx.logger)
264
- ctx.logger.warn(`[WorkingMemory] Restored from backup after failure`);
265
- }
266
- catch {
267
- // 忽略恢复错误
268
- }
269
- }
270
- }
271
- }
272
- export async function handleAfterCompaction(event, ctx) {
273
- if (!ctx.workspaceDir)
274
- return;
275
- const dateStr = new Date().toISOString().split('T')[0];
276
- const checkpointPath = path.join(ctx.workspaceDir, PD_DIRS.MEMORY, `${dateStr}.md`);
277
- const log = `- Post-Compaction Complete. Reduced active context to ${event.messageCount} messages.\n`;
278
- try {
279
- fs.appendFileSync(checkpointPath, log, 'utf8');
280
- }
281
- catch (_e) {
282
- console.error(`[PD:Lifecycle] Failed to write post-compaction checkpoint: ${String(_e)}`);
283
- }
284
- }
@@ -1,13 +0,0 @@
1
- import { PluginHookLlmOutputEvent, PluginHookAgentContext } from '../openclaw-sdk.js';
2
- export interface EmpathySignal {
3
- detected: boolean;
4
- severity: 'mild' | 'moderate' | 'severe';
5
- confidence: number;
6
- reason?: string;
7
- mode?: 'structured' | 'legacy_tag';
8
- }
9
- export declare function extractEmpathySignal(text: string): EmpathySignal;
10
- export declare function isEmpathyAuditPayload(text: string): boolean;
11
- export declare function handleLlmOutput(event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext & {
12
- workspaceDir?: string;
13
- }): void;
@@ -1,3 +0,0 @@
1
- import type { PluginHookBeforeMessageWriteEvent, PluginHookBeforeMessageWriteResult } from '../openclaw-sdk.js';
2
- export declare function sanitizeAssistantText(text: string): string;
3
- export declare function handleBeforeMessageWrite(event: PluginHookBeforeMessageWriteEvent): PluginHookBeforeMessageWriteResult | void;
@@ -1,37 +0,0 @@
1
- const INTERNAL_TAG_PATTERNS = [
2
- /\[EMOTIONAL_DAMAGE_DETECTED(?::(?:mild|moderate|severe))?\]/gi,
3
- /\[EMPATHY_ROLLBACK_REQUEST\]/gi,
4
- /<empathy\s+[^>]*\/?>(?:<\/empathy>)?/gi,
5
- ];
6
- export function sanitizeAssistantText(text) {
7
- let result = text;
8
- for (const pattern of INTERNAL_TAG_PATTERNS) {
9
- result = result.replace(pattern, '');
10
- }
11
- return result
12
- .replace(/[ \t]+\n/g, '\n')
13
- .replace(/\n{3,}/g, '\n\n')
14
- .trim();
15
- }
16
- export function handleBeforeMessageWrite(event) {
17
- const msg = event.message;
18
- if (!msg || msg.role !== 'assistant')
19
- return;
20
- if (typeof msg.content === 'string') {
21
- const sanitized = sanitizeAssistantText(msg.content);
22
- if (sanitized !== msg.content) {
23
- return { message: { ...msg, content: sanitized } };
24
- }
25
- return;
26
- }
27
- if (Array.isArray(msg.content)) {
28
- const next = msg.content.map((part) => {
29
- if (part && typeof part === 'object' && part.type === 'text' && typeof part.text === 'string') {
30
- return { ...part, text: sanitizeAssistantText(part.text) };
31
- }
32
- return part;
33
- });
34
- return { message: { ...msg, content: next } };
35
- }
36
- return;
37
- }
@@ -1,5 +0,0 @@
1
- import type { PluginHookAfterToolCallEvent, PluginHookToolContext, OpenClawPluginApi } from '../openclaw-sdk.js';
2
- export declare function handleAfterToolCall(event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext & {
3
- workspaceDir?: string;
4
- pluginConfig?: Record<string, unknown>;
5
- }, api?: OpenClawPluginApi): void;
@@ -1,301 +0,0 @@
1
- import * as fs from 'fs';
2
- import { isRisky, normalizePath } from '../utils/io.js';
3
- import { normalizeProfile } from '../core/profile.js';
4
- import { computePainScore, writePainFlag } from '../core/pain.js';
5
- import { getSession, trackFriction, resetFriction, getInjectedProbationIds, clearInjectedProbationIds } from '../core/session-tracker.js';
6
- import { denoiseError, computeHash } from '../utils/hashing.js';
7
- import { SystemLogger } from '../core/system-logger.js';
8
- import { WorkspaceContext } from '../core/workspace-context.js';
9
- import { getEvolutionLogger, createTraceId } from '../core/evolution-logger.js';
10
- import { recordEvolutionSuccess, recordEvolutionFailure } from '../core/evolution-engine.js';
11
- const WRITE_TOOLS = ['write', 'edit', 'apply_patch', 'write_file', 'edit_file', 'replace'];
12
- function shouldAttributePrincipleToTool(principle, toolName) {
13
- return principle.contextTags.includes(toolName) || principle.trigger.includes(toolName);
14
- }
15
- function emitPainDetectedEvent(wctx, event) {
16
- try {
17
- wctx.evolutionReducer.emitSync(event);
18
- }
19
- catch (e) {
20
- SystemLogger.log(wctx.workspaceDir, 'EVOLUTION_EMIT_WARN', `Failed to emit evolution event: ${String(e)}`);
21
- }
22
- }
23
- function createPainId(sessionId) {
24
- return `pain_${Date.now()}_${computeHash(sessionId).slice(0, 8)}`;
25
- }
26
- export function handleAfterToolCall(event, ctx, api) {
27
- const effectiveWorkspaceDir = ctx.workspaceDir || api?.workspaceDir || api?.resolvePath?.('.');
28
- if (!effectiveWorkspaceDir) {
29
- return;
30
- }
31
- const wctx = WorkspaceContext.fromHookContext({ ...ctx, workspaceDir: effectiveWorkspaceDir });
32
- const config = wctx.config;
33
- const eventLog = wctx.eventLog;
34
- const sessionId = ctx.sessionId || 'unknown';
35
- const sessionState = ctx.sessionId ? getSession(ctx.sessionId) : undefined;
36
- const gfiBefore = sessionState?.currentGfi ?? 0;
37
- const params = event.params;
38
- // ── Track A: Empirical Friction (GFI) ──
39
- // 0. Special Case: Manual Pain Intervention
40
- if (event.toolName === 'pain' || event.toolName === 'skill:pain') {
41
- const reason = params.input || params.arguments || 'Manual intervention';
42
- const traceId = createTraceId();
43
- trackFriction(sessionId, 100, 'manual_pain', effectiveWorkspaceDir);
44
- SystemLogger.log(effectiveWorkspaceDir, 'MANUAL_PAIN', `User manually triggered pain: ${reason}`);
45
- eventLog.recordPainSignal(sessionId, {
46
- score: 100,
47
- source: 'manual',
48
- reason: `User intervention: ${reason}`,
49
- isRisky: true
50
- });
51
- wctx.trajectory?.recordPainEvent?.({
52
- sessionId,
53
- source: 'manual',
54
- score: 100,
55
- reason: `User intervention: ${reason}`,
56
- origin: 'user_manual',
57
- });
58
- // Log to EvolutionLogger
59
- const evoLogger = getEvolutionLogger(effectiveWorkspaceDir, wctx.trajectory);
60
- evoLogger.logPainDetected({
61
- traceId,
62
- source: 'manual',
63
- reason: `User intervention: ${reason}`,
64
- score: 100,
65
- toolName: event.toolName,
66
- sessionId,
67
- });
68
- emitPainDetectedEvent(wctx, {
69
- ts: new Date().toISOString(),
70
- type: 'pain_detected',
71
- data: {
72
- painId: createPainId(sessionId),
73
- painType: 'user_frustration',
74
- source: event.toolName,
75
- reason: `User intervention: ${reason}`,
76
- score: 100,
77
- sessionId,
78
- traceId,
79
- agentId: ctx.agentId,
80
- },
81
- });
82
- return;
83
- }
84
- // 1. Determine if this was a failure
85
- const exitCode = (event.result && typeof event.result === 'object') ? event.result.exitCode : 0;
86
- const isFailure = !!event.error || (exitCode !== 0 && exitCode !== undefined);
87
- if (isFailure) {
88
- const errorText = event.error || (typeof event.result === 'string' ? event.result : JSON.stringify(event.result));
89
- const denoised = denoiseError(errorText);
90
- const hash = computeHash(denoised);
91
- const deltaF = config.get('scores.tool_failure_friction') || 30;
92
- const updatedState = trackFriction(sessionId, deltaF, hash, effectiveWorkspaceDir);
93
- // ── Trust Engine: Record failure ──
94
- const errorType = extractErrorType(event.error || errorText);
95
- const filePath = params.file_path || params.path || params.file;
96
- const relPath = typeof filePath === 'string' ? normalizePath(filePath, effectiveWorkspaceDir) : 'unknown';
97
- // Load profile for risk_paths check
98
- const profilePath = wctx.resolve('PROFILE');
99
- let profile = normalizeProfile({});
100
- if (fs.existsSync(profilePath)) {
101
- try {
102
- profile = normalizeProfile(JSON.parse(fs.readFileSync(profilePath, 'utf8')));
103
- }
104
- catch (e) {
105
- SystemLogger.log(effectiveWorkspaceDir, 'PROFILE_PARSE_WARN', `Failed to parse PROFILE.json: ${String(e)}`);
106
- }
107
- }
108
- const isRisk = isRisky(relPath, profile.risk_paths);
109
- recordEvolutionFailure(effectiveWorkspaceDir, event.toolName, {
110
- filePath: relPath,
111
- reason: isRisk ? 'risky' : 'tool',
112
- sessionId,
113
- });
114
- // Record tool call failure event
115
- eventLog.recordToolCall(sessionId, {
116
- toolName: event.toolName,
117
- filePath: typeof filePath === 'string' ? filePath : undefined,
118
- error: event.error ? String(event.error).substring(0, 200) : undefined,
119
- errorType,
120
- gfi: updatedState.currentGfi,
121
- consecutiveErrors: updatedState.consecutiveErrors,
122
- exitCode,
123
- });
124
- wctx.trajectory?.recordToolCall?.({
125
- sessionId,
126
- toolName: event.toolName,
127
- outcome: 'failure',
128
- durationMs: event.durationMs,
129
- exitCode,
130
- errorType,
131
- errorMessage: event.error ? String(event.error) : undefined,
132
- gfiBefore,
133
- gfiAfter: updatedState.currentGfi,
134
- paramsJson: event.params,
135
- });
136
- const injectedProbationIds = getInjectedProbationIds(sessionId, effectiveWorkspaceDir);
137
- for (const id of injectedProbationIds) {
138
- const principle = wctx.evolutionReducer.getPrincipleById(id);
139
- const shouldAttribute = !!principle && shouldAttributePrincipleToTool(principle, event.toolName);
140
- if (shouldAttribute) {
141
- wctx.evolutionReducer.recordProbationFeedback(id, false);
142
- }
143
- }
144
- clearInjectedProbationIds(sessionId, effectiveWorkspaceDir);
145
- }
146
- else {
147
- // ── SUCCESS BRANCH ──
148
- const resetState = resetFriction(sessionId, effectiveWorkspaceDir);
149
- recordEvolutionSuccess(effectiveWorkspaceDir, event.toolName, {
150
- sessionId,
151
- reason: 'tool_success',
152
- });
153
- const injectedProbationIds = getInjectedProbationIds(sessionId, effectiveWorkspaceDir);
154
- for (const id of injectedProbationIds) {
155
- const principle = wctx.evolutionReducer.getPrincipleById(id);
156
- const shouldAttribute = !!principle && shouldAttributePrincipleToTool(principle, event.toolName);
157
- if (shouldAttribute) {
158
- wctx.evolutionReducer.recordProbationFeedback(id, true);
159
- }
160
- }
161
- clearInjectedProbationIds(sessionId, effectiveWorkspaceDir);
162
- wctx.trajectory?.recordToolCall?.({
163
- sessionId,
164
- toolName: event.toolName,
165
- outcome: 'success',
166
- durationMs: event.durationMs,
167
- exitCode,
168
- gfiBefore,
169
- gfiAfter: resetState.currentGfi,
170
- paramsJson: event.params,
171
- });
172
- if (WRITE_TOOLS.includes(event.toolName)) {
173
- const filePath = params.file_path || params.path || params.file;
174
- eventLog.recordToolCall(sessionId, {
175
- toolName: event.toolName,
176
- filePath: typeof filePath === 'string' ? filePath : undefined,
177
- gfi: 0,
178
- });
179
- // ── Hygiene Tracking: Record persistence actions ──
180
- if (typeof filePath === 'string') {
181
- const normalized = filePath.replace(/\\/g, '/');
182
- const isMemory = /(?:^|\/)memory\//.test(normalized) || normalized.endsWith('/MEMORY.md') || normalized === 'MEMORY.md';
183
- const isPlan = normalized === 'PLAN.md' || normalized.endsWith('/PLAN.md');
184
- if (isMemory || isPlan) {
185
- const content = params.content || params.new_string || '';
186
- wctx.hygiene.recordPersistence({
187
- ts: new Date().toISOString(),
188
- tool: event.toolName,
189
- path: filePath,
190
- type: isMemory ? 'memory' : 'plan',
191
- contentLength: content.length,
192
- });
193
- }
194
- }
195
- }
196
- // Special case for memory_store tool (Success only)
197
- if (event.toolName === 'memory_store') {
198
- const text = params.text || '';
199
- wctx.hygiene.recordPersistence({
200
- ts: new Date().toISOString(),
201
- tool: event.toolName,
202
- path: 'DATABASE',
203
- type: 'memory',
204
- contentLength: text.length,
205
- });
206
- }
207
- }
208
- // ── Legacy/Risky Write Pain Logic (Unified WRITE_TOOLS) ──
209
- if (!WRITE_TOOLS.includes(event.toolName) || !isFailure) {
210
- return;
211
- }
212
- const filePath = params.file_path || params.path || params.file;
213
- const relPath = typeof filePath === 'string' ? normalizePath(filePath, effectiveWorkspaceDir) : 'unknown';
214
- const profilePath = wctx.resolve('PROFILE');
215
- let profile = normalizeProfile({});
216
- if (fs.existsSync(profilePath)) {
217
- try {
218
- profile = normalizeProfile(JSON.parse(fs.readFileSync(profilePath, 'utf8')));
219
- }
220
- catch (e) {
221
- SystemLogger.log(effectiveWorkspaceDir, 'PROFILE_PARSE_WARN', `Failed to parse PROFILE.json: ${String(e)}`);
222
- }
223
- }
224
- const isRisk = isRisky(relPath, profile.risk_paths);
225
- const painScore = computePainScore(1, false, false, isRisk ? 20 : 0, effectiveWorkspaceDir);
226
- const traceId = createTraceId();
227
- const painData = {
228
- score: String(painScore),
229
- source: 'tool_failure',
230
- time: new Date().toISOString(),
231
- reason: `Tool ${event.toolName} failed on ${relPath}. Error: ${event.error ?? 'Non-zero exit code'}`,
232
- is_risky: String(isRisk),
233
- trace_id: traceId,
234
- session_id: sessionId,
235
- agent_id: ctx.agentId || '',
236
- };
237
- writePainFlag(effectiveWorkspaceDir, painData);
238
- eventLog.recordPainSignal(sessionId, {
239
- score: painScore,
240
- source: 'tool_failure',
241
- reason: `Tool ${event.toolName} failed on ${relPath}`,
242
- isRisky: isRisk,
243
- });
244
- wctx.trajectory?.recordPainEvent?.({
245
- sessionId,
246
- source: 'tool_failure',
247
- score: painScore,
248
- reason: `Tool ${event.toolName} failed on ${relPath}`,
249
- severity: painScore >= 70 ? 'severe' : painScore >= 40 ? 'moderate' : 'mild',
250
- origin: 'system_infer',
251
- });
252
- // Log to EvolutionLogger
253
- const evoLogger = getEvolutionLogger(effectiveWorkspaceDir, wctx.trajectory);
254
- evoLogger.logPainDetected({
255
- traceId,
256
- source: 'tool_failure',
257
- reason: `Tool ${event.toolName} failed on ${relPath}`,
258
- score: painScore,
259
- toolName: event.toolName,
260
- filePath: relPath,
261
- sessionId,
262
- });
263
- emitPainDetectedEvent(wctx, {
264
- ts: new Date().toISOString(),
265
- type: 'pain_detected',
266
- data: {
267
- painId: createPainId(sessionId),
268
- painType: 'tool_failure',
269
- source: event.toolName,
270
- reason: `Tool ${event.toolName} failed on ${relPath}`,
271
- score: painScore,
272
- sessionId,
273
- traceId,
274
- agentId: ctx.agentId,
275
- },
276
- });
277
- }
278
- function extractErrorType(error) {
279
- if (!error)
280
- return 'Unknown';
281
- const msg = String(error);
282
- if (msg.includes('EACCES') || msg.includes('permission denied'))
283
- return 'EACCES';
284
- if (msg.includes('ENOENT') || msg.includes('no such file'))
285
- return 'ENOENT';
286
- if (msg.includes('EISDIR'))
287
- return 'EISDIR';
288
- if (msg.includes('ENOSPC'))
289
- return 'ENOSPC';
290
- if (msg.includes('SyntaxError'))
291
- return 'SyntaxError';
292
- if (msg.includes('TypeError'))
293
- return 'TypeError';
294
- if (msg.includes('ReferenceError'))
295
- return 'ReferenceError';
296
- if (msg.includes('timeout') || msg.includes('ETIMEDOUT'))
297
- return 'Timeout';
298
- if (msg.includes('network') || msg.includes('ECONNREFUSED'))
299
- return 'Network';
300
- return 'Other';
301
- }