principles-disciple 1.8.0 → 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 (460) 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 +6 -1
  10. package/package.json +13 -15
  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} +185 -63
  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} +166 -139
  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} +263 -36
  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/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +603 -0
  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/src/service/subagent-workflow/types.ts +378 -0
  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 -127
  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 -99
  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 -12
  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 -51
  403. package/dist/hooks/progressive-trust-gate.js +0 -89
  404. package/dist/hooks/prompt.d.ts +0 -47
  405. package/dist/hooks/prompt.js +0 -884
  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 -567
  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 -52
  423. package/dist/service/empathy-observer-manager.js +0 -229
  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 -974
  428. package/dist/service/nocturnal-runtime.d.ts +0 -183
  429. package/dist/service/nocturnal-service.d.ts +0 -163
  430. package/dist/service/nocturnal-service.js +0 -787
  431. package/dist/service/nocturnal-target-selector.d.ts +0 -145
  432. package/dist/service/nocturnal-target-selector.js +0 -315
  433. package/dist/service/phase3-input-filter.d.ts +0 -73
  434. package/dist/service/phase3-input-filter.js +0 -172
  435. package/dist/service/runtime-summary-service.d.ts +0 -122
  436. package/dist/service/runtime-summary-service.js +0 -485
  437. package/dist/service/trajectory-service.d.ts +0 -2
  438. package/dist/service/trajectory-service.js +0 -15
  439. package/dist/tools/critique-prompt.d.ts +0 -14
  440. package/dist/tools/deep-reflect.d.ts +0 -39
  441. package/dist/tools/deep-reflect.js +0 -350
  442. package/dist/tools/model-index.d.ts +0 -9
  443. package/dist/types/event-types.d.ts +0 -306
  444. package/dist/types/event-types.js +0 -106
  445. package/dist/types/hygiene-types.d.ts +0 -20
  446. package/dist/types/hygiene-types.js +0 -12
  447. package/dist/types/runtime-summary.d.ts +0 -47
  448. package/dist/types/runtime-summary.js +0 -1
  449. package/dist/types.d.ts +0 -50
  450. package/dist/types.js +0 -22
  451. package/dist/utils/file-lock.d.ts +0 -71
  452. package/dist/utils/file-lock.js +0 -309
  453. package/dist/utils/glob-match.d.ts +0 -28
  454. package/dist/utils/hashing.d.ts +0 -9
  455. package/dist/utils/io.d.ts +0 -6
  456. package/dist/utils/io.js +0 -106
  457. package/dist/utils/nlp.d.ts +0 -9
  458. package/dist/utils/plugin-logger.d.ts +0 -39
  459. package/dist/utils/subagent-probe.d.ts +0 -34
  460. package/dist/utils/subagent-probe.js +0 -81
