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,435 @@
1
+ import Database from 'better-sqlite3';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import { withLock } from '../utils/file-lock.js';
5
+ import { resolvePdPath } from './paths.js';
6
+
7
+ /**
8
+ * Control UI database stores ANALYTICS READ MODELS.
9
+ *
10
+ * PURPOSE: Aggregated data for dashboard visualization and historical insights.
11
+ * USAGE: Control UI queries and dashboard displays.
12
+ * NOT FOR: Control decisions, Phase 3 eligibility, or real-time operations.
13
+ *
14
+ * Runtime truth comes from: queue state, workspace trust scorecard, active sessions
15
+ */
16
+
17
+ export interface ThinkingModelEventInput {
18
+ sessionId: string;
19
+ runId: string;
20
+ assistantTurnId: number;
21
+ modelId: string;
22
+ matchedPattern: string;
23
+ scenarioJson: unknown;
24
+ toolContextJson: unknown;
25
+ painContextJson: unknown;
26
+ principleContextJson: unknown;
27
+ triggerExcerpt: string;
28
+ createdAt: string;
29
+ }
30
+
31
+ export interface ControlUiDatabaseOptions {
32
+ workspaceDir: string;
33
+ busyTimeoutMs?: number;
34
+ }
35
+
36
+ export interface RecentThinkingContext {
37
+ toolCalls: Array<{
38
+ id: number;
39
+ toolName: string;
40
+ outcome: 'success' | 'failure' | 'blocked';
41
+ errorType: string | null;
42
+ errorMessage: string | null;
43
+ createdAt: string;
44
+ }>;
45
+ painEvents: Array<{
46
+ id: number;
47
+ source: string;
48
+ score: number;
49
+ reason: string | null;
50
+ createdAt: string;
51
+ }>;
52
+ gateBlocks: Array<{
53
+ id: number;
54
+ toolName: string;
55
+ reason: string;
56
+ filePath: string | null;
57
+ createdAt: string;
58
+ }>;
59
+ userCorrections: Array<{
60
+ id: number;
61
+ correctionCue: string | null;
62
+ rawExcerpt: string | null;
63
+ createdAt: string;
64
+ }>;
65
+ principleEvents: Array<{
66
+ id: number;
67
+ principleId: string | null;
68
+ eventType: string;
69
+ createdAt: string;
70
+ }>;
71
+ }
72
+
73
+ const DEFAULT_BUSY_TIMEOUT_MS = 5000;
74
+
75
+ function safeJson(value: unknown): string {
76
+ return JSON.stringify(value ?? []);
77
+ }
78
+
79
+ export class ControlUiDatabase {
80
+ private readonly workspaceDir: string;
81
+ private readonly dbPath: string;
82
+ private readonly blobDir: string;
83
+ private readonly db: Database.Database;
84
+
85
+ constructor(opts: ControlUiDatabaseOptions) {
86
+ this.workspaceDir = path.resolve(opts.workspaceDir);
87
+ this.dbPath = resolvePdPath(this.workspaceDir, 'TRAJECTORY_DB');
88
+ this.blobDir = resolvePdPath(this.workspaceDir, 'TRAJECTORY_BLOBS_DIR');
89
+
90
+ fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });
91
+ fs.mkdirSync(this.blobDir, { recursive: true });
92
+
93
+ this.db = new Database(this.dbPath);
94
+ this.db.pragma('journal_mode = WAL');
95
+ this.db.pragma('foreign_keys = ON');
96
+ this.db.pragma('synchronous = NORMAL');
97
+ this.db.pragma(`busy_timeout = ${Math.max(0, opts.busyTimeoutMs ?? DEFAULT_BUSY_TIMEOUT_MS)}`);
98
+ this.initSchema();
99
+ }
100
+
101
+ dispose(): void {
102
+ this.db.close();
103
+ }
104
+
105
+ recordThinkingModelEvent(input: ThinkingModelEventInput): number {
106
+ return this.withWrite(() => {
107
+ const result = this.db.prepare(`
108
+ INSERT INTO thinking_model_events (
109
+ session_id, run_id, assistant_turn_id, model_id, matched_pattern, scenario_json,
110
+ tool_context_json, pain_context_json, principle_context_json, trigger_excerpt, created_at
111
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
112
+ `).run(
113
+ input.sessionId,
114
+ input.runId,
115
+ input.assistantTurnId,
116
+ input.modelId,
117
+ input.matchedPattern,
118
+ safeJson(input.scenarioJson),
119
+ safeJson(input.toolContextJson),
120
+ safeJson(input.painContextJson),
121
+ safeJson(input.principleContextJson),
122
+ input.triggerExcerpt,
123
+ input.createdAt,
124
+ );
125
+ return Number(result.lastInsertRowid);
126
+ });
127
+ }
128
+
129
+ /**
130
+ * Get recent thinking context for a session.
131
+ *
132
+ * Returns: Analytics data (read model) aggregated from trajectory database.
133
+ * Not: Runtime truth or real-time queue state.
134
+ */
135
+ getRecentThinkingContext(sessionId: string, beforeCreatedAt: string, limit = 5): RecentThinkingContext {
136
+ return {
137
+ toolCalls: this.all<{
138
+ id: number;
139
+ tool_name: string;
140
+ outcome: 'success' | 'failure' | 'blocked';
141
+ error_type: string | null;
142
+ error_message: string | null;
143
+ created_at: string;
144
+ }>(
145
+ `
146
+ SELECT id, tool_name, outcome, error_type, error_message, created_at
147
+ FROM tool_calls
148
+ WHERE session_id = ? AND created_at <= ?
149
+ ORDER BY created_at DESC
150
+ LIMIT ?
151
+ `,
152
+ sessionId,
153
+ beforeCreatedAt,
154
+ limit,
155
+ ).map((row) => ({
156
+ id: Number(row.id),
157
+ toolName: String(row.tool_name),
158
+ outcome: row.outcome,
159
+ errorType: row.error_type,
160
+ errorMessage: row.error_message,
161
+ createdAt: String(row.created_at),
162
+ })),
163
+ painEvents: this.all<{
164
+ id: number;
165
+ source: string;
166
+ score: number;
167
+ reason: string | null;
168
+ created_at: string;
169
+ }>(
170
+ `
171
+ SELECT id, source, score, reason, created_at
172
+ FROM pain_events
173
+ WHERE session_id = ? AND created_at <= ?
174
+ ORDER BY created_at DESC
175
+ LIMIT ?
176
+ `,
177
+ sessionId,
178
+ beforeCreatedAt,
179
+ limit,
180
+ ).map((row) => ({
181
+ id: Number(row.id),
182
+ source: String(row.source),
183
+ score: Number(row.score),
184
+ reason: row.reason,
185
+ createdAt: String(row.created_at),
186
+ })),
187
+ gateBlocks: this.all<{
188
+ id: number;
189
+ tool_name: string;
190
+ reason: string;
191
+ file_path: string | null;
192
+ created_at: string;
193
+ }>(
194
+ `
195
+ SELECT id, tool_name, reason, file_path, created_at
196
+ FROM gate_blocks
197
+ WHERE session_id = ? AND created_at <= ?
198
+ ORDER BY created_at DESC
199
+ LIMIT ?
200
+ `,
201
+ sessionId,
202
+ beforeCreatedAt,
203
+ limit,
204
+ ).map((row) => ({
205
+ id: Number(row.id),
206
+ toolName: String(row.tool_name),
207
+ reason: String(row.reason),
208
+ filePath: row.file_path,
209
+ createdAt: String(row.created_at),
210
+ })),
211
+ userCorrections: this.all<{
212
+ id: number;
213
+ correction_cue: string | null;
214
+ raw_excerpt: string | null;
215
+ created_at: string;
216
+ }>(
217
+ `
218
+ SELECT id, correction_cue, raw_excerpt, created_at
219
+ FROM user_turns
220
+ WHERE session_id = ? AND correction_detected = 1 AND created_at <= ?
221
+ ORDER BY created_at DESC
222
+ LIMIT ?
223
+ `,
224
+ sessionId,
225
+ beforeCreatedAt,
226
+ limit,
227
+ ).map((row) => ({
228
+ id: Number(row.id),
229
+ correctionCue: row.correction_cue,
230
+ rawExcerpt: row.raw_excerpt,
231
+ createdAt: String(row.created_at),
232
+ })),
233
+ principleEvents: this.all<{
234
+ id: number;
235
+ principle_id: string | null;
236
+ event_type: string;
237
+ created_at: string;
238
+ }>(
239
+ `
240
+ SELECT id, principle_id, event_type, created_at
241
+ FROM principle_events
242
+ WHERE created_at <= ?
243
+ ORDER BY created_at DESC
244
+ LIMIT ?
245
+ `,
246
+ beforeCreatedAt,
247
+ limit,
248
+ ).map((row) => ({
249
+ id: Number(row.id),
250
+ principleId: row.principle_id,
251
+ eventType: String(row.event_type),
252
+ createdAt: String(row.created_at),
253
+ })),
254
+ };
255
+ }
256
+
257
+ /**
258
+ * Execute SQL query and return all rows.
259
+ *
260
+ * Returns: Analytics data (read model) aggregated from trajectory database.
261
+ * Not: Runtime truth or real-time queue state.
262
+ */
263
+ all<T>(sql: string, ...params: unknown[]): T[] {
264
+ return this.db.prepare(sql).all(...params) as T[];
265
+ }
266
+
267
+ /**
268
+ * Execute SQL query and return first row.
269
+ *
270
+ * Returns: Analytics data (read model) aggregated from trajectory database.
271
+ * Not: Runtime truth or real-time queue state.
272
+ */
273
+ get<T>(sql: string, ...params: unknown[]): T | undefined {
274
+ return this.db.prepare(sql).get(...params) as T | undefined;
275
+ }
276
+
277
+ restoreRawText(inlineText?: string | null, blobRef?: string | null): string {
278
+ if (inlineText) return inlineText;
279
+ if (!blobRef) return '';
280
+ const fullPath = path.join(this.blobDir, blobRef);
281
+ return fs.existsSync(fullPath) ? fs.readFileSync(fullPath, 'utf8') : '';
282
+ }
283
+
284
+ private initSchema(): void {
285
+ this.db.exec(`
286
+ CREATE TABLE IF NOT EXISTS thinking_model_events (
287
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
288
+ session_id TEXT NOT NULL,
289
+ run_id TEXT NOT NULL,
290
+ assistant_turn_id INTEGER NOT NULL,
291
+ model_id TEXT NOT NULL,
292
+ matched_pattern TEXT NOT NULL,
293
+ scenario_json TEXT NOT NULL,
294
+ tool_context_json TEXT NOT NULL,
295
+ pain_context_json TEXT NOT NULL,
296
+ principle_context_json TEXT NOT NULL,
297
+ trigger_excerpt TEXT NOT NULL,
298
+ created_at TEXT NOT NULL
299
+ );
300
+ CREATE INDEX IF NOT EXISTS idx_thinking_model_events_model_created
301
+ ON thinking_model_events(model_id, created_at);
302
+ CREATE INDEX IF NOT EXISTS idx_thinking_model_events_session_created
303
+ ON thinking_model_events(session_id, created_at);
304
+ CREATE INDEX IF NOT EXISTS idx_thinking_model_events_assistant_turn
305
+ ON thinking_model_events(assistant_turn_id);
306
+ CREATE INDEX IF NOT EXISTS idx_thinking_model_events_run_id
307
+ ON thinking_model_events(run_id);
308
+
309
+ DROP VIEW IF EXISTS v_thinking_model_usage;
310
+ CREATE VIEW v_thinking_model_usage AS
311
+ WITH totals AS (
312
+ SELECT COUNT(*) AS assistant_turns FROM assistant_turns
313
+ ),
314
+ usage_rows AS (
315
+ SELECT
316
+ model_id,
317
+ COUNT(*) AS hits,
318
+ COUNT(DISTINCT session_id) AS distinct_sessions,
319
+ COUNT(DISTINCT assistant_turn_id) AS distinct_turns
320
+ FROM thinking_model_events
321
+ GROUP BY model_id
322
+ )
323
+ SELECT
324
+ usage_rows.model_id AS model_id,
325
+ usage_rows.hits AS hits,
326
+ usage_rows.distinct_sessions AS distinct_sessions,
327
+ usage_rows.distinct_turns AS distinct_turns,
328
+ CASE
329
+ WHEN totals.assistant_turns = 0 THEN 0
330
+ ELSE ROUND(CAST(usage_rows.distinct_turns AS REAL) / CAST(totals.assistant_turns AS REAL), 4)
331
+ END AS coverage_rate
332
+ FROM usage_rows, totals
333
+ ORDER BY usage_rows.hits DESC, usage_rows.model_id ASC;
334
+
335
+ DROP VIEW IF EXISTS v_thinking_model_effectiveness;
336
+ CREATE VIEW v_thinking_model_effectiveness AS
337
+ WITH event_windows AS (
338
+ SELECT
339
+ e.id,
340
+ e.session_id,
341
+ e.model_id,
342
+ e.created_at,
343
+ (
344
+ SELECT MIN(a.created_at)
345
+ FROM assistant_turns a
346
+ WHERE a.session_id = e.session_id AND a.created_at > e.created_at
347
+ ) AS next_assistant_at,
348
+ datetime(e.created_at, '+10 minutes') AS max_window_end
349
+ FROM thinking_model_events e
350
+ ),
351
+ bounded_windows AS (
352
+ SELECT
353
+ id,
354
+ session_id,
355
+ model_id,
356
+ created_at,
357
+ CASE
358
+ WHEN next_assistant_at IS NULL THEN max_window_end
359
+ WHEN next_assistant_at < max_window_end THEN next_assistant_at
360
+ ELSE max_window_end
361
+ END AS window_end
362
+ FROM event_windows
363
+ )
364
+ SELECT
365
+ b.model_id AS model_id,
366
+ COUNT(*) AS events,
367
+ SUM(CASE WHEN EXISTS (
368
+ SELECT 1 FROM tool_calls t
369
+ WHERE t.session_id = b.session_id
370
+ AND t.created_at > b.created_at
371
+ AND t.created_at <= b.window_end
372
+ AND t.outcome = 'success'
373
+ ) THEN 1 ELSE 0 END) AS success_windows,
374
+ SUM(CASE WHEN EXISTS (
375
+ SELECT 1 FROM tool_calls t
376
+ WHERE t.session_id = b.session_id
377
+ AND t.created_at > b.created_at
378
+ AND t.created_at <= b.window_end
379
+ AND t.outcome = 'failure'
380
+ ) THEN 1 ELSE 0 END) AS failure_windows,
381
+ SUM(CASE WHEN EXISTS (
382
+ SELECT 1 FROM pain_events p
383
+ WHERE p.session_id = b.session_id
384
+ AND p.created_at > b.created_at
385
+ AND p.created_at <= b.window_end
386
+ ) THEN 1 ELSE 0 END) AS pain_windows,
387
+ SUM(CASE WHEN EXISTS (
388
+ SELECT 1 FROM user_turns u
389
+ WHERE u.session_id = b.session_id
390
+ AND u.created_at > b.created_at
391
+ AND u.created_at <= b.window_end
392
+ AND u.correction_detected = 1
393
+ ) THEN 1 ELSE 0 END) AS correction_windows,
394
+ SUM(CASE WHEN EXISTS (
395
+ SELECT 1 FROM correction_samples c
396
+ WHERE c.session_id = b.session_id
397
+ AND c.created_at > b.created_at
398
+ AND c.created_at <= b.window_end
399
+ ) THEN 1 ELSE 0 END) AS correction_sample_windows
400
+ FROM bounded_windows b
401
+ GROUP BY b.model_id
402
+ ORDER BY events DESC, model_id ASC;
403
+
404
+ DROP VIEW IF EXISTS v_thinking_model_scenarios;
405
+ CREATE VIEW v_thinking_model_scenarios AS
406
+ SELECT
407
+ e.model_id AS model_id,
408
+ CAST(j.value AS TEXT) AS scenario,
409
+ COUNT(*) AS hits
410
+ FROM thinking_model_events e
411
+ JOIN json_each(
412
+ CASE
413
+ WHEN json_valid(e.scenario_json) THEN e.scenario_json
414
+ ELSE '[]'
415
+ END
416
+ ) AS j
417
+ GROUP BY e.model_id, CAST(j.value AS TEXT)
418
+ ORDER BY hits DESC, scenario ASC;
419
+
420
+ DROP VIEW IF EXISTS v_thinking_model_daily_trend;
421
+ CREATE VIEW v_thinking_model_daily_trend AS
422
+ SELECT
423
+ substr(created_at, 1, 10) AS day,
424
+ model_id,
425
+ COUNT(*) AS hits
426
+ FROM thinking_model_events
427
+ GROUP BY substr(created_at, 1, 10), model_id
428
+ ORDER BY day ASC, model_id ASC;
429
+ `);
430
+ }
431
+
432
+ private withWrite<T>(fn: () => T): T {
433
+ return withLock(this.dbPath, fn, { lockSuffix: '.trajectory.lock', lockStaleMs: 30000 });
434
+ }
435
+ }
@@ -1,16 +1,23 @@
1
1
  import { createHash } from 'crypto';
