agentlas 1.0.12 → 1.0.15

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 (54) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +4 -2
  3. package/bin/agentlas.cjs +17 -3
  4. package/engine/agentlas-cloud-runtime.cjs +8 -2
  5. package/engine/agentlas-config.cjs +25 -18
  6. package/engine/agentlas-core-harness.cjs +14 -1
  7. package/engine/agentlas-i18n.cjs +2 -0
  8. package/engine/agentlas-input.cjs +1 -1
  9. package/engine/agentlas-memory-governance.cjs +10 -0
  10. package/engine/agentlas-onboard.cjs +22 -5
  11. package/engine/agentlas-sqlite-policy.cjs +18 -7
  12. package/engine/agentlas-workforce.cjs +136 -19
  13. package/engine/agentlas-workload-routing.cjs +32 -4
  14. package/engine/agentlas.cjs +8 -0
  15. package/engine/automation/daemon.cjs +67 -30
  16. package/engine/automation/schedule.cjs +16 -0
  17. package/engine/automation/store.cjs +70 -12
  18. package/engine/bootstrap-schema.sql +788 -53
  19. package/engine/cloud-assets/cas.cjs +7 -2
  20. package/engine/cloud-assets/commands.cjs +2 -0
  21. package/engine/cloud-assets/package.cjs +49 -1
  22. package/engine/cloud-assets/state.cjs +35 -0
  23. package/engine/commands/automation.cjs +8 -0
  24. package/engine/commands/chats.cjs +6 -1
  25. package/engine/commands/firm.cjs +7 -0
  26. package/engine/commands/help.cjs +23 -2
  27. package/engine/commands/hep-cloud.cjs +31 -0
  28. package/engine/commands/hep-hub.cjs +30 -0
  29. package/engine/commands/hep-local.cjs +32 -0
  30. package/engine/commands/hep-network.cjs +43 -0
  31. package/engine/commands/index.cjs +38 -7
  32. package/engine/commands/open.cjs +5 -1
  33. package/engine/commands/run.cjs +12 -2
  34. package/engine/commands/setup.cjs +12 -11
  35. package/engine/commands/storm.cjs +5 -9
  36. package/engine/commands/swarm.cjs +4 -4
  37. package/engine/commands/uninstall.cjs +36 -2
  38. package/engine/commands/version.cjs +29 -0
  39. package/engine/commands/workforce.cjs +10 -10
  40. package/engine/core/schema-ensure.cjs +75 -0
  41. package/engine/experience/variant.cjs +46 -2
  42. package/engine/hephaestus/runtime.cjs +7 -0
  43. package/engine/memory-cli/curate.cjs +3 -7
  44. package/engine/project/memory-context.cjs +3 -7
  45. package/engine/project/state.cjs +7 -6
  46. package/engine/sessions/orchestrator.cjs +41 -3
  47. package/engine/sessions/prompt.cjs +4 -7
  48. package/engine/sessions/session.cjs +32 -0
  49. package/engine/storm/swarm.cjs +12 -0
  50. package/engine/ui/palette.cjs +14 -2
  51. package/engine/ui/renderer.cjs +37 -0
  52. package/engine/ui/repl.cjs +7 -1
  53. package/engine/workforce/concurrency.cjs +41 -0
  54. package/package.json +1 -1
@@ -1,34 +1,10 @@
1
- -- Agentlas 첫 실행 부트스트랩 스키마 (생성: 2026-07-07T03:05:25Z)
2
- -- 소스 DB user_version=45 — 앱이 나중에 설치되면 여기서부터 마이그레이션한다.
3
- PRAGMA user_version=45;
1
+ -- Agentlas 첫 실행 부트스트랩 스키마 (생성: 2026-07-28T08:31:20Z)
2
+ -- 소스 DB user_version=81 — 앱이 나중에 설치되면 여기서부터 마이그레이션한다.
3
+ PRAGMA user_version=81;
4
4
  CREATE TABLE active_runtime (
5
5
  id INTEGER PRIMARY KEY CHECK(id = 1),
6
6
  kind TEXT NOT NULL
7
7
  , backend TEXT, source TEXT, model TEXT, long_context INTEGER NOT NULL DEFAULT 0);