@@ -0,0 +1,484 @@
1
+ /**
2
+ * Nocturnal Trajectory Extractor — Structured Session Snapshot API
3
+ * ==============================================================
4
+ *
5
+ * PURPOSE: Provide minimal necessary structured trajectory extraction
6
+ * for the nocturnal reflection pipeline. NOT a general-purpose data mirror.
7
+ *
8
+ * DESIGN PRINCIPLES:
9
+ * - Uses sanitized text ONLY — never raw_text or blob payloads
10
+ * - Two distinct query paths:
11
+ * 1. Analytics query (listRecentNocturnalCandidateSessions) — for target selection
12
+ * 2. Runtime query (getNocturnalSessionSnapshot) — for sample generation
13
+ * - All snapshots are self-contained and principle-relevant metadata-rich
14
+ *
15
+ * WHAT THIS MODULE DOES:
16
+ * - List recent sessions with metadata relevant to nocturnal target selection
17
+ * - Extract structured session snapshots for a selected violating session
18
+ *
19
+ * WHAT THIS MODULE DOES NOT DO:
20
+ * - NO snapshot database cloning
21
+ * - NO full trajectory export
22
+ * - NO raw text exposure
23
+ * - NO target selection logic
24
+ * - NO sample generation
25
+ *
26
+ * ARTIFACT OUTPUTS go to:
27
+ * .state/nocturnal/samples/ ← structured JSON artifacts
28
+ *
29
+ * FILE: {stateDir}/nocturnal/snapshots/ (cached snapshots if needed, optional)
30
+ */
31
+
32
+ import { TrajectoryDatabase, TrajectoryRegistry } from './trajectory.js';
33
+ import { detectThinkingModelMatches, listThinkingModels } from './thinking-models.js';
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Types
37
+ // ---------------------------------------------------------------------------
38
+
39
+ /**
40
+ * Minimal sanitized assistant turn for nocturnal snapshot.
41
+ * Contains ONLY sanitizedText — raw_text is never exposed.
42
+ */
43
+ export interface NocturnalAssistantTurn {
44
+ turnIndex: number;
45
+ sanitizedText: string;
46
+ model: string;
47
+ createdAt: string;
48
+ }
49
+
50
+ /**
51
+ * Minimal sanitized user turn for nocturnal snapshot.
52
+ * Contains only derived cues — NO raw user text.
53
+ */
54
+ export interface NocturnalUserTurn {
55
+ turnIndex: number;
56
+ correctionDetected: boolean;
57
+ correctionCue: string | null;
58
+ createdAt: string;
59
+ }
60
+
61
+ /**
62
+ * Tool call event for nocturnal snapshot.
63
+ */
64
+ export interface NocturnalToolCall {
65
+ toolName: string;
66
+ outcome: 'success' | 'failure' | 'blocked';
67
+ filePath: string | null;
68
+ durationMs: number | null;
69
+ exitCode: number | null;
70
+ errorType: string | null;
71
+ errorMessage: string | null;
72
+ createdAt: string;
73
+ }
74
+
75
+ /**
76
+ * Pain signal for nocturnal snapshot.
77
+ */
78
+ export interface NocturnalPainEvent {
79
+ source: string;
80
+ score: number;
81
+ severity: string | null;
82
+ reason: string | null;
83
+ createdAt: string;
84
+ }
85
+
86
+ /**
87
+ * Gate block event for nocturnal snapshot.
88
+ */
89
+ export interface NocturnalGateBlock {
90
+ toolName: string;
91
+ filePath: string | null;
92
+ reason: string;
93
+ planStatus: string | null;
94
+ createdAt: string;
95
+ }
96
+
97
+ /**
98
+ * A structured nocturnal session snapshot.
99
+ * Contains all information needed for a reflector to generate decision-point samples.
100
+ *
101
+ * GUARANTEES:
102
+ * - NO raw_text exposed
103
+ * - NO blob references resolved
104
+ * - All text is sanitized or derived-cue only
105
+ * - Self-contained (principle-relevant metadata included)
106
+ */
107
+ export interface NocturnalSessionSnapshot {
108
+ sessionId: string;
109
+ startedAt: string;
110
+ updatedAt: string;
111
+ assistantTurns: NocturnalAssistantTurn[];
112
+ userTurns: NocturnalUserTurn[];
113
+ toolCalls: NocturnalToolCall[];
114
+ painEvents: NocturnalPainEvent[];
115
+ gateBlocks: NocturnalGateBlock[];
116
+ /**
117
+ * Summary statistics for quick triage.
118
+ */
119
+ stats: {
120
+ totalAssistantTurns: number;
121
+ totalToolCalls: number;
122
+ totalPainEvents: number;
123
+ totalGateBlocks: number;
124
+ failureCount: number;
125
+ };
126
+ }
127
+
128
+ /**
129
+ * Summary entry for session listing (used by nocturnal target selector).
130
+ * Lightweight — only identification and basic metadata, no turns.
131
+ */
132
+ export interface NocturnalSessionSummary {
133
+ sessionId: string;
134
+ startedAt: string;
135
+ updatedAt: string;
136
+ /** Number of assistant turns (for relevance scoring) */
137
+ assistantTurnCount: number;
138
+ /** Number of tool calls (for violation signal density) */
139
+ toolCallCount: number;
140
+ /** Number of pain events (for pain signal density) */
141
+ painEventCount: number;
142
+ /** Number of gate blocks (for constraint violation evidence) */
143
+ gateBlockCount: number;
144
+ /** Number of failed tool calls (for violation signal) */
145
+ failureCount: number;
146
+ }
147
+
148
+ /**
149
+ * Options for listing recent nocturnal candidate sessions.
150
+ */
151
+ export interface ListNocturnalSessionsOptions {
152
+ /** Maximum number of sessions to return (default: 20) */
153
+ limit?: number;
154
+ /** Only return sessions updated after this date */
155
+ dateFrom?: string;
156
+ /** Only return sessions updated before this date */
157
+ dateTo?: string;
158
+ /** Minimum tool call count threshold (default: 1) */
159
+ minToolCalls?: number;
160
+ }
161
+
162
+ // ---------------------------------------------------------------------------
163
+ // Core Extractor
164
+ // ---------------------------------------------------------------------------
165
+
166
+ /**
167
+ * Nocturnal Trajectory Extractor.
168
+ *
169
+ * Provides sanitized, structured access to session data for the nocturnal
170
+ * reflection pipeline. All queries return sanitized text only.
171
+ *
172
+ * This class is a thin, focused wrapper around TrajectoryDatabase.
173
+ * It does NOT cache snapshots or maintain its own state.
174
+ */
175
+ export class NocturnalTrajectoryExtractor {
176
+ private readonly trajectory: TrajectoryDatabase;
177
+
178
+ constructor(trajectory: TrajectoryDatabase) {
179
+ this.trajectory = trajectory;
180
+ }
181
+
182
+ /**
183
+ * List recent sessions suitable for nocturnal target selection.
184
+ *
185
+ * ANALYTICS QUERY — used by nocturnal target selector to find candidate sessions.
186
+ *
187
+ * @param options - Query options
188
+ * @returns Lightweight session summaries ordered by most recently updated
189
+ */
190
+ listRecentNocturnalCandidateSessions(
191
+ options: ListNocturnalSessionsOptions = {}
192
+ ): NocturnalSessionSummary[] {
193
+ const limit = options.limit ?? 20;
194
+ const minToolCalls = options.minToolCalls ?? 1;
195
+
196
+ // Get recent sessions from trajectory DB
197
+ const sessions = this.trajectory.listRecentSessions({
198
+ limit: limit * 3, // Over-fetch to allow filtering
199
+ dateFrom: options.dateFrom,
200
+ dateTo: options.dateTo,
201
+ });
202
+
203
+ if (sessions.length === 0) {
204
+ return [];
205
+ }
206
+
207
+ // For each session, get counts
208
+ // We batch these by fetching tool_calls count per session
209
+ const summaries: NocturnalSessionSummary[] = [];
210
+
211
+ for (const session of sessions) {
212
+ if (summaries.length >= limit) break;
213
+
214
+ const toolCalls = this.trajectory.listToolCallsForSession(session.sessionId);
215
+ const painEvents = this.trajectory.listPainEventsForSession(session.sessionId);
216
+ const gateBlocks = this.trajectory.listGateBlocksForSession(session.sessionId);
217
+
218
+ // Filter by minimum tool calls threshold
219
+ if (toolCalls.length < minToolCalls) {
220
+ continue;
221
+ }
222
+
223
+ const failureCount = toolCalls.filter((tc) => tc.outcome === 'failure').length;
224
+
225
+ summaries.push({
226
+ sessionId: session.sessionId,
227
+ startedAt: session.startedAt,
228
+ updatedAt: session.updatedAt,
229
+ assistantTurnCount: 0, // Not readily available without extra query
230
+ toolCallCount: toolCalls.length,
231
+ painEventCount: painEvents.length,
232
+ gateBlockCount: gateBlocks.length,
233
+ failureCount,
234
+ });
235
+ }
236
+
237
+ return summaries;
238
+ }
239
+
240
+ /**
241
+ * Get a full structured snapshot for a specific session.
242
+ *
243
+ * RUNTIME QUERY — used by nocturnal service after target selection.
244
+ *
245
+ * SECURITY GUARANTEES:
246
+ * - Only sanitizedText from assistant turns (never raw_text)
247
+ * - Only correction cues from user turns (never raw user text)
248
+ * - Tool calls with outcome and error info (no raw parameters)
249
+ * - Pain events with score and reason (no raw event data)
250
+ * - Gate blocks with tool/reason info (no file content)
251
+ *
252
+ * @param sessionId - Session ID to snapshot
253
+ * @returns Full structured snapshot, or null if session not found
254
+ */
255
+ getNocturnalSessionSnapshot(sessionId: string): NocturnalSessionSnapshot | null {
256
+ // Verify session exists — must use a large enough limit to cover all candidates,
257
+ // not just the single most-recent session (which would cause false negatives when
258
+ // the selector targets an older session).
259
+ const sessions = this.trajectory.listRecentSessions({ limit: 1000 });
260
+ const sessionExists = sessions.some((s) => s.sessionId === sessionId);
261
+ if (!sessionExists) {
262
+ // Session might not be in trajectory DB — try to get basic info
263
+ // If no data at all, return null for fail-safe
264
+ return null;
265
+ }
266
+
267
+ // Fetch all turn data
268
+ const assistantTurns = this.trajectory.listAssistantTurns(sessionId);
269
+ const userTurns = this.trajectory.listUserTurnsForSession(sessionId);
270
+ const toolCalls = this.trajectory.listToolCallsForSession(sessionId);
271
+ const painEvents = this.trajectory.listPainEventsForSession(sessionId);
272
+ const gateBlocks = this.trajectory.listGateBlocksForSession(sessionId);
273
+
274
+ // Map to sanitized structures
275
+ // SECURITY: Only sanitizedText from assistant turns
276
+ const sanitizedAssistantTurns: NocturnalAssistantTurn[] = assistantTurns.map(
277
+ (turn, index) => ({
278
+ turnIndex: index,
279
+ sanitizedText: turn.sanitizedText,
280
+ model: turn.model,
281
+ createdAt: turn.createdAt,
282
+ })
283
+ );
284
+
285
+ // SECURITY: Only derived cues from user turns
286
+ const sanitizedUserTurns: NocturnalUserTurn[] = userTurns.map((turn) => ({
287
+ turnIndex: turn.turnIndex,
288
+ correctionDetected: turn.correctionDetected,
289
+ correctionCue: turn.correctionCue,
290
+ createdAt: turn.createdAt,
291
+ }));
292
+
293
+ // Tool calls — include outcome and error info but not raw params
294
+ const nocturnalToolCalls: NocturnalToolCall[] = toolCalls.map((tc) => ({
295
+ toolName: tc.toolName,
296
+ outcome: tc.outcome as 'success' | 'failure' | 'blocked',
297
+ filePath: tc.filePath,
298
+ durationMs: tc.durationMs,
299
+ exitCode: tc.exitCode,
300
+ errorType: tc.errorType,
301
+ errorMessage: tc.errorMessage,
302
+ createdAt: tc.createdAt,
303
+ }));
304
+
305
+ // Pain events — score and reason only
306
+ const nocturnalPainEvents: NocturnalPainEvent[] = painEvents.map((pe) => ({
307
+ source: pe.source,
308
+ score: pe.score,
309
+ severity: pe.severity,
310
+ reason: pe.reason,
311
+ createdAt: pe.createdAt,
312
+ }));
313
+
314
+ // Gate blocks — tool and reason only
315
+ const nocturnalGateBlocks: NocturnalGateBlock[] = gateBlocks.map((gb) => ({
316
+ toolName: gb.toolName,
317
+ filePath: gb.filePath,
318
+ reason: gb.reason,
319
+ planStatus: gb.planStatus,
320
+ createdAt: gb.createdAt,
321
+ }));
322
+
323
+ // Compute summary stats
324
+ const failureCount = toolCalls.filter((tc) => tc.outcome === 'failure').length;
325
+
326
+ // Get session metadata (use trajectory data)
327
+ const sessionMeta = sessions.find((s) => s.sessionId === sessionId);
328
+
329
+ return {
330
+ sessionId,
331
+ startedAt: sessionMeta?.startedAt ?? new Date(0).toISOString(),
332
+ updatedAt: sessionMeta?.updatedAt ?? new Date(0).toISOString(),
333
+ assistantTurns: sanitizedAssistantTurns,
334
+ userTurns: sanitizedUserTurns,
335
+ toolCalls: nocturnalToolCalls,
336
+ painEvents: nocturnalPainEvents,
337
+ gateBlocks: nocturnalGateBlocks,
338
+ stats: {
339
+ totalAssistantTurns: sanitizedAssistantTurns.length,
340
+ totalToolCalls: nocturnalToolCalls.length,
341
+ totalPainEvents: nocturnalPainEvents.length,
342
+ totalGateBlocks: nocturnalGateBlocks.length,
343
+ failureCount,
344
+ },
345
+ };
346
+ }
347
+ }
348
+
349
+ // ---------------------------------------------------------------------------
350
+ // Factory
351
+ // ---------------------------------------------------------------------------
352
+
353
+ /**
354
+ * Creates a NocturnalTrajectoryExtractor from a workspace directory.
355
+ *
356
+ * USAGE:
357
+ * const extractor = createNocturnalTrajectoryExtractor(workspaceDir);
358
+ * const sessions = extractor.listRecentNocturnalCandidateSessions({ limit: 10 });
359
+ * const snapshot = extractor.getNocturnalSessionSnapshot(sessionId);
360
+ */
361
+ export function createNocturnalTrajectoryExtractor(
362
+ workspaceDir: string,
363
+ _stateDir?: string // Ignored; kept for API compatibility with existing call sites
364
+ ): NocturnalTrajectoryExtractor {
365
+ // Use the registry to get or create the TrajectoryDatabase instance
366
+ const trajectory = TrajectoryRegistry.get(workspaceDir);
367
+ return new NocturnalTrajectoryExtractor(trajectory);
368
+ }
369
+
370
+ // ---------------------------------------------------------------------------
371
+ // Direct module helpers (for cases where you already have TrajectoryDatabase)
372
+ // ---------------------------------------------------------------------------
373
+
374
+ /**
375
+ * List recent sessions for nocturnal target selection.
376
+ * Convenience wrapper around NocturnalTrajectoryExtractor.
377
+ */
378
+ export function listNocturnalCandidateSessions(
379
+ trajectory: TrajectoryDatabase,
380
+ options: ListNocturnalSessionsOptions = {}
381
+ ): NocturnalSessionSummary[] {
382
+ return new NocturnalTrajectoryExtractor(trajectory).listRecentNocturnalCandidateSessions(options);
383
+ }
384
+
385
+ /**
386
+ * Get a session snapshot for nocturnal reflection.
387
+ * Convenience wrapper around NocturnalTrajectoryExtractor.
388
+ */
389
+ export function getNocturnalSessionSnapshot(
390
+ trajectory: TrajectoryDatabase,
391
+ sessionId: string
392
+ ): NocturnalSessionSnapshot | null {
393
+ return new NocturnalTrajectoryExtractor(trajectory).getNocturnalSessionSnapshot(sessionId);
394
+ }
395
+
396
+ // ---------------------------------------------------------------------------
397
+ // Reflection Quality Metrics
398
+ // ---------------------------------------------------------------------------
399
+
400
+ /**
401
+ * Compute thinking model activation for a text.
402
+ * Returns 0-1 ratio of matched thinking models to total available models.
403
+ *
404
+ * @param text - Text to analyze
405
+ * @returns Activation ratio (0-1)
406
+ */
407
+ export function computeThinkingModelActivation(text: string): number {
408
+ if (!text || text.trim().length === 0) return 0;
409
+ const matches = detectThinkingModelMatches(text);
410
+ const totalModels = listThinkingModels().length;
411
+ return Math.round((matches.length / totalModels) * 100) / 100;
412
+ }
413
+
414
+ /**
415
+ * Compute planning ratio from a session snapshot.
416
+ * Planning ratio = write operations preceded immediately by a read tool / total write operations.
417
+ * A higher ratio indicates more careful planning behavior (reading before writing).
418
+ *
419
+ * Only the immediately preceding tool is checked — each write needs its own
420
+ * preceding read to count as planned. This prevents a single read from satisfying
421
+ * multiple writes in sequence.
422
+ *
423
+ * @param snapshot - Session snapshot to analyze
424
+ * @returns Planning ratio (0-1), or 0 if no write operations
425
+ */
426
+ export function computePlanningRatio(snapshot: NocturnalSessionSnapshot): number {
427
+ const toolCalls = snapshot.toolCalls;
428
+
429
+ let totalWrites = 0;
430
+ let writesWithPrecedingRead = 0;
431
+
432
+ for (let i = 0; i < toolCalls.length; i++) {
433
+ const tc = toolCalls[i];
434
+ const isWriteTool = /^(edit|write|create|delete|remove|move|rename)/i.test(tc.toolName);
435
+
436
+ if (isWriteTool) {
437
+ totalWrites++;
438
+ // Check only the immediately preceding tool
439
+ if (i > 0) {
440
+ const prevTc = toolCalls[i - 1];
441
+ const isReadTool = /^(read|grep|search|find|inspect|look)/i.test(prevTc.toolName);
442
+ if (isReadTool) {
443
+ writesWithPrecedingRead++;
444
+ }
445
+ }
446
+ }
447
+ }
448
+
449
+ if (totalWrites === 0) return 0;
450
+ return Math.round((writesWithPrecedingRead / totalWrites) * 100) / 100;
451
+ }
452
+
453
+ /**
454
+ * Compute thinking model delta between original and improved decisions.
455
+ * Positive delta means the improved decision uses more thinking models.
456
+ *
457
+ * @param originalText - Original (bad) decision text
458
+ * @param improvedText - Improved (better) decision text
459
+ * @returns Delta in thinking model activation (-1 to 1)
460
+ */
461
+ export function computeThinkingModelDelta(originalText: string, improvedText: string): number {
462
+ const originalActivation = computeThinkingModelActivation(originalText);
463
+ const improvedActivation = computeThinkingModelActivation(improvedText);
464
+ const delta = improvedActivation - originalActivation;
465
+ return Math.round(delta * 100) / 100;
466
+ }
467
+
468
+ /**
469
+ * Compute planning ratio gain between original and improved snapshots.
470
+ * Positive gain means the improved behavior has better planning (more reads before writes).
471
+ *
472
+ * @param originalSnapshot - Original session snapshot
473
+ * @param improvedSnapshot - Improved session snapshot
474
+ * @returns Planning ratio gain (-1 to 1)
475
+ */
476
+ export function computePlanningRatioGain(
477
+ originalSnapshot: NocturnalSessionSnapshot,
478
+ improvedSnapshot: NocturnalSessionSnapshot
479
+ ): number {
480
+ const originalRatio = computePlanningRatio(originalSnapshot);
481
+ const improvedRatio = computePlanningRatio(improvedSnapshot);
482
+ const gain = improvedRatio - originalRatio;
483
+ return Math.round(gain * 100) / 100;
484
+ }