principles-disciple 1.72.0 → 1.73.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 (309) hide show
  1. package/openclaw.plugin.json +10 -5
  2. package/package.json +17 -19
  3. package/scripts/acceptance-test.mjs +16 -73
  4. package/scripts/sync-plugin.mjs +382 -77
  5. package/src/commands/archive-impl.ts +2 -1
  6. package/src/commands/capabilities.ts +2 -2
  7. package/src/commands/context.ts +2 -2
  8. package/src/commands/disable-impl.ts +2 -1
  9. package/src/commands/evolution-status.ts +16 -16
  10. package/src/commands/export.ts +12 -67
  11. package/src/commands/pain.ts +91 -1
  12. package/src/commands/principle-rollback.ts +2 -1
  13. package/src/commands/promote-impl.ts +7 -43
  14. package/src/commands/rollback-impl.ts +2 -1
  15. package/src/commands/rollback.ts +2 -1
  16. package/src/commands/samples.ts +2 -1
  17. package/src/commands/thinking-os.ts +2 -1
  18. package/src/config/errors.ts +18 -2
  19. package/src/constants/diagnostician.ts +2 -2
  20. package/src/constants/tools.ts +2 -1
  21. package/src/core/__tests__/focus-history.test.ts +210 -0
  22. package/src/core/config.ts +1 -1
  23. package/src/core/confirm-first-gate.ts +255 -0
  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 +38 -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/pain-diagnostic-gate.ts +154 -0
  37. package/src/core/pain-signal.ts +21 -138
  38. package/src/core/pain.ts +15 -88
  39. package/src/core/pd-task-reconciler.ts +26 -115
  40. package/src/core/pd-task-service.ts +9 -9
  41. package/src/core/pd-task-types.ts +23 -127
  42. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  43. package/src/core/principle-compiler/code-validator.ts +15 -42
  44. package/src/core/principle-compiler/compiler.ts +100 -15
  45. package/src/core/principle-compiler/index.ts +5 -2
  46. package/src/core/principle-compiler/template-generator.ts +4 -104
  47. package/src/core/principle-injection.ts +10 -202
  48. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  49. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  50. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  51. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  52. package/src/core/principle-tree-ledger.ts +8 -6
  53. package/src/core/reflection/reflection-context.ts +14 -109
  54. package/src/core/replay-engine.ts +8 -500
  55. package/src/core/rule-host-helpers.ts +5 -35
  56. package/src/core/rule-host-types.ts +10 -82
  57. package/src/core/rule-host.ts +6 -63
  58. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  59. package/src/core/session-tracker.ts +87 -101
  60. package/src/core/shadow-observation-registry.ts +19 -48
  61. package/src/core/trajectory.ts +3 -1
  62. package/src/core/workflow-funnel-loader.ts +62 -68
  63. package/src/core/workspace-context.ts +46 -0
  64. package/src/core/workspace-dir-service.ts +1 -1
  65. package/src/core/workspace-dir-validation.ts +18 -9
  66. package/src/hooks/AGENTS.md +1 -1
  67. package/src/hooks/gate-block-helper.ts +46 -44
  68. package/src/hooks/gate.ts +207 -7
  69. package/src/hooks/lifecycle.ts +30 -32
  70. package/src/hooks/llm.ts +60 -32
  71. package/src/hooks/pain.ts +297 -103
  72. package/src/hooks/prompt.ts +459 -439
  73. package/src/hooks/subagent.ts +2 -29
  74. package/src/i18n/commands.ts +2 -10
  75. package/src/index.ts +95 -85
  76. package/src/openclaw-sdk.ts +311 -0
  77. package/src/service/central-database.ts +8 -4
  78. package/src/service/evolution-queue-migration.ts +2 -1
  79. package/src/service/evolution-worker.ts +163 -1786
  80. package/src/service/internalization-trigger-adapter.ts +302 -0
  81. package/src/service/keyword-optimization-service.ts +4 -4
  82. package/src/service/monitoring-query-service.ts +1 -215
  83. package/src/service/queue-io.ts +60 -331
  84. package/src/service/runtime-summary-service.ts +59 -16
  85. package/src/service/subagent-workflow/index.ts +0 -41
  86. package/src/service/subagent-workflow/types.ts +9 -120
  87. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  88. package/src/service/workflow-watchdog.ts +0 -43
  89. package/src/types/event-payload.ts +16 -74
  90. package/src/types/event-types.ts +39 -547
  91. package/src/types/hygiene-types.ts +7 -30
  92. package/src/types/principle-tree-schema.ts +20 -222
  93. package/src/types/queue.ts +15 -70
  94. package/src/types/runtime-summary.ts +5 -49
  95. package/src/utils/io.ts +10 -0
  96. package/src/utils/retry.ts +1 -1
  97. package/src/utils/shadow-fingerprint.ts +2 -2
  98. package/src/utils/workspace-resolver.ts +50 -0
  99. package/templates/langs/en/core/AGENTS.md +2 -2
  100. package/templates/langs/en/core/BOOT.md +1 -1
  101. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  102. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  103. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  104. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  105. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  107. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  108. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  109. package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
  110. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  111. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  112. package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  113. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  114. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  115. package/templates/langs/zh/core/AGENTS.md +2 -2
  116. package/templates/langs/zh/core/BOOT.md +1 -1
  117. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  118. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  119. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  120. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  121. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  127. package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
  128. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  129. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  130. package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  131. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  132. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  133. package/tests/build-artifacts.test.ts +1 -3
  134. package/tests/commands/evolution-status.test.ts +0 -118
  135. package/tests/core/bootstrap-rules.test.ts +1 -1
  136. package/tests/core/config.test.ts +1 -1
  137. package/tests/core/event-log.test.ts +35 -0
  138. package/tests/core/evolution-engine.test.ts +610 -0
  139. package/tests/core/file-store.test.ts +102 -0
  140. package/tests/core/focus-history.test.ts +203 -11
  141. package/tests/core/merge-gate-audit.test.ts +2 -169
  142. package/tests/core/model-deployment-registry.test.ts +7 -1
  143. package/tests/core/model-training-registry.test.ts +19 -0
  144. package/tests/core/observability.test.ts +0 -1
  145. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  146. package/tests/core/pain.test.ts +0 -1
  147. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  148. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  149. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  150. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  151. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  152. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  153. package/tests/core/reflection-context.test.ts +0 -14
  154. package/tests/core/replay-engine.test.ts +127 -215
  155. package/tests/core/rule-host-helpers.test.ts +2 -2
  156. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  157. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  158. package/tests/core/workspace-dir-validation.test.ts +8 -1
  159. package/tests/core-anti-growth.test.ts +192 -0
  160. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  161. package/tests/hooks/confirm-first-gate.test.ts +333 -0
  162. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  163. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  164. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  165. package/tests/hooks/pain.test.ts +269 -12
  166. package/tests/hooks/prompt-characterization.test.ts +500 -0
  167. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  168. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  169. package/tests/index.test.ts +94 -1
  170. package/tests/integration/auto-entry-gate.test.ts +248 -0
  171. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  172. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  173. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  174. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  175. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  176. package/tests/service/central-database.test.ts +457 -0
  177. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  178. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  179. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  180. package/tests/service/monitoring-query-service.test.ts +1 -47
  181. package/tests/service/queue-io.test.ts +1 -62
  182. package/tests/service/runtime-summary-service.test.ts +3 -1
  183. package/tests/service/workflow-watchdog.test.ts +0 -91
  184. package/tests/utils/file-lock.test.ts +5 -3
  185. package/tests/utils/session-key.test.ts +52 -0
  186. package/tests/utils/subagent-probe.test.ts +48 -1
  187. package/vitest.config.ts +4 -11
  188. package/.planning/codebase/ARCHITECTURE.md +0 -157
  189. package/.planning/codebase/CONCERNS.md +0 -145
  190. package/.planning/codebase/CONVENTIONS.md +0 -148
  191. package/.planning/codebase/INTEGRATIONS.md +0 -81
  192. package/.planning/codebase/STACK.md +0 -87
  193. package/.planning/codebase/STRUCTURE.md +0 -193
  194. package/.planning/codebase/TESTING.md +0 -243
  195. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  196. package/docs/COMMAND_REFERENCE.md +0 -76
  197. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  198. package/scripts/build-web.mjs +0 -46
  199. package/scripts/diagnose-nocturnal.mjs +0 -537
  200. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  201. package/src/commands/nocturnal-review.ts +0 -322
  202. package/src/commands/nocturnal-rollout.ts +0 -790
  203. package/src/commands/nocturnal-train.ts +0 -986
  204. package/src/commands/pd-reflect.ts +0 -88
  205. package/src/core/adaptive-thresholds.ts +0 -478
  206. package/src/core/diagnostician-task-store.ts +0 -192
  207. package/src/core/nocturnal-arbiter.ts +0 -715
  208. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  209. package/src/core/nocturnal-artificer.ts +0 -257
  210. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  211. package/src/core/nocturnal-compliance.ts +0 -1146
  212. package/src/core/nocturnal-dataset.ts +0 -763
  213. package/src/core/nocturnal-executability.ts +0 -428
  214. package/src/core/nocturnal-export.ts +0 -499
  215. package/src/core/nocturnal-paths.ts +0 -240
  216. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  217. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  218. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  219. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  220. package/src/core/nocturnal-trinity-types.ts +0 -218
  221. package/src/core/nocturnal-trinity.ts +0 -2680
  222. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  223. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  224. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  225. package/src/http/principles-console-route.ts +0 -709
  226. package/src/service/central-health-service.ts +0 -49
  227. package/src/service/central-overview-service.ts +0 -138
  228. package/src/service/control-ui-query-service.ts +0 -900
  229. package/src/service/cooldown-strategy.ts +0 -97
  230. package/src/service/evolution-pain-context.ts +0 -79
  231. package/src/service/evolution-query-service.ts +0 -407
  232. package/src/service/health-query-service.ts +0 -1038
  233. package/src/service/nocturnal-config.ts +0 -214
  234. package/src/service/nocturnal-runtime.ts +0 -734
  235. package/src/service/nocturnal-service.ts +0 -1605
  236. package/src/service/nocturnal-target-selector.ts +0 -545
  237. package/src/service/sleep-cycle.ts +0 -157
  238. package/src/service/startup-reconciler.ts +0 -112
  239. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  240. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  241. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  242. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  243. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  244. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  245. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  246. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  247. package/src/tools/write-pain-flag.ts +0 -215
  248. package/tests/commands/nocturnal-review.test.ts +0 -448
  249. package/tests/commands/nocturnal-train.test.ts +0 -97
  250. package/tests/commands/pd-reflect.test.ts +0 -49
  251. package/tests/core/adaptive-thresholds.test.ts +0 -261
  252. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  253. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  254. package/tests/core/nocturnal-artificer.test.ts +0 -241
  255. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  256. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  257. package/tests/core/nocturnal-compliance.test.ts +0 -646
  258. package/tests/core/nocturnal-dataset.test.ts +0 -892
  259. package/tests/core/nocturnal-e2e.test.ts +0 -234
  260. package/tests/core/nocturnal-executability.test.ts +0 -357
  261. package/tests/core/nocturnal-export.test.ts +0 -517
  262. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  263. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  264. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  265. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  266. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  267. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  268. package/tests/core/pain-auto-repair.test.ts +0 -96
  269. package/tests/core/pain-integration.test.ts +0 -510
  270. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  271. package/tests/http/principles-console-route.test.ts +0 -162
  272. package/tests/integration/chaos-resilience.test.ts +0 -348
  273. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  274. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  275. package/tests/service/control-ui-query-service.test.ts +0 -121
  276. package/tests/service/cooldown-strategy.test.ts +0 -164
  277. package/tests/service/data-endpoints-regression.test.ts +0 -834
  278. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  279. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  280. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  281. package/tests/service/nocturnal-runtime.test.ts +0 -473
  282. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  283. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  284. package/tests/service/startup-reconciler.test.ts +0 -148
  285. package/tests/tools/write-pain-flag.test.ts +0 -358
  286. package/ui/src/App.tsx +0 -45
  287. package/ui/src/api.ts +0 -220
  288. package/ui/src/charts.tsx +0 -955
  289. package/ui/src/components/ErrorState.tsx +0 -6
  290. package/ui/src/components/Loading.tsx +0 -13
  291. package/ui/src/components/ProtectedRoute.tsx +0 -12
  292. package/ui/src/components/Shell.tsx +0 -91
  293. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  294. package/ui/src/components/index.ts +0 -5
  295. package/ui/src/context/auth.tsx +0 -80
  296. package/ui/src/context/theme.tsx +0 -66
  297. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  298. package/ui/src/i18n/ui.ts +0 -473
  299. package/ui/src/main.tsx +0 -16
  300. package/ui/src/pages/EvolutionPage.tsx +0 -333
  301. package/ui/src/pages/FeedbackPage.tsx +0 -138
  302. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  303. package/ui/src/pages/LoginPage.tsx +0 -89
  304. package/ui/src/pages/OverviewPage.tsx +0 -599
  305. package/ui/src/pages/SamplesPage.tsx +0 -174
  306. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  307. package/ui/src/styles.css +0 -2020
  308. package/ui/src/types.ts +0 -384
  309. 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';