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,414 +0,0 @@
1
- import { WorkspaceContext } from '../core/workspace-context.js';
2
- import { trackFriction } from '../core/session-tracker.js';
3
- import { isSubagentRuntimeAvailable } from '../utils/subagent-probe.js';
4
- const OBSERVER_SESSION_PREFIX = 'agent:main:subagent:empathy-obs-';
5
- // Default timeout for waitForRun (30 seconds)
6
- const DEFAULT_WAIT_TIMEOUT_MS = 30_000;
7
- export class EmpathyObserverManager {
8
- static instance;
9
- sessionLocks = new Map();
10
- activeRuns = new Map();
11
- completedSessions = new Map();
12
- constructor() { }
13
- static getInstance() {
14
- if (!EmpathyObserverManager.instance) {
15
- EmpathyObserverManager.instance = new EmpathyObserverManager();
16
- }
17
- return EmpathyObserverManager.instance;
18
- }
19
- /**
20
- * Build a safe session key for empathy observer
21
- * Format: agent:main:subagent:empathy-obs-{safeParentSessionId}-{timestamp}
22
- */
23
- buildEmpathyObserverSessionKey(parentSessionId) {
24
- const safeParentSessionId = parentSessionId
25
- .replace(/[^a-zA-Z0-9_-]/g, '_')
26
- .substring(0, 64);
27
- const timestamp = Date.now();
28
- return `${OBSERVER_SESSION_PREFIX}${safeParentSessionId}-${timestamp}`;
29
- }
30
- /**
31
- * Check if a session key is an empathy observer session
32
- */
33
- isObserverSession(sessionKey) {
34
- return isEmpathyObserverSession(sessionKey);
35
- }
36
- markCompleted(observerSessionKey) {
37
- this.completedSessions.set(observerSessionKey, Date.now());
38
- }
39
- isCompleted(observerSessionKey) {
40
- const timestamp = this.completedSessions.get(observerSessionKey);
41
- if (!timestamp)
42
- return false;
43
- if (Date.now() - timestamp > 5 * 60 * 1000) {
44
- this.completedSessions.delete(observerSessionKey);
45
- return false;
46
- }
47
- return true;
48
- }
49
- isActive(parentSessionId) {
50
- const metadata = this.activeRuns.get(parentSessionId);
51
- if (!metadata)
52
- return false;
53
- if (metadata.timedOutAt || metadata.erroredAt) {
54
- if (!metadata.observedAt)
55
- return true;
56
- // TTL-based cleanup of orphaned timed-out/error entries:
57
- // if fallback never fired, expire the block so parent session recovers
58
- if (Date.now() - metadata.observedAt > 5 * 60 * 1000) {
59
- this.activeRuns.delete(parentSessionId);
60
- if (this.sessionLocks.get(parentSessionId) === metadata.observerSessionKey) {
61
- this.sessionLocks.delete(parentSessionId);
62
- }
63
- return false;
64
- }
65
- return true;
66
- }
67
- if (Date.now() - metadata.startedAt > 5 * 60 * 1000) {
68
- this.activeRuns.delete(parentSessionId);
69
- if (this.sessionLocks.get(parentSessionId) === metadata.observerSessionKey) {
70
- this.sessionLocks.delete(parentSessionId);
71
- }
72
- return false;
73
- }
74
- return true;
75
- }
76
- getActiveMetadata(parentSessionId) {
77
- return this.activeRuns.get(parentSessionId);
78
- }
79
- shouldTrigger(api, sessionId) {
80
- if (!api || !sessionId) {
81
- api?.logger?.warn?.('[PD:EmpathyObserver] shouldTrigger=false: api or sessionId null');
82
- return false;
83
- }
84
- const enabled = api.config?.empathy_engine?.enabled !== false;
85
- if (!enabled) {
86
- api.logger?.warn?.('[PD:EmpathyObserver] shouldTrigger=false: empathy_engine disabled');
87
- return false;
88
- }
89
- // Skip BOOT sessions - they run outside "gateway request" context where subagent.run() is unavailable
90
- if (sessionId.startsWith('boot-')) {
91
- api.logger?.warn?.('[PD:EmpathyObserver] shouldTrigger=false: boot session (gateway request context unavailable)');
92
- return false;
93
- }
94
- const subagentOk = isSubagentRuntimeAvailable(api.runtime?.subagent);
95
- if (!subagentOk) {
96
- api.logger?.warn?.('[PD:EmpathyObserver] shouldTrigger=false: subagent runtime unavailable');
97
- return false;
98
- }
99
- if (this.isActive(sessionId)) {
100
- api.logger?.warn?.(`[PD:EmpathyObserver] shouldTrigger=false: session ${sessionId} has active run`);
101
- return false;
102
- }
103
- api.logger?.info?.(`[PD:EmpathyObserver] shouldTrigger=true for session ${sessionId}`);
104
- return true;
105
- }
106
- async spawn(api, sessionId, userMessage, workspaceDir) {
107
- if (!api)
108
- return null;
109
- if (!this.shouldTrigger(api, sessionId)) {
110
- api?.logger?.warn?.(`[PD:EmpathyObserver] spawn skipped: shouldTrigger=false for session ${sessionId}`);
111
- return null;
112
- }
113
- if (!userMessage?.trim()) {
114
- api?.logger?.warn?.('[PD:EmpathyObserver] spawn skipped: empty userMessage');
115
- return null;
116
- }
117
- const sessionKey = this.buildEmpathyObserverSessionKey(sessionId);
118
- this.sessionLocks.set(sessionId, sessionKey);
119
- api.logger.info(`[PD:EmpathyObserver] Spawn starting for session ${sessionId}, key=${sessionKey}`);
120
- const prompt = [
121
- 'You are an empathy observer.',
122
- 'Analyze ONLY the user message and return strict JSON (no markdown):',
123
- '{"damageDetected": boolean, "severity": "mild|moderate|severe", "confidence": number, "reason": string}',
124
- `User message: ${JSON.stringify(userMessage.trim())}`,
125
- ].join('\n');
126
- let runId;
127
- try {
128
- const result = await api.runtime.subagent.run({
129
- sessionKey,
130
- message: prompt,
131
- lane: 'subagent',
132
- deliver: false,
133
- idempotencyKey: `${sessionId}:${Date.now()}`,
134
- expectsCompletionMessage: true,
135
- });
136
- runId = result.runId;
137
- api.logger.info(`[PD:EmpathyObserver] Spawn succeeded for ${sessionKey}, runId=${runId}`);
138
- }
139
- catch (error) {
140
- this.sessionLocks.delete(sessionId);
141
- api.logger.warn(`[PD:EmpathyObserver] Spawn failed for ${sessionId}: ${String(error)}`);
142
- return null;
143
- }
144
- this.activeRuns.set(sessionId, {
145
- runId,
146
- parentSessionId: sessionId,
147
- observerSessionKey: sessionKey,
148
- workspaceDir,
149
- startedAt: Date.now(),
150
- });
151
- this.finalizeRun(api, sessionId, sessionKey, workspaceDir).catch(async (err) => {
152
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun failed (will retry once): ${String(err)}`);
153
- await new Promise((r) => setTimeout(r, 2000));
154
- try {
155
- await this.finalizeRun(api, sessionId, sessionKey, workspaceDir);
156
- }
157
- catch (retryErr) {
158
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun retry also failed: ${String(retryErr)}`);
159
- }
160
- });
161
- return sessionKey;
162
- }
163
- /**
164
- * Main回收链路: 使用 waitForRun 驱动回收
165
- * 仅在 ok 时回收; timeout/exception 保留 session 由 fallback 处理
166
- */
167
- async finalizeRun(api, parentSessionId, observerSessionKey, workspaceDir) {
168
- const metadata = this.activeRuns.get(parentSessionId);
169
- const runId = metadata?.runId;
170
- if (!runId) {
171
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun: no runId for ${observerSessionKey}`);
172
- this.cleanupState(parentSessionId, observerSessionKey);
173
- return;
174
- }
175
- api.logger.info(`[PD:EmpathyObserver] finalizeRun: waiting for runId=${runId}`);
176
- let waitResult;
177
- try {
178
- waitResult = await api.runtime.subagent.waitForRun({
179
- runId,
180
- timeoutMs: DEFAULT_WAIT_TIMEOUT_MS,
181
- });
182
- api.logger.info(`[PD:EmpathyObserver] finalizeRun: wait completed status=${waitResult.status}`);
183
- }
184
- catch (error) {
185
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun: waitForRun threw for ${runId}: ${String(error)}`);
186
- const updatedMetadata = this.activeRuns.get(parentSessionId);
187
- if (updatedMetadata) {
188
- updatedMetadata.erroredAt = Date.now();
189
- updatedMetadata.observedAt = Date.now();
190
- }
191
- this.cleanupState(parentSessionId, observerSessionKey, false);
192
- return;
193
- }
194
- if (waitResult.status === 'timeout') {
195
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun: observer wait timed out; deferring cleanup for ${observerSessionKey}`);
196
- const updatedMetadata = this.activeRuns.get(parentSessionId);
197
- if (updatedMetadata) {
198
- updatedMetadata.timedOutAt = Date.now();
199
- updatedMetadata.observedAt = Date.now();
200
- }
201
- this.cleanupState(parentSessionId, observerSessionKey, false);
202
- return;
203
- }
204
- if (waitResult.status === 'error') {
205
- api.logger.warn(`[PD:EmpathyObserver] finalizeRun: observer run errored: ${waitResult.error}; deferring cleanup for ${observerSessionKey}`);
206
- const updatedMetadata = this.activeRuns.get(parentSessionId);
207
- if (updatedMetadata) {
208
- updatedMetadata.erroredAt = Date.now();
209
- updatedMetadata.observedAt = Date.now();
210
- }
211
- this.cleanupState(parentSessionId, observerSessionKey, false);
212
- return;
213
- }
214
- // Set observedAt before reapBySession so TTL cleanup works even if reapBySession fails
215
- const updatedMetadata = this.activeRuns.get(parentSessionId);
216
- if (updatedMetadata) {
217
- updatedMetadata.observedAt = Date.now();
218
- }
219
- await this.reapBySession(api, observerSessionKey, parentSessionId, workspaceDir);
220
- }
221
- /**
222
- * 统一回收入口: reap + deleteSession + 清理状态
223
- */
224
- async reapBySession(api, observerSessionKey, parentSessionId, workspaceDir) {
225
- if (this.isCompleted(observerSessionKey)) {
226
- api.logger.info(`[PD:EmpathyObserver] reapBySession: already processed ${observerSessionKey}, skipping`);
227
- this.cleanupState(parentSessionId, observerSessionKey);
228
- return;
229
- }
230
- api.logger.info(`[PD:EmpathyObserver] reapBySession starting for ${observerSessionKey}`);
231
- const storedMetadata = this.activeRuns.get(parentSessionId);
232
- // Use original parentSessionId from metadata, NOT extracted from session key
233
- // (session key may have been sanitized/truncated and doesn't match original)
234
- const sessionId = storedMetadata?.parentSessionId || this.extractParentSessionId(observerSessionKey) || parentSessionId;
235
- let finalized = false;
236
- try {
237
- const messages = await api.runtime.subagent.getSessionMessages({
238
- sessionKey: observerSessionKey,
239
- limit: 20,
240
- });
241
- api.logger.info(`[PD:EmpathyObserver] Retrieved messages for ${observerSessionKey}`);
242
- const rawText = this.extractAssistantText(messages.messages, messages.assistantTexts);
243
- api.logger?.debug?.(`[PD:EmpathyObserver] Raw observer output for ${observerSessionKey}: ${JSON.stringify(rawText)}`);
244
- const parsed = this.parseJsonPayload(rawText, api.logger);
245
- api.logger.info(`[PD:EmpathyObserver] Payload parsed: ${JSON.stringify(parsed)}`);
246
- if (parsed?.damageDetected && sessionId) {
247
- const wctx = WorkspaceContext.fromHookContext({ workspaceDir: workspaceDir || '' });
248
- const score = this.scoreFromSeverity(parsed.severity, wctx.config);
249
- trackFriction(sessionId, score, `observer_empathy_${parsed.severity || 'mild'}`, workspaceDir || '', { source: 'user_empathy' });
250
- const eventId = `emp_obs_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
251
- wctx.eventLog.recordPainSignal(sessionId, {
252
- score,
253
- source: 'user_empathy',
254
- reason: parsed.reason || 'Empathy observer detected likely user frustration.',
255
- isRisky: false,
256
- origin: 'system_infer',
257
- severity: this.normalizeSeverity(parsed.severity),
258
- confidence: this.normalizeConfidence(parsed.confidence),
259
- detection_mode: 'structured',
260
- deduped: false,
261
- trigger_text_excerpt: rawText.substring(0, 120),
262
- raw_score: score,
263
- calibrated_score: score,
264
- eventId,
265
- });
266
- try {
267
- wctx.trajectory?.recordPainEvent?.({
268
- sessionId,
269
- source: 'user_empathy',
270
- score,
271
- reason: parsed.reason || 'Empathy observer detected likely user frustration.',
272
- severity: this.normalizeSeverity(parsed.severity),
273
- origin: 'system_infer',
274
- confidence: this.normalizeConfidence(parsed.confidence),
275
- });
276
- }
277
- catch (error) {
278
- api.logger.warn(`[PD:EmpathyObserver] Failed to persist observer pain event for ${sessionId}: ${String(error)}`);
279
- }
280
- api.logger.info(`[PD:EmpathyObserver] Applied GFI +${score} for ${sessionId}`);
281
- }
282
- else {
283
- api.logger.info(`[PD:EmpathyObserver] No damage detected or no sessionId for ${observerSessionKey}`);
284
- }
285
- finalized = true;
286
- }
287
- catch (error) {
288
- api.logger.warn(`[PD:EmpathyObserver] reapBySession failed to read messages for ${observerSessionKey}: ${String(error)}`);
289
- }
290
- // Only delete the session if we successfully read messages (finalized=true).
291
- // When finalized=false (getSessionMessages failed), preserve the session so
292
- // the subagent_ended fallback can retry or the TTL expiry can unblock the parent.
293
- if (finalized) {
294
- try {
295
- await api.runtime.subagent.deleteSession({ sessionKey: observerSessionKey });
296
- api.logger.info(`[PD:EmpathyObserver] deleteSession succeeded for ${observerSessionKey}`);
297
- }
298
- catch (error) {
299
- api.logger.warn(`[PD:EmpathyObserver] deleteSession failed for ${observerSessionKey}: ${String(error)}`);
300
- }
301
- this.markCompleted(observerSessionKey);
302
- }
303
- // Only delete from activeRuns if finalized; otherwise preserve entry for subagent_ended fallback
304
- this.cleanupState(parentSessionId, observerSessionKey, finalized);
305
- }
306
- /**
307
- * Fallback回收: 由 subagent_ended 触发
308
- * 仅在主链路未处理时执行补救回收
309
- */
310
- async reap(api, targetSessionKey, workspaceDir) {
311
- if (!api || !this.isObserverSession(targetSessionKey))
312
- return;
313
- if (this.isCompleted(targetSessionKey)) {
314
- api.logger.info(`[PD:EmpathyObserver] reap fallback: already processed ${targetSessionKey}, skipping`);
315
- return;
316
- }
317
- // Find the original parentSessionId by matching observerSessionKey in activeRuns
318
- // (the session key may have been sanitized, so we can't rely on extraction alone)
319
- let parentSessionId = '';
320
- for (const [key, metadata] of this.activeRuns) {
321
- if (metadata.observerSessionKey === targetSessionKey) {
322
- parentSessionId = key;
323
- break;
324
- }
325
- }
326
- // Fallback: extract from session key (may be truncated but better than nothing for logging)
327
- if (!parentSessionId) {
328
- parentSessionId = this.extractParentSessionId(targetSessionKey) || '';
329
- }
330
- await this.reapBySession(api, targetSessionKey, parentSessionId, workspaceDir);
331
- }
332
- cleanupState(parentSessionId, observerSessionKey, deleteFromActiveRuns = true) {
333
- if (deleteFromActiveRuns) {
334
- this.activeRuns.delete(parentSessionId);
335
- }
336
- if (this.sessionLocks.get(parentSessionId) === observerSessionKey) {
337
- this.sessionLocks.delete(parentSessionId);
338
- }
339
- }
340
- /**
341
- * Extract parent session ID from observer session key
342
- */
343
- extractParentSessionId(sessionKey) {
344
- if (!this.isObserverSession(sessionKey))
345
- return null;
346
- const match = sessionKey.match(/empathy-obs-(.+)-(\d+)$/);
347
- return match ? match[1] : null;
348
- }
349
- parseJsonPayload(rawText, logger) {
350
- if (!rawText?.trim())
351
- return null;
352
- try {
353
- return JSON.parse(rawText.trim());
354
- }
355
- catch {
356
- const match = rawText.match(/\{[\s\S]*\}/);
357
- if (!match) {
358
- logger?.warn('[PD:EmpathyObserver] Observer payload is not valid JSON, skipping.');
359
- return null;
360
- }
361
- try {
362
- return JSON.parse(match[0]);
363
- }
364
- catch {
365
- logger?.warn('[PD:EmpathyObserver] Failed to parse observer JSON payload, skipping.');
366
- return null;
367
- }
368
- }
369
- }
370
- extractAssistantText(messages, assistantTexts) {
371
- if (assistantTexts && assistantTexts.length > 0) {
372
- return assistantTexts[assistantTexts.length - 1] || '';
373
- }
374
- for (let i = messages.length - 1; i >= 0; i--) {
375
- const msg = messages[i];
376
- if (msg?.role !== 'assistant')
377
- continue;
378
- if (typeof msg.content === 'string')
379
- return msg.content;
380
- if (Array.isArray(msg.content)) {
381
- const txt = msg.content
382
- .filter((part) => part?.type === 'text' && typeof part.text === 'string')
383
- .map((part) => part.text)
384
- .join('\n');
385
- if (txt)
386
- return txt;
387
- }
388
- }
389
- return '';
390
- }
391
- scoreFromSeverity(severity, config) {
392
- if (severity === 'severe')
393
- return Number(config.get('empathy_engine.penalties.severe') ?? 40);
394
- if (severity === 'moderate')
395
- return Number(config.get('empathy_engine.penalties.moderate') ?? 25);
396
- return Number(config.get('empathy_engine.penalties.mild') ?? 10);
397
- }
398
- normalizeSeverity(severity) {
399
- if (severity === 'severe')
400
- return 'severe';
401
- if (severity === 'moderate')
402
- return 'moderate';
403
- return 'mild';
404
- }
405
- normalizeConfidence(value) {
406
- if (!Number.isFinite(value))
407
- return 1;
408
- return Math.max(0, Math.min(1, Number(value)));
409
- }
410
- }
411
- export const empathyObserverManager = EmpathyObserverManager.getInstance();
412
- export function isEmpathyObserverSession(sessionKey) {
413
- return typeof sessionKey === 'string' && sessionKey.startsWith(OBSERVER_SESSION_PREFIX);
414
- }
@@ -1,155 +0,0 @@
1
- /**
2
- * EvolutionQueryService - 进化流程查询服务
3
- *
4
- * 提供 WebUI 所需的查询 API:
5
- * - getTasks() - 获取任务列表
6
- * - getEvents() - 获取事件流
7
- * - getTrace() - 获取完整追踪
8
- * - getStats() - 获取统计数据
9
- */
10
- import type { TrajectoryDatabase } from '../core/trajectory.js';
11
- export interface TaskListFilters {
12
- status?: string;
13
- dateFrom?: string;
14
- dateTo?: string;
15
- page?: number;
16
- pageSize?: number;
17
- }
18
- export interface EventFilters {
19
- traceId?: string;
20
- stage?: string;
21
- limit?: number;
22
- offset?: number;
23
- }
24
- export interface TasksResponse {
25
- items: Array<{
26
- taskId: string;
27
- traceId: string;
28
- source: string;
29
- reason: string | null;
30
- score: number;
31
- status: string;
32
- enqueuedAt: string | null;
33
- startedAt: string | null;
34
- completedAt: string | null;
35
- duration: number | null;
36
- resolution: string | null;
37
- eventCount: number;
38
- createdAt: string;
39
- }>;
40
- pagination: {
41
- page: number;
42
- pageSize: number;
43
- total: number;
44
- totalPages: number;
45
- };
46
- }
47
- export interface EventsResponse {
48
- items: Array<{
49
- id: number;
50
- traceId: string;
51
- taskId: string | null;
52
- stage: string;
53
- stageLabel: string;
54
- stageColor: string;
55
- level: string;
56
- message: string;
57
- summary: string | null;
58
- metadata: Record<string, unknown>;
59
- createdAt: string;
60
- }>;
61
- pagination: {
62
- limit: number;
63
- offset: number;
64
- hasMore: boolean;
65
- };
66
- }
67
- export interface TraceDetailResponse {
68
- traceId: string;
69
- task: {
70
- taskId: string;
71
- traceId: string;
72
- source: string;
73
- reason: string | null;
74
- score: number;
75
- status: string;
76
- enqueuedAt: string | null;
77
- startedAt: string | null;
78
- completedAt: string | null;
79
- duration: number | null;
80
- resolution: string | null;
81
- createdAt: string;
82
- updatedAt: string;
83
- };
84
- events: Array<{
85
- id: number;
86
- traceId: string;
87
- taskId: string | null;
88
- stage: string;
89
- stageLabel: string;
90
- stageColor: string;
91
- level: string;
92
- message: string;
93
- summary: string | null;
94
- metadata: Record<string, unknown>;
95
- createdAt: string;
96
- }>;
97
- timeline: Array<{
98
- stage: string;
99
- stageLabel: string;
100
- stageColor: string;
101
- timestamp: string;
102
- message: string;
103
- summary: string | null;
104
- }>;
105
- }
106
- export interface EvolutionStatsResponse {
107
- total: number;
108
- pending: number;
109
- inProgress: number;
110
- completed: number;
111
- failed: number;
112
- recentActivity: Array<{
113
- day: string;
114
- created: number;
115
- completed: number;
116
- }>;
117
- stageDistribution: Array<{
118
- stage: string;
119
- stageLabel: string;
120
- count: number;
121
- }>;
122
- }
123
- /**
124
- * EvolutionQueryService 类
125
- * 封装进化流程的查询逻辑
126
- */
127
- export declare class EvolutionQueryService {
128
- private readonly trajectory;
129
- constructor(trajectory: TrajectoryDatabase);
130
- /**
131
- * 释放资源
132
- * 注意:不关闭 trajectory,因为它是单例由 TrajectoryRegistry 管理
133
- */
134
- dispose(): void;
135
- /**
136
- * 获取任务列表(带分页、筛选)
137
- */
138
- getTasks(filters?: TaskListFilters): TasksResponse;
139
- /**
140
- * 获取事件流
141
- */
142
- getEvents(filters?: EventFilters): EventsResponse;
143
- /**
144
- * 获取完整追踪(单个 trace 的所有事件)
145
- */
146
- getTrace(traceId: string): TraceDetailResponse | null;
147
- /**
148
- * 获取统计数据
149
- */
150
- getStats(days?: number): EvolutionStatsResponse;
151
- }
152
- /**
153
- * 获取 EvolutionQueryService 实例(单例)
154
- */
155
- export declare function getEvolutionQueryService(trajectory: TrajectoryDatabase): EvolutionQueryService;