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,543 +0,0 @@
1
- import { ControlUiDatabase } from '../core/control-ui-db.js';
2
- import { getThinkingModel, listThinkingModels } from '../core/thinking-models.js';
3
- import { WorkspaceContext } from '../core/workspace-context.js';
4
- /** Time window (in minutes) for querying principle events related to a sample */
5
- const PRINCIPLE_EVENT_WINDOW_MINUTES = 10;
6
- function parseJson(raw, fallback) {
7
- if (!raw)
8
- return fallback;
9
- try {
10
- return JSON.parse(raw);
11
- }
12
- catch {
13
- return fallback;
14
- }
15
- }
16
- function roundRate(numerator, denominator) {
17
- if (!denominator)
18
- return 0;
19
- return Number((numerator / denominator).toFixed(4));
20
- }
21
- function clampPageSize(input) {
22
- if (!Number.isFinite(input))
23
- return 20;
24
- return Math.min(100, Math.max(1, Number(input)));
25
- }
26
- function summarizeRecommendation(model) {
27
- if (model.hits === 0)
28
- return 'archive';
29
- if (model.failureRate > model.successRate || model.correctionRate >= 0.35 || model.painRate >= 0.3) {
30
- return 'rework';
31
- }
32
- return 'reinforce';
33
- }
34
- export class ControlUiQueryService {
35
- workspaceDir;
36
- trajectory;
37
- uiDb;
38
- constructor(workspaceDir) {
39
- this.workspaceDir = workspaceDir;
40
- this.trajectory = WorkspaceContext.fromHookContext({ workspaceDir }).trajectory;
41
- this.uiDb = new ControlUiDatabase({ workspaceDir });
42
- }
43
- dispose() {
44
- this.uiDb.dispose();
45
- }
46
- getOverview(days = 30) {
47
- const stats = this.trajectory.getDataStats();
48
- const regressionRows = this.uiDb.all('SELECT tool_name, error_type, occurrences FROM v_error_clusters ORDER BY occurrences DESC LIMIT 5');
49
- const failureStats = this.uiDb.get(`
50
- SELECT
51
- COALESCE(SUM(occurrences), 0) AS total_failures,
52
- COALESCE(SUM(CASE WHEN occurrences > 1 THEN occurrences ELSE 0 END), 0) AS repeated_failures
53
- FROM v_error_clusters
54
- `) ?? { total_failures: 0, repeated_failures: 0 };
55
- const correctionTotal = this.uiDb.get('SELECT COUNT(*) AS count FROM user_turns WHERE correction_detected = 1')?.count ?? 0;
56
- const principleEventCount = this.uiDb.get('SELECT COUNT(*) AS count FROM principle_events')?.count ?? 0;
57
- const gateBlockCount = this.uiDb.get('SELECT COUNT(*) AS count FROM gate_blocks')?.count ?? 0;
58
- const taskOutcomeCount = this.uiDb.get('SELECT COUNT(*) AS count FROM task_outcomes')?.count ?? 0;
59
- const sampleCounters = this.uiDb.all('SELECT review_status, total FROM v_sample_queue');
60
- const samplePreview = this.uiDb.all(`
61
- SELECT sample_id, session_id, quality_score, review_status, created_at
62
- FROM correction_samples
63
- ORDER BY created_at DESC
64
- LIMIT 5
65
- `);
66
- const coverageRow = this.uiDb.get(`
67
- SELECT
68
- COUNT(DISTINCT assistant_turn_id) AS thinking_turns,
69
- (SELECT COUNT(*) FROM assistant_turns) AS assistant_turns
70
- FROM thinking_model_events
71
- `) ?? { thinking_turns: 0, assistant_turns: 0 };
72
- const effectiveCount = this.uiDb.all('SELECT events, success_windows, failure_windows, pain_windows, correction_windows FROM v_thinking_model_effectiveness')
73
- .filter((row) => summarizeRecommendation({
74
- hits: Number(row.events),
75
- successRate: roundRate(Number(row.success_windows), Number(row.events)),
76
- failureRate: roundRate(Number(row.failure_windows), Number(row.events)),
77
- painRate: roundRate(Number(row.pain_windows), Number(row.events)),
78
- correctionRate: roundRate(Number(row.correction_windows), Number(row.events)),
79
- }) === 'reinforce').length;
80
- const dailyTrend = this.uiDb.all(`
81
- WITH thinking_daily AS (
82
- SELECT substr(created_at, 1, 10) AS day, COUNT(DISTINCT assistant_turn_id) AS thinking_turns
83
- FROM thinking_model_events
84
- GROUP BY substr(created_at, 1, 10)
85
- )
86
- SELECT
87
- dm.day AS day,
88
- dm.tool_calls AS tool_calls,
89
- dm.failures AS failures,
90
- dm.user_corrections AS user_corrections,
91
- COALESCE(td.thinking_turns, 0) AS thinking_turns
92
- FROM v_daily_metrics dm
93
- LEFT JOIN thinking_daily td ON td.day = dm.day
94
- ORDER BY dm.day DESC
95
- LIMIT ?
96
- `, days).reverse();
97
- const counters = Object.fromEntries(sampleCounters.map((row) => [row.review_status, Number(row.total)]));
98
- const activeModels = this.uiDb.get('SELECT COUNT(DISTINCT model_id) AS count FROM thinking_model_events')?.count ?? 0;
99
- return {
100
- workspaceDir: this.workspaceDir,
101
- generatedAt: new Date().toISOString(),
102
- dataFreshness: stats.lastIngestAt,
103
- dataSource: 'trajectory_db_analytics',
104
- runtimeControlPlaneSource: 'pd_evolution_status',
105
- summary: {
106
- repeatErrorRate: roundRate(Number(failureStats.repeated_failures), Number(failureStats.total_failures)),
107
- userCorrectionRate: roundRate(correctionTotal, stats.userTurns),
108
- pendingSamples: stats.pendingSamples,
109
- approvedSamples: stats.approvedSamples,
110
- thinkingCoverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
111
- painEvents: stats.painEvents,
112
- principleEventCount,
113
- gateBlocks: Number(gateBlockCount),
114
- taskOutcomes: Number(taskOutcomeCount),
115
- },
116
- dailyTrend: dailyTrend.map((row) => ({
117
- day: row.day,
118
- toolCalls: Number(row.tool_calls),
119
- failures: Number(row.failures),
120
- userCorrections: Number(row.user_corrections),
121
- thinkingTurns: Number(row.thinking_turns),
122
- })),
123
- topRegressions: regressionRows.map((row) => ({
124
- toolName: row.tool_name,
125
- errorType: row.error_type,
126
- occurrences: Number(row.occurrences),
127
- })),
128
- sampleQueue: {
129
- counters,
130
- preview: samplePreview.map((row) => ({
131
- sampleId: row.sample_id,
132
- sessionId: row.session_id,
133
- qualityScore: Number(row.quality_score),
134
- reviewStatus: row.review_status,
135
- createdAt: row.created_at,
136
- })),
137
- },
138
- thinkingSummary: {
139
- activeModels,
140
- dormantModels: Math.max(0, listThinkingModels().length - activeModels),
141
- effectiveModels: effectiveCount,
142
- coverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
143
- },
144
- };
145
- }
146
- listSamples(filters = {}) {
147
- const page = Math.max(1, Number(filters.page ?? 1));
148
- const pageSize = clampPageSize(filters.pageSize);
149
- const offset = (page - 1) * pageSize;
150
- const where = [];
151
- const params = [];
152
- if (filters.status && filters.status !== 'all') {
153
- where.push('cs.review_status = ?');
154
- params.push(filters.status);
155
- }
156
- if (Number.isFinite(filters.qualityMin)) {
157
- where.push('cs.quality_score >= ?');
158
- params.push(Number(filters.qualityMin));
159
- }
160
- if (filters.dateFrom) {
161
- where.push('cs.created_at >= ?');
162
- params.push(filters.dateFrom);
163
- }
164
- if (filters.dateTo) {
165
- where.push('cs.created_at <= ?');
166
- params.push(filters.dateTo);
167
- }
168
- if (filters.failureMode) {
169
- where.push(`
170
- COALESCE(
171
- (
172
- SELECT COALESCE(tc.error_type, tc.tool_name)
173
- FROM tool_calls tc
174
- WHERE tc.session_id = cs.session_id
175
- AND tc.outcome = 'failure'
176
- AND tc.created_at <= ut.created_at
177
- ORDER BY tc.created_at DESC
178
- LIMIT 1
179
- ),
180
- 'unknown'
181
- ) = ?
182
- `);
183
- params.push(filters.failureMode);
184
- }
185
- const whereClause = where.length > 0 ? `WHERE ${where.join(' AND ')}` : '';
186
- const total = Number(this.uiDb.get(`
187
- SELECT COUNT(*) AS count
188
- FROM correction_samples cs
189
- JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
190
- ${whereClause}
191
- `, ...params)?.count ?? 0);
192
- const items = this.uiDb.all(`
193
- SELECT
194
- cs.sample_id,
195
- cs.session_id,
196
- cs.review_status,
197
- cs.quality_score,
198
- cs.created_at,
199
- cs.updated_at,
200
- cs.diff_excerpt,
201
- COALESCE(
202
- (
203
- SELECT COALESCE(tc.error_type, tc.tool_name)
204
- FROM tool_calls tc
205
- WHERE tc.session_id = cs.session_id
206
- AND tc.outcome = 'failure'
207
- AND tc.created_at <= ut.created_at
208
- ORDER BY tc.created_at DESC
209
- LIMIT 1
210
- ),
211
- 'unknown'
212
- ) AS failure_mode,
213
- (
214
- SELECT COUNT(*)
215
- FROM thinking_model_events tme
216
- JOIN assistant_turns at2 ON at2.id = cs.bad_assistant_turn_id
217
- WHERE tme.session_id = cs.session_id
218
- AND tme.created_at >= at2.created_at
219
- AND tme.created_at <= ut.created_at
220
- ) AS related_thinking_count
221
- FROM correction_samples cs
222
- JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
223
- ${whereClause}
224
- ORDER BY cs.created_at DESC
225
- LIMIT ? OFFSET ?
226
- `, ...params, pageSize, offset);
227
- const counters = this.uiDb.all(`
228
- SELECT review_status, COUNT(*) AS count
229
- FROM correction_samples
230
- GROUP BY review_status
231
- `);
232
- return {
233
- counters: Object.fromEntries(counters.map((row) => [row.review_status, Number(row.count)])),
234
- items: items.map((row) => ({
235
- sampleId: row.sample_id,
236
- sessionId: row.session_id,
237
- reviewStatus: row.review_status,
238
- qualityScore: Number(row.quality_score),
239
- failureMode: row.failure_mode,
240
- relatedThinkingCount: Number(row.related_thinking_count),
241
- createdAt: row.created_at,
242
- updatedAt: row.updated_at,
243
- diffExcerpt: row.diff_excerpt,
244
- })),
245
- pagination: {
246
- page,
247
- pageSize,
248
- total,
249
- totalPages: total === 0 ? 0 : Math.ceil(total / pageSize),
250
- },
251
- };
252
- }
253
- getSampleDetail(sampleId) {
254
- const row = this.uiDb.get(`
255
- SELECT
256
- cs.sample_id,
257
- cs.session_id,
258
- cs.review_status,
259
- cs.quality_score,
260
- cs.created_at,
261
- cs.updated_at,
262
- cs.recovery_tool_span_json,
263
- cs.principle_ids_json,
264
- at.id AS bad_turn_id,
265
- at.raw_text AS bad_raw_text,
266
- at.blob_ref AS bad_blob_ref,
267
- at.sanitized_text AS bad_sanitized_text,
268
- at.created_at AS bad_created_at,
269
- ut.id AS user_turn_id,
270
- ut.raw_text AS user_raw_text,
271
- ut.blob_ref AS user_blob_ref,
272
- ut.correction_cue AS user_correction_cue,
273
- ut.created_at AS user_created_at
274
- FROM correction_samples cs
275
- JOIN assistant_turns at ON at.id = cs.bad_assistant_turn_id
276
- JOIN user_turns ut ON ut.id = cs.user_correction_turn_id
277
- WHERE cs.sample_id = ?
278
- `, sampleId);
279
- if (!row)
280
- return null;
281
- const reviewHistory = this.uiDb.all(`
282
- SELECT review_status, note, created_at
283
- FROM sample_reviews
284
- WHERE sample_id = ?
285
- ORDER BY created_at DESC
286
- `, sampleId);
287
- const relatedThinkingHits = this.uiDb.all(`
288
- SELECT id, model_id, matched_pattern, scenario_json, created_at, trigger_excerpt
289
- FROM thinking_model_events
290
- WHERE session_id = ?
291
- AND created_at >= ?
292
- AND created_at <= ?
293
- ORDER BY created_at DESC
294
- LIMIT 20
295
- `, row.session_id, row.bad_created_at, row.user_created_at);
296
- const relatedPrinciples = this.uiDb.all(`
297
- SELECT principle_id, event_type, created_at
298
- FROM principle_events
299
- WHERE created_at >= ?
300
- AND created_at <= datetime(?, '+' || ? || ' minutes')
301
- ORDER BY created_at DESC
302
- LIMIT 20
303
- `, row.bad_created_at, row.user_created_at, PRINCIPLE_EVENT_WINDOW_MINUTES);
304
- const seededPrincipleIds = parseJson(row.principle_ids_json, []).map((principleId) => ({
305
- principleId,
306
- eventType: 'seeded_from_sample',
307
- createdAt: row.created_at,
308
- }));
309
- return {
310
- sampleId: row.sample_id,
311
- sessionId: row.session_id,
312
- reviewStatus: row.review_status,
313
- qualityScore: Number(row.quality_score),
314
- createdAt: row.created_at,
315
- updatedAt: row.updated_at,
316
- badAttempt: {
317
- assistantTurnId: Number(row.bad_turn_id),
318
- rawText: this.uiDb.restoreRawText(row.bad_raw_text, row.bad_blob_ref),
319
- sanitizedText: row.bad_sanitized_text,
320
- createdAt: row.bad_created_at,
321
- },
322
- userCorrection: {
323
- userTurnId: Number(row.user_turn_id),
324
- rawText: this.uiDb.restoreRawText(row.user_raw_text, row.user_blob_ref),
325
- correctionCue: row.user_correction_cue,
326
- createdAt: row.user_created_at,
327
- },
328
- recoveryToolSpan: parseJson(row.recovery_tool_span_json, []),
329
- relatedPrinciples: [
330
- ...seededPrincipleIds,
331
- ...relatedPrinciples.map((item) => ({
332
- principleId: item.principle_id,
333
- eventType: item.event_type,
334
- createdAt: item.created_at,
335
- })),
336
- ],
337
- relatedThinkingHits: relatedThinkingHits.map((item) => ({
338
- id: Number(item.id),
339
- modelId: item.model_id,
340
- modelName: getThinkingModel(item.model_id)?.name ?? item.model_id,
341
- matchedPattern: item.matched_pattern,
342
- scenarios: parseJson(item.scenario_json, []),
343
- createdAt: item.created_at,
344
- triggerExcerpt: item.trigger_excerpt,
345
- })),
346
- reviewHistory: reviewHistory.map((item) => ({
347
- reviewStatus: item.review_status,
348
- note: item.note,
349
- createdAt: item.created_at,
350
- })),
351
- };
352
- }
353
- reviewSample(sampleId, decision, note) {
354
- return this.trajectory.reviewCorrectionSample(sampleId, decision, note);
355
- }
356
- exportCorrections(mode) {
357
- return this.trajectory.exportCorrections({ mode, approvedOnly: true });
358
- }
359
- getThinkingOverview() {
360
- const topModels = this.loadThinkingModelSummaries();
361
- const knownModels = listThinkingModels();
362
- const activeIds = new Set(topModels.filter((model) => model.hits > 0).map((model) => model.modelId));
363
- const dormantModels = knownModels
364
- .filter((model) => !activeIds.has(model.id))
365
- .map((model) => ({
366
- modelId: model.id,
367
- name: model.name,
368
- description: model.description,
369
- }));
370
- const coverageRow = this.uiDb.get(`
371
- SELECT
372
- COUNT(DISTINCT assistant_turn_id) AS thinking_turns,
373
- (SELECT COUNT(*) FROM assistant_turns) AS assistant_turns
374
- FROM thinking_model_events
375
- `) ?? { thinking_turns: 0, assistant_turns: 0 };
376
- const coverageTrend = this.uiDb.all(`
377
- WITH assistant_daily AS (
378
- SELECT substr(created_at, 1, 10) AS day, COUNT(*) AS assistant_turns
379
- FROM assistant_turns
380
- GROUP BY substr(created_at, 1, 10)
381
- ),
382
- thinking_daily AS (
383
- SELECT substr(created_at, 1, 10) AS day, COUNT(DISTINCT assistant_turn_id) AS thinking_turns
384
- FROM thinking_model_events
385
- GROUP BY substr(created_at, 1, 10)
386
- )
387
- SELECT
388
- assistant_daily.day AS day,
389
- assistant_daily.assistant_turns AS assistant_turns,
390
- COALESCE(thinking_daily.thinking_turns, 0) AS thinking_turns
391
- FROM assistant_daily
392
- LEFT JOIN thinking_daily ON thinking_daily.day = assistant_daily.day
393
- ORDER BY assistant_daily.day ASC
394
- `);
395
- const scenarioMatrix = this.uiDb.all('SELECT model_id, scenario, hits FROM v_thinking_model_scenarios ORDER BY hits DESC, model_id ASC');
396
- return {
397
- summary: {
398
- totalModels: knownModels.length,
399
- activeModels: activeIds.size,
400
- dormantModels: dormantModels.length,
401
- effectiveModels: topModels.filter((model) => model.recommendation === 'reinforce').length,
402
- coverageRate: roundRate(coverageRow.thinking_turns, coverageRow.assistant_turns),
403
- },
404
- topModels,
405
- dormantModels,
406
- effectiveModels: topModels.filter((model) => model.recommendation === 'reinforce'),
407
- scenarioMatrix: scenarioMatrix.map((row) => ({
408
- modelId: row.model_id,
409
- modelName: getThinkingModel(row.model_id)?.name ?? row.model_id,
410
- scenario: row.scenario,
411
- hits: Number(row.hits),
412
- })),
413
- coverageTrend: coverageTrend.map((row) => ({
414
- day: row.day,
415
- assistantTurns: Number(row.assistant_turns),
416
- thinkingTurns: Number(row.thinking_turns),
417
- coverageRate: roundRate(Number(row.thinking_turns), Number(row.assistant_turns)),
418
- })),
419
- };
420
- }
421
- getThinkingModelDetail(modelId) {
422
- if (!getThinkingModel(modelId)) {
423
- return null;
424
- }
425
- const summary = this.loadThinkingModelSummaries().find((item) => item.modelId === modelId) ?? {
426
- modelId,
427
- name: getThinkingModel(modelId)?.name ?? modelId,
428
- description: getThinkingModel(modelId)?.description ?? 'Unknown thinking model.',
429
- hits: 0,
430
- coverageRate: 0,
431
- successRate: 0,
432
- failureRate: 0,
433
- painRate: 0,
434
- correctionRate: 0,
435
- correctionSampleRate: 0,
436
- commonScenarios: [],
437
- recommendation: 'archive',
438
- };
439
- const usageTrend = this.uiDb.all(`
440
- SELECT day, hits
441
- FROM v_thinking_model_daily_trend
442
- WHERE model_id = ?
443
- ORDER BY day ASC
444
- `, modelId);
445
- const scenarioDistribution = this.uiDb.all(`
446
- SELECT scenario, hits
447
- FROM v_thinking_model_scenarios
448
- WHERE model_id = ?
449
- ORDER BY hits DESC, scenario ASC
450
- `, modelId);
451
- const effect = this.uiDb.get('SELECT * FROM v_thinking_model_effectiveness WHERE model_id = ?', modelId) ?? {
452
- events: 0,
453
- success_windows: 0,
454
- failure_windows: 0,
455
- pain_windows: 0,
456
- correction_windows: 0,
457
- correction_sample_windows: 0,
458
- };
459
- const recentEvents = this.uiDb.all(`
460
- SELECT id, created_at, matched_pattern, scenario_json, trigger_excerpt,
461
- tool_context_json, pain_context_json, principle_context_json
462
- FROM thinking_model_events
463
- WHERE model_id = ?
464
- ORDER BY created_at DESC
465
- LIMIT 20
466
- `, modelId);
467
- return {
468
- modelMeta: {
469
- modelId: summary.modelId,
470
- name: summary.name,
471
- description: summary.description,
472
- hits: summary.hits,
473
- coverageRate: summary.coverageRate,
474
- recommendation: summary.recommendation,
475
- },
476
- usageTrend: usageTrend.map((row) => ({
477
- day: row.day,
478
- hits: Number(row.hits),
479
- })),
480
- scenarioDistribution: scenarioDistribution.map((row) => ({
481
- scenario: row.scenario,
482
- hits: Number(row.hits),
483
- })),
484
- outcomeStats: {
485
- events: Number(effect.events),
486
- successRate: roundRate(Number(effect.success_windows), Number(effect.events)),
487
- failureRate: roundRate(Number(effect.failure_windows), Number(effect.events)),
488
- painRate: roundRate(Number(effect.pain_windows), Number(effect.events)),
489
- correctionRate: roundRate(Number(effect.correction_windows), Number(effect.events)),
490
- correctionSampleRate: roundRate(Number(effect.correction_sample_windows), Number(effect.events)),
491
- },
492
- recentEvents: recentEvents.map((row) => ({
493
- id: Number(row.id),
494
- createdAt: row.created_at,
495
- matchedPattern: row.matched_pattern,
496
- scenarios: parseJson(row.scenario_json, []),
497
- triggerExcerpt: row.trigger_excerpt,
498
- toolContext: parseJson(row.tool_context_json, []),
499
- painContext: parseJson(row.pain_context_json, []),
500
- principleContext: parseJson(row.principle_context_json, []),
501
- })),
502
- };
503
- }
504
- loadThinkingModelSummaries() {
505
- const knownModels = listThinkingModels();
506
- const usageRows = new Map(this.uiDb.all('SELECT model_id, hits, coverage_rate FROM v_thinking_model_usage').map((row) => [row.model_id, row]));
507
- const effectRows = new Map(this.uiDb.all('SELECT * FROM v_thinking_model_effectiveness').map((row) => [row.model_id, row]));
508
- const scenarioRows = this.uiDb.all('SELECT model_id, scenario, hits FROM v_thinking_model_scenarios ORDER BY hits DESC');
509
- return knownModels.map((model) => {
510
- const usage = usageRows.get(model.id);
511
- const effect = effectRows.get(model.id);
512
- const events = Number(effect?.events ?? usage?.hits ?? 0);
513
- const successRate = roundRate(Number(effect?.success_windows ?? 0), events);
514
- const failureRate = roundRate(Number(effect?.failure_windows ?? 0), events);
515
- const painRate = roundRate(Number(effect?.pain_windows ?? 0), events);
516
- const correctionRate = roundRate(Number(effect?.correction_windows ?? 0), events);
517
- const correctionSampleRate = roundRate(Number(effect?.correction_sample_windows ?? 0), events);
518
- return {
519
- modelId: model.id,
520
- name: model.name,
521
- description: model.description,
522
- hits: Number(usage?.hits ?? 0),
523
- coverageRate: Number(usage?.coverage_rate ?? 0),
524
- successRate,
525
- failureRate,
526
- painRate,
527
- correctionRate,
528
- correctionSampleRate,
529
- commonScenarios: scenarioRows
530
- .filter((row) => row.model_id === model.id)
531
- .slice(0, 3)
532
- .map((row) => row.scenario),
533
- recommendation: summarizeRecommendation({
534
- hits: Number(usage?.hits ?? 0),
535
- successRate,
536
- failureRate,
537
- painRate,
538
- correctionRate,
539
- }),
540
- };
541
- }).sort((left, right) => right.hits - left.hits || left.modelId.localeCompare(right.modelId));
542
- }
543
- }
@@ -1,88 +0,0 @@
1
- import type { PluginLogger } from '../openclaw-sdk.js';
2
- export interface EmpathyObserverApi {
3
- config?: {
4
- empathy_engine?: {
5
- enabled?: boolean;
6
- };
7
- };
8
- runtime: {
9
- subagent: {
10
- run: (params: {
11
- sessionKey: string;
12
- message: string;
13
- lane?: string;
14
- deliver?: boolean;
15
- idempotencyKey?: string;
16
- expectsCompletionMessage?: boolean;
17
- }) => Promise<unknown>;
18
- waitForRun: (params: {
19
- runId: string;
20
- timeoutMs?: number;
21
- }) => Promise<{
22
- status: 'ok' | 'error' | 'timeout';
23
- error?: string;
24
- }>;
25
- getSessionMessages: (params: {
26
- sessionKey: string;
27
- limit?: number;
28
- }) => Promise<{
29
- messages: unknown[];
30
- assistantTexts?: string[];
31
- }>;
32
- deleteSession: (params: {
33
- sessionKey: string;
34
- deleteTranscript?: boolean;
35
- }) => Promise<void>;
36
- };
37
- };
38
- logger: PluginLogger;
39
- }
40
- export declare class EmpathyObserverManager {
41
- private static instance;
42
- private sessionLocks;
43
- private activeRuns;
44
- private completedSessions;
45
- private constructor();
46
- static getInstance(): EmpathyObserverManager;
47
- /**
48
- * Build a safe session key for empathy observer
49
- * Format: agent:main:subagent:empathy-obs-{safeParentSessionId}-{timestamp}
50
- */
51
- buildEmpathyObserverSessionKey(parentSessionId: string): string;
52
- /**
53
- * Check if a session key is an empathy observer session
54
- */
55
- isObserverSession(sessionKey: string): boolean;
56
- private markCompleted;
57
- private isCompleted;
58
- private isActive;
59
- private getActiveMetadata;
60
- shouldTrigger(api: EmpathyObserverApi | null | undefined, sessionId: string): boolean;
61
- spawn(api: EmpathyObserverApi | null | undefined, sessionId: string, userMessage: string, workspaceDir?: string): Promise<string | null>;
62
- /**
63
- * Main回收链路: 使用 waitForRun 驱动回收
64
- * 仅在 ok 时回收; timeout/exception 保留 session 由 fallback 处理
65
- */
66
- private finalizeRun;
67
- /**
68
- * 统一回收入口: reap + deleteSession + 清理状态
69
- */
70
- private reapBySession;
71
- /**
72
- * Fallback回收: 由 subagent_ended 触发
73
- * 仅在主链路未处理时执行补救回收
74
- */
75
- reap(api: EmpathyObserverApi | null | undefined, targetSessionKey: string, workspaceDir?: string): Promise<void>;
76
- private cleanupState;
77
- /**
78
- * Extract parent session ID from observer session key
79
- */
80
- extractParentSessionId(sessionKey: string): string | null;
81
- private parseJsonPayload;
82
- private extractAssistantText;
83
- private scoreFromSeverity;
84
- private normalizeSeverity;
85
- private normalizeConfidence;
86
- }
87
- export declare const empathyObserverManager: EmpathyObserverManager;
88
- export declare function isEmpathyObserverSession(sessionKey: string): boolean;