principles-disciple 1.71.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 +469 -339
  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 +115 -18
  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 +329 -0
  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 +184 -3
  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
@@ -1,384 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Nocturnal Pipeline — Seed Scenarios (Phase 3b)
5
- *
6
- * Injects synthetic pain/correction scenarios into the trajectory database
7
- * to improve signal diversity for the nocturnal reflection pipeline.
8
- *
9
- * Uses sqlite3 CLI to avoid better-sqlite3 native module dependency.
10
- *
11
- * Usage:
12
- * node scripts/seed-nocturnal-scenarios.mjs [--workspace /path/to/workspace]
13
- */
14
-
15
- import { existsSync } from 'fs';
16
- import { join, dirname } from 'path';
17
- import { fileURLToPath } from 'url';
18
- import { execFileSync, execSync } from 'child_process';
19
-
20
- const __filename = fileURLToPath(import.meta.url);
21
- const __dirname = dirname(__filename);
22
-
23
- // ─── Pre-flight: check sqlite3 CLI is available ───
24
- function ensureSqlite3() {
25
- try {
26
- execFileSync('sqlite3', ['--version'], { encoding: 'utf-8', timeout: 5000 });
27
- } catch {
28
- console.error('❌ sqlite3 CLI is required but not found in PATH');
29
- console.error(' Install it: apt-get install sqlite3 | brew install sqlite3 | choco install sqlite');
30
- process.exit(1);
31
- }
32
- }
33
-
34
- /**
35
- * Run a SQL query safely via execFileSync (no shell interpolation).
36
- * Returns trimmed stdout string.
37
- */
38
- function runSql(dbPath, sql) {
39
- return execFileSync('sqlite3', [dbPath, sql], {
40
- encoding: 'utf-8',
41
- timeout: 5000,
42
- }).trim();
43
- }
44
-
45
- // ─── Argument parsing ───
46
- function parseArgs() {
47
- let workspaceDir = null;
48
- const argv = process.argv.slice(2);
49
- for (let i = 0; i < argv.length; i++) {
50
- if (argv[i] === '--workspace' && argv[i + 1]) {
51
- workspaceDir = argv[++i];
52
- }
53
- }
54
- if (!workspaceDir) {
55
- try {
56
- workspaceDir = execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim();
57
- } catch {
58
- workspaceDir = process.cwd();
59
- }
60
- }
61
- return { workspaceDir };
62
- }
63
-
64
- function esc(s) {
65
- // Comprehensive SQL escaping for SQLite string literals
66
- // Handles: single quotes, newlines, carriage returns, backslashes, null bytes
67
- return String(s)
68
- .replace(/\\/g, '\\\\')
69
- .replace(/'/g, "''")
70
- .replace(/\n/g, '\\n')
71
- .replace(/\r/g, '\\r')
72
- .replace(/\x00/g, '\\0');
73
- }
74
-
75
- function nowIso() {
76
- return new Date().toISOString();
77
- }
78
-
79
- function daysAgo(days) {
80
- const d = new Date();
81
- d.setDate(d.getDate() - days);
82
- return d.toISOString();
83
- }
84
-
85
- function main() {
86
- const { workspaceDir } = parseArgs();
87
- const dbPath = join(workspaceDir, '.state', 'trajectory.db');
88
-
89
- ensureSqlite3();
90
-
91
- if (!existsSync(dbPath)) {
92
- console.error(`❌ trajectory.db not found at ${dbPath}`);
93
- process.exit(1);
94
- }
95
-
96
- const scenarios = [
97
- // ─────────────────────────────────────────────────────────
98
- // Scenario 1: Security violation — writing sensitive file
99
- // ─────────────────────────────────────────────────────────
100
- {
101
- sessionId: 'seed-security-violation-001',
102
- days: 5,
103
- description: 'Agent wrote API key to public config (security violation)',
104
- assistantText: 'I\'ve updated the config.json with the new API key for the external service.',
105
- userText: '错了!你不应该把 API 密钥写到配置文件里,这是严重的安全问题!',
106
- correctionCue: '错了',
107
- toolCalls: [
108
- { toolName: 'write', outcome: 'success', durationMs: 50, paramsJson: JSON.stringify({ path: 'public/config.json', content: '{"apiKey": "sk-1234567890"}' }) },
109
- { toolName: 'read', outcome: 'success', durationMs: 30, paramsJson: JSON.stringify({ path: 'public/config.json' }) },
110
- ],
111
- painEvents: [
112
- { source: 'tool_failure', score: 85, reason: 'Wrote API key to publicly accessible config file', severity: 'severe', origin: 'assistant_self_report', text: 'Security: apiKey exposed in public/config.json' },
113
- ],
114
- },
115
-
116
- // ─────────────────────────────────────────────────────────
117
- // Scenario 2: Over-engineering — 10 lines became 100
118
- // ─────────────────────────────────────────────────────────
119
- {
120
- sessionId: 'seed-overengineering-002',
121
- days: 4,
122
- description: 'Agent turned a simple function into 100+ lines of abstraction',
123
- assistantText: 'I\'ve refactored the utility function into a full class hierarchy with factory pattern, dependency injection, and abstract base classes for future extensibility.',
124
- userText: '太复杂了!原来 10 行就能搞定的事情你写了 100 多行,完全没必要。',
125
- correctionCue: '太复杂了',
126
- toolCalls: [
127
- { toolName: 'edit', outcome: 'success', durationMs: 200, paramsJson: JSON.stringify({ path: 'src/utils/format.ts' }) },
128
- { toolName: 'read', outcome: 'success', durationMs: 20, paramsJson: JSON.stringify({ path: 'src/utils/format.ts' }) },
129
- ],
130
- painEvents: [
131
- { source: 'user_empathy', score: 60, reason: 'Over-engineering: simple function replaced with unnecessary class hierarchy', severity: 'moderate', origin: 'assistant_self_report', text: 'User indicated the solution is overly complex' },
132
- ],
133
- },
134
-
135
- // ─────────────────────────────────────────────────────────
136
- // Scenario 3: Boundary condition omitted — null deref
137
- // ─────────────────────────────────────────────────────────
138
- {
139
- sessionId: 'seed-boundary-omission-003',
140
- days: 3,
141
- description: 'Agent forgot null check, causing TypeError',
142
- assistantText: 'I\'ve implemented the data processor that reads from the API response and extracts the nested fields.',
143
- userText: '不对,如果 API 返回 null 或空数组会直接崩溃。你需要加边界检查。',
144
- correctionCue: '不对',
145
- toolCalls: [
146
- { toolName: 'write', outcome: 'success', durationMs: 80, paramsJson: JSON.stringify({ path: 'src/processor.ts' }) },
147
- { toolName: 'exec', outcome: 'failure', durationMs: 500, errorType: 'TypeError', errorMessage: 'Cannot read properties of undefined (reading \'items\')', exitCode: 1 },
148
- ],
149
- painEvents: [
150
- { source: 'tool_failure', score: 70, reason: 'TypeError: no null check on API response before accessing nested property', severity: 'severe', origin: 'assistant_self_report', text: 'response.items accessed without null guard' },
151
- ],
152
- },
153
-
154
- // ─────────────────────────────────────────────────────────
155
- // Scenario 4: Error handling missing — silent failure
156
- // ─────────────────────────────────────────────────────────
157
- {
158
- sessionId: 'seed-error-handling-004',
159
- days: 3,
160
- description: 'Agent ignored error from file operation, continued blindly',
161
- assistantText: 'I\'ve updated the migration script to process all files in the directory.',
162
- userText: '错了,文件读取失败了你直接跳过了,没有任何错误处理。如果文件不存在怎么办?',
163
- correctionCue: '错了',
164
- toolCalls: [
165
- { toolName: 'read', outcome: 'failure', durationMs: 100, errorType: 'ENOENT', errorMessage: 'ENOENT: no such file or directory, open \'migrations/v2.sql\'' },
166
- { toolName: 'write', outcome: 'success', durationMs: 50, paramsJson: JSON.stringify({ path: 'migrations/runner.ts' }) },
167
- ],
168
- painEvents: [
169
- { source: 'tool_failure', score: 75, reason: 'File read failure (ENOENT) was silently ignored, no error handling or fallback', severity: 'severe', origin: 'assistant_self_report', text: 'Missing error handling for file read operation' },
170
- ],
171
- },
172
-
173
- // ─────────────────────────────────────────────────────────
174
- // Scenario 5: Edit without reading — map before territory
175
- // ─────────────────────────────────────────────────────────
176
- {
177
- sessionId: 'seed-edit-without-reading-005',
178
- days: 2,
179
- description: 'Agent edited a file without reading it first, breaking existing logic',
180
- assistantText: 'I\'ve modified the auth middleware to add the new token validation logic.',
181
- userText: '你根本没有读原文件就改了,现有的 token 刷新逻辑被你删掉了!',
182
- correctionCue: '没有读原文件',
183
- toolCalls: [
184
- { toolName: 'edit', outcome: 'success', durationMs: 150, paramsJson: JSON.stringify({ path: 'src/middleware/auth.ts' }) },
185
- { toolName: 'exec', outcome: 'failure', durationMs: 300, errorType: 'ReferenceError', errorMessage: 'refreshToken is not defined', exitCode: 1 },
186
- ],
187
- painEvents: [
188
- { source: 'tool_failure', score: 80, reason: 'Edit without reading: existing refreshToken logic was overwritten', severity: 'severe', origin: 'assistant_self_report', text: 'auth.ts edited without prior read, broke existing functionality' },
189
- ],
190
- },
191
-
192
- // ─────────────────────────────────────────────────────────
193
- // Scenario 6: Batch operation without planning — blast radius
194
- // ─────────────────────────────────────────────────────────
195
- {
196
- sessionId: 'seed-batch-without-planning-006',
197
- days: 2,
198
- description: 'Agent modified multiple files simultaneously without a plan',
199
- assistantText: 'I\'ve updated the import paths across all files in the src/ directory to use the new module structure.',
200
- userText: '你一次性改了太多文件,没有计划也没有测试。其中几个文件的 import 路径是错的。',
201
- correctionCue: '没有计划',
202
- toolCalls: [
203
- { toolName: 'edit', outcome: 'success', durationMs: 100, paramsJson: JSON.stringify({ path: 'src/module-a/index.ts' }) },
204
- { toolName: 'edit', outcome: 'success', durationMs: 100, paramsJson: JSON.stringify({ path: 'src/module-b/index.ts' }) },
205
- { toolName: 'edit', outcome: 'failure', durationMs: 50, errorType: 'SyntaxError', errorMessage: 'Invalid import path: @/utils/nonexistent' },
206
- { toolName: 'exec', outcome: 'failure', durationMs: 500, errorType: 'BuildError', errorMessage: 'Import errors across modified files', exitCode: 1 },
207
- ],
208
- painEvents: [
209
- { source: 'tool_failure', score: 65, reason: 'Batch edit of multiple files without planning or testing, some files broken', severity: 'moderate', origin: 'assistant_self_report', text: 'Large batch operation without verification' },
210
- ],
211
- },
212
-
213
- // ─────────────────────────────────────────────────────────
214
- // Scenario 7: Continued after failure — pain as signal ignored
215
- // ─────────────────────────────────────────────────────────
216
- {
217
- sessionId: 'seed-continued-after-failure-007',
218
- days: 1,
219
- description: 'Agent got consecutive failures but kept going without diagnosing',
220
- assistantText: 'I\'ve completed the data migration pipeline. All steps are in place.',
221
- userText: '前面几步都失败了你还继续执行?应该先诊断失败原因再继续。',
222
- correctionCue: '应该先诊断',
223
- toolCalls: [
224
- { toolName: 'exec', outcome: 'failure', durationMs: 200, errorType: 'ExitCode', errorMessage: 'Step 1: schema validation failed', exitCode: 1 },
225
- { toolName: 'exec', outcome: 'failure', durationMs: 150, errorType: 'ExitCode', errorMessage: 'Step 2: data transformation failed', exitCode: 1 },
226
- { toolName: 'exec', outcome: 'failure', durationMs: 100, errorType: 'ExitCode', errorMessage: 'Step 3: import failed', exitCode: 1 },
227
- { toolName: 'exec', outcome: 'success', durationMs: 300, paramsJson: JSON.stringify({ cmd: 'echo done' }) },
228
- ],
229
- painEvents: [
230
- { source: 'tool_failure', score: 90, reason: 'Consecutive failures ignored, agent continued without diagnosing root cause', severity: 'severe', origin: 'assistant_self_report', text: 'Pain cascade: multiple failures in sequence without pause' },
231
- ],
232
- },
233
-
234
- // ─────────────────────────────────────────────────────────
235
- // Scenario 8: Complex task not decomposed — no planning
236
- // ─────────────────────────────────────────────────────────
237
- {
238
- sessionId: 'seed-complex-not-decomposed-008',
239
- days: 1,
240
- description: 'Agent attempted a full refactor in one turn without breaking it down',
241
- assistantText: 'I\'ve refactored the entire authentication system from session-based to JWT-based, updated all routes, middleware, and tests.',
242
- userText: '这个改动太大了,你应该分步骤来。先写计划,再一步步改,每步验证。',
243
- correctionCue: '分步骤来',
244
- toolCalls: [
245
- { toolName: 'edit', outcome: 'success', durationMs: 300, paramsJson: JSON.stringify({ path: 'src/auth/session.ts' }) },
246
- { toolName: 'edit', outcome: 'success', durationMs: 200, paramsJson: JSON.stringify({ path: 'src/auth/middleware.ts' }) },
247
- { toolName: 'exec', outcome: 'failure', durationMs: 800, errorType: 'TestFailure', errorMessage: 'Tests failing after auth refactor', exitCode: 1 },
248
- ],
249
- painEvents: [
250
- { source: 'tool_failure', score: 70, reason: 'Complex refactoring done in one turn without decomposition or incremental verification', severity: 'severe', origin: 'assistant_self_report', text: 'Large auth refactor without step-by-step approach' },
251
- ],
252
- },
253
-
254
- // ─────────────────────────────────────────────────────────
255
- // Scenario 9: Architecture violation — circular dependency
256
- // ─────────────────────────────────────────────────────────
257
- {
258
- sessionId: 'seed-circular-dep-009',
259
- days: 1,
260
- description: 'Agent introduced circular dependency between modules',
261
- assistantText: 'I\'ve connected the UserService and OrderService so they can call each other directly.',
262
- userText: '你引入了循环依赖!UserService 引入 OrderService,OrderService 又引入 UserService。',
263
- correctionCue: '循环依赖',
264
- toolCalls: [
265
- { toolName: 'edit', outcome: 'success', durationMs: 100, paramsJson: JSON.stringify({ path: 'src/services/user.ts' }) },
266
- { toolName: 'exec', outcome: 'failure', durationMs: 400, errorType: 'CircularDependency', errorMessage: 'Circular dependency detected: user.ts → order.ts → user.ts' },
267
- ],
268
- painEvents: [
269
- { source: 'tool_failure', score: 75, reason: 'Circular dependency introduced between UserService and OrderService', severity: 'severe', origin: 'assistant_self_report', text: 'Architecture: circular import chain detected' },
270
- ],
271
- },
272
-
273
- // ─────────────────────────────────────────────────────────
274
- // Scenario 10: Pure conversation correction — no tool failures
275
- // ─────────────────────────────────────────────────────────
276
- {
277
- sessionId: 'seed-pure-conversation-010',
278
- days: 0,
279
- description: 'User corrected agent\'s analysis during pure conversation',
280
- assistantText: 'Based on the error logs, the issue appears to be a network timeout. I recommend increasing the timeout value to 30 seconds.',
281
- userText: '不对,这不是超时问题。错误日志明明写的是 "connection refused",是服务根本没启动。',
282
- correctionCue: '不对',
283
- toolCalls: [
284
- { toolName: 'read', outcome: 'success', durationMs: 50, paramsJson: JSON.stringify({ path: 'logs/error.log' }) },
285
- ],
286
- painEvents: [
287
- { source: 'user_empathy', score: 50, reason: 'Agent misdiagnosed "connection refused" as timeout, missing root cause', severity: 'moderate', origin: 'assistant_self_report', text: 'Misdiagnosis of error: connection refused vs timeout' },
288
- ],
289
- },
290
- ];
291
-
292
- console.log('\n🌱 Seeding nocturnal scenarios into trajectory.db\n');
293
- console.log(`Workspace: ${workspaceDir}`);
294
- console.log(`Database: ${dbPath}\n`);
295
-
296
- let inserted = 0;
297
- let skipped = 0;
298
-
299
- for (const s of scenarios) {
300
- const createdAt = daysAgo(s.days);
301
-
302
- // Check if scenario already exists (check sessions table first since that's inserted first)
303
- try {
304
- const existing = runSql(dbPath, `SELECT COUNT(*) FROM sessions WHERE session_id = '${esc(s.sessionId)}';`);
305
- if (parseInt(existing) > 0) {
306
- console.log(` ⏭️ Skipping ${s.sessionId} (already exists)`);
307
- skipped++;
308
- continue;
309
- }
310
- } catch (e) {
311
- console.error(` ❌ Failed to check ${s.sessionId}: ${e.message}`);
312
- continue;
313
- }
314
-
315
- const sql = [];
316
-
317
- // 1. Session
318
- sql.push(`INSERT INTO sessions (session_id, started_at, updated_at) VALUES ('${esc(s.sessionId)}', '${createdAt}', '${createdAt}');`);
319
-
320
- // 2. Assistant turn
321
- sql.push(`INSERT INTO assistant_turns (session_id, run_id, provider, model, raw_text, sanitized_text, usage_json, empathy_signal_json, blob_ref, raw_excerpt, created_at)
322
- VALUES ('${esc(s.sessionId)}', 'run-${esc(s.sessionId)}', 'local', 'main', '${esc(s.assistantText)}', '${esc(s.assistantText.slice(0, 200))}', '{"total_tokens":500}', '{}', NULL, '${esc(s.assistantText.slice(0, 100))}', '${createdAt}');`);
323
-
324
- // We need the assistant turn ID for the user turn reference
325
- // Use a subquery to get it
326
- sql.push(`INSERT INTO user_turns (session_id, turn_index, raw_text, blob_ref, raw_excerpt, correction_detected, correction_cue, references_assistant_turn_id, created_at)
327
- SELECT '${esc(s.sessionId)}', 1, '${esc(s.userText)}', NULL, '${esc(s.userText.slice(0, 100))}', ${s.correctionCue ? 1 : 0}, ${s.correctionCue ? `'${esc(s.correctionCue)}'` : 'NULL'}, id, '${createdAt}'
328
- FROM assistant_turns WHERE session_id = '${esc(s.sessionId)}' LIMIT 1;`);
329
-
330
- // 3. Tool calls
331
- for (const tc of s.toolCalls) {
332
- sql.push(`INSERT INTO tool_calls (session_id, tool_name, outcome, duration_ms, exit_code, error_type, error_message, gfi_before, gfi_after, params_json, created_at)
333
- VALUES ('${esc(s.sessionId)}', '${esc(tc.toolName)}', '${esc(tc.outcome)}', ${tc.durationMs ?? 100}, ${tc.exitCode !== undefined ? tc.exitCode : 'NULL'}, ${tc.errorType ? `'${esc(tc.errorType)}'` : 'NULL'}, ${tc.errorMessage ? `'${esc(tc.errorMessage)}'` : 'NULL'}, 0, 0, ${tc.paramsJson ? `'${esc(tc.paramsJson)}'` : "'{}'"}, '${createdAt}');`);
334
- }
335
-
336
- // 4. Pain events
337
- for (const pe of s.painEvents) {
338
- sql.push(`INSERT INTO pain_events (session_id, source, score, reason, severity, origin, confidence, created_at)
339
- VALUES ('${esc(s.sessionId)}', '${esc(pe.source)}', ${pe.score}, '${esc(pe.reason)}', '${esc(pe.severity)}', '${esc(pe.origin)}', ${pe.confidence !== undefined ? pe.confidence : 'NULL'}, '${createdAt}');`);
340
- }
341
-
342
- // Execute all SQL in one transaction via stdin piping
343
- const fullSql = `.bail on\nBEGIN TRANSACTION;\n${sql.join('\n')}\nCOMMIT;`;
344
- try {
345
- execFileSync('sqlite3', [dbPath], {
346
- input: fullSql,
347
- encoding: 'utf-8',
348
- timeout: 10000,
349
- });
350
- inserted++;
351
- console.log(` ✅ ${s.sessionId} — ${s.description}`);
352
- } catch (e) {
353
- console.error(` ❌ Failed to insert ${s.sessionId}: ${e.message}`);
354
- }
355
- }
356
-
357
- // ─────────────────────────────────────────────────────────
358
- // Summary
359
- // ─────────────────────────────────────────────────────────
360
- console.log(`\n📊 Seed complete: ${inserted} scenarios inserted, ${skipped} skipped (already existed)`);
361
-
362
- // Print signal diversity report
363
- try {
364
- const painSummary = execFileSync('sqlite3', [dbPath], {
365
- input: `.mode column\n.headers on\nSELECT source, COUNT(*) as count, ROUND(AVG(score), 1) as avg_score FROM pain_events WHERE session_id LIKE 'seed-%' GROUP BY source;`,
366
- encoding: 'utf-8',
367
- timeout: 5000,
368
- });
369
- console.log('\n📈 Signal diversity report (seed scenarios only):');
370
- console.log(painSummary);
371
-
372
- const correctionSummary = execFileSync('sqlite3', [dbPath], {
373
- input: `.mode column\n.headers on\nSELECT COUNT(*) as total, SUM(CASE WHEN correction_detected = 1 THEN 1 ELSE 0 END) as with_correction FROM user_turns WHERE session_id LIKE 'seed-%';`,
374
- encoding: 'utf-8',
375
- timeout: 5000,
376
- });
377
- console.log('📝 Correction scenarios:');
378
- console.log(correctionSummary);
379
- } catch (e) {
380
- console.error(` Failed to generate summary: ${e.message}`);
381
- }
382
- }
383
-
384
- main();