8
- CREATE TABLE model_roles (
9
- role TEXT PRIMARY KEY CHECK(role IN ('orchestrator','worker')),
10
- kind TEXT NOT NULL,
11
- backend TEXT,
12
- source TEXT,
13
- model TEXT,
14
- effort TEXT,
15
- long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
16
- inherit INTEGER NOT NULL DEFAULT 0 CHECK(inherit IN (0,1)),
17
- updated_at TEXT NOT NULL,
18
- CHECK(role = 'worker' OR inherit = 0)
19
- );
20
- CREATE TABLE model_role_members (
21
- role TEXT NOT NULL CHECK(role IN ('orchestrator','worker')),
22
- position INTEGER NOT NULL CHECK(position >= 1),
23
- kind TEXT NOT NULL,
24
- backend TEXT,
25
- source TEXT,
26
- model TEXT,
27
- effort TEXT,
28
- long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
29
- updated_at TEXT NOT NULL,
30
- PRIMARY KEY(role, position)
31
- );
32
8
  CREATE TABLE installed_agents (
33
9
  id TEXT PRIMARY KEY,
34
10
  slug TEXT UNIQUE NOT NULL,
@@ -40,7 +16,7 @@ CREATE TABLE installed_agents (
40
16
  trust_grade TEXT NOT NULL,
41
17
  installed_at TEXT NOT NULL,
42
18
  tone TEXT NOT NULL
43
- , 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);
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);
44
20
  CREATE TABLE projects (
45
21
  id TEXT PRIMARY KEY,
46
22
  name TEXT NOT NULL,
@@ -55,9 +31,9 @@ CREATE TABLE chats (
55
31
  id TEXT PRIMARY KEY,
56
32
  project_id TEXT,
57
33
  agent_id TEXT NOT NULL,
58
- title TEXT NOT NULL DEFAULT 'New chat',
34
+ title TEXT NOT NULL DEFAULT ' 채팅',
59
35
  created_at TEXT NOT NULL,
60
- 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,
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, last_viewed_at TEXT, hired_agents TEXT, origin_surface TEXT NOT NULL DEFAULT 'work', runtime_selection_json TEXT,
61
37
  FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
62
38
  FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
63
39
  );
@@ -74,18 +50,6 @@ CREATE TABLE chat_messages (
74
50
  );
75
51
  CREATE INDEX idx_chat_messages_chat_created
76
52
  ON chat_messages(chat_id, created_at);
77
- CREATE TABLE firms (
78
- id TEXT PRIMARY KEY,
79
- slug TEXT UNIQUE NOT NULL,
80
- name TEXT NOT NULL,
81
- tagline TEXT NOT NULL,
82
- persona TEXT NOT NULL,
83
- ceo_agent_id TEXT NOT NULL,
84
- org_chart_json TEXT NOT NULL,
85
- installed_at TEXT NOT NULL, name_en TEXT NOT NULL DEFAULT '', tagline_en TEXT NOT NULL DEFAULT '',
86
- FOREIGN KEY(ceo_agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
87
- );
88
- CREATE INDEX idx_firms_installed ON firms(installed_at DESC);
89
53
  CREATE INDEX idx_chats_firm_updated ON chats(firm_id, updated_at DESC);
90
54
  CREATE INDEX idx_chats_archived_updated ON chats(archived_at, updated_at DESC);
91
55
  CREATE TABLE mcp_servers (
@@ -127,7 +91,7 @@ CREATE TABLE memory_entries (
127
91
  evidence_json TEXT NOT NULL DEFAULT '[]',
128
92
  superseded_at TEXT,
129
93
  created_at TEXT NOT NULL
130
- , context_json TEXT NOT NULL DEFAULT '{}');
94
+ , 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);
131
95
  CREATE INDEX idx_memory_path ON memory_entries(project_path, superseded_at);
132
96
  CREATE INDEX idx_memory_scope ON memory_entries(scope, superseded_at);
133
97
  CREATE INDEX idx_memory_chat ON memory_entries(chat_id);
@@ -152,7 +116,7 @@ CREATE TABLE automations (
152
116
  last_run_at TEXT,
153
117
  next_run_at TEXT,
154
118
  created_at TEXT NOT NULL
155
- , 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');
119
+ , 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', execution_permission TEXT NOT NULL DEFAULT 'write' CHECK(execution_permission IN ('read','write')), target_version TEXT, runtime_selection_json TEXT);
156
120
  CREATE INDEX idx_automations_due ON automations(enabled, next_run_at);
157
121
  CREATE TABLE agent_apps (
158
122
  id TEXT PRIMARY KEY,
@@ -443,7 +407,7 @@ CREATE TABLE automation_runs (
443
407
  started_at TEXT,
444
408
  status TEXT,
445
409
  node_states_json TEXT
446
- );
410
+ , last_activity_at TEXT, occurrence_id TEXT, graph_digest TEXT, checkpoint_json TEXT, resume_of_run_id TEXT);
447
411
  CREATE INDEX idx_automation_runs_auto
448
412
  ON automation_runs(automation_id, started_at);
449
413
  CREATE TRIGGER agentlas_auto_cua_social_insert
@@ -511,7 +475,7 @@ CREATE TABLE agent_evolution_proposals (
511
475
  applied_at TEXT,
512
476
  measured_at TEXT,
513
477
  rolled_back_at TEXT
514
- );
478
+ , operation_json TEXT);
515
479
  CREATE INDEX idx_agent_evolution_agent_status
516
480
  ON agent_evolution_proposals(agent_id, status, updated_at DESC);
517
481
  CREATE INDEX idx_agent_evolution_created
@@ -578,15 +542,786 @@ CREATE INDEX idx_telegram_bindings_chat
578
542
  ON telegram_bindings(telegram_chat_id);
579
543
  CREATE INDEX idx_telegram_bindings_enabled
580
544
  ON telegram_bindings(enabled, status);
581
- CREATE TABLE hub_agent_bookmarks (
582
- slug TEXT PRIMARY KEY,
583
- entity_kind TEXT NOT NULL DEFAULT 'agent',
584
- listing_json TEXT NOT NULL,
585
- bookmarked_at TEXT NOT NULL
545
+ CREATE INDEX idx_telegram_bindings_automation_report
546
+ ON telegram_bindings(automation_report_enabled, enabled, telegram_chat_id);
547
+ CREATE TABLE browser_sites (
548
+ id TEXT PRIMARY KEY,
549
+ site TEXT NOT NULL UNIQUE,
550
+ label TEXT,
551
+ username TEXT,
552
+ has_password INTEGER NOT NULL DEFAULT 0,
553
+ created_at TEXT NOT NULL,
554
+ updated_at TEXT NOT NULL
555
+ );
556
+ CREATE TABLE browser_sessions (
557
+ id TEXT PRIMARY KEY,
558
+ site TEXT NOT NULL,
559
+ status TEXT NOT NULL DEFAULT 'none',
560
+ captured_at TEXT,
561
+ note TEXT,
562
+ FOREIGN KEY(site) REFERENCES browser_sites(site) ON DELETE CASCADE
563
+ );
564
+ CREATE UNIQUE INDEX idx_browser_sessions_site ON browser_sessions(site);
565
+ CREATE TABLE browser_permissions (
566
+ id TEXT PRIMARY KEY,
567
+ site TEXT NOT NULL,
568
+ action_type TEXT NOT NULL,
569
+ decision TEXT NOT NULL,
570
+ created_at TEXT NOT NULL
571
+ );
572
+ CREATE UNIQUE INDEX idx_browser_perm_site_action
573
+ ON browser_permissions(site, action_type);
574
+ CREATE TABLE browser_action_logs (
575
+ id TEXT PRIMARY KEY,
576
+ ts TEXT NOT NULL,
577
+ site TEXT,
578
+ action TEXT NOT NULL,
579
+ target TEXT,
580
+ result TEXT,
581
+ approval TEXT,
582
+ meta TEXT
583
+ );
584
+ CREATE INDEX idx_browser_logs_ts ON browser_action_logs(ts DESC);
585
+ CREATE TABLE IF NOT EXISTS "firms" (
586
+ id TEXT PRIMARY KEY,
587
+ slug TEXT UNIQUE NOT NULL,
588
+ name TEXT NOT NULL,
589
+ name_en TEXT NOT NULL DEFAULT '',
590
+ tagline TEXT NOT NULL,
591
+ tagline_en TEXT NOT NULL DEFAULT '',
592
+ persona TEXT NOT NULL,
593
+ ceo_agent_id TEXT NOT NULL,
594
+ org_chart_json TEXT NOT NULL,
595
+ installed_at TEXT NOT NULL,
596
+ FOREIGN KEY(ceo_agent_id) REFERENCES installed_agents(id) ON DELETE RESTRICT
597
+ );
598
+ CREATE INDEX idx_firms_installed ON firms(installed_at DESC);
599
+ CREATE TABLE agent_asset_versions (
600
+ agent_id TEXT PRIMARY KEY,
601
+ version INTEGER NOT NULL,
602
+ package_hash TEXT NOT NULL,
603
+ updated_at TEXT NOT NULL,
604
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
605
+ );
606
+ CREATE TABLE agent_evolution_receipts (
607
+ id TEXT PRIMARY KEY,
608
+ proposal_id TEXT NOT NULL,
609
+ agent_id TEXT NOT NULL,
610
+ action TEXT NOT NULL,
611
+ target_path TEXT NOT NULL,
612
+ version_before INTEGER NOT NULL,
613
+ version_after INTEGER NOT NULL,
614
+ target_hash_before TEXT NOT NULL,
615
+ target_hash_after TEXT NOT NULL,
616
+ package_hash_before TEXT NOT NULL,
617
+ package_hash_after TEXT NOT NULL,
618
+ created_at TEXT NOT NULL,
619
+ FOREIGN KEY(proposal_id) REFERENCES agent_evolution_proposals(id) ON DELETE CASCADE,
620
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
621
+ UNIQUE(proposal_id, action)
586
622
  );
623
+ CREATE INDEX idx_agent_evolution_receipts_agent
624
+ ON agent_evolution_receipts(agent_id, created_at DESC);
625
+ CREATE INDEX idx_agent_evolution_receipts_proposal
626
+ ON agent_evolution_receipts(proposal_id, created_at ASC);
627
+ CREATE TABLE hub_agent_bookmarks (
628
+ workspace_id TEXT NOT NULL,
629
+ slug TEXT NOT NULL,
630
+ entity_kind TEXT NOT NULL DEFAULT 'agent',
631
+ listing_json TEXT NOT NULL,
632
+ bookmarked_at TEXT NOT NULL,
633
+ server_updated_at TEXT,
634
+ sync_state TEXT NOT NULL DEFAULT 'clean'
635
+ CHECK(sync_state IN ('clean','pending_upsert','pending_delete')),
636
+ last_sync_error TEXT,
637
+ claim_workspace_id TEXT,
638
+ PRIMARY KEY(workspace_id, entity_kind, slug)
639
+ );
640
+ CREATE INDEX idx_hub_agent_bookmarks_workspace_time
641
+ ON hub_agent_bookmarks(workspace_id, bookmarked_at DESC);
642
+ CREATE INDEX idx_hub_agent_bookmarks_outbox
643
+ ON hub_agent_bookmarks(workspace_id, sync_state, bookmarked_at ASC);
587
644
  CREATE INDEX idx_hub_agent_bookmarks_time
588
645
  ON hub_agent_bookmarks(bookmarked_at DESC);
589
646
  CREATE INDEX idx_hub_agent_bookmarks_kind
590
647
  ON hub_agent_bookmarks(entity_kind, bookmarked_at DESC);
591
- CREATE INDEX idx_telegram_bindings_automation_report
592
- ON telegram_bindings(automation_report_enabled, enabled, telegram_chat_id);
648
+ CREATE TABLE experience_packs (
649
+ id TEXT PRIMARY KEY,
650
+ agent_id TEXT NOT NULL,
651
+ project_id TEXT,
652
+ project_path TEXT,
653
+ project_scope_key TEXT NOT NULL,
654
+ environment_key TEXT NOT NULL,
655
+ name TEXT NOT NULL,
656
+ description TEXT NOT NULL DEFAULT '',
657
+ base_package_hash TEXT,
658
+ status TEXT NOT NULL DEFAULT 'active'
659
+ CHECK(status IN ('active','archived')),
660
+ created_at TEXT NOT NULL,
661
+ 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)),
662
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
663
+ );
664
+ CREATE INDEX idx_experience_packs_agent_scope
665
+ ON experience_packs(agent_id, project_scope_key, environment_key, updated_at DESC);
666
+ CREATE TABLE experience_candidates (
667
+ id TEXT PRIMARY KEY,
668
+ pack_id TEXT NOT NULL,
669
+ agent_id TEXT NOT NULL,
670
+ project_scope_key TEXT NOT NULL,
671
+ environment_key TEXT NOT NULL,
672
+ source_memory_id TEXT NOT NULL,
673
+ summary TEXT NOT NULL,
674
+ task_terms_json TEXT NOT NULL DEFAULT '[]',
675
+ sensitivity TEXT NOT NULL
676
+ CHECK(sensitivity IN ('public','internal','private')),
677
+ confidence TEXT NOT NULL
678
+ CHECK(confidence IN ('high','medium','low')),
679
+ status TEXT NOT NULL DEFAULT 'candidate'
680
+ CHECK(status IN ('candidate','promoted','rejected')),
681
+ outcome_status TEXT NOT NULL DEFAULT 'unverified'
682
+ CHECK(outcome_status IN ('unverified','attested','verified','failed')),
683
+ public_safe INTEGER NOT NULL DEFAULT 0 CHECK(public_safe IN (0,1)),
684
+ created_at TEXT NOT NULL,
685
+ updated_at TEXT NOT NULL,
686
+ promoted_at TEXT, auto_managed INTEGER NOT NULL DEFAULT 0 CHECK(auto_managed IN (0,1)), embedding_model TEXT, embedding_adapter TEXT, embedding_model_sha256 TEXT, embedding_content_hash TEXT, embedding_dimensions INTEGER, embedding_json TEXT,
687
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
688
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
689
+ UNIQUE(pack_id, source_memory_id)
690
+ );
691
+ CREATE INDEX idx_experience_candidates_retrieval
692
+ ON experience_candidates(agent_id, project_scope_key, environment_key, status, outcome_status, updated_at DESC);
693
+ CREATE INDEX idx_experience_candidates_pack
694
+ ON experience_candidates(pack_id, created_at DESC);
695
+ CREATE TABLE experience_promotion_receipts (
696
+ id TEXT PRIMARY KEY,
697
+ pack_id TEXT NOT NULL,
698
+ candidate_id TEXT NOT NULL,
699
+ agent_id TEXT NOT NULL,
700
+ action TEXT NOT NULL CHECK(action = 'promote'),
701
+ explicit_consent INTEGER NOT NULL CHECK(explicit_consent = 1),
702
+ verification_status TEXT NOT NULL CHECK(verification_status IN ('attested','verified')),
703
+ verification_method TEXT NOT NULL
704
+ CHECK(verification_method IN ('user-attested','local-run-receipt','local-test-receipt')),
705
+ evidence_hash TEXT NOT NULL,
706
+ public_safe INTEGER NOT NULL CHECK(public_safe IN (0,1)),
707
+ created_at TEXT NOT NULL,
708
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
709
+ FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
710
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
711
+ UNIQUE(candidate_id, action)
712
+ );
713
+ CREATE INDEX idx_experience_receipts_pack
714
+ ON experience_promotion_receipts(pack_id, created_at DESC);
715
+ CREATE TABLE experience_export_intents (
716
+ id TEXT PRIMARY KEY,
717
+ pack_id TEXT NOT NULL,
718
+ agent_id TEXT NOT NULL,
719
+ visibility TEXT NOT NULL CHECK(visibility IN ('private','public')),
720
+ status TEXT NOT NULL DEFAULT 'local_intent' CHECK(status = 'local_intent'),
721
+ manifest_hash TEXT NOT NULL,
722
+ created_at TEXT NOT NULL,
723
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
724
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
725
+ );
726
+ CREATE INDEX idx_experience_export_intents_pack
727
+ ON experience_export_intents(pack_id, created_at DESC);
728
+ CREATE TABLE experience_lineage_events (
729
+ id TEXT PRIMARY KEY,
730
+ pack_id TEXT NOT NULL,
731
+ release_id TEXT NOT NULL,
732
+ event_type TEXT NOT NULL CHECK(event_type IN ('promotion','export-intent')),
733
+ base_package_hash TEXT NOT NULL,
734
+ project_scope_key TEXT NOT NULL,
735
+ environment_key TEXT NOT NULL,
736
+ item_ids_json TEXT NOT NULL DEFAULT '[]',
737
+ task_bindings_json TEXT NOT NULL DEFAULT '[]',
738
+ mcp_requirements_json TEXT NOT NULL DEFAULT '[]',
739
+ evidence_bindings_json TEXT NOT NULL DEFAULT '[]',
740
+ supersedes_release_id TEXT,
741
+ source_fingerprint TEXT NOT NULL,
742
+ created_at TEXT NOT NULL,
743
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
744
+ UNIQUE(pack_id, release_id, event_type)
745
+ );
746
+ CREATE INDEX idx_experience_lineage_pack_created
747
+ ON experience_lineage_events(pack_id, created_at ASC, id ASC);
748
+ CREATE TABLE experience_relation_nodes (
749
+ node_id TEXT PRIMARY KEY,
750
+ pack_id TEXT NOT NULL,
751
+ node_type TEXT NOT NULL
752
+ CHECK(node_type IN ('Pack','Release','Item','TaskTag','Environment','MCPRequirement','EvidenceReceipt')),
753
+ entity_ref TEXT NOT NULL,
754
+ project_scope_key TEXT NOT NULL,
755
+ environment_key TEXT NOT NULL,
756
+ base_package_hash TEXT NOT NULL,
757
+ normalized_value TEXT,
758
+ payload_json TEXT NOT NULL DEFAULT '{}',
759
+ source_fingerprint TEXT NOT NULL,
760
+ rebuilt_at TEXT NOT NULL,
761
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
762
+ UNIQUE(pack_id, node_type, entity_ref)
763
+ );
764
+ CREATE INDEX idx_experience_relation_nodes_scope
765
+ ON experience_relation_nodes(project_scope_key, environment_key, base_package_hash, node_type);
766
+ CREATE INDEX idx_experience_relation_nodes_pack_type
767
+ ON experience_relation_nodes(pack_id, node_type, normalized_value);
768
+ CREATE TABLE experience_relation_index_state (
769
+ scope_key TEXT PRIMARY KEY CHECK(scope_key = 'shared'),
770
+ source_fingerprint TEXT NOT NULL,
771
+ rebuilt_at TEXT NOT NULL,
772
+ node_count INTEGER NOT NULL,
773
+ edge_count INTEGER NOT NULL
774
+ );
775
+ CREATE TABLE experience_cloud_uploads (
776
+ id TEXT PRIMARY KEY,
777
+ pack_id TEXT NOT NULL,
778
+ requested_visibility TEXT NOT NULL
779
+ CHECK(requested_visibility IN ('private','public')),
780
+ bundle_id TEXT NOT NULL,
781
+ bundle_hash TEXT NOT NULL,
782
+ canonical_bundle_json TEXT NOT NULL,
783
+ idempotency_key TEXT NOT NULL UNIQUE,
784
+ remote_upload_id TEXT,
785
+ remote_revision TEXT,
786
+ remote_status TEXT NOT NULL
787
+ CHECK(remote_status IN (
788
+ 'local-ready','saving-private','private-saved','requesting-verification',
789
+ 'verification-requested','verification-pending','verified-private',
790
+ 'public-active','conflict','offline','error','withdrawn','rejected'
791
+ )),
792
+ remote_error_code TEXT,
793
+ remote_error_message TEXT,
794
+ remote_receipt_json TEXT,
795
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
796
+ created_at TEXT NOT NULL,
797
+ updated_at TEXT NOT NULL,
798
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
799
+ UNIQUE(pack_id, bundle_hash, requested_visibility)
800
+ );
801
+ CREATE INDEX idx_experience_cloud_uploads_pack
802
+ ON experience_cloud_uploads(pack_id, updated_at DESC);
803
+ CREATE UNIQUE INDEX idx_experience_cloud_uploads_remote
804
+ ON experience_cloud_uploads(remote_upload_id)
805
+ WHERE remote_upload_id IS NOT NULL;
806
+ CREATE INDEX idx_experience_cloud_uploads_recovery
807
+ ON experience_cloud_uploads(remote_status, updated_at ASC);
808
+ CREATE UNIQUE INDEX idx_experience_auto_pack_exact
809
+ ON experience_packs(agent_id, project_scope_key, environment_key, base_package_hash)
810
+ WHERE auto_managed = 1 AND status = 'active';
811
+ CREATE TABLE experience_auto_intake_receipts (
812
+ id TEXT PRIMARY KEY,
813
+ agent_id TEXT NOT NULL,
814
+ pack_id TEXT,
815
+ candidate_id TEXT,
816
+ source_memory_hash TEXT NOT NULL,
817
+ status TEXT NOT NULL
818
+ CHECK(status IN ('candidate-created','blocked','skipped')),
819
+ memory_kind TEXT NOT NULL,
820
+ reason_codes_json TEXT NOT NULL DEFAULT '[]',
821
+ created_at TEXT NOT NULL, run_id TEXT NULL, redaction_count INTEGER NOT NULL DEFAULT 0,
822
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
823
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE SET NULL,
824
+ FOREIGN KEY(candidate_id) REFERENCES experience_candidates(id) ON DELETE SET NULL,
825
+ UNIQUE(agent_id, source_memory_hash)
826
+ );
827
+ CREATE INDEX idx_experience_auto_intake_agent_status
828
+ ON experience_auto_intake_receipts(agent_id, status, created_at DESC);
829
+ CREATE INDEX idx_run_events_agent_ts
830
+ ON run_events(agent_id, ts DESC);
831
+ CREATE INDEX idx_failure_events_agent_ts
832
+ ON failure_events(agent_id, ts DESC);
833
+ CREATE INDEX idx_run_events_agent_kind_ts
834
+ ON run_events(agent_id, kind, ts DESC);
835
+ CREATE TABLE installed_agent_hub_bindings (
836
+ installed_agent_id TEXT PRIMARY KEY,
837
+ agent_definition_id TEXT NOT NULL,
838
+ agent_release_id TEXT NOT NULL,
839
+ source TEXT NOT NULL CHECK(source IN ('hub-install','agent-cloud-restore')),
840
+ bound_at TEXT NOT NULL,
841
+ FOREIGN KEY(installed_agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
842
+ UNIQUE(agent_definition_id, agent_release_id, installed_agent_id)
843
+ );
844
+ CREATE INDEX idx_installed_agent_hub_binding_exact
845
+ ON installed_agent_hub_bindings(agent_definition_id, agent_release_id);
846
+ CREATE TABLE taste_draft_candidates (
847
+ id TEXT PRIMARY KEY,
848
+ agent_id TEXT NOT NULL,
849
+ source_memory_id TEXT NOT NULL,
850
+ source_memory_hash TEXT NOT NULL,
851
+ project_scope_key TEXT NOT NULL,
852
+ environment_key TEXT NOT NULL,
853
+ base_package_hash TEXT NOT NULL
854
+ CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
855
+ base_agent_definition_id TEXT,
856
+ base_agent_release_id TEXT,
857
+ sensitivity TEXT NOT NULL
858
+ CHECK(sensitivity IN ('public','internal','private')),
859
+ confidence TEXT NOT NULL
860
+ CHECK(confidence IN ('high','medium','low')),
861
+ axis_candidates_json TEXT NOT NULL DEFAULT '[]',
862
+ task_signatures_json TEXT NOT NULL DEFAULT '[]',
863
+ evidence_state TEXT NOT NULL DEFAULT 'pairwise-required'
864
+ CHECK(evidence_state = 'pairwise-required'),
865
+ status TEXT NOT NULL DEFAULT 'observation'
866
+ CHECK(status IN ('observation','rejected')),
867
+ created_at TEXT NOT NULL,
868
+ updated_at TEXT NOT NULL,
869
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
870
+ UNIQUE(agent_id, source_memory_hash, base_package_hash)
871
+ );
872
+ CREATE INDEX idx_taste_drafts_agent_status
873
+ ON taste_draft_candidates(agent_id, status, updated_at DESC);
874
+ CREATE INDEX idx_taste_drafts_exact_base
875
+ ON taste_draft_candidates(agent_id, base_package_hash, project_scope_key, environment_key);
876
+ CREATE TABLE taste_chip_workflows (
877
+ workflow_id TEXT PRIMARY KEY,
878
+ draft_id TEXT NOT NULL UNIQUE,
879
+ agent_id TEXT NOT NULL,
880
+ base_package_hash TEXT NOT NULL,
881
+ base_agent_definition_id TEXT NOT NULL,
882
+ base_agent_release_id TEXT NOT NULL,
883
+ environment_key TEXT NOT NULL,
884
+ taste_style_id TEXT NOT NULL,
885
+ release_id TEXT NOT NULL UNIQUE,
886
+ title TEXT NOT NULL,
887
+ summary TEXT NOT NULL,
888
+ rule_statement TEXT NOT NULL,
889
+ axis TEXT NOT NULL,
890
+ task_signature TEXT NOT NULL,
891
+ contexts_json TEXT NOT NULL,
892
+ generalization_hash TEXT NOT NULL,
893
+ privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
894
+ status TEXT NOT NULL CHECK(status IN ('proposal','confirmed','moderation-pending','ab-ready','error')),
895
+ confirmed_at TEXT,
896
+ preview_grants_json TEXT,
897
+ preview_names_json TEXT,
898
+ preview_digests_json TEXT,
899
+ preview_rights TEXT,
900
+ remote_preview_asset_ids_json TEXT,
901
+ remote_revision TEXT,
902
+ remote_error_code TEXT,
903
+ created_at TEXT NOT NULL,
904
+ updated_at TEXT NOT NULL, preview_provenance_json TEXT,
905
+ FOREIGN KEY(draft_id) REFERENCES taste_draft_candidates(id) ON DELETE CASCADE,
906
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE
907
+ );
908
+ CREATE INDEX idx_taste_chip_workflows_agent_status
909
+ ON taste_chip_workflows(agent_id, status, updated_at DESC);
910
+ CREATE TABLE experience_public_projections (
911
+ projection_id TEXT PRIMARY KEY,
912
+ pack_id TEXT NOT NULL UNIQUE,
913
+ agent_id TEXT NOT NULL,
914
+ base_package_hash TEXT NOT NULL
915
+ CHECK(length(base_package_hash) = 64 AND base_package_hash NOT GLOB '*[^0-9a-f]*'),
916
+ base_agent_definition_id TEXT NOT NULL,
917
+ base_agent_release_id TEXT NOT NULL,
918
+ environment_key TEXT NOT NULL,
919
+ source_bindings_json TEXT NOT NULL,
920
+ source_snapshot_hash TEXT NOT NULL
921
+ CHECK(length(source_snapshot_hash) = 64 AND source_snapshot_hash NOT GLOB '*[^0-9a-f]*'),
922
+ title TEXT NOT NULL,
923
+ instructions_json TEXT NOT NULL,
924
+ task_signatures_json TEXT NOT NULL,
925
+ environment_constraints_json TEXT NOT NULL,
926
+ proposal_hash TEXT NOT NULL
927
+ CHECK(length(proposal_hash) = 64 AND proposal_hash NOT GLOB '*[^0-9a-f]*'),
928
+ privacy_issue_codes_json TEXT NOT NULL DEFAULT '[]',
929
+ status TEXT NOT NULL CHECK(status IN ('proposal','confirmed')),
930
+ confirmation_hash TEXT,
931
+ confirmed_at TEXT,
932
+ created_at TEXT NOT NULL,
933
+ updated_at TEXT NOT NULL,
934
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
935
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE CASCADE,
936
+ CHECK(
937
+ (status = 'proposal' AND confirmation_hash IS NULL AND confirmed_at IS NULL) OR
938
+ (status = 'confirmed' AND length(confirmation_hash) = 64
939
+ AND confirmation_hash NOT GLOB '*[^0-9a-f]*' AND confirmed_at IS NOT NULL)
940
+ )
941
+ );
942
+ CREATE INDEX idx_experience_public_projection_agent_status
943
+ ON experience_public_projections(agent_id, status, updated_at DESC);
944
+ CREATE INDEX idx_experience_public_projection_exact_base
945
+ ON experience_public_projections(
946
+ base_agent_definition_id, base_agent_release_id, base_package_hash, environment_key
947
+ );
948
+ CREATE TABLE experience_governance_relations (
949
+ relation_id TEXT PRIMARY KEY,
950
+ agent_id TEXT NOT NULL,
951
+ pack_id TEXT NOT NULL,
952
+ from_candidate_id TEXT NOT NULL,
953
+ to_candidate_id TEXT NOT NULL,
954
+ relation_type TEXT NOT NULL CHECK(relation_type IN ('supersedes','contradicts')),
955
+ reason TEXT NOT NULL,
956
+ created_at TEXT NOT NULL,
957
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
958
+ FOREIGN KEY(from_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
959
+ FOREIGN KEY(to_candidate_id) REFERENCES experience_candidates(id) ON DELETE CASCADE,
960
+ UNIQUE(from_candidate_id, to_candidate_id, relation_type)
961
+ );
962
+ CREATE INDEX idx_experience_governance_pack
963
+ ON experience_governance_relations(pack_id, relation_type, created_at ASC);
964
+ CREATE TABLE IF NOT EXISTS "experience_relation_edges" (
965
+ edge_id TEXT PRIMARY KEY,
966
+ pack_id TEXT NOT NULL,
967
+ from_node TEXT NOT NULL,
968
+ to_node TEXT NOT NULL,
969
+ edge_type TEXT NOT NULL
970
+ CHECK(edge_type IN (
971
+ 'has_release','exact_base_binding','contains','applies_to_task',
972
+ 'applies_in_environment','requires_mcp','supports_mcp',
973
+ 'alternative_mcp','supported_by','supersedes','contradicts',
974
+ 'similar_to','similar_by_tag'
975
+ )),
976
+ project_scope_key TEXT NOT NULL,
977
+ environment_key TEXT NOT NULL,
978
+ base_package_hash TEXT NOT NULL,
979
+ payload_json TEXT NOT NULL DEFAULT '{}',
980
+ source_fingerprint TEXT NOT NULL,
981
+ rebuilt_at TEXT NOT NULL,
982
+ FOREIGN KEY(pack_id) REFERENCES experience_packs(id) ON DELETE CASCADE,
983
+ FOREIGN KEY(from_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE,
984
+ FOREIGN KEY(to_node) REFERENCES experience_relation_nodes(node_id) ON DELETE CASCADE
985
+ );
986
+ CREATE INDEX idx_experience_relation_edges_scope
987
+ ON experience_relation_edges(project_scope_key, environment_key, base_package_hash, edge_type);
988
+ CREATE INDEX idx_experience_relation_edges_from
989
+ ON experience_relation_edges(pack_id, from_node, edge_type);
990
+ CREATE INDEX idx_experience_relation_edges_to
991
+ ON experience_relation_edges(pack_id, to_node, edge_type);
992
+ CREATE TABLE memory_tickets (
993
+ ticket_id TEXT PRIMARY KEY,
994
+ turn_key TEXT NOT NULL UNIQUE,
995
+ turn_id TEXT,
996
+ run_id TEXT,
997
+ node_id TEXT,
998
+ chat_id TEXT,
999
+ agent_id TEXT,
1000
+ project_id TEXT,
1001
+ project_path_hash TEXT,
1002
+ emitter_status TEXT NOT NULL
1003
+ CHECK(emitter_status IN ('valid','empty','missing','malformed','read_only')),
1004
+ candidate_count INTEGER NOT NULL DEFAULT 0 CHECK(candidate_count >= 0),
1005
+ state TEXT NOT NULL DEFAULT 'received'
1006
+ CHECK(state IN ('received','completed','read_only','failed')),
1007
+ curator_mode TEXT NOT NULL DEFAULT 'policy'
1008
+ CHECK(curator_mode IN ('semantic','policy','policy_fallback','read_only')),
1009
+ curation_outcome TEXT NOT NULL DEFAULT 'no_candidates'
1010
+ CHECK(curation_outcome IN ('decided','no_candidates','malformed_output','curator_failed','read_only')),
1011
+ written_count INTEGER NOT NULL DEFAULT 0 CHECK(written_count >= 0),
1012
+ deduped_count INTEGER NOT NULL DEFAULT 0 CHECK(deduped_count >= 0),
1013
+ redacted_count INTEGER NOT NULL DEFAULT 0 CHECK(redacted_count >= 0),
1014
+ session_count INTEGER NOT NULL DEFAULT 0 CHECK(session_count >= 0),
1015
+ discarded_count INTEGER NOT NULL DEFAULT 0 CHECK(discarded_count >= 0),
1016
+ failure_code TEXT,
1017
+ created_at TEXT NOT NULL,
1018
+ updated_at TEXT NOT NULL
1019
+ );
1020
+ CREATE INDEX idx_memory_tickets_project_created
1021
+ ON memory_tickets(project_id, created_at DESC);
1022
+ CREATE INDEX idx_memory_tickets_agent_created
1023
+ ON memory_tickets(agent_id, created_at DESC);
1024
+ CREATE INDEX idx_memory_tickets_status_created
1025
+ ON memory_tickets(emitter_status, state, created_at DESC);
1026
+ CREATE TABLE memory_decisions (
1027
+ decision_id TEXT PRIMARY KEY,
1028
+ ticket_id TEXT NOT NULL,
1029
+ candidate_index INTEGER NOT NULL CHECK(candidate_index >= 0),
1030
+ content_hash TEXT NOT NULL
1031
+ CHECK(length(content_hash) = 64 AND content_hash NOT GLOB '*[^0-9a-f]*'),
1032
+ memory_kind TEXT NOT NULL,
1033
+ proposed_scope TEXT NOT NULL,
1034
+ resolved_scope TEXT NOT NULL,
1035
+ action TEXT NOT NULL
1036
+ CHECK(action IN ('written','deduped','redacted','session','discarded','deferred')),
1037
+ reason_code TEXT NOT NULL,
1038
+ target_memory_id TEXT,
1039
+ confidence TEXT NOT NULL,
1040
+ sensitivity TEXT NOT NULL,
1041
+ curator_mode TEXT NOT NULL
1042
+ CHECK(curator_mode IN ('semantic','policy','policy_fallback','read_only')),
1043
+ created_at TEXT NOT NULL,
1044
+ FOREIGN KEY(ticket_id) REFERENCES memory_tickets(ticket_id) ON DELETE CASCADE,
1045
+ FOREIGN KEY(target_memory_id) REFERENCES memory_entries(id) ON DELETE SET NULL,
1046
+ UNIQUE(ticket_id, candidate_index)
1047
+ );
1048
+ CREATE INDEX idx_memory_decisions_ticket_action
1049
+ ON memory_decisions(ticket_id, action, candidate_index);
1050
+ CREATE TABLE memory_relation_edges (
1051
+ relation_id TEXT PRIMARY KEY,
1052
+ from_memory_id TEXT NOT NULL,
1053
+ to_memory_id TEXT NOT NULL,
1054
+ relation_type TEXT NOT NULL
1055
+ CHECK(relation_type IN ('similar_to','supersedes','contradicts')),
1056
+ score REAL,
1057
+ owner_scope_key TEXT NOT NULL,
1058
+ embedding_model TEXT,
1059
+ embedding_adapter TEXT,
1060
+ embedding_model_sha256 TEXT,
1061
+ created_at TEXT NOT NULL,
1062
+ FOREIGN KEY(from_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
1063
+ FOREIGN KEY(to_memory_id) REFERENCES memory_entries(id) ON DELETE CASCADE,
1064
+ CHECK(from_memory_id <> to_memory_id),
1065
+ CHECK(score IS NULL OR (score >= -1.0 AND score <= 1.0)),
1066
+ UNIQUE(from_memory_id, to_memory_id, relation_type)
1067
+ );
1068
+ CREATE INDEX idx_memory_relation_from
1069
+ ON memory_relation_edges(from_memory_id, relation_type, score DESC);
1070
+ CREATE INDEX idx_memory_relation_to
1071
+ ON memory_relation_edges(to_memory_id, relation_type, score DESC);
1072
+ CREATE INDEX idx_memory_relation_owner
1073
+ ON memory_relation_edges(owner_scope_key, relation_type, score DESC);
1074
+ CREATE TABLE memory_episodes (
1075
+ episode_id TEXT PRIMARY KEY,
1076
+ ticket_id TEXT NOT NULL UNIQUE,
1077
+ project_id TEXT,
1078
+ project_path_hash TEXT,
1079
+ agent_id TEXT,
1080
+ chat_id TEXT,
1081
+ summary TEXT,
1082
+ summary_hash TEXT,
1083
+ embedding_model TEXT,
1084
+ embedding_adapter TEXT,
1085
+ embedding_model_sha256 TEXT,
1086
+ embedding_content_hash TEXT,
1087
+ embedding_dimensions INTEGER,
1088
+ embedding_json TEXT,
1089
+ created_at TEXT NOT NULL,
1090
+ FOREIGN KEY(ticket_id) REFERENCES memory_tickets(ticket_id) ON DELETE CASCADE,
1091
+ CHECK(project_path_hash IS NULL OR
1092
+ (length(project_path_hash) = 64 AND project_path_hash NOT GLOB '*[^0-9a-f]*')),
1093
+ CHECK(summary_hash IS NULL OR
1094
+ (length(summary_hash) = 64 AND summary_hash NOT GLOB '*[^0-9a-f]*'))
1095
+ );
1096
+ CREATE INDEX idx_memory_episodes_project_created
1097
+ ON memory_episodes(project_id, created_at DESC);
1098
+ CREATE INDEX idx_memory_episodes_project_path_created
1099
+ ON memory_episodes(project_path_hash, created_at DESC);
1100
+ CREATE INDEX idx_memory_episodes_agent_created
1101
+ ON memory_episodes(agent_id, created_at DESC);
1102
+ CREATE TABLE activated_folder_identity (
1103
+ path TEXT PRIMARY KEY,
1104
+ identity_json TEXT NOT NULL,
1105
+ captured_at TEXT NOT NULL
1106
+ );
1107
+ CREATE INDEX idx_automation_runs_occurrence
1108
+ ON automation_runs(automation_id, occurrence_id, started_at);
1109
+ CREATE TABLE automation_trigger_events (
1110
+ id TEXT PRIMARY KEY,
1111
+ automation_id TEXT NOT NULL,
1112
+ trigger_kind TEXT NOT NULL CHECK(trigger_kind IN ('fs','chain','webhook','poll')),
1113
+ dedupe_key TEXT NOT NULL,
1114
+ payload_json TEXT NOT NULL,
1115
+ status TEXT NOT NULL DEFAULT 'pending'
1116
+ CHECK(status IN ('pending','claimed','delivered','parked')),
1117
+ attempt_count INTEGER NOT NULL DEFAULT 0 CHECK(attempt_count >= 0),
1118
+ next_attempt_at TEXT NOT NULL,
1119
+ claim_owner TEXT,
1120
+ claimed_until TEXT,
1121
+ run_id TEXT,
1122
+ run_outcome TEXT CHECK(run_outcome IS NULL OR run_outcome IN
1123
+ ('ok','partial','error','skipped','blocked','needs_input')),
1124
+ last_error TEXT,
1125
+ created_at TEXT NOT NULL,
1126
+ updated_at TEXT NOT NULL,
1127
+ delivered_at TEXT,
1128
+ FOREIGN KEY(automation_id) REFERENCES automations(id) ON DELETE CASCADE,
1129
+ UNIQUE(automation_id, trigger_kind, dedupe_key),
1130
+ CHECK(
1131
+ (status = 'claimed' AND claim_owner IS NOT NULL AND claimed_until IS NOT NULL) OR
1132
+ (status <> 'claimed' AND claim_owner IS NULL AND claimed_until IS NULL)
1133
+ ),
1134
+ CHECK((status = 'delivered' AND delivered_at IS NOT NULL) OR status <> 'delivered')
1135
+ );
1136
+ CREATE INDEX idx_automation_trigger_events_due
1137
+ ON automation_trigger_events(status, next_attempt_at, created_at);
1138
+ CREATE INDEX idx_automation_trigger_events_automation
1139
+ ON automation_trigger_events(automation_id, status, created_at);
1140
+ CREATE INDEX idx_automation_trigger_events_run
1141
+ ON automation_trigger_events(run_id) WHERE run_id IS NOT NULL;
1142
+ CREATE TABLE tasks (
1143
+ id TEXT PRIMARY KEY,
1144
+ title TEXT NOT NULL DEFAULT '',
1145
+ project_id TEXT,
1146
+ firm_id TEXT,
1147
+ status TEXT NOT NULL DEFAULT 'open',
1148
+ created_at TEXT NOT NULL,
1149
+ updated_at TEXT NOT NULL,
1150
+ archived_at TEXT,
1151
+ origin_chat_id TEXT,
1152
+ FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE SET NULL,
1153
+ FOREIGN KEY(firm_id) REFERENCES firms(id) ON DELETE SET NULL
1154
+ );
1155
+ CREATE INDEX idx_tasks_updated ON tasks(updated_at DESC);
1156
+ CREATE INDEX idx_tasks_project_updated ON tasks(project_id, updated_at DESC);
1157
+ CREATE INDEX idx_tasks_firm_updated ON tasks(firm_id, updated_at DESC);
1158
+ CREATE INDEX idx_tasks_origin_chat ON tasks(origin_chat_id);
1159
+ CREATE TABLE task_agent_participants (
1160
+ task_id TEXT NOT NULL,
1161
+ agent_id TEXT,
1162
+ agent_slug TEXT NOT NULL,
1163
+ role TEXT,
1164
+ first_seen_at TEXT NOT NULL,
1165
+ last_seen_at TEXT NOT NULL,
1166
+ PRIMARY KEY(task_id, agent_slug),
1167
+ FOREIGN KEY(task_id) REFERENCES tasks(id) ON DELETE CASCADE,
1168
+ FOREIGN KEY(agent_id) REFERENCES installed_agents(id) ON DELETE SET NULL
1169
+ );
1170
+ CREATE INDEX idx_task_participants_agent ON task_agent_participants(agent_id);
1171
+ CREATE TABLE terminal_memory_turn_intents (
1172
+ turn_id TEXT PRIMARY KEY,
1173
+ request_fingerprint TEXT NOT NULL,
1174
+ context_key TEXT NOT NULL,
1175
+ permission TEXT NOT NULL,
1176
+ project_key TEXT,
1177
+ owner_key TEXT,
1178
+ owner_policy_json TEXT NOT NULL DEFAULT '{}',
1179
+ status TEXT NOT NULL DEFAULT 'pending',
1180
+ started_at TEXT NOT NULL,
1181
+ completed_at TEXT
1182
+ );
1183
+ CREATE INDEX idx_terminal_memory_intent_pending
1184
+ ON terminal_memory_turn_intents(request_fingerprint, status, started_at);
1185
+ CREATE UNIQUE INDEX idx_terminal_memory_one_pending_request
1186
+ ON terminal_memory_turn_intents(request_fingerprint)
1187
+ WHERE status IN ('pending','curating');
1188
+ CREATE TABLE terminal_memory_episode_receipts (
1189
+ turn_id TEXT PRIMARY KEY,
1190
+ ticket_json TEXT NOT NULL,
1191
+ project_key TEXT,
1192
+ created_at TEXT NOT NULL
1193
+ );
1194
+ CREATE TABLE terminal_memory_curator_decisions (
1195
+ decision_id TEXT PRIMARY KEY,
1196
+ turn_id TEXT NOT NULL,
1197
+ candidate_id TEXT NOT NULL,
1198
+ content_digest TEXT NOT NULL,
1199
+ semantic_disposition TEXT NOT NULL,
1200
+ semantic_scope TEXT NOT NULL,
1201
+ final_disposition TEXT NOT NULL,
1202
+ final_scope TEXT NOT NULL,
1203
+ reason_codes_json TEXT NOT NULL DEFAULT '[]',
1204
+ created_at TEXT NOT NULL
1205
+ );
1206
+ CREATE INDEX idx_terminal_memory_decisions_turn
1207
+ ON terminal_memory_curator_decisions(turn_id);
1208
+ CREATE TABLE terminal_memory_scope_timeline (
1209
+ event_id TEXT PRIMARY KEY,
1210
+ turn_id TEXT NOT NULL,
1211
+ memory_id TEXT NOT NULL,
1212
+ lane TEXT NOT NULL,
1213
+ project_key TEXT,
1214
+ owner_key TEXT,
1215
+ created_at TEXT NOT NULL
1216
+ );
1217
+ CREATE INDEX idx_terminal_memory_timeline_project
1218
+ ON terminal_memory_scope_timeline(project_key, lane, created_at);
1219
+ CREATE INDEX idx_terminal_memory_timeline_owner
1220
+ ON terminal_memory_scope_timeline(owner_key, lane, created_at);
1221
+ CREATE TABLE agent_usage (
1222
+ agent_key TEXT PRIMARY KEY,
1223
+ kind TEXT NOT NULL,
1224
+ first_used_at TEXT NOT NULL,
1225
+ last_used_at TEXT NOT NULL,
1226
+ use_count INTEGER NOT NULL DEFAULT 0
1227
+ );
1228
+ CREATE INDEX idx_experience_auto_intake_run
1229
+ ON experience_auto_intake_receipts(agent_id, run_id)
1230
+ WHERE run_id IS NOT NULL;
1231
+ CREATE INDEX idx_installed_agents_parent_team ON installed_agents(parent_team_id) WHERE parent_team_id IS NOT NULL;
1232
+ CREATE TABLE IF NOT EXISTS "borrowed_agent_careers_v76_legacy" (
1233
+ owner_scope_key TEXT NOT NULL,
1234
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1235
+ slug TEXT NOT NULL,
1236
+ first_used_at TEXT NOT NULL,
1237
+ last_used_at TEXT NOT NULL,
1238
+ use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
1239
+ latest_runtime_json TEXT,
1240
+ name_en TEXT,
1241
+ name_ko TEXT,
1242
+ tagline_en TEXT,
1243
+ tagline_ko TEXT,
1244
+ PRIMARY KEY(owner_scope_key, entity_kind, slug)
1245
+ );
1246
+ CREATE TABLE IF NOT EXISTS "borrowed_agent_career_runs_v76_legacy" (
1247
+ owner_scope_key TEXT NOT NULL,
1248
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1249
+ slug TEXT NOT NULL,
1250
+ run_id_hash TEXT NOT NULL,
1251
+ recorded_at TEXT NOT NULL,
1252
+ PRIMARY KEY(owner_scope_key, entity_kind, slug, run_id_hash),
1253
+ FOREIGN KEY(owner_scope_key, entity_kind, slug)
1254
+ REFERENCES "borrowed_agent_careers_v76_legacy"(owner_scope_key, entity_kind, slug)
1255
+ ON DELETE CASCADE
1256
+ );
1257
+ CREATE TABLE borrowed_agent_careers (
1258
+ owner_scope_key TEXT NOT NULL,
1259
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1260
+ agent_definition_id TEXT NOT NULL,
1261
+ agent_release_id TEXT NOT NULL,
1262
+ component_id TEXT NOT NULL DEFAULT '',
1263
+ slug TEXT NOT NULL,
1264
+ memory_key TEXT NOT NULL,
1265
+ first_used_at TEXT NOT NULL,
1266
+ last_used_at TEXT NOT NULL,
1267
+ use_count INTEGER NOT NULL DEFAULT 0 CHECK(use_count >= 0),
1268
+ latest_runtime_json TEXT,
1269
+ name_en TEXT,
1270
+ name_ko TEXT,
1271
+ tagline_en TEXT,
1272
+ tagline_ko TEXT,
1273
+ PRIMARY KEY(
1274
+ owner_scope_key, entity_kind, agent_definition_id,
1275
+ agent_release_id, component_id
1276
+ )
1277
+ );
1278
+ CREATE UNIQUE INDEX idx_borrowed_agent_careers_owner_memory
1279
+ ON borrowed_agent_careers(owner_scope_key, memory_key);
1280
+ CREATE INDEX idx_borrowed_agent_careers_owner_recent
1281
+ ON borrowed_agent_careers(owner_scope_key, last_used_at DESC);
1282
+ CREATE TABLE borrowed_agent_career_runs (
1283
+ owner_scope_key TEXT NOT NULL,
1284
+ entity_kind TEXT NOT NULL CHECK(entity_kind IN ('agent','team')),
1285
+ agent_definition_id TEXT NOT NULL,
1286
+ agent_release_id TEXT NOT NULL,
1287
+ component_id TEXT NOT NULL DEFAULT '',
1288
+ run_id_hash TEXT NOT NULL,
1289
+ recorded_at TEXT NOT NULL,
1290
+ PRIMARY KEY(
1291
+ owner_scope_key, entity_kind, agent_definition_id,
1292
+ agent_release_id, component_id, run_id_hash
1293
+ ),
1294
+ FOREIGN KEY(
1295
+ owner_scope_key, entity_kind, agent_definition_id,
1296
+ agent_release_id, component_id
1297
+ )
1298
+ REFERENCES borrowed_agent_careers(
1299
+ owner_scope_key, entity_kind, agent_definition_id,
1300
+ agent_release_id, component_id
1301
+ )
1302
+ ON DELETE CASCADE
1303
+ );
1304
+ CREATE TABLE model_roles (
1305
+ role TEXT PRIMARY KEY CHECK(role IN ('orchestrator','worker')),
1306
+ kind TEXT NOT NULL,
1307
+ backend TEXT,
1308
+ source TEXT,
1309
+ model TEXT,
1310
+ effort TEXT,
1311
+ long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
1312
+ inherit INTEGER NOT NULL DEFAULT 0 CHECK(inherit IN (0,1)),
1313
+ updated_at TEXT NOT NULL,
1314
+ CHECK(role = 'worker' OR inherit = 0)
1315
+ );
1316
+ CREATE TABLE model_role_members (
1317
+ role TEXT NOT NULL CHECK(role IN ('orchestrator','worker')),
1318
+ position INTEGER NOT NULL CHECK(position >= 1),
1319
+ kind TEXT NOT NULL,
1320
+ backend TEXT,
1321
+ source TEXT,
1322
+ model TEXT,
1323
+ effort TEXT,
1324
+ long_context INTEGER NOT NULL DEFAULT 0 CHECK(long_context IN (0,1)),
1325
+ updated_at TEXT NOT NULL,
1326
+ PRIMARY KEY(role, position)
1327
+ );