principles-disciple 1.72.0 → 1.74.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 (319) hide show
  1. package/INSTALL.md +1 -3
  2. package/openclaw.plugin.json +10 -5
  3. package/package.json +17 -19
  4. package/scripts/acceptance-test.mjs +16 -73
  5. package/scripts/sync-plugin.mjs +382 -77
  6. package/src/commands/archive-impl.ts +2 -1
  7. package/src/commands/capabilities.ts +2 -2
  8. package/src/commands/context.ts +2 -2
  9. package/src/commands/disable-impl.ts +2 -1
  10. package/src/commands/evolution-status.ts +16 -16
  11. package/src/commands/export.ts +12 -67
  12. package/src/commands/pain.ts +91 -1
  13. package/src/commands/principle-rollback.ts +2 -1
  14. package/src/commands/promote-impl.ts +7 -43
  15. package/src/commands/rollback-impl.ts +2 -1
  16. package/src/commands/rollback.ts +2 -1
  17. package/src/commands/samples.ts +2 -1
  18. package/src/commands/thinking-os.ts +2 -1
  19. package/src/config/errors.ts +18 -2
  20. package/src/constants/diagnostician.ts +2 -2
  21. package/src/constants/tools.ts +2 -1
  22. package/src/core/__tests__/focus-history.test.ts +210 -0
  23. package/src/core/config.ts +1 -1
  24. package/src/core/correction-cue-learner.ts +2 -136
  25. package/src/core/correction-types.ts +16 -88
  26. package/src/core/dictionary.ts +19 -20
  27. package/src/core/empathy-keyword-matcher.ts +17 -289
  28. package/src/core/empathy-types.ts +18 -229
  29. package/src/core/event-log.ts +29 -132
  30. package/src/core/evolution-reducer.ts +21 -2
  31. package/src/core/evolution-types.ts +76 -464
  32. package/src/core/file-store.ts +80 -0
  33. package/src/core/focus-history.ts +228 -955
  34. package/src/core/local-worker-routing.ts +34 -314
  35. package/src/core/merge-gate-audit.ts +0 -195
  36. package/src/core/migration.ts +0 -1
  37. package/src/core/pain-diagnostic-gate.ts +154 -0
  38. package/src/core/pain-signal.ts +21 -138
  39. package/src/core/pain.ts +15 -88
  40. package/src/core/path-resolver.ts +0 -1
  41. package/src/core/paths.ts +0 -1
  42. package/src/core/pd-task-reconciler.ts +26 -115
  43. package/src/core/pd-task-service.ts +9 -9
  44. package/src/core/pd-task-types.ts +23 -127
  45. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  46. package/src/core/principle-compiler/code-validator.ts +15 -42
  47. package/src/core/principle-compiler/compiler.ts +100 -15
  48. package/src/core/principle-compiler/index.ts +5 -2
  49. package/src/core/principle-compiler/template-generator.ts +4 -104
  50. package/src/core/principle-injection.ts +10 -202
  51. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  52. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  53. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  54. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  55. package/src/core/principle-tree-ledger.ts +8 -6
  56. package/src/core/reflection/reflection-context.ts +14 -109
  57. package/src/core/replay-engine.ts +8 -500
  58. package/src/core/rule-host-helpers.ts +5 -35
  59. package/src/core/rule-host-types.ts +10 -82
  60. package/src/core/rule-host.ts +6 -63
  61. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  62. package/src/core/session-tracker.ts +87 -101
  63. package/src/core/shadow-observation-registry.ts +19 -48
  64. package/src/core/trajectory.ts +3 -1
  65. package/src/core/workflow-funnel-loader.ts +62 -68
  66. package/src/core/workspace-context.ts +46 -0
  67. package/src/core/workspace-dir-service.ts +1 -1
  68. package/src/core/workspace-dir-validation.ts +18 -9
  69. package/src/hooks/AGENTS.md +1 -1
  70. package/src/hooks/gate-block-helper.ts +71 -64
  71. package/src/hooks/gate.ts +183 -31
  72. package/src/hooks/lifecycle.ts +30 -32
  73. package/src/hooks/llm.ts +60 -32
  74. package/src/hooks/pain.ts +297 -103
  75. package/src/hooks/prompt.ts +400 -440
  76. package/src/hooks/subagent.ts +2 -29
  77. package/src/i18n/commands.ts +2 -10
  78. package/src/index.ts +95 -85
  79. package/src/openclaw-sdk.ts +311 -0
  80. package/src/service/central-database.ts +8 -4
  81. package/src/service/evolution-queue-migration.ts +2 -1
  82. package/src/service/evolution-worker.ts +163 -1786
  83. package/src/service/internalization-trigger-adapter.ts +302 -0
  84. package/src/service/keyword-optimization-service.ts +4 -4
  85. package/src/service/monitoring-query-service.ts +1 -215
  86. package/src/service/queue-io.ts +60 -331
  87. package/src/service/runtime-summary-service.ts +59 -16
  88. package/src/service/subagent-workflow/index.ts +0 -41
  89. package/src/service/subagent-workflow/types.ts +9 -120
  90. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  91. package/src/service/workflow-watchdog.ts +0 -43
  92. package/src/types/event-payload.ts +16 -74
  93. package/src/types/event-types.ts +38 -547
  94. package/src/types/hygiene-types.ts +7 -30
  95. package/src/types/principle-tree-schema.ts +20 -222
  96. package/src/types/queue.ts +15 -70
  97. package/src/types/runtime-summary.ts +5 -49
  98. package/src/utils/io.ts +8 -20
  99. package/src/utils/retry.ts +1 -1
  100. package/src/utils/shadow-fingerprint.ts +2 -2
  101. package/src/utils/workspace-resolver.ts +50 -0
  102. package/templates/langs/en/core/AGENTS.md +7 -7
  103. package/templates/langs/en/core/BOOT.md +1 -1
  104. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  105. package/templates/langs/en/principles/THINKING_OS.md +3 -2
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  107. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  108. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  109. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  110. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  111. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  112. package/templates/langs/en/skills/evolve-task/SKILL.md +3 -3
  113. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  114. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  115. package/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
  116. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  117. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  118. package/templates/langs/zh/core/AGENTS.md +7 -7
  119. package/templates/langs/zh/core/BOOT.md +1 -1
  120. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  121. package/templates/langs/zh/principles/THINKING_OS.md +3 -2
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  127. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  128. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  129. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  130. package/templates/langs/zh/skills/evolve-task/SKILL.md +4 -4
  131. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  132. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  133. package/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
  134. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  135. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  136. package/tests/build-artifacts.test.ts +1 -3
  137. package/tests/commands/evolution-status.test.ts +0 -118
  138. package/tests/core/bootstrap-rules.test.ts +1 -1
  139. package/tests/core/config.test.ts +1 -1
  140. package/tests/core/event-log.test.ts +35 -0
  141. package/tests/core/evolution-engine.test.ts +610 -0
  142. package/tests/core/file-store.test.ts +102 -0
  143. package/tests/core/focus-history.test.ts +203 -11
  144. package/tests/core/merge-gate-audit.test.ts +2 -169
  145. package/tests/core/migration.test.ts +7 -7
  146. package/tests/core/model-deployment-registry.test.ts +7 -1
  147. package/tests/core/model-training-registry.test.ts +19 -0
  148. package/tests/core/observability.test.ts +0 -1
  149. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  150. package/tests/core/pain.test.ts +0 -1
  151. package/tests/core/path-resolver.test.ts +1 -1
  152. package/tests/core/paths-refactor.test.ts +0 -22
  153. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  154. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  155. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  156. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  157. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  158. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  159. package/tests/core/reflection-context.test.ts +0 -14
  160. package/tests/core/replay-engine.test.ts +127 -215
  161. package/tests/core/rule-host-helpers.test.ts +2 -2
  162. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  163. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  164. package/tests/core/workspace-context.test.ts +2 -2
  165. package/tests/core/workspace-dir-validation.test.ts +8 -1
  166. package/tests/core-anti-growth.test.ts +191 -0
  167. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  168. package/tests/hooks/confirm-first-removal.test.ts +188 -0
  169. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  170. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  171. package/tests/hooks/gate-no-path-write-tool.test.ts +172 -0
  172. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  173. package/tests/hooks/pain.test.ts +269 -12
  174. package/tests/hooks/prompt-characterization.test.ts +500 -0
  175. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  176. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  177. package/tests/index.test.ts +94 -1
  178. package/tests/integration/auto-entry-gate.test.ts +248 -0
  179. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  180. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  181. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  182. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  183. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  184. package/tests/service/central-database.test.ts +457 -0
  185. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  186. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  187. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  188. package/tests/service/monitoring-query-service.test.ts +1 -47
  189. package/tests/service/queue-io.test.ts +1 -62
  190. package/tests/service/runtime-summary-service.test.ts +3 -1
  191. package/tests/service/workflow-watchdog.test.ts +0 -91
  192. package/tests/utils/file-lock.test.ts +5 -3
  193. package/tests/utils/session-key.test.ts +52 -0
  194. package/tests/utils/subagent-probe.test.ts +48 -1
  195. package/vitest.config.ts +4 -11
  196. package/.planning/codebase/ARCHITECTURE.md +0 -157
  197. package/.planning/codebase/CONCERNS.md +0 -145
  198. package/.planning/codebase/CONVENTIONS.md +0 -148
  199. package/.planning/codebase/INTEGRATIONS.md +0 -81
  200. package/.planning/codebase/STACK.md +0 -87
  201. package/.planning/codebase/STRUCTURE.md +0 -193
  202. package/.planning/codebase/TESTING.md +0 -243
  203. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  204. package/docs/COMMAND_REFERENCE.md +0 -76
  205. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  206. package/scripts/build-web.mjs +0 -46
  207. package/scripts/diagnose-nocturnal.mjs +0 -537
  208. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  209. package/src/commands/nocturnal-review.ts +0 -322
  210. package/src/commands/nocturnal-rollout.ts +0 -790
  211. package/src/commands/nocturnal-train.ts +0 -986
  212. package/src/commands/pd-reflect.ts +0 -88
  213. package/src/core/adaptive-thresholds.ts +0 -478
  214. package/src/core/diagnostician-task-store.ts +0 -192
  215. package/src/core/nocturnal-arbiter.ts +0 -715
  216. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  217. package/src/core/nocturnal-artificer.ts +0 -257
  218. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  219. package/src/core/nocturnal-compliance.ts +0 -1146
  220. package/src/core/nocturnal-dataset.ts +0 -763
  221. package/src/core/nocturnal-executability.ts +0 -428
  222. package/src/core/nocturnal-export.ts +0 -499
  223. package/src/core/nocturnal-paths.ts +0 -240
  224. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  225. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  226. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  227. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  228. package/src/core/nocturnal-trinity-types.ts +0 -218
  229. package/src/core/nocturnal-trinity.ts +0 -2680
  230. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  231. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  232. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  233. package/src/http/principles-console-route.ts +0 -709
  234. package/src/service/central-health-service.ts +0 -49
  235. package/src/service/central-overview-service.ts +0 -138
  236. package/src/service/control-ui-query-service.ts +0 -900
  237. package/src/service/cooldown-strategy.ts +0 -97
  238. package/src/service/evolution-pain-context.ts +0 -79
  239. package/src/service/evolution-query-service.ts +0 -407
  240. package/src/service/health-query-service.ts +0 -1038
  241. package/src/service/nocturnal-config.ts +0 -214
  242. package/src/service/nocturnal-runtime.ts +0 -734
  243. package/src/service/nocturnal-service.ts +0 -1605
  244. package/src/service/nocturnal-target-selector.ts +0 -545
  245. package/src/service/sleep-cycle.ts +0 -157
  246. package/src/service/startup-reconciler.ts +0 -112
  247. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  248. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  249. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  250. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  251. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  252. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  253. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  254. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  255. package/src/tools/write-pain-flag.ts +0 -215
  256. package/templates/langs/en/skills/plan-script/SKILL.md +0 -32
  257. package/templates/langs/zh/skills/plan-script/SKILL.md +0 -32
  258. package/tests/commands/nocturnal-review.test.ts +0 -448
  259. package/tests/commands/nocturnal-train.test.ts +0 -97
  260. package/tests/commands/pd-reflect.test.ts +0 -49
  261. package/tests/core/adaptive-thresholds.test.ts +0 -261
  262. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  263. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  264. package/tests/core/nocturnal-artificer.test.ts +0 -241
  265. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  266. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  267. package/tests/core/nocturnal-compliance.test.ts +0 -646
  268. package/tests/core/nocturnal-dataset.test.ts +0 -892
  269. package/tests/core/nocturnal-e2e.test.ts +0 -234
  270. package/tests/core/nocturnal-executability.test.ts +0 -357
  271. package/tests/core/nocturnal-export.test.ts +0 -517
  272. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  273. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  274. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  275. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  276. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  277. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  278. package/tests/core/pain-auto-repair.test.ts +0 -96
  279. package/tests/core/pain-integration.test.ts +0 -510
  280. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  281. package/tests/http/principles-console-route.test.ts +0 -162
  282. package/tests/integration/chaos-resilience.test.ts +0 -348
  283. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  284. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  285. package/tests/service/control-ui-query-service.test.ts +0 -121
  286. package/tests/service/cooldown-strategy.test.ts +0 -164
  287. package/tests/service/data-endpoints-regression.test.ts +0 -834
  288. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  289. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  290. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  291. package/tests/service/nocturnal-runtime.test.ts +0 -473
  292. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  293. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  294. package/tests/service/startup-reconciler.test.ts +0 -148
  295. package/tests/tools/write-pain-flag.test.ts +0 -358
  296. package/ui/src/App.tsx +0 -45
  297. package/ui/src/api.ts +0 -220
  298. package/ui/src/charts.tsx +0 -955
  299. package/ui/src/components/ErrorState.tsx +0 -6
  300. package/ui/src/components/Loading.tsx +0 -13
  301. package/ui/src/components/ProtectedRoute.tsx +0 -12
  302. package/ui/src/components/Shell.tsx +0 -91
  303. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  304. package/ui/src/components/index.ts +0 -5
  305. package/ui/src/context/auth.tsx +0 -80
  306. package/ui/src/context/theme.tsx +0 -66
  307. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  308. package/ui/src/i18n/ui.ts +0 -473
  309. package/ui/src/main.tsx +0 -16
  310. package/ui/src/pages/EvolutionPage.tsx +0 -333
  311. package/ui/src/pages/FeedbackPage.tsx +0 -138
  312. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  313. package/ui/src/pages/LoginPage.tsx +0 -89
  314. package/ui/src/pages/OverviewPage.tsx +0 -599
  315. package/ui/src/pages/SamplesPage.tsx +0 -174
  316. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  317. package/ui/src/styles.css +0 -2020
  318. package/ui/src/types.ts +0 -384
  319. package/ui/src/utils/format.ts +0 -15
