agentlas 1.0.47 → 1.0.49

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 (36) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +4 -2
  3. package/bin/agentlas.cjs +10 -0
  4. package/engine/acp/server.cjs +279 -0
  5. package/engine/agentlas-capabilities.cjs +2 -1
  6. package/engine/agentlas-input.cjs +2 -1
  7. package/engine/agentlas-native-host.cjs +6 -0
  8. package/engine/agentlas-onboard.cjs +2 -1
  9. package/engine/agentlas-sqlite-policy.cjs +9 -0
  10. package/engine/automation/daemon.cjs +3 -7
  11. package/engine/bootstrap-schema.sql +1037 -1010
  12. package/engine/cloud-assets/package.cjs +11 -3
  13. package/engine/cloud-assets/upload-scan-catalog.generated.cjs +102 -0
  14. package/engine/commands/acp.cjs +45 -0
  15. package/engine/commands/billing.cjs +2 -2
  16. package/engine/commands/call.cjs +4 -0
  17. package/engine/commands/doctor.cjs +2 -1
  18. package/engine/commands/index.cjs +2 -0
  19. package/engine/commands/workforce.cjs +11 -0
  20. package/engine/core/db.cjs +53 -1
  21. package/engine/core/desktop-core.cjs +108 -4
  22. package/engine/core/store-schema.cjs +119 -0
  23. package/engine/firms/orchestrate.cjs +32 -1
  24. package/engine/project/memory-context.cjs +7 -0
  25. package/engine/runtimes/acp-driver.cjs +96 -0
  26. package/engine/runtimes/detect.cjs +3 -13
  27. package/engine/runtimes/kinds.cjs +84 -0
  28. package/engine/runtimes/resolve.cjs +40 -7
  29. package/engine/ui/commands-catalog.cjs +2 -0
  30. package/engine/ui/palette.cjs +2 -1
  31. package/engine/ui/repl.cjs +2 -1
  32. package/engine/ui/shell.cjs +38 -3
  33. package/engine/vendor/desktop-core.manifest.json +5 -5
  34. package/engine/workforce/capture.cjs +4 -8
  35. package/engine/workforce/deps.cjs +7 -0
  36. package/package.json +2 -1
@@ -1,81 +1,102 @@
1
- -- Agentlas 첫 실행 부트스트랩 스키마 (생성: 2026-08-12T07:38:56Z)
2
- -- 소스 DB user_version=94 — 앱이 나중에 설치되면 여기서부터 마이그레이션한다.
3
- PRAGMA user_version=94;
1
+ -- Agentlas 첫 실행 부트스트랩 스키마 (생성: 2026-08-18T11:06:30Z)
2
+ --
3
+ -- ★생성물이다. 손으로 고치지 말고 재생성하라:
4
+ -- node scripts/gen-bootstrap-schema.cjs
5
+ --
6
+ -- 정본은 Desktop 의 마이그레이션 사다리(agentlas_desktop/electron/store/db.ts, SCHEMA_VERSION).
7
+ -- 이 파일은 그 사다리를 **빈 DB** 에 끝까지 돌린 결과의 덤프이므로, 터미널이 만든 DB 는
8
+ -- 처음부터 사다리 머리에 있다 — 데스크탑이 나중에 승급할 것이 남지 않는다.
9
+ PRAGMA user_version=97;
4
10
  CREATE TABLE active_runtime (
5
11
  id INTEGER PRIMARY KEY CHECK(id = 1),
6
12
  kind TEXT NOT NULL
7
13
  , backend TEXT, source TEXT, model TEXT, long_context INTEGER NOT NULL DEFAULT 0);
