principles-disciple 1.126.0 → 1.128.0

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 (593) hide show
  1. package/dist/commands/archive-impl.d.ts +18 -0
  2. package/dist/commands/archive-impl.js +105 -0
  3. package/dist/commands/capabilities.d.ts +3 -0
  4. package/dist/commands/capabilities.js +76 -0
  5. package/dist/commands/context.d.ts +5 -0
  6. package/{src/commands/context.ts → dist/commands/context.js} +34 -83
  7. package/dist/commands/disable-impl.d.ts +22 -0
  8. package/dist/commands/disable-impl.js +118 -0
  9. package/dist/commands/evolution-status.d.ts +4 -0
  10. package/dist/commands/evolution-status.js +187 -0
  11. package/dist/commands/export.d.ts +2 -0
  12. package/dist/commands/export.js +53 -0
  13. package/dist/commands/focus.d.ts +14 -0
  14. package/dist/commands/focus.js +443 -0
  15. package/dist/commands/pain.d.ts +6 -0
  16. package/{src/commands/pain.ts → dist/commands/pain.js} +137 -188
  17. package/dist/commands/principle-rollback.d.ts +4 -0
  18. package/dist/commands/principle-rollback.js +26 -0
  19. package/dist/commands/promote-impl.d.ts +22 -0
  20. package/dist/commands/promote-impl.js +194 -0
  21. package/dist/commands/rollback-impl.d.ts +32 -0
  22. package/dist/commands/rollback-impl.js +180 -0
  23. package/dist/commands/rollback.d.ts +19 -0
  24. package/{src/commands/rollback.ts → dist/commands/rollback.js} +10 -53
  25. package/dist/commands/samples.d.ts +2 -0
  26. package/dist/commands/samples.js +58 -0
  27. package/dist/commands/strategy.d.ts +2 -0
  28. package/dist/commands/strategy.js +16 -0
  29. package/dist/commands/thinking-os.d.ts +2 -0
  30. package/{src/commands/thinking-os.ts → dist/commands/thinking-os.js} +35 -58
  31. package/dist/commands/workflow-debug.d.ts +6 -0
  32. package/{src/commands/workflow-debug.ts → dist/commands/workflow-debug.js} +13 -33
  33. package/dist/config/defaults/runtime.d.ts +58 -0
  34. package/{src/config/defaults/runtime.ts → dist/config/defaults/runtime.js} +4 -41
  35. package/dist/config/errors.d.ts +86 -0
  36. package/dist/config/errors.js +107 -0
  37. package/{src/config/index.ts → dist/config/index.d.ts} +1 -2
  38. package/dist/config/index.js +7 -0
  39. package/dist/constants/diagnostician.d.ts +12 -0
  40. package/{src/constants/diagnostician.ts → dist/constants/diagnostician.js} +0 -1
  41. package/dist/constants/tools.d.ts +17 -0
  42. package/dist/constants/tools.js +53 -0
  43. package/dist/core/__tests__/focus-history.test.d.ts +1 -0
  44. package/dist/core/__tests__/focus-history.test.js +160 -0
  45. package/dist/core/bootstrap-rules.d.ts +50 -0
  46. package/dist/core/bootstrap-rules.js +187 -0
  47. package/dist/core/code-implementation-storage.d.ts +71 -0
  48. package/dist/core/code-implementation-storage.js +139 -0
  49. package/dist/core/config-health.d.ts +27 -0
  50. package/dist/core/config-health.js +60 -0
  51. package/dist/core/config-service.d.ts +15 -0
  52. package/{src/core/config-service.ts → dist/core/config-service.js} +4 -7
  53. package/dist/core/config.d.ts +111 -0
  54. package/{src/core/config.ts → dist/core/config.js} +46 -146
  55. package/dist/core/control-ui-db.d.ts +106 -0
  56. package/dist/core/control-ui-db.js +309 -0
  57. package/dist/core/correction-cue-learner.d.ts +33 -0
  58. package/dist/core/correction-cue-learner.js +184 -0
  59. package/dist/core/correction-types.d.ts +3 -0
  60. package/dist/core/correction-types.js +1 -0
  61. package/dist/core/detection-funnel.d.ts +33 -0
  62. package/{src/core/detection-funnel.ts → dist/core/detection-funnel.js} +17 -37
  63. package/dist/core/detection-service.d.ts +15 -0
  64. package/{src/core/detection-service.ts → dist/core/detection-service.js} +4 -7
  65. package/dist/core/dictionary-service.d.ts +15 -0
  66. package/{src/core/dictionary-service.ts → dist/core/dictionary-service.js} +4 -7
  67. package/dist/core/dictionary.d.ts +38 -0
  68. package/{src/core/dictionary.ts → dist/core/dictionary.js} +33 -59
  69. package/dist/core/empathy-keyword-matcher.d.ts +5 -0
  70. package/dist/core/empathy-keyword-matcher.js +40 -0
  71. package/dist/core/empathy-types.d.ts +2 -0
  72. package/dist/core/empathy-types.js +1 -0
  73. package/dist/core/event-log.d.ts +90 -0
  74. package/dist/core/event-log.js +702 -0
  75. package/dist/core/evolution-engine.d.ts +119 -0
  76. package/dist/core/evolution-engine.js +460 -0
  77. package/dist/core/evolution-logger.d.ts +137 -0
  78. package/dist/core/evolution-logger.js +261 -0
  79. package/dist/core/evolution-migration.d.ts +5 -0
  80. package/dist/core/evolution-migration.js +65 -0
  81. package/dist/core/evolution-reducer.d.ts +124 -0
  82. package/dist/core/evolution-reducer.js +730 -0
  83. package/dist/core/evolution-types.d.ts +50 -0
  84. package/dist/core/evolution-types.js +11 -0
  85. package/dist/core/external-training-contract.d.ts +276 -0
  86. package/dist/core/external-training-contract.js +269 -0
  87. package/dist/core/file-store.d.ts +41 -0
  88. package/dist/core/file-store.js +46 -0
  89. package/dist/core/focus-history.d.ts +50 -0
  90. package/dist/core/focus-history.js +574 -0
  91. package/dist/core/hygiene/tracker.d.ts +22 -0
  92. package/dist/core/hygiene/tracker.js +110 -0
  93. package/dist/core/init.d.ts +30 -0
  94. package/{src/core/init.ts → dist/core/init.js} +87 -118
  95. package/dist/core/local-worker-routing.d.ts +124 -0
  96. package/dist/core/local-worker-routing.js +216 -0
  97. package/dist/core/migration.d.ts +6 -0
  98. package/{src/core/migration.ts → dist/core/migration.js} +10 -18
  99. package/dist/core/model-deployment-registry.d.ts +218 -0
  100. package/dist/core/model-deployment-registry.js +502 -0
  101. package/dist/core/model-training-registry.d.ts +295 -0
  102. package/dist/core/model-training-registry.js +474 -0
  103. package/dist/core/observability.d.ts +40 -0
  104. package/dist/core/observability.js +164 -0
  105. package/dist/core/pain-diagnostic-gate.d.ts +36 -0
  106. package/dist/core/pain-diagnostic-gate.js +105 -0
  107. package/dist/core/pain.d.ts +87 -0
  108. package/dist/core/pain.js +223 -0
  109. package/dist/core/path-resolver.d.ts +60 -0
  110. package/{src/core/path-resolver.ts → dist/core/path-resolver.js} +41 -131
  111. package/dist/core/paths.d.ts +60 -0
  112. package/{src/core/paths.ts → dist/core/paths.js} +4 -13
  113. package/dist/core/pd-config-loader.d.ts +96 -0
  114. package/dist/core/pd-config-loader.js +307 -0
  115. package/dist/core/pd-task-reconciler.d.ts +89 -0
  116. package/dist/core/pd-task-reconciler.js +262 -0
  117. package/dist/core/pd-task-service.d.ts +2 -0
  118. package/dist/core/pd-task-service.js +32 -0
  119. package/dist/core/pd-task-store.d.ts +5 -0
  120. package/dist/core/pd-task-store.js +62 -0
  121. package/dist/core/pd-task-types.d.ts +8 -0
  122. package/dist/core/pd-task-types.js +2 -0
  123. package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.d.ts +1 -0
  124. package/dist/core/principle-compiler/__tests__/compiler-replay-gate.test.js +132 -0
  125. package/dist/core/principle-compiler/code-validator.d.ts +14 -0
  126. package/dist/core/principle-compiler/code-validator.js +86 -0
  127. package/dist/core/principle-compiler/compiler.d.ts +45 -0
  128. package/dist/core/principle-compiler/compiler.js +287 -0
  129. package/{src/core/principle-compiler/index.ts → dist/core/principle-compiler/index.d.ts} +0 -1
  130. package/dist/core/principle-compiler/index.js +10 -0
  131. package/dist/core/principle-compiler/ledger-registrar.d.ts +28 -0
  132. package/dist/core/principle-compiler/ledger-registrar.js +95 -0
  133. package/{src/core/principle-compiler/template-generator.ts → dist/core/principle-compiler/template-generator.d.ts} +0 -1
  134. package/dist/core/principle-compiler/template-generator.js +7 -0
  135. package/{src/core/principle-injection.ts → dist/core/principle-injection.d.ts} +1 -7
  136. package/dist/core/principle-injection.js +10 -0
  137. package/dist/core/principle-internalization/filesystem-lifecycle-datasource.d.ts +15 -0
  138. package/dist/core/principle-internalization/filesystem-lifecycle-datasource.js +34 -0
  139. package/dist/core/principle-internalization/lifecycle-read-model.d.ts +17 -0
  140. package/{src/core/principle-internalization/lifecycle-read-model.ts → dist/core/principle-internalization/lifecycle-read-model.js} +2 -21
  141. package/dist/core/principle-internalization/lifecycle-refresh.d.ts +2 -0
  142. package/dist/core/principle-internalization/lifecycle-refresh.js +4 -0
  143. package/dist/core/principle-internalization/principle-lifecycle-service.d.ts +28 -0
  144. package/dist/core/principle-internalization/principle-lifecycle-service.js +89 -0
  145. package/dist/core/principle-training-state.d.ts +47 -0
  146. package/dist/core/principle-training-state.js +113 -0
  147. package/dist/core/principle-tree-ledger-adapter.d.ts +32 -0
  148. package/dist/core/principle-tree-ledger-adapter.js +125 -0
  149. package/dist/core/principle-tree-ledger.d.ts +82 -0
  150. package/dist/core/principle-tree-ledger.js +527 -0
  151. package/dist/core/profile.d.ts +62 -0
  152. package/dist/core/profile.js +211 -0
  153. package/dist/core/promotion-gate.d.ts +243 -0
  154. package/dist/core/promotion-gate.js +554 -0
  155. package/dist/core/reflection/reflection-context.d.ts +31 -0
  156. package/dist/core/reflection/reflection-context.js +91 -0
  157. package/dist/core/replay-engine.d.ts +12 -0
  158. package/dist/core/replay-engine.js +82 -0
  159. package/dist/core/risk-calculator.d.ts +22 -0
  160. package/{src/core/risk-calculator.ts → dist/core/risk-calculator.js} +19 -49
  161. package/{src/core/rule-host-helpers.ts → dist/core/rule-host-helpers.d.ts} +0 -1
  162. package/dist/core/rule-host-helpers.js +7 -0
  163. package/{src/core/rule-host-types.ts → dist/core/rule-host-types.d.ts} +1 -8
  164. package/dist/core/rule-host-types.js +7 -0
  165. package/dist/core/rule-host.d.ts +86 -0
  166. package/dist/core/rule-host.js +311 -0
  167. package/dist/core/rule-implementation-runtime.d.ts +18 -0
  168. package/dist/core/rule-implementation-runtime.js +112 -0
  169. package/dist/core/runtime-v2-prompt-activation-reader.d.ts +22 -0
  170. package/dist/core/runtime-v2-prompt-activation-reader.js +99 -0
  171. package/{src/core/schema/db-types.ts → dist/core/schema/db-types.d.ts} +4 -9
  172. package/dist/core/schema/db-types.js +5 -0
  173. package/{src/core/schema/index.ts → dist/core/schema/index.d.ts} +1 -10
  174. package/dist/core/schema/index.js +15 -0
  175. package/dist/core/schema/migration-runner.d.ts +53 -0
  176. package/dist/core/schema/migration-runner.js +170 -0
  177. package/dist/core/schema/migrations/001-init-trajectory.d.ts +6 -0
  178. package/{src/core/schema/migrations/001-init-trajectory.ts → dist/core/schema/migrations/001-init-trajectory.js} +38 -56
  179. package/dist/core/schema/migrations/002-init-central.d.ts +5 -0
  180. package/{src/core/schema/migrations/002-init-central.ts → dist/core/schema/migrations/002-init-central.js} +27 -41
  181. package/dist/core/schema/migrations/003-init-workflow.d.ts +5 -0
  182. package/{src/core/schema/migrations/003-init-workflow.ts → dist/core/schema/migrations/003-init-workflow.js} +16 -21
  183. package/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +8 -0
  184. package/{src/core/schema/migrations/004-add-thinking-and-gfi.ts → dist/core/schema/migrations/004-add-thinking-and-gfi.js} +19 -27
  185. package/{src/core/schema/migrations/index.ts → dist/core/schema/migrations/index.d.ts} +1 -16
  186. package/dist/core/schema/migrations/index.js +27 -0
  187. package/dist/core/schema/schema-definitions.d.ts +46 -0
  188. package/{src/core/schema/schema-definitions.ts → dist/core/schema/schema-definitions.js} +242 -291
  189. package/dist/core/session-tracker.d.ts +119 -0
  190. package/{src/core/session-tracker.ts → dist/core/session-tracker.js} +96 -239
  191. package/dist/core/shadow-observation-registry.d.ts +217 -0
  192. package/dist/core/shadow-observation-registry.js +280 -0
  193. package/dist/core/surface-guard.d.ts +31 -0
  194. package/dist/core/surface-guard.js +131 -0
  195. package/dist/core/system-logger.d.ts +8 -0
  196. package/{src/core/system-logger.ts → dist/core/system-logger.js} +20 -34
  197. package/dist/core/thinking-models.d.ts +70 -0
  198. package/dist/core/thinking-models.js +300 -0
  199. package/dist/core/thinking-os-parser.d.ts +35 -0
  200. package/dist/core/thinking-os-parser.js +123 -0
  201. package/dist/core/trajectory-types.d.ts +220 -0
  202. package/dist/core/trajectory-types.js +8 -0
  203. package/dist/core/trajectory.d.ts +242 -0
  204. package/dist/core/trajectory.js +1500 -0
  205. package/dist/core/workflow-funnel-loader.d.ts +72 -0
  206. package/dist/core/workflow-funnel-loader.js +135 -0
  207. package/dist/core/workspace-context.d.ts +111 -0
  208. package/{src/core/workspace-context.ts → dist/core/workspace-context.js} +50 -105
  209. package/dist/core/workspace-dir-validation.d.ts +11 -0
  210. package/dist/core/workspace-dir-validation.js +37 -0
  211. package/dist/core/workspace-guidance-migrator.d.ts +12 -0
  212. package/{src/core/workspace-guidance-migrator.ts → dist/core/workspace-guidance-migrator.js} +21 -59
  213. package/dist/hooks/after-tool-call-helpers.d.ts +89 -0
  214. package/dist/hooks/after-tool-call-helpers.js +475 -0
  215. package/dist/hooks/after-tool-call-types.d.ts +86 -0
  216. package/dist/hooks/after-tool-call-types.js +13 -0
  217. package/dist/hooks/gate-block-helper.d.ts +44 -0
  218. package/dist/hooks/gate-block-helper.js +209 -0
  219. package/dist/hooks/gate.d.ts +16 -0
  220. package/dist/hooks/gate.js +381 -0
  221. package/dist/hooks/lifecycle.d.ts +5 -0
  222. package/dist/hooks/lifecycle.js +287 -0
  223. package/dist/hooks/llm.d.ts +13 -0
  224. package/{src/hooks/llm.ts → dist/hooks/llm.js} +63 -117
  225. package/dist/hooks/message-sanitize.d.ts +24 -0
  226. package/dist/hooks/message-sanitize.js +77 -0
  227. package/dist/hooks/pain.d.ts +33 -0
  228. package/dist/hooks/pain.js +294 -0
  229. package/dist/hooks/prompt.d.ts +52 -0
  230. package/dist/hooks/prompt.js +930 -0
  231. package/dist/hooks/raw-observation-adapter.d.ts +57 -0
  232. package/dist/hooks/raw-observation-adapter.js +170 -0
  233. package/dist/hooks/raw-observation-types.d.ts +62 -0
  234. package/dist/hooks/raw-observation-types.js +15 -0
  235. package/dist/hooks/subagent.d.ts +9 -0
  236. package/{src/hooks/subagent.ts → dist/hooks/subagent.js} +20 -60
  237. package/dist/hooks/trajectory-collector.d.ts +25 -0
  238. package/dist/hooks/trajectory-collector.js +225 -0
  239. package/dist/hooks/trajectory-evidence.d.ts +11 -0
  240. package/dist/hooks/trajectory-evidence.js +88 -0
  241. package/dist/hooks/triage-adapter.d.ts +58 -0
  242. package/{src/hooks/triage-adapter.ts → dist/hooks/triage-adapter.js} +36 -68
  243. package/dist/hooks/trigger-cooldown-tracker.d.ts +30 -0
  244. package/dist/hooks/trigger-cooldown-tracker.js +55 -0
  245. package/dist/i18n/commands.d.ts +26 -0
  246. package/dist/i18n/commands.js +96 -0
  247. package/dist/index.d.ts +50 -0
  248. package/dist/index.js +829 -0
  249. package/dist/openclaw-sdk.d.ts +293 -0
  250. package/dist/openclaw-sdk.js +4 -0
  251. package/dist/service/central-database.d.ts +138 -0
  252. package/dist/service/central-database.js +731 -0
  253. package/dist/service/central-sync-service.d.ts +8 -0
  254. package/dist/service/central-sync-service.js +71 -0
  255. package/dist/service/correction-observer-service.d.ts +19 -0
  256. package/{src/service/correction-observer-service.ts → dist/service/correction-observer-service.js} +36 -76
  257. package/dist/service/evolution-dedup.d.ts +27 -0
  258. package/{src/service/evolution-dedup.ts → dist/service/evolution-dedup.js} +11 -31
  259. package/{src/service/evolution-queue-migration.ts → dist/service/evolution-queue-migration.d.ts} +15 -62
  260. package/dist/service/evolution-queue-migration.js +53 -0
  261. package/dist/service/evolution-worker.d.ts +103 -0
  262. package/{src/service/evolution-worker.ts → dist/service/evolution-worker.js} +169 -331
  263. package/dist/service/internalization-auto-consumer-service.d.ts +8 -0
  264. package/dist/service/internalization-auto-consumer-service.js +322 -0
  265. package/dist/service/keyword-optimization-service.d.ts +44 -0
  266. package/dist/service/keyword-optimization-service.js +137 -0
  267. package/dist/service/phase3-input-filter.d.ts +73 -0
  268. package/dist/service/phase3-input-filter.js +172 -0
  269. package/dist/service/queue-io.d.ts +30 -0
  270. package/dist/service/queue-io.js +79 -0
  271. package/{src/service/queue-migration.ts → dist/service/queue-migration.d.ts} +6 -45
  272. package/dist/service/queue-migration.js +56 -0
  273. package/dist/service/runtime-summary-service.d.ts +158 -0
  274. package/dist/service/runtime-summary-service.js +636 -0
  275. package/dist/service/subagent-workflow/subagent-error-utils.d.ts +8 -0
  276. package/{src/service/subagent-workflow/subagent-error-utils.ts → dist/service/subagent-workflow/subagent-error-utils.js} +3 -6
  277. package/{src/service/subagent-workflow/types.ts → dist/service/subagent-workflow/types.d.ts} +17 -80
  278. package/dist/service/subagent-workflow/types.js +11 -0
  279. package/dist/service/subagent-workflow/workflow-store.d.ts +30 -0
  280. package/{src/service/subagent-workflow/workflow-store.ts → dist/service/subagent-workflow/workflow-store.js} +43 -108
  281. package/dist/service/trajectory-service.d.ts +2 -0
  282. package/dist/service/trajectory-service.js +16 -0
  283. package/dist/service/workflow-watchdog.d.ts +23 -0
  284. package/dist/service/workflow-watchdog.js +103 -0
  285. package/dist/types/event-types.d.ts +2 -0
  286. package/dist/types/event-types.js +1 -0
  287. package/dist/types/hygiene-types.d.ts +2 -0
  288. package/dist/types/hygiene-types.js +1 -0
  289. package/{src/types/principle-tree-schema.ts → dist/types/principle-tree-schema.d.ts} +2 -25
  290. package/dist/types/principle-tree-schema.js +24 -0
  291. package/dist/types/queue.d.ts +2 -0
  292. package/dist/types/queue.js +1 -0
  293. package/dist/types/runtime-summary.d.ts +1 -0
  294. package/dist/types/runtime-summary.js +1 -0
  295. package/dist/types.d.ts +33 -0
  296. package/dist/types.js +16 -0
  297. package/dist/utils/file-lock.d.ts +68 -0
  298. package/dist/utils/file-lock.js +310 -0
  299. package/dist/utils/hashing.d.ts +9 -0
  300. package/{src/utils/hashing.ts → dist/utils/hashing.js} +4 -6
  301. package/dist/utils/io.d.ts +11 -0
  302. package/dist/utils/io.js +174 -0
  303. package/dist/utils/node-vm-polyfill.d.ts +9 -0
  304. package/{src/utils/node-vm-polyfill.ts → dist/utils/node-vm-polyfill.js} +0 -2
  305. package/dist/utils/retry.d.ts +210 -0
  306. package/dist/utils/retry.js +375 -0
  307. package/dist/utils/session-key.d.ts +10 -0
  308. package/{src/utils/session-key.ts → dist/utils/session-key.js} +5 -4
  309. package/dist/utils/shadow-fingerprint.d.ts +16 -0
  310. package/dist/utils/shadow-fingerprint.js +34 -0
  311. package/dist/utils/workspace-resolver.d.ts +82 -0
  312. package/dist/utils/workspace-resolver.js +288 -0
  313. package/openclaw.plugin.json +1 -1
  314. package/package.json +8 -2
  315. package/templates/workspace/.principles/DECISION_POLICY.json +44 -0
  316. package/templates/workspace/.principles/PRINCIPLES.md +20 -0
  317. package/templates/workspace/.principles/PROFILE.json +54 -0
  318. package/templates/workspace/.principles/PROFILE.schema.json +56 -0
  319. package/templates/workspace/.principles/THINKING_OS.md +65 -0
  320. package/templates/workspace/.principles/THINKING_OS_ARCHIVE.md +7 -0
  321. package/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +9 -0
  322. package/templates/workspace/.principles/models/_INDEX.md +27 -0
  323. package/templates/workspace/.principles/models/first_principles.md +62 -0
  324. package/templates/workspace/.principles/models/marketing_4p.md +52 -0
  325. package/templates/workspace/.principles/models/porter_five.md +63 -0
  326. package/templates/workspace/.principles/models/swot.md +60 -0
  327. package/templates/workspace/.principles/models/user_story_map.md +63 -0
  328. package/templates/workspace/.state/WORKBOARD.json +4 -0
  329. package/.dependency-cruiser.json +0 -19
  330. package/ADVANCED_CONFIG_ZH.md +0 -93
  331. package/AGENT_INSTALL.md +0 -173
  332. package/AGENT_INSTALL_EN.md +0 -173
  333. package/CHANGELOG.md +0 -26
  334. package/INSTALL.md +0 -254
  335. package/SKILL.md +0 -63
  336. package/esbuild.config.js +0 -104
  337. package/src/commands/archive-impl.ts +0 -147
  338. package/src/commands/capabilities.ts +0 -89
  339. package/src/commands/disable-impl.ts +0 -159
  340. package/src/commands/evolution-status.ts +0 -247
  341. package/src/commands/export.ts +0 -59
  342. package/src/commands/focus.ts +0 -523
  343. package/src/commands/principle-rollback.ts +0 -32
  344. package/src/commands/promote-impl.ts +0 -254
  345. package/src/commands/rollback-impl.ts +0 -246
  346. package/src/commands/samples.ts +0 -65
  347. package/src/commands/strategy.ts +0 -21
  348. package/src/config/errors.ts +0 -180
  349. package/src/constants/tools.ts +0 -62
  350. package/src/core/AGENTS.md +0 -34
  351. package/src/core/__tests__/focus-history.test.ts +0 -210
  352. package/src/core/bootstrap-rules.ts +0 -216
  353. package/src/core/code-implementation-storage.ts +0 -213
  354. package/src/core/config-health.ts +0 -72
  355. package/src/core/control-ui-db.ts +0 -454
  356. package/src/core/correction-cue-learner.ts +0 -239
  357. package/src/core/correction-types.ts +0 -16
  358. package/src/core/empathy-keyword-matcher.ts +0 -64
  359. package/src/core/empathy-types.ts +0 -18
  360. package/src/core/event-log.ts +0 -787
  361. package/src/core/evolution-engine.ts +0 -613
  362. package/src/core/evolution-logger.ts +0 -357
  363. package/src/core/evolution-migration.ts +0 -77
  364. package/src/core/evolution-reducer.ts +0 -891
  365. package/src/core/evolution-types.ts +0 -110
  366. package/src/core/external-training-contract.ts +0 -530
  367. package/src/core/file-store.ts +0 -80
  368. package/src/core/focus-history.ts +0 -763
  369. package/src/core/hygiene/tracker.ts +0 -122
  370. package/src/core/local-worker-routing.ts +0 -337
  371. package/src/core/model-deployment-registry.ts +0 -724
  372. package/src/core/model-training-registry.ts +0 -815
  373. package/src/core/observability.ts +0 -242
  374. package/src/core/pain-diagnostic-gate.ts +0 -169
  375. package/src/core/pain.ts +0 -309
  376. package/src/core/pd-config-loader.ts +0 -400
  377. package/src/core/pd-task-reconciler.ts +0 -380
  378. package/src/core/pd-task-service.ts +0 -43
  379. package/src/core/pd-task-store.ts +0 -78
  380. package/src/core/pd-task-types.ts +0 -24
  381. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +0 -174
  382. package/src/core/principle-compiler/code-validator.ts +0 -93
  383. package/src/core/principle-compiler/compiler.ts +0 -327
  384. package/src/core/principle-compiler/ledger-registrar.ts +0 -116
  385. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +0 -42
  386. package/src/core/principle-internalization/lifecycle-refresh.ts +0 -11
  387. package/src/core/principle-internalization/principle-lifecycle-service.ts +0 -170
  388. package/src/core/principle-training-state.ts +0 -177
  389. package/src/core/principle-tree-ledger-adapter.ts +0 -145
  390. package/src/core/principle-tree-ledger.ts +0 -725
  391. package/src/core/profile.ts +0 -228
  392. package/src/core/promotion-gate.ts +0 -854
  393. package/src/core/reflection/reflection-context.ts +0 -133
  394. package/src/core/replay-engine.ts +0 -106
  395. package/src/core/rule-host.ts +0 -386
  396. package/src/core/rule-implementation-runtime.ts +0 -145
  397. package/src/core/runtime-v2-prompt-activation-reader.ts +0 -114
  398. package/src/core/schema/migration-runner.ts +0 -207
  399. package/src/core/shadow-observation-registry.ts +0 -508
  400. package/src/core/surface-guard.ts +0 -188
  401. package/src/core/thinking-models.ts +0 -377
  402. package/src/core/thinking-os-parser.ts +0 -165
  403. package/src/core/trajectory-types.ts +0 -247
  404. package/src/core/trajectory.ts +0 -1831
  405. package/src/core/workflow-funnel-loader.ts +0 -195
  406. package/src/core/workspace-dir-validation.ts +0 -52
  407. package/src/hooks/AGENTS.md +0 -31
  408. package/src/hooks/after-tool-call-helpers.ts +0 -601
  409. package/src/hooks/after-tool-call-types.ts +0 -99
  410. package/src/hooks/gate-block-helper.ts +0 -265
  411. package/src/hooks/gate.ts +0 -394
  412. package/src/hooks/lifecycle.ts +0 -334
  413. package/src/hooks/message-sanitize.ts +0 -102
  414. package/src/hooks/pain.ts +0 -358
  415. package/src/hooks/prompt.ts +0 -1102
  416. package/src/hooks/raw-observation-adapter.ts +0 -215
  417. package/src/hooks/raw-observation-types.ts +0 -77
  418. package/src/hooks/trajectory-collector.ts +0 -253
  419. package/src/hooks/trajectory-evidence.ts +0 -97
  420. package/src/hooks/trigger-cooldown-tracker.ts +0 -82
  421. package/src/i18n/commands.ts +0 -101
  422. package/src/index.ts +0 -939
  423. package/src/openclaw-sdk.ts +0 -312
  424. package/src/service/central-database.ts +0 -936
  425. package/src/service/central-sync-service.ts +0 -85
  426. package/src/service/internalization-auto-consumer-service.ts +0 -397
  427. package/src/service/keyword-optimization-service.ts +0 -169
  428. package/src/service/phase3-input-filter.ts +0 -237
  429. package/src/service/queue-io.ts +0 -108
  430. package/src/service/runtime-summary-service.ts +0 -990
  431. package/src/service/trajectory-service.ts +0 -16
  432. package/src/service/workflow-watchdog.ts +0 -125
  433. package/src/types/event-types.ts +0 -39
  434. package/src/types/hygiene-types.ts +0 -8
  435. package/src/types/queue.ts +0 -15
  436. package/src/types/runtime-summary.ts +0 -5
  437. package/src/types.ts +0 -53
  438. package/src/utils/file-lock.ts +0 -394
  439. package/src/utils/io.ts +0 -176
  440. package/src/utils/retry.ts +0 -573
  441. package/src/utils/shadow-fingerprint.ts +0 -42
  442. package/src/utils/workspace-resolver.ts +0 -393
  443. package/tests/README.md +0 -120
  444. package/tests/build-artifacts.test.ts +0 -55
  445. package/tests/commands/evolution-status.test.ts +0 -511
  446. package/tests/commands/export.test.ts +0 -78
  447. package/tests/commands/pain.test.ts +0 -287
  448. package/tests/commands/samples.test.ts +0 -65
  449. package/tests/commands/strategy.test.ts +0 -19
  450. package/tests/commands/thinking-os.test.ts +0 -88
  451. package/tests/core/bootstrap-rules.test.ts +0 -596
  452. package/tests/core/code-implementation-storage.test.ts +0 -300
  453. package/tests/core/code-validator.test.ts +0 -197
  454. package/tests/core/config-service.test.ts +0 -89
  455. package/tests/core/config.test.ts +0 -90
  456. package/tests/core/control-ui-db.test.ts +0 -75
  457. package/tests/core/core-principle-registry-drift.test.ts +0 -39
  458. package/tests/core/core-template-guidance.test.ts +0 -21
  459. package/tests/core/correction-cue-learner.test.ts +0 -345
  460. package/tests/core/detection-service.test.ts +0 -50
  461. package/tests/core/dictionary-service.test.ts +0 -116
  462. package/tests/core/dictionary.test.ts +0 -171
  463. package/tests/core/empathy-keyword-matcher.test.ts +0 -209
  464. package/tests/core/event-log.test.ts +0 -484
  465. package/tests/core/evolution-engine.test.ts +0 -610
  466. package/tests/core/evolution-logger.test.ts +0 -148
  467. package/tests/core/evolution-migration.test.ts +0 -374
  468. package/tests/core/evolution-paths.test.ts +0 -21
  469. package/tests/core/evolution-reducer.compilation-retry.test.ts +0 -189
  470. package/tests/core/evolution-reducer.detector-metadata.test.ts +0 -602
  471. package/tests/core/evolution-types-loop.test.ts +0 -48
  472. package/tests/core/external-training-contract.test.ts +0 -463
  473. package/tests/core/file-store.test.ts +0 -102
  474. package/tests/core/focus-history.test.ts +0 -874
  475. package/tests/core/init-flatten.test.ts +0 -69
  476. package/tests/core/init-refactor.test.ts +0 -87
  477. package/tests/core/init-v1.3.test.ts +0 -46
  478. package/tests/core/init.test.ts +0 -190
  479. package/tests/core/ledger-registrar.test.ts +0 -235
  480. package/tests/core/migration.test.ts +0 -84
  481. package/tests/core/model-deployment-registry.test.ts +0 -858
  482. package/tests/core/model-training-registry.test.ts +0 -908
  483. package/tests/core/observability.test.ts +0 -382
  484. package/tests/core/pain-diagnostic-gate.test.ts +0 -614
  485. package/tests/core/pain-score.property.test.ts +0 -19
  486. package/tests/core/pain.test.ts +0 -132
  487. package/tests/core/path-resolver.test.ts +0 -57
  488. package/tests/core/paths-refactor.test.ts +0 -20
  489. package/tests/core/pd-config-loader.test.ts +0 -407
  490. package/tests/core/pd-task-store.test.ts +0 -126
  491. package/tests/core/phase7-rollout-integration.test.ts +0 -477
  492. package/tests/core/principle-compiler.test.ts +0 -350
  493. package/tests/core/principle-injection.test.ts +0 -223
  494. package/tests/core/principle-internalization/deprecated-readiness.test.ts +0 -193
  495. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +0 -350
  496. package/tests/core/principle-internalization/lifecycle-routing-policy.test.ts +0 -212
  497. package/tests/core/principle-internalization/lineage-source-retired.test.ts +0 -56
  498. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +0 -189
  499. package/tests/core/principle-training-state.test.ts +0 -939
  500. package/tests/core/principle-tree-ledger-adapter.test.ts +0 -253
  501. package/tests/core/principle-tree-ledger.test.ts +0 -423
  502. package/tests/core/profile.test.ts +0 -56
  503. package/tests/core/promotion-gate.test.ts +0 -561
  504. package/tests/core/queue-purge.test.ts +0 -337
  505. package/tests/core/reflection-context.test.ts +0 -342
  506. package/tests/core/regression-v1-9-1.test.ts +0 -266
  507. package/tests/core/replay-engine.test.ts +0 -165
  508. package/tests/core/risk-calculator.test.ts +0 -168
  509. package/tests/core/rule-host-adversarial-output.test.ts +0 -242
  510. package/tests/core/rule-host-autocorrect-vm.test.ts +0 -163
  511. package/tests/core/rule-host-helpers.test.ts +0 -120
  512. package/tests/core/rule-host-resource-bounds.test.ts +0 -231
  513. package/tests/core/rule-host-sqlite-source.test.ts +0 -720
  514. package/tests/core/rule-host-unhealthy-visibility.test.ts +0 -261
  515. package/tests/core/rule-host-validation.test.ts +0 -315
  516. package/tests/core/rule-implementation-runtime.test.ts +0 -49
  517. package/tests/core/session-tracker.test.ts +0 -191
  518. package/tests/core/surface-guard.test.ts +0 -338
  519. package/tests/core/template-generator.test.ts +0 -101
  520. package/tests/core/trajectory.test.ts +0 -427
  521. package/tests/core/workflow-funnel-loader.test.ts +0 -1028
  522. package/tests/core/workspace-context-factory.test.ts +0 -18
  523. package/tests/core/workspace-context.test.ts +0 -187
  524. package/tests/core/workspace-guidance-migrator.test.ts +0 -248
  525. package/tests/core-anti-growth.test.ts +0 -182
  526. package/tests/evolution-worker-quarantine.test.ts +0 -400
  527. package/tests/evolution-worker-slimming.test.ts +0 -380
  528. package/tests/fixtures/legacy-queue-v1.json +0 -74
  529. package/tests/fixtures/production-compatibility.test.ts +0 -147
  530. package/tests/fixtures/production-mock-generator.ts +0 -282
  531. package/tests/globalSetup.ts +0 -38
  532. package/tests/hook-workspace-nextaction-contract.test.ts +0 -50
  533. package/tests/hooks/confirm-first-removal.test.ts +0 -188
  534. package/tests/hooks/gate-auto-correct-shadow.test.ts +0 -309
  535. package/tests/hooks/gate-auto-correct.test.ts +0 -664
  536. package/tests/hooks/gate-block-helper-profile.test.ts +0 -186
  537. package/tests/hooks/gate-no-path-write-tool.test.ts +0 -171
  538. package/tests/hooks/gate-rule-host-pipeline.test.ts +0 -230
  539. package/tests/hooks/gate-rule-host-real-pipeline.test.ts +0 -190
  540. package/tests/hooks/lifecycle.test.ts +0 -248
  541. package/tests/hooks/message-sanitize.test.ts +0 -244
  542. package/tests/hooks/pain-emission-characterization.test.ts +0 -420
  543. package/tests/hooks/pain.test.ts +0 -795
  544. package/tests/hooks/prompt-characterization.test.ts +0 -476
  545. package/tests/hooks/prompt-diet.test.ts +0 -335
  546. package/tests/hooks/prompt-size-guard.test.ts +0 -319
  547. package/tests/hooks/raw-observation-adapter.test.ts +0 -312
  548. package/tests/hooks/runtime-v2-prompt-activation.test.ts +0 -895
  549. package/tests/hooks/single-gate-pain-admission.test.ts +0 -258
  550. package/tests/hooks/subagent.test.ts +0 -469
  551. package/tests/hooks/trajectory-collector.test.ts +0 -269
  552. package/tests/hooks/trajectory-evidence.test.ts +0 -280
  553. package/tests/hooks/triage-adapter.test.ts +0 -331
  554. package/tests/hygiene-tracker.test.ts +0 -77
  555. package/tests/index.test.ts +0 -142
  556. package/tests/integration/auto-entry-gate.test.ts +0 -256
  557. package/tests/integration/gate-real-io.e2e.test.ts +0 -248
  558. package/tests/integration/m8-legacy-paths.test.ts +0 -63
  559. package/tests/integration/mvp-surface-registry-guard.test.ts +0 -536
  560. package/tests/integration/pain-id-chain-e2e.test.ts +0 -313
  561. package/tests/integration/principle-compiler-e2e.test.ts +0 -403
  562. package/tests/integration/principle-lifecycle.e2e.test.ts +0 -198
  563. package/tests/integration/runtime-v2-pain-guard.test.ts +0 -125
  564. package/tests/integration/trajectory-lifecycle.e2e.test.ts +0 -523
  565. package/tests/internalization-auto-consumer-gate.test.ts +0 -158
  566. package/tests/internalization-auto-consumer-service.test.ts +0 -219
  567. package/tests/plugin-config-resolution-cutover.test.ts +0 -359
  568. package/tests/queue/async-lock.test.ts +0 -200
  569. package/tests/runtime-v2-discovery-guard.test.ts +0 -153
  570. package/tests/scripts/validate-live-path.test.ts +0 -286
  571. package/tests/service/central-database.test.ts +0 -457
  572. package/tests/service/correction-observer-service.test.ts +0 -505
  573. package/tests/service/evolution-worker.compilation-backfill.test.ts +0 -203
  574. package/tests/service/evolution-worker.correction-observer.test.ts +0 -50
  575. package/tests/service/evolution-worker.queue.test.ts +0 -296
  576. package/tests/service/evolution-worker.timeout.test.ts +0 -233
  577. package/tests/service/keyword-optimization-service.test.ts +0 -121
  578. package/tests/service/phase3-input-filter.test.ts +0 -289
  579. package/tests/service/queue-io.test.ts +0 -168
  580. package/tests/service/queue-migration.test.ts +0 -147
  581. package/tests/service/runtime-summary-service.test.ts +0 -1100
  582. package/tests/service/workflow-watchdog.test.ts +0 -281
  583. package/tests/task-compliance.test.ts +0 -166
  584. package/tests/test-utils.ts +0 -48
  585. package/tests/utils/file-lock.test.ts +0 -409
  586. package/tests/utils/hashing.test.ts +0 -32
  587. package/tests/utils/hook-workspace-resolver.test.ts +0 -524
  588. package/tests/utils/io.test.ts +0 -39
  589. package/tests/utils/retry.test.ts +0 -327
  590. package/tests/utils/session-key.test.ts +0 -52
  591. package/tsconfig.json +0 -16
  592. package/vitest.config.ts +0 -61
  593. package/vitest.unit.config.ts +0 -12