@@ -9,27 +9,6 @@
9
9
  * @module subagent-workflow/types
10
10
  */
11
11
 
12
- import type {
13
- NocturnalArtifact,
14
- ArbiterResult,
15
- } from '../../core/nocturnal-arbiter.js';
16
- import type {
17
- BoundedAction,
18
- } from '../../core/nocturnal-executability.js';
19
- import type {
20
- NocturnalSessionSnapshot,
21
- } from '../../core/nocturnal-trajectory-extractor.js';
22
- import type {
23
- TrinityResult,
24
- } from '../../core/nocturnal-trinity.js';
25
- import type {
26
- IdleCheckResult,
27
- PreflightCheckResult,
28
- } from '../nocturnal-runtime.js';
29
- import type {
30
- NocturnalSelectionResult,
31
- } from '../nocturnal-target-selector.js';
32
-
33
12
  // ── Workflow Transport ────────────────────────────────────────────────────────
34
13
 
35
14
  /**
@@ -59,14 +38,14 @@ export type WorkflowTransport = 'runtime_direct';
59
38
  * States marked with (*) are terminal states.
60
39
  */
61
40
  export type WorkflowState =
62
- | 'pending' // Workflow created, not yet started
63
- | 'active' // Subagent spawned, running
64
- | 'wait_result' // Waiting for result (runtime_direct path)
65
- | 'finalizing' // Reading and parsing result
66
- | 'completed' // Successfully finalized and cleaned up (*)
67
- | 'terminal_error' // Finalized with error (*)
68
- | 'cleanup_pending' // Cleanup failed, pending retry (*)
69
- | 'expired'; // TTL expired, cleaned up (*)
41
+ | 'pending'
42
+ | 'active'
43
+ | 'wait_result'
44
+ | 'finalizing'
45
+ | 'completed'
46
+ | 'terminal_error'
47
+ | 'cleanup_pending'
48
+ | 'expired';
70
49
 