8
- CREATE TABLE installed_agents (
9
- id TEXT PRIMARY KEY,
10
- slug TEXT UNIQUE NOT NULL,
11
- name TEXT NOT NULL,
12
- tagline TEXT NOT NULL,
13
- system_prompt TEXT NOT NULL DEFAULT '',
14
- mcp_servers_json TEXT NOT NULL,
15
- preferred_backend TEXT,
16
- trust_grade TEXT NOT NULL,
17
- installed_at TEXT NOT NULL,
18
- tone TEXT NOT NULL
19
- , env_requirements_json TEXT NOT NULL DEFAULT '[]', name_en TEXT NOT NULL DEFAULT '', tagline_en TEXT NOT NULL DEFAULT '', builtin INTEGER NOT NULL DEFAULT 0, role TEXT, visibility TEXT NOT NULL DEFAULT 'visible' CHECK(visibility IN ('visible','background','private')), entity_kind TEXT, local_display_name TEXT, bookmarked_at TEXT NULL, parent_team_id TEXT NULL);
20
- CREATE TABLE projects (
14
+ CREATE TABLE agent_app_operations (
21
15
  id TEXT PRIMARY KEY,
22
- name TEXT NOT NULL,
23
- description TEXT,
24
- default_agent_id TEXT,
25
- context_note TEXT,
16
+ app_id TEXT NOT NULL,
17
+ operation TEXT NOT NULL,
18
+ ok INTEGER NOT NULL DEFAULT 1,
19
+ result_json TEXT NOT NULL,
26
20
  created_at TEXT NOT NULL,
27
- updated_at TEXT NOT NULL, folder_path TEXT, system_prompt TEXT, agent_pool_json TEXT NOT NULL DEFAULT '[]', source_type TEXT NOT NULL DEFAULT 'local', source_ref TEXT,
28
- FOREIGN KEY(default_agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
21
+ FOREIGN KEY(app_id) REFERENCES agent_apps(id) ON DELETE CASCADE
29
22
  );
30
- CREATE TABLE chats (
23
+ CREATE TABLE agent_apps (
31
24
  id TEXT PRIMARY KEY,
25
+ chat_id TEXT NOT NULL,
32
26
  project_id TEXT,
33
27
  agent_id TEXT NOT NULL,
34
- title TEXT NOT NULL DEFAULT 'New chat',
28
+ surface_id TEXT NOT NULL,
29
+ action_id TEXT,
30
+ app_name TEXT NOT NULL,
31
+ domain TEXT NOT NULL,
32
+ layout TEXT NOT NULL,
33
+ root_path TEXT NOT NULL,
34
+ preview_path TEXT NOT NULL,
35
+ setup_path TEXT NOT NULL,
36
+ smoke_path TEXT NOT NULL,
37
+ manifest_json TEXT NOT NULL,
38
+ result_json TEXT NOT NULL,
39
+ status TEXT NOT NULL DEFAULT 'scaffolded',
35
40
  created_at TEXT NOT NULL,
36
- updated_at TEXT NOT NULL, firm_id TEXT REFERENCES firms(id) ON DELETE SET NULL, archived_at TEXT, working_folder TEXT, kind TEXT NOT NULL DEFAULT 'user', parent_chat_id TEXT, used_at TEXT, continuous_mode INTEGER NOT NULL DEFAULT 0, swarm_mode INTEGER NOT NULL DEFAULT 0, last_viewed_at TEXT, hired_agents TEXT, origin_surface TEXT NOT NULL DEFAULT 'work', runtime_selection_json TEXT, goal_id TEXT,
37
- FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
41
+ updated_at TEXT NOT NULL,
42
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
43
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL
44
+ );
45
+ CREATE TABLE agent_architecture_migrations (
46
+ agent_id TEXT NOT NULL,
47
+ step_id TEXT NOT NULL,
48
+ architecture_version TEXT NOT NULL,
49
+ outcome TEXT NOT NULL CHECK(outcome IN ('applied','noop','failed')),
50
+ changed INTEGER NOT NULL DEFAULT 0,
51
+ detail TEXT,
52
+ applied_at TEXT NOT NULL,
53
+ PRIMARY KEY (agent_id, step_id)
54
+ );
55
+ CREATE TABLE agent_asset_versions (
56
+ agent_id TEXT PRIMARY KEY,
57
+ version INTEGER NOT NULL,
58
+ package_hash TEXT NOT NULL,
59
+ updated_at TEXT NOT NULL,
38
60
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
39
61
  );
40
- CREATE INDEX idx_chats_updated ON chats(updated_at DESC);
41
- CREATE INDEX idx_chats_project_updated
42
- ON chats(project_id, updated_at DESC);
43
- CREATE TABLE chat_messages (
62
+ CREATE TABLE agent_evolution_proposals (
44
63
  id TEXT PRIMARY KEY,
45
- chat_id TEXT NOT NULL,
46
- role TEXT NOT NULL CHECK(role IN ('user','assistant','system')),
47
- text TEXT NOT NULL,
64
+ agent_id TEXT NOT NULL,
65
+ proposal_type TEXT NOT NULL,
66
+ summary TEXT NOT NULL,
67
+ target_path TEXT NOT NULL,
68
+ before_hash TEXT NOT NULL,
69
+ after_hash TEXT NOT NULL,
70
+ before_content TEXT NOT NULL,
71
+ after_content TEXT NOT NULL,
72
+ risk TEXT NOT NULL,
73
+ status TEXT NOT NULL,
74
+ source_json TEXT NOT NULL DEFAULT '{}',
75
+ decision_note TEXT,
76
+ last_error TEXT,
48
77
  created_at TEXT NOT NULL,
49
- FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
50
- );
51
- CREATE INDEX idx_chat_messages_chat_created
52
- ON chat_messages(chat_id, created_at);
53
- CREATE TABLE firms (
54
- id TEXT PRIMARY KEY,
55
- slug TEXT UNIQUE NOT NULL,
56
- name TEXT NOT NULL,
57
- tagline TEXT NOT NULL,
58
- persona TEXT NOT NULL,
59
- ceo_agent_id TEXT NOT NULL,
60
- org_chart_json TEXT NOT NULL,
61
- installed_at TEXT NOT NULL, name_en TEXT NOT NULL DEFAULT '', tagline_en TEXT NOT NULL DEFAULT '',
62
- FOREIGN KEY(ceo_agent_id) REFERENCES installed_agents(id) ON DELETE RESTRICT
63
- );
64
- CREATE INDEX idx_firms_installed ON firms(installed_at DESC);
65
- CREATE INDEX idx_chats_firm_updated ON chats(firm_id, updated_at DESC);
66
- CREATE INDEX idx_chats_archived_updated ON chats(archived_at, updated_at DESC);
67
- CREATE TABLE mcp_servers (
78
+ updated_at TEXT NOT NULL,
79
+ approved_at TEXT,
80
+ applied_at TEXT,
81
+ measured_at TEXT,
82
+ rolled_back_at TEXT
83
+ , operation_json TEXT);
84
+ CREATE TABLE agent_evolution_receipts (
68
85
  id TEXT PRIMARY KEY,
69
- catalog_id TEXT,
70
- name TEXT NOT NULL,
71
- name_en TEXT NOT NULL DEFAULT '',
72
- transport TEXT NOT NULL,
73
- command TEXT,
74
- args_json TEXT NOT NULL DEFAULT '[]',
75
- url TEXT,
76
- env_keys_json TEXT NOT NULL DEFAULT '[]',
77
- enabled INTEGER NOT NULL DEFAULT 1,
78
- installed_at TEXT NOT NULL
86
+ proposal_id TEXT NOT NULL,
87
+ agent_id TEXT NOT NULL,
88
+ action TEXT NOT NULL,
89
+ target_path TEXT NOT NULL,
90
+ version_before INTEGER NOT NULL,
91
+ version_after INTEGER NOT NULL,
92
+ target_hash_before TEXT NOT NULL,
93
+ target_hash_after TEXT NOT NULL,
94
+ package_hash_before TEXT NOT NULL,
95
+ package_hash_after TEXT NOT NULL,
96
+ created_at TEXT NOT NULL,
97
+ FOREIGN KEY(proposal_id) REFERENCES agent_evolution_proposals(id) ON DELETE CASCADE,
98
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
99
+ UNIQUE(proposal_id, action)
79
100
  );
80
101
  CREATE TABLE agent_mcp_servers (
81
102
  agent_id TEXT NOT NULL,
@@ -84,196 +105,87 @@ CREATE TABLE agent_mcp_servers (
84
105
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
85
106
  FOREIGN KEY(server_id) REFERENCES mcp_servers(id) ON DELETE CASCADE
86
107
  );
87
- CREATE INDEX idx_agent_mcp_agent ON agent_mcp_servers(agent_id);
88
- CREATE TABLE meta (
89
- key TEXT PRIMARY KEY,
90
- value TEXT NOT NULL
91
- );
92
- CREATE TABLE memory_entries (
93
- id TEXT PRIMARY KEY,
94
- scope TEXT NOT NULL,
108
+ CREATE TABLE agent_runtime_overrides (
109
+ scope TEXT NOT NULL CHECK(scope IN ('agent','firm','division')),
110
+ target_id TEXT NOT NULL,
111
+ label TEXT,
95
112
  kind TEXT NOT NULL,
96
- content TEXT NOT NULL,
97
- project_id TEXT,
98
- project_path TEXT,
99
- agent_id TEXT,
100
- chat_id TEXT,
101
- confidence TEXT NOT NULL DEFAULT 'medium',
102
- sensitivity TEXT NOT NULL DEFAULT 'internal',
103
- evidence_json TEXT NOT NULL DEFAULT '[]',
104
- superseded_at TEXT,
105
- created_at TEXT NOT NULL
106
- , context_json TEXT NOT NULL DEFAULT '{}', embedding_model TEXT, embedding_adapter TEXT, embedding_model_sha256 TEXT, embedding_content_hash TEXT, embedding_dimensions INTEGER, embedding_json TEXT);
107
- CREATE INDEX idx_memory_path ON memory_entries(project_path, superseded_at);
108
- CREATE INDEX idx_memory_scope ON memory_entries(scope, superseded_at);
109
- CREATE INDEX idx_memory_chat ON memory_entries(chat_id);
110
- CREATE TABLE folder_activity (
111
- path TEXT PRIMARY KEY,
112
- visits INTEGER NOT NULL DEFAULT 0,
113
- activated_at TEXT,
114
- first_seen TEXT NOT NULL,
115
- last_seen TEXT NOT NULL
113
+ backend TEXT,
114
+ source TEXT,
115
+ model TEXT,
116
+ effort TEXT,
117
+ long_context INTEGER NOT NULL DEFAULT 0,
118
+ updated_at TEXT NOT NULL,
119
+ PRIMARY KEY(scope, target_id)
116
120
  );
117
- CREATE INDEX idx_chats_parent ON chats(parent_chat_id);
118
- CREATE INDEX idx_memory_agent ON memory_entries(agent_id, superseded_at);
119
- CREATE TABLE automations (
120
- id TEXT PRIMARY KEY,
121
- name TEXT NOT NULL,
122
- schedule TEXT NOT NULL,
123
- target_type TEXT NOT NULL,
124
- target_id TEXT NOT NULL,
125
- prompt_template TEXT NOT NULL,
126
- enabled INTEGER NOT NULL DEFAULT 1,
127
- created_by TEXT NOT NULL DEFAULT 'user',
128
- last_run_at TEXT,
129
- next_run_at TEXT,
130
- created_at TEXT NOT NULL
131
- , graph_json TEXT, goal TEXT, schedule_json TEXT, timezone TEXT, end_at TEXT, max_runs INTEGER, run_count INTEGER NOT NULL DEFAULT 0, trigger_type TEXT NOT NULL DEFAULT 'schedule', trigger_json TEXT, claimed_at TEXT, lease_owner TEXT, tool_mode TEXT NOT NULL DEFAULT 'auto', hub_mode TEXT NOT NULL DEFAULT 'hub-allowed', execution_permission TEXT NOT NULL DEFAULT 'write' CHECK(execution_permission IN ('read','write')), target_version TEXT, runtime_selection_json TEXT, project_id TEXT REFERENCES projects(id) ON DELETE SET NULL, goal_id TEXT, attention_cleared_at TEXT);
132
- CREATE INDEX idx_automations_due ON automations(enabled, next_run_at);
133
- CREATE TABLE agent_apps (
121
+ CREATE TABLE agent_surface_approvals (
134
122
  id TEXT PRIMARY KEY,
135
123
  chat_id TEXT NOT NULL,
136
124
  project_id TEXT,
137
125
  agent_id TEXT NOT NULL,
138
126
  surface_id TEXT NOT NULL,
139
127
  action_id TEXT,
140
- app_name TEXT NOT NULL,
141
- domain TEXT NOT NULL,
142
- layout TEXT NOT NULL,
143
- root_path TEXT NOT NULL,
144
- preview_path TEXT NOT NULL,
145
- setup_path TEXT NOT NULL,
146
- smoke_path TEXT NOT NULL,
147
- manifest_json TEXT NOT NULL,
148
- result_json TEXT NOT NULL,
149
- status TEXT NOT NULL DEFAULT 'scaffolded',
128
+ action_type TEXT NOT NULL,
129
+ kind TEXT NOT NULL,
130
+ scope_key TEXT NOT NULL,
131
+ title TEXT NOT NULL,
132
+ summary TEXT NOT NULL,
133
+ metadata_json TEXT NOT NULL DEFAULT '{}',
134
+ revoked_at TEXT,
150
135
  created_at TEXT NOT NULL,
151
- updated_at TEXT NOT NULL,
152
136
  FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
153
- FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL
137
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
138
+ FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
154
139
  );
155
- CREATE INDEX idx_agent_apps_chat_updated
156
- ON agent_apps(chat_id, updated_at DESC);
157
- CREATE INDEX idx_agent_apps_surface
158
- ON agent_apps(chat_id, surface_id, updated_at DESC);
159
- CREATE UNIQUE INDEX idx_agent_apps_root
160
- ON agent_apps(root_path);
161
- CREATE TABLE agent_app_operations (
140
+ CREATE TABLE agent_surface_asset_pack_operations (
162
141
  id TEXT PRIMARY KEY,
163
- app_id TEXT NOT NULL,
142
+ pack_id TEXT NOT NULL,
164
143
  operation TEXT NOT NULL,
165
144
  ok INTEGER NOT NULL DEFAULT 1,
166
145
  result_json TEXT NOT NULL,
167
146
  created_at TEXT NOT NULL,
168
- FOREIGN KEY(app_id) REFERENCES agent_apps(id) ON DELETE CASCADE
147
+ FOREIGN KEY(pack_id) REFERENCES agent_surface_asset_packs(id) ON DELETE CASCADE
169
148
  );
170
- CREATE INDEX idx_agent_app_ops_app_created
171
- ON agent_app_operations(app_id, created_at DESC);
172
- CREATE TABLE agent_tools (
149
+ CREATE TABLE agent_surface_asset_packs (
173
150
  id TEXT PRIMARY KEY,
174
151
  chat_id TEXT NOT NULL,
175
152
  project_id TEXT,
176
153
  agent_id TEXT NOT NULL,
177
154
  surface_id TEXT NOT NULL,
178
155
  action_id TEXT,
179
- requested_tool_id TEXT NOT NULL,
180
- generated_tool_id TEXT NOT NULL,
181
- tool_name TEXT NOT NULL,
156
+ pack_name TEXT NOT NULL,
182
157
  domain TEXT NOT NULL,
183
- kind TEXT NOT NULL,
158
+ layout TEXT NOT NULL,
184
159
  root_path TEXT NOT NULL,
185
- config_path TEXT NOT NULL,
186
- tool_path TEXT NOT NULL,
187
- mcp_path TEXT NOT NULL,
188
- smoke_path TEXT NOT NULL,
160
+ manifest_path TEXT NOT NULL,
161
+ index_path TEXT NOT NULL,
162
+ assets_path TEXT NOT NULL,
163
+ manifest_json TEXT NOT NULL,
189
164
  result_json TEXT NOT NULL,
190
- status TEXT NOT NULL DEFAULT 'scaffolded',
191
- installed_server_id TEXT,
165
+ status TEXT NOT NULL DEFAULT 'materialized',
192
166
  created_at TEXT NOT NULL,
193
167
  updated_at TEXT NOT NULL,
194
168
  FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
195
169
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
196
- FOREIGN KEY(installed_server_id) REFERENCES mcp_servers(id) ON DELETE SET NULL
197
- );
198
- CREATE INDEX idx_agent_tools_chat_updated
199
- ON agent_tools(chat_id, updated_at DESC);
200
- CREATE INDEX idx_agent_tools_surface
201
- ON agent_tools(chat_id, surface_id, requested_tool_id, updated_at DESC);
202
- CREATE UNIQUE INDEX idx_agent_tools_root
203
- ON agent_tools(root_path);
204
- CREATE TABLE agent_tool_operations (
205
- id TEXT PRIMARY KEY,
206
- tool_id TEXT NOT NULL,
207
- operation TEXT NOT NULL,
208
- ok INTEGER NOT NULL DEFAULT 1,
209
- result_json TEXT NOT NULL,
210
- created_at TEXT NOT NULL,
211
- FOREIGN KEY(tool_id) REFERENCES agent_tools(id) ON DELETE CASCADE
170
+ FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
212
171
  );
213
- CREATE INDEX idx_agent_tool_ops_tool_created
214
- ON agent_tool_operations(tool_id, created_at DESC);
215
- CREATE TABLE agent_surfaces (
216
- id TEXT PRIMARY KEY,
217
- chat_id TEXT NOT NULL,
218
- project_id TEXT,
219
- agent_id TEXT NOT NULL,
220
- title TEXT NOT NULL,
221
- domain TEXT NOT NULL,
222
- layout TEXT NOT NULL,
223
- manifest_json TEXT NOT NULL,
224
- state_json TEXT NOT NULL DEFAULT '{}',
225
- provenance_json TEXT NOT NULL DEFAULT '[]',
226
- created_at TEXT NOT NULL,
227
- updated_at TEXT NOT NULL,
228
- FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
229
- FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL
230
- );
231
- CREATE INDEX idx_agent_surfaces_chat_updated
232
- ON agent_surfaces(chat_id, updated_at DESC);
233
- CREATE INDEX idx_agent_surfaces_domain_updated
234
- ON agent_surfaces(domain, updated_at DESC);
235
- CREATE INDEX idx_agent_surfaces_project_updated
236
- ON agent_surfaces(project_id, updated_at DESC);
237
- CREATE TABLE agent_surface_asset_packs (
172
+ CREATE TABLE agent_surface_events (
238
173
  id TEXT PRIMARY KEY,
239
174
  chat_id TEXT NOT NULL,
240
175
  project_id TEXT,
241
176
  agent_id TEXT NOT NULL,
242
177
  surface_id TEXT NOT NULL,
243
- action_id TEXT,
244
- pack_name TEXT NOT NULL,
245
- domain TEXT NOT NULL,
246
- layout TEXT NOT NULL,
247
- root_path TEXT NOT NULL,
248
- manifest_path TEXT NOT NULL,
249
- index_path TEXT NOT NULL,
250
- assets_path TEXT NOT NULL,
251
- manifest_json TEXT NOT NULL,
252
- result_json TEXT NOT NULL,
253
- status TEXT NOT NULL DEFAULT 'materialized',
178
+ actor TEXT NOT NULL,
179
+ event_type TEXT NOT NULL,
180
+ path TEXT NOT NULL,
181
+ value_json TEXT NOT NULL,
182
+ previous_value_json TEXT,
183
+ label TEXT,
254
184
  created_at TEXT NOT NULL,
255
- updated_at TEXT NOT NULL,
256
185
  FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
257
186
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
258
187
  FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
259
188
  );
260
- CREATE INDEX idx_agent_surface_asset_packs_chat_updated
261
- ON agent_surface_asset_packs(chat_id, updated_at DESC);
262
- CREATE INDEX idx_agent_surface_asset_packs_surface_updated
263
- ON agent_surface_asset_packs(chat_id, surface_id, updated_at DESC);
264
- CREATE UNIQUE INDEX idx_agent_surface_asset_packs_root
265
- ON agent_surface_asset_packs(root_path);
266
- CREATE TABLE agent_surface_asset_pack_operations (
267
- id TEXT PRIMARY KEY,
268
- pack_id TEXT NOT NULL,
269
- operation TEXT NOT NULL,
270
- ok INTEGER NOT NULL DEFAULT 1,
271
- result_json TEXT NOT NULL,
272
- created_at TEXT NOT NULL,
273
- FOREIGN KEY(pack_id) REFERENCES agent_surface_asset_packs(id) ON DELETE CASCADE
274
- );
275
- CREATE INDEX idx_agent_surface_asset_pack_ops_pack_created
276
- ON agent_surface_asset_pack_operations(pack_id, created_at DESC);
277
189
  CREATE TABLE agent_surface_jobs (
278
190
  id TEXT PRIMARY KEY,
279
191
  chat_id TEXT NOT NULL,
@@ -295,92 +207,105 @@ CREATE TABLE agent_surface_jobs (
295
207
  FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE,
296
208
  UNIQUE(surface_id, job_id)
297
209
  );
298
- CREATE INDEX idx_agent_surface_jobs_chat_updated
299
- ON agent_surface_jobs(chat_id, updated_at DESC);
300
- CREATE INDEX idx_agent_surface_jobs_surface_updated
301
- ON agent_surface_jobs(surface_id, updated_at DESC);
302
- CREATE INDEX idx_agent_surface_jobs_status_updated
303
- ON agent_surface_jobs(status, updated_at DESC);
304
- CREATE TABLE agent_surface_events (
210
+ CREATE TABLE agent_surfaces (
305
211
  id TEXT PRIMARY KEY,
306
212
  chat_id TEXT NOT NULL,
307
213
  project_id TEXT,
308
214
  agent_id TEXT NOT NULL,
309
- surface_id TEXT NOT NULL,
310
- actor TEXT NOT NULL,
311
- event_type TEXT NOT NULL,
312
- path TEXT NOT NULL,
313
- value_json TEXT NOT NULL,
314
- previous_value_json TEXT,
315
- label TEXT,
215
+ title TEXT NOT NULL,
216
+ domain TEXT NOT NULL,
217
+ layout TEXT NOT NULL,
218
+ manifest_json TEXT NOT NULL,
219
+ state_json TEXT NOT NULL DEFAULT '{}',
220
+ provenance_json TEXT NOT NULL DEFAULT '[]',
316
221
  created_at TEXT NOT NULL,
222
+ updated_at TEXT NOT NULL,
317
223
  FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
318
- FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
319
- FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
224
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL
320
225
  );
321
- CREATE INDEX idx_agent_surface_events_surface_created
322
- ON agent_surface_events(surface_id, created_at DESC);
323
- CREATE INDEX idx_agent_surface_events_chat_created
324
- ON agent_surface_events(chat_id, created_at DESC);
325
- CREATE INDEX idx_installed_agents_visibility ON installed_agents(visibility, installed_at DESC);
326
- CREATE TABLE agent_surface_approvals (
226
+ CREATE TABLE agent_tool_operations (
227
+ id TEXT PRIMARY KEY,
228
+ tool_id TEXT NOT NULL,
229
+ operation TEXT NOT NULL,
230
+ ok INTEGER NOT NULL DEFAULT 1,
231
+ result_json TEXT NOT NULL,
232
+ created_at TEXT NOT NULL,
233
+ FOREIGN KEY(tool_id) REFERENCES agent_tools(id) ON DELETE CASCADE
234
+ );
235
+ CREATE TABLE agent_tools (
327
236
  id TEXT PRIMARY KEY,
328
237
  chat_id TEXT NOT NULL,
329
238
  project_id TEXT,
330
239
  agent_id TEXT NOT NULL,
331
240
  surface_id TEXT NOT NULL,
332
241
  action_id TEXT,
333
- action_type TEXT NOT NULL,
242
+ requested_tool_id TEXT NOT NULL,
243
+ generated_tool_id TEXT NOT NULL,
244
+ tool_name TEXT NOT NULL,
245
+ domain TEXT NOT NULL,
334
246
  kind TEXT NOT NULL,
335
- scope_key TEXT NOT NULL,
336
- title TEXT NOT NULL,
337
- summary TEXT NOT NULL,
338
- metadata_json TEXT NOT NULL DEFAULT '{}',
339
- revoked_at TEXT,
247
+ root_path TEXT NOT NULL,
248
+ config_path TEXT NOT NULL,
249
+ tool_path TEXT NOT NULL,
250
+ mcp_path TEXT NOT NULL,
251
+ smoke_path TEXT NOT NULL,
252
+ result_json TEXT NOT NULL,
253
+ status TEXT NOT NULL DEFAULT 'scaffolded',
254
+ installed_server_id TEXT,
340
255
  created_at TEXT NOT NULL,
256
+ updated_at TEXT NOT NULL,
341
257
  FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
342
258
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
343
- FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
344
- );
345
- CREATE INDEX idx_agent_surface_approvals_surface_created
346
- ON agent_surface_approvals(surface_id, created_at DESC);
347
- CREATE INDEX idx_agent_surface_approvals_scope_active
348
- ON agent_surface_approvals(surface_id, scope_key, revoked_at, created_at DESC);
349
- CREATE TABLE chat_runtime_sessions (
350
- chat_id TEXT NOT NULL,
351
- kind TEXT NOT NULL,
352
- session_id TEXT NOT NULL,
353
- fingerprint TEXT NOT NULL,
354
- updated_at TEXT NOT NULL,
355
- PRIMARY KEY (chat_id, kind),
356
- FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
259
+ FOREIGN KEY(installed_server_id) REFERENCES mcp_servers(id) ON DELETE SET NULL
357
260
  );
358
- CREATE TABLE agent_runtime_overrides (
359
- scope TEXT NOT NULL CHECK(scope IN ('agent','firm','division')),
360
- target_id TEXT NOT NULL,
361
- label TEXT,
261
+ CREATE TABLE agent_usage (
262
+ agent_key TEXT PRIMARY KEY,
362
263
  kind TEXT NOT NULL,
363
- backend TEXT,
364
- source TEXT,
365
- model TEXT,
366
- effort TEXT,
367
- long_context INTEGER NOT NULL DEFAULT 0,
368
- updated_at TEXT NOT NULL,
369
- PRIMARY KEY(scope, target_id)
264
+ first_used_at TEXT NOT NULL,
265
+ last_used_at TEXT NOT NULL,
266
+ use_count INTEGER NOT NULL DEFAULT 0
370
267
  );
371
- CREATE INDEX idx_agent_runtime_overrides_updated
372
- ON agent_runtime_overrides(updated_at DESC);
373
- CREATE INDEX idx_chats_used_updated ON chats(used_at, updated_at DESC);
374
- CREATE TABLE run_history (
375
- id TEXT PRIMARY KEY,
376
- automation_id TEXT,
377
- scheduled_for TEXT,
378
- ran_at TEXT,
379
- status TEXT,
380
- skipped_count INTEGER DEFAULT 0,
381
- error TEXT
382
- , outcome TEXT, outcome_reason TEXT, acknowledged_at TEXT);
383
- CREATE INDEX idx_run_history_automation ON run_history(automation_id);
268
+ CREATE TABLE automation_approval_waits (
269
+ automation_id TEXT NOT NULL,
270
+ node_id TEXT NOT NULL,
271
+ first_requested_at TEXT NOT NULL,
272
+ PRIMARY KEY (automation_id, node_id)
273
+ );
274
+ CREATE TABLE automation_eval_corrections (
275
+ automation_id TEXT NOT NULL,
276
+ node_id TEXT NOT NULL,
277
+ subject_preview TEXT NOT NULL,
278
+ corrected_verdict TEXT NOT NULL,
279
+ note TEXT NOT NULL DEFAULT '',
280
+ created_at TEXT NOT NULL,
281
+ PRIMARY KEY (automation_id, node_id, created_at)
282
+ );
283
+ CREATE TABLE automation_graph_versions (
284
+ id TEXT PRIMARY KEY,
285
+ automation_id TEXT NOT NULL,
286
+ saved_at TEXT NOT NULL,
287
+ note TEXT,
288
+ node_count INTEGER NOT NULL DEFAULT 0,
289
+ graph_json TEXT NOT NULL
290
+ );
291
+ CREATE TABLE automation_node_approvals (
292
+ automation_id TEXT NOT NULL,
293
+ occurrence_id TEXT NOT NULL,
294
+ node_id TEXT NOT NULL,
295
+ decision TEXT NOT NULL,
296
+ decided_at TEXT NOT NULL,
297
+ decided_by TEXT NOT NULL, scope TEXT NOT NULL DEFAULT 'once',
298
+ PRIMARY KEY (automation_id, occurrence_id, node_id)
299
+ );
300
+ CREATE TABLE automation_run_inputs (
301
+ id TEXT PRIMARY KEY,
302
+ automation_id TEXT NOT NULL,
303
+ payload_json TEXT NOT NULL,
304
+ requested_by TEXT NOT NULL,
305
+ created_at TEXT NOT NULL,
306
+ consumed_at TEXT,
307
+ consumed_run_id TEXT
308
+ );
384
309
  CREATE TABLE automation_runs (
385
310
  id TEXT PRIMARY KEY,
386
311
  automation_id TEXT,
@@ -393,99 +318,124 @@ CREATE TABLE automation_runs (
393
318
  checkpoint_json TEXT,
394
319
  resume_of_run_id TEXT
395
320
  , node_failures_json TEXT, resume_consumed_at TEXT);
396
- CREATE INDEX idx_automation_runs_auto
397
- ON automation_runs(automation_id, started_at);
398
- CREATE TABLE agent_evolution_proposals (
321
+ CREATE TABLE automation_sessions (
399
322
  id TEXT PRIMARY KEY,
400
- agent_id TEXT NOT NULL,
401
- proposal_type TEXT NOT NULL,
402
- summary TEXT NOT NULL,
403
- target_path TEXT NOT NULL,
404
- before_hash TEXT NOT NULL,
405
- after_hash TEXT NOT NULL,
406
- before_content TEXT NOT NULL,
407
- after_content TEXT NOT NULL,
408
- risk TEXT NOT NULL,
409
- status TEXT NOT NULL,
410
- source_json TEXT NOT NULL DEFAULT '{}',
411
- decision_note TEXT,
412
- last_error TEXT,
323
+ automation_id TEXT NOT NULL,
324
+ target_kind TEXT NOT NULL CHECK(target_kind IN ('host','agent','firm','hub')),
325
+ target_id TEXT NOT NULL,
326
+ ledger_chat_id TEXT NOT NULL UNIQUE REFERENCES chats(id) ON DELETE CASCADE,
413
327
  created_at TEXT NOT NULL,
414
328
  updated_at TEXT NOT NULL,
415
- approved_at TEXT,
416
- applied_at TEXT,
417
- measured_at TEXT,
418
- rolled_back_at TEXT
419
- , operation_json TEXT);
420
- CREATE INDEX idx_agent_evolution_agent_status
421
- ON agent_evolution_proposals(agent_id, status, updated_at DESC);
422
- CREATE INDEX idx_agent_evolution_created
423
- ON agent_evolution_proposals(created_at DESC);
424
- CREATE TABLE run_events (
425
- id TEXT PRIMARY KEY,
426
- run_id TEXT NOT NULL,
427
- seq INTEGER NOT NULL,
428
- ts TEXT NOT NULL,
429
- kind TEXT NOT NULL,
430
- chat_id TEXT,
431
- automation_id TEXT,
432
- node_id TEXT,
433
- agent_id TEXT,
434
- payload_json TEXT NOT NULL DEFAULT '{}',
435
- UNIQUE(run_id, seq)
329
+ UNIQUE(automation_id, target_kind, target_id)
436
330
  );
437
- CREATE INDEX idx_run_events_run_seq
438
- ON run_events(run_id, seq);
439
- CREATE INDEX idx_run_events_ts
440
- ON run_events(ts DESC);
441
- CREATE INDEX idx_run_events_automation
442
- ON run_events(automation_id, ts DESC);
443
- CREATE TABLE failure_events (
331
+ CREATE TABLE automation_trigger_events (
444
332
  id TEXT PRIMARY KEY,
445
- run_id TEXT,
446
- ts TEXT NOT NULL,
447
- source TEXT NOT NULL,
448
- chat_id TEXT,
449
- automation_id TEXT,
450
- node_id TEXT,
451
- agent_id TEXT,
452
- error_code TEXT,
453
- error_message TEXT NOT NULL,
454
- payload_json TEXT NOT NULL DEFAULT '{}'
455
- );
456
- CREATE INDEX idx_failure_events_ts
457
- ON failure_events(ts DESC);
458
- CREATE INDEX idx_failure_events_run
459
- ON failure_events(run_id, ts DESC);
460
- CREATE INDEX idx_failure_events_automation
461
- ON failure_events(automation_id, ts DESC);
462
- CREATE TABLE browser_sites (
463
- id TEXT PRIMARY KEY,
464
- site TEXT NOT NULL UNIQUE,
465
- label TEXT,
466
- username TEXT,
467
- has_password INTEGER NOT NULL DEFAULT 0,
333
+ automation_id TEXT NOT NULL,
334
+ trigger_kind TEXT NOT NULL CHECK(trigger_kind IN ('fs','chain','webhook','poll','command')),
335
+ dedupe_key TEXT NOT NULL,
336
+ payload_json TEXT NOT NULL,
337
+ status TEXT NOT NULL DEFAULT 'pending'
338
+ CHECK(status IN ('pending','claimed','delivered','parked')),
339
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
340
+ next_attempt_at TEXT NOT NULL,
341
+ claim_owner TEXT,
342
+ claimed_until TEXT,
343
+ run_id TEXT,
344
+ run_outcome TEXT CHECK(run_outcome IS NULL OR run_outcome IN
345
+ ('ok','partial','error','skipped','blocked','needs_input')),
346
+ last_error TEXT,
468
347
  created_at TEXT NOT NULL,
469
- updated_at TEXT NOT NULL
470
- );
471
- CREATE TABLE browser_sessions (
472
- id TEXT PRIMARY KEY,
473
- site TEXT NOT NULL,
474
- status TEXT NOT NULL DEFAULT 'none',
475
- captured_at TEXT,
476
- note TEXT,
477
- FOREIGN KEY(site) REFERENCES browser_sites(site) ON DELETE CASCADE
348
+ updated_at TEXT NOT NULL,
349
+ delivered_at TEXT,
350
+ FOREIGN KEY(automation_id) REFERENCES automations(id) ON DELETE CASCADE,
351
+ UNIQUE(automation_id, trigger_kind, dedupe_key),
352
+ CHECK(
353
+ (status = 'claimed' AND claim_owner IS NOT NULL AND claimed_until IS NOT NULL) OR
354
+ (status <> 'claimed' AND claim_owner IS NULL AND claimed_until IS NULL)
355
+ ),
356
+ CHECK((status = 'delivered' AND delivered_at IS NOT NULL) OR status <> 'delivered')
478
357
  );
479
- CREATE UNIQUE INDEX idx_browser_sessions_site ON browser_sessions(site);
480
- CREATE TABLE browser_permissions (
358
+ CREATE TABLE automations (
481
359
  id TEXT PRIMARY KEY,
482
- site TEXT NOT NULL,
483
- action_type TEXT NOT NULL,
484
- decision TEXT NOT NULL,
360
+ name TEXT NOT NULL,
361
+ schedule TEXT NOT NULL,
362
+ target_type TEXT NOT NULL,
363
+ target_id TEXT NOT NULL,
364
+ prompt_template TEXT NOT NULL,
365
+ enabled INTEGER NOT NULL DEFAULT 1,
366
+ created_by TEXT NOT NULL DEFAULT 'user',
367
+ last_run_at TEXT,
368
+ next_run_at TEXT,
485
369
  created_at TEXT NOT NULL
370
+ , graph_json TEXT, goal TEXT, schedule_json TEXT, timezone TEXT, end_at TEXT, max_runs INTEGER, run_count INTEGER NOT NULL DEFAULT 0, trigger_type TEXT NOT NULL DEFAULT 'schedule', trigger_json TEXT, claimed_at TEXT, lease_owner TEXT, tool_mode TEXT NOT NULL DEFAULT 'auto', hub_mode TEXT NOT NULL DEFAULT 'hub-allowed', execution_permission TEXT NOT NULL DEFAULT 'write' CHECK(execution_permission IN ('read','write')), target_version TEXT, runtime_selection_json TEXT, project_id TEXT REFERENCES projects(id) ON DELETE SET NULL, goal_id TEXT, attention_cleared_at TEXT);
371
+ CREATE TABLE borrowed_agent_career_runs (
372
+ owner_scope_key TEXT NOT NULL,
373
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
374
+ agent_definition_id TEXT NOT NULL,
375
+ agent_release_id TEXT NOT NULL,
376
+ component_id TEXT NOT NULL DEFAULT '',
377
+ run_id_hash TEXT NOT NULL,
378
+ recorded_at TEXT NOT NULL,
379
+ PRIMARY KEY(
380
+ owner_scope_key, entity_kind, agent_definition_id,
381
+ agent_release_id, component_id, run_id_hash
382
+ ),
383
+ FOREIGN KEY(
384
+ owner_scope_key, entity_kind, agent_definition_id,
385
+ agent_release_id, component_id
386
+ )
387
+ REFERENCES borrowed_agent_careers(
388
+ owner_scope_key, entity_kind, agent_definition_id,
389
+ agent_release_id, component_id
390
+ )
391
+ ON DELETE CASCADE
392
+ );
393
+ CREATE TABLE "borrowed_agent_career_runs_v76_legacy" (
394
+ owner_scope_key TEXT NOT NULL,
395
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
396
+ slug TEXT NOT NULL,
397
+ run_id_hash TEXT NOT NULL,
398
+ recorded_at TEXT NOT NULL,
399
+ PRIMARY KEY(owner_scope_key, entity_kind, slug, run_id_hash),
400
+ FOREIGN KEY(owner_scope_key, entity_kind, slug)
401
+ REFERENCES "borrowed_agent_careers_v76_legacy"(owner_scope_key, entity_kind, slug)
402
+ ON DELETE CASCADE
403
+ );
404
+ CREATE TABLE borrowed_agent_careers (
405
+ owner_scope_key TEXT NOT NULL,
406
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
407
+ agent_definition_id TEXT NOT NULL,
408
+ agent_release_id TEXT NOT NULL,
409
+ component_id TEXT NOT NULL DEFAULT '',
410
+ slug TEXT NOT NULL,
411
+ memory_key TEXT NOT NULL,
412
+ first_used_at TEXT NOT NULL,
413
+ last_used_at TEXT NOT NULL,
414
+ use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
415
+ latest_runtime_json TEXT,
416
+ name_en TEXT,
417
+ name_ko TEXT,
418
+ tagline_en TEXT,
419
+ tagline_ko TEXT,
420
+ PRIMARY KEY(
421
+ owner_scope_key, entity_kind, agent_definition_id,
422
+ agent_release_id, component_id
423
+ )
424
+ );
425
+ CREATE TABLE "borrowed_agent_careers_v76_legacy" (
426
+ owner_scope_key TEXT NOT NULL,
427
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
428
+ slug TEXT NOT NULL,
429
+ first_used_at TEXT NOT NULL,
430
+ last_used_at TEXT NOT NULL,
431
+ use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
432
+ latest_runtime_json TEXT,
433
+ name_en TEXT,
434
+ name_ko TEXT,
435
+ tagline_en TEXT,
436
+ tagline_ko TEXT,
437
+ PRIMARY KEY(owner_scope_key, entity_kind, slug)
486
438
  );
487
- CREATE UNIQUE INDEX idx_browser_perm_site_action
488
- ON browser_permissions(site, action_type);
489
439
  CREATE TABLE browser_action_logs (
490
440
  id TEXT PRIMARY KEY,
491
441
  ts TEXT NOT NULL,
@@ -496,88 +446,111 @@ CREATE TABLE browser_action_logs (
496
446
  approval TEXT,
497
447
  meta TEXT
498
448
  );
499
- CREATE INDEX idx_browser_logs_ts ON browser_action_logs(ts DESC);
500
- CREATE TABLE agent_asset_versions (
501
- agent_id TEXT PRIMARY KEY,
502
- version INTEGER NOT NULL,
503
- package_hash TEXT NOT NULL,
504
- updated_at TEXT NOT NULL,
505
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
449
+ CREATE TABLE browser_permissions (
450
+ id TEXT PRIMARY KEY,
451
+ site TEXT NOT NULL,
452
+ action_type TEXT NOT NULL,
453
+ decision TEXT NOT NULL,
454
+ created_at TEXT NOT NULL
506
455
  );
507
- CREATE TABLE agent_evolution_receipts (
456
+ CREATE TABLE browser_sessions (
508
457
  id TEXT PRIMARY KEY,
509
- proposal_id TEXT NOT NULL,
510
- agent_id TEXT NOT NULL,
511
- action TEXT NOT NULL,
512
- target_path TEXT NOT NULL,
513
- version_before INTEGER NOT NULL,
514
- version_after INTEGER NOT NULL,
515
- target_hash_before TEXT NOT NULL,
516
- target_hash_after TEXT NOT NULL,
517
- package_hash_before TEXT NOT NULL,
518
- package_hash_after TEXT NOT NULL,
458
+ site TEXT NOT NULL,
459
+ status TEXT NOT NULL DEFAULT 'none',
460
+ captured_at TEXT,
461
+ note TEXT,
462
+ FOREIGN KEY(site) REFERENCES browser_sites(site) ON DELETE CASCADE
463
+ );
464
+ CREATE TABLE browser_sites (
465
+ id TEXT PRIMARY KEY,
466
+ site TEXT NOT NULL UNIQUE,
467
+ label TEXT,
468
+ username TEXT,
469
+ has_password INTEGER NOT NULL DEFAULT 0,
519
470
  created_at TEXT NOT NULL,
520
- FOREIGN KEY(proposal_id) REFERENCES agent_evolution_proposals(id) ON DELETE CASCADE,
521
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
522
- UNIQUE(proposal_id, action)
471
+ updated_at TEXT NOT NULL
523
472
  );
524
- CREATE INDEX idx_agent_evolution_receipts_agent
525
- ON agent_evolution_receipts(agent_id, created_at DESC);
526
- CREATE INDEX idx_agent_evolution_receipts_proposal
527
- ON agent_evolution_receipts(proposal_id, created_at ASC);
528
- CREATE TABLE hub_agent_bookmarks (
529
- workspace_id TEXT NOT NULL,
530
- slug TEXT NOT NULL,
531
- entity_kind TEXT NOT NULL DEFAULT 'agent',
532
- listing_json TEXT NOT NULL,
533
- bookmarked_at TEXT NOT NULL,
534
- server_updated_at TEXT,
535
- sync_state TEXT NOT NULL DEFAULT 'clean'
536
- CHECK(sync_state IN ('clean','pending_upsert','pending_delete')),
537
- last_sync_error TEXT,
538
- claim_workspace_id TEXT,
539
- PRIMARY KEY(workspace_id, entity_kind, slug)
540
- );
541
- CREATE INDEX idx_hub_agent_bookmarks_workspace_time
542
- ON hub_agent_bookmarks(workspace_id, bookmarked_at DESC);
543
- CREATE INDEX idx_hub_agent_bookmarks_outbox
544
- ON hub_agent_bookmarks(workspace_id, sync_state, bookmarked_at ASC);
545
- CREATE TABLE experience_packs (
473
+ CREATE TABLE chat_goal_contracts (
474
+ goal_id TEXT PRIMARY KEY,
475
+ chat_id TEXT NOT NULL,
476
+ objective TEXT,
477
+ acceptance_criteria_json TEXT NOT NULL DEFAULT '[]',
478
+ status TEXT NOT NULL DEFAULT 'active'
479
+ CHECK(status IN ('active','blocked','completed','cancelled')),
480
+ created_at TEXT NOT NULL,
481
+ updated_at TEXT NOT NULL,
482
+ completed_at TEXT,
483
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
484
+ );
485
+ CREATE TABLE chat_message_attachments (
486
+ id TEXT PRIMARY KEY,
487
+ message_id TEXT NOT NULL,
488
+ chat_id TEXT NOT NULL,
489
+ name TEXT NOT NULL,
490
+ media_type TEXT NOT NULL,
491
+ size_bytes INTEGER NOT NULL CHECK(size_bytes > 0),
492
+ sha256 TEXT NOT NULL,
493
+ data BLOB NOT NULL,
494
+ created_at TEXT NOT NULL,
495
+ FOREIGN KEY(message_id) REFERENCES chat_messages(id) ON DELETE CASCADE,
496
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
497
+ );
498
+ CREATE TABLE chat_messages (
499
+ id TEXT PRIMARY KEY,
500
+ chat_id TEXT NOT NULL,
501
+ role TEXT NOT NULL CHECK(role IN ('user','assistant','system')),
502
+ text TEXT NOT NULL,
503
+ created_at TEXT NOT NULL,
504
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
505
+ );
506
+ CREATE TABLE chat_runtime_sessions (
507
+ chat_id TEXT NOT NULL,
508
+ kind TEXT NOT NULL,
509
+ session_id TEXT NOT NULL,
510
+ fingerprint TEXT NOT NULL,
511
+ updated_at TEXT NOT NULL, reported_output_tokens INTEGER, reported_input_tokens INTEGER, reported_cached_input_tokens INTEGER,
512
+ PRIMARY KEY (chat_id, kind),
513
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE
514
+ );
515
+ CREATE TABLE chats (
546
516
  id TEXT PRIMARY KEY,
547
- agent_id TEXT NOT NULL,
548
517
  project_id TEXT,
549
- project_path TEXT,
550
- project_scope_key TEXT NOT NULL,
551
- environment_key TEXT NOT NULL,
552
- name TEXT NOT NULL,
553
- description TEXT NOT NULL DEFAULT '',
554
- base_package_hash TEXT,
555
- -- 2축 좌표. 몸통(코어) 해시가 신원이고 부품 목록 해시는 실행 무결성이다.
556
- -- axis_version 2 = 옛 한 축 기록, 3 = 두 축을 갖춘 기록. 상세는 REQUIRED_COLUMNS 주석.
557
- axis_version INTEGER NOT NULL DEFAULT 2,
558
- base_core_hash TEXT,
559
- module_set_hash TEXT,
560
- status TEXT NOT NULL DEFAULT 'active'
561
- CHECK(status IN ('active','archived')),
518
+ agent_id TEXT NOT NULL,
519
+ title TEXT NOT NULL DEFAULT 'New chat',
562
520
  created_at TEXT NOT NULL,
563
- updated_at TEXT NOT NULL, mcp_requirements_json TEXT NOT NULL DEFAULT '[]', base_agent_definition_id TEXT, base_agent_release_id TEXT, base_package_hash_version TEXT, environment_profile_json TEXT, auto_managed INTEGER NOT NULL DEFAULT 0 CHECK(auto_managed IN (0,1)),
521
+ updated_at TEXT NOT NULL, firm_id TEXT REFERENCES firms(id) ON DELETE SET NULL, archived_at TEXT, working_folder TEXT, kind TEXT NOT NULL DEFAULT 'user', parent_chat_id TEXT, used_at TEXT, continuous_mode INTEGER NOT NULL DEFAULT 0, swarm_mode INTEGER NOT NULL DEFAULT 0, last_viewed_at TEXT, hired_agents TEXT, origin_surface TEXT NOT NULL DEFAULT 'work', runtime_selection_json TEXT, goal_id TEXT,
522
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
564
523
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
565
524
  );
566
- CREATE INDEX idx_experience_packs_agent_scope
567
- ON experience_packs(agent_id, project_scope_key, environment_key, updated_at DESC);
568
- CREATE TABLE experience_candidates (
525
+ CREATE TABLE experience_auto_intake_receipts (
569
526
  id TEXT PRIMARY KEY,
570
- pack_id TEXT NOT NULL,
571
527
  agent_id TEXT NOT NULL,
572
- project_scope_key TEXT NOT NULL,
573
- environment_key TEXT NOT NULL,
574
- source_memory_id TEXT NOT NULL,
575
- summary TEXT NOT NULL,
576
- task_terms_json TEXT NOT NULL DEFAULT '[]',
577
- sensitivity TEXT NOT NULL
578
- CHECK(sensitivity IN ('public','internal','private')),
579
- confidence TEXT NOT NULL
580
- CHECK(confidence IN ('high','medium','low')),
528
+ pack_id TEXT,
529
+ candidate_id TEXT,
530
+ source_memory_hash TEXT NOT NULL,
531
+ status TEXT NOT NULL
532
+ CHECK(status IN ('candidate-created','blocked','skipped')),
533
+ memory_kind TEXT NOT NULL,
534
+ reason_codes_json TEXT NOT NULL DEFAULT '[]',
535
+ created_at TEXT NOT NULL, run_id TEXT NULL, redaction_count INTEGER NOT NULL DEFAULT 0,
536
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
537
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE SET NULL,
538
+ FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE SET NULL,
539
+ UNIQUE(agent_id, source_memory_hash)
540
+ );
541
+ CREATE TABLE experience_candidates (
542
+ id TEXT PRIMARY KEY,
543
+ pack_id TEXT NOT NULL,
544
+ agent_id TEXT NOT NULL,
545
+ project_scope_key TEXT NOT NULL,
546
+ environment_key TEXT NOT NULL,
547
+ source_memory_id TEXT NOT NULL,
548
+ summary TEXT NOT NULL,
549
+ task_terms_json TEXT NOT NULL DEFAULT '[]',
550
+ sensitivity TEXT NOT NULL
551
+ CHECK(sensitivity IN ('public','internal','private')),
552
+ confidence TEXT NOT NULL
553
+ CHECK(confidence IN ('high','medium','low')),
581
554
  status TEXT NOT NULL DEFAULT 'candidate'
582
555
  CHECK(status IN ('candidate','promoted','rejected')),
583
556
  outcome_status TEXT NOT NULL DEFAULT 'unverified'
@@ -590,30 +563,32 @@ CREATE TABLE experience_candidates (
590
563
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
591
564
  UNIQUE(pack_id, source_memory_id)
592
565
  );
593
- CREATE INDEX idx_experience_candidates_retrieval
594
- ON experience_candidates(agent_id, project_scope_key, environment_key, status, outcome_status, updated_at DESC);
595
- CREATE INDEX idx_experience_candidates_pack
596
- ON experience_candidates(pack_id, created_at DESC);
597
- CREATE TABLE experience_promotion_receipts (
566
+ CREATE TABLE experience_cloud_uploads (
598
567
  id TEXT PRIMARY KEY,
599
568
  pack_id TEXT NOT NULL,
600
- candidate_id TEXT NOT NULL,
601
- agent_id TEXT NOT NULL,
602
- action TEXT NOT NULL CHECK(action = 'promote'),
603
- explicit_consent INTEGER NOT NULL CHECK(explicit_consent = 1),
604
- verification_status TEXT NOT NULL CHECK(verification_status IN ('attested','verified')),
605
- verification_method TEXT NOT NULL
606
- CHECK(verification_method IN ('user-attested','local-run-receipt','local-test-receipt')),
607
- evidence_hash TEXT NOT NULL,
608
- public_safe INTEGER NOT NULL CHECK(public_safe IN (0,1)),
569
+ requested_visibility TEXT NOT NULL
570
+ CHECK(requested_visibility IN ('private','public')),
571
+ bundle_id TEXT NOT NULL,
572
+ bundle_hash TEXT NOT NULL,
573
+ canonical_bundle_json TEXT NOT NULL,
574
+ idempotency_key TEXT NOT NULL UNIQUE,
575
+ remote_upload_id TEXT,
576
+ remote_revision TEXT,
577
+ remote_status TEXT NOT NULL
578
+ CHECK(remote_status IN (
579
+ 'local-ready','saving-private','private-saved','requesting-verification',
580
+ 'verification-requested','verification-pending','verified-private',
581
+ 'public-active','conflict','offline','error','withdrawn','rejected'
582
+ )),
583
+ remote_error_code TEXT,
584
+ remote_error_message TEXT,
585
+ remote_receipt_json TEXT,
586
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
609
587
  created_at TEXT NOT NULL,
588
+ updated_at TEXT NOT NULL,
610
589
  FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
611
- FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
612
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
613
- UNIQUE(candidate_id, action)
590
+ UNIQUE(pack_id, bundle_hash, requested_visibility)
614
591
  );
615
- CREATE INDEX idx_experience_receipts_pack
616
- ON experience_promotion_receipts(pack_id, created_at DESC);
617
592
  CREATE TABLE experience_export_intents (
618
593
  id TEXT PRIMARY KEY,
619
594
  pack_id TEXT NOT NULL,
@@ -625,8 +600,20 @@ CREATE TABLE experience_export_intents (
625
600
  FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
626
601
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
627
602
  );
628
- CREATE INDEX idx_experience_export_intents_pack
629
- ON experience_export_intents(pack_id, created_at DESC);
603
+ CREATE TABLE experience_governance_relations (
604
+ relation_id TEXT PRIMARY KEY,
605
+ agent_id TEXT NOT NULL,
606
+ pack_id TEXT NOT NULL,
607
+ from_candidate_id TEXT NOT NULL,
608
+ to_candidate_id TEXT NOT NULL,
609
+ relation_type TEXT NOT NULL CHECK(relation_type IN ('supersedes','contradicts')),
610
+ reason TEXT NOT NULL,
611
+ created_at TEXT NOT NULL,
612
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
613
+ FOREIGN KEY(from_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
614
+ FOREIGN KEY(to_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
615
+ UNIQUE(from_candidate_id, to_candidate_id, relation_type)
616
+ );
630
617
  CREATE TABLE experience_lineage_events (
631
618
  id TEXT PRIMARY KEY,
632
619
  pack_id TEXT NOT NULL,
@@ -645,8 +632,106 @@ CREATE TABLE experience_lineage_events (
645
632
  FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
646
633
  UNIQUE(pack_id, release_id, event_type)
647
634
  );
648
- CREATE INDEX idx_experience_lineage_pack_created
649
- ON experience_lineage_events(pack_id, created_at ASC, id ASC);
635
+ CREATE TABLE experience_packs (
636
+ id TEXT PRIMARY KEY,
637
+ agent_id TEXT NOT NULL,
638
+ project_id TEXT,
639
+ project_path TEXT,
640
+ project_scope_key TEXT NOT NULL,
641
+ environment_key TEXT NOT NULL,
642
+ name TEXT NOT NULL,
643
+ description TEXT NOT NULL DEFAULT '',
644
+ base_package_hash TEXT,
645
+ -- 2축 좌표. 몸통(코어) 해시가 신원이고 부품 목록 해시는 실행 무결성이다.
646
+ -- axis_version 2 = 옛 한 축 기록, 3 = 두 축을 갖춘 기록. 상세는 REQUIRED_COLUMNS 주석.
647
+ axis_version INTEGER NOT NULL DEFAULT 2,
648
+ base_core_hash TEXT,
649
+ module_set_hash TEXT,
650
+ status TEXT NOT NULL DEFAULT 'active'
651
+ CHECK(status IN ('active','archived')),
652
+ created_at TEXT NOT NULL,
653
+ updated_at TEXT NOT NULL, mcp_requirements_json TEXT NOT NULL DEFAULT '[]', base_agent_definition_id TEXT, base_agent_release_id TEXT, base_package_hash_version TEXT, environment_profile_json TEXT, auto_managed INTEGER NOT NULL DEFAULT 0 CHECK(auto_managed IN (0,1)),
654
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
655
+ );
656
+ CREATE TABLE experience_promotion_receipts (
657
+ id TEXT PRIMARY KEY,
658
+ pack_id TEXT NOT NULL,
659
+ candidate_id TEXT NOT NULL,
660
+ agent_id TEXT NOT NULL,
661
+ action TEXT NOT NULL CHECK(action = 'promote'),
662
+ explicit_consent INTEGER NOT NULL CHECK(explicit_consent = 1),
663
+ verification_status TEXT NOT NULL CHECK(verification_status IN ('attested','verified')),
664
+ verification_method TEXT NOT NULL
665
+ CHECK(verification_method IN ('user-attested','local-run-receipt','local-test-receipt')),
666
+ evidence_hash TEXT NOT NULL,
667
+ public_safe INTEGER NOT NULL CHECK(public_safe IN (0,1)),
668
+ created_at TEXT NOT NULL,
669
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
670
+ FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
671
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
672
+ UNIQUE(candidate_id, action)
673
+ );
674
+ CREATE TABLE experience_public_projections (
675
+ projection_id TEXT PRIMARY KEY,
676
+ pack_id TEXT NOT NULL UNIQUE,
677
+ agent_id TEXT NOT NULL,
678
+ base_package_hash TEXT NOT NULL
679
+ CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
680
+ base_agent_definition_id TEXT NOT NULL,
681
+ base_agent_release_id TEXT NOT NULL,
682
+ environment_key TEXT NOT NULL,
683
+ source_bindings_json TEXT NOT NULL,
684
+ source_snapshot_hash TEXT NOT NULL
685
+ CHECK(length(source_snapshot_hash) = 64 AND source_snapshot_hash NOT GLOB '*[^0-9a-f]*'),
686
+ title TEXT NOT NULL,
687
+ instructions_json TEXT NOT NULL,
688
+ task_signatures_json TEXT NOT NULL,
689
+ environment_constraints_json TEXT NOT NULL,
690
+ proposal_hash TEXT NOT NULL
691
+ CHECK(length(proposal_hash) = 64 AND proposal_hash NOT GLOB '*[^0-9a-f]*'),
692
+ privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
693
+ status TEXT NOT NULL CHECK(status IN ('proposal','confirmed')),
694
+ confirmation_hash TEXT,
695
+ confirmed_at TEXT,
696
+ created_at TEXT NOT NULL,
697
+ updated_at TEXT NOT NULL,
698
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
699
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
700
+ CHECK(
701
+ (status = 'proposal' AND confirmation_hash IS NULL AND confirmed_at IS NULL) OR
702
+ (status = 'confirmed' AND length(confirmation_hash) = 64
703
+ AND confirmation_hash NOT GLOB '*[^0-9a-f]*' AND confirmed_at IS NOT NULL)
704
+ )
705
+ );
706
+ CREATE TABLE "experience_relation_edges" (
707
+ edge_id TEXT PRIMARY KEY,
708
+ pack_id TEXT NOT NULL,
709
+ from_node TEXT NOT NULL,
710
+ to_node TEXT NOT NULL,
711
+ edge_type TEXT NOT NULL
712
+ CHECK(edge_type IN (
713
+ 'has_release','exact_base_binding','contains','applies_to_task',
714
+ 'applies_in_environment','requires_mcp','supports_mcp',
715
+ 'alternative_mcp','supported_by','supersedes','contradicts',
716
+ 'similar_to','similar_by_tag'
717
+ )),
718
+ project_scope_key TEXT NOT NULL,
719
+ environment_key TEXT NOT NULL,
720
+ base_package_hash TEXT NOT NULL,
721
+ payload_json TEXT NOT NULL DEFAULT '{}',
722
+ source_fingerprint TEXT NOT NULL,
723
+ rebuilt_at TEXT NOT NULL,
724
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
725
+ FOREIGN KEY(from_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE,
726
+ FOREIGN KEY(to_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE
727
+ );
728
+ CREATE TABLE experience_relation_index_state (
729
+ scope_key TEXT PRIMARY KEY CHECK(scope_key = 'shared'),
730
+ source_fingerprint TEXT NOT NULL,
731
+ rebuilt_at TEXT NOT NULL,
732
+ node_count INTEGER NOT NULL,
733
+ edge_count INTEGER NOT NULL
734
+ );
650
735
  CREATE TABLE experience_relation_nodes (
651
736
  node_id TEXT PRIMARY KEY,
652
737
  pack_id TEXT NOT NULL,
@@ -663,75 +748,59 @@ CREATE TABLE experience_relation_nodes (
663
748
  FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
664
749
  UNIQUE(pack_id, node_type, entity_ref)
665
750
  );
666
- CREATE INDEX idx_experience_relation_nodes_scope
667
- ON experience_relation_nodes(project_scope_key, environment_key, base_package_hash, node_type);
668
- CREATE INDEX idx_experience_relation_nodes_pack_type
669
- ON experience_relation_nodes(pack_id, node_type, normalized_value);
670
- CREATE TABLE experience_relation_index_state (
671
- scope_key TEXT PRIMARY KEY CHECK(scope_key = 'shared'),
672
- source_fingerprint TEXT NOT NULL,
673
- rebuilt_at TEXT NOT NULL,
674
- node_count INTEGER NOT NULL,
675
- edge_count INTEGER NOT NULL
676
- );
677
- CREATE TABLE experience_cloud_uploads (
751
+ CREATE TABLE failure_events (
678
752
  id TEXT PRIMARY KEY,
679
- pack_id TEXT NOT NULL,
680
- requested_visibility TEXT NOT NULL
681
- CHECK(requested_visibility IN ('private','public')),
682
- bundle_id TEXT NOT NULL,
683
- bundle_hash TEXT NOT NULL,
684
- canonical_bundle_json TEXT NOT NULL,
685
- idempotency_key TEXT NOT NULL UNIQUE,
686
- remote_upload_id TEXT,
687
- remote_revision TEXT,
688
- remote_status TEXT NOT NULL
689
- CHECK(remote_status IN (
690
- 'local-ready','saving-private','private-saved','requesting-verification',
691
- 'verification-requested','verification-pending','verified-private',
692
- 'public-active','conflict','offline','error','withdrawn','rejected'
693
- )),
694
- remote_error_code TEXT,
695
- remote_error_message TEXT,
696
- remote_receipt_json TEXT,
697
- attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
698
- created_at TEXT NOT NULL,
699
- updated_at TEXT NOT NULL,
700
- FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
701
- UNIQUE(pack_id, bundle_hash, requested_visibility)
753
+ run_id TEXT,
754
+ ts TEXT NOT NULL,
755
+ source TEXT NOT NULL,
756
+ chat_id TEXT,
757
+ automation_id TEXT,
758
+ node_id TEXT,
759
+ agent_id TEXT,
760
+ error_code TEXT,
761
+ error_message TEXT NOT NULL,
762
+ payload_json TEXT NOT NULL DEFAULT '{}'
702
763
  );
703
- CREATE INDEX idx_experience_cloud_uploads_pack
704
- ON experience_cloud_uploads(pack_id, updated_at DESC);
705
- CREATE UNIQUE INDEX idx_experience_cloud_uploads_remote
706
- ON experience_cloud_uploads(remote_upload_id)
707
- WHERE remote_upload_id IS NOT NULL;
708
- CREATE INDEX idx_experience_cloud_uploads_recovery
709
- ON experience_cloud_uploads(remote_status, updated_at ASC);
710
- CREATE UNIQUE INDEX idx_experience_auto_pack_exact
711
- ON experience_packs(agent_id, project_scope_key, environment_key, base_package_hash)
712
- WHERE auto_managed = 1 AND status = 'active';
713
- CREATE TABLE experience_auto_intake_receipts (
764
+ CREATE TABLE firms (
714
765
  id TEXT PRIMARY KEY,
715
- agent_id TEXT NOT NULL,
716
- pack_id TEXT,
717
- candidate_id TEXT,
718
- source_memory_hash TEXT NOT NULL,
719
- status TEXT NOT NULL
720
- CHECK(status IN ('candidate-created','blocked','skipped')),
721
- memory_kind TEXT NOT NULL,
722
- reason_codes_json TEXT NOT NULL DEFAULT '[]',
723
- created_at TEXT NOT NULL, run_id TEXT NULL, redaction_count INTEGER NOT NULL DEFAULT 0,
724
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
725
- FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE SET NULL,
726
- FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE SET NULL,
727
- UNIQUE(agent_id, source_memory_hash)
728
- );
729
- CREATE INDEX idx_experience_auto_intake_agent_status
730
- ON experience_auto_intake_receipts(agent_id, status, created_at DESC);
731
- CREATE INDEX idx_run_events_agent_ts ON run_events(agent_id, ts DESC);
732
- CREATE INDEX idx_failure_events_agent_ts ON failure_events(agent_id, ts DESC);
733
- CREATE INDEX idx_run_events_agent_kind_ts
734
- ON run_events(agent_id, kind, ts DESC);
766
+ slug TEXT UNIQUE NOT NULL,
767
+ name TEXT NOT NULL,
768
+ tagline TEXT NOT NULL,
769
+ persona TEXT NOT NULL,
770
+ ceo_agent_id TEXT NOT NULL,
771
+ org_chart_json TEXT NOT NULL,
772
+ installed_at TEXT NOT NULL, name_en TEXT NOT NULL DEFAULT '', tagline_en TEXT NOT NULL DEFAULT '',
773
+ FOREIGN KEY(ceo_agent_id) REFERENCES installed_agents(id) ON DELETE RESTRICT
774
+ );
775
+ CREATE TABLE folder_activity (
776
+ path TEXT PRIMARY KEY,
777
+ visits INTEGER NOT NULL DEFAULT 0,
778
+ activated_at TEXT,
779
+ first_seen TEXT NOT NULL,
780
+ last_seen TEXT NOT NULL
781
+ );
782
+ CREATE TABLE graph_run_journal (
783
+ run_id TEXT NOT NULL,
784
+ seq INTEGER NOT NULL,
785
+ ts TEXT NOT NULL,
786
+ kind TEXT NOT NULL,
787
+ node_id TEXT,
788
+ payload_json TEXT,
789
+ PRIMARY KEY (run_id, seq)
790
+ );
791
+ CREATE TABLE hub_agent_bookmarks (
792
+ workspace_id TEXT NOT NULL,
793
+ slug TEXT NOT NULL,
794
+ entity_kind TEXT NOT NULL DEFAULT 'agent',
795
+ listing_json TEXT NOT NULL,
796
+ bookmarked_at TEXT NOT NULL,
797
+ server_updated_at TEXT,
798
+ sync_state TEXT NOT NULL DEFAULT 'clean'
799
+ CHECK(sync_state IN ('clean','pending_upsert','pending_delete')),
800
+ last_sync_error TEXT,
801
+ claim_workspace_id TEXT,
802
+ PRIMARY KEY(workspace_id, entity_kind, slug)
803
+ );
735
804
  CREATE TABLE installed_agent_hub_bindings (
736
805
  installed_agent_id TEXT PRIMARY KEY,
737
806
  agent_definition_id TEXT NOT NULL,
@@ -741,188 +810,42 @@ CREATE TABLE installed_agent_hub_bindings (
741
810
  FOREIGN KEY(installed_agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
742
811
  UNIQUE(agent_definition_id, agent_release_id, installed_agent_id)
743
812
  );
744
- CREATE INDEX idx_installed_agent_hub_binding_exact
745
- ON installed_agent_hub_bindings(agent_definition_id, agent_release_id);
746
- CREATE TABLE taste_draft_candidates (
813
+ CREATE TABLE installed_agents (
747
814
  id TEXT PRIMARY KEY,
748
- agent_id TEXT NOT NULL,
749
- source_memory_id TEXT NOT NULL,
750
- source_memory_hash TEXT NOT NULL,
751
- project_scope_key TEXT NOT NULL,
752
- environment_key TEXT NOT NULL,
753
- base_package_hash TEXT NOT NULL
754
- CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
755
- base_agent_definition_id TEXT,
756
- base_agent_release_id TEXT,
757
- sensitivity TEXT NOT NULL
758
- CHECK(sensitivity IN ('public','internal','private')),
759
- confidence TEXT NOT NULL
760
- CHECK(confidence IN ('high','medium','low')),
761
- axis_candidates_json TEXT NOT NULL DEFAULT '[]',
762
- task_signatures_json TEXT NOT NULL DEFAULT '[]',
763
- evidence_state TEXT NOT NULL DEFAULT 'pairwise-required'
764
- CHECK(evidence_state = 'pairwise-required'),
765
- status TEXT NOT NULL DEFAULT 'observation'
766
- CHECK(status IN ('observation','rejected')),
767
- created_at TEXT NOT NULL,
768
- updated_at TEXT NOT NULL,
769
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
770
- UNIQUE(agent_id, source_memory_hash, base_package_hash)
771
- );
772
- CREATE INDEX idx_taste_drafts_agent_status
773
- ON taste_draft_candidates(agent_id, status, updated_at DESC);
774
- CREATE INDEX idx_taste_drafts_exact_base
775
- ON taste_draft_candidates(agent_id, base_package_hash, project_scope_key, environment_key);
776
- CREATE TABLE taste_chip_workflows (
777
- workflow_id TEXT PRIMARY KEY,
778
- draft_id TEXT NOT NULL UNIQUE,
779
- agent_id TEXT NOT NULL,
780
- base_package_hash TEXT NOT NULL,
781
- base_agent_definition_id TEXT NOT NULL,
782
- base_agent_release_id TEXT NOT NULL,
783
- environment_key TEXT NOT NULL,
784
- taste_style_id TEXT NOT NULL,
785
- release_id TEXT NOT NULL UNIQUE,
786
- title TEXT NOT NULL,
787
- summary TEXT NOT NULL,
788
- rule_statement TEXT NOT NULL,
789
- axis TEXT NOT NULL,
790
- task_signature TEXT NOT NULL,
791
- contexts_json TEXT NOT NULL,
792
- generalization_hash TEXT NOT NULL,
793
- privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
794
- status TEXT NOT NULL CHECK(status IN ('proposal','confirmed','moderation-pending','ab-ready','error')),
795
- confirmed_at TEXT,
796
- preview_grants_json TEXT,
797
- preview_names_json TEXT,
798
- preview_digests_json TEXT,
799
- preview_rights TEXT,
800
- remote_preview_asset_ids_json TEXT,
801
- remote_revision TEXT,
802
- remote_error_code TEXT,
803
- created_at TEXT NOT NULL,
804
- updated_at TEXT NOT NULL, preview_provenance_json TEXT,
805
- FOREIGN KEY(draft_id) REFERENCES taste_draft_candidates(id) ON DELETE CASCADE,
806
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
807
- );
808
- CREATE INDEX idx_taste_chip_workflows_agent_status
809
- ON taste_chip_workflows(agent_id, status, updated_at DESC);
810
- CREATE TABLE experience_public_projections (
811
- projection_id TEXT PRIMARY KEY,
812
- pack_id TEXT NOT NULL UNIQUE,
813
- agent_id TEXT NOT NULL,
814
- base_package_hash TEXT NOT NULL
815
- CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
816
- base_agent_definition_id TEXT NOT NULL,
817
- base_agent_release_id TEXT NOT NULL,
818
- environment_key TEXT NOT NULL,
819
- source_bindings_json TEXT NOT NULL,
820
- source_snapshot_hash TEXT NOT NULL
821
- CHECK(length(source_snapshot_hash) = 64 AND source_snapshot_hash NOT GLOB '*[^0-9a-f]*'),
822
- title TEXT NOT NULL,
823
- instructions_json TEXT NOT NULL,
824
- task_signatures_json TEXT NOT NULL,
825
- environment_constraints_json TEXT NOT NULL,
826
- proposal_hash TEXT NOT NULL
827
- CHECK(length(proposal_hash) = 64 AND proposal_hash NOT GLOB '*[^0-9a-f]*'),
828
- privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
829
- status TEXT NOT NULL CHECK(status IN ('proposal','confirmed')),
830
- confirmation_hash TEXT,
831
- confirmed_at TEXT,
832
- created_at TEXT NOT NULL,
833
- updated_at TEXT NOT NULL,
834
- FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
835
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
836
- CHECK(
837
- (status = 'proposal' AND confirmation_hash IS NULL AND confirmed_at IS NULL) OR
838
- (status = 'confirmed' AND length(confirmation_hash) = 64
839
- AND confirmation_hash NOT GLOB '*[^0-9a-f]*' AND confirmed_at IS NOT NULL)
840
- )
841
- );
842
- CREATE INDEX idx_experience_public_projection_agent_status
843
- ON experience_public_projections(agent_id, status, updated_at DESC);
844
- CREATE INDEX idx_experience_public_projection_exact_base
845
- ON experience_public_projections(
846
- base_agent_definition_id, base_agent_release_id, base_package_hash, environment_key
847
- );
848
- CREATE TABLE experience_governance_relations (
849
- relation_id TEXT PRIMARY KEY,
850
- agent_id TEXT NOT NULL,
851
- pack_id TEXT NOT NULL,
852
- from_candidate_id TEXT NOT NULL,
853
- to_candidate_id TEXT NOT NULL,
854
- relation_type TEXT NOT NULL CHECK(relation_type IN ('supersedes','contradicts')),
855
- reason TEXT NOT NULL,
856
- created_at TEXT NOT NULL,
857
- FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
858
- FOREIGN KEY(from_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
859
- FOREIGN KEY(to_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
860
- UNIQUE(from_candidate_id, to_candidate_id, relation_type)
861
- );
862
- CREATE INDEX idx_experience_governance_pack
863
- ON experience_governance_relations(pack_id, relation_type, created_at ASC);
864
- CREATE TABLE IF NOT EXISTS "experience_relation_edges" (
865
- edge_id TEXT PRIMARY KEY,
866
- pack_id TEXT NOT NULL,
867
- from_node TEXT NOT NULL,
868
- to_node TEXT NOT NULL,
869
- edge_type TEXT NOT NULL
870
- CHECK(edge_type IN (
871
- 'has_release','exact_base_binding','contains','applies_to_task',
872
- 'applies_in_environment','requires_mcp','supports_mcp',
873
- 'alternative_mcp','supported_by','supersedes','contradicts',
874
- 'similar_to','similar_by_tag'
875
- )),
876
- project_scope_key TEXT NOT NULL,
877
- environment_key TEXT NOT NULL,
878
- base_package_hash TEXT NOT NULL,
879
- payload_json TEXT NOT NULL DEFAULT '{}',
880
- source_fingerprint TEXT NOT NULL,
881
- rebuilt_at TEXT NOT NULL,
882
- FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
883
- FOREIGN KEY(from_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE,
884
- FOREIGN KEY(to_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE
885
- );
886
- CREATE INDEX idx_experience_relation_edges_scope
887
- ON experience_relation_edges(project_scope_key, environment_key, base_package_hash, edge_type);
888
- CREATE INDEX idx_experience_relation_edges_from
889
- ON experience_relation_edges(pack_id, from_node, edge_type);
890
- CREATE INDEX idx_experience_relation_edges_to
891
- ON experience_relation_edges(pack_id, to_node, edge_type);
892
- CREATE TABLE memory_tickets (
893
- ticket_id TEXT PRIMARY KEY,
894
- turn_key TEXT NOT NULL UNIQUE,
895
- turn_id TEXT,
896
- run_id TEXT,
897
- node_id TEXT,
898
- chat_id TEXT,
899
- agent_id TEXT,
900
- project_id TEXT,
901
- project_path_hash TEXT,
902
- emitter_status TEXT NOT NULL
903
- CHECK(emitter_status IN ('valid','empty','missing','malformed','read_only')),
904
- candidate_count INTEGER NOT NULL DEFAULT 0 CHECK(candidate_count >= 0),
905
- state TEXT NOT NULL DEFAULT 'received'
906
- CHECK(state IN ('received','completed','read_only','failed')),
907
- curator_mode TEXT NOT NULL DEFAULT 'policy'
908
- CHECK(curator_mode IN ('semantic','policy','policy_fallback','read_only')),
909
- curation_outcome TEXT NOT NULL DEFAULT 'no_candidates'
910
- CHECK(curation_outcome IN ('decided','no_candidates','malformed_output','curator_failed','read_only')),
911
- written_count INTEGER NOT NULL DEFAULT 0 CHECK(written_count >= 0),
912
- deduped_count INTEGER NOT NULL DEFAULT 0 CHECK(deduped_count >= 0),
913
- redacted_count INTEGER NOT NULL DEFAULT 0 CHECK(redacted_count >= 0),
914
- session_count INTEGER NOT NULL DEFAULT 0 CHECK(session_count >= 0),
915
- discarded_count INTEGER NOT NULL DEFAULT 0 CHECK(discarded_count >= 0),
916
- failure_code TEXT,
917
- created_at TEXT NOT NULL,
918
- updated_at TEXT NOT NULL
815
+ slug TEXT UNIQUE NOT NULL,
816
+ name TEXT NOT NULL,
817
+ tagline TEXT NOT NULL,
818
+ system_prompt TEXT NOT NULL DEFAULT '',
819
+ mcp_servers_json TEXT NOT NULL,
820
+ preferred_backend TEXT,
821
+ trust_grade TEXT NOT NULL,
822
+ installed_at TEXT NOT NULL,
823
+ tone TEXT NOT NULL
824
+ , env_requirements_json TEXT NOT NULL DEFAULT '[]', name_en TEXT NOT NULL DEFAULT '', tagline_en TEXT NOT NULL DEFAULT '', builtin INTEGER NOT NULL DEFAULT 0, role TEXT, visibility TEXT NOT NULL DEFAULT 'visible' CHECK(visibility IN ('visible','background','private')), entity_kind TEXT, local_display_name TEXT, bookmarked_at TEXT NULL, parent_team_id TEXT NULL);
825
+ CREATE TABLE judgment_verdicts (
826
+ kind TEXT NOT NULL,
827
+ signature TEXT NOT NULL,
828
+ verdict TEXT NOT NULL,
829
+ confidence REAL NOT NULL DEFAULT 0,
830
+ reason TEXT NOT NULL DEFAULT '',
831
+ created_at TEXT NOT NULL,
832
+ last_hit_at TEXT NOT NULL,
833
+ hits INTEGER NOT NULL DEFAULT 1,
834
+ PRIMARY KEY (kind, signature)
835
+ );
836
+ CREATE TABLE mcp_servers (
837
+ id TEXT PRIMARY KEY,
838
+ catalog_id TEXT,
839
+ name TEXT NOT NULL,
840
+ name_en TEXT NOT NULL DEFAULT '',
841
+ transport TEXT NOT NULL,
842
+ command TEXT,
843
+ args_json TEXT NOT NULL DEFAULT '[]',
844
+ url TEXT,
845
+ env_keys_json TEXT NOT NULL DEFAULT '[]',
846
+ enabled INTEGER NOT NULL DEFAULT 1,
847
+ installed_at TEXT NOT NULL
919
848
  );
920
- CREATE INDEX idx_memory_tickets_project_created
921
- ON memory_tickets(project_id, created_at DESC);
922
- CREATE INDEX idx_memory_tickets_agent_created
923
- ON memory_tickets(agent_id, created_at DESC);
924
- CREATE INDEX idx_memory_tickets_status_created
925
- ON memory_tickets(emitter_status, state, created_at DESC);
926
849
  CREATE TABLE memory_decisions (
927
850
  decision_id TEXT PRIMARY KEY,
928
851
  ticket_id TEXT NOT NULL,
@@ -945,32 +868,21 @@ CREATE TABLE memory_decisions (
945
868
  FOREIGN KEY(target_memory_id) REFERENCES memory_entries(id) ON DELETE SET NULL,
946
869
  UNIQUE(ticket_id, candidate_index)
947
870
  );
948
- CREATE INDEX idx_memory_decisions_ticket_action
949
- ON memory_decisions(ticket_id, action, candidate_index);
950
- CREATE TABLE memory_relation_edges (
951
- relation_id TEXT PRIMARY KEY,
952
- from_memory_id TEXT NOT NULL,
953
- to_memory_id TEXT NOT NULL,
954
- relation_type TEXT NOT NULL
955
- CHECK(relation_type IN ('similar_to','supersedes','contradicts')),
956
- score REAL,
957
- owner_scope_key TEXT NOT NULL,
958
- embedding_model TEXT,
959
- embedding_adapter TEXT,
960
- embedding_model_sha256 TEXT,
961
- created_at TEXT NOT NULL,
962
- FOREIGN KEY(from_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
963
- FOREIGN KEY(to_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
964
- CHECK(from_memory_id <> to_memory_id),
965
- CHECK(score IS NULL OR (score >= -1.0 AND score <= 1.0)),
966
- UNIQUE(from_memory_id, to_memory_id, relation_type)
967
- );
968
- CREATE INDEX idx_memory_relation_from
969
- ON memory_relation_edges(from_memory_id, relation_type, score DESC);
970
- CREATE INDEX idx_memory_relation_to
971
- ON memory_relation_edges(to_memory_id, relation_type, score DESC);
972
- CREATE INDEX idx_memory_relation_owner
973
- ON memory_relation_edges(owner_scope_key, relation_type, score DESC);
871
+ CREATE TABLE memory_entries (
872
+ id TEXT PRIMARY KEY,
873
+ scope TEXT NOT NULL,
874
+ kind TEXT NOT NULL,
875
+ content TEXT NOT NULL,
876
+ project_id TEXT,
877
+ project_path TEXT,
878
+ agent_id TEXT,
879
+ chat_id TEXT,
880
+ confidence TEXT NOT NULL DEFAULT 'medium',
881
+ sensitivity TEXT NOT NULL DEFAULT 'internal',
882
+ evidence_json TEXT NOT NULL DEFAULT '[]',
883
+ superseded_at TEXT,
884
+ created_at TEXT NOT NULL
885
+ , context_json TEXT NOT NULL DEFAULT '{}', embedding_model TEXT, embedding_adapter TEXT, embedding_model_sha256 TEXT, embedding_content_hash TEXT, embedding_dimensions INTEGER, embedding_json TEXT);
974
886
  CREATE TABLE memory_episodes (
975
887
  episode_id TEXT PRIMARY KEY,
976
888
  ticket_id TEXT NOT NULL UNIQUE,
@@ -993,324 +905,439 @@ CREATE TABLE memory_episodes (
993
905
  CHECK(summary_hash IS NULL OR
994
906
  (length(summary_hash) = 64 AND summary_hash NOT GLOB '*[^0-9a-f]*'))
995
907
  );
996
- CREATE INDEX idx_memory_episodes_project_created
997
- ON memory_episodes(project_id, created_at DESC);
998
- CREATE INDEX idx_memory_episodes_project_path_created
999
- ON memory_episodes(project_path_hash, created_at DESC);
1000
- CREATE INDEX idx_memory_episodes_agent_created
1001
- ON memory_episodes(agent_id, created_at DESC);
1002
- CREATE INDEX idx_automation_runs_occurrence
1003
- ON automation_runs(automation_id, occurrence_id, started_at);
1004
- CREATE TABLE tasks (
1005
- id TEXT PRIMARY KEY,
1006
- title TEXT NOT NULL DEFAULT '',
1007
- project_id TEXT,
1008
- firm_id TEXT,
1009
- status TEXT NOT NULL DEFAULT 'open',
908
+ CREATE TABLE memory_relation_edges (
909
+ relation_id TEXT PRIMARY KEY,
910
+ from_memory_id TEXT NOT NULL,
911
+ to_memory_id TEXT NOT NULL,
912
+ relation_type TEXT NOT NULL
913
+ CHECK(relation_type IN ('similar_to','supersedes','contradicts')),
914
+ score REAL,
915
+ owner_scope_key TEXT NOT NULL,
916
+ embedding_model TEXT,
917
+ embedding_adapter TEXT,
918
+ embedding_model_sha256 TEXT,
1010
919
  created_at TEXT NOT NULL,
1011
- updated_at TEXT NOT NULL,
1012
- archived_at TEXT,
1013
- origin_chat_id TEXT,
1014
- FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
1015
- FOREIGN KEY(firm_id) REFERENCES firms(id) ON DELETE SET NULL
920
+ FOREIGN KEY(from_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
921
+ FOREIGN KEY(to_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
922
+ CHECK(from_memory_id <> to_memory_id),
923
+ CHECK(score IS NULL OR (score >= -1.0 AND score <= 1.0)),
924
+ UNIQUE(from_memory_id, to_memory_id, relation_type)
1016
925
  );
1017
- CREATE INDEX idx_tasks_updated ON tasks(updated_at DESC);
1018
- CREATE INDEX idx_tasks_project_updated ON tasks(project_id, updated_at DESC);
1019
- CREATE INDEX idx_tasks_firm_updated ON tasks(firm_id, updated_at DESC);
1020
- CREATE INDEX idx_tasks_origin_chat ON tasks(origin_chat_id);
1021
- CREATE TABLE task_agent_participants (
1022
- task_id TEXT NOT NULL,
926
+ CREATE TABLE memory_tickets (
927
+ ticket_id TEXT PRIMARY KEY,
928
+ turn_key TEXT NOT NULL UNIQUE,
929
+ turn_id TEXT,
930
+ run_id TEXT,
931
+ node_id TEXT,
932
+ chat_id TEXT,
1023
933
  agent_id TEXT,
1024
- agent_slug TEXT NOT NULL,
1025
- role TEXT,
1026
- first_seen_at TEXT NOT NULL,
1027
- last_seen_at TEXT NOT NULL,
1028
- PRIMARY KEY(task_id, agent_slug),
1029
- FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE,
1030
- FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
1031
- );
1032
- CREATE INDEX idx_task_participants_agent ON task_agent_participants(agent_id);
1033
- CREATE TABLE agent_usage (
1034
- agent_key TEXT PRIMARY KEY,
1035
- kind TEXT NOT NULL,
1036
- first_used_at TEXT NOT NULL,
1037
- last_used_at TEXT NOT NULL,
1038
- use_count INTEGER NOT NULL DEFAULT 0
1039
- );
1040
- CREATE INDEX idx_experience_auto_intake_run
1041
- ON experience_auto_intake_receipts(agent_id, run_id)
1042
- WHERE run_id IS NOT NULL;
1043
- CREATE INDEX idx_installed_agents_parent_team ON installed_agents(parent_team_id) WHERE parent_team_id IS NOT NULL;
1044
- CREATE TABLE IF NOT EXISTS "borrowed_agent_careers_v76_legacy" (
1045
- owner_scope_key TEXT NOT NULL,
1046
- entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1047
- slug TEXT NOT NULL,
1048
- first_used_at TEXT NOT NULL,
1049
- last_used_at TEXT NOT NULL,
1050
- use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
1051
- latest_runtime_json TEXT,
1052
- name_en TEXT,
1053
- name_ko TEXT,
1054
- tagline_en TEXT,
1055
- tagline_ko TEXT,
1056
- PRIMARY KEY(owner_scope_key, entity_kind, slug)
1057
- );
1058
- CREATE TABLE IF NOT EXISTS "borrowed_agent_career_runs_v76_legacy" (
1059
- owner_scope_key TEXT NOT NULL,
1060
- entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1061
- slug TEXT NOT NULL,
1062
- run_id_hash TEXT NOT NULL,
1063
- recorded_at TEXT NOT NULL,
1064
- PRIMARY KEY(owner_scope_key, entity_kind, slug, run_id_hash),
1065
- FOREIGN KEY(owner_scope_key, entity_kind, slug)
1066
- REFERENCES "borrowed_agent_careers_v76_legacy"(owner_scope_key, entity_kind, slug)
1067
- ON DELETE CASCADE
1068
- );
1069
- CREATE TABLE borrowed_agent_careers (
1070
- owner_scope_key TEXT NOT NULL,
1071
- entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1072
- agent_definition_id TEXT NOT NULL,
1073
- agent_release_id TEXT NOT NULL,
1074
- component_id TEXT NOT NULL DEFAULT '',
1075
- slug TEXT NOT NULL,
1076
- memory_key TEXT NOT NULL,
1077
- first_used_at TEXT NOT NULL,
1078
- last_used_at TEXT NOT NULL,
1079
- use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
1080
- latest_runtime_json TEXT,
1081
- name_en TEXT,
1082
- name_ko TEXT,
1083
- tagline_en TEXT,
1084
- tagline_ko TEXT,
1085
- PRIMARY KEY(
1086
- owner_scope_key, entity_kind, agent_definition_id,
1087
- agent_release_id, component_id
1088
- )
934
+ project_id TEXT,
935
+ project_path_hash TEXT,
936
+ emitter_status TEXT NOT NULL
937
+ CHECK(emitter_status IN ('valid','empty','missing','malformed','read_only')),
938
+ candidate_count INTEGER NOT NULL DEFAULT 0 CHECK(candidate_count >= 0),
939
+ state TEXT NOT NULL DEFAULT 'received'
940
+ CHECK(state IN ('received','completed','read_only','failed')),
941
+ curator_mode TEXT NOT NULL DEFAULT 'policy'
942
+ CHECK(curator_mode IN ('semantic','policy','policy_fallback','read_only')),
943
+ curation_outcome TEXT NOT NULL DEFAULT 'no_candidates'
944
+ CHECK(curation_outcome IN ('decided','no_candidates','malformed_output','curator_failed','read_only')),
945
+ written_count INTEGER NOT NULL DEFAULT 0 CHECK(written_count >= 0),
946
+ deduped_count INTEGER NOT NULL DEFAULT 0 CHECK(deduped_count >= 0),
947
+ redacted_count INTEGER NOT NULL DEFAULT 0 CHECK(redacted_count >= 0),
948
+ session_count INTEGER NOT NULL DEFAULT 0 CHECK(session_count >= 0),
949
+ discarded_count INTEGER NOT NULL DEFAULT 0 CHECK(discarded_count >= 0),
950
+ failure_code TEXT,
951
+ created_at TEXT NOT NULL,
952
+ updated_at TEXT NOT NULL
1089
953
  );
1090
- CREATE UNIQUE INDEX idx_borrowed_agent_careers_owner_memory
1091
- ON borrowed_agent_careers(owner_scope_key, memory_key);
1092
- CREATE INDEX idx_borrowed_agent_careers_owner_recent
1093
- ON borrowed_agent_careers(owner_scope_key, last_used_at DESC);
1094
- CREATE TABLE borrowed_agent_career_runs (
1095
- owner_scope_key TEXT NOT NULL,
1096
- entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1097
- agent_definition_id TEXT NOT NULL,
1098
- agent_release_id TEXT NOT NULL,
1099
- component_id TEXT NOT NULL DEFAULT '',
1100
- run_id_hash TEXT NOT NULL,
1101
- recorded_at TEXT NOT NULL,
1102
- PRIMARY KEY(
1103
- owner_scope_key, entity_kind, agent_definition_id,
1104
- agent_release_id, component_id, run_id_hash
1105
- ),
1106
- FOREIGN KEY(
1107
- owner_scope_key, entity_kind, agent_definition_id,
1108
- agent_release_id, component_id
1109
- )
1110
- REFERENCES borrowed_agent_careers(
1111
- owner_scope_key, entity_kind, agent_definition_id,
1112
- agent_release_id, component_id
1113
- )
1114
- ON DELETE CASCADE
954
+ CREATE TABLE meta (
955
+ key TEXT PRIMARY KEY,
956
+ value TEXT NOT NULL
1115
957
  );
1116
- CREATE TABLE model_roles (
1117
- role TEXT PRIMARY KEY CHECK(role IN ('orchestrator','worker')),
958
+ CREATE TABLE model_role_members (
959
+ role TEXT NOT NULL CHECK(role IN ('orchestrator','worker')),
960
+ position INTEGER NOT NULL CHECK(position >= 1),
1118
961
  kind TEXT NOT NULL,
1119
962
  backend TEXT,
1120
963
  source TEXT,
1121
964
  model TEXT,
1122
965
  effort TEXT,
1123
966
  long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
1124
- inherit INTEGER NOT NULL DEFAULT 0 CHECK(inherit IN (0,1)),
1125
967
  updated_at TEXT NOT NULL,
1126
- CHECK(role = 'worker' OR inherit = 0)
968
+ PRIMARY KEY(role, position)
1127
969
  );
1128
- CREATE TABLE model_role_members (
1129
- role TEXT NOT NULL CHECK(role IN ('orchestrator','worker')),
1130
- position INTEGER NOT NULL CHECK(position >= 1),
970
+ CREATE TABLE model_roles (
971
+ role TEXT PRIMARY KEY CHECK(role IN ('orchestrator','worker')),
1131
972
  kind TEXT NOT NULL,
1132
973
  backend TEXT,
1133
974
  source TEXT,
1134
975
  model TEXT,
1135
976
  effort TEXT,
1136
977
  long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
978
+ inherit INTEGER NOT NULL DEFAULT 0 CHECK(inherit IN (0,1)),
1137
979
  updated_at TEXT NOT NULL,
1138
- PRIMARY KEY(role, position)
980
+ CHECK(role = 'worker' OR inherit = 0)
1139
981
  );
1140
- CREATE TABLE automation_sessions (
982
+ CREATE TABLE project_agent_rent_allow (
983
+ project_id TEXT NOT NULL,
984
+ slug TEXT NOT NULL,
985
+ allowed INTEGER NOT NULL DEFAULT 0,
986
+ updated_at TEXT NOT NULL,
987
+ PRIMARY KEY (project_id, slug)
988
+ );
989
+ CREATE TABLE projects (
1141
990
  id TEXT PRIMARY KEY,
1142
- automation_id TEXT NOT NULL,
1143
- target_kind TEXT NOT NULL CHECK(target_kind IN ('host','agent','firm','hub')),
1144
- target_id TEXT NOT NULL,
1145
- ledger_chat_id TEXT NOT NULL UNIQUE REFERENCES chats(id) ON DELETE CASCADE,
991
+ name TEXT NOT NULL,
992
+ description TEXT,
993
+ default_agent_id TEXT,
994
+ context_note TEXT,
1146
995
  created_at TEXT NOT NULL,
1147
- updated_at TEXT NOT NULL,
1148
- UNIQUE(automation_id, target_kind, target_id)
996
+ updated_at TEXT NOT NULL, folder_path TEXT, system_prompt TEXT, agent_pool_json TEXT NOT NULL DEFAULT '[]', source_type TEXT NOT NULL DEFAULT 'local', source_ref TEXT,
997
+ FOREIGN KEY(default_agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
1149
998
  );
1150
- CREATE INDEX idx_automation_sessions_owner
1151
- ON automation_sessions(automation_id, updated_at DESC);
1152
- CREATE TABLE IF NOT EXISTS "telegram_bindings" (
999
+ CREATE TABLE run_events (
1153
1000
  id TEXT PRIMARY KEY,
1154
- target_kind TEXT NOT NULL CHECK(target_kind IN ('agent','firm','one')),
1155
- target_id TEXT NOT NULL,
1156
- telegram_chat_id TEXT,
1157
- telegram_chat_title TEXT,
1158
- bot_user_id INTEGER,
1159
- bot_username TEXT,
1160
- bot_display_name TEXT,
1161
- chat_session_id TEXT REFERENCES chats(id) ON DELETE SET NULL,
1162
- status TEXT NOT NULL,
1163
- enabled INTEGER NOT NULL DEFAULT 0,
1164
- last_update_id INTEGER NOT NULL DEFAULT 0,
1165
- last_error TEXT,
1166
- last_test_at TEXT,
1167
- created_at TEXT NOT NULL,
1168
- updated_at TEXT NOT NULL,
1169
- automation_report_enabled INTEGER NOT NULL DEFAULT 0,
1170
- token_saved INTEGER NOT NULL DEFAULT 0,
1171
- token_fingerprint TEXT,
1172
- designated_project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
1173
- designated_graph_id TEXT,
1174
- legacy_notice_at TEXT
1175
- );
1176
- CREATE INDEX idx_telegram_bindings_target
1177
- ON telegram_bindings(target_kind, target_id);
1178
- CREATE INDEX idx_telegram_bindings_chat
1179
- ON telegram_bindings(telegram_chat_id);
1180
- CREATE INDEX idx_telegram_bindings_enabled
1181
- ON telegram_bindings(enabled, status);
1182
- CREATE INDEX idx_telegram_bindings_automation_report
1183
- ON telegram_bindings(automation_report_enabled, enabled, telegram_chat_id);
1184
- CREATE UNIQUE INDEX idx_telegram_bindings_one_singleton
1185
- ON telegram_bindings(target_kind) WHERE target_kind = 'one';
1186
- CREATE TABLE automation_node_approvals (
1187
- automation_id TEXT NOT NULL,
1188
- occurrence_id TEXT NOT NULL,
1189
- node_id TEXT NOT NULL,
1190
- decision TEXT NOT NULL,
1191
- decided_at TEXT NOT NULL,
1192
- decided_by TEXT NOT NULL, scope TEXT NOT NULL DEFAULT 'once',
1193
- PRIMARY KEY (automation_id, occurrence_id, node_id)
1194
- );
1195
- CREATE INDEX idx_automation_node_approvals_node ON automation_node_approvals(automation_id, node_id, decided_at);
1196
- CREATE TABLE automation_eval_corrections (
1197
- automation_id TEXT NOT NULL,
1198
- node_id TEXT NOT NULL,
1199
- subject_preview TEXT NOT NULL,
1200
- corrected_verdict TEXT NOT NULL,
1201
- note TEXT NOT NULL DEFAULT '',
1202
- created_at TEXT NOT NULL,
1203
- PRIMARY KEY (automation_id, node_id, created_at)
1204
- );
1205
- CREATE TABLE graph_run_journal (
1206
- run_id TEXT NOT NULL,
1207
- seq INTEGER NOT NULL,
1208
- ts TEXT NOT NULL,
1209
- kind TEXT NOT NULL,
1210
- node_id TEXT,
1211
- payload_json TEXT,
1212
- PRIMARY KEY (run_id, seq)
1213
- );
1214
- CREATE INDEX idx_graph_run_journal_run ON graph_run_journal(run_id, seq);
1215
- CREATE TABLE automation_graph_versions (
1216
- id TEXT PRIMARY KEY,
1217
- automation_id TEXT NOT NULL,
1218
- saved_at TEXT NOT NULL,
1219
- note TEXT,
1220
- node_count INTEGER NOT NULL DEFAULT 0,
1221
- graph_json TEXT NOT NULL
1222
- );
1223
- CREATE INDEX idx_automation_graph_versions ON automation_graph_versions(automation_id, saved_at DESC);
1224
- CREATE TABLE automation_run_inputs (
1225
- id TEXT PRIMARY KEY,
1226
- automation_id TEXT NOT NULL,
1227
- payload_json TEXT NOT NULL,
1228
- requested_by TEXT NOT NULL,
1229
- created_at TEXT NOT NULL,
1230
- consumed_at TEXT,
1231
- consumed_run_id TEXT
1232
- );
1233
- CREATE INDEX idx_automation_run_inputs_pending ON automation_run_inputs(automation_id, consumed_at, created_at);
1234
- CREATE TABLE automation_approval_waits (
1235
- automation_id TEXT NOT NULL,
1236
- node_id TEXT NOT NULL,
1237
- first_requested_at TEXT NOT NULL,
1238
- PRIMARY KEY (automation_id, node_id)
1239
- );
1240
- CREATE TABLE automation_trigger_events (
1001
+ run_id TEXT NOT NULL,
1002
+ seq INTEGER NOT NULL,
1003
+ ts TEXT NOT NULL,
1004
+ kind TEXT NOT NULL,
1005
+ chat_id TEXT,
1006
+ automation_id TEXT,
1007
+ node_id TEXT,
1008
+ agent_id TEXT,
1009
+ payload_json TEXT NOT NULL DEFAULT '{}',
1010
+ UNIQUE(run_id, seq)
1011
+ );
1012
+ CREATE TABLE run_history (
1241
1013
  id TEXT PRIMARY KEY,
1242
- automation_id TEXT NOT NULL,
1243
- trigger_kind TEXT NOT NULL CHECK(trigger_kind IN ('fs','chain','webhook','poll','command')),
1244
- dedupe_key TEXT NOT NULL,
1245
- payload_json TEXT NOT NULL,
1246
- status TEXT NOT NULL DEFAULT 'pending'
1247
- CHECK(status IN ('pending','claimed','delivered','parked')),
1248
- attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
1249
- next_attempt_at TEXT NOT NULL,
1250
- claim_owner TEXT,
1251
- claimed_until TEXT,
1252
- run_id TEXT,
1253
- run_outcome TEXT CHECK(run_outcome IS NULL OR run_outcome IN
1254
- ('ok','partial','error','skipped','blocked','needs_input')),
1014
+ automation_id TEXT,
1015
+ scheduled_for TEXT,
1016
+ ran_at TEXT,
1017
+ status TEXT,
1018
+ skipped_count INTEGER DEFAULT 0,
1019
+ error TEXT
1020
+ , outcome TEXT, outcome_reason TEXT, acknowledged_at TEXT);
1021
+ CREATE TABLE task_agent_participants (
1022
+ task_id TEXT NOT NULL,
1023
+ agent_id TEXT,
1024
+ agent_slug TEXT NOT NULL,
1025
+ role TEXT,
1026
+ first_seen_at TEXT NOT NULL,
1027
+ last_seen_at TEXT NOT NULL,
1028
+ PRIMARY KEY(task_id, agent_slug),
1029
+ FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE,
1030
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
1031
+ );
1032
+ CREATE TABLE tasks (
1033
+ id TEXT PRIMARY KEY,
1034
+ title TEXT NOT NULL DEFAULT '',
1035
+ project_id TEXT,
1036
+ firm_id TEXT,
1037
+ status TEXT NOT NULL DEFAULT 'open',
1038
+ created_at TEXT NOT NULL,
1039
+ updated_at TEXT NOT NULL,
1040
+ archived_at TEXT,
1041
+ origin_chat_id TEXT,
1042
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
1043
+ FOREIGN KEY(firm_id) REFERENCES firms(id) ON DELETE SET NULL
1044
+ );
1045
+ CREATE TABLE taste_chip_workflows (
1046
+ workflow_id TEXT PRIMARY KEY,
1047
+ draft_id TEXT NOT NULL UNIQUE,
1048
+ agent_id TEXT NOT NULL,
1049
+ base_package_hash TEXT NOT NULL,
1050
+ base_agent_definition_id TEXT NOT NULL,
1051
+ base_agent_release_id TEXT NOT NULL,
1052
+ environment_key TEXT NOT NULL,
1053
+ taste_style_id TEXT NOT NULL,
1054
+ release_id TEXT NOT NULL UNIQUE,
1055
+ title TEXT NOT NULL,
1056
+ summary TEXT NOT NULL,
1057
+ rule_statement TEXT NOT NULL,
1058
+ axis TEXT NOT NULL,
1059
+ task_signature TEXT NOT NULL,
1060
+ contexts_json TEXT NOT NULL,
1061
+ generalization_hash TEXT NOT NULL,
1062
+ privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
1063
+ status TEXT NOT NULL CHECK(status IN ('proposal','confirmed','moderation-pending','ab-ready','error')),
1064
+ confirmed_at TEXT,
1065
+ preview_grants_json TEXT,
1066
+ preview_names_json TEXT,
1067
+ preview_digests_json TEXT,
1068
+ preview_rights TEXT,
1069
+ remote_preview_asset_ids_json TEXT,
1070
+ remote_revision TEXT,
1071
+ remote_error_code TEXT,
1072
+ created_at TEXT NOT NULL,
1073
+ updated_at TEXT NOT NULL, preview_provenance_json TEXT,
1074
+ FOREIGN KEY(draft_id) REFERENCES taste_draft_candidates(id) ON DELETE CASCADE,
1075
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
1076
+ );
1077
+ CREATE TABLE taste_draft_candidates (
1078
+ id TEXT PRIMARY KEY,
1079
+ agent_id TEXT NOT NULL,
1080
+ source_memory_id TEXT NOT NULL,
1081
+ source_memory_hash TEXT NOT NULL,
1082
+ project_scope_key TEXT NOT NULL,
1083
+ environment_key TEXT NOT NULL,
1084
+ base_package_hash TEXT NOT NULL
1085
+ CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
1086
+ base_agent_definition_id TEXT,
1087
+ base_agent_release_id TEXT,
1088
+ sensitivity TEXT NOT NULL
1089
+ CHECK(sensitivity IN ('public','internal','private')),
1090
+ confidence TEXT NOT NULL
1091
+ CHECK(confidence IN ('high','medium','low')),
1092
+ axis_candidates_json TEXT NOT NULL DEFAULT '[]',
1093
+ task_signatures_json TEXT NOT NULL DEFAULT '[]',
1094
+ evidence_state TEXT NOT NULL DEFAULT 'pairwise-required'
1095
+ CHECK(evidence_state = 'pairwise-required'),
1096
+ status TEXT NOT NULL DEFAULT 'observation'
1097
+ CHECK(status IN ('observation','rejected')),
1098
+ created_at TEXT NOT NULL,
1099
+ updated_at TEXT NOT NULL,
1100
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
1101
+ UNIQUE(agent_id, source_memory_hash, base_package_hash)
1102
+ );
1103
+ CREATE TABLE "telegram_bindings" (
1104
+ id TEXT PRIMARY KEY,
1105
+ target_kind TEXT NOT NULL CHECK(target_kind IN ('agent','firm','one')),
1106
+ target_id TEXT NOT NULL,
1107
+ telegram_chat_id TEXT,
1108
+ telegram_chat_title TEXT,
1109
+ bot_user_id INTEGER,
1110
+ bot_username TEXT,
1111
+ bot_display_name TEXT,
1112
+ chat_session_id TEXT REFERENCES chats(id) ON DELETE SET NULL,
1113
+ status TEXT NOT NULL,
1114
+ enabled INTEGER NOT NULL DEFAULT 0,
1115
+ last_update_id INTEGER NOT NULL DEFAULT 0,
1255
1116
  last_error TEXT,
1117
+ last_test_at TEXT,
1256
1118
  created_at TEXT NOT NULL,
1257
1119
  updated_at TEXT NOT NULL,
1258
- delivered_at TEXT,
1259
- FOREIGN KEY(automation_id) REFERENCES automations(id) ON DELETE CASCADE,
1260
- UNIQUE(automation_id, trigger_kind, dedupe_key),
1261
- CHECK(
1262
- (status = 'claimed' AND claim_owner IS NOT NULL AND claimed_until IS NOT NULL) OR
1263
- (status <> 'claimed' AND claim_owner IS NULL AND claimed_until IS NULL)
1264
- ),
1265
- CHECK((status = 'delivered' AND delivered_at IS NOT NULL) OR status <> 'delivered')
1120
+ automation_report_enabled INTEGER NOT NULL DEFAULT 0,
1121
+ token_saved INTEGER NOT NULL DEFAULT 0,
1122
+ token_fingerprint TEXT,
1123
+ designated_project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
1124
+ designated_graph_id TEXT,
1125
+ legacy_notice_at TEXT
1266
1126
  );
1267
- CREATE INDEX idx_automation_trigger_events_due
1268
- ON automation_trigger_events(status, next_attempt_at, created_at);
1127
+ CREATE INDEX idx_agent_app_ops_app_created
1128
+ ON agent_app_operations(app_id, created_at DESC);
1129
+ CREATE INDEX idx_agent_apps_chat_updated
1130
+ ON agent_apps(chat_id, updated_at DESC);
1131
+ CREATE UNIQUE INDEX idx_agent_apps_root
1132
+ ON agent_apps(root_path);
1133
+ CREATE INDEX idx_agent_apps_surface
1134
+ ON agent_apps(chat_id, surface_id, updated_at DESC);
1135
+ CREATE INDEX idx_agent_architecture_migrations_step
1136
+ ON agent_architecture_migrations(step_id, outcome);
1137
+ CREATE INDEX idx_agent_evolution_agent_status
1138
+ ON agent_evolution_proposals(agent_id, status, updated_at DESC);
1139
+ CREATE INDEX idx_agent_evolution_created
1140
+ ON agent_evolution_proposals(created_at DESC);
1141
+ CREATE INDEX idx_agent_evolution_receipts_agent
1142
+ ON agent_evolution_receipts(agent_id, created_at DESC);
1143
+ CREATE INDEX idx_agent_evolution_receipts_proposal
1144
+ ON agent_evolution_receipts(proposal_id, created_at ASC);
1145
+ CREATE INDEX idx_agent_mcp_agent ON agent_mcp_servers(agent_id);
1146
+ CREATE INDEX idx_agent_runtime_overrides_updated
1147
+ ON agent_runtime_overrides(updated_at DESC);
1148
+ CREATE INDEX idx_agent_surface_approvals_scope_active
1149
+ ON agent_surface_approvals(surface_id, scope_key, revoked_at, created_at DESC);
1150
+ CREATE INDEX idx_agent_surface_approvals_surface_created
1151
+ ON agent_surface_approvals(surface_id, created_at DESC);
1152
+ CREATE INDEX idx_agent_surface_asset_pack_ops_pack_created
1153
+ ON agent_surface_asset_pack_operations(pack_id, created_at DESC);
1154
+ CREATE INDEX idx_agent_surface_asset_packs_chat_updated
1155
+ ON agent_surface_asset_packs(chat_id, updated_at DESC);
1156
+ CREATE UNIQUE INDEX idx_agent_surface_asset_packs_root
1157
+ ON agent_surface_asset_packs(root_path);
1158
+ CREATE INDEX idx_agent_surface_asset_packs_surface_updated
1159
+ ON agent_surface_asset_packs(chat_id, surface_id, updated_at DESC);
1160
+ CREATE INDEX idx_agent_surface_events_chat_created
1161
+ ON agent_surface_events(chat_id, created_at DESC);
1162
+ CREATE INDEX idx_agent_surface_events_surface_created
1163
+ ON agent_surface_events(surface_id, created_at DESC);
1164
+ CREATE INDEX idx_agent_surface_jobs_chat_updated
1165
+ ON agent_surface_jobs(chat_id, updated_at DESC);
1166
+ CREATE INDEX idx_agent_surface_jobs_status_updated
1167
+ ON agent_surface_jobs(status, updated_at DESC);
1168
+ CREATE INDEX idx_agent_surface_jobs_surface_updated
1169
+ ON agent_surface_jobs(surface_id, updated_at DESC);
1170
+ CREATE INDEX idx_agent_surfaces_chat_updated
1171
+ ON agent_surfaces(chat_id, updated_at DESC);
1172
+ CREATE INDEX idx_agent_surfaces_domain_updated
1173
+ ON agent_surfaces(domain, updated_at DESC);
1174
+ CREATE INDEX idx_agent_surfaces_project_updated
1175
+ ON agent_surfaces(project_id, updated_at DESC);
1176
+ CREATE INDEX idx_agent_tool_ops_tool_created
1177
+ ON agent_tool_operations(tool_id, created_at DESC);
1178
+ CREATE INDEX idx_agent_tools_chat_updated
1179
+ ON agent_tools(chat_id, updated_at DESC);
1180
+ CREATE UNIQUE INDEX idx_agent_tools_root
1181
+ ON agent_tools(root_path);
1182
+ CREATE INDEX idx_agent_tools_surface
1183
+ ON agent_tools(chat_id, surface_id, requested_tool_id, updated_at DESC);
1184
+ CREATE INDEX idx_automation_graph_versions ON automation_graph_versions(automation_id, saved_at DESC);
1185
+ CREATE INDEX idx_automation_node_approvals_node ON automation_node_approvals(automation_id, node_id, decided_at);
1186
+ CREATE INDEX idx_automation_run_inputs_pending ON automation_run_inputs(automation_id, consumed_at, created_at);
1187
+ CREATE INDEX idx_automation_runs_auto
1188
+ ON automation_runs(automation_id, started_at);
1189
+ CREATE INDEX idx_automation_runs_occurrence
1190
+ ON automation_runs(automation_id, occurrence_id, started_at);
1191
+ CREATE INDEX idx_automation_sessions_owner
1192
+ ON automation_sessions(automation_id, updated_at DESC);
1269
1193
  CREATE INDEX idx_automation_trigger_events_automation
1270
1194
  ON automation_trigger_events(automation_id, status, created_at);
1195
+ CREATE INDEX idx_automation_trigger_events_due
1196
+ ON automation_trigger_events(status, next_attempt_at, created_at);
1271
1197
  CREATE INDEX idx_automation_trigger_events_run
1272
1198
  ON automation_trigger_events(run_id) WHERE run_id IS NOT NULL;
1273
- CREATE INDEX idx_run_events_chat_kind_ts
1274
- ON run_events(chat_id, kind, ts DESC);
1199
+ CREATE INDEX idx_automations_due ON automations(enabled, next_run_at);
1200
+ CREATE UNIQUE INDEX idx_borrowed_agent_careers_owner_memory
1201
+ ON borrowed_agent_careers(owner_scope_key, memory_key);
1202
+ CREATE INDEX idx_borrowed_agent_careers_owner_recent
1203
+ ON borrowed_agent_careers(owner_scope_key, last_used_at DESC);
1204
+ CREATE INDEX idx_browser_logs_ts ON browser_action_logs(ts DESC);
1205
+ CREATE UNIQUE INDEX idx_browser_perm_site_action
1206
+ ON browser_permissions(site, action_type);
1207
+ CREATE UNIQUE INDEX idx_browser_sessions_site ON browser_sessions(site);
1208
+ CREATE UNIQUE INDEX idx_chat_goal_contracts_active_chat
1209
+ ON chat_goal_contracts(chat_id)
1210
+ WHERE status = 'active';
1211
+ CREATE INDEX idx_chat_message_attachments_message
1212
+ ON chat_message_attachments(message_id, created_at, id);
1213
+ CREATE INDEX idx_chat_messages_chat_created
1214
+ ON chat_messages(chat_id, created_at);
1215
+ CREATE INDEX idx_chats_archived_updated ON chats(archived_at, updated_at DESC);
1216
+ CREATE INDEX idx_chats_firm_updated ON chats(firm_id, updated_at DESC);
1217
+ CREATE INDEX idx_chats_parent ON chats(parent_chat_id);
1218
+ CREATE INDEX idx_chats_project_updated
1219
+ ON chats(project_id, updated_at DESC);
1220
+ CREATE INDEX idx_chats_updated ON chats(updated_at DESC);
1221
+ CREATE INDEX idx_chats_used_updated ON chats(used_at, updated_at DESC);
1222
+ CREATE INDEX idx_experience_auto_intake_agent_status
1223
+ ON experience_auto_intake_receipts(agent_id, status, created_at DESC);
1224
+ CREATE INDEX idx_experience_auto_intake_run
1225
+ ON experience_auto_intake_receipts(agent_id, run_id)
1226
+ WHERE run_id IS NOT NULL;
1227
+ CREATE UNIQUE INDEX idx_experience_auto_pack_exact
1228
+ ON experience_packs(agent_id, project_scope_key, environment_key, base_package_hash)
1229
+ WHERE auto_managed = 1 AND status = 'active';
1230
+ CREATE INDEX idx_experience_candidates_pack
1231
+ ON experience_candidates(pack_id, created_at DESC);
1232
+ CREATE INDEX idx_experience_candidates_retrieval
1233
+ ON experience_candidates(agent_id, project_scope_key, environment_key, status, outcome_status, updated_at DESC);
1234
+ CREATE INDEX idx_experience_cloud_uploads_pack
1235
+ ON experience_cloud_uploads(pack_id, updated_at DESC);
1236
+ CREATE INDEX idx_experience_cloud_uploads_recovery
1237
+ ON experience_cloud_uploads(remote_status, updated_at ASC);
1238
+ CREATE UNIQUE INDEX idx_experience_cloud_uploads_remote
1239
+ ON experience_cloud_uploads(remote_upload_id)
1240
+ WHERE remote_upload_id IS NOT NULL;
1241
+ CREATE INDEX idx_experience_export_intents_pack
1242
+ ON experience_export_intents(pack_id, created_at DESC);
1243
+ CREATE INDEX idx_experience_governance_pack
1244
+ ON experience_governance_relations(pack_id, relation_type, created_at ASC);
1245
+ CREATE INDEX idx_experience_lineage_pack_created
1246
+ ON experience_lineage_events(pack_id, created_at ASC, id ASC);
1247
+ CREATE INDEX idx_experience_packs_agent_scope
1248
+ ON experience_packs(agent_id, project_scope_key, environment_key, updated_at DESC);
1275
1249
  CREATE INDEX idx_experience_packs_core_axis
1276
1250
  ON experience_packs(agent_id, project_scope_key, environment_key, base_core_hash);
1277
- CREATE TABLE judgment_verdicts (
1278
- kind TEXT NOT NULL,
1279
- signature TEXT NOT NULL,
1280
- verdict TEXT NOT NULL,
1281
- confidence REAL NOT NULL DEFAULT 0,
1282
- reason TEXT NOT NULL DEFAULT '',
1283
- created_at TEXT NOT NULL,
1284
- last_hit_at TEXT NOT NULL,
1285
- hits INTEGER NOT NULL DEFAULT 1,
1286
- PRIMARY KEY (kind, signature)
1287
- );
1251
+ CREATE INDEX idx_experience_public_projection_agent_status
1252
+ ON experience_public_projections(agent_id, status, updated_at DESC);
1253
+ CREATE INDEX idx_experience_public_projection_exact_base
1254
+ ON experience_public_projections(
1255
+ base_agent_definition_id, base_agent_release_id, base_package_hash, environment_key
1256
+ );
1257
+ CREATE INDEX idx_experience_receipts_pack
1258
+ ON experience_promotion_receipts(pack_id, created_at DESC);
1259
+ CREATE INDEX idx_experience_relation_edges_from
1260
+ ON experience_relation_edges(pack_id, from_node, edge_type);
1261
+ CREATE INDEX idx_experience_relation_edges_scope
1262
+ ON experience_relation_edges(project_scope_key, environment_key, base_package_hash, edge_type);
1263
+ CREATE INDEX idx_experience_relation_edges_to
1264
+ ON experience_relation_edges(pack_id, to_node, edge_type);
1265
+ CREATE INDEX idx_experience_relation_nodes_pack_type
1266
+ ON experience_relation_nodes(pack_id, node_type, normalized_value);
1267
+ CREATE INDEX idx_experience_relation_nodes_scope
1268
+ ON experience_relation_nodes(project_scope_key, environment_key, base_package_hash, node_type);
1269
+ CREATE INDEX idx_failure_events_agent_ts ON failure_events(agent_id, ts DESC);
1270
+ CREATE INDEX idx_failure_events_automation
1271
+ ON failure_events(automation_id, ts DESC);
1272
+ CREATE INDEX idx_failure_events_run
1273
+ ON failure_events(run_id, ts DESC);
1274
+ CREATE INDEX idx_failure_events_ts
1275
+ ON failure_events(ts DESC);
1276
+ CREATE INDEX idx_firms_installed ON firms(installed_at DESC);
1277
+ CREATE INDEX idx_graph_run_journal_run ON graph_run_journal(run_id, seq);
1278
+ CREATE INDEX idx_hub_agent_bookmarks_outbox
1279
+ ON hub_agent_bookmarks(workspace_id, sync_state, bookmarked_at ASC);
1280
+ CREATE INDEX idx_hub_agent_bookmarks_workspace_time
1281
+ ON hub_agent_bookmarks(workspace_id, bookmarked_at DESC);
1282
+ CREATE INDEX idx_installed_agent_hub_binding_exact
1283
+ ON installed_agent_hub_bindings(agent_definition_id, agent_release_id);
1284
+ CREATE INDEX idx_installed_agents_parent_team ON installed_agents(parent_team_id) WHERE parent_team_id IS NOT NULL;
1285
+ CREATE INDEX idx_installed_agents_visibility ON installed_agents(visibility, installed_at DESC);
1288
1286
  CREATE INDEX idx_judgment_verdicts_recency ON judgment_verdicts(last_hit_at);
1289
- CREATE TABLE activated_folder_identity (
1290
- path TEXT PRIMARY KEY,
1291
- identity_json TEXT NOT NULL,
1292
- captured_at TEXT NOT NULL
1293
- );
1294
- CREATE TABLE one_artifact_bindings (
1295
- id TEXT PRIMARY KEY,
1296
- task_id TEXT NOT NULL,
1297
- task_version INTEGER NOT NULL,
1298
- bound_task_version INTEGER NOT NULL,
1299
- chat_id TEXT NOT NULL,
1300
- run_id TEXT NOT NULL,
1301
- manifest_id TEXT NOT NULL,
1302
- artifact_ref TEXT NOT NULL,
1303
- source_path TEXT NOT NULL,
1304
- kind TEXT NOT NULL,
1305
- mime_type TEXT NOT NULL,
1306
- size_bytes INTEGER NOT NULL,
1307
- file_dev TEXT NOT NULL,
1308
- file_ino TEXT NOT NULL,
1309
- file_mtime_ns TEXT NOT NULL,
1310
- file_ctime_ns TEXT NOT NULL,
1311
- sha256 TEXT NOT NULL,
1312
- created_at TEXT NOT NULL,
1313
- UNIQUE(task_id, chat_id, run_id, manifest_id, artifact_ref)
1314
- );
1315
- CREATE INDEX idx_one_artifact_binding_exact
1316
- ON one_artifact_bindings(task_id, chat_id, run_id, manifest_id, artifact_ref);
1287
+ CREATE INDEX idx_memory_agent ON memory_entries(agent_id, superseded_at);
1288
+ CREATE INDEX idx_memory_chat ON memory_entries(chat_id);
1289
+ CREATE INDEX idx_memory_decisions_ticket_action
1290
+ ON memory_decisions(ticket_id, action, candidate_index);
1291
+ CREATE INDEX idx_memory_episodes_agent_created
1292
+ ON memory_episodes(agent_id, created_at DESC);
1293
+ CREATE INDEX idx_memory_episodes_project_created
1294
+ ON memory_episodes(project_id, created_at DESC);
1295
+ CREATE INDEX idx_memory_episodes_project_path_created
1296
+ ON memory_episodes(project_path_hash, created_at DESC);
1297
+ CREATE INDEX idx_memory_path ON memory_entries(project_path, superseded_at);
1298
+ CREATE INDEX idx_memory_relation_from
1299
+ ON memory_relation_edges(from_memory_id, relation_type, score DESC);
1300
+ CREATE INDEX idx_memory_relation_owner
1301
+ ON memory_relation_edges(owner_scope_key, relation_type, score DESC);
1302
+ CREATE INDEX idx_memory_relation_to
1303
+ ON memory_relation_edges(to_memory_id, relation_type, score DESC);
1304
+ CREATE INDEX idx_memory_scope ON memory_entries(scope, superseded_at);
1305
+ CREATE INDEX idx_memory_tickets_agent_created
1306
+ ON memory_tickets(agent_id, created_at DESC);
1307
+ CREATE INDEX idx_memory_tickets_project_created
1308
+ ON memory_tickets(project_id, created_at DESC);
1309
+ CREATE INDEX idx_memory_tickets_status_created
1310
+ ON memory_tickets(emitter_status, state, created_at DESC);
1311
+ CREATE INDEX idx_run_events_agent_kind_ts
1312
+ ON run_events(agent_id, kind, ts DESC);
1313
+ CREATE INDEX idx_run_events_agent_ts ON run_events(agent_id, ts DESC);
1314
+ CREATE INDEX idx_run_events_automation
1315
+ ON run_events(automation_id, ts DESC);
1316
+ CREATE INDEX idx_run_events_chat_kind_ts
1317
+ ON run_events(chat_id, kind, ts DESC);
1318
+ CREATE INDEX idx_run_events_run_seq
1319
+ ON run_events(run_id, seq);
1320
+ CREATE INDEX idx_run_events_ts
1321
+ ON run_events(ts DESC);
1322
+ CREATE INDEX idx_run_history_automation ON run_history(automation_id);
1323
+ CREATE INDEX idx_task_participants_agent ON task_agent_participants(agent_id);
1324
+ CREATE INDEX idx_tasks_firm_updated ON tasks(firm_id, updated_at DESC);
1325
+ CREATE INDEX idx_tasks_origin_chat ON tasks(origin_chat_id);
1326
+ CREATE INDEX idx_tasks_project_updated ON tasks(project_id, updated_at DESC);
1327
+ CREATE INDEX idx_tasks_updated ON tasks(updated_at DESC);
1328
+ CREATE INDEX idx_taste_chip_workflows_agent_status
1329
+ ON taste_chip_workflows(agent_id, status, updated_at DESC);
1330
+ CREATE INDEX idx_taste_drafts_agent_status
1331
+ ON taste_draft_candidates(agent_id, status, updated_at DESC);
1332
+ CREATE INDEX idx_taste_drafts_exact_base
1333
+ ON taste_draft_candidates(agent_id, base_package_hash, project_scope_key, environment_key);
1334
+ CREATE INDEX idx_telegram_bindings_automation_report
1335
+ ON telegram_bindings(automation_report_enabled, enabled, telegram_chat_id);
1336
+ CREATE INDEX idx_telegram_bindings_chat
1337
+ ON telegram_bindings(telegram_chat_id);
1338
+ CREATE INDEX idx_telegram_bindings_enabled
1339
+ ON telegram_bindings(enabled, status);
1340
+ CREATE UNIQUE INDEX idx_telegram_bindings_one_singleton
1341
+ ON telegram_bindings(target_kind) WHERE target_kind = 'one';
1342
+ CREATE INDEX idx_telegram_bindings_target
1343
+ ON telegram_bindings(target_kind, target_id);