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
@@ -0,0 +1,636 @@
1
+ import * as fs from 'fs';
2
+ import Database from 'better-sqlite3';
3
+ import * as path from 'path';
4
+ import { readPainFlagData } from '../core/pain.js';
5
+ import { listSessions } from '../core/session-tracker.js';
6
+ import { WorkspaceContext } from '../core/workspace-context.js';
7
+ import { evaluatePhase3Inputs } from './phase3-input-filter.js';
8
+ import { TrajectoryRegistry } from '../core/trajectory.js';
9
+ import { buildGfiWorkspaceSnapshot } from '@principles/core/runtime-v2';
10
+ const MAX_SOURCE_EVENTS = 5;
11
+ const GFI_PARTIAL_WARNING = 'GFI source attribution remains partial in Phase 2b because only the empathy slice is source-attributed; most non-empathy friction still lacks full per-source attribution.';
12
+ const DAILY_GFI_WARNING = 'daily-stats.gfi is not authoritative in Phase 1 and is used only as a fallback reference.';
13
+ const EVENT_BUFFER_WARNING = 'Live event buffer is unavailable in this context, so status may lag until events.jsonl flushes.';
14
+ function pushWarning(warnings, message) {
15
+ if (!warnings.includes(message)) {
16
+ warnings.push(message);
17
+ }
18
+ }
19
+ /**
20
+ * YAML-SSOT-03: resolve a dot-path (e.g. 'evolution.nocturnalDreamerCompleted') from dailyStats.
21
+ * Returns { count, resolvable } to distinguish "field not found / non-numeric" from "legitimate zero".
22
+ */
23
+ function resolveStatsField(stats, dotPath) {
24
+ const parts = dotPath.split('.');
25
+ let current = stats;
26
+ for (const part of parts) {
27
+ if (current == null || typeof current !== 'object')
28
+ return { count: 0, resolvable: false };
29
+ current = current[part];
30
+ }
31
+ if (typeof current === 'number') {
32
+ return { count: current, resolvable: true };
33
+ }
34
+ return { count: 0, resolvable: false };
35
+ }
36
+ export class RuntimeSummaryService {
37
+ static getSummary(workspaceDir, options) {
38
+ const generatedAt = new Date().toISOString();
39
+ const warnings = [];
40
+ const wctx = WorkspaceContext.fromHookContext({ workspaceDir });
41
+ const sessions = this.mergeSessionSnapshots(this.readSessions(wctx.resolve('SESSION_DIR'), warnings), workspaceDir);
42
+ const selectedSession = this.selectSession(sessions, options?.sessionId ?? null);
43
+ const selectedSessionId = selectedSession.session?.sessionId ?? null;
44
+ const persistedEvents = this.readEvents(path.join(wctx.stateDir, 'logs'), warnings);
45
+ const hasBufferedEventAccess = typeof wctx.eventLog.getBufferedEvents === 'function';
46
+ const bufferedEvents = hasBufferedEventAccess
47
+ ? wctx.eventLog.getBufferedEvents()
48
+ : [];
49
+ const events = this.mergeEvents(persistedEvents, bufferedEvents);
50
+ const dailyStats = this.readJsonFile(path.join(wctx.stateDir, 'logs', 'daily-stats.json'), warnings, false);
51
+ // Unified date for all "today"-scope reads in this summary — ensures funnel counts,
52
+ // heartbeat stats, and dailyStats all agree on the same date and never contradict.
53
+ const todayStr = generatedAt.slice(0, 10);
54
+ // YAML-SSOT-02/03: build workflowFunnels from funnels Map if provided
55
+ let workflowFunnelsOutput;
56
+ if (options?.funnels) {
57
+ workflowFunnelsOutput = [];
58
+ for (const [funnelKey, stages] of options.funnels) {
59
+ const stageOutputs = stages.map(stage => {
60
+ const { count, resolvable } = resolveStatsField(dailyStats?.[todayStr], stage.statsField);
61
+ return {
62
+ key: stage.name,
63
+ label: stage.name,
64
+ statsField: stage.statsField,
65
+ count,
66
+ _resolvable: resolvable, // internal tag for degraded detection
67
+ };
68
+ });
69
+ workflowFunnelsOutput.push({ funnelKey, funnelLabel: funnelKey, stages: stageOutputs });
70
+ }
71
+ }
72
+ // YAML-SSOT-04: warn for any unresolvable statsField paths
73
+ let hasUnresolvableStage = false;
74
+ if (workflowFunnelsOutput) {
75
+ for (const funnel of workflowFunnelsOutput) {
76
+ for (const stage of funnel.stages) {
77
+ if (!stage._resolvable) {
78
+ hasUnresolvableStage = true;
79
+ pushWarning(warnings, `statsField not resolvable: ${stage.statsField}`);
80
+ }
81
+ }
82
+ }
83
+ }
84
+ // DEGRADED-01/02: status is degraded when YAML load errors or unresolvable statsField paths exist
85
+ const loaderWarnings = options?.loaderWarnings ?? [];
86
+ if (loaderWarnings.length > 0) {
87
+ for (const w of loaderWarnings) {
88
+ pushWarning(warnings, `YAML load warning: ${w}`);
89
+ }
90
+ }
91
+ const status = (loaderWarnings.length > 0 || hasUnresolvableStage) ? 'degraded' : 'ok';
92
+ // GFI peak — use today's data (consistent with funnel/heartbeat)
93
+ const dailyGfiPeak = dailyStats?.[todayStr]?.gfi?.peak;
94
+ const gfiCurrent = selectedSession.session && Number.isFinite(selectedSession.session.currentGfi)
95
+ ? Number(selectedSession.session.currentGfi)
96
+ : null;
97
+ const sessionPeak = selectedSession.session && Number.isFinite(selectedSession.session.dailyGfiPeak)
98
+ ? Number(selectedSession.session.dailyGfiPeak)
99
+ : null;
100
+ const gfiPeak = sessionPeak ?? (Number.isFinite(dailyGfiPeak) ? Number(dailyGfiPeak) : null);
101
+ // PRI-78/PRI-82: Build authoritative GFI workspace snapshot (active vs stale)
102
+ // Uses real persisted GFI fields: gfiBySource, consecutiveErrors, lastErrorSource,
103
+ // lastGfiDecayAt, dailyGfiPeak from session-tracker persistence.
104
+ const gfiWorkspaceSnapshot = buildGfiWorkspaceSnapshot({
105
+ sessions: sessions.map((s) => ({
106
+ sessionId: s.sessionId,
107
+ currentGfi: s.currentGfi ?? 0,
108
+ gfiBySource: s.gfiBySource ?? {},
109
+ consecutiveErrors: s.consecutiveErrors ?? 0,
110
+ lastErrorSource: s.lastErrorSource,
111
+ lastGfiDecayAt: s.lastGfiDecayAt,
112
+ dailyGfiPeak: s.dailyGfiPeak,
113
+ lastActivityAt: s.lastControlActivityAt ?? s.lastActivityAt ?? 0,
114
+ })),
115
+ nowMs: Date.now(),
116
+ });
117
+ pushWarning(warnings, GFI_PARTIAL_WARNING);
118
+ if (sessionPeak === null && Number.isFinite(dailyGfiPeak)) {
119
+ pushWarning(warnings, DAILY_GFI_WARNING);
120
+ }
121
+ if (!hasBufferedEventAccess) {
122
+ pushWarning(warnings, EVENT_BUFFER_WARNING);
123
+ }
124
+ if (!selectedSession.session) {
125
+ pushWarning(warnings, 'No persisted session state was found; current session GFI is unavailable.');
126
+ }
127
+ const queue = this.readJsonFile(wctx.resolve('EVOLUTION_QUEUE'), warnings, false);
128
+ // compatibility-only display artifact - not a truth source for Phase 3 eligibility
129
+ // queue is the only authoritative execution truth source for Phase 3
130
+ const directive = this.readJsonFile(wctx.resolve('EVOLUTION_DIRECTIVE'), warnings, false);
131
+ const queueStats = this.buildQueueStats(queue);
132
+ const directiveSummary = this.buildDirectiveSummary(queue, directive, generatedAt, warnings);
133
+ const painFlag = readPainFlagData(workspaceDir);
134
+ const painCandidates = this.readJsonFile(wctx.resolve('PAIN_CANDIDATES'), warnings, false);
135
+ const phase3Inputs = evaluatePhase3Inputs(queue ?? []);
136
+ const lastPainSignal = this.findLastPainSignal(events, selectedSessionId);
137
+ const gfiSources = this.buildGfiSources(events, selectedSessionId);
138
+ const gateStats = this.buildGateStats(events, selectedSessionId, warnings);
139
+ // D: Runtime Diagnostician chain (M8) — queries runtime-v2 SQLite task store
140
+ // Read heartbeat diagnosis stats from daily event log
141
+ const diagDailyStats = dailyStats?.[todayStr]?.evolution;
142
+ let pendingRuntimeDiagTasks = 0;
143
+ try {
144
+ const taskStoreDbPath = path.join(wctx.stateDir, '.principles', 'db', 'task-store.db');
145
+ if (fs.existsSync(taskStoreDbPath)) {
146
+ const db = new Database(taskStoreDbPath, { readonly: true });
147
+ const row = db.prepare(`
148
+ SELECT COUNT(*) as count FROM tasks
149
+ WHERE task_kind = 'diagnostician' AND status = 'pending'
150
+ `).get();
151
+ pendingRuntimeDiagTasks = row?.count ?? 0;
152
+ db.close();
153
+ }
154
+ }
155
+ catch { /* task store not yet initialized — 0 pending */ }
156
+ // TODO(PRI-XXX): distinguish "not initialized" from permission/corruption/query errors
157
+ const runtimeDiagnosis = {
158
+ pendingTasks: pendingRuntimeDiagTasks,
159
+ tasksWrittenToday: diagDailyStats?.diagnosisTasksWritten ?? 0,
160
+ reportsWrittenToday: diagDailyStats?.diagnosticianReportsWritten ?? 0,
161
+ reportsMissingJsonToday: diagDailyStats?.reportsMissingJson ?? 0,
162
+ reportsIncompleteFieldsToday: diagDailyStats?.reportsIncompleteFields ?? 0,
163
+ candidatesCreatedToday: diagDailyStats?.principleCandidatesCreated ?? 0,
164
+ heartbeatsInjectedToday: diagDailyStats?.heartbeatsInjected ?? 0,
165
+ };
166
+ // D: Stall detection — high-signal warning when the diagnostician loop appears broken.
167
+ // Conditions: tasks are being injected (heartbeats > 0) but no reports are being written.
168
+ if (runtimeDiagnosis.heartbeatsInjectedToday > 0 &&
169
+ runtimeDiagnosis.reportsWrittenToday === 0 &&
170
+ runtimeDiagnosis.pendingTasks > 0) {
171
+ pushWarning(warnings, 'Diagnostician appears stalled: heartbeats are injecting tasks ' +
172
+ `(${runtimeDiagnosis.heartbeatsInjectedToday}) but no reports are being written. ` +
173
+ `${runtimeDiagnosis.pendingTasks} task(s) remain pending. ` +
174
+ 'Check prompt injection size limits and diagnostician task processing.');
175
+ }
176
+ // Read trajectory analytics data (historical data, NOT runtime truth)
177
+ const trajectoryStats = this.readTrajectoryStats(workspaceDir, warnings);
178
+ // Build runtime truth section (current state for control decisions)
179
+ const activeSessionIds = sessions.map(s => s.sessionId);
180
+ const runtimeTruth = {
181
+ queueState: {
182
+ total: queueStats.pending + queueStats.inProgress + queueStats.completed,
183
+ pending: queueStats.pending,
184
+ inProgress: queueStats.inProgress,
185
+ completed: queueStats.completed,
186
+ lastUpdated: generatedAt,
187
+ },
188
+ activeSessions: activeSessionIds,
189
+ };
190
+ // Build analytics truth section (historical data for insights)
191
+ const analyticsTruth = {
192
+ trajectoryData: {
193
+ totalTasks: trajectoryStats.assistantTurns + trajectoryStats.userTurns,
194
+ successRate: trajectoryStats.toolCalls > 0
195
+ ? (trajectoryStats.toolCalls - trajectoryStats.failures) / trajectoryStats.toolCalls
196
+ : 0,
197
+ timeoutRate: trajectoryStats.failures > 0
198
+ ? trajectoryStats.failures / (trajectoryStats.assistantTurns + trajectoryStats.userTurns || 1)
199
+ : 0,
200
+ lastUpdated: trajectoryStats.lastIngestAt ?? generatedAt,
201
+ },
202
+ dailyStats: {
203
+ toolCalls: dailyStats?.[todayStr]?.toolCalls ?? 0,
204
+ painSignals: dailyStats?.[todayStr]?.painSignals ?? 0,
205
+ evolutionTasks: dailyStats?.[todayStr]?.evolutionTasks ?? 0,
206
+ lastUpdated: todayStr,
207
+ },
208
+ trends: {
209
+ sevenDay: { successRateChange: 0, toolCallVolumeChange: 0, painSignalRateChange: 0 },
210
+ thirtyDay: { successRateChange: 0, toolCallVolumeChange: 0, painSignalRateChange: 0 },
211
+ },
212
+ };
213
+ return {
214
+ runtime: runtimeTruth,
215
+ analytics: analyticsTruth,
216
+ gfi: {
217
+ current: gfiCurrent,
218
+ peak: gfiPeak,
219
+ sources: gfiSources,
220
+ dataQuality: 'partial',
221
+ workspaceSnapshot: gfiWorkspaceSnapshot,
222
+ },
223
+ evolution: {
224
+ queue: queueStats,
225
+ directive: directiveSummary,
226
+ dataQuality: this.resolveEvolutionDataQuality(queue),
227
+ },
228
+ phase3: {
229
+ queueTruthReady: phase3Inputs.queueTruthReady,
230
+ phase3ShadowEligible: phase3Inputs.phase3ShadowEligible,
231
+ evolutionEligible: phase3Inputs.evolution.eligible.length,
232
+ evolutionReferenceOnly: phase3Inputs.evolution.referenceOnly.length,
233
+ evolutionReferenceOnlyReasons: [...new Set(phase3Inputs.evolution.referenceOnly.map((entry) => entry.classification))],
234
+ evolutionRejected: phase3Inputs.evolution.rejected.length,
235
+ evolutionRejectedReasons: phase3Inputs.evolution.rejected.flatMap((entry) => entry.reasons),
236
+ legacyDirectiveFilePresent: directive !== null,
237
+ directiveStatus: directive ? 'compatibility-only' : 'missing',
238
+ directiveIgnoredReason: 'queue is only truth source',
239
+ eligibilitySource: 'runtime_truth',
240
+ },
241
+ pain: {
242
+ activeFlag: Object.keys(painFlag).length > 0,
243
+ activeFlagSource: painFlag.source || null,
244
+ candidates: painCandidates?.candidates && typeof painCandidates.candidates === 'object'
245
+ ? Object.keys(painCandidates.candidates).length
246
+ : null,
247
+ lastSignal: lastPainSignal,
248
+ },
249
+ gate: gateStats,
250
+ // D: Heartbeat Diagnostician chain
251
+ runtimeDiagnosis,
252
+ ...(workflowFunnelsOutput && { workflowFunnels: workflowFunnelsOutput }),
253
+ metadata: {
254
+ generatedAt,
255
+ workspaceDir,
256
+ sessionId: selectedSessionId,
257
+ selectedSessionReason: selectedSession.reason,
258
+ status,
259
+ warnings,
260
+ },
261
+ };
262
+ }
263
+ static readSessions(sessionDir, warnings) {
264
+ if (!fs.existsSync(sessionDir)) {
265
+ pushWarning(warnings, 'No persisted session directory exists yet; session-scoped runtime state is unavailable.');
266
+ return [];
267
+ }
268
+ const sessions = [];
269
+ for (const file of fs.readdirSync(sessionDir)) {
270
+ if (!file.endsWith('.json'))
271
+ continue;
272
+ try {
273
+ const raw = fs.readFileSync(path.join(sessionDir, file), 'utf8');
274
+ const parsed = JSON.parse(raw);
275
+ if (parsed?.sessionId) {
276
+ sessions.push(parsed);
277
+ }
278
+ }
279
+ catch {
280
+ pushWarning(warnings, `Failed to parse session snapshot: ${file}`);
281
+ }
282
+ }
283
+ return sessions.sort((a, b) => this.resolveSessionSortTime(b) - this.resolveSessionSortTime(a));
284
+ }
285
+ static selectSession(sessions, explicitSessionId) {
286
+ if (explicitSessionId) {
287
+ const explicit = sessions.find((session) => session.sessionId === explicitSessionId) ?? null;
288
+ return { session: explicit, reason: explicit ? 'explicit' : 'none' };
289
+ }
290
+ if (sessions.length === 0) {
291
+ return { session: null, reason: 'none' };
292
+ }
293
+ return { session: sessions[0], reason: 'latest_active' };
294
+ }
295
+ static mergeSessionSnapshots(persistedSessions, workspaceDir) {
296
+ const merged = new Map();
297
+ for (const session of persistedSessions) {
298
+ merged.set(session.sessionId, { ...session });
299
+ }
300
+ for (const live of listSessions(workspaceDir)) {
301
+ const persisted = merged.get(live.sessionId);
302
+ merged.set(live.sessionId, {
303
+ sessionId: live.sessionId,
304
+ currentGfi: Number.isFinite(live.currentGfi) ? Number(live.currentGfi) : persisted?.currentGfi,
305
+ gfiBySource: live.gfiBySource ? { ...live.gfiBySource } : persisted?.gfiBySource,
306
+ lastErrorSource: live.lastErrorSource || persisted?.lastErrorSource,
307
+ consecutiveErrors: Number.isFinite(live.consecutiveErrors) ? Number(live.consecutiveErrors) : persisted?.consecutiveErrors,
308
+ lastGfiDecayAt: live.lastGfiDecayAt || persisted?.lastGfiDecayAt,
309
+ dailyGfiPeak: Number.isFinite(live.dailyGfiPeak) ? Number(live.dailyGfiPeak) : persisted?.dailyGfiPeak,
310
+ lastActivityAt: Number.isFinite(live.lastActivityAt) ? Number(live.lastActivityAt) : persisted?.lastActivityAt,
311
+ lastControlActivityAt: Number.isFinite(live.lastControlActivityAt)
312
+ ? Number(live.lastControlActivityAt)
313
+ : persisted?.lastControlActivityAt,
314
+ });
315
+ }
316
+ return [...merged.values()].sort((a, b) => this.resolveSessionSortTime(b) - this.resolveSessionSortTime(a));
317
+ }
318
+ static buildQueueStats(queue) {
319
+ const stats = { pending: 0, inProgress: 0, completed: 0 };
320
+ if (!queue)
321
+ return stats;
322
+ for (const item of queue) {
323
+ if (item?.status === 'completed') {
324
+ stats.completed++;
325
+ }
326
+ else if (item?.status === 'in_progress') {
327
+ stats.inProgress++;
328
+ }
329
+ else {
330
+ stats.pending++;
331
+ }
332
+ }
333
+ return stats;
334
+ }
335
+ /**
336
+ * Builds directive summary for compatibility display only.
337
+ * NOT a truth source for Phase 3 eligibility or decisions.
338
+ * Queue is the only authoritative execution truth source.
339
+ */
340
+ static buildDirectiveSummary(queue, directive, generatedAt, warnings) {
341
+ const inProgressTask = this.selectInProgressTask(queue);
342
+ if (!inProgressTask) {
343
+ if (directive) {
344
+ this.warnOnLegacyDirectiveMismatch(directive, null, warnings);
345
+ }
346
+ return {
347
+ exists: false,
348
+ active: null,
349
+ ageSeconds: null,
350
+ taskPreview: null,
351
+ };
352
+ }
353
+ const derivedTaskPreview = this.buildDirectiveTaskPreview(inProgressTask);
354
+ const timestampMs = this.resolveDirectiveTimestamp(inProgressTask);
355
+ const ageSeconds = Number.isFinite(timestampMs)
356
+ ? Math.max(0, Math.floor((new Date(generatedAt).getTime() - timestampMs) / 1000))
357
+ : null;
358
+ if (directive) {
359
+ this.warnOnLegacyDirectiveMismatch(directive, {
360
+ active: true,
361
+ taskPreview: derivedTaskPreview,
362
+ taskId: inProgressTask.taskId ?? inProgressTask.id ?? null,
363
+ }, warnings);
364
+ }
365
+ return {
366
+ exists: true,
367
+ active: true,
368
+ ageSeconds,
369
+ taskPreview: derivedTaskPreview,
370
+ };
371
+ }
372
+ static readEvents(logsDir, warnings) {
373
+ // The event log is stored as daily files: events_YYYY-MM-DD.jsonl.
374
+ // Prefer today's file; fall back to the most recent daily file so that
375
+ // gate/pain stats are still populated when the day rolled over.
376
+ const dir = logsDir;
377
+ let bestFile = null;
378
+ if (fs.existsSync(dir)) {
379
+ const today = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
380
+ // Prefer exact match on today's file
381
+ const todayFile = path.join(dir, `events_${today}.jsonl`);
382
+ if (fs.existsSync(todayFile)) {
383
+ bestFile = todayFile;
384
+ }
385
+ else {
386
+ // Fallback: pick the most recent file by date embedded in the filename
387
+ // (lexical comparison works for ISO dates YYYY-MM-DD).
388
+ let newestDate = '';
389
+ try {
390
+ for (const file of fs.readdirSync(dir)) {
391
+ const m = file.match(/^events_(\d{4}-\d{2}-\d{2})\.jsonl$/);
392
+ if (!m)
393
+ continue;
394
+ const fileDate = m[1];
395
+ if (fileDate > newestDate) {
396
+ newestDate = fileDate;
397
+ bestFile = path.join(dir, file);
398
+ }
399
+ }
400
+ }
401
+ catch { /* ignore scan errors */ }
402
+ }
403
+ }
404
+ if (!bestFile) {
405
+ pushWarning(warnings, 'No event log file found; recent pain and gate summaries are partial. ' +
406
+ 'Expected format: events_YYYY-MM-DD.jsonl in the logs directory.');
407
+ return [];
408
+ }
409
+ try {
410
+ const raw = fs.readFileSync(bestFile, 'utf8').trim();
411
+ if (!raw)
412
+ return [];
413
+ let parseFailures = 0;
414
+ const entries = raw
415
+ .split('\n')
416
+ .map((line) => {
417
+ try {
418
+ return JSON.parse(line);
419
+ }
420
+ catch {
421
+ parseFailures += 1;
422
+ return null;
423
+ }
424
+ })
425
+ .filter((entry) => entry !== null);
426
+ if (parseFailures > 0) {
427
+ pushWarning(warnings, `Skipped ${parseFailures} malformed event line${parseFailures === 1 ? '' : 's'} while reading ${path.basename(bestFile)}.`);
428
+ }
429
+ return entries;
430
+ }
431
+ catch {
432
+ pushWarning(warnings, `Failed to read ${path.basename(bestFile)}; recent pain and gate summaries are partial.`);
433
+ return [];
434
+ }
435
+ }
436
+ static buildGfiSources(events, sessionId) {
437
+ const filtered = events
438
+ .filter((entry) => {
439
+ if (sessionId && entry.sessionId !== sessionId)
440
+ return false;
441
+ return (entry.type === 'pain_signal' ||
442
+ (entry.type === 'tool_call' && entry.category === 'failure'));
443
+ })
444
+ .slice(-MAX_SOURCE_EVENTS)
445
+ .reverse();
446
+ return filtered.map((entry) => {
447
+ if (entry.type === 'pain_signal') {
448
+ return {
449
+ source: String(entry.data?.source ?? 'pain_signal'),
450
+ score: this.asFiniteNumber(entry.data?.score),
451
+ ts: entry.ts,
452
+ confidence: this.asFiniteNumber(entry.data?.confidence),
453
+ origin: typeof entry.data?.origin === 'string' ? entry.data.origin : undefined,
454
+ };
455
+ }
456
+ return {
457
+ source: `tool_failure:${String(entry.data?.toolName ?? 'unknown')}`,
458
+ score: this.asFiniteNumber(entry.data?.gfiAfter ?? entry.data?.gfi),
459
+ ts: entry.ts,
460
+ };
461
+ });
462
+ }
463
+ static findLastPainSignal(events, sessionId) {
464
+ for (let i = events.length - 1; i >= 0; i--) {
465
+ const entry = events[i];
466
+ if (entry.type !== 'pain_signal')
467
+ continue;
468
+ if (sessionId && entry.sessionId !== sessionId)
469
+ continue;
470
+ return {
471
+ source: String(entry.data?.source ?? 'pain_signal'),
472
+ ts: entry.ts ?? null,
473
+ reason: typeof entry.data?.reason === 'string' ? entry.data.reason : null,
474
+ };
475
+ }
476
+ return null;
477
+ }
478
+ static buildGateStats(events, sessionId, warnings) {
479
+ const scoped = events.filter((entry) => {
480
+ if (sessionId && entry.sessionId !== sessionId)
481
+ return false;
482
+ return entry.type === 'gate_block' || entry.type === 'gate_bypass';
483
+ });
484
+ if (scoped.length === 0) {
485
+ pushWarning(warnings, 'Gate block counts before Phase 1 may be incomplete because older block events were not recorded to event-log.');
486
+ }
487
+ return {
488
+ recentBlocks: scoped.filter((entry) => entry.type === 'gate_block').length,
489
+ recentBypasses: scoped.filter((entry) => entry.type === 'gate_bypass').length,
490
+ dataQuality: scoped.length > 0 ? 'authoritative' : 'partial',
491
+ };
492
+ }
493
+ static resolveSessionSortTime(session) {
494
+ return session.lastControlActivityAt ?? session.lastActivityAt ?? 0;
495
+ }
496
+ static mergeEvents(persistedEvents, bufferedEvents) {
497
+ const merged = new Map();
498
+ for (const entry of [...persistedEvents, ...bufferedEvents]) {
499
+ merged.set(this.getEventDedupKey(entry), entry);
500
+ }
501
+ return [...merged.values()].sort((a, b) => (a.ts || '').localeCompare(b.ts || ''));
502
+ }
503
+ static getEventDedupKey(entry) {
504
+ const eventId = typeof entry.data?.eventId === 'string' ? entry.data.eventId : null;
505
+ if (eventId) {
506
+ return `${entry.type}:${entry.sessionId ?? 'none'}:${eventId}`;
507
+ }
508
+ return [
509
+ entry.ts ?? 'no-ts',
510
+ entry.type ?? 'no-type',
511
+ entry.category ?? 'no-category',
512
+ entry.sessionId ?? 'no-session',
513
+ typeof entry.data?.source === 'string' ? entry.data.source : 'no-source',
514
+ typeof entry.data?.toolName === 'string' ? entry.data.toolName : 'no-tool',
515
+ typeof entry.data?.reason === 'string' ? entry.data.reason : 'no-reason',
516
+ ].join('::');
517
+ }
518
+ static resolveEvolutionDataQuality(queue) {
519
+ return queue ? 'authoritative' : 'partial';
520
+ }
521
+ static selectInProgressTask(queue) {
522
+ if (!queue || queue.length === 0)
523
+ return null;
524
+ const inProgress = queue.filter((item) => item?.status === 'in_progress');
525
+ if (inProgress.length === 0)
526
+ return null;
527
+ for (const item of [...inProgress].sort((a, b) => this.getQueuePriority(b) - this.getQueuePriority(a))) {
528
+ if (this.isResolvableEvolutionTask(item)) {
529
+ return item;
530
+ }
531
+ }
532
+ return null;
533
+ }
534
+ static getQueuePriority(item) {
535
+ return Number.isFinite(item.score) ? Number(item.score) : 0;
536
+ }
537
+ static isResolvableEvolutionTask(item) {
538
+ const rawTask = typeof item.task === 'string' ? item.task.trim() : '';
539
+ if (rawTask && rawTask.toLowerCase() !== 'undefined') {
540
+ return true;
541
+ }
542
+ return typeof item.id === 'string' && item.id.trim().length > 0;
543
+ }
544
+ static resolveDirectiveTimestamp(item) {
545
+ const candidate = item.started_at || item.enqueued_at || item.timestamp || null;
546
+ return candidate ? new Date(candidate).getTime() : NaN;
547
+ }
548
+ static buildDirectiveTaskPreview(item) {
549
+ const task = typeof item.task === 'string' ? item.task.trim() : '';
550
+ if (task && task.toLowerCase() !== 'undefined') {
551
+ return task.slice(0, 160);
552
+ }
553
+ const triggerTextPreview = typeof item.trigger_text_preview === 'string' ? item.trigger_text_preview.trim() : '';
554
+ const taskId = typeof item.taskId === 'string' && item.taskId.trim()
555
+ ? item.taskId.trim()
556
+ : typeof item.id === 'string' && item.id.trim()
557
+ ? item.id.trim()
558
+ : 'unknown';
559
+ const source = typeof item.source === 'string' && item.source.trim() ? item.source.trim() : 'unknown';
560
+ const reason = typeof item.reason === 'string' && item.reason.trim() ? item.reason.trim() : 'Systemic pain detected';
561
+ const preview = triggerTextPreview || 'N/A';
562
+ return `Diagnose systemic pain [ID: ${taskId}]. Source: ${source}. Reason: ${reason}. Trigger text: "${preview}"`.slice(0, 160);
563
+ }
564
+ static warnOnLegacyDirectiveMismatch(directive, derived, warnings) {
565
+ const legacyActive = typeof directive.active === 'boolean' ? directive.active : null;
566
+ const legacyTask = typeof directive.task === 'string' && directive.task.trim() ? directive.task.trim().slice(0, 160) : null;
567
+ const legacyTaskId = typeof directive.taskId === 'string' && directive.taskId.trim() ? directive.taskId.trim() : null;
568
+ const mismatchDetails = [];
569
+ if (derived === null) {
570
+ if (legacyActive === true || legacyTask || legacyTaskId) {
571
+ mismatchDetails.push('legacy directive exists but queue has no in_progress task');
572
+ }
573
+ }
574
+ else {
575
+ if (legacyActive !== null && legacyActive !== derived.active) {
576
+ mismatchDetails.push(`active=${String(legacyActive)} vs queue=${String(derived.active)}`);
577
+ }
578
+ if (legacyTask && derived.taskPreview && legacyTask !== derived.taskPreview) {
579
+ mismatchDetails.push('task text differs');
580
+ }
581
+ if (legacyTaskId && derived.taskId && legacyTaskId !== derived.taskId) {
582
+ mismatchDetails.push('task id differs');
583
+ }
584
+ }
585
+ if (mismatchDetails.length > 0) {
586
+ pushWarning(warnings, `Legacy directive file disagrees with queue-derived evolution state; queue is authoritative (${mismatchDetails.join(', ')}).`);
587
+ }
588
+ }
589
+ static readJsonFile(filePath, warnings, warnOnMissing) {
590
+ if (!fs.existsSync(filePath)) {
591
+ if (warnOnMissing) {
592
+ pushWarning(warnings, `Missing expected file: ${path.basename(filePath)}`);
593
+ }
594
+ return null;
595
+ }
596
+ try {
597
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
598
+ }
599
+ catch {
600
+ pushWarning(warnings, `Failed to parse ${path.basename(filePath)}.`);
601
+ return null;
602
+ }
603
+ }
604
+ static asFiniteNumber(value) {
605
+ return Number.isFinite(value) ? Number(value) : undefined;
606
+ }
607
+ /**
608
+ * Read trajectory analytics data from trajectory database.
609
+ *
610
+ * Returns: Analytics data (historical metrics) aggregated from trajectory database.
611
+ * Not: Runtime truth or real-time queue state.
612
+ */
613
+ static readTrajectoryStats(workspaceDir, warnings) {
614
+ try {
615
+ // Use transient database instance to avoid locking issues
616
+ const stats = TrajectoryRegistry.use(workspaceDir, (db) => db.getDataStats());
617
+ return {
618
+ assistantTurns: stats.assistantTurns,
619
+ userTurns: stats.userTurns,
620
+ toolCalls: stats.toolCalls,
621
+ failures: stats.painEvents, // Approximate failures from pain events
622
+ lastIngestAt: stats.lastIngestAt,
623
+ };
624
+ }
625
+ catch (error) {
626
+ pushWarning(warnings, `Failed to read trajectory analytics: ${error instanceof Error ? error.message : String(error)}`);
627
+ return {
628
+ assistantTurns: 0,
629
+ userTurns: 0,
630
+ toolCalls: 0,
631
+ failures: 0,
632
+ lastIngestAt: null,
633
+ };
634
+ }
635
+ }
636
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared utility for detecting expected subagent unavailability errors.
3
+ * These occur during cron jobs, boot sessions, daemon mode, or isolated sessions
4
+ * where the gateway request context is not available.
5
+ *
6
+ * Callers should suppress warnings for these errors — they are not real failures.
7
+ */
8
+ export declare function isExpectedSubagentError(err: unknown): boolean;
@@ -5,11 +5,9 @@
5
5
  *
6
6
  * Callers should suppress warnings for these errors — they are not real failures.
7
7
  */
8
-
9
- export function isExpectedSubagentError(err: unknown): boolean {
8
+ export function isExpectedSubagentError(err) {
10
9
  const msg = String(err);
11
- return (
12
- msg.includes('Plugin runtime subagent methods are only available during a gateway request') ||
10
+ return (msg.includes('Plugin runtime subagent methods are only available during a gateway request') ||
13
11
  msg.includes('cannot start workflow for boot session') ||
14
12
  msg.includes('subagent runtime unavailable') ||
15
13
  // #208/#209: Daemon mode — subagent process not connected
@@ -21,6 +19,5 @@ export function isExpectedSubagentError(err: unknown): boolean {
21
19
  // Process isolation in cron jobs
22
20
  msg.includes('process isolation') ||
23
21
  // Review fix: Subagent connection issues in daemon mode (more specific to reduce false positives)
24
- (msg.includes('subagent') && msg.toLowerCase().includes('connection') && (msg.includes('refused') || msg.includes('reset') || msg.includes('econnrefused')))
25
- );
22
+ (msg.includes('subagent') && msg.toLowerCase().includes('connection') && (msg.includes('refused') || msg.includes('reset') || msg.includes('econnrefused'))));
26
23
  }