71
50
  // ── Workflow Metadata ────────────────────────────────────────────────────────
72
51
 
@@ -150,7 +129,6 @@ export interface WorkflowHandle {
150
129
  * ```
151
130
  */
152
131
  export interface SubagentWorkflowSpec<TResult> {
153
-
154
132
  /** Unique identifier for this workflow type */
155
133
  workflowType: string;
156
134
  /** Which transport mechanism to use */
@@ -177,7 +155,6 @@ export interface SubagentWorkflowSpec<TResult> {
177
155
  * For runtime_direct: typically finalize only on 'ok', skip on 'timeout'/'error'.
178
156
  */
179
157
  shouldFinalizeOnWaitStatus: (status: 'ok' | 'error' | 'timeout') => boolean;
180
-
181
158
  }
182
159
 
183
160
  // ── Empathy Observer Specific Types ──────────────────────────────────────────
@@ -212,7 +189,7 @@ export interface EmpathyObserverWorkflowSpec extends SubagentWorkflowSpec<Empath
212
189
  workflowType: 'empathy-observer';
213
190
  transport: 'runtime_direct';
214
191
  timeoutMs: 30_000;
215
- ttlMs: 300_000; // 5 minutes
192
+ ttlMs: 300_000;
216
193
  shouldDeleteSessionAfterFinalize: true;
217
194
  }
218
195
 
@@ -223,7 +200,6 @@ export interface EmpathyObserverWorkflowSpec extends SubagentWorkflowSpec<Empath
223
200
  * This is what the helper exposes to business modules.
224
201
  */
225
202
  export interface WorkflowManager {
226
-
227
203
  /**
228
204
  * Start a new workflow.
229
205
  * Creates workflow state, spawns subagent, and returns handle.
@@ -283,7 +259,6 @@ export interface WorkflowManager {
283
259
  * Release resources (DB connections, timers).
284
260
  */
285
261
  dispose: () => void;
286
-
287
262
  }
288
263
 
289
264
  // ── Workflow Store (for SQLite persistence) ──────────────────────────────────
@@ -339,13 +314,6 @@ export interface WorkflowDebugSummary {
339
314
  createdAt: number;
340
315
  payload: Record<string, unknown>;
341
316
  }[];
342
- // NOC-16: Trinity stage states
343
- trinityStageStates?: {
344
- stage: 'dreamer' | 'philosopher' | 'scribe';
345
- status: 'pending' | 'running' | 'completed' | 'failed';
346
- reason?: string;
347
- completedAt?: number;
348
- }[];
349
317
  }
350
318
 
351
319
  // ── Convenience Re-exports ────────────────────────────────────────────────────
@@ -357,82 +325,3 @@ export type {
357
325
  } from '../../openclaw-sdk.js';
358
326
 
359
327
  export type { PluginLogger } from '../../openclaw-sdk.js';
360
-
361
- // ── Nocturnal Workflow Types ───────────────────────────────────────────────────
362
-
363
- /**
364
- * Recent pain context for sleep_reflection tasks.
365
- * Used by target selector for ranking bias and context enrichment.
366
- * Originally from evolution-worker.ts, moved here to break circular dependency.
367
- */
368
- export interface RecentPainContext {
369
- /** Most recent unresolved pain event */
370
- mostRecent: {
371
- score: number;
372
- source: string;
373
- reason: string;
374
- timestamp: string;
375
- /** Session ID where the pain occurred */
376
- sessionId: string;
377
- } | null;
378
- /** Count of pain events in the recent window (for signal strength) */
379
- recentPainCount: number;
380
- /** Highest pain score in the recent window */
381
- recentMaxPainScore: number;
382
- }
383
-
384
- /**
385
- * Nocturnal workflow result type.
386
- * Mirrors NocturnalRunResult from nocturnal-service.ts (per D-02).
387
- */
388
- export type NocturnalResult = {
389
- success: boolean;
390
- artifact?: NocturnalArtifact & { boundedAction?: BoundedAction };
391
- skipReason?: string;
392
- noTargetSelected: boolean;
393
- validationFailed: boolean;
394
- validationFailures: string[];
395
- snapshot?: NocturnalSessionSnapshot;
396
- diagnostics: NocturnalRunDiagnostics;
397
- trinityTelemetry?: TrinityResult['telemetry'];
398
- };
399
-
400
- /**
401
- * Diagnostics from each pipeline stage.
402
- * Duplicated from nocturnal-service.ts to break circular dependency.
403
- */
404
- export interface NocturnalRunDiagnostics {
405
- /** Pre-flight check result */
406
- preflight: PreflightCheckResult | null;
407
- /** Selection result */
408
- selection: NocturnalSelectionResult | null;
409
- /** Idle check result */
410
- idle: IdleCheckResult | null;
411
- /** Whether Trinity chain was attempted */
412
- trinityAttempted: boolean;
413
- /** Trinity result (if trinityAttempted === true) */
414
- trinityResult: TrinityResult | null;
415
- /** Which chain mode was used */
416
- chainModeUsed: 'trinity' | 'single-reflector' | null;
417
- /** Arbiter validation result */
418
- arbiterResult: ArbiterResult | null;
419
- /** Executability validation result (if arbiter passed) */
420
- executabilityResult: { executable: boolean; failures: string[] } | null;
421
- /** Whether artifact was persisted */
422
- persisted: boolean;
423
- /** Persistence path (if persisted) */
424
- persistedPath?: string;
425
- /** Code-candidate sidecar diagnostics */
426
- artificer: NocturnalArtificerDiagnostics;
427
- }
428
-
429
- export interface NocturnalArtificerDiagnostics {
430
- status: 'skipped' | 'validation_failed' | 'persisted_candidate';
431
- reason?:
432
- | 'behavioral_artifact_unavailable'
433
- | 'no_deterministic_rule'
434
- | 'persistence_failed'
435
- | 'cancelled';
436
- validationErrors?: string[];
437
- persistedPath?: string;
438
- }
@@ -1,9 +1,8 @@
1
-
1
+
2
2
  import Database from 'better-sqlite3';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
5
  import type { WorkflowRow, WorkflowEventRow, WorkflowState } from './types.js';
6
- import type { DreamerOutput, PhilosopherOutput } from '../../core/nocturnal-trinity.js';
7
6
 
8
7
  const SCHEMA_VERSION = 2;
9
8
 
@@ -75,17 +74,6 @@ export class WorkflowStore {
75
74
  CREATE INDEX IF NOT EXISTS idx_workflows_child_session ON subagent_workflows(child_session_key);
76
75
  CREATE INDEX IF NOT EXISTS idx_workflows_state ON subagent_workflows(state);
77
76
  CREATE INDEX IF NOT EXISTS idx_workflows_type ON subagent_workflows(workflow_type);
78
- CREATE TABLE IF NOT EXISTS subagent_workflow_stage_outputs (
79
- workflow_id TEXT NOT NULL,
80
- stage TEXT NOT NULL CHECK (stage IN ('dreamer', 'philosopher')),
81
- output_json TEXT NOT NULL,
82
- idempotency_key TEXT NOT NULL,
83
- created_at INTEGER NOT NULL,
84
- FOREIGN KEY (workflow_id) REFERENCES subagent_workflows(workflow_id) ON DELETE CASCADE
85
- );
86
-
87
- CREATE INDEX IF NOT EXISTS idx_stage_outputs_workflow ON subagent_workflow_stage_outputs(workflow_id);
88
- CREATE UNIQUE INDEX IF NOT EXISTS idx_stage_outputs_idempotency ON subagent_workflow_stage_outputs(idempotency_key);
89
77
 
90
78
  CREATE INDEX IF NOT EXISTS idx_events_workflow ON subagent_workflow_events(workflow_id);
91
79
  `);
