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.
- package/openclaw.plugin.json +10 -5
- package/package.json +17 -19
- package/scripts/acceptance-test.mjs +16 -73
- package/scripts/sync-plugin.mjs +382 -77
- package/src/commands/archive-impl.ts +2 -1
- package/src/commands/capabilities.ts +2 -2
- package/src/commands/context.ts +2 -2
- package/src/commands/disable-impl.ts +2 -1
- package/src/commands/evolution-status.ts +16 -16
- package/src/commands/export.ts +12 -67
- package/src/commands/pain.ts +91 -1
- package/src/commands/principle-rollback.ts +2 -1
- package/src/commands/promote-impl.ts +7 -43
- package/src/commands/rollback-impl.ts +2 -1
- package/src/commands/rollback.ts +2 -1
- package/src/commands/samples.ts +2 -1
- package/src/commands/thinking-os.ts +2 -1
- package/src/config/errors.ts +18 -2
- package/src/constants/diagnostician.ts +2 -2
- package/src/constants/tools.ts +2 -1
- package/src/core/__tests__/focus-history.test.ts +210 -0
- package/src/core/config.ts +1 -1
- package/src/core/confirm-first-gate.ts +255 -0
- package/src/core/correction-cue-learner.ts +2 -136
- package/src/core/correction-types.ts +16 -88
- package/src/core/dictionary.ts +19 -20
- package/src/core/empathy-keyword-matcher.ts +17 -289
- package/src/core/empathy-types.ts +18 -229
- package/src/core/event-log.ts +38 -132
- package/src/core/evolution-reducer.ts +21 -2
- package/src/core/evolution-types.ts +76 -464
- package/src/core/file-store.ts +80 -0
- package/src/core/focus-history.ts +228 -955
- package/src/core/local-worker-routing.ts +34 -314
- package/src/core/merge-gate-audit.ts +0 -195
- package/src/core/pain-diagnostic-gate.ts +154 -0
- package/src/core/pain-signal.ts +21 -138
- package/src/core/pain.ts +15 -88
- package/src/core/pd-task-reconciler.ts +26 -115
- package/src/core/pd-task-service.ts +9 -9
- package/src/core/pd-task-types.ts +23 -127
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
- package/src/core/principle-compiler/code-validator.ts +15 -42
- package/src/core/principle-compiler/compiler.ts +100 -15
- package/src/core/principle-compiler/index.ts +5 -2
- package/src/core/principle-compiler/template-generator.ts +4 -104
- package/src/core/principle-injection.ts +10 -202
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
- package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
- package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
- package/src/core/principle-tree-ledger-adapter.ts +145 -0
- package/src/core/principle-tree-ledger.ts +8 -6
- package/src/core/reflection/reflection-context.ts +14 -109
- package/src/core/replay-engine.ts +8 -500
- package/src/core/rule-host-helpers.ts +5 -35
- package/src/core/rule-host-types.ts +10 -82
- package/src/core/rule-host.ts +6 -63
- package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
- package/src/core/session-tracker.ts +87 -101
- package/src/core/shadow-observation-registry.ts +19 -48
- package/src/core/trajectory.ts +3 -1
- package/src/core/workflow-funnel-loader.ts +62 -68
- package/src/core/workspace-context.ts +46 -0
- package/src/core/workspace-dir-service.ts +1 -1
- package/src/core/workspace-dir-validation.ts +18 -9
- package/src/hooks/AGENTS.md +1 -1
- package/src/hooks/gate-block-helper.ts +46 -44
- package/src/hooks/gate.ts +207 -7
- package/src/hooks/lifecycle.ts +30 -32
- package/src/hooks/llm.ts +60 -32
- package/src/hooks/pain.ts +297 -103
- package/src/hooks/prompt.ts +469 -339
- package/src/hooks/subagent.ts +2 -29
- package/src/i18n/commands.ts +2 -10
- package/src/index.ts +95 -85
- package/src/openclaw-sdk.ts +311 -0
- package/src/service/central-database.ts +8 -4
- package/src/service/evolution-queue-migration.ts +2 -1
- package/src/service/evolution-worker.ts +163 -1786
- package/src/service/internalization-trigger-adapter.ts +302 -0
- package/src/service/keyword-optimization-service.ts +4 -4
- package/src/service/monitoring-query-service.ts +1 -215
- package/src/service/queue-io.ts +60 -331
- package/src/service/runtime-summary-service.ts +115 -18
- package/src/service/subagent-workflow/index.ts +0 -41
- package/src/service/subagent-workflow/types.ts +9 -120
- package/src/service/subagent-workflow/workflow-store.ts +2 -119
- package/src/service/workflow-watchdog.ts +0 -43
- package/src/types/event-payload.ts +16 -74
- package/src/types/event-types.ts +39 -547
- package/src/types/hygiene-types.ts +7 -30
- package/src/types/principle-tree-schema.ts +20 -222
- package/src/types/queue.ts +15 -70
- package/src/types/runtime-summary.ts +5 -49
- package/src/utils/io.ts +10 -0
- package/src/utils/retry.ts +1 -1
- package/src/utils/shadow-fingerprint.ts +2 -2
- package/src/utils/workspace-resolver.ts +50 -0
- package/templates/langs/en/core/AGENTS.md +2 -2
- package/templates/langs/en/core/BOOT.md +1 -1
- package/templates/langs/en/core/HEARTBEAT.md +2 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
- package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
- package/templates/langs/zh/core/AGENTS.md +2 -2
- package/templates/langs/zh/core/BOOT.md +1 -1
- package/templates/langs/zh/core/HEARTBEAT.md +2 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
- package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
- package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
- package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
- package/tests/build-artifacts.test.ts +1 -3
- package/tests/commands/evolution-status.test.ts +0 -118
- package/tests/core/bootstrap-rules.test.ts +1 -1
- package/tests/core/config.test.ts +1 -1
- package/tests/core/event-log.test.ts +35 -0
- package/tests/core/evolution-engine.test.ts +610 -0
- package/tests/core/file-store.test.ts +102 -0
- package/tests/core/focus-history.test.ts +203 -11
- package/tests/core/merge-gate-audit.test.ts +2 -169
- package/tests/core/model-deployment-registry.test.ts +7 -1
- package/tests/core/model-training-registry.test.ts +19 -0
- package/tests/core/observability.test.ts +0 -1
- package/tests/core/pain-diagnostic-gate.test.ts +498 -0
- package/tests/core/pain.test.ts +0 -1
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
- package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
- package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
- package/tests/core/reflection-context.test.ts +0 -14
- package/tests/core/replay-engine.test.ts +127 -215
- package/tests/core/rule-host-helpers.test.ts +2 -2
- package/tests/core/rule-implementation-runtime.test.ts +0 -27
- package/tests/core/workflow-funnel-loader.test.ts +162 -0
- package/tests/core/workspace-dir-validation.test.ts +8 -1
- package/tests/core-anti-growth.test.ts +192 -0
- package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
- package/tests/hooks/confirm-first-gate.test.ts +333 -0
- package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
- package/tests/hooks/gate-auto-correct.test.ts +665 -0
- package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
- package/tests/hooks/pain.test.ts +269 -12
- package/tests/hooks/prompt-characterization.test.ts +500 -0
- package/tests/hooks/prompt-size-guard.test.ts +329 -0
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
- package/tests/index.test.ts +94 -1
- package/tests/integration/auto-entry-gate.test.ts +248 -0
- package/tests/integration/internalization-trigger-guard.test.ts +69 -0
- package/tests/integration/m8-legacy-paths.test.ts +63 -0
- package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
- package/tests/plugin-config-resolution-cutover.test.ts +359 -0
- package/tests/runtime-v2-discovery-guard.test.ts +154 -0
- package/tests/service/central-database.test.ts +457 -0
- package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
- package/tests/service/evolution-worker.timeout.test.ts +11 -129
- package/tests/service/internalization-trigger-adapter.test.ts +251 -0
- package/tests/service/monitoring-query-service.test.ts +1 -47
- package/tests/service/queue-io.test.ts +1 -62
- package/tests/service/runtime-summary-service.test.ts +184 -3
- package/tests/service/workflow-watchdog.test.ts +0 -91
- package/tests/utils/file-lock.test.ts +5 -3
- package/tests/utils/session-key.test.ts +52 -0
- package/tests/utils/subagent-probe.test.ts +48 -1
- package/vitest.config.ts +4 -11
- package/.planning/codebase/ARCHITECTURE.md +0 -157
- package/.planning/codebase/CONCERNS.md +0 -145
- package/.planning/codebase/CONVENTIONS.md +0 -148
- package/.planning/codebase/INTEGRATIONS.md +0 -81
- package/.planning/codebase/STACK.md +0 -87
- package/.planning/codebase/STRUCTURE.md +0 -193
- package/.planning/codebase/TESTING.md +0 -243
- package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
- package/docs/COMMAND_REFERENCE.md +0 -76
- package/docs/COMMAND_REFERENCE_EN.md +0 -79
- package/scripts/build-web.mjs +0 -46
- package/scripts/diagnose-nocturnal.mjs +0 -537
- package/scripts/seed-nocturnal-scenarios.mjs +0 -384
- package/src/commands/nocturnal-review.ts +0 -322
- package/src/commands/nocturnal-rollout.ts +0 -790
- package/src/commands/nocturnal-train.ts +0 -986
- package/src/commands/pd-reflect.ts +0 -88
- package/src/core/adaptive-thresholds.ts +0 -478
- package/src/core/diagnostician-task-store.ts +0 -192
- package/src/core/nocturnal-arbiter.ts +0 -715
- package/src/core/nocturnal-artifact-lineage.ts +0 -116
- package/src/core/nocturnal-artificer.ts +0 -257
- package/src/core/nocturnal-candidate-scoring.ts +0 -530
- package/src/core/nocturnal-compliance.ts +0 -1146
- package/src/core/nocturnal-dataset.ts +0 -763
- package/src/core/nocturnal-executability.ts +0 -428
- package/src/core/nocturnal-export.ts +0 -499
- package/src/core/nocturnal-paths.ts +0 -240
- package/src/core/nocturnal-reasoning-deriver.ts +0 -343
- package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
- package/src/core/nocturnal-snapshot-contract.ts +0 -99
- package/src/core/nocturnal-trajectory-extractor.ts +0 -512
- package/src/core/nocturnal-trinity-types.ts +0 -218
- package/src/core/nocturnal-trinity.ts +0 -2680
- package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
- package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
- package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
- package/src/http/principles-console-route.ts +0 -709
- package/src/service/central-health-service.ts +0 -49
- package/src/service/central-overview-service.ts +0 -138
- package/src/service/control-ui-query-service.ts +0 -900
- package/src/service/cooldown-strategy.ts +0 -97
- package/src/service/evolution-pain-context.ts +0 -79
- package/src/service/evolution-query-service.ts +0 -407
- package/src/service/health-query-service.ts +0 -1038
- package/src/service/nocturnal-config.ts +0 -214
- package/src/service/nocturnal-runtime.ts +0 -734
- package/src/service/nocturnal-service.ts +0 -1605
- package/src/service/nocturnal-target-selector.ts +0 -545
- package/src/service/sleep-cycle.ts +0 -157
- package/src/service/startup-reconciler.ts +0 -112
- package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
- package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
- package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
- package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
- package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
- package/src/tools/write-pain-flag.ts +0 -215
- package/tests/commands/nocturnal-review.test.ts +0 -448
- package/tests/commands/nocturnal-train.test.ts +0 -97
- package/tests/commands/pd-reflect.test.ts +0 -49
- package/tests/core/adaptive-thresholds.test.ts +0 -261
- package/tests/core/nocturnal-arbiter.test.ts +0 -559
- package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
- package/tests/core/nocturnal-artificer.test.ts +0 -241
- package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
- package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
- package/tests/core/nocturnal-compliance.test.ts +0 -646
- package/tests/core/nocturnal-dataset.test.ts +0 -892
- package/tests/core/nocturnal-e2e.test.ts +0 -234
- package/tests/core/nocturnal-executability.test.ts +0 -357
- package/tests/core/nocturnal-export.test.ts +0 -517
- package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
- package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
- package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
- package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
- package/tests/core/nocturnal-trinity.test.ts +0 -2053
- package/tests/core/pain-auto-repair.test.ts +0 -96
- package/tests/core/pain-integration.test.ts +0 -510
- package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
- package/tests/http/principles-console-route.test.ts +0 -162
- package/tests/integration/chaos-resilience.test.ts +0 -348
- package/tests/integration/empathy-workflow-integration.test.ts +0 -626
- package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
- package/tests/service/control-ui-query-service.test.ts +0 -121
- package/tests/service/cooldown-strategy.test.ts +0 -164
- package/tests/service/data-endpoints-regression.test.ts +0 -834
- package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
- package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
- package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
- package/tests/service/nocturnal-runtime.test.ts +0 -473
- package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
- package/tests/service/nocturnal-target-selector.test.ts +0 -615
- package/tests/service/startup-reconciler.test.ts +0 -148
- package/tests/tools/write-pain-flag.test.ts +0 -358
- package/ui/src/App.tsx +0 -45
- package/ui/src/api.ts +0 -220
- package/ui/src/charts.tsx +0 -955
- package/ui/src/components/ErrorState.tsx +0 -6
- package/ui/src/components/Loading.tsx +0 -13
- package/ui/src/components/ProtectedRoute.tsx +0 -12
- package/ui/src/components/Shell.tsx +0 -91
- package/ui/src/components/WorkspaceConfig.tsx +0 -178
- package/ui/src/components/index.ts +0 -5
- package/ui/src/context/auth.tsx +0 -80
- package/ui/src/context/theme.tsx +0 -66
- package/ui/src/hooks/useAutoRefresh.ts +0 -39
- package/ui/src/i18n/ui.ts +0 -473
- package/ui/src/main.tsx +0 -16
- package/ui/src/pages/EvolutionPage.tsx +0 -333
- package/ui/src/pages/FeedbackPage.tsx +0 -138
- package/ui/src/pages/GateMonitorPage.tsx +0 -136
- package/ui/src/pages/LoginPage.tsx +0 -89
- package/ui/src/pages/OverviewPage.tsx +0 -599
- package/ui/src/pages/SamplesPage.tsx +0 -174
- package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
- package/ui/src/styles.css +0 -2020
- package/ui/src/types.ts +0 -384
- 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();
|