principles-disciple 1.11.0 → 1.13.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/CHANGELOG.md +26 -0
- package/README.md +66 -0
- package/esbuild.config.js +1 -1
- package/openclaw.plugin.json +4 -4
- package/package.json +2 -3
- package/run-nocturnal.mjs +30 -0
- package/scripts/db-migrate.mjs +170 -0
- package/scripts/sync-plugin.mjs +250 -6
- package/src/commands/archive-impl.ts +136 -0
- package/src/commands/capabilities.ts +4 -2
- package/src/commands/context.ts +5 -1
- package/src/commands/disable-impl.ts +151 -0
- package/src/commands/evolution-status.ts +64 -19
- package/src/commands/export.ts +8 -6
- package/src/commands/focus.ts +8 -20
- package/src/commands/nocturnal-review.ts +5 -7
- package/src/commands/nocturnal-rollout.ts +1 -12
- package/src/commands/nocturnal-train.ts +21 -47
- package/src/commands/pain.ts +10 -5
- package/src/commands/principle-rollback.ts +4 -2
- package/src/commands/promote-impl.ts +274 -0
- package/src/commands/rollback-impl.ts +234 -0
- package/src/commands/rollback.ts +6 -3
- package/src/commands/samples.ts +2 -0
- package/src/commands/thinking-os.ts +3 -4
- package/src/commands/workflow-debug.ts +2 -1
- package/src/config/errors.ts +1 -0
- package/src/core/AGENTS.md +34 -0
- package/src/core/adaptive-thresholds.ts +4 -3
- package/src/core/code-implementation-storage.ts +241 -0
- package/src/core/config.ts +5 -2
- package/src/core/control-ui-db.ts +29 -10
- package/src/core/detection-funnel.ts +12 -7
- package/src/core/diagnostician-task-store.ts +156 -0
- package/src/core/dictionary.ts +4 -4
- package/src/core/empathy-keyword-matcher.ts +7 -3
- package/src/core/empathy-types.ts +13 -2
- package/src/core/event-log.ts +14 -6
- package/src/core/evolution-engine.ts +27 -31
- package/src/core/evolution-logger.ts +3 -2
- package/src/core/evolution-reducer.ts +110 -31
- package/src/core/evolution-types.ts +10 -0
- package/src/core/external-training-contract.ts +1 -0
- package/src/core/focus-history.ts +38 -24
- package/src/core/hygiene/tracker.ts +10 -6
- package/src/core/init.ts +5 -2
- package/src/core/migration.ts +3 -3
- package/src/core/model-deployment-registry.ts +6 -4
- package/src/core/model-training-registry.ts +5 -3
- package/src/core/nocturnal-arbiter.ts +13 -14
- package/src/core/nocturnal-artifact-lineage.ts +117 -0
- package/src/core/nocturnal-artificer.ts +257 -0
- package/src/core/nocturnal-candidate-scoring.ts +4 -2
- package/src/core/nocturnal-compliance.ts +67 -19
- package/src/core/nocturnal-dataset.ts +95 -2
- package/src/core/nocturnal-executability.ts +2 -3
- package/src/core/nocturnal-export.ts +6 -3
- package/src/core/nocturnal-rule-implementation-validator.ts +245 -0
- package/src/core/nocturnal-trajectory-extractor.ts +10 -3
- package/src/core/nocturnal-trinity.ts +319 -61
- package/src/core/pain-context-extractor.ts +29 -15
- package/src/core/pain.ts +7 -5
- package/src/core/path-resolver.ts +16 -15
- package/src/core/paths.ts +2 -1
- package/src/core/pd-task-reconciler.ts +463 -0
- package/src/core/pd-task-service.ts +42 -0
- package/src/core/pd-task-store.ts +77 -0
- package/src/core/pd-task-types.ts +128 -0
- package/src/core/principle-internalization/deprecated-readiness.ts +91 -0
- package/src/core/principle-internalization/internalization-routing-policy.ts +208 -0
- package/src/core/principle-internalization/lifecycle-metrics.ts +149 -0
- package/src/core/principle-internalization/lifecycle-read-model.ts +243 -0
- package/src/core/principle-internalization/lifecycle-refresh.ts +11 -0
- package/src/core/principle-internalization/principle-lifecycle-service.ts +167 -0
- package/src/core/principle-training-state.ts +95 -370
- package/src/core/principle-tree-ledger.ts +733 -0
- package/src/core/principle-tree-migration.ts +195 -0
- package/src/core/profile.ts +3 -1
- package/src/core/promotion-gate.ts +14 -18
- package/src/core/replay-engine.ts +562 -0
- package/src/core/risk-calculator.ts +6 -4
- package/src/core/rule-host-helpers.ts +39 -0
- package/src/core/rule-host-types.ts +82 -0
- package/src/core/rule-host.ts +245 -0
- package/src/core/rule-implementation-runtime.ts +38 -0
- package/src/core/schema/db-types.ts +16 -0
- package/src/core/schema/index.ts +26 -0
- package/src/core/schema/migration-runner.ts +207 -0
- package/src/core/schema/migrations/001-init-trajectory.ts +211 -0
- package/src/core/schema/migrations/002-init-central.ts +122 -0
- package/src/core/schema/migrations/003-init-workflow.ts +55 -0
- package/src/core/schema/migrations/004-add-thinking-and-gfi.ts +74 -0
- package/src/core/schema/migrations/index.ts +31 -0
- package/src/core/schema/schema-definitions.ts +650 -0
- package/src/core/session-tracker.ts +6 -4
- package/src/core/shadow-observation-registry.ts +6 -3
- package/src/core/system-logger.ts +2 -2
- package/src/core/thinking-models.ts +182 -46
- package/src/core/thinking-os-parser.ts +156 -0
- package/src/core/training-program.ts +7 -7
- package/src/core/trajectory.ts +42 -36
- package/src/core/workspace-context.ts +77 -11
- package/src/core/workspace-dir-validation.ts +152 -0
- package/src/hooks/AGENTS.md +31 -0
- package/src/hooks/bash-risk.ts +3 -1
- package/src/hooks/edit-verification.ts +9 -5
- package/src/hooks/gate-block-helper.ts +5 -1
- package/src/hooks/gate.ts +152 -5
- package/src/hooks/gfi-gate.ts +9 -2
- package/src/hooks/lifecycle-routing.ts +124 -0
- package/src/hooks/lifecycle.ts +12 -12
- package/src/hooks/llm.ts +17 -109
- package/src/hooks/message-sanitize.ts +5 -3
- package/src/hooks/pain.ts +19 -15
- package/src/hooks/progressive-trust-gate.ts +7 -1
- package/src/hooks/prompt.ts +169 -60
- package/src/hooks/subagent.ts +5 -4
- package/src/hooks/thinking-checkpoint.ts +2 -0
- package/src/hooks/trajectory-collector.ts +15 -12
- package/src/http/principles-console-route.ts +31 -68
- package/src/i18n/commands.ts +2 -2
- package/src/index.ts +130 -40
- package/src/service/central-database.ts +131 -43
- package/src/service/central-health-service.ts +47 -0
- package/src/service/central-overview-service.ts +135 -0
- package/src/service/central-sync-service.ts +87 -0
- package/src/service/control-ui-query-service.ts +46 -36
- package/src/service/event-log-auditor.ts +261 -0
- package/src/service/evolution-query-service.ts +23 -22
- package/src/service/evolution-worker.ts +565 -261
- package/src/service/health-query-service.ts +213 -36
- package/src/service/nocturnal-runtime.ts +8 -4
- package/src/service/nocturnal-service.ts +503 -59
- package/src/service/nocturnal-target-selector.ts +5 -7
- package/src/service/runtime-summary-service.ts +2 -1
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +25 -336
- package/src/service/subagent-workflow/dynamic-timeout.ts +30 -0
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +48 -386
- package/src/service/subagent-workflow/index.ts +2 -0
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +169 -284
- package/src/service/subagent-workflow/runtime-direct-driver.ts +114 -16
- package/src/service/subagent-workflow/subagent-error-utils.ts +25 -0
- package/src/service/subagent-workflow/types.ts +9 -4
- package/src/service/subagent-workflow/workflow-manager-base.ts +573 -0
- package/src/service/subagent-workflow/workflow-store.ts +71 -11
- package/src/service/trajectory-service.ts +2 -1
- package/src/tools/critique-prompt.ts +1 -1
- package/src/tools/deep-reflect.ts +175 -209
- package/src/tools/model-index.ts +2 -1
- package/src/types/event-types.ts +2 -2
- package/src/types/principle-tree-schema.ts +29 -23
- package/src/utils/file-lock.ts +5 -3
- package/src/utils/io.ts +5 -2
- package/src/utils/nlp.ts +5 -46
- package/src/utils/node-vm-polyfill.ts +11 -0
- package/src/utils/plugin-logger.ts +2 -0
- package/src/utils/retry.ts +572 -0
- package/src/utils/subagent-probe.ts +1 -1
- package/templates/langs/en/core/AGENTS.md +0 -13
- package/templates/langs/en/core/SOUL.md +1 -31
- package/templates/langs/en/core/TOOLS.md +0 -4
- package/templates/langs/en/principles/THINKING_OS.md +77 -0
- package/templates/langs/en/skills/admin/SKILL.md +0 -1
- package/templates/langs/en/skills/evolution-framework-update/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-diagnostician/SKILL.md +18 -5
- package/templates/langs/zh/core/AGENTS.md +0 -22
- package/templates/langs/zh/core/SOUL.md +1 -31
- package/templates/langs/zh/core/TOOLS.md +0 -4
- package/templates/langs/zh/principles/THINKING_OS.md +77 -0
- package/templates/langs/zh/skills/admin/SKILL.md +0 -1
- package/templates/langs/zh/skills/evolution-framework-update/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +25 -4
- package/tests/commands/evolution-status.test.ts +119 -0
- package/tests/commands/implementation-lifecycle.test.ts +362 -0
- package/tests/core/code-implementation-storage.test.ts +398 -0
- package/tests/core/evolution-reducer.detector-metadata.test.ts +28 -28
- package/tests/core/nocturnal-artifact-lineage.test.ts +53 -0
- package/tests/core/nocturnal-artificer.test.ts +241 -0
- package/tests/core/nocturnal-compliance-p-principles.test.ts +133 -0
- package/tests/core/nocturnal-rule-implementation-validator.test.ts +127 -0
- package/tests/core/pd-task-store.test.ts +126 -0
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +193 -0
- package/tests/core/principle-internalization/internalization-routing-policy.test.ts +212 -0
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +350 -0
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +211 -0
- package/tests/core/principle-training-state.test.ts +228 -1
- package/tests/core/principle-tree-ledger.test.ts +423 -0
- package/tests/core/regression-v1-9-1.test.ts +265 -0
- package/tests/core/replay-engine.test.ts +234 -0
- package/tests/core/rule-host-helpers.test.ts +120 -0
- package/tests/core/rule-host.test.ts +389 -0
- package/tests/core/rule-implementation-runtime.test.ts +64 -0
- package/tests/core/workspace-context.test.ts +53 -0
- package/tests/core/workspace-dir-validation.test.ts +272 -0
- package/tests/hooks/gate-rule-host-pipeline.test.ts +385 -0
- package/tests/hooks/pain.test.ts +74 -10
- package/tests/hooks/prompt.test.ts +63 -1
- package/tests/integration/principle-lifecycle.e2e.test.ts +197 -0
- package/tests/integration/tool-hooks-workspace-dir.e2e.test.ts +211 -0
- package/tests/service/data-endpoints-regression.test.ts +834 -0
- package/tests/service/evolution-worker.test.ts +0 -123
- package/tests/service/nocturnal-service-code-candidate.test.ts +330 -0
- package/tests/utils/nlp.test.ts +1 -19
- package/tests/utils/retry.test.ts +327 -0
- package/ui/src/App.tsx +1 -1
- package/ui/src/api.ts +4 -0
- package/ui/src/charts.tsx +366 -0
- package/ui/src/components/WorkspaceConfig.tsx +107 -75
- package/ui/src/i18n/ui.ts +89 -31
- package/ui/src/pages/EvolutionPage.tsx +1 -1
- package/ui/src/pages/OverviewPage.tsx +441 -81
- package/ui/src/pages/ThinkingModelsPage.tsx +287 -69
- package/ui/src/styles.css +43 -0
- package/ui/src/types.ts +17 -1
- package/src/agents/nocturnal-dreamer.md +0 -152
- package/src/agents/nocturnal-philosopher.md +0 -138
- package/src/agents/nocturnal-reflector.md +0 -126
- package/src/agents/nocturnal-scribe.md +0 -164
- package/templates/workspace/.principles/00-kernel.md +0 -51
- package/templates/workspace/.principles/DECISION_POLICY.json +0 -44
- package/templates/workspace/.principles/PRINCIPLES.md +0 -20
- package/templates/workspace/.principles/PROFILE.json +0 -54
- package/templates/workspace/.principles/PROFILE.schema.json +0 -56
- package/templates/workspace/.principles/THINKING_OS.md +0 -64
- package/templates/workspace/.principles/THINKING_OS_ARCHIVE.md +0 -7
- package/templates/workspace/.principles/THINKING_OS_CANDIDATES.md +0 -9
- package/templates/workspace/.principles/models/_INDEX.md +0 -27
- package/templates/workspace/.principles/models/first_principles.md +0 -62
- package/templates/workspace/.principles/models/marketing_4p.md +0 -52
- package/templates/workspace/.principles/models/porter_five.md +0 -63
- package/templates/workspace/.principles/models/swot.md +0 -60
- package/templates/workspace/.principles/models/user_story_map.md +0 -63
- package/templates/workspace/.state/WORKBOARD.json +0 -4
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema Registry — Central source of truth for all database schemas.
|
|
3
|
+
*
|
|
4
|
+
* All table, view, and index definitions live here. No more scattered
|
|
5
|
+
* CREATE TABLE statements across multiple database classes.
|
|
6
|
+
*
|
|
7
|
+
* Each definition is keyed by `${dbName}.${name}` for uniqueness.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { Db } from './db-types.js';
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Types
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
export type DbType = 'trajectory.db' | 'central.db' | 'workflow.db';
|
|
17
|
+
|
|
18
|
+
export interface TableDefinition {
|
|
19
|
+
ddl: string;
|
|
20
|
+
indexes?: string[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ViewDefinition {
|
|
24
|
+
ddl: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface FtsDefinition {
|
|
28
|
+
ddl: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface Migration {
|
|
32
|
+
/** Unique ID, e.g. '001' */
|
|
33
|
+
id: string;
|
|
34
|
+
/** Human-readable name, e.g. 'init-trajectory' */
|
|
35
|
+
name: string;
|
|
36
|
+
/** Which database file this migration applies to */
|
|
37
|
+
db: DbType;
|
|
38
|
+
/* eslint-disable no-unused-vars -- Reason: interface callback params are part of type signature */
|
|
39
|
+
/** Apply this migration */
|
|
40
|
+
up: (_db: Db) => void;
|
|
41
|
+
/** Revert this migration */
|
|
42
|
+
down?: (_db: Db) => void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface SchemaCatalog {
|
|
46
|
+
tables: Record<string, TableDefinition>;
|
|
47
|
+
views: Record<string, ViewDefinition>;
|
|
48
|
+
fts: Record<string, FtsDefinition>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Schema Definitions — ALL tables across ALL databases
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* All schema definitions organized by database file.
|
|
57
|
+
* Key format: `${dbName}.${tableName}`
|
|
58
|
+
*/
|
|
59
|
+
export const SCHEMAS: Record<DbType, SchemaCatalog> = {
|
|
60
|
+
|
|
61
|
+
// ========================================================================
|
|
62
|
+
// trajectory.db — Main event store
|
|
63
|
+
// ========================================================================
|
|
64
|
+
'trajectory.db': {
|
|
65
|
+
tables: {
|
|
66
|
+
'trajectory.schema_version': {
|
|
67
|
+
ddl: `CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL)`,
|
|
68
|
+
},
|
|
69
|
+
'trajectory.ingest_checkpoint': {
|
|
70
|
+
ddl: `CREATE TABLE IF NOT EXISTS ingest_checkpoint (
|
|
71
|
+
source_key TEXT PRIMARY KEY,
|
|
72
|
+
imported_at TEXT NOT NULL
|
|
73
|
+
)`,
|
|
74
|
+
},
|
|
75
|
+
'trajectory.sessions': {
|
|
76
|
+
ddl: `CREATE TABLE IF NOT EXISTS sessions (
|
|
77
|
+
session_id TEXT PRIMARY KEY,
|
|
78
|
+
started_at TEXT NOT NULL,
|
|
79
|
+
updated_at TEXT NOT NULL
|
|
80
|
+
)`,
|
|
81
|
+
indexes: [],
|
|
82
|
+
},
|
|
83
|
+
'trajectory.assistant_turns': {
|
|
84
|
+
ddl: `CREATE TABLE IF NOT EXISTS assistant_turns (
|
|
85
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
86
|
+
session_id TEXT NOT NULL,
|
|
87
|
+
run_id TEXT NOT NULL,
|
|
88
|
+
provider TEXT NOT NULL,
|
|
89
|
+
model TEXT NOT NULL,
|
|
90
|
+
raw_text TEXT,
|
|
91
|
+
sanitized_text TEXT NOT NULL,
|
|
92
|
+
usage_json TEXT NOT NULL,
|
|
93
|
+
empathy_signal_json TEXT NOT NULL,
|
|
94
|
+
blob_ref TEXT,
|
|
95
|
+
raw_excerpt TEXT,
|
|
96
|
+
created_at TEXT NOT NULL
|
|
97
|
+
)`,
|
|
98
|
+
indexes: [
|
|
99
|
+
`CREATE INDEX IF NOT EXISTS idx_assistant_turns_session_id ON assistant_turns(session_id)`,
|
|
100
|
+
`CREATE INDEX IF NOT EXISTS idx_assistant_turns_created_at ON assistant_turns(created_at)`,
|
|
101
|
+
`CREATE INDEX IF NOT EXISTS idx_assistant_turns_provider_model ON assistant_turns(provider, model)`,
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
'trajectory.user_turns': {
|
|
105
|
+
ddl: `CREATE TABLE IF NOT EXISTS user_turns (
|
|
106
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
107
|
+
session_id TEXT NOT NULL,
|
|
108
|
+
turn_index INTEGER NOT NULL,
|
|
109
|
+
raw_text TEXT,
|
|
110
|
+
blob_ref TEXT,
|
|
111
|
+
raw_excerpt TEXT,
|
|
112
|
+
correction_detected INTEGER NOT NULL DEFAULT 0,
|
|
113
|
+
correction_cue TEXT,
|
|
114
|
+
references_assistant_turn_id INTEGER,
|
|
115
|
+
created_at TEXT NOT NULL
|
|
116
|
+
)`,
|
|
117
|
+
indexes: [
|
|
118
|
+
`CREATE INDEX IF NOT EXISTS idx_user_turns_session_id ON user_turns(session_id)`,
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
'trajectory.tool_calls': {
|
|
122
|
+
ddl: `CREATE TABLE IF NOT EXISTS tool_calls (
|
|
123
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
124
|
+
session_id TEXT NOT NULL,
|
|
125
|
+
tool_name TEXT NOT NULL,
|
|
126
|
+
outcome TEXT NOT NULL,
|
|
127
|
+
duration_ms INTEGER,
|
|
128
|
+
exit_code INTEGER,
|
|
129
|
+
error_type TEXT,
|
|
130
|
+
error_message TEXT,
|
|
131
|
+
gfi_before REAL,
|
|
132
|
+
gfi_after REAL,
|
|
133
|
+
params_json TEXT NOT NULL,
|
|
134
|
+
created_at TEXT NOT NULL
|
|
135
|
+
)`,
|
|
136
|
+
indexes: [
|
|
137
|
+
`CREATE INDEX IF NOT EXISTS idx_tool_calls_session_id ON tool_calls(session_id)`,
|
|
138
|
+
`CREATE INDEX IF NOT EXISTS idx_tool_calls_created_at ON tool_calls(created_at)`,
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
'trajectory.pain_events': {
|
|
142
|
+
ddl: `CREATE TABLE IF NOT EXISTS pain_events (
|
|
143
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
144
|
+
session_id TEXT NOT NULL,
|
|
145
|
+
source TEXT NOT NULL,
|
|
146
|
+
score REAL NOT NULL,
|
|
147
|
+
reason TEXT,
|
|
148
|
+
severity TEXT,
|
|
149
|
+
origin TEXT,
|
|
150
|
+
confidence REAL,
|
|
151
|
+
text TEXT,
|
|
152
|
+
created_at TEXT NOT NULL
|
|
153
|
+
)`,
|
|
154
|
+
indexes: [
|
|
155
|
+
`CREATE INDEX IF NOT EXISTS idx_pain_events_session_id ON pain_events(session_id)`,
|
|
156
|
+
`CREATE INDEX IF NOT EXISTS idx_pain_events_created_at ON pain_events(created_at)`,
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
'trajectory.gate_blocks': {
|
|
160
|
+
ddl: `CREATE TABLE IF NOT EXISTS gate_blocks (
|
|
161
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
162
|
+
session_id TEXT,
|
|
163
|
+
tool_name TEXT NOT NULL,
|
|
164
|
+
file_path TEXT,
|
|
165
|
+
reason TEXT NOT NULL,
|
|
166
|
+
plan_status TEXT,
|
|
167
|
+
gfi REAL,
|
|
168
|
+
gfi_after REAL,
|
|
169
|
+
trust_stage INTEGER,
|
|
170
|
+
gate_type TEXT,
|
|
171
|
+
created_at TEXT NOT NULL
|
|
172
|
+
)`,
|
|
173
|
+
indexes: [
|
|
174
|
+
`CREATE INDEX IF NOT EXISTS idx_gate_blocks_created_at ON gate_blocks(created_at)`,
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
'trajectory.trust_changes': {
|
|
178
|
+
ddl: `CREATE TABLE IF NOT EXISTS trust_changes (
|
|
179
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
180
|
+
session_id TEXT,
|
|
181
|
+
previous_score REAL NOT NULL,
|
|
182
|
+
new_score REAL NOT NULL,
|
|
183
|
+
delta REAL NOT NULL,
|
|
184
|
+
reason TEXT NOT NULL,
|
|
185
|
+
created_at TEXT NOT NULL
|
|
186
|
+
)`,
|
|
187
|
+
indexes: [],
|
|
188
|
+
},
|
|
189
|
+
'trajectory.principle_events': {
|
|
190
|
+
ddl: `CREATE TABLE IF NOT EXISTS principle_events (
|
|
191
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
192
|
+
principle_id TEXT,
|
|
193
|
+
event_type TEXT NOT NULL,
|
|
194
|
+
payload_json TEXT NOT NULL,
|
|
195
|
+
created_at TEXT NOT NULL
|
|
196
|
+
)`,
|
|
197
|
+
indexes: [],
|
|
198
|
+
},
|
|
199
|
+
'trajectory.task_outcomes': {
|
|
200
|
+
ddl: `CREATE TABLE IF NOT EXISTS task_outcomes (
|
|
201
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
202
|
+
session_id TEXT NOT NULL,
|
|
203
|
+
task_id TEXT,
|
|
204
|
+
outcome TEXT NOT NULL,
|
|
205
|
+
summary TEXT,
|
|
206
|
+
principle_ids_json TEXT NOT NULL,
|
|
207
|
+
created_at TEXT NOT NULL
|
|
208
|
+
)`,
|
|
209
|
+
indexes: [],
|
|
210
|
+
},
|
|
211
|
+
'trajectory.correction_samples': {
|
|
212
|
+
ddl: `CREATE TABLE IF NOT EXISTS correction_samples (
|
|
213
|
+
sample_id TEXT PRIMARY KEY,
|
|
214
|
+
session_id TEXT NOT NULL,
|
|
215
|
+
bad_assistant_turn_id INTEGER NOT NULL,
|
|
216
|
+
user_correction_turn_id INTEGER NOT NULL,
|
|
217
|
+
recovery_tool_span_json TEXT NOT NULL,
|
|
218
|
+
diff_excerpt TEXT NOT NULL,
|
|
219
|
+
principle_ids_json TEXT NOT NULL,
|
|
220
|
+
quality_score REAL NOT NULL,
|
|
221
|
+
review_status TEXT NOT NULL,
|
|
222
|
+
export_mode TEXT NOT NULL,
|
|
223
|
+
created_at TEXT NOT NULL,
|
|
224
|
+
updated_at TEXT NOT NULL
|
|
225
|
+
)`,
|
|
226
|
+
indexes: [
|
|
227
|
+
`CREATE INDEX IF NOT EXISTS idx_correction_samples_review_status ON correction_samples(review_status)`,
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
'trajectory.sample_reviews': {
|
|
231
|
+
ddl: `CREATE TABLE IF NOT EXISTS sample_reviews (
|
|
232
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
233
|
+
sample_id TEXT NOT NULL,
|
|
234
|
+
review_status TEXT NOT NULL,
|
|
235
|
+
note TEXT,
|
|
236
|
+
created_at TEXT NOT NULL
|
|
237
|
+
)`,
|
|
238
|
+
indexes: [],
|
|
239
|
+
},
|
|
240
|
+
'trajectory.exports_audit': {
|
|
241
|
+
ddl: `CREATE TABLE IF NOT EXISTS exports_audit (
|
|
242
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
243
|
+
export_kind TEXT NOT NULL,
|
|
244
|
+
mode TEXT NOT NULL,
|
|
245
|
+
approved_only INTEGER NOT NULL,
|
|
246
|
+
file_path TEXT NOT NULL,
|
|
247
|
+
row_count INTEGER NOT NULL,
|
|
248
|
+
created_at TEXT NOT NULL
|
|
249
|
+
)`,
|
|
250
|
+
indexes: [],
|
|
251
|
+
},
|
|
252
|
+
'trajectory.evolution_tasks': {
|
|
253
|
+
ddl: `CREATE TABLE IF NOT EXISTS evolution_tasks (
|
|
254
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
255
|
+
task_id TEXT UNIQUE NOT NULL,
|
|
256
|
+
trace_id TEXT NOT NULL,
|
|
257
|
+
source TEXT NOT NULL,
|
|
258
|
+
reason TEXT,
|
|
259
|
+
score INTEGER DEFAULT 0,
|
|
260
|
+
status TEXT DEFAULT 'pending',
|
|
261
|
+
enqueued_at TEXT,
|
|
262
|
+
started_at TEXT,
|
|
263
|
+
completed_at TEXT,
|
|
264
|
+
resolution TEXT,
|
|
265
|
+
task_kind TEXT,
|
|
266
|
+
priority TEXT,
|
|
267
|
+
retry_count INTEGER,
|
|
268
|
+
max_retries INTEGER,
|
|
269
|
+
last_error TEXT,
|
|
270
|
+
result_ref TEXT,
|
|
271
|
+
created_at TEXT NOT NULL,
|
|
272
|
+
updated_at TEXT NOT NULL
|
|
273
|
+
)`,
|
|
274
|
+
indexes: [
|
|
275
|
+
`CREATE INDEX IF NOT EXISTS idx_evolution_tasks_trace_id ON evolution_tasks(trace_id)`,
|
|
276
|
+
`CREATE INDEX IF NOT EXISTS idx_evolution_tasks_status ON evolution_tasks(status)`,
|
|
277
|
+
`CREATE INDEX IF NOT EXISTS idx_evolution_tasks_created_at ON evolution_tasks(created_at)`,
|
|
278
|
+
],
|
|
279
|
+
},
|
|
280
|
+
'trajectory.evolution_events': {
|
|
281
|
+
ddl: `CREATE TABLE IF NOT EXISTS evolution_events (
|
|
282
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
283
|
+
trace_id TEXT NOT NULL,
|
|
284
|
+
task_id TEXT,
|
|
285
|
+
stage TEXT NOT NULL,
|
|
286
|
+
level TEXT DEFAULT 'info',
|
|
287
|
+
message TEXT NOT NULL,
|
|
288
|
+
summary TEXT,
|
|
289
|
+
metadata_json TEXT,
|
|
290
|
+
created_at TEXT NOT NULL
|
|
291
|
+
)`,
|
|
292
|
+
indexes: [
|
|
293
|
+
`CREATE INDEX IF NOT EXISTS idx_evolution_events_trace_id ON evolution_events(trace_id)`,
|
|
294
|
+
`CREATE INDEX IF NOT EXISTS idx_evolution_events_created_at ON evolution_events(created_at)`,
|
|
295
|
+
],
|
|
296
|
+
},
|
|
297
|
+
'trajectory.thinking_model_events': {
|
|
298
|
+
ddl: `CREATE TABLE IF NOT EXISTS thinking_model_events (
|
|
299
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
300
|
+
session_id TEXT NOT NULL,
|
|
301
|
+
run_id TEXT NOT NULL,
|
|
302
|
+
assistant_turn_id INTEGER NOT NULL,
|
|
303
|
+
model_id TEXT NOT NULL,
|
|
304
|
+
matched_pattern TEXT NOT NULL,
|
|
305
|
+
scenario_json TEXT NOT NULL,
|
|
306
|
+
tool_context_json TEXT NOT NULL,
|
|
307
|
+
pain_context_json TEXT NOT NULL,
|
|
308
|
+
principle_context_json TEXT NOT NULL,
|
|
309
|
+
trigger_excerpt TEXT NOT NULL,
|
|
310
|
+
created_at TEXT NOT NULL
|
|
311
|
+
)`,
|
|
312
|
+
indexes: [
|
|
313
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_model_events_model_created ON thinking_model_events(model_id, created_at)`,
|
|
314
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_model_events_session_created ON thinking_model_events(session_id, created_at)`,
|
|
315
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_model_events_assistant_turn ON thinking_model_events(assistant_turn_id)`,
|
|
316
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_model_events_run_id ON thinking_model_events(run_id)`,
|
|
317
|
+
],
|
|
318
|
+
},
|
|
319
|
+
'trajectory.gfi_state': {
|
|
320
|
+
ddl: `CREATE TABLE IF NOT EXISTS gfi_state (
|
|
321
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
322
|
+
current_gfi REAL NOT NULL DEFAULT 0,
|
|
323
|
+
daily_gfi_peak REAL NOT NULL DEFAULT 0,
|
|
324
|
+
gfi_date TEXT NOT NULL DEFAULT ''
|
|
325
|
+
)`,
|
|
326
|
+
indexes: [],
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
views: {
|
|
330
|
+
'trajectory.v_error_clusters': {
|
|
331
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_error_clusters AS
|
|
332
|
+
SELECT tool_name, COALESCE(error_type, 'unknown') AS error_type, COUNT(*) AS occurrences
|
|
333
|
+
FROM tool_calls WHERE outcome = 'failure'
|
|
334
|
+
GROUP BY tool_name, COALESCE(error_type, 'unknown')
|
|
335
|
+
ORDER BY occurrences DESC`,
|
|
336
|
+
},
|
|
337
|
+
'trajectory.v_principle_effectiveness': {
|
|
338
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_principle_effectiveness AS
|
|
339
|
+
SELECT event_type, COUNT(*) AS total FROM principle_events
|
|
340
|
+
GROUP BY event_type ORDER BY total DESC`,
|
|
341
|
+
},
|
|
342
|
+
'trajectory.v_sample_queue': {
|
|
343
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_sample_queue AS
|
|
344
|
+
SELECT review_status, COUNT(*) AS total FROM correction_samples
|
|
345
|
+
GROUP BY review_status`,
|
|
346
|
+
},
|
|
347
|
+
'trajectory.v_daily_metrics': {
|
|
348
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_daily_metrics AS
|
|
349
|
+
WITH tool_daily AS (
|
|
350
|
+
SELECT date(created_at) AS day, COUNT(*) AS toolCalls,
|
|
351
|
+
SUM(CASE WHEN outcome = 'failure' THEN 1 ELSE 0 END) AS failures
|
|
352
|
+
FROM tool_calls GROUP BY date(created_at)
|
|
353
|
+
),
|
|
354
|
+
pain_daily AS (
|
|
355
|
+
SELECT date(created_at) AS day, COUNT(*) AS painEvents
|
|
356
|
+
FROM pain_events GROUP BY date(created_at)
|
|
357
|
+
),
|
|
358
|
+
corrections_daily AS (
|
|
359
|
+
SELECT date(created_at) AS day, COUNT(*) AS userCorrections
|
|
360
|
+
FROM correction_samples GROUP BY date(created_at)
|
|
361
|
+
),
|
|
362
|
+
thinking_daily AS (
|
|
363
|
+
SELECT date(created_at) AS day, COUNT(*) AS thinkingTurns
|
|
364
|
+
FROM thinking_model_events GROUP BY date(created_at)
|
|
365
|
+
)
|
|
366
|
+
SELECT
|
|
367
|
+
COALESCE(t.day, p.day, c.day, th.day) AS day,
|
|
368
|
+
COALESCE(t.toolCalls, 0) AS toolCalls,
|
|
369
|
+
COALESCE(t.failures, 0) AS failures,
|
|
370
|
+
COALESCE(p.painEvents, 0) AS painEvents,
|
|
371
|
+
COALESCE(c.userCorrections, 0) AS userCorrections,
|
|
372
|
+
COALESCE(th.thinkingTurns, 0) AS thinkingTurns
|
|
373
|
+
FROM tool_daily t
|
|
374
|
+
FULL OUTER JOIN pain_daily p ON t.day = p.day
|
|
375
|
+
FULL OUTER JOIN corrections_daily c ON COALESCE(t.day, p.day) = c.day
|
|
376
|
+
FULL OUTER JOIN thinking_daily th ON COALESCE(COALESCE(t.day, p.day), c.day) = th.day
|
|
377
|
+
ORDER BY day ASC`,
|
|
378
|
+
},
|
|
379
|
+
'trajectory.v_thinking_model_usage': {
|
|
380
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_thinking_model_usage AS
|
|
381
|
+
SELECT
|
|
382
|
+
model_id,
|
|
383
|
+
COUNT(*) AS hits,
|
|
384
|
+
COUNT(DISTINCT session_id) AS distinctSessions,
|
|
385
|
+
COUNT(DISTINCT assistant_turn_id) AS distinctTurns,
|
|
386
|
+
CAST(COUNT(DISTINCT session_id) AS REAL) /
|
|
387
|
+
NULLIF((SELECT COUNT(DISTINCT session_id) FROM thinking_model_events), 0) AS coverageRate
|
|
388
|
+
FROM thinking_model_events GROUP BY model_id`,
|
|
389
|
+
},
|
|
390
|
+
'trajectory.v_thinking_model_effectiveness': {
|
|
391
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_thinking_model_effectiveness AS
|
|
392
|
+
SELECT tme.model_id, tme.id AS event_id,
|
|
393
|
+
COUNT(DISTINCT tc.id) AS toolCallsAfter,
|
|
394
|
+
SUM(CASE WHEN tc.outcome = 'success' THEN 1 ELSE 0 END) AS successes,
|
|
395
|
+
SUM(CASE WHEN tc.outcome = 'failure' THEN 1 ELSE 0 END) AS failures,
|
|
396
|
+
COUNT(DISTINCT pe.id) AS painEventsAfter
|
|
397
|
+
FROM thinking_model_events tme
|
|
398
|
+
LEFT JOIN tool_calls tc ON tc.session_id = tme.session_id AND tc.created_at > tme.created_at
|
|
399
|
+
LEFT JOIN pain_events pe ON pe.session_id = tme.session_id AND pe.created_at > tme.created_at
|
|
400
|
+
GROUP BY tme.model_id, tme.id`,
|
|
401
|
+
},
|
|
402
|
+
'trajectory.v_thinking_model_scenarios': {
|
|
403
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_thinking_model_scenarios AS
|
|
404
|
+
SELECT tme.model_id, json_each.value AS scenario, COUNT(*) AS hits
|
|
405
|
+
FROM thinking_model_events tme, json_each(tme.scenario_json)
|
|
406
|
+
GROUP BY tme.model_id, json_each.value`,
|
|
407
|
+
},
|
|
408
|
+
'trajectory.v_thinking_model_daily_trend': {
|
|
409
|
+
ddl: `CREATE VIEW IF NOT EXISTS v_thinking_model_daily_trend AS
|
|
410
|
+
SELECT date(created_at) AS day, model_id, COUNT(*) AS hits
|
|
411
|
+
FROM thinking_model_events GROUP BY date(created_at), model_id ORDER BY day ASC`,
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
fts: {
|
|
415
|
+
'trajectory.pain_events_fts': {
|
|
416
|
+
ddl: `CREATE VIRTUAL TABLE IF NOT EXISTS pain_events_fts USING fts5(
|
|
417
|
+
text,
|
|
418
|
+
pain_event_id UNINDEXED,
|
|
419
|
+
tokenize='porter unicode61'
|
|
420
|
+
)`,
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
|
|
425
|
+
// ========================================================================
|
|
426
|
+
// central.db — Aggregated multi-workspace data
|
|
427
|
+
// ========================================================================
|
|
428
|
+
'central.db': {
|
|
429
|
+
tables: {
|
|
430
|
+
'central.schema_version': {
|
|
431
|
+
ddl: `CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL)`,
|
|
432
|
+
},
|
|
433
|
+
'central.workspaces': {
|
|
434
|
+
ddl: `CREATE TABLE IF NOT EXISTS workspaces (
|
|
435
|
+
name TEXT PRIMARY KEY,
|
|
436
|
+
path TEXT NOT NULL,
|
|
437
|
+
last_sync TEXT
|
|
438
|
+
)`,
|
|
439
|
+
},
|
|
440
|
+
'central.workspace_config': {
|
|
441
|
+
ddl: `CREATE TABLE IF NOT EXISTS workspace_config (
|
|
442
|
+
workspace_name TEXT PRIMARY KEY,
|
|
443
|
+
enabled INTEGER NOT NULL DEFAULT 1,
|
|
444
|
+
display_name TEXT,
|
|
445
|
+
sync_enabled INTEGER NOT NULL DEFAULT 1,
|
|
446
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
447
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
448
|
+
)`,
|
|
449
|
+
},
|
|
450
|
+
'central.global_config': {
|
|
451
|
+
ddl: `CREATE TABLE IF NOT EXISTS global_config (
|
|
452
|
+
key TEXT PRIMARY KEY,
|
|
453
|
+
value TEXT NOT NULL,
|
|
454
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
455
|
+
)`,
|
|
456
|
+
},
|
|
457
|
+
'central.aggregated_sessions': {
|
|
458
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_sessions (
|
|
459
|
+
session_id TEXT PRIMARY KEY,
|
|
460
|
+
workspace TEXT NOT NULL,
|
|
461
|
+
started_at TEXT NOT NULL,
|
|
462
|
+
updated_at TEXT NOT NULL
|
|
463
|
+
)`,
|
|
464
|
+
indexes: [
|
|
465
|
+
`CREATE INDEX IF NOT EXISTS idx_sessions_workspace ON aggregated_sessions(workspace)`,
|
|
466
|
+
],
|
|
467
|
+
},
|
|
468
|
+
'central.aggregated_tool_calls': {
|
|
469
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_tool_calls (
|
|
470
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
471
|
+
workspace TEXT NOT NULL,
|
|
472
|
+
session_id TEXT NOT NULL,
|
|
473
|
+
tool_name TEXT NOT NULL,
|
|
474
|
+
outcome TEXT NOT NULL,
|
|
475
|
+
duration_ms INTEGER,
|
|
476
|
+
error_type TEXT,
|
|
477
|
+
error_message TEXT,
|
|
478
|
+
created_at TEXT NOT NULL
|
|
479
|
+
)`,
|
|
480
|
+
indexes: [
|
|
481
|
+
`CREATE INDEX IF NOT EXISTS idx_tool_calls_workspace ON aggregated_tool_calls(workspace)`,
|
|
482
|
+
`CREATE INDEX IF NOT EXISTS idx_tool_calls_outcome ON aggregated_tool_calls(outcome)`,
|
|
483
|
+
`CREATE INDEX IF NOT EXISTS idx_tool_calls_created ON aggregated_tool_calls(created_at)`,
|
|
484
|
+
],
|
|
485
|
+
},
|
|
486
|
+
'central.aggregated_pain_events': {
|
|
487
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_pain_events (
|
|
488
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
489
|
+
workspace TEXT NOT NULL,
|
|
490
|
+
session_id TEXT NOT NULL,
|
|
491
|
+
source TEXT NOT NULL,
|
|
492
|
+
score REAL NOT NULL,
|
|
493
|
+
reason TEXT,
|
|
494
|
+
created_at TEXT NOT NULL
|
|
495
|
+
)`,
|
|
496
|
+
indexes: [
|
|
497
|
+
`CREATE INDEX IF NOT EXISTS idx_pain_workspace ON aggregated_pain_events(workspace)`,
|
|
498
|
+
`CREATE INDEX IF NOT EXISTS idx_pain_created ON aggregated_pain_events(created_at)`,
|
|
499
|
+
],
|
|
500
|
+
},
|
|
501
|
+
'central.aggregated_user_corrections': {
|
|
502
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_user_corrections (
|
|
503
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
504
|
+
workspace TEXT NOT NULL,
|
|
505
|
+
session_id TEXT NOT NULL,
|
|
506
|
+
correction_cue TEXT,
|
|
507
|
+
created_at TEXT NOT NULL
|
|
508
|
+
)`,
|
|
509
|
+
indexes: [],
|
|
510
|
+
},
|
|
511
|
+
'central.aggregated_principle_events': {
|
|
512
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_principle_events (
|
|
513
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
514
|
+
workspace TEXT NOT NULL,
|
|
515
|
+
principle_id TEXT,
|
|
516
|
+
event_type TEXT NOT NULL,
|
|
517
|
+
created_at TEXT NOT NULL
|
|
518
|
+
)`,
|
|
519
|
+
indexes: [],
|
|
520
|
+
},
|
|
521
|
+
'central.aggregated_thinking_events': {
|
|
522
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_thinking_events (
|
|
523
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
524
|
+
workspace TEXT NOT NULL,
|
|
525
|
+
session_id TEXT NOT NULL,
|
|
526
|
+
model_id TEXT NOT NULL,
|
|
527
|
+
matched_pattern TEXT NOT NULL,
|
|
528
|
+
created_at TEXT NOT NULL
|
|
529
|
+
)`,
|
|
530
|
+
indexes: [
|
|
531
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_workspace ON aggregated_thinking_events(workspace)`,
|
|
532
|
+
`CREATE INDEX IF NOT EXISTS idx_thinking_model ON aggregated_thinking_events(model_id)`,
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
'central.aggregated_correction_samples': {
|
|
536
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_correction_samples (
|
|
537
|
+
sample_id TEXT PRIMARY KEY,
|
|
538
|
+
workspace TEXT NOT NULL,
|
|
539
|
+
session_id TEXT NOT NULL,
|
|
540
|
+
bad_assistant_turn_id INTEGER NOT NULL,
|
|
541
|
+
quality_score REAL,
|
|
542
|
+
review_status TEXT,
|
|
543
|
+
created_at TEXT NOT NULL
|
|
544
|
+
)`,
|
|
545
|
+
indexes: [
|
|
546
|
+
`CREATE INDEX IF NOT EXISTS idx_corrections_workspace ON aggregated_correction_samples(workspace)`,
|
|
547
|
+
],
|
|
548
|
+
},
|
|
549
|
+
'central.aggregated_task_outcomes': {
|
|
550
|
+
ddl: `CREATE TABLE IF NOT EXISTS aggregated_task_outcomes (
|
|
551
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
552
|
+
workspace TEXT NOT NULL,
|
|
553
|
+
session_id TEXT NOT NULL,
|
|
554
|
+
task_id TEXT,
|
|
555
|
+
outcome TEXT NOT NULL,
|
|
556
|
+
created_at TEXT NOT NULL
|
|
557
|
+
)`,
|
|
558
|
+
indexes: [],
|
|
559
|
+
},
|
|
560
|
+
'central.sync_log': {
|
|
561
|
+
ddl: `CREATE TABLE IF NOT EXISTS sync_log (
|
|
562
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
563
|
+
workspace TEXT NOT NULL,
|
|
564
|
+
synced_at TEXT NOT NULL,
|
|
565
|
+
records_synced INTEGER NOT NULL
|
|
566
|
+
)`,
|
|
567
|
+
indexes: [],
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
views: {},
|
|
571
|
+
fts: {},
|
|
572
|
+
},
|
|
573
|
+
|
|
574
|
+
// ========================================================================
|
|
575
|
+
// workflow.db — Subagent workflow tracking
|
|
576
|
+
// ========================================================================
|
|
577
|
+
'workflow.db': {
|
|
578
|
+
tables: {
|
|
579
|
+
'workflow.schema_version': {
|
|
580
|
+
ddl: `CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL)`,
|
|
581
|
+
},
|
|
582
|
+
'workflow.subagent_workflows': {
|
|
583
|
+
ddl: `CREATE TABLE IF NOT EXISTS subagent_workflows (
|
|
584
|
+
workflow_id TEXT PRIMARY KEY,
|
|
585
|
+
workflow_type TEXT NOT NULL,
|
|
586
|
+
transport TEXT NOT NULL,
|
|
587
|
+
parent_session_id TEXT NOT NULL,
|
|
588
|
+
child_session_key TEXT NOT NULL,
|
|
589
|
+
run_id TEXT,
|
|
590
|
+
state TEXT NOT NULL DEFAULT 'pending',
|
|
591
|
+
cleanup_state TEXT NOT NULL DEFAULT 'none',
|
|
592
|
+
created_at INTEGER NOT NULL,
|
|
593
|
+
updated_at INTEGER NOT NULL,
|
|
594
|
+
last_observed_at INTEGER,
|
|
595
|
+
duration_ms INTEGER,
|
|
596
|
+
metadata_json TEXT NOT NULL DEFAULT '{}'
|
|
597
|
+
)`,
|
|
598
|
+
indexes: [
|
|
599
|
+
`CREATE INDEX IF NOT EXISTS idx_workflows_parent_session ON subagent_workflows(parent_session_id)`,
|
|
600
|
+
`CREATE INDEX IF NOT EXISTS idx_workflows_child_session ON subagent_workflows(child_session_key)`,
|
|
601
|
+
`CREATE INDEX IF NOT EXISTS idx_workflows_state ON subagent_workflows(state)`,
|
|
602
|
+
`CREATE INDEX IF NOT EXISTS idx_workflows_type ON subagent_workflows(workflow_type)`,
|
|
603
|
+
],
|
|
604
|
+
},
|
|
605
|
+
'workflow.subagent_workflow_events': {
|
|
606
|
+
ddl: `CREATE TABLE IF NOT EXISTS subagent_workflow_events (
|
|
607
|
+
workflow_id TEXT NOT NULL,
|
|
608
|
+
event_type TEXT NOT NULL,
|
|
609
|
+
from_state TEXT,
|
|
610
|
+
to_state TEXT NOT NULL,
|
|
611
|
+
reason TEXT NOT NULL,
|
|
612
|
+
payload_json TEXT NOT NULL DEFAULT '{}',
|
|
613
|
+
created_at INTEGER NOT NULL,
|
|
614
|
+
FOREIGN KEY (workflow_id) REFERENCES subagent_workflows(workflow_id) ON DELETE CASCADE
|
|
615
|
+
)`,
|
|
616
|
+
indexes: [
|
|
617
|
+
`CREATE INDEX IF NOT EXISTS idx_events_workflow ON subagent_workflow_events(workflow_id)`,
|
|
618
|
+
],
|
|
619
|
+
},
|
|
620
|
+
'workflow.subagent_workflow_stage_outputs': {
|
|
621
|
+
ddl: `CREATE TABLE IF NOT EXISTS subagent_workflow_stage_outputs (
|
|
622
|
+
workflow_id TEXT NOT NULL,
|
|
623
|
+
stage TEXT NOT NULL CHECK (stage IN ('dreamer', 'philosopher')),
|
|
624
|
+
output_json TEXT NOT NULL,
|
|
625
|
+
idempotency_key TEXT NOT NULL,
|
|
626
|
+
created_at INTEGER NOT NULL,
|
|
627
|
+
FOREIGN KEY (workflow_id) REFERENCES subagent_workflows(workflow_id) ON DELETE CASCADE
|
|
628
|
+
)`,
|
|
629
|
+
indexes: [
|
|
630
|
+
`CREATE INDEX IF NOT EXISTS idx_stage_outputs_workflow ON subagent_workflow_stage_outputs(workflow_id)`,
|
|
631
|
+
`CREATE UNIQUE INDEX IF NOT EXISTS idx_stage_outputs_idempotency ON subagent_workflow_stage_outputs(idempotency_key)`,
|
|
632
|
+
],
|
|
633
|
+
},
|
|
634
|
+
},
|
|
635
|
+
views: {},
|
|
636
|
+
fts: {},
|
|
637
|
+
},
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
// ---------------------------------------------------------------------------
|
|
641
|
+
// Helpers
|
|
642
|
+
// ---------------------------------------------------------------------------
|
|
643
|
+
|
|
644
|
+
/** Get all schema definitions for a specific database */
|
|
645
|
+
export function getCatalog(db: DbType): SchemaCatalog {
|
|
646
|
+
return SCHEMAS[db];
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/** Get all database types */
|
|
650
|
+
export const DB_TYPES: DbType[] = ['trajectory.db', 'central.db', 'workflow.db'];
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { PluginHookLlmOutputEvent } from '../openclaw-sdk.js';
|
|
2
1
|
import * as path from 'path';
|
|
3
2
|
import * as fs from 'fs';
|
|
4
|
-
import { PainConfig } from './config.js';
|
|
3
|
+
import type { PainConfig } from './config.js';
|
|
5
4
|
import { SystemLogger } from './system-logger.js';
|
|
6
|
-
import { EventLogService } from './event-log.js';
|
|
7
5
|
|
|
8
6
|
export interface TokenUsage {
|
|
9
7
|
input?: number;
|
|
@@ -61,7 +59,7 @@ const persistTimers = new Map<string, ReturnType<typeof setTimeout>>();
|
|
|
61
59
|
function logSessionTrackerWarning(message: string, error?: unknown): void {
|
|
62
60
|
const detail = error instanceof Error ? error.message : error ? String(error) : '';
|
|
63
61
|
const suffix = detail ? `: ${detail}` : '';
|
|
64
|
-
|
|
62
|
+
|
|
65
63
|
console.warn(`[PD:SessionTracker] ${message}${suffix}`);
|
|
66
64
|
}
|
|
67
65
|
|
|
@@ -84,6 +82,7 @@ export function initPersistence(stateDir: string): void {
|
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
// Load all existing sessions
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define -- Reason: loadAllSessions is defined later in this file, called here for organizational reasons
|
|
87
86
|
loadAllSessions();
|
|
88
87
|
}
|
|
89
88
|
|
|
@@ -172,6 +171,7 @@ export function flushAllSessions(): void {
|
|
|
172
171
|
}
|
|
173
172
|
}
|
|
174
173
|
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/max-params -- Reason: session creation requires all 4 params (sessionId, workspaceDir, sessionKey, trigger) - refactoring would break API
|
|
175
175
|
function getOrCreateSession(sessionId: string, workspaceDir?: string, sessionKey?: string, trigger?: string): SessionState {
|
|
176
176
|
let state = sessions.get(sessionId);
|
|
177
177
|
if (!state) {
|
|
@@ -232,6 +232,7 @@ export function trackToolRead(sessionId: string, filePath: string, workspaceDir?
|
|
|
232
232
|
return state;
|
|
233
233
|
}
|
|
234
234
|
|
|
235
|
+
// eslint-disable-next-line @typescript-eslint/max-params -- Reason: LLM output tracking requires all 6 params - refactoring would break API
|
|
235
236
|
export function trackLlmOutput(sessionId: string, usage: TokenUsage | undefined, config?: PainConfig, workspaceDir?: string, sessionKey?: string, trigger?: string): SessionState {
|
|
236
237
|
const state = getOrCreateSession(sessionId, workspaceDir, sessionKey, trigger);
|
|
237
238
|
state.llmTurns += 1;
|
|
@@ -270,6 +271,7 @@ export function trackLlmOutput(sessionId: string, usage: TokenUsage | undefined,
|
|
|
270
271
|
/**
|
|
271
272
|
* Tracks physical friction based on tool execution failures.
|
|
272
273
|
*/
|
|
274
|
+
// eslint-disable-next-line @typescript-eslint/max-params -- Reason: friction tracking requires all 5 params - refactoring would break API
|
|
273
275
|
export function trackFriction(
|
|
274
276
|
sessionId: string,
|
|
275
277
|
deltaF: number,
|