@@ -95,7 +83,6 @@ export class WorkflowStore {
95
83
  if (currentVersion === 0) {
96
84
  this.db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(SCHEMA_VERSION);
97
85
  } else if (currentVersion < SCHEMA_VERSION) {
98
- // Run migrations for existing databases
99
86
  this.runMigrations(currentVersion, SCHEMA_VERSION);
100
87
  this.db.prepare('UPDATE schema_version SET version = ?').run(SCHEMA_VERSION);
101
88
  }
@@ -103,12 +90,11 @@ export class WorkflowStore {
103
90
 
104
91
  private runMigrations(fromVersion: number, toVersion: number): void {
105
92
  if (fromVersion < 2 && toVersion >= 2) {
106
- // v1 → v2: Add duration_ms column for adaptive timeout tracking
107
93
  try {
108
94
  this.db.exec('ALTER TABLE subagent_workflows ADD COLUMN duration_ms INTEGER');
109
95
  console.info(`[PD:WorkflowStore] Schema migration v${fromVersion} → v${toVersion}: added duration_ms column`);
110
96
  } catch {
111
- // Column may already exist if migration was partially applied
97
+ void 0;
112
98
  }
113
99
  }
114
100
  }
@@ -218,7 +204,6 @@ export class WorkflowStore {
218
204
  `).all(cutoff) as WorkflowRow[];
219
205
  }
220
206
 
221
- /** List all workflows, optionally filtered by state. */
222
207
  listWorkflows(state?: string): WorkflowRow[] {
223
208
  if (state) {
224
209
  return this.db.prepare(`
@@ -233,8 +218,6 @@ export class WorkflowStore {
233
218
  `).all() as WorkflowRow[];
234
219
  }
235
220
 
236
-
237
-
238
221
  recordEvent(
239
222
  workflowId: string,
240
223
  eventType: string,
@@ -264,117 +247,17 @@ export class WorkflowStore {
264
247
  SELECT * FROM subagent_workflow_events WHERE workflow_id = ? ORDER BY created_at ASC
265
248
  `).all(workflowId) as WorkflowEventRow[];
266
249
  }
267
-
268
- /**
269
- * Record a Trinity stage output to the database (NOC-11).
270
- * idempotencyKey must be unique per (workflow_id, stage). If a row with the
271
- * same idempotency_key already exists, this is a no-op (idempotent).
272
- */
273
-
274
-
275
- recordStageOutput(
276
- workflowId: string,
277
- stage: 'dreamer' | 'philosopher',
278
- output: DreamerOutput | PhilosopherOutput,
279
- idempotencyKey: string
280
- ): void {
281
- const now = Date.now();
282
- // Use INSERT OR IGNORE for idempotency — if idempotency_key already exists, silently skip
283
- this.db.prepare(`
284
- INSERT OR IGNORE INTO subagent_workflow_stage_outputs (
285
- workflow_id, stage, output_json, idempotency_key, created_at
286
- ) VALUES (?, ?, ?, ?, ?)
287
- `).run(
288
- workflowId,
289
- stage,
290
- JSON.stringify(output),
291
- idempotencyKey,
292
- now
293
- );
294
- }
295
-
296
- /**
297
- * Get all stage outputs for a workflow (NOC-13 crash recovery).
298
- * Returns outputs ordered by created_at ascending.
299
- */
300
- getStageOutputs(workflowId: string): {
301
- stage: string;
302
- output: DreamerOutput | PhilosopherOutput;
303
- idempotencyKey: string;
304
- createdAt: number;
305
- }[] {
306
- const rows = this.db.prepare(`
307
- SELECT workflow_id, stage, output_json, idempotency_key, created_at
308
- FROM subagent_workflow_stage_outputs
309
- WHERE workflow_id = ?
310
- ORDER BY created_at ASC
311
- `).all(workflowId) as {
312
- workflow_id: string;
313
- stage: string;
314
- output_json: string;
315
- idempotency_key: string;
316
- created_at: number;
317
- }[];
318
-
319
- return rows.map(row => ({
320
- workflowId: row.workflow_id,
321
- stage: row.stage,
322
- output: JSON.parse(row.output_json) as DreamerOutput | PhilosopherOutput,
323
- idempotencyKey: row.idempotency_key,
324
- createdAt: row.created_at,
325
- }));
326
- }
327
-
328
- /**
329
- * Get a stage output by its idempotency key (NOC-12 idempotency check).
330
- * Returns null if not found.
331
- */
332
- getStageOutputByKey(idempotencyKey: string): {
333
- stage: string;
334
- output: DreamerOutput | PhilosopherOutput;
335
- workflowId: string;
336
- createdAt: number;
337
- } | null {
338
- const row = this.db.prepare(`
339
- SELECT workflow_id, stage, output_json, idempotency_key, created_at
340
- FROM subagent_workflow_stage_outputs
341
- WHERE idempotency_key = ?
342
- `).get(idempotencyKey) as {
343
- workflow_id: string;
344
- stage: string;
345
- output_json: string;
346
- idempotency_key: string;
347
- created_at: number;
348
- } | undefined;
349
-
350
- if (!row) return null;
351
-
352
- return {
353
- workflowId: row.workflow_id,
354
- stage: row.stage,
355
- output: JSON.parse(row.output_json) as DreamerOutput | PhilosopherOutput,
356
- createdAt: row.created_at,
357
- };
358
- }
359
250
 
360
251
  deleteWorkflow(workflowId: string): void {
361
252
  this.db.prepare('DELETE FROM subagent_workflows WHERE workflow_id = ?').run(workflowId);
362
253
  }
363
254
 
364
- /**
365
- * Record the actual completion duration for a workflow.
366
- * Used by adaptive timeout learning.
367
- */
368
255
  recordDuration(workflowId: string, durationMs: number): void {
369
256
  this.db.prepare(`
370
257
  UPDATE subagent_workflows SET duration_ms = ?, updated_at = ? WHERE workflow_id = ?
371
258
  `).run(durationMs, Date.now(), workflowId);
372
259
  }
373
260
 
374
- /**
375
- * Get completion durations for a specific workflow type, ordered by most recent first.
376
- * Returns an array of duration_ms values for adaptive timeout calculation.
377
- */
378
261
  getCompletionDurations(workflowType: string, limit = 50): number[] {
379
262
  const rows = this.db.prepare(`
380
263
  SELECT duration_ms FROM subagent_workflows
@@ -12,8 +12,6 @@
12
12
  * workflows as terminal_error (line 122)
13
13
  * BUG-02: Gateway fallback cleans up child sessions via agentSession when
14
14
  * subagentRuntime unavailable (lines 148-156)
15
- * BUG-03: Nocturnal workflow snapshot validation detects pain_context_fallback
16
- * with zero stats (lines 184-198)
17
15
  */
18
16
 
19
17
  import type { WorkspaceContext } from '../core/workspace-context.js';
@@ -26,7 +24,6 @@ import { WORKFLOW_TTL_MS } from '../config/defaults/runtime.js';
26
24
  export interface WatchdogResult {
27
25
  anomalies: number;
28
26
  details: string[];
29
- /** Set when the watchdog scan itself failed (e.g., store errors). Undefined means scan succeeded. */
30
27
  scanError?: string;
31
28
  }
32
29
 
@@ -46,7 +43,6 @@ export async function runWorkflowWatchdog(
46
43
  try {
47
44
  const allWorkflows: WorkflowRow[] = store.listWorkflows();
48
45
 
49
- // Check 1: Stale active workflows (active > 2x TTL)
50
46
  const staleThreshold = WORKFLOW_TTL_MS * 2;
51
47
  const staleActive = allWorkflows.filter(
52
48
  (wf: WorkflowRow) => wf.state === 'active' && (now - wf.created_at) > staleThreshold,
@@ -56,9 +52,6 @@ export async function runWorkflowWatchdog(
56
52
  const ageMin = Math.round((now - wf.created_at) / 60000);
57
53
  details.push(`stale_active: ${wf.workflow_id} (${wf.workflow_type}, ${ageMin}min old)`);
58
54
 
59
- // #257: Check if the last recorded event reason indicates expected subagent unavailability.
60
- // If so, skip marking as terminal_error — the workflow is stale because the subagent
61
- // was expectedly unavailable (daemon mode, process isolation), not due to a hard failure.
62
55
  const events = store.getEvents(wf.workflow_id);
63
56
  const lastEventReason = events.length > 0 ? events[events.length - 1].reason : 'unknown';
64
57
  if (isExpectedSubagentError(lastEventReason)) {
@@ -69,7 +62,6 @@ export async function runWorkflowWatchdog(
69
62
  store.updateWorkflowState(wf.workflow_id, 'terminal_error');
70
63
  store.recordEvent(wf.workflow_id, 'watchdog_timeout', 'active', 'terminal_error', `Stale active > ${staleThreshold / 60000}s`, { ageMs: now - wf.created_at });
71
64
 
72
- // Cleanup session if possible (#188: gateway-safe fallback)
73
65
  if (wf.child_session_key) {
74
66
  try {
75
67
  if (subagentRuntime) {
@@ -104,7 +96,6 @@ export async function runWorkflowWatchdog(
104
96
  }
105
97
  }
106
98
 
107
- // Check 2: Workflows in terminal_error/expired without cleanup
108
99
  const unclearedTerminal = allWorkflows.filter(
109
100
  (wf: WorkflowRow) => (wf.state === 'terminal_error' || wf.state === 'expired') && wf.cleanup_state === 'pending',
110
101
  );
@@ -112,40 +103,6 @@ export async function runWorkflowWatchdog(
112
103
  details.push(`uncleared_terminal: ${unclearedTerminal.length} workflows (will be swept next cycle)`);
113
104
  }
114
105
 
115
- // Check 3: Nocturnal workflow result validation (#181 pattern)
116
- const nocturnalCompleted = allWorkflows.filter(
117
- (wf: WorkflowRow) => wf.workflow_type === 'nocturnal' && wf.state === 'completed',
118
- );
119
- for (const wf of nocturnalCompleted) {
120
- // Check if the metadata snapshot has all zeros (invalid data)
121
- try {
122
- const meta = JSON.parse(wf.metadata_json) as Record<string, unknown>;
123
- const snapshot = meta.snapshot as Record<string, unknown> | undefined;
124
- if (snapshot) {
125
- // #219: Check for fallback data source (partial stats from pain context)
126
- const dataSource = snapshot._dataSource as string | undefined;
127
- if (dataSource === 'pain_context_fallback') {
128
- details.push(`fallback_snapshot: nocturnal workflow ${wf.workflow_id} uses pain-context fallback (stats may be incomplete)`);
129
- }
130
- const stats = snapshot.stats as Record<string, number> | undefined;
131
- // #246: Stats are now always number (never null). Detect "empty" fallback:
132
- // fallback + all counts zero means no real data was available.
133
- // NOTE: totalAssistantTurns may be 0 even for valid sessions because
134
- // listRecentNocturnalCandidateSessions (used in fallback path) does not
135
- // populate assistantTurnCount (only getNocturnalSessionSnapshot does).
136
- // We use totalToolCalls=0 as the primary indicator instead.
137
- if (stats && dataSource === 'pain_context_fallback' &&
138
- stats.totalToolCalls === 0 && stats.totalGateBlocks === 0 &&
139
- stats.failureCount === 0) {
140
- details.push(`fallback_snapshot_stats: nocturnal workflow ${wf.workflow_id} has empty fallback stats (no trajectory data found)`);
141
- }
142
- }
143
- } catch (err) {
144
- details.push(`malformed_metadata: workflow ${wf.workflow_id} has unparseable metadata: ${String(err).slice(0, 100)}`);
145
- }
146
- }
147
-
148
- // Summary
149
106
  const stateCounts: Record<string, number> = {};
150
107
  for (const wf of allWorkflows) {
151
108
  stateCounts[wf.state] = (stateCounts[wf.state] || 0) + 1;
@@ -1,74 +1,16 @@
1
- /**
2
- * Discriminated union for EventLogEntry replaces flat data: Record<string, unknown>.
3
- * Each union member is keyed on the `type` field for type narrowing.
4
- */
5
-
6
- import type {
7
- ToolCallEventData,
8
- PainSignalEventData,
9
- RuleMatchEventData,
10
- RulePromotionEventData,
11
- HookExecutionEventData,
12
- GateBlockEventData,
13
- GateBypassEventData,
14
- PlanApprovalEventData,
15
- EvolutionTaskEventData,
16
- EmpathyRollbackEventData,
17
- EventCategory,
18
- } from './event-types.js';
19
-
20
- export type EventLogEntry =
21
- | { ts: string; date: string; type: 'tool_call'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: ToolCallEventData }
22
- | { ts: string; date: string; type: 'pain_signal'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: PainSignalEventData }
23
- | { ts: string; date: string; type: 'rule_match'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: RuleMatchEventData }
24
- | { ts: string; date: string; type: 'rule_promotion'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: RulePromotionEventData }
25
- | { ts: string; date: string; type: 'hook_execution'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: HookExecutionEventData }
26
- | { ts: string; date: string; type: 'gate_block'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: GateBlockEventData }
27
- | { ts: string; date: string; type: 'gate_bypass'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: GateBypassEventData }
28
- | { ts: string; date: string; type: 'plan_approval'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: PlanApprovalEventData }
29
- | { ts: string; date: string; type: 'evolution_task'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: EvolutionTaskEventData }
30
- | { ts: string; date: string; type: 'empathy_rollback'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: EmpathyRollbackEventData }
31
- | { ts: string; date: string; type: 'error'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: Record<string, unknown> }
32
- | { ts: string; date: string; type: 'warn'; category: EventCategory; sessionId?: string; workspaceDir?: string; data: Record<string, unknown> };
33
-
34
- // Type predicates for safe narrowing
35
-
36
- export function isToolCallEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'tool_call' }> {
37
- return entry.type === 'tool_call';
38
- }
39
-
40
- export function isPainSignalEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'pain_signal' }> {
41
- return entry.type === 'pain_signal';
42
- }
43
-
44
- export function isRuleMatchEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'rule_match' }> {
45
- return entry.type === 'rule_match';
46
- }
47
-
48
- export function isRulePromotionEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'rule_promotion' }> {
49
- return entry.type === 'rule_promotion';
50
- }
51
-
52
- export function isHookExecutionEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'hook_execution' }> {
53
- return entry.type === 'hook_execution';
54
- }
55
-
56
- export function isGateBlockEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'gate_block' }> {
57
- return entry.type === 'gate_block';
58
- }
59
-
60
- export function isGateBypassEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'gate_bypass' }> {
61
- return entry.type === 'gate_bypass';
62
- }
63
-
64
- export function isPlanApprovalEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'plan_approval' }> {
65
- return entry.type === 'plan_approval';
66
- }
67
-
68
- export function isEvolutionTaskEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'evolution_task' }> {
69
- return entry.type === 'evolution_task';
70
- }
71
-
72
- export function isEmpathyRollbackEventEntry(entry: EventLogEntry): entry is Extract<EventLogEntry, { type: 'empathy_rollback' }> {
73
- return entry.type === 'empathy_rollback';
74
- }
1
+ export type {
2
+ EventLogEntry as DiscriminatedEventLogEntry,
3
+ } from '@principles/core/runtime-v2';
4
+
5
+ export {
6
+ isToolCallEventEntry,
7
+ isPainSignalEventEntry,
8
+ isRuleMatchEventEntry,
9
+ isRulePromotionEventEntry,
10
+ isHookExecutionEventEntry,
11
+ isGateBlockEventEntry,
12
+ isGateBypassEventEntry,
13
+ isPlanApprovalEventEntry,
14
+ isEvolutionTaskEventEntry,
15
+ isEmpathyRollbackEventEntry,
16
+ } from '@principles/core/runtime-v2';