2
- import { shouldIgnorePainProtocolText } from './dictionary.js';
2
+ import { shouldIgnorePainProtocolText, type PainDictionary } from './dictionary.js';
3
+
4
+ export interface DetectionResult {
5
+ detected: boolean;
6
+ severity?: number;
7
+ ruleId?: string;
8
+ source: 'l1_exact' | 'l2_cache' | 'l3_async_queued' | 'l3_semantic_hit';
9
+ }
10
+
3
11
  /**
4
12
  * A simple LRU Cache implementation using Map.
5
13
  */
6
- class SimpleLRU {
7
- maxSize;
8
- cache;
9
- constructor(maxSize = 100) {
10
- this.maxSize = maxSize;
14
+ class SimpleLRU<K, V> {
15
+ private cache: Map<K, V>;
16
+ constructor(private maxSize: number = 100) {
11
17
  this.cache = new Map();
12
18
  }
13
- get(key) {
19
+
20
+ get(key: K): V | undefined {
14
21
  const item = this.cache.get(key);
15
22
  if (item !== undefined) {
16
23
  // Refresh: delete and re-insert
@@ -19,11 +26,11 @@ class SimpleLRU {
19
26
  }
20
27
  return item;
21
28
  }
22
- set(key, value) {
29
+
30
+ set(key: K, value: V): void {
23
31
  if (this.cache.has(key)) {
24
32
  this.cache.delete(key);
25
- }
26
- else if (this.cache.size >= this.maxSize) {
33
+ } else if (this.cache.size >= this.maxSize) {
27
34
  // Remove the oldest (first) item
28
35
  const firstKey = this.cache.keys().next().value;
29
36
  if (firstKey !== undefined) {
@@ -33,23 +40,24 @@ class SimpleLRU {
33
40
  this.cache.set(key, value);
34
41
  }
35
42
  }
43
+
36
44
  /**
37
45
  * Orchestrates the three-layer detection funnel for pain signals.
38
46
  */
39
47
  export class DetectionFunnel {
40
- dictionary;
41
- cache = new SimpleLRU(100);
42
- asyncQueue = [];
43
- constructor(dictionary) {
44
- this.dictionary = dictionary;
45
- }
48
+ private cache = new SimpleLRU<string, { detected: boolean; severity?: number }>(100);
49
+ private asyncQueue: string[] = [];
50
+
51
+ constructor(private dictionary: PainDictionary) {}
52
+
46
53
  /**
47
54
  * Detects pain in the given text using L1 (Exact), L2 (Cache), and L3 (Async).
48
55
  */
49
- detect(text) {
56
+ detect(text: string): DetectionResult {
50
57
  if (shouldIgnorePainProtocolText(text)) {
51
58
  return { detected: false, source: 'l1_exact' };
52
59
  }
60
+
53
61
  // --- Layer 1: Exact Match (Sync) ---
54
62
  const exactMatch = this.dictionary.match(text);
55
63
  if (exactMatch) {
@@ -60,6 +68,7 @@ export class DetectionFunnel {
60
68
  source: 'l1_exact'
61
69
  };
62
70
  }
71
+
63
72
  // --- Layer 2: LRU Cache (Sync) ---
64
73
  const hash = this.computeHash(text);
65
74
  const cached = this.cache.get(hash);
@@ -70,33 +79,39 @@ export class DetectionFunnel {
70
79
  source: 'l2_cache'
71
80
  };
72
81
  }
82
+
73
83
  // --- Layer 3: Async Semantic Queue ---
74
84
  this.enqueueAsync(text);
85
+
75
86
  return {
76
87
  detected: false,
77
88
  source: 'l3_async_queued'
78
89
  };
79
90
  }
80
- computeHash(text) {
91
+
92
+ private computeHash(text: string): string {
81
93
  return createHash('sha256').update(text).digest('hex');
82
94
  }
83
- enqueueAsync(text) {
95
+
96
+ private enqueueAsync(text: string): void {
84
97
  if (this.asyncQueue.length < 1000) {
85
98
  this.asyncQueue.push(text);
86
99
  }
87
100
  // Worker will pick this up and perform semantic search via createMemorySearchTool
88
101
  }
102
+
89
103
  /**
90
104
  * Internal method for the worker to update the cache after a semantic hit.
91
105
  */
92
- updateCache(text, result) {
106
+ updateCache(text: string, result: { detected: boolean; severity?: number }): void {
93
107
  const hash = this.computeHash(text);
94
108
  this.cache.set(hash, result);
95
109
  }
110
+
96
111
  /**
97
112
  * Retrieves and clears the current asynchronous queue.
98
113
  */
99
- flushQueue() {
114
+ flushQueue(): string[] {
100
115
  const queue = [...this.asyncQueue];
101
116
  this.asyncQueue = [];
102
117
  return queue;
@@ -1,7 +1,9 @@
1
1
  import { DetectionFunnel } from './detection-funnel.js';
2
2
  import { DictionaryService } from './dictionary-service.js';
3
- let instance = null;
4
- let lastStateDir = null;
3
+
4
+ let instance: DetectionFunnel | null = null;
5
+ let lastStateDir: string | null = null;
6
+
5
7
  /**
6
8
  * Singleton service to manage the Semantic Detection Funnel.
7
9
  */
@@ -10,7 +12,7 @@ export const DetectionService = {
10
12
  * Gets or initializes the Detection Funnel instance.
11
13
  * @param stateDir The directory used to initialize the dictionary.
12
14
  */
13
- get(stateDir) {
15
+ get(stateDir: string): DetectionFunnel {
14
16
  if (!instance || lastStateDir !== stateDir) {
15
17
  const dictionary = DictionaryService.get(stateDir);
16
18
  instance = new DetectionFunnel(dictionary);
@@ -18,10 +20,11 @@ export const DetectionService = {
18
20
  }
19
21
  return instance;
20
22
  },
23
+
21
24
  /**
22
25
  * Resets the singleton instance (primarily for testing).
23
26
  */
24
- reset() {
27
+ reset(): void {
25
28
  instance = null;
26
29
  lastStateDir = null;
27
30
  }
@@ -1,6 +1,8 @@
1
1
  import { PainDictionary } from './dictionary.js';
2
- let dictionary = null;
3
- let lastStateDir = null;
2
+
3
+ let dictionary: PainDictionary | null = null;
4
+ let lastStateDir: string | null = null;
5
+
4
6
  /**
5
7
  * Singleton service to manage the Pain Dictionary.
6
8
  */
@@ -9,7 +11,7 @@ export const DictionaryService = {
9
11
  * Gets or initializes the Pain Dictionary instance.
10
12
  * @param stateDir The directory where the dictionary JSON is stored.
11
13
  */
12
- get(stateDir) {
14
+ get(stateDir: string): PainDictionary {
13
15
  if (!dictionary || lastStateDir !== stateDir) {
14
16
  dictionary = new PainDictionary(stateDir);
15
17
  dictionary.load();
@@ -17,10 +19,11 @@ export const DictionaryService = {
17
19
  }
18
20
  return dictionary;
19
21
  },
22
+
20
23
  /**
21
24
  * Resets the singleton instance (primarily for testing).
22
25
  */
23
- reset() {
26
+ reset(): void {
24
27
  dictionary = null;
25
28
  }
26
29
  };