agentlas 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,568 @@
1
+ -- Agentlas 첫 실행 부트스트랩 스키마 (생성: 2026-07-07T03:05:25Z)
2
+ -- 소스 DB user_version=45 — 앱이 나중에 설치되면 여기서부터 마이그레이션한다.
3
+ PRAGMA user_version=45;
4
+ CREATE TABLE active_runtime (
5
+ id INTEGER PRIMARY KEY CHECK(id = 1),
6
+ kind TEXT NOT NULL
7
+ , 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);
20
+ CREATE TABLE projects (
21
+ id TEXT PRIMARY KEY,
22
+ name TEXT NOT NULL,
23
+ description TEXT,
24
+ default_agent_id TEXT,
25
+ context_note TEXT,
26
+ created_at TEXT NOT NULL,
27
+ updated_at TEXT NOT NULL, folder_path TEXT,
28
+ FOREIGN KEY(default_agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
29
+ );
30
+ CREATE TABLE chats (
31
+ id TEXT PRIMARY KEY,
32
+ project_id TEXT,
33
+ agent_id TEXT NOT NULL,
34
+ title TEXT NOT NULL DEFAULT '새 채팅',
35
+ 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, agent_group_id TEXT REFERENCES agent_groups(id) ON DELETE SET NULL, continuous_mode INTEGER NOT NULL DEFAULT 0, swarm_mode INTEGER NOT NULL DEFAULT 0,
37
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
38
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
39
+ );
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 (
44
+ 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,
48
+ 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 CASCADE
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 (
68
+ 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
79
+ );
80
+ CREATE TABLE agent_mcp_servers (
81
+ agent_id TEXT NOT NULL,
82
+ server_id TEXT NOT NULL,
83
+ PRIMARY KEY (agent_id, server_id),
84
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
85
+ FOREIGN KEY(server_id) REFERENCES mcp_servers(id) ON DELETE CASCADE
86
+ );
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,
95
+ 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 '{}');
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
116
+ );
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, 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');
132
+ CREATE INDEX idx_automations_due ON automations(enabled, next_run_at);
133
+ CREATE TABLE agent_apps (
134
+ id TEXT PRIMARY KEY,
135
+ chat_id TEXT NOT NULL,
136
+ project_id TEXT,
137
+ agent_id TEXT NOT NULL,
138
+ surface_id TEXT NOT NULL,
139
+ 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',
150
+ created_at TEXT NOT NULL,
151
+ updated_at TEXT NOT NULL,
152
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
153
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL
154
+ );
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 (
162
+ id TEXT PRIMARY KEY,
163
+ app_id TEXT NOT NULL,
164
+ operation TEXT NOT NULL,
165
+ ok INTEGER NOT NULL DEFAULT 1,
166
+ result_json TEXT NOT NULL,
167
+ created_at TEXT NOT NULL,
168
+ FOREIGN KEY(app_id) REFERENCES agent_apps(id) ON DELETE CASCADE
169
+ );
170
+ CREATE INDEX idx_agent_app_ops_app_created
171
+ ON agent_app_operations(app_id, created_at DESC);
172
+ CREATE TABLE agent_tools (
173
+ id TEXT PRIMARY KEY,
174
+ chat_id TEXT NOT NULL,
175
+ project_id TEXT,
176
+ agent_id TEXT NOT NULL,
177
+ surface_id TEXT NOT NULL,
178
+ action_id TEXT,
179
+ requested_tool_id TEXT NOT NULL,
180
+ generated_tool_id TEXT NOT NULL,
181
+ tool_name TEXT NOT NULL,
182
+ domain TEXT NOT NULL,
183
+ kind TEXT NOT NULL,
184
+ 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,
189
+ result_json TEXT NOT NULL,
190
+ status TEXT NOT NULL DEFAULT 'scaffolded',
191
+ installed_server_id TEXT,
192
+ created_at TEXT NOT NULL,
193
+ updated_at TEXT NOT NULL,
194
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
195
+ 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
212
+ );
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 (
238
+ id TEXT PRIMARY KEY,
239
+ chat_id TEXT NOT NULL,
240
+ project_id TEXT,
241
+ agent_id TEXT NOT NULL,
242
+ 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',
254
+ created_at TEXT NOT NULL,
255
+ updated_at TEXT NOT NULL,
256
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
257
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
258
+ FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE
259
+ );
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
+ CREATE TABLE agent_surface_jobs (
278
+ id TEXT PRIMARY KEY,
279
+ chat_id TEXT NOT NULL,
280
+ project_id TEXT,
281
+ agent_id TEXT NOT NULL,
282
+ surface_id TEXT NOT NULL,
283
+ job_id TEXT NOT NULL,
284
+ label TEXT NOT NULL,
285
+ status TEXT NOT NULL,
286
+ cost_estimate REAL,
287
+ cost_spent REAL,
288
+ currency TEXT,
289
+ resumable INTEGER NOT NULL DEFAULT 0,
290
+ manifest_job_json TEXT NOT NULL,
291
+ created_at TEXT NOT NULL,
292
+ updated_at TEXT NOT NULL,
293
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
294
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
295
+ FOREIGN KEY(surface_id) REFERENCES agent_surfaces(id) ON DELETE CASCADE,
296
+ UNIQUE(surface_id, job_id)
297
+ );
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 (
305
+ id TEXT PRIMARY KEY,
306
+ chat_id TEXT NOT NULL,
307
+ project_id TEXT,
308
+ 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,
316
+ created_at TEXT NOT NULL,
317
+ 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
320
+ );
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 (
327
+ id TEXT PRIMARY KEY,
328
+ chat_id TEXT NOT NULL,
329
+ project_id TEXT,
330
+ agent_id TEXT NOT NULL,
331
+ surface_id TEXT NOT NULL,
332
+ action_id TEXT,
333
+ action_type TEXT NOT NULL,
334
+ 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,
340
+ created_at TEXT NOT NULL,
341
+ FOREIGN KEY(chat_id) REFERENCES chats(id) ON DELETE CASCADE,
342
+ 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
357
+ );
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,
362
+ 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)
370
+ );
371
+ CREATE INDEX idx_agent_runtime_overrides_updated
372
+ ON agent_runtime_overrides(updated_at DESC);
373
+ CREATE TABLE persona_loop_runs (
374
+ id TEXT PRIMARY KEY,
375
+ automation_id TEXT NOT NULL,
376
+ target_type TEXT NOT NULL CHECK(target_type IN ('agent','firm')),
377
+ target_id TEXT NOT NULL,
378
+ target_label TEXT NOT NULL,
379
+ persona_label TEXT NOT NULL,
380
+ cadence TEXT NOT NULL,
381
+ status TEXT NOT NULL,
382
+ current_step TEXT NOT NULL,
383
+ started_at TEXT NOT NULL,
384
+ updated_at TEXT NOT NULL,
385
+ ends_at TEXT NOT NULL,
386
+ transcript_json TEXT NOT NULL,
387
+ FOREIGN KEY(automation_id) REFERENCES automations(id) ON DELETE CASCADE
388
+ );
389
+ CREATE INDEX idx_persona_loop_runs_updated
390
+ ON persona_loop_runs(updated_at DESC);
391
+ CREATE INDEX idx_persona_loop_runs_automation
392
+ ON persona_loop_runs(automation_id);
393
+ CREATE INDEX idx_chats_used_updated ON chats(used_at, updated_at DESC);
394
+ CREATE TABLE agent_groups (
395
+ id TEXT PRIMARY KEY,
396
+ name TEXT NOT NULL,
397
+ description TEXT NOT NULL DEFAULT '',
398
+ orchestrator_name TEXT NOT NULL,
399
+ members_json TEXT NOT NULL DEFAULT '[]',
400
+ created_at TEXT NOT NULL,
401
+ updated_at TEXT NOT NULL
402
+ );
403
+ CREATE INDEX idx_agent_groups_updated
404
+ ON agent_groups(updated_at DESC);
405
+ CREATE INDEX idx_chats_agent_group_updated ON chats(agent_group_id, updated_at DESC);
406
+ CREATE TABLE run_history (
407
+ id TEXT PRIMARY KEY,
408
+ automation_id TEXT,
409
+ scheduled_for TEXT,
410
+ ran_at TEXT,
411
+ status TEXT,
412
+ skipped_count INTEGER DEFAULT 0,
413
+ error TEXT
414
+ );
415
+ CREATE INDEX idx_run_history_automation ON run_history(automation_id);
416
+ CREATE TABLE automation_runs (
417
+ id TEXT PRIMARY KEY,
418
+ automation_id TEXT,
419
+ started_at TEXT,
420
+ status TEXT,
421
+ node_states_json TEXT
422
+ );
423
+ CREATE INDEX idx_automation_runs_auto
424
+ ON automation_runs(automation_id, started_at);
425
+ CREATE TRIGGER agentlas_auto_cua_social_insert
426
+ AFTER INSERT ON automations
427
+ WHEN NEW.tool_mode = 'auto' AND (
428
+ lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%reddit%'
429
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%instagram%'
430
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%threads%'
431
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%twitter%'
432
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%x.com%'
433
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%linkedin%'
434
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%facebook%'
435
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%tiktok%'
436
+ OR (lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%browser%' AND lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%post%')
437
+ OR (lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%web%' AND lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%login%')
438
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%레딧%'
439
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%인스타%'
440
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%댓글%'
441
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%게시%'
442
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%로그인%'
443
+ )
444
+ BEGIN
445
+ UPDATE automations SET tool_mode = 'computer-use' WHERE id = NEW.id;
446
+ END;
447
+ CREATE TRIGGER agentlas_auto_cua_social_update
448
+ AFTER UPDATE OF name, prompt_template, tool_mode ON automations
449
+ WHEN NEW.tool_mode = 'auto' AND (
450
+ lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%reddit%'
451
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%instagram%'
452
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%threads%'
453
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%twitter%'
454
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%x.com%'
455
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%linkedin%'
456
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%facebook%'
457
+ OR lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%tiktok%'
458
+ OR (lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%browser%' AND lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%post%')
459
+ OR (lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%web%' AND lower(coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'')) LIKE '%login%')
460
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%레딧%'
461
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%인스타%'
462
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%댓글%'
463
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%게시%'
464
+ OR coalesce(NEW.name,'') || ' ' || coalesce(NEW.prompt_template,'') LIKE '%로그인%'
465
+ )
466
+ BEGIN
467
+ UPDATE automations SET tool_mode = 'computer-use' WHERE id = NEW.id;
468
+ END;
469
+ CREATE TABLE agent_evolution_proposals (
470
+ id TEXT PRIMARY KEY,
471
+ agent_id TEXT NOT NULL,
472
+ proposal_type TEXT NOT NULL,
473
+ summary TEXT NOT NULL,
474
+ target_path TEXT NOT NULL,
475
+ before_hash TEXT NOT NULL,
476
+ after_hash TEXT NOT NULL,
477
+ before_content TEXT NOT NULL,
478
+ after_content TEXT NOT NULL,
479
+ risk TEXT NOT NULL,
480
+ status TEXT NOT NULL,
481
+ source_json TEXT NOT NULL DEFAULT '{}',
482
+ decision_note TEXT,
483
+ last_error TEXT,
484
+ created_at TEXT NOT NULL,
485
+ updated_at TEXT NOT NULL,
486
+ approved_at TEXT,
487
+ applied_at TEXT,
488
+ measured_at TEXT,
489
+ rolled_back_at TEXT
490
+ );
491
+ CREATE INDEX idx_agent_evolution_agent_status
492
+ ON agent_evolution_proposals(agent_id, status, updated_at DESC);
493
+ CREATE INDEX idx_agent_evolution_created
494
+ ON agent_evolution_proposals(created_at DESC);
495
+ CREATE TABLE run_events (
496
+ id TEXT PRIMARY KEY,
497
+ run_id TEXT NOT NULL,
498
+ seq INTEGER NOT NULL,
499
+ ts TEXT NOT NULL,
500
+ kind TEXT NOT NULL,
501
+ chat_id TEXT,
502
+ automation_id TEXT,
503
+ node_id TEXT,
504
+ agent_id TEXT,
505
+ payload_json TEXT NOT NULL DEFAULT '{}',
506
+ UNIQUE(run_id, seq)
507
+ );
508
+ CREATE INDEX idx_run_events_run_seq
509
+ ON run_events(run_id, seq);
510
+ CREATE INDEX idx_run_events_ts
511
+ ON run_events(ts DESC);
512
+ CREATE INDEX idx_run_events_automation
513
+ ON run_events(automation_id, ts DESC);
514
+ CREATE TABLE failure_events (
515
+ id TEXT PRIMARY KEY,
516
+ run_id TEXT,
517
+ ts TEXT NOT NULL,
518
+ source TEXT NOT NULL,
519
+ chat_id TEXT,
520
+ automation_id TEXT,
521
+ node_id TEXT,
522
+ agent_id TEXT,
523
+ error_code TEXT,
524
+ error_message TEXT NOT NULL,
525
+ payload_json TEXT NOT NULL DEFAULT '{}'
526
+ );
527
+ CREATE INDEX idx_failure_events_ts
528
+ ON failure_events(ts DESC);
529
+ CREATE INDEX idx_failure_events_run
530
+ ON failure_events(run_id, ts DESC);
531
+ CREATE INDEX idx_failure_events_automation
532
+ ON failure_events(automation_id, ts DESC);
533
+ CREATE TABLE telegram_bindings (
534
+ id TEXT PRIMARY KEY,
535
+ target_kind TEXT NOT NULL CHECK(target_kind IN ('agent','firm','group')),
536
+ target_id TEXT NOT NULL,
537
+ telegram_chat_id TEXT,
538
+ telegram_chat_title TEXT,
539
+ bot_user_id INTEGER,
540
+ bot_username TEXT,
541
+ bot_display_name TEXT,
542
+ chat_session_id TEXT REFERENCES chats(id) ON DELETE SET NULL,
543
+ status TEXT NOT NULL,
544
+ enabled INTEGER NOT NULL DEFAULT 0,
545
+ last_update_id INTEGER NOT NULL DEFAULT 0,
546
+ last_error TEXT,
547
+ last_test_at TEXT,
548
+ created_at TEXT NOT NULL,
549
+ updated_at TEXT NOT NULL
550
+ , automation_report_enabled INTEGER NOT NULL DEFAULT 0, token_saved INTEGER NOT NULL DEFAULT 0, token_fingerprint TEXT);
551
+ CREATE INDEX idx_telegram_bindings_target
552
+ ON telegram_bindings(target_kind, target_id);
553
+ CREATE INDEX idx_telegram_bindings_chat
554
+ ON telegram_bindings(telegram_chat_id);
555
+ CREATE INDEX idx_telegram_bindings_enabled
556
+ ON telegram_bindings(enabled, status);
557
+ CREATE TABLE hub_agent_bookmarks (
558
+ slug TEXT PRIMARY KEY,
559
+ entity_kind TEXT NOT NULL DEFAULT 'agent',
560
+ listing_json TEXT NOT NULL,
561
+ bookmarked_at TEXT NOT NULL
562
+ );
563
+ CREATE INDEX idx_hub_agent_bookmarks_time
564
+ ON hub_agent_bookmarks(bookmarked_at DESC);
565
+ CREATE INDEX idx_hub_agent_bookmarks_kind
566
+ ON hub_agent_bookmarks(entity_kind, bookmarked_at DESC);
567
+ CREATE INDEX idx_telegram_bindings_automation_report
568
+ ON telegram_bindings(automation_report_enabled, enabled, telegram_chat_id);
package/install.ps1 ADDED
@@ -0,0 +1,26 @@
1
+ # agentlas 터미널 CLI 설치 (Windows, 미검증 — best effort).
2
+ #
3
+ # powershell -ExecutionPolicy Bypass -File install.ps1
4
+ #
5
+ # %LOCALAPPDATA%\Agentlas\bin\agentlas.cmd 를 만들고 PATH 안내를 출력한다.
6
+ $ErrorActionPreference = "Stop"
7
+
8
+ $pkgRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
9
+ $launcher = Join-Path $pkgRoot "bin\agentlas.cjs"
10
+ if (-not (Test-Path $launcher)) { throw "런처를 찾을 수 없습니다: $launcher" }
11
+
12
+ $node = Get-Command node -ErrorAction SilentlyContinue
13
+ if (-not $node) { throw "node 가 필요합니다 (https://nodejs.org)" }
14
+
15
+ $dir = Join-Path $env:LOCALAPPDATA "Agentlas\bin"
16
+ New-Item -ItemType Directory -Force -Path $dir | Out-Null
17
+ $target = Join-Path $dir "agentlas.cmd"
18
+ # .cmd 셸림: PowerShell 실행 정책과 무관하게 동작한다.
19
+ "@echo off`r`nnode `"$launcher`" %*`r`n" | Set-Content -Path $target -Encoding ASCII
20
+
21
+ Write-Host "설치됨: $target"
22
+ $onPath = ($env:Path -split ";") -contains $dir
23
+ if (-not $onPath) {
24
+ Write-Host "PATH에 $dir 를 추가하세요 (시스템 설정 → 환경 변수)."
25
+ }
26
+ & $target --where
package/install.sh ADDED
@@ -0,0 +1,53 @@
1
+ #!/bin/sh
2
+ # agentlas 터미널 CLI 설치 스크립트 (macOS/Linux).
3
+ #
4
+ # sh install.sh # ~/.local/bin/agentlas 에 심링크 (sudo 불필요)
5
+ # sh install.sh --prefix /usr/local/bin
6
+ #
7
+ # 제거: rm <prefix>/agentlas
8
+ set -eu
9
+
10
+ PREFIX="$HOME/.local/bin"
11
+ while [ $# -gt 0 ]; do
12
+ case "$1" in
13
+ --prefix) PREFIX="$2"; shift 2 ;;
14
+ -h|--help)
15
+ echo "usage: sh install.sh [--prefix DIR] (default: ~/.local/bin)"
16
+ exit 0 ;;
17
+ *) echo "unknown option: $1" >&2; exit 1 ;;
18
+ esac
19
+ done
20
+
21
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
22
+ LAUNCHER="$SCRIPT_DIR/bin/agentlas.cjs"
23
+ TARGET="$PREFIX/agentlas"
24
+
25
+ if [ ! -f "$LAUNCHER" ]; then
26
+ echo "런처를 찾을 수 없습니다: $LAUNCHER" >&2
27
+ exit 1
28
+ fi
29
+
30
+ command -v node >/dev/null 2>&1 || {
31
+ echo "node 가 필요합니다 (런처 실행용). https://nodejs.org" >&2
32
+ exit 1
33
+ }
34
+
35
+ mkdir -p "$PREFIX"
36
+ chmod +x "$LAUNCHER"
37
+ ln -sf "$LAUNCHER" "$TARGET"
38
+ echo "설치됨: $TARGET -> $LAUNCHER"
39
+
40
+ case ":$PATH:" in
41
+ *":$PREFIX:"*) ;;
42
+ *)
43
+ echo ""
44
+ echo "PATH에 $PREFIX 가 없습니다. 셸 rc에 추가하세요:"
45
+ echo " export PATH=\"$PREFIX:\$PATH\""
46
+ ;;
47
+ esac
48
+
49
+ echo ""
50
+ echo "확인:"
51
+ "$TARGET" --where || true
52
+ echo ""
53
+ echo "사용: agentlas | agentlas list | agentlas run <agent> \"프롬프트\" | agentlas doctor"