@taopao/memoir 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +8 -2
- package/assets/migrations-pg/0100_baseline.sql +1115 -0
- package/assets/migrations-pg/0101_functions.sql +93 -0
- package/assets/migrations-pg/0102_views.sql +2425 -0
- package/assets/migrations-pg/0103_constraints.sql +147 -0
- package/assets/migrations-pg/0104_protection.sql +33 -0
- package/assets/migrations-pg/0105_bocom_credit_card.sql +43 -0
- package/assets/migrations-pg/0106_psbc_debit_card.sql +87 -0
- package/assets/migrations-pg/0107_tailong_debit_card.sql +87 -0
- package/assets/migrations-pg/0108_ccb_debit_card.sql +87 -0
- package/assets/migrations-pg/0109_ccb_credit_card.sql +63 -0
- package/assets/migrations-pg/0110_icbc_debit_card.sql +87 -0
- package/assets/migrations-pg/0111_icbc_credit_card.sql +66 -0
- package/assets/migrations-pg/0112_boc_debit_card.sql +88 -0
- package/assets/migrations-pg/0113_jsb_debit_card.sql +88 -0
- package/assets/migrations-pg/0114_cmbc_debit_card.sql +88 -0
- package/assets/migrations-pg/0115_hzbank_debit_card.sql +88 -0
- package/assets/migrations-pg/0116_unified_bank_documents.sql +197 -0
- package/assets/migrations-pg/0117_agent_submissions.sql +50 -0
- package/assets/migrations-pg/0118_agent_reversions_analysis.sql +34 -0
- package/assets/migrations-pg/0119_agent_extension_registry.sql +72 -0
- package/assets/migrations-pg/0120_agent_record_sources.sql +22 -0
- package/assets/migrations-pg/0121_agent_extension_deprecation.sql +30 -0
- package/assets/migrations-pg/0122_agent_extension_controlled_revert.sql +107 -0
- package/assets/migrations-pg/0123_agent_extension_versions.sql +54 -0
- package/assets/migrations-pg/0124_agent_extension_retirement_groups.sql +26 -0
- package/assets/migrations-pg/0125_agent_candidate_reviews.sql +30 -0
- package/assets/migrations-pg/0126_agent_module_lifecycle.sql +93 -0
- package/assets/migrations-pg/0127_agent_tasks.sql +64 -0
- package/assets/migrations-pg/0128_agent_task_leases.sql +80 -0
- package/assets/migrations-pg/0129_agent_task_plans.sql +66 -0
- package/assets/migrations-pg/0130_agent_task_submissions.sql +72 -0
- package/assets/migrations-pg/0131_agent_task_completions.sql +93 -0
- package/assets/migrations-pg/0132_agent_task_changes.sql +113 -0
- package/assets/migrations-pg/0133_agent_imported_source_snapshots.sql +152 -0
- package/assets/migrations-pg/0134_agent_analysis_datasets.sql +6 -0
- package/assets/migrations-pg/0135_agent_maintenance_tasks.sql +139 -0
- package/assets/migrations-pg/0136_agent_task_structures.sql +66 -0
- package/assets/migrations-pg/0137_agent_personal_identity.sql +149 -0
- package/assets/migrations-pg/0138_agent_work_records.sql +24 -0
- package/assets/migrations-pg/0139_shared_files.sql +43 -0
- package/assets/migrations-pg/0140_shared_script_runs.sql +36 -0
- package/assets/migrations-pg/0141_payment_bank_links.sql +96 -0
- package/assets/migrations-pg/0142_consumption_order_types_and_places.sql +287 -0
- package/assets/migrations-pg/0143_skill_direct_write.sql +330 -0
- package/assets/migrations-pg/0144_skill_schema_archive.sql +73 -0
- package/assets/migrations-pg/0145_skill_ingest_wiki.sql +91 -0
- package/assets/migrations-pg/0146_skill_load.sql +17 -0
- package/assets/migrations-pg/0147_drop_agent_schema.sql +147 -0
- package/assets/migrations-pg/0148_ingest_lanes.sql +19 -0
- package/assets/migrations-pg/0149_account_ownership.sql +233 -0
- package/assets/migrations-pg/0150_bank_card_exact_link.sql +24 -0
- package/assets/migrations-pg/0151_account_ownership_enforce.sql +35 -0
- package/assets/migrations-pg/0152_account_ownership_views.sql +750 -0
- package/assets/migrations-pg/0153_web_frontend.sql +34 -0
- package/assets/migrations-pg/0154_audio_record_owners.sql +103 -0
- package/assets/migrations-pg/0155_ingest_knowledge_tables.sql +171 -0
- package/assets/migrations-pg/0156_batch_playbook_note.sql +17 -0
- package/assets/migrations-pg/0157_last_contact.sql +166 -0
- package/assets/migrations-pg/0158_refund_match_hash_join.sql +91 -0
- package/assets/migrations-pg/0159_fact_occurred_time.sql +88 -0
- package/assets/migrations-pg/0160_agent_notes.sql +118 -0
- package/assets/migrations-pg/0161_life_history.sql +314 -0
- package/assets/migrations-pg/0162_person_card.sql +427 -0
- package/assets/migrations-pg/0163_parking_drop_personal_defaults.sql +12 -0
- package/assets/native/darwin-arm64.node +0 -0
- package/assets/playbooks/audio.md +83 -0
- package/assets/playbooks/chat.md +37 -0
- package/assets/playbooks/common.md +66 -0
- package/assets/playbooks/intimate.md +19 -0
- package/assets/playbooks/journal.md +17 -0
- package/assets/playbooks/orders.md +15 -0
- package/assets/playbooks/payments.md +16 -0
- package/assets/playbooks/self.md +29 -0
- package/bin/install-codex-skill.mjs +77 -0
- package/bin/memoir.mjs +5 -0
- package/dist/cli.js +34062 -0
- package/package.json +40 -4
- package/release-manifest.json +432 -0
- package/skill/SKILL.md +120 -0
- package/skill/references//345/256/211/350/243/205/344/275/215/347/275/256.md +21 -0
- package/skill/references//346/225/260/346/215/256/345/217/243/345/276/204.md +36 -0
- package/skill/scripts/memoir.mjs +82 -0
|
@@ -0,0 +1,1115 @@
|
|
|
1
|
+
-- PostgreSQL 当前结构基线;仅包含结构,不重复执行 SQLite 历史业务种子数据。
|
|
2
|
+
|
|
3
|
+
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
4
|
+
|
|
5
|
+
CREATE OR REPLACE FUNCTION vault_json_valid(value text) RETURNS boolean LANGUAGE sql IMMUTABLE AS $$ SELECT pg_input_is_valid(value, 'jsonb') $$;
|
|
6
|
+
|
|
7
|
+
CREATE TABLE analysis_terms (
|
|
8
|
+
id TEXT PRIMARY KEY,
|
|
9
|
+
person_id TEXT,
|
|
10
|
+
kind TEXT NOT NULL CHECK (kind IN ('stopword', 'dictionary', 'synonym', 'place', 'topic')),
|
|
11
|
+
"value" TEXT NOT NULL,
|
|
12
|
+
extra_json TEXT NOT NULL DEFAULT '{}' CHECK (vault_json_valid(extra_json)),
|
|
13
|
+
created_at TEXT NOT NULL,
|
|
14
|
+
created_by TEXT NOT NULL,
|
|
15
|
+
updated_at TEXT NOT NULL,
|
|
16
|
+
updated_by TEXT NOT NULL,
|
|
17
|
+
deleted_at TEXT
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE TABLE audio_records (
|
|
21
|
+
sha1 TEXT PRIMARY KEY,
|
|
22
|
+
display_name TEXT NOT NULL,
|
|
23
|
+
file_name TEXT NOT NULL,
|
|
24
|
+
file_path TEXT,
|
|
25
|
+
record_type BIGINT NOT NULL,
|
|
26
|
+
ended_at TEXT NOT NULL,
|
|
27
|
+
started_at TEXT NOT NULL,
|
|
28
|
+
created_ts_ms BIGINT NOT NULL,
|
|
29
|
+
duration_sec BIGINT NOT NULL CHECK (duration_sec >= 0),
|
|
30
|
+
sentence_count BIGINT NOT NULL DEFAULT 0 CHECK (sentence_count >= 0),
|
|
31
|
+
has_summary SMALLINT NOT NULL DEFAULT 0 CHECK (has_summary IN (0, 1)),
|
|
32
|
+
theme TEXT,
|
|
33
|
+
transcript_hash TEXT NOT NULL,
|
|
34
|
+
first_batch_id TEXT NOT NULL,
|
|
35
|
+
last_batch_id TEXT NOT NULL,
|
|
36
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
CREATE TABLE audio_sentences (
|
|
40
|
+
record_sha1 TEXT NOT NULL,
|
|
41
|
+
sort_index BIGINT NOT NULL CHECK (sort_index >= 0),
|
|
42
|
+
source_sentence_id BIGINT,
|
|
43
|
+
speaker_label TEXT NOT NULL,
|
|
44
|
+
content TEXT NOT NULL,
|
|
45
|
+
start_ms BIGINT NOT NULL CHECK (start_ms >= 0),
|
|
46
|
+
first_batch_id TEXT NOT NULL,
|
|
47
|
+
last_batch_id TEXT NOT NULL,
|
|
48
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
49
|
+
PRIMARY KEY (record_sha1, sort_index)
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
CREATE TABLE audio_summaries (
|
|
53
|
+
record_sha1 TEXT PRIMARY KEY,
|
|
54
|
+
theme TEXT,
|
|
55
|
+
result_html TEXT,
|
|
56
|
+
result_text TEXT,
|
|
57
|
+
need_to_deal TEXT,
|
|
58
|
+
first_batch_id TEXT NOT NULL,
|
|
59
|
+
last_batch_id TEXT NOT NULL,
|
|
60
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE TABLE "audit_log" (
|
|
64
|
+
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
65
|
+
at TEXT NOT NULL,
|
|
66
|
+
actor TEXT NOT NULL,
|
|
67
|
+
reason TEXT,
|
|
68
|
+
table_name TEXT NOT NULL,
|
|
69
|
+
row_key TEXT NOT NULL,
|
|
70
|
+
op TEXT NOT NULL CHECK (op IN ('insert', 'update', 'delete')),
|
|
71
|
+
before_json TEXT,
|
|
72
|
+
after_json TEXT
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE backup_log (
|
|
76
|
+
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
77
|
+
at TEXT NOT NULL,
|
|
78
|
+
kind TEXT NOT NULL CHECK (kind IN ('scheduled', 'pre_import', 'pre_migrate', 'pre_write', 'manual', 'logical_export')),
|
|
79
|
+
path TEXT NOT NULL,
|
|
80
|
+
sha256 TEXT NOT NULL,
|
|
81
|
+
size BIGINT NOT NULL CHECK (size >= 0),
|
|
82
|
+
verified_at TEXT,
|
|
83
|
+
verify_result TEXT
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
CREATE TABLE "bank_card_statements" (
|
|
87
|
+
statement_key TEXT PRIMARY KEY,
|
|
88
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN ('citic_debit_card', 'cmb_debit_card', 'bocom_debit_card')),
|
|
89
|
+
account_key TEXT NOT NULL,
|
|
90
|
+
account_masked TEXT NOT NULL,
|
|
91
|
+
owner_name TEXT NOT NULL,
|
|
92
|
+
account_type TEXT NOT NULL,
|
|
93
|
+
branch TEXT NOT NULL,
|
|
94
|
+
period_from TEXT NOT NULL,
|
|
95
|
+
period_to TEXT NOT NULL CHECK (period_to >= period_from),
|
|
96
|
+
requested_at TEXT NOT NULL,
|
|
97
|
+
verification_code TEXT NOT NULL,
|
|
98
|
+
page_count BIGINT NOT NULL CHECK (page_count > 0),
|
|
99
|
+
source_file TEXT NOT NULL,
|
|
100
|
+
source_sha256 TEXT NOT NULL,
|
|
101
|
+
first_batch_id TEXT NOT NULL,
|
|
102
|
+
last_batch_id TEXT NOT NULL,
|
|
103
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
CREATE TABLE "bank_card_transactions" (
|
|
107
|
+
transaction_key TEXT PRIMARY KEY,
|
|
108
|
+
account_key TEXT NOT NULL,
|
|
109
|
+
account_masked TEXT NOT NULL,
|
|
110
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
111
|
+
currency TEXT NOT NULL,
|
|
112
|
+
occurred_at TEXT NOT NULL,
|
|
113
|
+
direction TEXT NOT NULL CHECK (direction IN ('in', 'out', 'neutral')),
|
|
114
|
+
amount_cents BIGINT NOT NULL CHECK (amount_cents >= 0),
|
|
115
|
+
balance_cents BIGINT NOT NULL,
|
|
116
|
+
counterparty TEXT NOT NULL,
|
|
117
|
+
counterparty_account TEXT NOT NULL,
|
|
118
|
+
institution TEXT NOT NULL,
|
|
119
|
+
description TEXT NOT NULL,
|
|
120
|
+
bank_txn_id TEXT NOT NULL,
|
|
121
|
+
transaction_card TEXT NOT NULL,
|
|
122
|
+
status TEXT NOT NULL,
|
|
123
|
+
source_file TEXT NOT NULL,
|
|
124
|
+
source_sha256 TEXT NOT NULL,
|
|
125
|
+
source_sheet TEXT NOT NULL,
|
|
126
|
+
row_number BIGINT NOT NULL CHECK (row_number > 0),
|
|
127
|
+
first_batch_id TEXT NOT NULL,
|
|
128
|
+
last_batch_id TEXT NOT NULL,
|
|
129
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
130
|
+
source_kind TEXT NOT NULL DEFAULT 'citic_debit_card' CHECK (source_kind IN ('citic_debit_card', 'cmb_debit_card', 'bocom_debit_card')),
|
|
131
|
+
date_precision TEXT NOT NULL DEFAULT 'second' CHECK (date_precision IN ('day', 'second')),
|
|
132
|
+
page_number BIGINT CHECK (page_number > 0),
|
|
133
|
+
statement_key TEXT,
|
|
134
|
+
CHECK ((direction = 'neutral' AND amount_cents = 0) OR (direction IN ('in', 'out') AND amount_cents > 0)),
|
|
135
|
+
CHECK ((source_kind = 'bocom_debit_card' AND date_precision = 'second' AND page_number IS NOT NULL AND statement_key IS NOT NULL) OR (source_kind = 'citic_debit_card' AND date_precision = 'second') OR (source_kind = 'cmb_debit_card' AND date_precision = 'day' AND page_number IS NOT NULL AND statement_key IS NOT NULL))
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
CREATE TABLE bank_cards (
|
|
139
|
+
id TEXT PRIMARY KEY,
|
|
140
|
+
bank_name TEXT NOT NULL,
|
|
141
|
+
card_type TEXT NOT NULL DEFAULT 'credit' CHECK (card_type IN ('credit', 'debit', 'other')),
|
|
142
|
+
card_number TEXT NOT NULL,
|
|
143
|
+
credit_limit_cents BIGINT CHECK (credit_limit_cents IS NULL OR credit_limit_cents >= 0),
|
|
144
|
+
repayment_day BIGINT CHECK (repayment_day IS NULL OR (repayment_day >= 1 AND repayment_day <= 31)),
|
|
145
|
+
has_annual_fee SMALLINT NOT NULL DEFAULT 1 CHECK (has_annual_fee IN (0, 1)),
|
|
146
|
+
annual_fee_condition TEXT,
|
|
147
|
+
annual_fee_date TEXT,
|
|
148
|
+
benefits TEXT,
|
|
149
|
+
note TEXT,
|
|
150
|
+
created_at TEXT NOT NULL,
|
|
151
|
+
created_by TEXT NOT NULL,
|
|
152
|
+
updated_at TEXT NOT NULL,
|
|
153
|
+
updated_by TEXT NOT NULL,
|
|
154
|
+
deleted_at TEXT
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
CREATE TABLE beneficiaries (
|
|
158
|
+
target_type TEXT NOT NULL CHECK (target_type IN ('payment', 'order', 'order_item', 'ticket')),
|
|
159
|
+
target_key TEXT NOT NULL,
|
|
160
|
+
person_id TEXT NOT NULL,
|
|
161
|
+
share_ratio DOUBLE PRECISION CHECK (share_ratio IS NULL OR (share_ratio >= 0 AND share_ratio <= 1)),
|
|
162
|
+
basis TEXT NOT NULL DEFAULT 'manual',
|
|
163
|
+
created_at TEXT NOT NULL,
|
|
164
|
+
created_by TEXT NOT NULL,
|
|
165
|
+
updated_at TEXT NOT NULL,
|
|
166
|
+
updated_by TEXT NOT NULL,
|
|
167
|
+
deleted_at TEXT,
|
|
168
|
+
PRIMARY KEY (target_type, target_key, person_id)
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
CREATE TABLE "credit_card_statements" (
|
|
172
|
+
statement_key TEXT PRIMARY KEY,
|
|
173
|
+
card_key TEXT NOT NULL,
|
|
174
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
175
|
+
statement_date TEXT NOT NULL,
|
|
176
|
+
due_date TEXT NOT NULL,
|
|
177
|
+
currency TEXT NOT NULL,
|
|
178
|
+
previous_balance_cents BIGINT NOT NULL,
|
|
179
|
+
payments_cents BIGINT NOT NULL,
|
|
180
|
+
new_charges_cents BIGINT NOT NULL,
|
|
181
|
+
balance_cents BIGINT NOT NULL,
|
|
182
|
+
minimum_due_cents BIGINT NOT NULL,
|
|
183
|
+
page_number BIGINT NOT NULL CHECK (page_number > 0),
|
|
184
|
+
source_file TEXT NOT NULL,
|
|
185
|
+
source_sha256 TEXT NOT NULL,
|
|
186
|
+
first_batch_id TEXT NOT NULL,
|
|
187
|
+
last_batch_id TEXT NOT NULL,
|
|
188
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
189
|
+
source_kind TEXT NOT NULL DEFAULT 'citic_credit_card' CHECK (source_kind IN ('citic_credit_card', 'cmb_credit_card')),
|
|
190
|
+
adjustment_cents BIGINT NOT NULL DEFAULT 0,
|
|
191
|
+
interest_cents BIGINT NOT NULL DEFAULT 0,
|
|
192
|
+
owner_name TEXT NOT NULL DEFAULT '',
|
|
193
|
+
credit_limit_cents BIGINT,
|
|
194
|
+
statement_label TEXT NOT NULL DEFAULT '',
|
|
195
|
+
CHECK (previous_balance_cents - payments_cents + new_charges_cents - adjustment_cents + interest_cents = balance_cents)
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
CREATE TABLE "credit_card_transactions" (
|
|
199
|
+
transaction_key TEXT PRIMARY KEY,
|
|
200
|
+
statement_key TEXT NOT NULL,
|
|
201
|
+
transaction_date TEXT,
|
|
202
|
+
posting_date TEXT NOT NULL,
|
|
203
|
+
card_last_four TEXT NOT NULL CHECK (length(card_last_four) = 4),
|
|
204
|
+
description TEXT NOT NULL,
|
|
205
|
+
transaction_currency TEXT,
|
|
206
|
+
transaction_amount_cents BIGINT NOT NULL,
|
|
207
|
+
settlement_currency TEXT NOT NULL,
|
|
208
|
+
settlement_amount_cents BIGINT NOT NULL,
|
|
209
|
+
transaction_kind TEXT NOT NULL CHECK (transaction_kind IN ('charge', 'fee', 'refund', 'repayment', 'credit')),
|
|
210
|
+
occurrence BIGINT NOT NULL CHECK (occurrence > 0),
|
|
211
|
+
page_number BIGINT NOT NULL CHECK (page_number > 0),
|
|
212
|
+
end_page_number BIGINT NOT NULL CHECK (end_page_number >= page_number),
|
|
213
|
+
source_file TEXT NOT NULL,
|
|
214
|
+
source_sha256 TEXT NOT NULL,
|
|
215
|
+
first_batch_id TEXT NOT NULL,
|
|
216
|
+
last_batch_id TEXT NOT NULL,
|
|
217
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
218
|
+
original_amount_raw TEXT NOT NULL DEFAULT ''
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
CREATE TABLE event_links (
|
|
222
|
+
event_id TEXT NOT NULL,
|
|
223
|
+
target_type TEXT NOT NULL,
|
|
224
|
+
target_key TEXT NOT NULL,
|
|
225
|
+
role TEXT NOT NULL CHECK (role IN ('evidence', 'cost', 'travel', 'related')),
|
|
226
|
+
note TEXT,
|
|
227
|
+
created_at TEXT NOT NULL,
|
|
228
|
+
created_by TEXT NOT NULL,
|
|
229
|
+
updated_at TEXT NOT NULL,
|
|
230
|
+
updated_by TEXT NOT NULL,
|
|
231
|
+
deleted_at TEXT,
|
|
232
|
+
PRIMARY KEY (event_id, target_type, target_key)
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
CREATE TABLE event_participants (
|
|
236
|
+
event_id TEXT NOT NULL,
|
|
237
|
+
person_id TEXT NOT NULL,
|
|
238
|
+
role TEXT NOT NULL DEFAULT 'participant' CHECK (role IN ('participant', 'initiator', 'giver', 'receiver')),
|
|
239
|
+
created_at TEXT NOT NULL,
|
|
240
|
+
created_by TEXT NOT NULL,
|
|
241
|
+
updated_at TEXT NOT NULL,
|
|
242
|
+
updated_by TEXT NOT NULL,
|
|
243
|
+
deleted_at TEXT,
|
|
244
|
+
PRIMARY KEY (event_id, person_id, role)
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
CREATE TABLE events (
|
|
248
|
+
id TEXT PRIMARY KEY,
|
|
249
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
250
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
251
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
252
|
+
note TEXT,
|
|
253
|
+
created_at TEXT NOT NULL,
|
|
254
|
+
created_by TEXT NOT NULL,
|
|
255
|
+
updated_at TEXT NOT NULL,
|
|
256
|
+
updated_by TEXT NOT NULL,
|
|
257
|
+
deleted_at TEXT,
|
|
258
|
+
kind TEXT NOT NULL CHECK (kind IN (
|
|
259
|
+
'meetup', 'trip', 'date', 'conflict', 'reconcile', 'milestone', 'gift', 'first_time', 'family', 'life', 'other'
|
|
260
|
+
)),
|
|
261
|
+
title TEXT NOT NULL,
|
|
262
|
+
summary TEXT,
|
|
263
|
+
start_at TEXT NOT NULL,
|
|
264
|
+
end_at TEXT,
|
|
265
|
+
all_day SMALLINT NOT NULL DEFAULT 1 CHECK (all_day IN (0, 1)),
|
|
266
|
+
city TEXT,
|
|
267
|
+
place TEXT,
|
|
268
|
+
parent_event_id TEXT,
|
|
269
|
+
mood TEXT CHECK (mood IS NULL OR mood IN ('happy', 'sweet', 'neutral', 'tense', 'sad')),
|
|
270
|
+
origin TEXT NOT NULL DEFAULT 'manual',
|
|
271
|
+
CHECK (end_at IS NULL OR end_at >= start_at)
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
CREATE TABLE evidence_links (
|
|
275
|
+
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
276
|
+
subject_table TEXT NOT NULL,
|
|
277
|
+
subject_id TEXT NOT NULL,
|
|
278
|
+
source_type TEXT NOT NULL CHECK (source_type IN (
|
|
279
|
+
'message', 'sentence', 'recording', 'payment', 'order', 'order_item', 'ticket',
|
|
280
|
+
'journal', 'extraction', 'import_file', 'user_stated'
|
|
281
|
+
)),
|
|
282
|
+
source_key TEXT,
|
|
283
|
+
quote TEXT,
|
|
284
|
+
stance TEXT NOT NULL DEFAULT 'supports' CHECK (stance IN ('supports', 'contradicts')),
|
|
285
|
+
note TEXT,
|
|
286
|
+
created_at TEXT NOT NULL,
|
|
287
|
+
created_by TEXT NOT NULL,
|
|
288
|
+
deleted_at TEXT
|
|
289
|
+
);
|
|
290
|
+
|
|
291
|
+
CREATE TABLE families (
|
|
292
|
+
id TEXT PRIMARY KEY,
|
|
293
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
294
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
295
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
296
|
+
note TEXT,
|
|
297
|
+
created_at TEXT NOT NULL,
|
|
298
|
+
created_by TEXT NOT NULL,
|
|
299
|
+
updated_at TEXT NOT NULL,
|
|
300
|
+
updated_by TEXT NOT NULL,
|
|
301
|
+
deleted_at TEXT,
|
|
302
|
+
name TEXT NOT NULL,
|
|
303
|
+
family_type TEXT NOT NULL CHECK (family_type IN ('nuclear', 'family_of_origin', 'extended', 'newly_formed', 'household', 'custom')),
|
|
304
|
+
description TEXT,
|
|
305
|
+
anchor_person_id TEXT,
|
|
306
|
+
parent_family_id TEXT,
|
|
307
|
+
family_state TEXT NOT NULL DEFAULT 'active' CHECK (family_state IN ('active', 'historical')),
|
|
308
|
+
start_on TEXT,
|
|
309
|
+
end_on TEXT
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
CREATE TABLE family_members (
|
|
313
|
+
id TEXT PRIMARY KEY,
|
|
314
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
315
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
316
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
317
|
+
note TEXT,
|
|
318
|
+
created_at TEXT NOT NULL,
|
|
319
|
+
created_by TEXT NOT NULL,
|
|
320
|
+
updated_at TEXT NOT NULL,
|
|
321
|
+
updated_by TEXT NOT NULL,
|
|
322
|
+
deleted_at TEXT,
|
|
323
|
+
family_id TEXT NOT NULL,
|
|
324
|
+
person_id TEXT NOT NULL,
|
|
325
|
+
role TEXT NOT NULL CHECK (role IN (
|
|
326
|
+
'father', 'mother', 'son', 'daughter', 'grandfather', 'grandmother', 'spouse', 'other_relative', 'member'
|
|
327
|
+
)),
|
|
328
|
+
birth_order BIGINT CHECK (birth_order IS NULL OR birth_order > 0),
|
|
329
|
+
birth_order_basis TEXT CHECK (birth_order_basis IS NULL OR birth_order_basis IN ('biological', 'birth_date', 'family_defined', 'custom')),
|
|
330
|
+
generation BIGINT,
|
|
331
|
+
is_household_head SMALLINT NOT NULL DEFAULT 0 CHECK (is_household_head IN (0, 1)),
|
|
332
|
+
membership_type TEXT NOT NULL DEFAULT 'core' CHECK (membership_type IN ('core', 'extended', 'resident', 'historical')),
|
|
333
|
+
start_on TEXT,
|
|
334
|
+
end_on TEXT
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
CREATE TABLE gift_ideas (
|
|
338
|
+
id TEXT PRIMARY KEY,
|
|
339
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
340
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
341
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
342
|
+
note TEXT,
|
|
343
|
+
created_at TEXT NOT NULL,
|
|
344
|
+
created_by TEXT NOT NULL,
|
|
345
|
+
updated_at TEXT NOT NULL,
|
|
346
|
+
updated_by TEXT NOT NULL,
|
|
347
|
+
deleted_at TEXT,
|
|
348
|
+
for_person_id TEXT NOT NULL,
|
|
349
|
+
title TEXT NOT NULL,
|
|
350
|
+
occasion TEXT,
|
|
351
|
+
budget_cents BIGINT CHECK (budget_cents IS NULL OR budget_cents >= 0),
|
|
352
|
+
deadline_on TEXT,
|
|
353
|
+
wish_id TEXT,
|
|
354
|
+
idea_state TEXT NOT NULL DEFAULT 'planned' CHECK (idea_state IN ('planned', 'purchased', 'given', 'dismissed')),
|
|
355
|
+
purchase_type TEXT,
|
|
356
|
+
purchase_key TEXT,
|
|
357
|
+
given_event_id TEXT
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
CREATE TABLE health_events (
|
|
361
|
+
id TEXT PRIMARY KEY,
|
|
362
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
363
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
364
|
+
sensitivity TEXT NOT NULL DEFAULT 'private' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
365
|
+
note TEXT,
|
|
366
|
+
created_at TEXT NOT NULL,
|
|
367
|
+
created_by TEXT NOT NULL,
|
|
368
|
+
updated_at TEXT NOT NULL,
|
|
369
|
+
updated_by TEXT NOT NULL,
|
|
370
|
+
deleted_at TEXT,
|
|
371
|
+
person_id TEXT NOT NULL,
|
|
372
|
+
kind TEXT NOT NULL CHECK (kind IN ('symptom', 'illness', 'injury', 'medication', 'checkup', 'test_result', 'pregnancy_test', 'other')),
|
|
373
|
+
title TEXT NOT NULL,
|
|
374
|
+
detail TEXT,
|
|
375
|
+
occurred_on TEXT NOT NULL,
|
|
376
|
+
occurred_at TEXT,
|
|
377
|
+
ended_on TEXT,
|
|
378
|
+
outcome TEXT,
|
|
379
|
+
case_state TEXT NOT NULL DEFAULT 'closed' CHECK (case_state IN ('open', 'closed'))
|
|
380
|
+
);
|
|
381
|
+
|
|
382
|
+
CREATE TABLE identities (
|
|
383
|
+
id TEXT PRIMARY KEY,
|
|
384
|
+
source TEXT NOT NULL,
|
|
385
|
+
match_kind TEXT NOT NULL CHECK (match_kind IN ('account_id', 'counterparty', 'receiver', 'phone', 'passenger', 'nickname')),
|
|
386
|
+
"value" TEXT NOT NULL,
|
|
387
|
+
match_mode TEXT NOT NULL DEFAULT 'exact' CHECK (match_mode IN ('exact', 'contains', 'regex')),
|
|
388
|
+
person_id TEXT NOT NULL,
|
|
389
|
+
valid_from TEXT,
|
|
390
|
+
valid_to TEXT,
|
|
391
|
+
created_at TEXT NOT NULL,
|
|
392
|
+
created_by TEXT NOT NULL,
|
|
393
|
+
updated_at TEXT NOT NULL,
|
|
394
|
+
updated_by TEXT NOT NULL,
|
|
395
|
+
deleted_at TEXT
|
|
396
|
+
);
|
|
397
|
+
|
|
398
|
+
CREATE TABLE "import_batches" (
|
|
399
|
+
id TEXT PRIMARY KEY,
|
|
400
|
+
source_kind TEXT NOT NULL CHECK (source_kind IN (
|
|
401
|
+
'wechat_chat', 'audio_db', 'alipay', 'wechatpay', 'jd', 'taobao', 'pdd',
|
|
402
|
+
'meituan', 'taobao_takeout', 'train12306', 'manual_ledger', 'legacy_md',
|
|
403
|
+
'citic_credit_card', 'citic_debit_card', 'cmb_debit_card', 'cmb_credit_card', 'bocom_debit_card'
|
|
404
|
+
)),
|
|
405
|
+
importer_version TEXT NOT NULL,
|
|
406
|
+
file_count BIGINT NOT NULL CHECK (file_count >= 0),
|
|
407
|
+
coverage_from TEXT, coverage_to TEXT, started_at TEXT NOT NULL, finished_at TEXT,
|
|
408
|
+
status TEXT NOT NULL CHECK (status IN ('running', 'succeeded', 'failed', 'rolled_back', 'rejected')),
|
|
409
|
+
rows_seen BIGINT NOT NULL DEFAULT 0 CHECK (rows_seen >= 0),
|
|
410
|
+
rows_new BIGINT NOT NULL DEFAULT 0 CHECK (rows_new >= 0),
|
|
411
|
+
rows_changed BIGINT NOT NULL DEFAULT 0 CHECK (rows_changed >= 0),
|
|
412
|
+
rows_missing BIGINT NOT NULL DEFAULT 0 CHECK (rows_missing >= 0),
|
|
413
|
+
report_json TEXT NOT NULL DEFAULT '{}' CHECK (vault_json_valid(report_json)),
|
|
414
|
+
actor TEXT NOT NULL
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
CREATE TABLE import_changes (
|
|
418
|
+
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
419
|
+
batch_id TEXT NOT NULL,
|
|
420
|
+
table_name TEXT NOT NULL,
|
|
421
|
+
row_key TEXT NOT NULL,
|
|
422
|
+
change_kind TEXT NOT NULL CHECK (change_kind IN ('updated', 'missing', 'reappeared', 'recalled', 'retranscribed')),
|
|
423
|
+
field TEXT,
|
|
424
|
+
old_value TEXT,
|
|
425
|
+
new_value TEXT
|
|
426
|
+
);
|
|
427
|
+
|
|
428
|
+
CREATE TABLE import_files (
|
|
429
|
+
batch_id TEXT NOT NULL,
|
|
430
|
+
file_sha256 TEXT NOT NULL,
|
|
431
|
+
file_name TEXT NOT NULL,
|
|
432
|
+
file_size BIGINT NOT NULL CHECK (file_size >= 0),
|
|
433
|
+
file_role TEXT NOT NULL DEFAULT 'main',
|
|
434
|
+
archived_path TEXT NOT NULL,
|
|
435
|
+
rows_seen BIGINT NOT NULL DEFAULT 0 CHECK (rows_seen >= 0),
|
|
436
|
+
skipped SMALLINT NOT NULL DEFAULT 0 CHECK (skipped IN (0, 1)),
|
|
437
|
+
PRIMARY KEY (batch_id, file_sha256)
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
CREATE TABLE important_dates (
|
|
441
|
+
id TEXT PRIMARY KEY,
|
|
442
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
443
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
444
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
445
|
+
note TEXT,
|
|
446
|
+
created_at TEXT NOT NULL,
|
|
447
|
+
created_by TEXT NOT NULL,
|
|
448
|
+
updated_at TEXT NOT NULL,
|
|
449
|
+
updated_by TEXT NOT NULL,
|
|
450
|
+
deleted_at TEXT,
|
|
451
|
+
person_id TEXT,
|
|
452
|
+
kind TEXT NOT NULL CHECK (kind IN ('birthday', 'anniversary', 'memorial', 'holiday', 'custom')),
|
|
453
|
+
title TEXT NOT NULL,
|
|
454
|
+
calendar TEXT NOT NULL DEFAULT 'solar' CHECK (calendar IN ('solar', 'lunar')),
|
|
455
|
+
date_value TEXT NOT NULL,
|
|
456
|
+
first_on TEXT,
|
|
457
|
+
recurrence TEXT NOT NULL DEFAULT 'yearly' CHECK (recurrence IN ('none', 'yearly')),
|
|
458
|
+
remind_days_before BIGINT CHECK (remind_days_before IS NULL OR remind_days_before >= 0)
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
CREATE TABLE intimacy_events (
|
|
462
|
+
id TEXT PRIMARY KEY,
|
|
463
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
464
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
465
|
+
sensitivity TEXT NOT NULL DEFAULT 'intimate' CHECK (sensitivity = 'intimate'),
|
|
466
|
+
note TEXT,
|
|
467
|
+
created_at TEXT NOT NULL,
|
|
468
|
+
created_by TEXT NOT NULL,
|
|
469
|
+
updated_at TEXT NOT NULL,
|
|
470
|
+
updated_by TEXT NOT NULL,
|
|
471
|
+
deleted_at TEXT,
|
|
472
|
+
person_id TEXT NOT NULL,
|
|
473
|
+
partner_id TEXT NOT NULL,
|
|
474
|
+
occurred_at TEXT NOT NULL,
|
|
475
|
+
time_known SMALLINT NOT NULL DEFAULT 1 CHECK (time_known IN (0, 1)),
|
|
476
|
+
duration_minutes BIGINT CHECK (duration_minutes IS NULL OR duration_minutes > 0),
|
|
477
|
+
location_type TEXT CHECK (location_type IS NULL OR location_type IN ('hotel', 'home', 'travel', 'car', 'outdoor', 'other')),
|
|
478
|
+
location_name TEXT,
|
|
479
|
+
contraception TEXT NOT NULL CHECK (contraception IN ('condom', 'none', 'pill', 'emergency_pill', 'withdrawal', 'unknown')),
|
|
480
|
+
protection_detail TEXT,
|
|
481
|
+
fully_protected BIGINT CHECK (fully_protected IS NULL OR fully_protected IN (0, 1)),
|
|
482
|
+
completion TEXT NOT NULL DEFAULT 'completed' CHECK (completion IN ('completed', 'interrupted', 'attempted')),
|
|
483
|
+
ejaculation TEXT CHECK (ejaculation IS NULL OR ejaculation IN ('inside_condom', 'outside', 'inside', 'none', 'other')),
|
|
484
|
+
details_json TEXT NOT NULL DEFAULT '{}' CHECK (vault_json_valid(details_json)),
|
|
485
|
+
her_discomfort BIGINT CHECK (her_discomfort IS NULL OR her_discomfort IN (0, 1)),
|
|
486
|
+
her_discomfort_desc TEXT,
|
|
487
|
+
her_feedback TEXT,
|
|
488
|
+
is_first_time SMALLINT NOT NULL DEFAULT 0 CHECK (is_first_time IN (0, 1)),
|
|
489
|
+
summary TEXT,
|
|
490
|
+
raw_dictation TEXT
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
CREATE TABLE journal_entries (
|
|
494
|
+
id TEXT PRIMARY KEY,
|
|
495
|
+
author_id TEXT NOT NULL,
|
|
496
|
+
about_person_id TEXT,
|
|
497
|
+
written_at TEXT NOT NULL,
|
|
498
|
+
happened_on TEXT,
|
|
499
|
+
title TEXT NOT NULL,
|
|
500
|
+
content TEXT NOT NULL,
|
|
501
|
+
category TEXT NOT NULL DEFAULT 'daily' CHECK (category IN (
|
|
502
|
+
'daily', 'emotion', 'preference', 'conflict', 'gift', 'health', 'family', 'intimacy', 'other'
|
|
503
|
+
)),
|
|
504
|
+
mood_polarity TEXT CHECK (mood_polarity IS NULL OR mood_polarity IN ('positive', 'neutral', 'negative', 'conflict')),
|
|
505
|
+
tags_json TEXT NOT NULL DEFAULT '[]' CHECK (vault_json_valid(tags_json)),
|
|
506
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
507
|
+
origin TEXT NOT NULL CHECK (origin IN ('h5', 'cli', 'legacy_md', 'ai_dictation')),
|
|
508
|
+
created_at TEXT NOT NULL,
|
|
509
|
+
created_by TEXT NOT NULL,
|
|
510
|
+
updated_at TEXT NOT NULL,
|
|
511
|
+
updated_by TEXT NOT NULL,
|
|
512
|
+
deleted_at TEXT
|
|
513
|
+
);
|
|
514
|
+
|
|
515
|
+
CREATE TABLE labels (
|
|
516
|
+
id TEXT PRIMARY KEY,
|
|
517
|
+
target_type TEXT NOT NULL,
|
|
518
|
+
target_key TEXT NOT NULL,
|
|
519
|
+
kind TEXT NOT NULL CHECK (kind IN ('category', 'hidden', 'sensitivity', 'topic', 'mood', 'flag')),
|
|
520
|
+
"value" TEXT NOT NULL,
|
|
521
|
+
note TEXT,
|
|
522
|
+
basis TEXT NOT NULL DEFAULT 'manual',
|
|
523
|
+
created_at TEXT NOT NULL,
|
|
524
|
+
created_by TEXT NOT NULL,
|
|
525
|
+
updated_at TEXT NOT NULL,
|
|
526
|
+
updated_by TEXT NOT NULL,
|
|
527
|
+
deleted_at TEXT
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
CREATE TABLE menstrual_cycles (
|
|
531
|
+
id TEXT PRIMARY KEY,
|
|
532
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
533
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
534
|
+
sensitivity TEXT NOT NULL DEFAULT 'private' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
535
|
+
note TEXT,
|
|
536
|
+
created_at TEXT NOT NULL,
|
|
537
|
+
created_by TEXT NOT NULL,
|
|
538
|
+
updated_at TEXT NOT NULL,
|
|
539
|
+
updated_by TEXT NOT NULL,
|
|
540
|
+
deleted_at TEXT,
|
|
541
|
+
person_id TEXT NOT NULL,
|
|
542
|
+
start_on TEXT NOT NULL,
|
|
543
|
+
start_time TEXT,
|
|
544
|
+
end_on TEXT,
|
|
545
|
+
end_time TEXT,
|
|
546
|
+
flow_level TEXT CHECK (flow_level IS NULL OR flow_level IN ('spotting', 'light', 'medium', 'heavy', 'unspecified')),
|
|
547
|
+
pain_level TEXT CHECK (pain_level IS NULL OR pain_level IN ('none', 'mild', 'moderate', 'severe', 'unspecified')),
|
|
548
|
+
symptoms TEXT,
|
|
549
|
+
color_texture TEXT,
|
|
550
|
+
trigger_context TEXT,
|
|
551
|
+
CHECK (end_on IS NULL OR end_on >= start_on)
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
CREATE TABLE menstrual_daily_logs (
|
|
555
|
+
id TEXT PRIMARY KEY,
|
|
556
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
557
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
558
|
+
sensitivity TEXT NOT NULL DEFAULT 'private' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
559
|
+
note TEXT,
|
|
560
|
+
created_at TEXT NOT NULL,
|
|
561
|
+
created_by TEXT NOT NULL,
|
|
562
|
+
updated_at TEXT NOT NULL,
|
|
563
|
+
updated_by TEXT NOT NULL,
|
|
564
|
+
deleted_at TEXT,
|
|
565
|
+
person_id TEXT NOT NULL,
|
|
566
|
+
log_on TEXT NOT NULL,
|
|
567
|
+
cycle_id TEXT,
|
|
568
|
+
flow_level TEXT CHECK (flow_level IS NULL OR flow_level IN ('none', 'spotting', 'light', 'medium', 'heavy', 'gush', 'unspecified')),
|
|
569
|
+
pain_level TEXT CHECK (pain_level IS NULL OR pain_level IN ('none', 'mild', 'moderate', 'severe', 'unbearable', 'unspecified')),
|
|
570
|
+
symptoms TEXT,
|
|
571
|
+
diet_and_triggers TEXT,
|
|
572
|
+
relief_measures TEXT,
|
|
573
|
+
mood TEXT CHECK (mood IS NULL OR mood IN ('calm', 'sensitive', 'irritable', 'depressed', 'tired', 'unspecified'))
|
|
574
|
+
);
|
|
575
|
+
|
|
576
|
+
CREATE TABLE order_items (
|
|
577
|
+
platform TEXT NOT NULL,
|
|
578
|
+
order_no TEXT NOT NULL,
|
|
579
|
+
item_key TEXT NOT NULL,
|
|
580
|
+
line_no BIGINT NOT NULL CHECK (line_no >= 1),
|
|
581
|
+
product_id TEXT,
|
|
582
|
+
product_name TEXT NOT NULL,
|
|
583
|
+
spec TEXT,
|
|
584
|
+
quantity BIGINT CHECK (quantity IS NULL OR quantity > 0),
|
|
585
|
+
unit_price_cents BIGINT CHECK (unit_price_cents IS NULL OR unit_price_cents >= 0),
|
|
586
|
+
item_amount_cents BIGINT CHECK (item_amount_cents IS NULL OR item_amount_cents >= 0),
|
|
587
|
+
item_status TEXT,
|
|
588
|
+
first_batch_id TEXT NOT NULL,
|
|
589
|
+
last_batch_id TEXT NOT NULL,
|
|
590
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)), product_link TEXT,
|
|
591
|
+
PRIMARY KEY (platform, order_no, item_key)
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
CREATE TABLE orders (
|
|
595
|
+
platform TEXT NOT NULL CHECK (platform IN ('jd', 'taobao', 'pdd', 'meituan', 'taobao_takeout', 'douyin', 'other')),
|
|
596
|
+
order_no TEXT NOT NULL,
|
|
597
|
+
ordered_at TEXT,
|
|
598
|
+
paid_at TEXT,
|
|
599
|
+
shipped_at TEXT,
|
|
600
|
+
confirmed_at TEXT,
|
|
601
|
+
status TEXT,
|
|
602
|
+
shop_name TEXT,
|
|
603
|
+
total_paid_cents BIGINT CHECK (total_paid_cents IS NULL OR total_paid_cents >= 0),
|
|
604
|
+
goods_total_cents BIGINT CHECK (goods_total_cents IS NULL OR goods_total_cents >= 0),
|
|
605
|
+
discount_cents BIGINT CHECK (discount_cents IS NULL OR discount_cents >= 0),
|
|
606
|
+
shipping_cents BIGINT CHECK (shipping_cents IS NULL OR shipping_cents >= 0),
|
|
607
|
+
pay_method TEXT,
|
|
608
|
+
pay_channel TEXT,
|
|
609
|
+
receiver_name TEXT,
|
|
610
|
+
receiver_phone TEXT,
|
|
611
|
+
receiver_phone_masked SMALLINT NOT NULL DEFAULT 0 CHECK (receiver_phone_masked IN (0, 1)),
|
|
612
|
+
receiver_region TEXT,
|
|
613
|
+
receiver_address TEXT,
|
|
614
|
+
logistics_company TEXT,
|
|
615
|
+
tracking_no TEXT,
|
|
616
|
+
first_batch_id TEXT NOT NULL,
|
|
617
|
+
last_batch_id TEXT NOT NULL,
|
|
618
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
619
|
+
PRIMARY KEY (platform, order_no)
|
|
620
|
+
);
|
|
621
|
+
|
|
622
|
+
CREATE TABLE payment_order_links (
|
|
623
|
+
payment_platform TEXT NOT NULL,
|
|
624
|
+
payment_txn_id TEXT NOT NULL,
|
|
625
|
+
order_platform TEXT NOT NULL,
|
|
626
|
+
order_no TEXT NOT NULL,
|
|
627
|
+
match_method TEXT NOT NULL CHECK (match_method IN ('trade_no', 'merchant_order_no', 'amount_time', 'manual')),
|
|
628
|
+
confidence TEXT NOT NULL CHECK (confidence IN ('high', 'medium', 'low')),
|
|
629
|
+
created_at TEXT NOT NULL,
|
|
630
|
+
created_by TEXT NOT NULL,
|
|
631
|
+
updated_at TEXT NOT NULL,
|
|
632
|
+
updated_by TEXT NOT NULL,
|
|
633
|
+
deleted_at TEXT,
|
|
634
|
+
PRIMARY KEY (payment_platform, payment_txn_id, order_platform, order_no)
|
|
635
|
+
);
|
|
636
|
+
|
|
637
|
+
CREATE TABLE payments (
|
|
638
|
+
platform TEXT NOT NULL CHECK (platform IN ('alipay', 'wechatpay')),
|
|
639
|
+
txn_id TEXT NOT NULL,
|
|
640
|
+
occurred_at TEXT NOT NULL,
|
|
641
|
+
direction TEXT NOT NULL CHECK (direction IN ('expense', 'income', 'neutral')),
|
|
642
|
+
direction_raw TEXT NOT NULL,
|
|
643
|
+
amount_cents BIGINT NOT NULL CHECK (amount_cents >= 0),
|
|
644
|
+
counterparty TEXT,
|
|
645
|
+
counterparty_account TEXT,
|
|
646
|
+
item_desc TEXT,
|
|
647
|
+
txn_type TEXT,
|
|
648
|
+
platform_category TEXT,
|
|
649
|
+
pay_method TEXT,
|
|
650
|
+
status TEXT NOT NULL,
|
|
651
|
+
refund_cents BIGINT CHECK (refund_cents IS NULL OR refund_cents >= 0),
|
|
652
|
+
merchant_order_no TEXT,
|
|
653
|
+
remark TEXT,
|
|
654
|
+
first_batch_id TEXT NOT NULL,
|
|
655
|
+
last_batch_id TEXT NOT NULL,
|
|
656
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json)),
|
|
657
|
+
PRIMARY KEY (platform, txn_id)
|
|
658
|
+
);
|
|
659
|
+
|
|
660
|
+
CREATE TABLE person_aliases (
|
|
661
|
+
person_id TEXT NOT NULL,
|
|
662
|
+
alias TEXT NOT NULL CHECK (length(trim(alias)) > 0),
|
|
663
|
+
for_transcript SMALLINT NOT NULL DEFAULT 0 CHECK (for_transcript IN (0, 1)),
|
|
664
|
+
created_at TEXT NOT NULL,
|
|
665
|
+
created_by TEXT NOT NULL,
|
|
666
|
+
updated_at TEXT NOT NULL,
|
|
667
|
+
updated_by TEXT NOT NULL,
|
|
668
|
+
deleted_at TEXT,
|
|
669
|
+
PRIMARY KEY (person_id, alias)
|
|
670
|
+
);
|
|
671
|
+
|
|
672
|
+
CREATE TABLE persons (
|
|
673
|
+
id TEXT PRIMARY KEY CHECK (
|
|
674
|
+
length(id) > 0
|
|
675
|
+
AND id = lower(id)
|
|
676
|
+
AND id !~ '[^a-z0-9-]'
|
|
677
|
+
AND id !~ '^-'
|
|
678
|
+
AND id !~ '-$'
|
|
679
|
+
AND id !~ '--'
|
|
680
|
+
),
|
|
681
|
+
display_name TEXT NOT NULL,
|
|
682
|
+
legal_name TEXT,
|
|
683
|
+
gender TEXT CHECK (gender IS NULL OR gender IN ('female', 'male', 'unknown')),
|
|
684
|
+
birth_on TEXT,
|
|
685
|
+
birth_year BIGINT CHECK (birth_year IS NULL OR (birth_year BETWEEN 1900 AND 2100)),
|
|
686
|
+
lunar_birthday TEXT,
|
|
687
|
+
role TEXT NOT NULL CHECK (role IN ('self', 'partner', 'family', 'friend', 'colleague', 'other')),
|
|
688
|
+
is_self SMALLINT NOT NULL DEFAULT 0 CHECK (is_self IN (0, 1)),
|
|
689
|
+
is_default SMALLINT NOT NULL DEFAULT 0 CHECK (is_default IN (0, 1)),
|
|
690
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
691
|
+
note TEXT,
|
|
692
|
+
created_at TEXT NOT NULL,
|
|
693
|
+
created_by TEXT NOT NULL,
|
|
694
|
+
updated_at TEXT NOT NULL,
|
|
695
|
+
updated_by TEXT NOT NULL,
|
|
696
|
+
deleted_at TEXT, education_level TEXT, graduation_school TEXT, graduation_date TEXT,
|
|
697
|
+
CHECK (is_self = 0 OR role = 'self')
|
|
698
|
+
);
|
|
699
|
+
|
|
700
|
+
CREATE TABLE preferences (
|
|
701
|
+
id TEXT PRIMARY KEY,
|
|
702
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
703
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
704
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
705
|
+
note TEXT,
|
|
706
|
+
created_at TEXT NOT NULL,
|
|
707
|
+
created_by TEXT NOT NULL,
|
|
708
|
+
updated_at TEXT NOT NULL,
|
|
709
|
+
updated_by TEXT NOT NULL,
|
|
710
|
+
deleted_at TEXT,
|
|
711
|
+
person_id TEXT NOT NULL,
|
|
712
|
+
domain TEXT NOT NULL CHECK (domain IN ('food', 'drink', 'gift', 'place', 'style', 'activity', 'media', 'other')),
|
|
713
|
+
item TEXT NOT NULL,
|
|
714
|
+
subcategory TEXT,
|
|
715
|
+
polarity TEXT NOT NULL CHECK (polarity IN ('like', 'dislike', 'forbidden', 'conditioned', 'neutral')),
|
|
716
|
+
strength TEXT CHECK (strength IS NULL OR strength IN ('extreme', 'high', 'moderate', 'low')),
|
|
717
|
+
details_json TEXT NOT NULL DEFAULT '{}' CHECK (vault_json_valid(details_json)),
|
|
718
|
+
first_noted_on TEXT,
|
|
719
|
+
last_noted_on TEXT
|
|
720
|
+
);
|
|
721
|
+
|
|
722
|
+
CREATE TABLE private_profiles (
|
|
723
|
+
person_id TEXT PRIMARY KEY,
|
|
724
|
+
phone TEXT,
|
|
725
|
+
email TEXT,
|
|
726
|
+
home_address TEXT,
|
|
727
|
+
work_address TEXT,
|
|
728
|
+
marital_status TEXT CHECK (marital_status IS NULL OR marital_status IN ('unmarried', 'married', 'divorced', 'widowed', 'unknown')),
|
|
729
|
+
monthly_income_cents BIGINT CHECK (monthly_income_cents IS NULL OR monthly_income_cents >= 0),
|
|
730
|
+
emergency_contact_json TEXT CHECK (emergency_contact_json IS NULL OR vault_json_valid(emergency_contact_json)),
|
|
731
|
+
created_at TEXT NOT NULL,
|
|
732
|
+
created_by TEXT NOT NULL,
|
|
733
|
+
updated_at TEXT NOT NULL,
|
|
734
|
+
updated_by TEXT NOT NULL,
|
|
735
|
+
deleted_at TEXT
|
|
736
|
+
, id_number TEXT);
|
|
737
|
+
|
|
738
|
+
CREATE TABLE profile_facts (
|
|
739
|
+
id TEXT PRIMARY KEY,
|
|
740
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
741
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
742
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
743
|
+
note TEXT,
|
|
744
|
+
created_at TEXT NOT NULL,
|
|
745
|
+
created_by TEXT NOT NULL,
|
|
746
|
+
updated_at TEXT NOT NULL,
|
|
747
|
+
updated_by TEXT NOT NULL,
|
|
748
|
+
deleted_at TEXT,
|
|
749
|
+
person_id TEXT NOT NULL,
|
|
750
|
+
attribute TEXT NOT NULL,
|
|
751
|
+
"value" TEXT NOT NULL,
|
|
752
|
+
value_num DOUBLE PRECISION,
|
|
753
|
+
valid_from TEXT,
|
|
754
|
+
valid_to TEXT
|
|
755
|
+
);
|
|
756
|
+
|
|
757
|
+
CREATE TABLE promise_checks (
|
|
758
|
+
id TEXT PRIMARY KEY,
|
|
759
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
760
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
761
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
762
|
+
note TEXT,
|
|
763
|
+
created_at TEXT NOT NULL,
|
|
764
|
+
created_by TEXT NOT NULL,
|
|
765
|
+
updated_at TEXT NOT NULL,
|
|
766
|
+
updated_by TEXT NOT NULL,
|
|
767
|
+
deleted_at TEXT,
|
|
768
|
+
promise_id TEXT NOT NULL,
|
|
769
|
+
checked_on TEXT NOT NULL,
|
|
770
|
+
result TEXT NOT NULL CHECK (result IN ('kept', 'partial', 'broken')),
|
|
771
|
+
detail TEXT
|
|
772
|
+
);
|
|
773
|
+
|
|
774
|
+
CREATE TABLE promises (
|
|
775
|
+
id TEXT PRIMARY KEY,
|
|
776
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
777
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
778
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
779
|
+
note TEXT,
|
|
780
|
+
created_at TEXT NOT NULL,
|
|
781
|
+
created_by TEXT NOT NULL,
|
|
782
|
+
updated_at TEXT NOT NULL,
|
|
783
|
+
updated_by TEXT NOT NULL,
|
|
784
|
+
deleted_at TEXT,
|
|
785
|
+
promiser_id TEXT NOT NULL,
|
|
786
|
+
recipient_id TEXT NOT NULL,
|
|
787
|
+
is_mutual SMALLINT NOT NULL DEFAULT 0 CHECK (is_mutual IN (0, 1)),
|
|
788
|
+
title TEXT NOT NULL,
|
|
789
|
+
content TEXT NOT NULL,
|
|
790
|
+
category TEXT NOT NULL CHECK (category IN (
|
|
791
|
+
'daily_habit', 'task_action', 'gift_wish', 'travel_date', 'life_milestone', 'emotional_rule', 'other'
|
|
792
|
+
)),
|
|
793
|
+
frequency TEXT NOT NULL DEFAULT 'permanent' CHECK (frequency IN ('daily', 'weekly', 'monthly', 'one_off', 'permanent', 'situational')),
|
|
794
|
+
priority TEXT NOT NULL DEFAULT 'high' CHECK (priority IN ('critical', 'high', 'medium', 'low')),
|
|
795
|
+
promised_on TEXT NOT NULL,
|
|
796
|
+
promised_at TEXT,
|
|
797
|
+
due_on TEXT,
|
|
798
|
+
fulfillment TEXT NOT NULL DEFAULT 'active' CHECK (fulfillment IN ('active', 'pending', 'fulfilled', 'broken', 'cancelled')),
|
|
799
|
+
fulfilled_at TEXT
|
|
800
|
+
);
|
|
801
|
+
|
|
802
|
+
CREATE TABLE relations (
|
|
803
|
+
id TEXT PRIMARY KEY,
|
|
804
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
805
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
806
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
807
|
+
note TEXT,
|
|
808
|
+
created_at TEXT NOT NULL,
|
|
809
|
+
created_by TEXT NOT NULL,
|
|
810
|
+
updated_at TEXT NOT NULL,
|
|
811
|
+
updated_by TEXT NOT NULL,
|
|
812
|
+
deleted_at TEXT,
|
|
813
|
+
from_person_id TEXT NOT NULL,
|
|
814
|
+
to_person_id TEXT NOT NULL,
|
|
815
|
+
relation TEXT NOT NULL CHECK (relation IN ('partner', 'family', 'friend', 'colleague', 'knows')),
|
|
816
|
+
relation_name TEXT,
|
|
817
|
+
inverse_relation_name TEXT,
|
|
818
|
+
family_branch TEXT CHECK (family_branch IS NULL OR family_branch IN (
|
|
819
|
+
'paternal', 'maternal', 'partner_paternal', 'partner_maternal', 'peer', 'in_law', 'social', 'other'
|
|
820
|
+
)),
|
|
821
|
+
closeness TEXT CHECK (closeness IS NULL OR closeness IN ('core', 'close', 'normal', 'distant')),
|
|
822
|
+
circle TEXT,
|
|
823
|
+
is_bidirectional SMALLINT NOT NULL DEFAULT 1 CHECK (is_bidirectional IN (0, 1)),
|
|
824
|
+
since_on TEXT,
|
|
825
|
+
until_on TEXT,
|
|
826
|
+
CHECK (from_person_id != to_person_id),
|
|
827
|
+
CHECK (until_on IS NULL OR since_on IS NULL OR until_on >= since_on)
|
|
828
|
+
);
|
|
829
|
+
|
|
830
|
+
CREATE TABLE schema_migrations (
|
|
831
|
+
version BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
832
|
+
name TEXT NOT NULL,
|
|
833
|
+
checksum TEXT NOT NULL,
|
|
834
|
+
applied_at TEXT NOT NULL,
|
|
835
|
+
duration_ms BIGINT NOT NULL CHECK (duration_ms >= 0)
|
|
836
|
+
);
|
|
837
|
+
|
|
838
|
+
CREATE TABLE search_docs (
|
|
839
|
+
doc_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
|
840
|
+
source_type TEXT NOT NULL,
|
|
841
|
+
source_key TEXT NOT NULL,
|
|
842
|
+
person_id TEXT,
|
|
843
|
+
occurred_at TEXT,
|
|
844
|
+
title TEXT,
|
|
845
|
+
body TEXT NOT NULL,
|
|
846
|
+
sensitivity TEXT NOT NULL CHECK (sensitivity IN ('normal', 'private', 'intimate'))
|
|
847
|
+
);
|
|
848
|
+
|
|
849
|
+
CREATE TABLE settings (
|
|
850
|
+
"key" TEXT PRIMARY KEY,
|
|
851
|
+
value_json TEXT NOT NULL CHECK (vault_json_valid(value_json)),
|
|
852
|
+
updated_at TEXT NOT NULL
|
|
853
|
+
);
|
|
854
|
+
|
|
855
|
+
CREATE TABLE todos (
|
|
856
|
+
id TEXT PRIMARY KEY,
|
|
857
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
858
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
859
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
860
|
+
note TEXT,
|
|
861
|
+
created_at TEXT NOT NULL,
|
|
862
|
+
created_by TEXT NOT NULL,
|
|
863
|
+
updated_at TEXT NOT NULL,
|
|
864
|
+
updated_by TEXT NOT NULL,
|
|
865
|
+
deleted_at TEXT,
|
|
866
|
+
owner_id TEXT NOT NULL,
|
|
867
|
+
related_person_id TEXT,
|
|
868
|
+
title TEXT NOT NULL,
|
|
869
|
+
detail TEXT,
|
|
870
|
+
due_on TEXT,
|
|
871
|
+
todo_state TEXT NOT NULL DEFAULT 'open' CHECK (todo_state IN ('open', 'doing', 'done', 'dropped')),
|
|
872
|
+
done_at TEXT
|
|
873
|
+
);
|
|
874
|
+
|
|
875
|
+
CREATE TABLE train_tickets (
|
|
876
|
+
ticket_key TEXT PRIMARY KEY,
|
|
877
|
+
order_no TEXT NOT NULL,
|
|
878
|
+
record_type TEXT NOT NULL CHECK (record_type IN ('purchase', 'refund', 'change', 'waitlist_fulfilled', 'waitlist_refund', 'other')),
|
|
879
|
+
record_type_raw TEXT NOT NULL,
|
|
880
|
+
passenger_name TEXT NOT NULL,
|
|
881
|
+
depart_at TEXT,
|
|
882
|
+
mail_at TEXT,
|
|
883
|
+
from_station TEXT,
|
|
884
|
+
to_station TEXT,
|
|
885
|
+
train_code TEXT,
|
|
886
|
+
seat_no TEXT,
|
|
887
|
+
seat_class TEXT,
|
|
888
|
+
price_cents BIGINT CHECK (price_cents IS NULL OR price_cents >= 0),
|
|
889
|
+
refund_fee_cents BIGINT CHECK (refund_fee_cents IS NULL OR refund_fee_cents >= 0),
|
|
890
|
+
refund_cents BIGINT CHECK (refund_cents IS NULL OR refund_cents >= 0),
|
|
891
|
+
status TEXT,
|
|
892
|
+
first_batch_id TEXT NOT NULL,
|
|
893
|
+
last_batch_id TEXT NOT NULL,
|
|
894
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
895
|
+
);
|
|
896
|
+
|
|
897
|
+
CREATE TABLE wechat_messages (
|
|
898
|
+
msg_id TEXT PRIMARY KEY,
|
|
899
|
+
session_key TEXT NOT NULL,
|
|
900
|
+
sent_at TEXT NOT NULL,
|
|
901
|
+
sent_ts BIGINT NOT NULL,
|
|
902
|
+
sender_platform_id TEXT NOT NULL,
|
|
903
|
+
sender_name TEXT,
|
|
904
|
+
msg_type BIGINT NOT NULL,
|
|
905
|
+
content TEXT,
|
|
906
|
+
clean_text TEXT,
|
|
907
|
+
media_url TEXT,
|
|
908
|
+
recalled SMALLINT NOT NULL DEFAULT 0 CHECK (recalled IN (0, 1)),
|
|
909
|
+
first_batch_id TEXT NOT NULL,
|
|
910
|
+
last_batch_id TEXT NOT NULL,
|
|
911
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
912
|
+
);
|
|
913
|
+
|
|
914
|
+
CREATE TABLE wechat_sessions (
|
|
915
|
+
session_key TEXT PRIMARY KEY,
|
|
916
|
+
platform TEXT NOT NULL DEFAULT 'wechat',
|
|
917
|
+
session_type TEXT NOT NULL CHECK (session_type IN ('private', 'group', 'other')),
|
|
918
|
+
name TEXT NOT NULL,
|
|
919
|
+
owner_platform_id TEXT NOT NULL,
|
|
920
|
+
peer_platform_id TEXT,
|
|
921
|
+
members_json TEXT NOT NULL DEFAULT '[]' CHECK (vault_json_valid(members_json)),
|
|
922
|
+
generator TEXT,
|
|
923
|
+
generator_version TEXT,
|
|
924
|
+
exported_ts BIGINT,
|
|
925
|
+
first_batch_id TEXT NOT NULL,
|
|
926
|
+
last_batch_id TEXT NOT NULL,
|
|
927
|
+
raw_json TEXT NOT NULL CHECK (vault_json_valid(raw_json))
|
|
928
|
+
);
|
|
929
|
+
|
|
930
|
+
CREATE TABLE wiki_pages (
|
|
931
|
+
slug TEXT PRIMARY KEY,
|
|
932
|
+
module TEXT NOT NULL CHECK (module IN ('me', 'her', 'us', 'global')),
|
|
933
|
+
title TEXT NOT NULL,
|
|
934
|
+
body_md TEXT NOT NULL,
|
|
935
|
+
current_rev BIGINT NOT NULL,
|
|
936
|
+
page_state TEXT NOT NULL DEFAULT 'published' CHECK (page_state IN ('draft', 'published', 'archived')),
|
|
937
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
938
|
+
created_at TEXT NOT NULL,
|
|
939
|
+
created_by TEXT NOT NULL,
|
|
940
|
+
updated_at TEXT NOT NULL,
|
|
941
|
+
updated_by TEXT NOT NULL,
|
|
942
|
+
deleted_at TEXT
|
|
943
|
+
);
|
|
944
|
+
|
|
945
|
+
CREATE TABLE wiki_revisions (
|
|
946
|
+
slug TEXT NOT NULL,
|
|
947
|
+
rev BIGINT NOT NULL CHECK (rev >= 1),
|
|
948
|
+
title TEXT NOT NULL,
|
|
949
|
+
body_md TEXT NOT NULL,
|
|
950
|
+
at TEXT NOT NULL,
|
|
951
|
+
actor TEXT NOT NULL,
|
|
952
|
+
reason TEXT,
|
|
953
|
+
PRIMARY KEY (slug, rev)
|
|
954
|
+
);
|
|
955
|
+
|
|
956
|
+
CREATE TABLE wishes (
|
|
957
|
+
id TEXT PRIMARY KEY,
|
|
958
|
+
status TEXT NOT NULL DEFAULT 'confirmed' CHECK (status IN ('proposed', 'confirmed', 'disputed', 'retired')),
|
|
959
|
+
confidence TEXT NOT NULL DEFAULT 'high' CHECK (confidence IN ('high', 'medium', 'low')),
|
|
960
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal' CHECK (sensitivity IN ('normal', 'private', 'intimate')),
|
|
961
|
+
note TEXT,
|
|
962
|
+
created_at TEXT NOT NULL,
|
|
963
|
+
created_by TEXT NOT NULL,
|
|
964
|
+
updated_at TEXT NOT NULL,
|
|
965
|
+
updated_by TEXT NOT NULL,
|
|
966
|
+
deleted_at TEXT,
|
|
967
|
+
person_id TEXT NOT NULL,
|
|
968
|
+
text TEXT NOT NULL,
|
|
969
|
+
category TEXT,
|
|
970
|
+
said_on TEXT,
|
|
971
|
+
wish_state TEXT NOT NULL DEFAULT 'open' CHECK (wish_state IN ('open', 'planned', 'done', 'dismissed')),
|
|
972
|
+
done_event_id TEXT
|
|
973
|
+
);
|
|
974
|
+
|
|
975
|
+
CREATE TABLE "write_session" (
|
|
976
|
+
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY CHECK (id = 1),
|
|
977
|
+
actor TEXT NOT NULL,
|
|
978
|
+
reason TEXT
|
|
979
|
+
);
|
|
980
|
+
|
|
981
|
+
CREATE INDEX ix_audio_records_started ON audio_records (started_at);
|
|
982
|
+
|
|
983
|
+
CREATE INDEX ix_audit_actor ON audit_log (actor);
|
|
984
|
+
|
|
985
|
+
CREATE INDEX ix_audit_at ON audit_log (at);
|
|
986
|
+
|
|
987
|
+
CREATE INDEX ix_audit_row ON audit_log (table_name, row_key, at);
|
|
988
|
+
|
|
989
|
+
CREATE INDEX ix_bank_card_account_date ON bank_card_transactions(account_key, occurred_at);
|
|
990
|
+
|
|
991
|
+
CREATE INDEX ix_bank_card_source_date ON bank_card_transactions(source_kind, occurred_at);
|
|
992
|
+
|
|
993
|
+
CREATE INDEX ix_bank_card_statement ON bank_card_transactions(statement_key);
|
|
994
|
+
|
|
995
|
+
CREATE INDEX ix_bank_cards_bank ON bank_cards (bank_name);
|
|
996
|
+
|
|
997
|
+
CREATE INDEX ix_bank_cards_card_number ON bank_cards (card_number);
|
|
998
|
+
|
|
999
|
+
CREATE INDEX ix_bank_statement_account_period ON bank_card_statements(account_key, period_from, period_to);
|
|
1000
|
+
|
|
1001
|
+
CREATE INDEX ix_credit_card_statements_date ON credit_card_statements(statement_date);
|
|
1002
|
+
|
|
1003
|
+
CREATE INDEX ix_credit_card_statements_source ON credit_card_statements(source_kind, statement_date);
|
|
1004
|
+
|
|
1005
|
+
CREATE INDEX ix_credit_card_transactions_date ON credit_card_transactions(transaction_date, transaction_key);
|
|
1006
|
+
|
|
1007
|
+
CREATE INDEX ix_credit_card_transactions_statement ON credit_card_transactions(statement_key);
|
|
1008
|
+
|
|
1009
|
+
CREATE INDEX ix_event_links_target ON event_links (target_type, target_key);
|
|
1010
|
+
|
|
1011
|
+
CREATE INDEX ix_events_kind ON events (kind, start_at);
|
|
1012
|
+
|
|
1013
|
+
CREATE INDEX ix_events_parent ON events (parent_event_id);
|
|
1014
|
+
|
|
1015
|
+
CREATE INDEX ix_events_start ON events (start_at);
|
|
1016
|
+
|
|
1017
|
+
CREATE INDEX ix_evidence_source ON evidence_links (source_type, source_key);
|
|
1018
|
+
|
|
1019
|
+
CREATE INDEX ix_evidence_subject ON evidence_links (subject_table, subject_id);
|
|
1020
|
+
|
|
1021
|
+
CREATE INDEX ix_health_person ON health_events (person_id, occurred_on DESC);
|
|
1022
|
+
|
|
1023
|
+
CREATE INDEX ix_health_state ON health_events (case_state);
|
|
1024
|
+
|
|
1025
|
+
CREATE INDEX ix_import_batches_source ON import_batches (source_kind, started_at DESC);
|
|
1026
|
+
|
|
1027
|
+
CREATE INDEX ix_import_changes_batch ON import_changes (batch_id);
|
|
1028
|
+
|
|
1029
|
+
CREATE INDEX ix_import_changes_row ON import_changes (table_name, row_key);
|
|
1030
|
+
|
|
1031
|
+
CREATE INDEX ix_import_files_sha ON import_files (file_sha256);
|
|
1032
|
+
|
|
1033
|
+
CREATE INDEX ix_intimacy_time ON intimacy_events (occurred_at);
|
|
1034
|
+
|
|
1035
|
+
CREATE INDEX ix_journal_about ON journal_entries (about_person_id, happened_on DESC);
|
|
1036
|
+
|
|
1037
|
+
CREATE INDEX ix_journal_category ON journal_entries (category);
|
|
1038
|
+
|
|
1039
|
+
CREATE INDEX ix_labels_kind ON labels (kind, "value");
|
|
1040
|
+
|
|
1041
|
+
CREATE INDEX ix_order_items_name ON order_items (product_name);
|
|
1042
|
+
|
|
1043
|
+
CREATE INDEX ix_orders_receiver_name ON orders (receiver_name);
|
|
1044
|
+
|
|
1045
|
+
CREATE INDEX ix_orders_receiver_phone ON orders (receiver_phone);
|
|
1046
|
+
|
|
1047
|
+
CREATE INDEX ix_orders_shop ON orders (shop_name);
|
|
1048
|
+
|
|
1049
|
+
CREATE INDEX ix_orders_time ON orders (ordered_at);
|
|
1050
|
+
|
|
1051
|
+
CREATE INDEX ix_payments_counterparty ON payments (counterparty);
|
|
1052
|
+
|
|
1053
|
+
CREATE INDEX ix_payments_direction ON payments (direction, occurred_at);
|
|
1054
|
+
|
|
1055
|
+
CREATE INDEX ix_payments_merchant ON payments (merchant_order_no);
|
|
1056
|
+
|
|
1057
|
+
CREATE INDEX ix_payments_time ON payments (occurred_at);
|
|
1058
|
+
|
|
1059
|
+
CREATE INDEX ix_person_aliases_alias ON person_aliases (alias);
|
|
1060
|
+
|
|
1061
|
+
CREATE INDEX ix_preferences ON preferences (person_id, domain, polarity);
|
|
1062
|
+
|
|
1063
|
+
CREATE INDEX ix_profile_facts ON profile_facts (person_id, attribute, valid_from);
|
|
1064
|
+
|
|
1065
|
+
CREATE INDEX ix_promise_checks ON promise_checks (promise_id, checked_on);
|
|
1066
|
+
|
|
1067
|
+
CREATE INDEX ix_promises_due ON promises (due_on);
|
|
1068
|
+
|
|
1069
|
+
CREATE INDEX ix_promises_person ON promises (promiser_id, fulfillment);
|
|
1070
|
+
|
|
1071
|
+
CREATE INDEX ix_train_depart ON train_tickets (depart_at);
|
|
1072
|
+
|
|
1073
|
+
CREATE INDEX ix_train_passenger ON train_tickets (passenger_name);
|
|
1074
|
+
|
|
1075
|
+
CREATE INDEX ix_train_route ON train_tickets (from_station, to_station);
|
|
1076
|
+
|
|
1077
|
+
CREATE INDEX ix_wechat_messages_sender ON wechat_messages (sender_platform_id, sent_ts);
|
|
1078
|
+
|
|
1079
|
+
CREATE INDEX ix_wechat_messages_sent_at_msg_id ON wechat_messages (sent_at DESC, msg_id DESC);
|
|
1080
|
+
|
|
1081
|
+
CREATE INDEX ix_wechat_messages_session ON wechat_messages (session_key, sent_ts);
|
|
1082
|
+
|
|
1083
|
+
CREATE INDEX ix_wechat_messages_session_sent_at ON wechat_messages (session_key, sent_at);
|
|
1084
|
+
|
|
1085
|
+
CREATE INDEX ix_wechat_messages_session_sent_at_msg_id ON wechat_messages (session_key, sent_at DESC, msg_id DESC);
|
|
1086
|
+
|
|
1087
|
+
CREATE INDEX ix_wechat_messages_session_sent_ts_msg_id ON wechat_messages (session_key, sent_ts, msg_id);
|
|
1088
|
+
|
|
1089
|
+
CREATE INDEX ix_wechat_messages_type ON wechat_messages (msg_type);
|
|
1090
|
+
|
|
1091
|
+
CREATE UNIQUE INDEX ux_analysis_terms ON analysis_terms (coalesce(person_id, ''), kind, "value") WHERE deleted_at IS NULL;
|
|
1092
|
+
|
|
1093
|
+
CREATE UNIQUE INDEX ux_cycle_logs ON menstrual_daily_logs (person_id, log_on) WHERE deleted_at IS NULL;
|
|
1094
|
+
|
|
1095
|
+
CREATE UNIQUE INDEX ux_cycles ON menstrual_cycles (person_id, start_on) WHERE deleted_at IS NULL;
|
|
1096
|
+
|
|
1097
|
+
CREATE UNIQUE INDEX ux_family_members ON family_members (family_id, person_id) WHERE deleted_at IS NULL;
|
|
1098
|
+
|
|
1099
|
+
CREATE UNIQUE INDEX ux_identities ON identities (source, match_kind, "value") WHERE deleted_at IS NULL;
|
|
1100
|
+
|
|
1101
|
+
CREATE UNIQUE INDEX ux_labels ON labels (target_type, target_key, kind, "value") WHERE deleted_at IS NULL;
|
|
1102
|
+
|
|
1103
|
+
CREATE UNIQUE INDEX ux_persons_default ON persons (is_default) WHERE is_default = 1 AND deleted_at IS NULL;
|
|
1104
|
+
|
|
1105
|
+
CREATE UNIQUE INDEX ux_persons_self ON persons (is_self) WHERE is_self = 1 AND deleted_at IS NULL;
|
|
1106
|
+
|
|
1107
|
+
CREATE UNIQUE INDEX ux_preferences ON preferences (person_id, domain, item) WHERE deleted_at IS NULL;
|
|
1108
|
+
|
|
1109
|
+
CREATE UNIQUE INDEX ux_relations ON relations (from_person_id, to_person_id, relation) WHERE deleted_at IS NULL;
|
|
1110
|
+
|
|
1111
|
+
CREATE UNIQUE INDEX ux_search_docs ON search_docs (source_type, source_key);
|
|
1112
|
+
|
|
1113
|
+
CREATE UNIQUE INDEX ux_train_tickets ON train_tickets (
|
|
1114
|
+
order_no, record_type, passenger_name, train_code, depart_at, mail_at
|
|
1115
|
+
);
|