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,10 +0,0 @@
1
- import type { PluginHookSubagentEndedEvent, PluginHookSubagentContext } from '../openclaw-sdk.js';
2
- import { type EmpathyObserverApi } from '../service/empathy-observer-manager.js';
3
- type SubagentEndedHookContext = PluginHookSubagentContext & {
4
- api?: EmpathyObserverApi;
5
- workspaceDir?: string;
6
- sessionId?: string;
7
- agentId?: string;
8
- };
9
- export declare function handleSubagentEnded(event: PluginHookSubagentEndedEvent, ctx: SubagentEndedHookContext): Promise<void>;
10
- export {};
@@ -1,387 +0,0 @@
1
- import * as fs from 'fs';
2
- import { writePainFlag } from '../core/pain.js';
3
- import { WorkspaceContext } from '../core/workspace-context.js';
4
- import { empathyObserverManager, isEmpathyObserverSession } from '../service/empathy-observer-manager.js';
5
- import { acquireQueueLock } from '../service/evolution-worker.js';
6
- import { recordEvolutionSuccess } from '../core/evolution-engine.js';
7
- const COMPLETION_RETRY_DELAY_MS = 250;
8
- const COMPLETION_MAX_RETRIES = 3;
9
- const COMPLETION_RETRY_TTL_MS = 60 * 60 * 1000; // 1 hour TTL for retry entries
10
- const TASK_OUTCOME_RETRY_DELAY_MS = 250;
11
- const TASK_OUTCOME_MAX_RETRIES = 3;
12
- const DIAGNOSTICIAN_SESSION_PREFIX = 'agent:diagnostician:';
13
- const completionRetryCounts = new Map();
14
- // Cleanup expired retry entries periodically
15
- function cleanupExpiredRetryEntries() {
16
- const now = Date.now();
17
- for (const [key, value] of completionRetryCounts.entries()) {
18
- if (now > value.expires) {
19
- completionRetryCounts.delete(key);
20
- }
21
- }
22
- }
23
- function emitSubagentPainEvent(wctx, payload, logger) {
24
- try {
25
- wctx.evolutionReducer.emitSync({
26
- ts: new Date().toISOString(),
27
- type: 'pain_detected',
28
- data: {
29
- painId: `pain_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`,
30
- painType: 'subagent_error',
31
- source: payload.source,
32
- reason: payload.reason,
33
- score: payload.score,
34
- sessionId: payload.sessionId,
35
- agentId: payload.agentId,
36
- },
37
- });
38
- }
39
- catch (e) {
40
- logger.warn(`[PD:Subagent] failed to emit evolution event: ${String(e)}`);
41
- }
42
- }
43
- function isDiagnosticianSession(targetSessionKey) {
44
- return typeof targetSessionKey === 'string' && targetSessionKey.startsWith(DIAGNOSTICIAN_SESSION_PREFIX);
45
- }
46
- function extractAgentIdFromSessionKey(sessionKey) {
47
- // sessionKey format: "agent:{agentId}:{type}:{uuid}" or "agent:{agentId}:{uuid}"
48
- if (!sessionKey)
49
- return undefined;
50
- const match = sessionKey.match(/^agent:([^:]+):/);
51
- return match ? match[1] : undefined;
52
- }
53
- function cleanupPainFlagForTask(wctx, completedTaskId, queue, logger) {
54
- const painFlagPath = wctx.resolve('PAIN_FLAG');
55
- try {
56
- const painData = fs.readFileSync(painFlagPath, 'utf8');
57
- const taskIdMatch = painData.match(/^task_id:\s*(.+)$/m);
58
- const painTaskId = taskIdMatch?.[1]?.trim();
59
- const hasQueuedStatus = painData.includes('status: queued');
60
- const hasRemainingActiveTasks = queue.some((task) => task?.status === 'pending' || task?.status === 'in_progress');
61
- if (!hasQueuedStatus)
62
- return;
63
- if (painTaskId) {
64
- if (painTaskId === completedTaskId) {
65
- fs.unlinkSync(painFlagPath);
66
- }
67
- return;
68
- }
69
- // Legacy fallback: only clear an untagged queued pain flag when there are
70
- // no active queue entries left. This avoids unrelated diagnostician runs
71
- // from deleting a queued flag that belongs to another task.
72
- if (!hasRemainingActiveTasks) {
73
- fs.unlinkSync(painFlagPath);
74
- }
75
- }
76
- catch (e) {
77
- if (e.code === 'ENOENT')
78
- return; // File doesn't exist, nothing to clean up
79
- logger.error(`[PD:Subagent] Failed to cleanup pain flag: ${String(e)}`);
80
- }
81
- }
82
- function getCompletionRetryKey(workspaceDir, targetSessionKey) {
83
- return `${workspaceDir}::${targetSessionKey}`;
84
- }
85
- function scheduleCompletionRetry(event, ctx, attempt) {
86
- const workspaceDir = ctx.workspaceDir;
87
- const targetSessionKey = event.targetSessionKey;
88
- if (!workspaceDir || !targetSessionKey || attempt >= COMPLETION_MAX_RETRIES) {
89
- return;
90
- }
91
- cleanupExpiredRetryEntries();
92
- const retryKey = getCompletionRetryKey(workspaceDir, targetSessionKey);
93
- completionRetryCounts.set(retryKey, {
94
- count: attempt + 1,
95
- expires: Date.now() + COMPLETION_RETRY_TTL_MS
96
- });
97
- setTimeout(() => {
98
- void handleSubagentEnded(event, ctx).finally(() => {
99
- const entry = completionRetryCounts.get(retryKey);
100
- if (!entry || entry.count <= attempt + 1) {
101
- completionRetryCounts.delete(retryKey);
102
- }
103
- });
104
- }, COMPLETION_RETRY_DELAY_MS);
105
- }
106
- function scheduleTaskOutcomeRetry(wctx, payload, attempt, logger) {
107
- if (attempt > TASK_OUTCOME_MAX_RETRIES) {
108
- logger.error(`[PD:Subagent] Failed to persist task outcome after ${TASK_OUTCOME_MAX_RETRIES} retries: ${payload.taskId}`);
109
- return;
110
- }
111
- setTimeout(() => {
112
- try {
113
- wctx.trajectory?.recordTaskOutcome?.(payload);
114
- }
115
- catch (error) {
116
- logger.warn(`[PD:Subagent] Retrying task outcome persistence for ${payload.taskId}: ${String(error)}`);
117
- scheduleTaskOutcomeRetry(wctx, payload, attempt + 1, logger);
118
- }
119
- }, TASK_OUTCOME_RETRY_DELAY_MS);
120
- }
121
- export async function handleSubagentEnded(event, ctx) {
122
- const { outcome, targetSessionKey } = event;
123
- const workspaceDir = ctx.workspaceDir;
124
- if (!workspaceDir)
125
- return;
126
- const wctx = WorkspaceContext.fromHookContext(ctx);
127
- const logger = ctx.api?.logger ?? console;
128
- if (isEmpathyObserverSession(targetSessionKey || '')) {
129
- await empathyObserverManager.reap(ctx.api, targetSessionKey, workspaceDir);
130
- return;
131
- }
132
- const config = wctx.config;
133
- // ── Outcome-based EP and Pain Signal handling ──
134
- // OpenClaw v2026.3.23 fixes: timeout may be false positive (fast-finishing workers)
135
- // Only penalize actual errors, not timeout/killed/reset
136
- if (outcome === 'error') {
137
- // Only actual errors trigger penalty
138
- const scoreSettings = config.get('scores');
139
- const score = scoreSettings.subagent_error_penalty;
140
- const reason = `Subagent session ${targetSessionKey} ended with error`;
141
- writePainFlag(workspaceDir, {
142
- source: `subagent_error`,
143
- score: String(score),
144
- time: new Date().toISOString(),
145
- reason,
146
- is_risky: 'true',
147
- session_id: ctx.sessionId || '',
148
- agent_id: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey) || '',
149
- });
150
- emitSubagentPainEvent(wctx, {
151
- source: `subagent_error`,
152
- reason,
153
- score,
154
- sessionId: ctx.sessionId,
155
- agentId: ctx.agentId || extractAgentIdFromSessionKey(targetSessionKey),
156
- }, logger);
157
- }
158
- if (outcome === 'timeout') {
159
- // OpenClaw v2026.3.23 fix: timeout may be false positive
160
- // Fast-finishing workers are no longer incorrectly reported as timed out
161
- // Do not penalize - the task may have actually succeeded
162
- logger.warn(`[PD:Subagent] Session ${targetSessionKey} timed out - not penalizing (OpenClaw fix applied)`);
163
- }
164
- if (outcome === 'killed' || outcome === 'reset') {
165
- // User-initiated termination or system reset - not an agent failure
166
- logger.info(`[PD:Subagent] Session ${targetSessionKey} ended with ${outcome} - no penalty (user/system action)`);
167
- }
168
- if (outcome === 'ok' || outcome === 'deleted') {
169
- recordEvolutionSuccess(workspaceDir, 'subagent', {
170
- sessionId: ctx.sessionId,
171
- reason: 'subagent_success',
172
- });
173
- }
174
- if ((outcome !== 'ok' && outcome !== 'deleted') || !isDiagnosticianSession(targetSessionKey)) {
175
- return;
176
- }
177
- const queuePath = wctx.resolve('EVOLUTION_QUEUE');
178
- if (!fs.existsSync(queuePath))
179
- return;
180
- const retryKey = getCompletionRetryKey(workspaceDir, targetSessionKey);
181
- const retryEntry = completionRetryCounts.get(retryKey);
182
- const attempt = retryEntry?.count || 0;
183
- let releaseLock = null;
184
- try {
185
- releaseLock = await acquireQueueLock(queuePath, logger);
186
- const queue = JSON.parse(fs.readFileSync(queuePath, 'utf8'));
187
- let completedTaskId = null;
188
- // Improved matching logic: support both direct session key match and HEARTBEAT placeholder match
189
- // This fixes task_outcomes being empty for HEARTBEAT-triggered diagnostician runs
190
- const matchedTask = queue.find((task) => {
191
- // V2: Skip non-pain_diagnosis tasks - they don't use HEARTBEAT completion flow
192
- // pain_diagnosis: routed through subagent completion matcher (this block)
193
- // sleep_reflection: handled by nocturnal service (separate flow, no HEARTBEAT)
194
- // model_eval: handled separately (no HEARTBEAT completion)
195
- if (task?.taskKind !== 'pain_diagnosis' && task?.taskKind !== undefined)
196
- return false;
197
- const taskSessionKey = task?.assigned_session_key;
198
- // 1. Exact match: direct session key assignment
199
- if (typeof taskSessionKey === 'string' && taskSessionKey === targetSessionKey) {
200
- return true;
201
- }
202
- // 2. HEARTBEAT placeholder match: for diagnostician sessions
203
- // Tasks started via HEARTBEAT have placeholder like "heartbeat:diagnostician:{taskId}"
204
- if (isDiagnosticianSession(targetSessionKey)) {
205
- // Match tasks with HEARTBEAT placeholder
206
- if (typeof taskSessionKey === 'string' && taskSessionKey.startsWith('heartbeat:diagnostician')) {
207
- return true;
208
- }
209
- // Backward compatibility: match tasks with no assigned_session_key (legacy behavior)
210
- // Only match tasks started within 2 hours to avoid stale task matching
211
- if (taskSessionKey === undefined || taskSessionKey === null) {
212
- const taskStartedAt = task?.started_at ? new Date(task.started_at).getTime() : 0;
213
- const taskAge = taskStartedAt > 0 ? Date.now() - taskStartedAt : Infinity;
214
- const LEGACY_FALLBACK_MAX_AGE_MS = 2 * 60 * 60 * 1000; // 2 hours
215
- if (taskAge < LEGACY_FALLBACK_MAX_AGE_MS) {
216
- return true;
217
- }
218
- }
219
- }
220
- return false;
221
- });
222
- if (matchedTask) {
223
- // Enhanced observability: log match type for debugging
224
- const matchType = matchedTask.assigned_session_key === targetSessionKey
225
- ? 'exact'
226
- : matchedTask.assigned_session_key?.startsWith('heartbeat:diagnostician')
227
- ? 'heartbeat_placeholder'
228
- : 'legacy_fallback';
229
- logger.info(`[PD:Subagent] Matched session ${targetSessionKey} to task ${matchedTask.id} (match_type: ${matchType})`);
230
- matchedTask.status = 'completed';
231
- matchedTask.completed_at = new Date().toISOString();
232
- delete matchedTask.assigned_session_key;
233
- completedTaskId = matchedTask.id;
234
- }
235
- else {
236
- logger.warn(`[PD:Subagent] No in-progress evolution task matched subagent session ${targetSessionKey}`);
237
- }
238
- let taskOutcomePayload = null;
239
- if (completedTaskId) {
240
- fs.writeFileSync(queuePath, JSON.stringify(queue, null, 2), 'utf8');
241
- cleanupPainFlagForTask(wctx, completedTaskId, queue, logger);
242
- taskOutcomePayload = {
243
- sessionId: targetSessionKey,
244
- taskId: completedTaskId,
245
- outcome,
246
- summary: `Diagnostician session ${targetSessionKey} completed evolution task ${completedTaskId}.`,
247
- };
248
- }
249
- if (taskOutcomePayload) {
250
- try {
251
- wctx.trajectory?.recordTaskOutcome?.(taskOutcomePayload);
252
- }
253
- catch (error) {
254
- logger.warn(`[PD:Subagent] Failed to persist task outcome for ${taskOutcomePayload.taskId}: ${String(error)}`);
255
- scheduleTaskOutcomeRetry(wctx, taskOutcomePayload, 1, logger);
256
- }
257
- }
258
- // Read diagnostician output and create principle with generalized pattern
259
- if (completedTaskId && ctx.api?.runtime?.subagent) {
260
- try {
261
- const messages = await ctx.api?.runtime?.subagent?.getSessionMessages?.({
262
- sessionKey: targetSessionKey,
263
- limit: 50
264
- });
265
- const assistantText = extractAssistantText(messages);
266
- const report = parseDiagnosticianReport(assistantText);
267
- if (report?.principle) {
268
- // Principles default to 'manual_only' evaluability unless detector metadata
269
- // is explicitly provided. Only deterministic / weak_heuristic evaluability
270
- // can enter automatic nocturnal targeting.
271
- const evaluability = report.principle.evaluability;
272
- // Only pass detector metadata if ALL required fields are present and valid.
273
- // Incomplete metadata → 'manual_only' — the principle stays prompt-only.
274
- // Defense in depth: also validate in reducer, but subagent should not pass
275
- // malformed data in the first place.
276
- const rawMeta = report.principle.detector_metadata;
277
- // Require confidence (valid enum) + ALL THREE signal arrays non-empty.
278
- // toolSequenceHints is optional (may be empty or absent).
279
- const VALID_CONFIDENCE = ['high', 'medium', 'low'];
280
- const hasValidConfidence = typeof rawMeta?.confidence === 'string' &&
281
- VALID_CONFIDENCE.includes(rawMeta.confidence);
282
- const signalArrays = [
283
- rawMeta?.applicabilityTags,
284
- rawMeta?.positiveSignals,
285
- rawMeta?.negativeSignals,
286
- ];
287
- const allSignalsNonEmpty = signalArrays.every((arr) => Array.isArray(arr) && arr.length > 0 && arr.every((s) => typeof s === 'string' && s.length > 0));
288
- const hasCompleteMetadata = hasValidConfidence && allSignalsNonEmpty;
289
- const detectorMetadata = hasCompleteMetadata && rawMeta.confidence
290
- ? {
291
- applicabilityTags: rawMeta.applicabilityTags ?? [],
292
- positiveSignals: rawMeta.positiveSignals ?? [],
293
- negativeSignals: rawMeta.negativeSignals ?? [],
294
- toolSequenceHints: rawMeta.toolSequenceHints ?? [],
295
- confidence: rawMeta.confidence,
296
- }
297
- : undefined;
298
- const principleId = wctx.evolutionReducer.createPrincipleFromDiagnosis({
299
- painId: matchedTask?.id || completedTaskId,
300
- painType: 'tool_failure', // Default, could be extracted from task
301
- triggerPattern: report.principle.trigger_pattern,
302
- action: report.principle.action,
303
- source: matchedTask?.source || 'diagnostician',
304
- evaluability,
305
- detectorMetadata,
306
- });
307
- if (principleId) {
308
- logger.warn(`[PD:Subagent] Created principle ${principleId} from diagnostician analysis for task ${completedTaskId}`);
309
- }
310
- }
311
- }
312
- catch (e) {
313
- logger.warn(`[PD:Subagent] Failed to read diagnostician output: ${String(e)}`);
314
- }
315
- }
316
- }
317
- catch (e) {
318
- logger.error(`[PD:Subagent] Failed to update evolution queue: ${String(e)}`);
319
- scheduleCompletionRetry(event, ctx, attempt);
320
- }
321
- finally {
322
- releaseLock?.();
323
- }
324
- }
325
- /**
326
- * Extract text content from assistant messages
327
- */
328
- function extractAssistantText(messages) {
329
- if (!messages || !Array.isArray(messages))
330
- return '';
331
- const texts = [];
332
- for (const msg of messages) {
333
- if (msg?.role !== 'assistant')
334
- continue;
335
- const content = msg?.content;
336
- if (Array.isArray(content)) {
337
- for (const block of content) {
338
- if (block?.type === 'text' && typeof block.text === 'string') {
339
- texts.push(block.text);
340
- }
341
- }
342
- }
343
- else if (typeof content === 'string') {
344
- texts.push(content);
345
- }
346
- }
347
- return texts.join('\n');
348
- }
349
- /**
350
- * Parse diagnostician JSON report from text
351
- */
352
- function parseDiagnosticianReport(text) {
353
- // Try to find JSON in markdown code block
354
- const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/);
355
- if (jsonMatch) {
356
- try {
357
- const parsed = JSON.parse(jsonMatch[1]);
358
- // Support both direct principle and nested phases.principle_extraction structure
359
- if (parsed?.principle) {
360
- return { principle: parsed.principle };
361
- }
362
- if (parsed?.phases?.principle_extraction?.principle) {
363
- return { principle: parsed.phases.principle_extraction.principle };
364
- }
365
- }
366
- catch {
367
- // Fall through to return null
368
- }
369
- }
370
- // Try to find raw JSON object
371
- const objectMatch = text.match(/\{[\s\S]*"principle"[\s\S]*\}/);
372
- if (objectMatch) {
373
- try {
374
- const parsed = JSON.parse(objectMatch[0]);
375
- if (parsed?.principle) {
376
- return { principle: parsed.principle };
377
- }
378
- if (parsed?.phases?.principle_extraction?.principle) {
379
- return { principle: parsed.phases.principle_extraction.principle };
380
- }
381
- }
382
- catch {
383
- // Fall through to return null
384
- }
385
- }
386
- return null;
387
- }
@@ -1,37 +0,0 @@
1
- /**
2
- * Thinking Checkpoint Module
3
- *
4
- * Enforces P-10 deep reflection requirement for high-risk tool operations.
5
- *
6
- * **Responsibilities:**
7
- * - Check if high-risk tools have recent deep thinking (T-01 through T-10)
8
- * - Block high-risk operations without preceding deep reflection
9
- * - Configurable time window for thinking validity (default 5 minutes)
10
- * - Provide clear guidance on required action (deep_reflect tool usage)
11
- *
12
- * **Configuration:**
13
- * - Thinking checkpoint settings from profile.thinking_checkpoint
14
- * - Window duration for thinking validity
15
- * - High-risk tool list
16
- */
17
- import type { PluginHookBeforeToolCallEvent, PluginHookBeforeToolCallResult } from '../openclaw-sdk.js';
18
- export interface ThinkingCheckpointConfig {
19
- enabled?: boolean;
20
- window_ms?: number;
21
- high_risk_tools?: string[];
22
- }
23
- /**
24
- * Checks if a tool call requires a recent deep thinking checkpoint.
25
- *
26
- * This enforces P-10 (Thinking OS Checkpoint) - high-risk operations must
27
- * be preceded by deep reflection within the configured time window.
28
- *
29
- * @param event - The before_tool_call event
30
- * @param config - Thinking checkpoint configuration from profile
31
- * @param sessionId - Current session ID
32
- * @param logger - Optional logger for info messages
33
- * @returns Block result if thinking required, undefined otherwise
34
- */
35
- export declare function checkThinkingCheckpoint(event: PluginHookBeforeToolCallEvent, config: ThinkingCheckpointConfig, sessionId: string | undefined, logger?: {
36
- info?: (message: string) => void;
37
- }): PluginHookBeforeToolCallResult | undefined;
@@ -1,51 +0,0 @@
1
- /**
2
- * Thinking Checkpoint Module
3
- *
4
- * Enforces P-10 deep reflection requirement for high-risk tool operations.
5
- *
6
- * **Responsibilities:**
7
- * - Check if high-risk tools have recent deep thinking (T-01 through T-10)
8
- * - Block high-risk operations without preceding deep reflection
9
- * - Configurable time window for thinking validity (default 5 minutes)
10
- * - Provide clear guidance on required action (deep_reflect tool usage)
11
- *
12
- * **Configuration:**
13
- * - Thinking checkpoint settings from profile.thinking_checkpoint
14
- * - Window duration for thinking validity
15
- * - High-risk tool list
16
- */
17
- import { hasRecentThinking } from '../core/session-tracker.js';
18
- import { THINKING_CHECKPOINT_WINDOW_MS, THINKING_CHECKPOINT_DEFAULT_HIGH_RISK_TOOLS } from '../config/index.js';
19
- /**
20
- * Checks if a tool call requires a recent deep thinking checkpoint.
21
- *
22
- * This enforces P-10 (Thinking OS Checkpoint) - high-risk operations must
23
- * be preceded by deep reflection within the configured time window.
24
- *
25
- * @param event - The before_tool_call event
26
- * @param config - Thinking checkpoint configuration from profile
27
- * @param sessionId - Current session ID
28
- * @param logger - Optional logger for info messages
29
- * @returns Block result if thinking required, undefined otherwise
30
- */
31
- export function checkThinkingCheckpoint(event, config, sessionId, logger) {
32
- const enabled = config.enabled ?? false;
33
- const windowMs = config.window_ms ?? THINKING_CHECKPOINT_WINDOW_MS;
34
- const highRiskTools = config.high_risk_tools ?? [...THINKING_CHECKPOINT_DEFAULT_HIGH_RISK_TOOLS];
35
- if (!enabled || !sessionId) {
36
- return undefined;
37
- }
38
- const isHighRisk = highRiskTools.includes(event.toolName);
39
- if (!isHighRisk) {
40
- return undefined;
41
- }
42
- const hasThinking = hasRecentThinking(sessionId, windowMs);
43
- if (!hasThinking) {
44
- logger?.info?.(`[PD:THINKING_GATE] High-risk tool "${event.toolName}" called without recent deep thinking`);
45
- return {
46
- block: true,
47
- blockReason: `[Thinking OS Checkpoint] 高风险操作 "${event.toolName}" 需要先进行深度思考。\n\n请先使用 deep_reflect 工具分析当前情况,然后再尝试此操作。\n\n这是强制性检查点,目的是确保决策质量。\n\n提示:调用 deep_reflect 后,${Math.round(windowMs / 60000)}分钟内的操作将自动放行。\n\n可在PROFILE.json中设置 thinking_checkpoint.enabled: false 来禁用此检查。`,
48
- };
49
- }
50
- return undefined;
51
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Trajectory Collector - 行为进化引擎 Phase 0 数据收集
3
- *
4
- * 收集工具调用和 LLM 输出到 memory/trajectories/ 目录
5
- * 用于分析工具使用模式、识别原则应用案例、评估行为质量
6
- */
7
- import type { PluginHookAfterToolCallEvent, PluginHookToolContext, PluginHookLlmOutputEvent, PluginHookAgentContext, PluginHookBeforeMessageWriteEvent } from '../openclaw-sdk.js';
8
- /**
9
- * 工具调用完成后的处理
10
- * 记录:工具名、参数、结果、错误、执行时间
11
- */
12
- export declare function handleAfterToolCall(event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext & {
13
- workspaceDir?: string;
14
- }): void;
15
- /**
16
- * LLM 输出处理
17
- * 记录:provider、model、输出长度、token 使用量
18
- */
19
- export declare function handleLlmOutput(event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext & {
20
- workspaceDir?: string;
21
- }): void;
22
- /**
23
- * 消息写入前的处理
24
- * 记录:用户/助手消息内容
25
- */
26
- export declare function handleBeforeMessageWrite(event: PluginHookBeforeMessageWriteEvent, ctx: PluginHookAgentContext & {
27
- workspaceDir?: string;
28
- }): void;
29
- /**
30
- * 轨迹汇总统计(供 cron 任务调用)
31
- */
32
- export declare function computeTrajectoryStats(workspaceDir: string): object;