principles-disciple 1.8.1 → 1.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/ADVANCED_CONFIG_ZH.md +97 -0
  2. package/AGENT_INSTALL.md +173 -0
  3. package/AGENT_INSTALL_EN.md +173 -0
  4. package/INSTALL.md +256 -0
  5. package/SKILL.md +63 -0
  6. package/docs/COMMAND_REFERENCE.md +76 -0
  7. package/docs/COMMAND_REFERENCE_EN.md +79 -0
  8. package/esbuild.config.js +75 -0
  9. package/openclaw.plugin.json +4 -4
  10. package/package.json +11 -13
  11. package/scripts/build-web.mjs +46 -0
  12. package/scripts/install-dependencies.cjs +47 -0
  13. package/scripts/sync-plugin.mjs +802 -0
  14. package/scripts/verify-build.mjs +109 -0
  15. package/src/agents/nocturnal-dreamer.md +152 -0
  16. package/src/agents/nocturnal-philosopher.md +138 -0
  17. package/src/agents/nocturnal-reflector.md +126 -0
  18. package/src/agents/nocturnal-scribe.md +164 -0
  19. package/src/commands/capabilities.ts +85 -0
  20. package/{dist/commands/context.js → src/commands/context.ts} +78 -38
  21. package/src/commands/evolution-status.ts +146 -0
  22. package/src/commands/export.ts +111 -0
  23. package/src/commands/focus.ts +533 -0
  24. package/src/commands/nocturnal-review.ts +311 -0
  25. package/src/commands/nocturnal-rollout.ts +763 -0
  26. package/src/commands/nocturnal-train.ts +1002 -0
  27. package/{dist/commands/pain.js → src/commands/pain.ts} +68 -49
  28. package/src/commands/principle-rollback.ts +27 -0
  29. package/{dist/commands/rollback.js → src/commands/rollback.ts} +44 -12
  30. package/src/commands/samples.ts +60 -0
  31. package/src/commands/strategy.ts +38 -0
  32. package/{dist/commands/thinking-os.js → src/commands/thinking-os.ts} +59 -36
  33. package/src/commands/workflow-debug.ts +128 -0
  34. package/{dist/config/defaults/runtime.js → src/config/defaults/runtime.ts} +12 -5
  35. package/src/config/errors.ts +163 -0
  36. package/{dist/config/index.d.ts → src/config/index.ts} +2 -1
  37. package/src/constants/diagnostician.ts +66 -0
  38. package/src/constants/tools.ts +62 -0
  39. package/src/core/adaptive-thresholds.ts +476 -0
  40. package/{dist/core/config-service.js → src/core/config-service.ts} +7 -4
  41. package/{dist/core/config.js → src/core/config.ts} +158 -46
  42. package/src/core/control-ui-db.ts +435 -0
  43. package/{dist/core/detection-funnel.js → src/core/detection-funnel.ts} +36 -21
  44. package/{dist/core/detection-service.js → src/core/detection-service.ts} +7 -4
  45. package/{dist/core/dictionary-service.js → src/core/dictionary-service.ts} +7 -4
  46. package/{dist/core/dictionary.js → src/core/dictionary.ts} +57 -34
  47. package/src/core/empathy-keyword-matcher.ts +327 -0
  48. package/src/core/empathy-types.ts +218 -0
  49. package/src/core/event-log.ts +544 -0
  50. package/src/core/evolution-engine.ts +612 -0
  51. package/src/core/evolution-logger.ts +353 -0
  52. package/src/core/evolution-migration.ts +77 -0
  53. package/src/core/evolution-reducer.ts +731 -0
  54. package/src/core/evolution-types.ts +456 -0
  55. package/src/core/external-training-contract.ts +527 -0
  56. package/src/core/focus-history.ts +1458 -0
  57. package/src/core/hygiene/tracker.ts +117 -0
  58. package/{dist/core/init.js → src/core/init.ts} +39 -26
  59. package/src/core/local-worker-routing.ts +617 -0
  60. package/{dist/core/migration.js → src/core/migration.ts} +18 -11
  61. package/src/core/model-deployment-registry.ts +722 -0
  62. package/src/core/model-training-registry.ts +813 -0
  63. package/src/core/nocturnal-arbiter.ts +706 -0
  64. package/src/core/nocturnal-candidate-scoring.ts +392 -0
  65. package/src/core/nocturnal-compliance.ts +1075 -0
  66. package/src/core/nocturnal-dataset.ts +668 -0
  67. package/src/core/nocturnal-executability.ts +428 -0
  68. package/src/core/nocturnal-export.ts +390 -0
  69. package/{dist/core/nocturnal-paths.js → src/core/nocturnal-paths.ts} +49 -23
  70. package/src/core/nocturnal-trajectory-extractor.ts +484 -0
  71. package/src/core/nocturnal-trinity.ts +1384 -0
  72. package/src/core/pain.ts +122 -0
  73. package/{dist/core/path-resolver.js → src/core/path-resolver.ts} +157 -36
  74. package/{dist/core/paths.js → src/core/paths.ts} +13 -4
  75. package/src/core/principle-training-state.ts +450 -0
  76. package/src/core/profile.ts +226 -0
  77. package/src/core/promotion-gate.ts +822 -0
  78. package/{dist/core/risk-calculator.js → src/core/risk-calculator.ts} +42 -16
  79. package/{dist/core/session-tracker.js → src/core/session-tracker.ts} +175 -62
  80. package/src/core/shadow-observation-registry.ts +534 -0
  81. package/{dist/core/system-logger.js → src/core/system-logger.ts} +9 -5
  82. package/src/core/thinking-models.ts +217 -0
  83. package/src/core/training-program.ts +630 -0
  84. package/src/core/trajectory-types.ts +243 -0
  85. package/src/core/trajectory.ts +1673 -0
  86. package/{dist/core/workspace-context.js → src/core/workspace-context.ts} +57 -32
  87. package/src/hooks/bash-risk.ts +171 -0
  88. package/src/hooks/edit-verification.ts +295 -0
  89. package/src/hooks/gate-block-helper.ts +160 -0
  90. package/src/hooks/gate.ts +210 -0
  91. package/src/hooks/gfi-gate.ts +177 -0
  92. package/src/hooks/lifecycle.ts +326 -0
  93. package/{dist/hooks/llm.js → src/hooks/llm.ts} +160 -80
  94. package/src/hooks/message-sanitize.ts +45 -0
  95. package/src/hooks/pain.ts +384 -0
  96. package/src/hooks/progressive-trust-gate.ts +174 -0
  97. package/src/hooks/prompt.ts +920 -0
  98. package/src/hooks/subagent.ts +207 -0
  99. package/src/hooks/thinking-checkpoint.ts +73 -0
  100. package/src/hooks/trajectory-collector.ts +290 -0
  101. package/src/http/principles-console-route.ts +716 -0
  102. package/src/i18n/commands.ts +117 -0
  103. package/src/index.ts +694 -0
  104. package/src/service/central-database.ts +831 -0
  105. package/src/service/control-ui-query-service.ts +888 -0
  106. package/src/service/evolution-query-service.ts +405 -0
  107. package/src/service/evolution-worker.ts +1646 -0
  108. package/src/service/health-query-service.ts +836 -0
  109. package/{dist/service/nocturnal-runtime.js → src/service/nocturnal-runtime.ts} +235 -79
  110. package/src/service/nocturnal-service.ts +1015 -0
  111. package/src/service/nocturnal-target-selector.ts +532 -0
  112. package/src/service/phase3-input-filter.ts +237 -0
  113. package/src/service/runtime-summary-service.ts +757 -0
  114. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +513 -0
  115. package/{dist/service/subagent-workflow/empathy-observer-workflow-manager.js → src/service/subagent-workflow/empathy-observer-workflow-manager.ts} +240 -117
  116. package/src/service/subagent-workflow/index.ts +51 -0
  117. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +856 -0
  118. package/src/service/subagent-workflow/runtime-direct-driver.ts +166 -0
  119. package/{dist/service/subagent-workflow/types.d.ts → src/service/subagent-workflow/types.ts} +137 -18
  120. package/src/service/subagent-workflow/workflow-store.ts +328 -0
  121. package/src/service/trajectory-service.ts +15 -0
  122. package/{dist/tools/critique-prompt.js → src/tools/critique-prompt.ts} +25 -8
  123. package/src/tools/deep-reflect.ts +349 -0
  124. package/{dist/tools/model-index.js → src/tools/model-index.ts} +33 -17
  125. package/src/types/event-types.ts +453 -0
  126. package/src/types/hygiene-types.ts +31 -0
  127. package/src/types/principle-tree-schema.ts +244 -0
  128. package/src/types/runtime-summary.ts +49 -0
  129. package/src/types.ts +74 -0
  130. package/src/utils/file-lock.ts +391 -0
  131. package/{dist/utils/glob-match.js → src/utils/glob-match.ts} +21 -20
  132. package/{dist/utils/hashing.js → src/utils/hashing.ts} +6 -4
  133. package/src/utils/io.ts +110 -0
  134. package/{dist/utils/nlp.js → src/utils/nlp.ts} +19 -12
  135. package/{dist/utils/plugin-logger.js → src/utils/plugin-logger.ts} +33 -8
  136. package/src/utils/subagent-probe.ts +94 -0
  137. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +70 -1
  138. package/templates/pain_settings.json +2 -1
  139. package/tests/README.md +120 -0
  140. package/tests/build-artifacts.test.ts +111 -0
  141. package/tests/commands/evolution-status.test.ts +222 -0
  142. package/tests/commands/evolver.test.ts +22 -0
  143. package/tests/commands/export.test.ts +78 -0
  144. package/tests/commands/nocturnal-review.test.ts +448 -0
  145. package/tests/commands/nocturnal-train.test.ts +97 -0
  146. package/tests/commands/pain.test.ts +108 -0
  147. package/tests/commands/samples.test.ts +65 -0
  148. package/tests/commands/strategy.test.ts +34 -0
  149. package/tests/commands/thinking-os.test.ts +88 -0
  150. package/tests/core/adaptive-thresholds.test.ts +261 -0
  151. package/tests/core/config-service.test.ts +89 -0
  152. package/tests/core/config.test.ts +90 -0
  153. package/tests/core/control-ui-db.test.ts +75 -0
  154. package/tests/core/core-template-guidance.test.ts +21 -0
  155. package/tests/core/detection-funnel.test.ts +63 -0
  156. package/tests/core/detection-service.test.ts +50 -0
  157. package/tests/core/dictionary-service.test.ts +116 -0
  158. package/tests/core/dictionary.test.ts +168 -0
  159. package/tests/core/empathy-keyword-matcher.test.ts +209 -0
  160. package/tests/core/event-log.test.ts +181 -0
  161. package/tests/core/evolution-e2e.test.ts +58 -0
  162. package/tests/core/evolution-engine-gate-integration.test.ts +543 -0
  163. package/tests/core/evolution-engine.test.ts +562 -0
  164. package/tests/core/evolution-logger.test.ts +148 -0
  165. package/tests/core/evolution-migration.test.ts +50 -0
  166. package/tests/core/evolution-paths.test.ts +21 -0
  167. package/tests/core/evolution-reducer.detector-metadata.test.ts +602 -0
  168. package/tests/core/evolution-reducer.test.ts +180 -0
  169. package/tests/core/evolution-types-loop.test.ts +48 -0
  170. package/tests/core/evolution-user-stories.e2e.test.ts +249 -0
  171. package/tests/core/external-training-contract.test.ts +463 -0
  172. package/tests/core/focus-history.test.ts +682 -0
  173. package/tests/core/init-flatten.test.ts +69 -0
  174. package/tests/core/init-refactor.test.ts +87 -0
  175. package/tests/core/init-v1.3.test.ts +46 -0
  176. package/tests/core/init.test.ts +190 -0
  177. package/tests/core/local-worker-routing.test.ts +757 -0
  178. package/tests/core/migration.test.ts +84 -0
  179. package/tests/core/model-deployment-registry.test.ts +845 -0
  180. package/tests/core/model-training-registry.test.ts +889 -0
  181. package/tests/core/nocturnal-arbiter.test.ts +494 -0
  182. package/tests/core/nocturnal-candidate-scoring.test.ts +400 -0
  183. package/tests/core/nocturnal-compliance.test.ts +646 -0
  184. package/tests/core/nocturnal-dataset.test.ts +892 -0
  185. package/tests/core/nocturnal-executability.test.ts +357 -0
  186. package/tests/core/nocturnal-export.test.ts +462 -0
  187. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +428 -0
  188. package/tests/core/nocturnal-trajectory-extractor.test.ts +634 -0
  189. package/tests/core/nocturnal-trinity.test.ts +953 -0
  190. package/tests/core/pain.test.ts +33 -0
  191. package/tests/core/path-resolver.test.ts +57 -0
  192. package/tests/core/paths-refactor.test.ts +42 -0
  193. package/tests/core/phase7-rollout-integration.test.ts +477 -0
  194. package/tests/core/principle-training-state.test.ts +712 -0
  195. package/tests/core/profile.test.ts +56 -0
  196. package/tests/core/promotion-gate.test.ts +556 -0
  197. package/tests/core/risk-calculator.test.ts +168 -0
  198. package/tests/core/session-tracker.test.ts +191 -0
  199. package/tests/core/training-program.test.ts +472 -0
  200. package/tests/core/trajectory.test.ts +265 -0
  201. package/tests/core/workspace-context-factory.test.ts +18 -0
  202. package/tests/core/workspace-context.test.ts +134 -0
  203. package/tests/fixtures/nocturnal-reviewed-subset.json +183 -0
  204. package/tests/fixtures/production-compatibility.test.ts +147 -0
  205. package/tests/fixtures/production-mock-generator.ts +282 -0
  206. package/tests/hooks/bash-risk-integration.test.ts +137 -0
  207. package/tests/hooks/bash-risk.test.ts +81 -0
  208. package/tests/hooks/edit-verification.test.ts +678 -0
  209. package/tests/hooks/gate-edit-verification-p1.test.ts +632 -0
  210. package/tests/hooks/gate-edit-verification.test.ts +435 -0
  211. package/tests/hooks/gate-pipeline-integration.test.ts +404 -0
  212. package/tests/hooks/gate.test.ts +271 -0
  213. package/tests/hooks/gfi-gate-unit.test.ts +422 -0
  214. package/tests/hooks/gfi-gate.test.ts +669 -0
  215. package/tests/hooks/lifecycle.test.ts +248 -0
  216. package/tests/hooks/llm.test.ts +308 -0
  217. package/tests/hooks/message-sanitize.test.ts +36 -0
  218. package/tests/hooks/pain.test.ts +141 -0
  219. package/tests/hooks/progressive-trust-gate.test.ts +277 -0
  220. package/tests/hooks/prompt.test.ts +1411 -0
  221. package/tests/hooks/subagent.test.ts +467 -0
  222. package/tests/hooks/thinking-gate.test.ts +313 -0
  223. package/tests/http/principles-console-route.test.ts +140 -0
  224. package/tests/hygiene-tracker.test.ts +77 -0
  225. package/tests/index.integration.test.ts +179 -0
  226. package/tests/index.shadow-routing.integration.test.ts +140 -0
  227. package/tests/index.test.ts +9 -0
  228. package/tests/integration/empathy-workflow-integration.test.ts +627 -0
  229. package/tests/service/control-ui-query-service.test.ts +121 -0
  230. package/tests/service/empathy-observer-workflow-manager.test.ts +176 -0
  231. package/tests/service/evolution-worker.test.ts +585 -0
  232. package/tests/service/nocturnal-runtime.test.ts +470 -0
  233. package/tests/service/nocturnal-service.test.ts +577 -0
  234. package/tests/service/nocturnal-target-selector.test.ts +615 -0
  235. package/tests/service/nocturnal-workflow-manager.test.ts +439 -0
  236. package/tests/service/phase3-input-filter.test.ts +289 -0
  237. package/tests/service/runtime-summary-service.test.ts +919 -0
  238. package/tests/task-compliance.test.ts +166 -0
  239. package/tests/test-utils.ts +48 -0
  240. package/tests/tools/critique-prompt.test.ts +260 -0
  241. package/tests/tools/deep-reflect.test.ts +232 -0
  242. package/tests/tools/model-index.test.ts +246 -0
  243. package/tests/ui/app.test.tsx +114 -0
  244. package/tests/utils/file-lock.test.ts +407 -0
  245. package/tests/utils/hashing.test.ts +32 -0
  246. package/tests/utils/io.test.ts +39 -0
  247. package/tests/utils/nlp.test.ts +53 -0
  248. package/tests/utils/plugin-logger.test.ts +156 -0
  249. package/tsconfig.json +16 -0
  250. package/tsconfig.tsbuildinfo +1 -0
  251. package/ui/src/App.tsx +45 -0
  252. package/ui/src/api.ts +216 -0
  253. package/ui/src/charts.tsx +586 -0
  254. package/ui/src/components/ErrorState.tsx +6 -0
  255. package/ui/src/components/Loading.tsx +13 -0
  256. package/ui/src/components/ProtectedRoute.tsx +12 -0
  257. package/ui/src/components/Shell.tsx +91 -0
  258. package/ui/src/components/WorkspaceConfig.tsx +146 -0
  259. package/ui/src/components/index.ts +5 -0
  260. package/ui/src/context/auth.tsx +80 -0
  261. package/ui/src/context/theme.tsx +66 -0
  262. package/ui/src/hooks/useAutoRefresh.ts +39 -0
  263. package/ui/src/i18n/ui.ts +363 -0
  264. package/ui/src/main.tsx +16 -0
  265. package/ui/src/pages/EvolutionPage.tsx +352 -0
  266. package/ui/src/pages/FeedbackPage.tsx +140 -0
  267. package/ui/src/pages/GateMonitorPage.tsx +136 -0
  268. package/ui/src/pages/LoginPage.tsx +88 -0
  269. package/ui/src/pages/OverviewPage.tsx +238 -0
  270. package/ui/src/pages/SamplesPage.tsx +174 -0
  271. package/ui/src/pages/ThinkingModelsPage.tsx +127 -0
  272. package/ui/src/styles.css +1661 -0
  273. package/ui/src/types.ts +368 -0
  274. package/ui/src/utils/format.ts +15 -0
  275. package/vitest.config.ts +23 -0
  276. package/dist/commands/capabilities.d.ts +0 -3
  277. package/dist/commands/capabilities.js +0 -73
  278. package/dist/commands/context.d.ts +0 -5
  279. package/dist/commands/evolution-status.d.ts +0 -4
  280. package/dist/commands/evolution-status.js +0 -117
  281. package/dist/commands/evolver.d.ts +0 -9
  282. package/dist/commands/evolver.js +0 -26
  283. package/dist/commands/export.d.ts +0 -2
  284. package/dist/commands/export.js +0 -98
  285. package/dist/commands/focus.d.ts +0 -14
  286. package/dist/commands/focus.js +0 -457
  287. package/dist/commands/nocturnal-review.d.ts +0 -24
  288. package/dist/commands/nocturnal-review.js +0 -265
  289. package/dist/commands/nocturnal-rollout.d.ts +0 -27
  290. package/dist/commands/nocturnal-rollout.js +0 -671
  291. package/dist/commands/nocturnal-train.d.ts +0 -25
  292. package/dist/commands/nocturnal-train.js +0 -919
  293. package/dist/commands/pain.d.ts +0 -5
  294. package/dist/commands/principle-rollback.d.ts +0 -4
  295. package/dist/commands/principle-rollback.js +0 -22
  296. package/dist/commands/rollback.d.ts +0 -19
  297. package/dist/commands/samples.d.ts +0 -2
  298. package/dist/commands/samples.js +0 -55
  299. package/dist/commands/strategy.d.ts +0 -3
  300. package/dist/commands/strategy.js +0 -29
  301. package/dist/commands/thinking-os.d.ts +0 -2
  302. package/dist/config/defaults/runtime.d.ts +0 -40
  303. package/dist/config/errors.d.ts +0 -84
  304. package/dist/config/errors.js +0 -94
  305. package/dist/config/index.js +0 -7
  306. package/dist/constants/diagnostician.d.ts +0 -12
  307. package/dist/constants/diagnostician.js +0 -56
  308. package/dist/constants/tools.d.ts +0 -17
  309. package/dist/constants/tools.js +0 -54
  310. package/dist/core/adaptive-thresholds.d.ts +0 -186
  311. package/dist/core/adaptive-thresholds.js +0 -300
  312. package/dist/core/config-service.d.ts +0 -15
  313. package/dist/core/config.d.ts +0 -129
  314. package/dist/core/control-ui-db.d.ts +0 -95
  315. package/dist/core/control-ui-db.js +0 -292
  316. package/dist/core/detection-funnel.d.ts +0 -33
  317. package/dist/core/detection-service.d.ts +0 -15
  318. package/dist/core/dictionary-service.d.ts +0 -15
  319. package/dist/core/dictionary.d.ts +0 -38
  320. package/dist/core/event-log.d.ts +0 -82
  321. package/dist/core/event-log.js +0 -463
  322. package/dist/core/evolution-engine.d.ts +0 -118
  323. package/dist/core/evolution-engine.js +0 -464
  324. package/dist/core/evolution-logger.d.ts +0 -137
  325. package/dist/core/evolution-logger.js +0 -256
  326. package/dist/core/evolution-migration.d.ts +0 -5
  327. package/dist/core/evolution-migration.js +0 -65
  328. package/dist/core/evolution-reducer.d.ts +0 -98
  329. package/dist/core/evolution-reducer.js +0 -465
  330. package/dist/core/evolution-types.d.ts +0 -287
  331. package/dist/core/evolution-types.js +0 -78
  332. package/dist/core/external-training-contract.d.ts +0 -276
  333. package/dist/core/external-training-contract.js +0 -269
  334. package/dist/core/focus-history.d.ts +0 -210
  335. package/dist/core/focus-history.js +0 -1185
  336. package/dist/core/hygiene/tracker.d.ts +0 -22
  337. package/dist/core/hygiene/tracker.js +0 -106
  338. package/dist/core/init.d.ts +0 -12
  339. package/dist/core/local-worker-routing.d.ts +0 -175
  340. package/dist/core/local-worker-routing.js +0 -525
  341. package/dist/core/migration.d.ts +0 -6
  342. package/dist/core/model-deployment-registry.d.ts +0 -218
  343. package/dist/core/model-deployment-registry.js +0 -503
  344. package/dist/core/model-training-registry.d.ts +0 -295
  345. package/dist/core/model-training-registry.js +0 -475
  346. package/dist/core/nocturnal-arbiter.d.ts +0 -159
  347. package/dist/core/nocturnal-arbiter.js +0 -534
  348. package/dist/core/nocturnal-candidate-scoring.d.ts +0 -137
  349. package/dist/core/nocturnal-candidate-scoring.js +0 -266
  350. package/dist/core/nocturnal-compliance.d.ts +0 -175
  351. package/dist/core/nocturnal-compliance.js +0 -824
  352. package/dist/core/nocturnal-dataset.d.ts +0 -224
  353. package/dist/core/nocturnal-dataset.js +0 -443
  354. package/dist/core/nocturnal-executability.d.ts +0 -85
  355. package/dist/core/nocturnal-executability.js +0 -331
  356. package/dist/core/nocturnal-export.d.ts +0 -124
  357. package/dist/core/nocturnal-export.js +0 -275
  358. package/dist/core/nocturnal-paths.d.ts +0 -124
  359. package/dist/core/nocturnal-trajectory-extractor.d.ts +0 -242
  360. package/dist/core/nocturnal-trajectory-extractor.js +0 -307
  361. package/dist/core/nocturnal-trinity.d.ts +0 -311
  362. package/dist/core/nocturnal-trinity.js +0 -880
  363. package/dist/core/pain.d.ts +0 -4
  364. package/dist/core/pain.js +0 -70
  365. package/dist/core/path-resolver.d.ts +0 -46
  366. package/dist/core/paths.d.ts +0 -65
  367. package/dist/core/principle-training-state.d.ts +0 -121
  368. package/dist/core/principle-training-state.js +0 -321
  369. package/dist/core/profile.d.ts +0 -62
  370. package/dist/core/profile.js +0 -210
  371. package/dist/core/promotion-gate.d.ts +0 -238
  372. package/dist/core/promotion-gate.js +0 -529
  373. package/dist/core/risk-calculator.d.ts +0 -22
  374. package/dist/core/session-tracker.d.ts +0 -101
  375. package/dist/core/shadow-observation-registry.d.ts +0 -217
  376. package/dist/core/shadow-observation-registry.js +0 -308
  377. package/dist/core/system-logger.d.ts +0 -8
  378. package/dist/core/thinking-models.d.ts +0 -38
  379. package/dist/core/thinking-models.js +0 -170
  380. package/dist/core/training-program.d.ts +0 -233
  381. package/dist/core/training-program.js +0 -433
  382. package/dist/core/trajectory.d.ts +0 -411
  383. package/dist/core/trajectory.js +0 -1307
  384. package/dist/core/workspace-context.d.ts +0 -71
  385. package/dist/hooks/bash-risk.d.ts +0 -57
  386. package/dist/hooks/bash-risk.js +0 -137
  387. package/dist/hooks/edit-verification.d.ts +0 -62
  388. package/dist/hooks/edit-verification.js +0 -256
  389. package/dist/hooks/gate-block-helper.d.ts +0 -44
  390. package/dist/hooks/gate-block-helper.js +0 -119
  391. package/dist/hooks/gate.d.ts +0 -24
  392. package/dist/hooks/gate.js +0 -173
  393. package/dist/hooks/gfi-gate.d.ts +0 -40
  394. package/dist/hooks/gfi-gate.js +0 -113
  395. package/dist/hooks/lifecycle.d.ts +0 -5
  396. package/dist/hooks/lifecycle.js +0 -284
  397. package/dist/hooks/llm.d.ts +0 -13
  398. package/dist/hooks/message-sanitize.d.ts +0 -3
  399. package/dist/hooks/message-sanitize.js +0 -37
  400. package/dist/hooks/pain.d.ts +0 -5
  401. package/dist/hooks/pain.js +0 -301
  402. package/dist/hooks/progressive-trust-gate.d.ts +0 -52
  403. package/dist/hooks/progressive-trust-gate.js +0 -134
  404. package/dist/hooks/prompt.d.ts +0 -49
  405. package/dist/hooks/prompt.js +0 -905
  406. package/dist/hooks/subagent.d.ts +0 -10
  407. package/dist/hooks/subagent.js +0 -387
  408. package/dist/hooks/thinking-checkpoint.d.ts +0 -37
  409. package/dist/hooks/thinking-checkpoint.js +0 -51
  410. package/dist/hooks/trajectory-collector.d.ts +0 -32
  411. package/dist/hooks/trajectory-collector.js +0 -256
  412. package/dist/http/principles-console-route.d.ts +0 -9
  413. package/dist/http/principles-console-route.js +0 -681
  414. package/dist/i18n/commands.d.ts +0 -26
  415. package/dist/i18n/commands.js +0 -116
  416. package/dist/index.d.ts +0 -7
  417. package/dist/index.js +0 -581
  418. package/dist/service/central-database.d.ts +0 -104
  419. package/dist/service/central-database.js +0 -649
  420. package/dist/service/control-ui-query-service.d.ts +0 -221
  421. package/dist/service/control-ui-query-service.js +0 -543
  422. package/dist/service/empathy-observer-manager.d.ts +0 -88
  423. package/dist/service/empathy-observer-manager.js +0 -414
  424. package/dist/service/evolution-query-service.d.ts +0 -155
  425. package/dist/service/evolution-query-service.js +0 -258
  426. package/dist/service/evolution-worker.d.ts +0 -101
  427. package/dist/service/evolution-worker.js +0 -975
  428. package/dist/service/health-query-service.d.ts +0 -170
  429. package/dist/service/health-query-service.js +0 -662
  430. package/dist/service/nocturnal-runtime.d.ts +0 -183
  431. package/dist/service/nocturnal-service.d.ts +0 -163
  432. package/dist/service/nocturnal-service.js +0 -787
  433. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  434. package/dist/service/nocturnal-target-selector.js +0 -315
  435. package/dist/service/phase3-input-filter.d.ts +0 -73
  436. package/dist/service/phase3-input-filter.js +0 -172
  437. package/dist/service/runtime-summary-service.d.ts +0 -122
  438. package/dist/service/runtime-summary-service.js +0 -485
  439. package/dist/service/subagent-workflow/empathy-observer-workflow-manager.d.ts +0 -48
  440. package/dist/service/subagent-workflow/index.d.ts +0 -4
  441. package/dist/service/subagent-workflow/index.js +0 -3
  442. package/dist/service/subagent-workflow/runtime-direct-driver.d.ts +0 -77
  443. package/dist/service/subagent-workflow/runtime-direct-driver.js +0 -75
  444. package/dist/service/subagent-workflow/types.js +0 -11
  445. package/dist/service/subagent-workflow/workflow-store.d.ts +0 -26
  446. package/dist/service/subagent-workflow/workflow-store.js +0 -165
  447. package/dist/service/trajectory-service.d.ts +0 -2
  448. package/dist/service/trajectory-service.js +0 -15
  449. package/dist/tools/critique-prompt.d.ts +0 -14
  450. package/dist/tools/deep-reflect.d.ts +0 -39
  451. package/dist/tools/deep-reflect.js +0 -350
  452. package/dist/tools/model-index.d.ts +0 -9
  453. package/dist/types/event-types.d.ts +0 -306
  454. package/dist/types/event-types.js +0 -106
  455. package/dist/types/hygiene-types.d.ts +0 -20
  456. package/dist/types/hygiene-types.js +0 -12
  457. package/dist/types/runtime-summary.d.ts +0 -47
  458. package/dist/types/runtime-summary.js +0 -1
  459. package/dist/types.d.ts +0 -50
  460. package/dist/types.js +0 -22
  461. package/dist/utils/file-lock.d.ts +0 -71
  462. package/dist/utils/file-lock.js +0 -309
  463. package/dist/utils/glob-match.d.ts +0 -28
  464. package/dist/utils/hashing.d.ts +0 -9
  465. package/dist/utils/io.d.ts +0 -6
  466. package/dist/utils/io.js +0 -106
  467. package/dist/utils/nlp.d.ts +0 -9
  468. package/dist/utils/plugin-logger.d.ts +0 -39
  469. package/dist/utils/subagent-probe.d.ts +0 -34
  470. package/dist/utils/subagent-probe.js +0 -81