@@ -1,6 +1,5 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import type { PluginHookLlmOutputEvent, PluginHookAgentContext, TokenUsage } from '../openclaw-sdk.js';
4
3
  import { trackLlmOutput, recordThinkingCheckpoint, resetFriction } from '../core/session-tracker.js';
5
4
  import { normalizeSeverity } from '../core/empathy-types.js';
6
5
  import { ControlUiDatabase } from '../core/control-ui-db.js';
@@ -12,42 +11,30 @@ import { atomicWriteFileSync } from '../utils/io.js';
12
11
  import { emitPainDetectedEvent, buildTrajectoryEvidence } from './pain.js';
13
12
  import { evaluatePainDiagnosticGate } from '../core/pain-diagnostic-gate.js';
14
13
  import { loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
15
- import { resolveSourceKind, type RawObservation } from './raw-observation-adapter.js';
14
+ import { resolveSourceKind } from './raw-observation-adapter.js';
16
15
  import { evaluateEvidenceTriage } from './triage-adapter.js';
17
-
18
- export interface EmpathySignal {
19
- detected: boolean;
20
- severity: 'mild' | 'moderate' | 'severe';
21
- confidence: number;
22
- reason?: string;
23
- mode?: 'structured' | 'legacy_tag';
24
- }
25
-
26
- function clamp(value: number, min: number, max: number): number {
16
+ function clamp(value, min, max) {
27
17
  return Math.max(min, Math.min(max, value));
28
18
  }
29
-
30
- function parseConfidence(raw?: string): number {
19
+ function parseConfidence(raw) {
31
20
  const parsed = Number(raw);
32
- if (!Number.isFinite(parsed)) return 1;
21
+ if (!Number.isFinite(parsed))
22
+ return 1;
33
23
  return clamp(parsed, 0, 1);
34
24
  }
35
-
36
- function parseTrustedLegacyTag(text: string): RegExpMatchArray | null {
25
+ function parseTrustedLegacyTag(text) {
37
26
  return /^\s*\[EMOTIONAL_DAMAGE_DETECTED(?::(mild|moderate|severe))?\]\s*$/i.exec(text);
38
27
  }
39
-
40
28
  /**
41
29
  * 检测标签是否是被用户诱导/引用输出的(回显),而非 LLM 主动输出的情绪信号
42
30
  */
43
- function isEchoedTag(text: string, tagMatch: RegExpMatchArray): boolean {
31
+ function isEchoedTag(text, tagMatch) {
44
32
  const tagIndex = tagMatch.index ?? 0;
45
33
  const before = text.substring(Math.max(0, tagIndex - 100), tagIndex).toLowerCase();
46
-
47
34
  // 1. 检查是否在引号内(用户引用)
48
35
  const quotesBefore = (before.match(/["'\u300c\u300d\u201c\u201d`]/g) || []).length;
49
- if (quotesBefore % 2 === 1) return true;
50
-
36
+ if (quotesBefore % 2 === 1)
37
+ return true;
51
38
  // 2. Strong patterns: 用户指令关键词(任意位置匹配)
52
39
  const strongPatterns = [
53
40
  /用户(说|让|要求|让我输出)/,
@@ -57,9 +44,9 @@ function isEchoedTag(text: string, tagMatch: RegExpMatchArray): boolean {
57
44
  /你让我输出/,
58
45
  ];
59
46
  for (const pattern of strongPatterns) {
60
- if (pattern.test(before)) return true;
47
+ if (pattern.test(before))
48
+ return true;
61
49
  }
62
-
63
50
  // 3. Weak patterns: 仅在标签 15 字符内触发
64
51
  const weakPatterns = [
65
52
  { pattern: /echo/, window: 15 },
@@ -68,21 +55,19 @@ function isEchoedTag(text: string, tagMatch: RegExpMatchArray): boolean {
68
55
  ];
69
56
  for (const { pattern, window } of weakPatterns) {
70
57
  const nearTag = text.substring(Math.max(0, tagIndex - window), tagIndex).toLowerCase();
71
- if (pattern.test(nearTag)) return true;
58
+ if (pattern.test(nearTag))
59
+ return true;
72
60
  }
73
-
74
61
  // 4. 检查是否在代码块内
75
62
  const codeBlocksBefore = (before.match(/```/g) || []).length;
76
- if (codeBlocksBefore % 2 === 1) return true;
77
-
63
+ if (codeBlocksBefore % 2 === 1)
64
+ return true;
78
65
  return false;
79
66
  }
80
-
81
- export function extractEmpathySignal(text: string): EmpathySignal {
67
+ export function extractEmpathySignal(text) {
82
68
  if (!text || typeof text !== 'string') {
83
69
  return { detected: false, severity: 'mild', confidence: 1 };
84
70
  }
85
-
86
71
  const xmlMatch = /<empathy\s+([^>]*)\/?>(?:<\/empathy>)?/i.exec(text);
87
72
  if (xmlMatch?.[1]) {
88
73
  const [, attrs] = xmlMatch;
@@ -94,14 +79,11 @@ export function extractEmpathySignal(text: string): EmpathySignal {
94
79
  return { detected: true, severity, confidence, reason, mode: 'structured' };
95
80
  }
96
81
  }
97
-
98
82
  const jsonMatch = /"empathy"\s*:\s*\{[\s\S]*?\}/i.exec(text);
99
83
  if (jsonMatch) {
100
84
  const jsonText = `{${jsonMatch[0]}}`;
101
85
  try {
102
- const parsed = JSON.parse(jsonText) as {
103
- empathy?: { damageDetected?: boolean; severity?: string; confidence?: number; reason?: string };
104
- };
86
+ const parsed = JSON.parse(jsonText);
105
87
  if (parsed.empathy?.damageDetected === true) {
106
88
  return {
107
89
  detected: true,
@@ -111,11 +93,11 @@ export function extractEmpathySignal(text: string): EmpathySignal {
111
93
  mode: 'structured'
112
94
  };
113
95
  }
114
- } catch {
96
+ }
97
+ catch {
115
98
  // ignore malformed snippet
116
99
  }
117
100
  }
118
-
119
101
  const tagMatch = parseTrustedLegacyTag(text);
120
102
  if (tagMatch) {
121
103
  if (isEchoedTag(text, tagMatch)) {
@@ -128,44 +110,40 @@ export function extractEmpathySignal(text: string): EmpathySignal {
128
110
  mode: 'legacy_tag'
129
111
  };
130
112
  }
131
-
132
113
  return { detected: false, severity: 'mild', confidence: 1 };
133
114
  }
134
-
135
- export function isEmpathyAuditPayload(text: string): boolean {
136
- if (!text || typeof text !== 'string') return false;
115
+ export function isEmpathyAuditPayload(text) {
116
+ if (!text || typeof text !== 'string')
117
+ return false;
137
118
  const trimmed = text.trim();
138
- if (/^\{[\s\S]*"damageDetected"[\s\S]*\}$/.test(trimmed)) return true;
139
- if (/^<empathy\s+([^>]*)\/?>/i.test(trimmed)) return true;
140
- if (/^\s*\[EMOTIONAL_DAMAGE_DETECTED(?::(mild|moderate|severe))?\]\s*$/i.test(trimmed)) return true;
119
+ if (/^\{[\s\S]*"damageDetected"[\s\S]*\}$/.test(trimmed))
120
+ return true;
121
+ if (/^<empathy\s+([^>]*)\/?>/i.test(trimmed))
122
+ return true;
123
+ if (/^\s*\[EMOTIONAL_DAMAGE_DETECTED(?::(mild|moderate|severe))?\]\s*$/i.test(trimmed))
124
+ return true;
141
125
  return false;
142
126
  }
143
-
144
- export function handleLlmOutput(
145
- event: PluginHookLlmOutputEvent,
146
- ctx: PluginHookAgentContext & { workspaceDir?: string }
147
- ): void {
148
- if (!ctx.workspaceDir || !ctx.sessionId) return;
149
-
127
+ export function handleLlmOutput(event, ctx) {
128
+ if (!ctx.workspaceDir || !ctx.sessionId)
129
+ return;
150
130
  const wctx = WorkspaceContext.fromHookContext(ctx);
151
- const {config} = wctx;
152
- const {eventLog} = wctx;
153
-
131
+ const { config } = wctx;
132
+ const { eventLog } = wctx;
154
133
  // Track this turn in the core session memory
155
- const trigger = (event as { trigger?: string }).trigger ?? undefined;
156
- const usage = event.usage as TokenUsage | undefined;
157
- const sessionId = (ctx as { sessionId?: string }).sessionId ?? 'unknown';
158
- const workspaceDir = (ctx as { workspaceDir?: string }).workspaceDir;
159
- const sessionKey = (ctx as { sessionKey?: string }).sessionKey ?? 'unknown';
134
+ const trigger = event.trigger ?? undefined;
135
+ const usage = event.usage;
136
+ const sessionId = ctx.sessionId ?? 'unknown';
137
+ const workspaceDir = ctx.workspaceDir;
138
+ const sessionKey = ctx.sessionKey ?? 'unknown';
160
139
  const state = trackLlmOutput(sessionId, usage, config, workspaceDir, sessionKey, trigger);
161
-
162
140
  // We need actual assistant text to analyze
163
- if (!event.assistantTexts || event.assistantTexts.length === 0) return;
164
-
141
+ if (!event.assistantTexts || event.assistantTexts.length === 0)
142
+ return;
165
143
  const text = event.assistantTexts.join('\n');
166
144
  const signal = extractEmpathySignal(text);
167
145
  const createdAt = new Date().toISOString();
168
- let assistantTurnId: number | null = null;
146
+ let assistantTurnId = null;
169
147
  try {
170
148
  assistantTurnId = wctx.trajectory?.recordAssistantTurn?.({
171
149
  sessionId: ctx.sessionId,
@@ -178,15 +156,14 @@ export function handleLlmOutput(
178
156
  empathySignalJson: signal,
179
157
  createdAt,
180
158
  });
181
- } catch (error) {
159
+ }
160
+ catch (error) {
182
161
  ctx.logger?.warn?.(`[PD:LLM] Failed to persist assistant turn to trajectory: ${String(error)}`);
183
162
  }
184
-
185
163
  // ── Track B: Semantic Pain Detection (V1.3.0 Funnel) ──
186
164
  const detectionText = isEmpathyAuditPayload(text) ? '' : text;
187
165
  const detectionService = DetectionService.get(wctx.stateDir);
188
166
  const detection = detectionService.detect(detectionText);
189
-
190
167
  if (detection.detected) {
191
168
  eventLog.recordRuleMatch(ctx.sessionId, {
192
169
  ruleId: detection.ruleId || detection.source,
@@ -195,7 +172,6 @@ export function handleLlmOutput(
195
172
  textPreview: detectionText.substring(0, 100)
196
173
  });
197
174
  }
198
-
199
175
  let painScore = detection.detected ? (detection.severity || 0) : 0;
200
176
  let source = detection.detected
201
177
  ? (detection.ruleId ? `llm_${detection.ruleId.toLowerCase()}` : `llm_${detection.source}`)
@@ -203,18 +179,12 @@ export function handleLlmOutput(
203
179
  let matchedReason = detection.detected
204
180
  ? `Agent triggered pain detection (Source: ${detection.source}${detection.ruleId ? `, Rule: ${detection.ruleId}` : ''})`
205
181
  : '';
206
-
207
182
  // ═══ Natural Language Rollback Detection ═══
208
183
  const rollbackMatch = /^\s*\[EMPATHY_ROLLBACK_REQUEST\]\s*$/m.exec(text);
209
184
  if (rollbackMatch) {
210
185
  const eventId = eventLog.getLastEmpathyEventId(ctx.sessionId);
211
186
  if (eventId) {
212
- const rolledBackScore = eventLog.rollbackEmpathyEvent(
213
- eventId,
214
- ctx.sessionId,
215
- 'Natural language rollback request detected',
216
- 'natural_language'
217
- );
187
+ const rolledBackScore = eventLog.rollbackEmpathyEvent(eventId, ctx.sessionId, 'Natural language rollback request detected', 'natural_language');
218
188
  if (rolledBackScore > 0) {
219
189
  // Reset GFI after successful rollback
220
190
  resetFriction(ctx.sessionId, ctx.workspaceDir, {
@@ -224,22 +194,18 @@ export function handleLlmOutput(
224
194
  }
225
195
  }
226
196
  }
227
-
228
197
  // 3. Paralysis Check (from session state tracker)
229
198
  const stuckThreshold = config.get('thresholds.stuck_loops_trigger') || 3;
230
199
  const inputThreshold = config.get('thresholds.cognitive_paralysis_input') || 4000;
231
200
  const paralysisScore = config.get('scores.paralysis') || 40;
232
-
233
201
  if (state.stuckLoops >= stuckThreshold && state.totalInputTokens > inputThreshold && painScore < paralysisScore) {
234
202
  painScore = paralysisScore;
235
203
  source = 'llm_paralysis';
236
204
  matchedReason = `Agent is stuck in low-output loops (${state.stuckLoops} consecutive turns with tiny output but huge context), indicating cognitive paralysis.`;
237
205
  }
238
-
239
206
  // If a semantic pain threshold is crossed, only valuable episodes enter Runtime v2.
240
207
  // Lower-signal detections remain in the event log/GFI layer for accumulation.
241
208
  const painTriggerThreshold = config.get('thresholds.pain_trigger') || 30;
242
-
243
209
  // GFI-triggered pain: when accumulated friction crosses highGfi threshold,
244
210
  // emit pain signal even if L1 detection didn't fire.
245
211
  const highGfiThreshold = Math.max(config.get('severity_thresholds.high') || 70, painTriggerThreshold + 30);
@@ -250,14 +216,13 @@ export function handleLlmOutput(
250
216
  isGfiTriggered = true;
251
217
  matchedReason = `Accumulated GFI (${state.currentGfi.toFixed(1)}) crossed highGfi threshold (${highGfiThreshold}). Source: empathy keyword friction.`;
252
218
  }
253
-
254
219
  if (painScore >= painTriggerThreshold) {
255
220
  // PEAT-B1: Evidence triage (feature-flagged)
256
221
  let triageAdmitted = true;
257
- const llmTriageFlag = loadFeatureFlagFromConfig(ctx.workspaceDir!, 'painEvidenceAdmission');
222
+ const llmTriageFlag = loadFeatureFlagFromConfig(ctx.workspaceDir, 'painEvidenceAdmission');
258
223
  if (llmTriageFlag.enabled) {
259
224
  // PRI-360 S1: Build RawObservation for unified source mapping
260
- const rawObs: RawObservation = {
225
+ const rawObs = {
261
226
  observedAt: new Date().toISOString(),
262
227
  workspaceId: ctx.workspaceDir,
263
228
  sessionId: ctx.sessionId,
@@ -271,14 +236,12 @@ export function handleLlmOutput(
271
236
  ctx.logger?.info?.(`[PD:LLM] Triage ${triage.decision}: ${triage.reason}`);
272
237
  }
273
238
  }
274
-
275
239
  eventLog.recordPainSignal(ctx.sessionId, {
276
240
  score: painScore,
277
241
  source: source,
278
242
  reason: matchedReason,
279
243
  isRisky: false
280
244
  });
281
-
282
245
  if (triageAdmitted) {
283
246
  const gate = evaluatePainDiagnosticGate({
284
247
  source: source === 'llm_paralysis' ? 'llm_paralysis' : 'semantic',
@@ -293,7 +256,6 @@ export function handleLlmOutput(
293
256
  semanticPain: Math.max(painTriggerThreshold, 60),
294
257
  },
295
258
  });
296
-
297
259
  if (gate.shouldDiagnose) {
298
260
  const evidence = buildTrajectoryEvidence(wctx, ctx.sessionId || 'unknown');
299
261
  emitPainDetectedEvent(wctx, {
@@ -301,7 +263,7 @@ export function handleLlmOutput(
301
263
  type: 'pain_detected',
302
264
  data: {
303
265
  painId: `llm_${Date.now()}`,
304
- painType: 'user_frustration' as const,
266
+ painType: 'user_frustration',
305
267
  source,
306
268
  reason: `${matchedReason}; diagnosticGate=${gate.reason}`,
307
269
  score: painScore,
@@ -311,17 +273,16 @@ export function handleLlmOutput(
311
273
  evidence,
312
274
  },
313
275
  });
314
- } else {
276
+ }
277
+ else {
315
278
  ctx.logger?.info?.(`[PD:LLM] Pain signal recorded without Runtime V2 diagnosis: ${gate.detail}`);
316
279
  }
317
- } else {
280
+ }
281
+ else {
318
282
  ctx.logger?.info?.(`[PD:LLM] Triage evidence-only: pain signal recorded without diagnosis or gate evaluation`);
319
283
  }
320
284
  }
321
-
322
285
  // ═══ Thinking OS: Mental Model Usage Tracking ═══
323
-
324
-
325
286
  trackThinkingModelUsage({
326
287
  text,
327
288
  wctx,
@@ -332,56 +293,41 @@ export function handleLlmOutput(
332
293
  logger: ctx.logger,
333
294
  });
334
295
  }
335
-
336
- function trackThinkingModelUsage(args: {
337
- text: string;
338
- wctx: WorkspaceContext;
339
- sessionId?: string;
340
- runId: string;
341
- assistantTurnId: number | null;
342
- createdAt: string;
343
- logger?: PluginHookAgentContext['logger'];
344
- }): void {
296
+ function trackThinkingModelUsage(args) {
345
297
  const { text, wctx, sessionId, runId, assistantTurnId, createdAt, logger } = args;
346
298
  const logPath = wctx.resolve('THINKING_OS_USAGE');
347
299
  const logDir = path.dirname(logPath);
348
- if (!fs.existsSync(logDir)) fs.mkdirSync(logDir, { recursive: true });
349
-
350
- let usageLog: Record<string, number> = {};
351
-
300
+ if (!fs.existsSync(logDir))
301
+ fs.mkdirSync(logDir, { recursive: true });
302
+ let usageLog = {};
352
303
  if (fs.existsSync(logPath)) {
353
304
  try {
354
305
  usageLog = JSON.parse(fs.readFileSync(logPath, 'utf8'));
355
- } catch (e) {
306
+ }
307
+ catch (e) {
356
308
  logger?.error?.(`[PD:LLM] Failed to parse thinking OS usage log: ${String(e)}`);
357
309
  }
358
310
  }
359
-
360
311
  const matches = detectThinkingModelMatches(text, wctx.workspaceDir);
361
312
  for (const match of matches) {
362
313
  usageLog[match.modelId] = (usageLog[match.modelId] || 0) + 1;
363
314
  }
364
-
365
315
  usageLog._total_turns = (usageLog._total_turns || 0) + 1;
366
-
367
316
  try {
368
317
  atomicWriteFileSync(logPath, JSON.stringify(usageLog, null, 2));
369
- } catch (e) {
318
+ }
319
+ catch (e) {
370
320
  logger?.error?.(`[PD:LLM] Failed to write thinking OS usage log: ${String(e)}`);
371
321
  }
372
-
373
322
  if (matches.length === 0) {
374
323
  return;
375
324
  }
376
-
377
325
  if (sessionId) {
378
326
  recordThinkingCheckpoint(sessionId, wctx.workspaceDir);
379
327
  }
380
-
381
328
  if (!sessionId || !assistantTurnId) {
382
329
  return;
383
330
  }
384
-
385
331
  const uiDb = new ControlUiDatabase({ workspaceDir: wctx.workspaceDir });
386
332
  try {
387
333
  const recentContext = uiDb.getRecentThinkingContext(sessionId, createdAt);
@@ -399,7 +345,6 @@ function trackThinkingModelUsage(args: {
399
345
  eventType: event.eventType,
400
346
  }));
401
347
  const triggerExcerpt = text.length > 280 ? `${text.slice(0, 277)}...` : text;
402
-
403
348
  for (const match of matches) {
404
349
  const scenarios = deriveThinkingScenarios(match.modelId, {
405
350
  recentToolCalls: toolContext,
@@ -413,7 +358,6 @@ function trackThinkingModelUsage(args: {
413
358
  })),
414
359
  recentPrincipleEvents: principleContext,
415
360
  });
416
-
417
361
  uiDb.recordThinkingModelEvent({
418
362
  sessionId,
419
363
  runId,
@@ -428,9 +372,11 @@ function trackThinkingModelUsage(args: {
428
372
  createdAt,
429
373
  });
430
374
  }
431
- } catch (error) {
375
+ }
376
+ catch (error) {
432
377
  logger?.warn?.(`[PD:LLM] Failed to persist thinking model events: ${String(error)}`);
433
- } finally {
378
+ }
379
+ finally {
434
380
  uiDb.dispose();
435
381
  }
436
382
  }
@@ -0,0 +1,24 @@
1
+ import type { PluginHookBeforeMessageWriteEvent, PluginHookBeforeMessageWriteResult } from '../openclaw-sdk.js';
2
+ import { convergePath, MAX_EVIDENCE_VALUE_CHARS } from '@principles/core/runtime-v2';
3
+ export { MAX_EVIDENCE_VALUE_CHARS, convergePath };
4
+ /**
5
+ * Sanitize a single string value for evidence storage.
6
+ * Delegates to core sanitizer with optional workspaceDir for path convergence.
7
+ */
8
+ export declare function sanitizeForEvidence(value: unknown, workspaceDir?: string): string;
9
+ /**
10
+ * Recursively sanitize any value for evidence storage.
11
+ * Delegates to core sanitizer.
12
+ */
13
+ export declare function sanitizeValueForEvidence(value: unknown, workspaceDir?: string): unknown;
14
+ /**
15
+ * Sanitize tool-call params for evidence/trajectory storage.
16
+ * Delegates to core sanitizer — accepts unknown, runtime-validates.
17
+ *
18
+ * ERR-001: no `as` casts on input
19
+ * ERR-055: ANY-segment sensitive field matching
20
+ * ERR-056: token redaction on ALL strings via recursive sanitizeValue
21
+ */
22
+ export declare function sanitizeToolParamsForEvidence(params: unknown, workspaceDir?: string): Record<string, unknown>;
23
+ export declare function sanitizeAssistantText(text: string): string;
24
+ export declare function handleBeforeMessageWrite(event: PluginHookBeforeMessageWriteEvent): PluginHookBeforeMessageWriteResult | void;
@@ -0,0 +1,77 @@
1
+ import { sanitizeString as coreSanitizeString, sanitizeValue as coreSanitizeValue, sanitizeToolParams as coreSanitizeToolParams, convergePath, MAX_EVIDENCE_VALUE_CHARS, } from '@principles/core/runtime-v2';
2
+ const INTERNAL_TAG_PATTERNS = [
3
+ /\[EMOTIONAL_DAMAGE_DETECTED(?::(?:mild|moderate|severe))?\]/gi,
4
+ /\[EMPATHY_ROLLBACK_REQUEST\]/gi,
5
+ /<empathy\s+[^>]*\/?>(?:<\/empathy>)?/gi,
6
+ ];
7
+ /**
8
+ * Type predicate: true if msg is an assistant message with content.
9
+ * Used for safe narrowing after spread operations on message union.
10
+ */
11
+ function isAssistantMessageWithContent(msg) {
12
+ return (typeof msg === 'object' &&
13
+ msg !== null &&
14
+ msg.role === 'assistant' &&
15
+ typeof msg.content === 'string');
16
+ }
17
+ // Re-export core constants and functions for backward compatibility
18
+ export { MAX_EVIDENCE_VALUE_CHARS, convergePath };
19
+ /**
20
+ * Sanitize a single string value for evidence storage.
21
+ * Delegates to core sanitizer with optional workspaceDir for path convergence.
22
+ */
23
+ export function sanitizeForEvidence(value, workspaceDir) {
24
+ if (value === null || value === undefined)
25
+ return '';
26
+ return coreSanitizeString(String(value), workspaceDir);
27
+ }
28
+ /**
29
+ * Recursively sanitize any value for evidence storage.
30
+ * Delegates to core sanitizer.
31
+ */
32
+ export function sanitizeValueForEvidence(value, workspaceDir) {
33
+ return coreSanitizeValue(value, 0, workspaceDir);
34
+ }
35
+ /**
36
+ * Sanitize tool-call params for evidence/trajectory storage.
37
+ * Delegates to core sanitizer — accepts unknown, runtime-validates.
38
+ *
39
+ * ERR-001: no `as` casts on input
40
+ * ERR-055: ANY-segment sensitive field matching
41
+ * ERR-056: token redaction on ALL strings via recursive sanitizeValue
42
+ */
43
+ export function sanitizeToolParamsForEvidence(params, workspaceDir) {
44
+ return coreSanitizeToolParams(params, workspaceDir);
45
+ }
46
+ export function sanitizeAssistantText(text) {
47
+ let result = text;
48
+ for (const pattern of INTERNAL_TAG_PATTERNS) {
49
+ result = result.replace(pattern, '');
50
+ }
51
+ return result
52
+ .replace(/[ \t]+\n/g, '\n')
53
+ .replace(/\n{3,}/g, '\n\n')
54
+ .trim();
55
+ }
56
+ export function handleBeforeMessageWrite(event) {
57
+ const msg = event.message;
58
+ if (!msg || msg.role !== 'assistant')
59
+ return;
60
+ if (isAssistantMessageWithContent(msg)) {
61
+ const sanitized = sanitizeAssistantText(msg.content);
62
+ if (sanitized !== msg.content) {
63
+ return { message: { ...msg, content: sanitized } };
64
+ }
65
+ return;
66
+ }
67
+ if (Array.isArray(msg.content)) {
68
+ const next = msg.content.map((part) => {
69
+ if (part && typeof part === 'object' && part.type === 'text' && typeof part.text === 'string') {
70
+ return { ...part, text: sanitizeAssistantText(part.text) };
71
+ }
72
+ return part;
73
+ });
74
+ return { message: { ...msg, content: next } };
75
+ }
76
+ return;
77
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Pain Hook — PRI-326 decomposed
3
+ *
4
+ * After-tool-call hook that captures tool failures and emits pain signals.
5
+ *
6
+ * Pipeline stages (delegated to after-tool-call-helpers):
7
+ * 1. classifyToolCallOutcome — determine failure/success + source
8
+ * 2. buildToolCallObservation — normalize event into observation
9
+ * 3. handleFrictionTracking — GFI, event log, trajectory recording
10
+ * 4. handleProbationFeedback — probation attribution + cleanup
11
+ * 5. evaluatePainAdmission — triage + gate evaluation
12
+ * 6. emitPainIfAdmitted — pain signal emission
13
+ *
14
+ * The manual pain path (toolName === 'pain') remains inline because it
15
+ * has a different control flow (early return, no triage, no gate on cooldown).
16
+ */
17
+ import { WorkspaceContext } from '../core/workspace-context.js';
18
+ import type { EvolutionLoopEvent } from '../core/evolution-types.js';
19
+ import type { PluginHookAfterToolCallEvent, PluginHookToolContext, OpenClawPluginApi } from '../openclaw-sdk.js';
20
+ import { buildTrajectoryEvidence } from './trajectory-evidence.js';
21
+ export { buildTrajectoryEvidence };
22
+ export declare function emitPainDetectedEvent(wctx: WorkspaceContext, event: EvolutionLoopEvent): Promise<void>;
23
+ /**
24
+ * Handle after_tool_call hook — decomposed into pipeline stages.
25
+ *
26
+ * Pipeline: classify → record → triage → gate → emit
27
+ *
28
+ * Manual pain (toolName === 'pain') is handled inline with early return.
29
+ */
30
+ export declare function handleAfterToolCall(event: PluginHookAfterToolCallEvent, ctx: PluginHookToolContext & {
31
+ workspaceDir?: string;
32
+ pluginConfig?: Record<string, unknown>;
33
+ }, api?: OpenClawPluginApi): void;