@@ -1,662 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { readPainFlagData } from '../core/pain.js';
4
- import { resolvePdPath } from '../core/paths.js';
5
- import { listSessions } from '../core/session-tracker.js';
6
- import { listDeployments } from '../core/model-deployment-registry.js';
7
- import { ControlUiDatabase } from '../core/control-ui-db.js';
8
- import { WorkspaceContext } from '../core/workspace-context.js';
9
- export class HealthQueryService {
10
- workspaceDir;
11
- stateDir;
12
- trajectory;
13
- config;
14
- eventLog;
15
- evolutionReducer;
16
- uiDb;
17
- tableColumnCache = new Map();
18
- constructor(workspaceDir) {
19
- this.workspaceDir = workspaceDir;
20
- const wctx = WorkspaceContext.fromHookContext({ workspaceDir });
21
- this.stateDir = wctx.stateDir;
22
- this.trajectory = wctx.trajectory;
23
- this.config = wctx.config;
24
- this.eventLog = wctx.eventLog;
25
- this.evolutionReducer = wctx.evolutionReducer;
26
- this.uiDb = new ControlUiDatabase({ workspaceDir });
27
- }
28
- dispose() {
29
- this.uiDb.dispose();
30
- }
31
- getOverviewHealth() {
32
- const session = this.getCurrentSession();
33
- const threshold = this.getGfiThreshold();
34
- const trust = this.readTrust();
35
- const evolution = this.readEvolutionScore();
36
- const reducerStats = this.evolutionReducer.getStats();
37
- const queue = this.readQueueStats();
38
- const painFlag = this.readPainFlag();
39
- const currentGfi = this.asNumber(session?.currentGfi, 0);
40
- const peakToday = this.asNumber(session?.dailyGfiPeak, currentGfi);
41
- return {
42
- gfi: {
43
- current: currentGfi,
44
- peakToday,
45
- threshold,
46
- },
47
- trust,
48
- evolution,
49
- painFlag,
50
- principles: {
51
- candidate: reducerStats.candidateCount,
52
- probation: reducerStats.probationCount,
53
- active: reducerStats.activeCount,
54
- deprecated: reducerStats.deprecatedCount,
55
- },
56
- queue,
57
- activeStage: this.computeHealthStage(currentGfi, threshold, painFlag.active),
58
- };
59
- }
60
- getEvolutionPrinciples() {
61
- const stats = this.evolutionReducer.getStats();
62
- const recent = this.readRecentPrincipleChanges(30);
63
- const nocturnal = this.readNocturnalTraining();
64
- const painSourceDistribution = this.readPainSourceDistribution();
65
- const activeStage = this.readEvolutionActiveStage(nocturnal.queue);
66
- return {
67
- principles: {
68
- summary: {
69
- candidate: stats.candidateCount,
70
- probation: stats.probationCount,
71
- active: stats.activeCount,
72
- deprecated: stats.deprecatedCount,
73
- },
74
- recent,
75
- },
76
- nocturnalTraining: nocturnal,
77
- painSourceDistribution,
78
- activeStage,
79
- };
80
- }
81
- getFeedbackGfi() {
82
- const session = this.getCurrentSession();
83
- const threshold = this.getGfiThreshold();
84
- const today = new Date().toISOString().slice(0, 10);
85
- const trendRows = this.uiDb.all(`
86
- SELECT substr(created_at, 1, 13) || ':00:00Z' AS hour, ROUND(SUM(score), 2) AS value
87
- FROM pain_events
88
- WHERE substr(created_at, 1, 10) = ?
89
- GROUP BY substr(created_at, 1, 13)
90
- ORDER BY hour ASC
91
- `, today);
92
- const sourceRows = this.uiDb.all(`
93
- SELECT source, COUNT(*) AS total
94
- FROM pain_events
95
- WHERE substr(created_at, 1, 10) = ?
96
- GROUP BY source
97
- ORDER BY total DESC
98
- `, today);
99
- return {
100
- current: this.asNumber(session?.currentGfi, 0),
101
- peakToday: this.asNumber(session?.dailyGfiPeak, this.asNumber(session?.currentGfi, 0)),
102
- threshold,
103
- trend: trendRows.map((row) => ({ hour: row.hour, value: this.asNumber(row.value, 0) })),
104
- sources: Object.fromEntries(sourceRows.map((row) => [row.source, this.asNumber(row.total, 0)])),
105
- };
106
- }
107
- getFeedbackEmpathyEvents(limit = 50) {
108
- const safeLimit = Math.max(1, Math.min(500, Math.floor(limit)));
109
- const events = this.readMergedEvents()
110
- .filter((entry) => entry.type === 'pain_signal' && String(entry.data?.source ?? '') === 'user_empathy')
111
- .sort((a, b) => (b.ts || '').localeCompare(a.ts || ''))
112
- .slice(0, safeLimit);
113
- return events.map((entry) => {
114
- const data = entry.data ?? {};
115
- return {
116
- timestamp: String(entry.ts ?? ''),
117
- severity: typeof data.severity === 'string' ? data.severity : 'mild',
118
- score: this.asNumber(data.score, 0),
119
- reason: typeof data.reason === 'string' ? data.reason : '',
120
- origin: typeof data.origin === 'string' ? data.origin : 'unknown',
121
- gfiAfter: this.asNumber(data.gfiAfter ?? data.gfi_after ?? data.gfi, 0),
122
- };
123
- });
124
- }
125
- getFeedbackGateBlocks(limit = 50) {
126
- const trust = this.readTrust();
127
- const rows = this.readGateBlocksRaw(limit);
128
- return rows.map((row) => ({
129
- timestamp: row.created_at,
130
- toolName: row.tool_name,
131
- reason: row.reason,
132
- gfi: this.resolveGateBlockGfi(row),
133
- trustStage: this.resolveGateBlockTrustStage(row, trust.stage),
134
- }));
135
- }
136
- getGateStats() {
137
- const today = new Date().toISOString().slice(0, 10);
138
- const rows = this.uiDb.all(`
139
- SELECT reason
140
- FROM gate_blocks
141
- WHERE substr(created_at, 1, 10) = ?
142
- `, today);
143
- let gfiBlocks = 0;
144
- let stageBlocks = 0;
145
- let p03Blocks = 0;
146
- let bypassAttempts = 0;
147
- let p16Exemptions = 0;
148
- for (const row of rows) {
149
- const reason = String(row.reason || '').toLowerCase();
150
- if (reason.includes('gfi'))
151
- gfiBlocks++;
152
- if (reason.includes('tier') || reason.includes('stage') || reason.includes('trust'))
153
- stageBlocks++;
154
- if (reason.includes('p-03') || reason.includes('edit verification') || reason.includes('oldtext'))
155
- p03Blocks++;
156
- if (reason.includes('bypass'))
157
- bypassAttempts++;
158
- if (reason.includes('p-16') || reason.includes('exemption'))
159
- p16Exemptions++;
160
- }
161
- const trust = this.readTrust();
162
- const evolution = this.readEvolutionScore();
163
- return {
164
- today: {
165
- gfiBlocks,
166
- stageBlocks,
167
- p03Blocks,
168
- bypassAttempts,
169
- p16Exemptions,
170
- },
171
- trust: {
172
- stage: trust.stage,
173
- score: trust.score,
174
- status: this.scoreToStatus(trust.score),
175
- },
176
- evolution: {
177
- tier: evolution.tier,
178
- points: evolution.points,
179
- status: this.evolutionToStatus(evolution.tier, evolution.points),
180
- },
181
- };
182
- }
183
- getGateBlocks(limit = 50) {
184
- const trust = this.readTrust();
185
- const rows = this.readGateBlocksRaw(limit);
186
- return rows.map((row) => ({
187
- timestamp: row.created_at,
188
- toolName: row.tool_name,
189
- filePath: row.file_path ?? null,
190
- reason: row.reason,
191
- gateType: this.resolveGateType(row),
192
- gfi: this.resolveGateBlockGfi(row),
193
- trustStage: this.resolveGateBlockTrustStage(row, trust.stage),
194
- }));
195
- }
196
- readTrust() {
197
- const scorecardPath = resolvePdPath(this.workspaceDir, 'AGENT_SCORECARD');
198
- const scorecard = this.readJsonFile(scorecardPath, {});
199
- const score = this.asNumber(scorecard.trustScore ?? scorecard.trust_score ?? scorecard.score, 0);
200
- const rawStage = this.asNumber(scorecard.trustStage ?? scorecard.trust_stage ?? scorecard.stage, this.inferTrustStageFromScore(score));
201
- const stage = Math.max(1, Math.min(4, Math.round(rawStage)));
202
- return {
203
- stage,
204
- stageLabel: this.getTrustStageLabel(stage),
205
- score,
206
- };
207
- }
208
- readEvolutionScore() {
209
- const scorecardPath = path.join(this.stateDir, 'evolution-scorecard.json');
210
- const scorecard = this.readJsonFile(scorecardPath, {});
211
- const points = this.asNumber(scorecard.totalPoints ?? scorecard.total_points, 0);
212
- const tierRaw = scorecard.currentTier ?? scorecard.current_tier ?? 1;
213
- return {
214
- tier: this.normalizeTierName(tierRaw),
215
- points,
216
- };
217
- }
218
- readQueueStats() {
219
- const queuePath = resolvePdPath(this.workspaceDir, 'EVOLUTION_QUEUE');
220
- const queue = this.readJsonFile(queuePath, []);
221
- const stats = { pending: 0, inProgress: 0, completed: 0 };
222
- for (const item of queue) {
223
- const status = String(item?.status ?? 'pending');
224
- if (status === 'completed')
225
- stats.completed++;
226
- else if (status === 'in_progress')
227
- stats.inProgress++;
228
- else
229
- stats.pending++;
230
- }
231
- return stats;
232
- }
233
- readPainFlag() {
234
- const painFlagPath = resolvePdPath(this.workspaceDir, 'PAIN_FLAG');
235
- if (!fs.existsSync(painFlagPath)) {
236
- return { active: false, source: null, score: null };
237
- }
238
- const data = readPainFlagData(this.workspaceDir);
239
- return {
240
- active: true,
241
- source: typeof data.source === 'string' ? data.source : null,
242
- score: this.asNullableNumber(data.score),
243
- };
244
- }
245
- getCurrentSession() {
246
- const sessions = listSessions(this.workspaceDir);
247
- if (sessions.length === 0)
248
- return null;
249
- const sorted = [...sessions].sort((a, b) => {
250
- const aTs = Number(a.lastControlActivityAt ?? a.lastActivityAt ?? 0);
251
- const bTs = Number(b.lastControlActivityAt ?? b.lastActivityAt ?? 0);
252
- return bTs - aTs;
253
- });
254
- return sorted[0] ?? null;
255
- }
256
- getGfiThreshold() {
257
- const fromConfig = this.asNullableNumber(this.config.get('gfi_gate.thresholds.low_risk_block'));
258
- if (fromConfig !== null)
259
- return fromConfig;
260
- const fallbackPath = resolvePdPath(this.workspaceDir, 'PAIN_SETTINGS');
261
- const raw = this.readJsonFile(fallbackPath, {});
262
- const fallback = this.asNullableNumber((raw.gfi_gate?.thresholds?.low_risk_block));
263
- return fallback ?? 70;
264
- }
265
- computeHealthStage(currentGfi, threshold, painFlagActive) {
266
- if (painFlagActive || currentGfi >= threshold) {
267
- return 'critical';
268
- }
269
- if (currentGfi >= threshold * 0.7) {
270
- return 'warning';
271
- }
272
- return 'healthy';
273
- }
274
- getTrustStageLabel(stage) {
275
- switch (stage) {
276
- case 1:
277
- return 'Observer';
278
- case 2:
279
- return 'Editor';
280
- case 3:
281
- return 'Developer';
282
- case 4:
283
- return 'Architect';
284
- default:
285
- return 'Observer';
286
- }
287
- }
288
- inferTrustStageFromScore(score) {
289
- if (score >= 80)
290
- return 4;
291
- if (score >= 60)
292
- return 3;
293
- if (score >= 30)
294
- return 2;
295
- return 1;
296
- }
297
- normalizeTierName(rawTier) {
298
- if (typeof rawTier === 'string') {
299
- const t = rawTier.trim();
300
- if (t.length > 0)
301
- return t;
302
- }
303
- const n = this.asNumber(rawTier, 1);
304
- if (n === 1)
305
- return 'Seed';
306
- if (n === 2)
307
- return 'Sprout';
308
- if (n === 3)
309
- return 'Sapling';
310
- if (n === 4)
311
- return 'Tree';
312
- if (n === 5)
313
- return 'Forest';
314
- return `Tier-${n}`;
315
- }
316
- readRecentPrincipleChanges(limit) {
317
- const streamPath = resolvePdPath(this.workspaceDir, 'EVOLUTION_STREAM');
318
- if (!fs.existsSync(streamPath))
319
- return [];
320
- let lines = [];
321
- try {
322
- const raw = fs.readFileSync(streamPath, 'utf8').trim();
323
- if (!raw)
324
- return [];
325
- lines = raw.split('\n');
326
- }
327
- catch {
328
- return [];
329
- }
330
- const records = [];
331
- for (const line of lines) {
332
- let event = null;
333
- try {
334
- event = JSON.parse(line);
335
- }
336
- catch {
337
- event = null;
338
- }
339
- if (!event?.type || !event.data)
340
- continue;
341
- const mapped = this.mapPrincipleEvent(event);
342
- if (mapped)
343
- records.push(mapped);
344
- }
345
- return records
346
- .sort((a, b) => b.timestamp.localeCompare(a.timestamp))
347
- .slice(0, Math.max(1, Math.min(200, limit)));
348
- }
349
- mapPrincipleEvent(event) {
350
- const data = event.data ?? {};
351
- const type = String(event.type);
352
- const principleId = typeof data.principleId === 'string' ? data.principleId : '';
353
- if (!principleId)
354
- return null;
355
- const principle = this.evolutionReducer.getPrincipleById(principleId);
356
- const triggerPattern = typeof data.trigger === 'string'
357
- ? data.trigger
358
- : typeof principle?.trigger === 'string'
359
- ? principle.trigger
360
- : '';
361
- const action = typeof data.action === 'string'
362
- ? data.action
363
- : typeof principle?.action === 'string'
364
- ? principle.action
365
- : '';
366
- if (type === 'candidate_created') {
367
- const toStatus = typeof data.status === 'string' ? data.status : 'candidate';
368
- return {
369
- principleId,
370
- status: toStatus,
371
- triggerPattern,
372
- action,
373
- fromStatus: 'none',
374
- toStatus,
375
- timestamp: String(event.ts ?? ''),
376
- };
377
- }
378
- if (type === 'principle_promoted') {
379
- const fromStatus = typeof data.from === 'string' ? data.from : 'candidate';
380
- const toStatus = typeof data.to === 'string' ? data.to : 'probation';
381
- return {
382
- principleId,
383
- status: toStatus,
384
- triggerPattern,
385
- action,
386
- fromStatus,
387
- toStatus,
388
- timestamp: String(event.ts ?? ''),
389
- };
390
- }
391
- if (type === 'principle_deprecated') {
392
- return {
393
- principleId,
394
- status: 'deprecated',
395
- triggerPattern,
396
- action,
397
- fromStatus: 'active',
398
- toStatus: 'deprecated',
399
- timestamp: String(event.ts ?? ''),
400
- };
401
- }
402
- if (type === 'principle_rolled_back') {
403
- return {
404
- principleId,
405
- status: 'deprecated',
406
- triggerPattern,
407
- action,
408
- fromStatus: 'probation',
409
- toStatus: 'deprecated',
410
- timestamp: String(event.ts ?? ''),
411
- };
412
- }
413
- return null;
414
- }
415
- readNocturnalTraining() {
416
- const sampleDir = resolvePdPath(this.workspaceDir, 'NOCTURNAL_SAMPLES_DIR');
417
- const exportDir = resolvePdPath(this.workspaceDir, 'NOCTURNAL_EXPORTS_DIR');
418
- const reviewQueuePath = path.join(this.stateDir, 'nocturnal', 'review-queue.json');
419
- const sampleFiles = this.safeListFiles(sampleDir, (name) => name.endsWith('.json') && name !== 'lineage-index.json');
420
- const samples = sampleFiles.map((filePath) => this.readJsonFile(filePath, {}));
421
- const queue = { pending: 0, inProgress: 0, completed: 0 };
422
- for (const sample of samples) {
423
- const status = String(sample.status ?? '').toLowerCase();
424
- if (status === 'in_progress' || status === 'running')
425
- queue.inProgress++;
426
- else if (status === 'pending' || status === 'pending_review')
427
- queue.pending++;
428
- else
429
- queue.completed++;
430
- }
431
- const reviewQueue = this.readJsonFile(reviewQueuePath, []);
432
- queue.pending += reviewQueue.length;
433
- const trinityRecords = samples
434
- .map((sample) => ({
435
- artifactId: String(sample.artifactId ?? ''),
436
- status: String(sample.status ?? 'unknown'),
437
- createdAt: String(sample.createdAt ?? ''),
438
- }))
439
- .filter((row) => row.artifactId.length > 0)
440
- .sort((a, b) => b.createdAt.localeCompare(a.createdAt))
441
- .slice(0, 20);
442
- let passed = 0;
443
- for (const sample of samples) {
444
- const status = String(sample.status ?? '').toLowerCase();
445
- const arbiterPassed = sample.arbiter?.passed === true;
446
- if (arbiterPassed || status === 'approved' || status === 'approved_for_training') {
447
- passed++;
448
- }
449
- }
450
- const total = samples.length;
451
- const arbiterPassRate = total > 0 ? Number((passed / total).toFixed(4)) : 0;
452
- const exportFiles = this.safeListFiles(exportDir, (name) => name.endsWith('.jsonl'));
453
- const orpoSampleCount = exportFiles.length;
454
- const deployments = listDeployments(this.stateDir).map((deployment) => ({
455
- modelId: deployment.workerProfile,
456
- status: deployment.routingEnabled ? 'active' : 'inactive',
457
- checkpointPath: deployment.activeCheckpointId,
458
- }));
459
- return {
460
- queue,
461
- trinityRecords,
462
- arbiterPassRate,
463
- orpoSampleCount,
464
- deployments,
465
- };
466
- }
467
- readPainSourceDistribution() {
468
- const rows = this.uiDb.all(`
469
- SELECT source, COUNT(*) AS total
470
- FROM pain_events
471
- GROUP BY source
472
- ORDER BY total DESC
473
- `);
474
- return Object.fromEntries(rows.map((row) => [row.source, this.asNumber(row.total, 0)]));
475
- }
476
- readEvolutionActiveStage(queue) {
477
- const events = this.trajectory.listEvolutionEvents(undefined, { limit: 1, offset: 0 });
478
- if (events.length > 0) {
479
- return events[0].stage;
480
- }
481
- if (queue.inProgress > 0)
482
- return 'in_progress';
483
- if (queue.pending > 0)
484
- return 'pending';
485
- if (queue.completed > 0)
486
- return 'completed';
487
- return 'idle';
488
- }
489
- readMergedEvents() {
490
- const persistedEvents = this.readPersistedEvents();
491
- const bufferedEvents = this.getBufferedEvents();
492
- const merged = new Map();
493
- for (const entry of [...persistedEvents, ...bufferedEvents]) {
494
- merged.set(this.getEventDedupKey(entry), entry);
495
- }
496
- return [...merged.values()].sort((a, b) => (a.ts || '').localeCompare(b.ts || ''));
497
- }
498
- readPersistedEvents() {
499
- const eventsPath = path.join(this.stateDir, 'logs', 'events.jsonl');
500
- if (!fs.existsSync(eventsPath))
501
- return [];
502
- try {
503
- const raw = fs.readFileSync(eventsPath, 'utf8').trim();
504
- if (!raw)
505
- return [];
506
- return raw
507
- .split('\n')
508
- .map((line) => {
509
- try {
510
- return JSON.parse(line);
511
- }
512
- catch {
513
- return null;
514
- }
515
- })
516
- .filter((entry) => entry !== null);
517
- }
518
- catch {
519
- return [];
520
- }
521
- }
522
- getBufferedEvents() {
523
- const candidate = this.eventLog;
524
- if (typeof candidate.getBufferedEvents === 'function') {
525
- return candidate.getBufferedEvents();
526
- }
527
- return [];
528
- }
529
- getEventDedupKey(entry) {
530
- const eventId = typeof entry.data?.eventId === 'string' ? entry.data.eventId : null;
531
- if (eventId) {
532
- return `${entry.type}:${entry.sessionId ?? 'none'}:${eventId}`;
533
- }
534
- return [
535
- entry.ts ?? 'no-ts',
536
- entry.type ?? 'no-type',
537
- entry.category ?? 'no-category',
538
- entry.sessionId ?? 'no-session',
539
- typeof entry.data?.source === 'string' ? entry.data.source : 'no-source',
540
- typeof entry.data?.toolName === 'string' ? entry.data.toolName : 'no-tool',
541
- typeof entry.data?.reason === 'string' ? entry.data.reason : 'no-reason',
542
- ].join('::');
543
- }
544
- readGateBlocksRaw(limit) {
545
- const safeLimit = Math.max(1, Math.min(1000, Math.floor(limit)));
546
- const hasGfi = this.hasTableColumn('gate_blocks', 'gfi');
547
- const hasGfiAfter = this.hasTableColumn('gate_blocks', 'gfi_after');
548
- const hasTrustStage = this.hasTableColumn('gate_blocks', 'trust_stage');
549
- const hasGateType = this.hasTableColumn('gate_blocks', 'gate_type');
550
- const sql = `
551
- SELECT
552
- created_at,
553
- tool_name,
554
- file_path,
555
- reason,
556
- ${hasGfi ? 'gfi' : 'NULL'} AS gfi,
557
- ${hasGfiAfter ? 'gfi_after' : 'NULL'} AS gfi_after,
558
- ${hasTrustStage ? 'trust_stage' : 'NULL'} AS trust_stage,
559
- ${hasGateType ? 'gate_type' : 'NULL'} AS gate_type
560
- FROM gate_blocks
561
- ORDER BY created_at DESC
562
- LIMIT ?
563
- `;
564
- return this.uiDb.all(sql, safeLimit);
565
- }
566
- resolveGateBlockGfi(row) {
567
- const direct = this.asNullableNumber(row.gfi ?? row.gfi_after);
568
- if (direct !== null)
569
- return direct;
570
- const reason = String(row.reason ?? '');
571
- const match = reason.match(/gfi\s*[:=]\s*(-?\d+(?:\.\d+)?)/i);
572
- if (match) {
573
- return this.asNumber(Number(match[1]), 0);
574
- }
575
- const session = this.getCurrentSession();
576
- return this.asNumber(session?.currentGfi, 0);
577
- }
578
- resolveGateBlockTrustStage(row, fallbackStage) {
579
- const direct = this.asNullableNumber(row.trust_stage);
580
- if (direct !== null)
581
- return Math.max(1, Math.min(4, Math.round(direct)));
582
- const reason = String(row.reason ?? '').toLowerCase();
583
- const match = reason.match(/stage\s*(\d+)/i);
584
- if (match) {
585
- return Math.max(1, Math.min(4, Math.round(this.asNumber(Number(match[1]), fallbackStage))));
586
- }
587
- return fallbackStage;
588
- }
589
- resolveGateType(row) {
590
- if (typeof row.gate_type === 'string' && row.gate_type.trim().length > 0) {
591
- return row.gate_type;
592
- }
593
- const reason = String(row.reason ?? '').toLowerCase();
594
- if (reason.includes('gfi'))
595
- return 'gfi';
596
- if (reason.includes('tier') || reason.includes('stage') || reason.includes('trust'))
597
- return 'stage';
598
- if (reason.includes('p-03') || reason.includes('edit verification') || reason.includes('oldtext'))
599
- return 'p03';
600
- if (reason.includes('p-16') || reason.includes('exemption'))
601
- return 'p16';
602
- return 'general';
603
- }
604
- hasTableColumn(tableName, columnName) {
605
- let cached = this.tableColumnCache.get(tableName);
606
- if (!cached) {
607
- const rows = this.uiDb.all(`PRAGMA table_info(${tableName})`);
608
- cached = new Set(rows.map((row) => row.name));
609
- this.tableColumnCache.set(tableName, cached);
610
- }
611
- return cached.has(columnName);
612
- }
613
- scoreToStatus(score) {
614
- if (score >= 70)
615
- return 'healthy';
616
- if (score >= 40)
617
- return 'warning';
618
- return 'critical';
619
- }
620
- evolutionToStatus(tier, points) {
621
- const lower = tier.toLowerCase();
622
- if (lower === 'forest' || lower === 'tree')
623
- return 'healthy';
624
- if (lower === 'sapling' || points >= 200)
625
- return 'warning';
626
- return 'critical';
627
- }
628
- safeListFiles(dirPath, predicate) {
629
- if (!fs.existsSync(dirPath))
630
- return [];
631
- try {
632
- return fs.readdirSync(dirPath)
633
- .filter((name) => predicate(name))
634
- .map((name) => path.join(dirPath, name));
635
- }
636
- catch {
637
- return [];
638
- }
639
- }
640
- readJsonFile(filePath, fallback) {
641
- if (!fs.existsSync(filePath))
642
- return fallback;
643
- try {
644
- return JSON.parse(fs.readFileSync(filePath, 'utf8'));
645
- }
646
- catch {
647
- return fallback;
648
- }
649
- }
650
- asNumber(value, fallback) {
651
- return Number.isFinite(value) ? Number(value) : fallback;
652
- }
653
- asNullableNumber(value) {
654
- if (Number.isFinite(value))
655
- return Number(value);
656
- if (typeof value === 'string' && value.trim().length > 0) {
657
- const n = Number(value);
658
- return Number.isFinite(n) ? n : null;
659
- }
660
- return null;
661
- }
662
- }