mcp-scraper 0.97.0 → 0.98.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -2425
- package/README.md +16 -412
- package/dist/bin/api-server.js +3 -2
- package/dist/bin/mcp-scraper-cli.js +33 -27
- package/dist/bin/mcp-scraper-core.js +9 -1
- package/dist/bin/mcp-scraper-install.js +17 -2
- package/dist/bin/mcp-stdio-server.js +9 -1
- package/dist/bin/paa-harvest.js +8 -1
- package/dist/index.cjs +5 -21830
- package/dist/index.d.ts +14 -607
- package/dist/index.js +5 -39
- package/dist/transport.d.ts +35 -0
- package/package.json +11 -51
- package/THIRD_PARTY_NOTICES.html +0 -203
- package/dist/actions-NCZNPYEY.js +0 -1
- package/dist/artifacts-4ZDNP2JW.js +0 -1
- package/dist/artifacts-N62OPIT5.js +0 -1
- package/dist/artifacts-PSADD5OC.js +0 -1
- package/dist/artifacts-RUR3OHAK.js +0 -1
- package/dist/blob-store-GIH26EDO.js +0 -1
- package/dist/bundle-XR6XKYJM.js +0 -1
- package/dist/chunk-24YDQ3EO.js +0 -5
- package/dist/chunk-3F7AFM53.js +0 -1
- package/dist/chunk-4HZXATHB.js +0 -27
- package/dist/chunk-4P3LZNVA.js +0 -954
- package/dist/chunk-4ZVO6GX4.js +0 -1
- package/dist/chunk-55ZANTHL.js +0 -3
- package/dist/chunk-63VWBMYR.js +0 -3
- package/dist/chunk-6FAMBNHY.js +0 -1
- package/dist/chunk-6N5EC7ZO.js +0 -1
- package/dist/chunk-7POHNTVW.js +0 -1
- package/dist/chunk-7SR7MEU5.js +0 -62
- package/dist/chunk-A4UASMEQ.js +0 -1
- package/dist/chunk-AMYPXA2F.js +0 -930
- package/dist/chunk-ANQ4JJVI.js +0 -71
- package/dist/chunk-B3JRL45T.js +0 -1
- package/dist/chunk-B4ZKPLSP.js +0 -1
- package/dist/chunk-B5Y26E3A.js +0 -1
- package/dist/chunk-C7MGJUTU.js +0 -1
- package/dist/chunk-CNSVZTTT.js +0 -13
- package/dist/chunk-EYGA6LOU.js +0 -1
- package/dist/chunk-GLCR4KJI.js +0 -21722
- package/dist/chunk-HCK6PLM3.js +0 -3
- package/dist/chunk-HNNYXMSI.js +0 -1
- package/dist/chunk-IFPION5D.js +0 -121
- package/dist/chunk-JMZIDHYQ.js +0 -2
- package/dist/chunk-JNPM3U3L.js +0 -189
- package/dist/chunk-K3VDGJNK.js +0 -1
- package/dist/chunk-KJQXUZ4Y.js +0 -4
- package/dist/chunk-KXJCGV3H.js +0 -1
- package/dist/chunk-M5QHXNFZ.js +0 -10
- package/dist/chunk-MVMWPKRC.js +0 -2
- package/dist/chunk-NALXKTUU.js +0 -1
- package/dist/chunk-ND4WIBXT.js +0 -16
- package/dist/chunk-NNOX3FYG.js +0 -198
- package/dist/chunk-NULRGHJ4.js +0 -41
- package/dist/chunk-OILOHQNL.js +0 -2
- package/dist/chunk-OLYPLX5C.js +0 -1
- package/dist/chunk-OOB3RKWD.js +0 -4
- package/dist/chunk-OSKCHEVM.js +0 -218
- package/dist/chunk-PD7BI7TR.js +0 -12
- package/dist/chunk-PKQHHCO4.js +0 -20
- package/dist/chunk-PQRT4T2G.js +0 -159
- package/dist/chunk-QER2ELZP.js +0 -1
- package/dist/chunk-RDHGQ2WZ.js +0 -1
- package/dist/chunk-SDQW7IJN.js +0 -1
- package/dist/chunk-SEZETSB3.js +0 -1
- package/dist/chunk-U3NV72AL.js +0 -8
- package/dist/chunk-U4WIJZCX.js +0 -1
- package/dist/chunk-UIOSADPB.js +0 -1718
- package/dist/chunk-UNEJYZ4T.js +0 -102
- package/dist/chunk-VVSHZV5S.js +0 -73
- package/dist/chunk-WHVK6FUB.js +0 -11
- package/dist/chunk-WNUXMPVX.js +0 -1
- package/dist/chunk-XYUJTIPE.js +0 -203
- package/dist/chunk-YJPFEL2E.js +0 -1
- package/dist/chunk-Z4EHBBL4.js +0 -41
- package/dist/contracts-GUXGFCVV.js +0 -1
- package/dist/core-schema-Y47YFKH2.js +0 -899
- package/dist/dispatch-ILBBKOSW.js +0 -1
- package/dist/editorial-reading-room/assets/app.js +0 -433
- package/dist/editorial-reading-room/assets/index.html +0 -139
- package/dist/editorial-reading-room/assets/styles.css +0 -1091
- package/dist/index.d.cts +0 -607
- package/dist/media-artifacts-67CJWI7O.js +0 -1
- package/dist/metering-YHZ46GV4.js +0 -1
- package/dist/migrations-3AKEC5QE.js +0 -1
- package/dist/queue-VOGXQDPR.js +0 -1
- package/dist/reconciliation-OXBG7JA2.js +0 -1
- package/dist/report-artifact-offload-6OOY2PTM.js +0 -1
- package/dist/repository-CYXVMYAI.js +0 -1
- package/dist/repository-UKDA4IWP.js +0 -1
- package/dist/server-6HUBN3OR.js +0 -5547
- package/dist/settlement-3PS32LQO.js +0 -1
- package/dist/worker-NXRU3TT3.js +0 -1
- package/public/.well-known/xray-install.json +0 -183
- package/public/agent-install.md +0 -200
|
@@ -1,899 +0,0 @@
|
|
|
1
|
-
import{a as R,c as I,d as A}from"./chunk-IFPION5D.js";import"./chunk-7POHNTVW.js";import"./chunk-4ZVO6GX4.js";import{a as n}from"./chunk-WNUXMPVX.js";var X="2026-10-09-operation-executions.1",v="2026-10-09-operation-debit-plans.1",U="2026-10-10-operation-debit-plans.2",y=["run_id","claim_token","expires_at_ms","phase","result_json","result_status"];async function c(t){let[e,_,E,a,i]=await Promise.all([t.execute("PRAGMA table_info(operation_executions)"),t.execute("PRAGMA index_info(operation_executions_expiry)"),t.execute({sql:"SELECT 1 FROM schema_migrations WHERE version = ?",args:[X]}),t.execute("PRAGMA foreign_key_list(operation_executions)"),t.execute("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'operation_executions'")]),l=String(i.rows[0]?.sql??"").replace(/\s+/g," ");return await S(t)&&y.every(r=>e.rows.some(s=>s.name===r))&&e.rows.some(r=>r.name==="run_id"&&Number(r.pk)===1)&&["claim_token","expires_at_ms","phase"].every(r=>e.rows.some(s=>s.name===r&&Number(s.notnull)===1))&&_.rows.map(r=>r.name).join(",")==="phase,expires_at_ms"&&E.rows.length===1&&a.rows.some(r=>r.table==="operation_runs"&&r.from==="run_id"&&r.to==="id"&&r.on_delete==="CASCADE")&&["CHECK (expires_at_ms > 0)","CHECK (phase IN ('claimed', 'effects_started', 'published', 'unknown'))","CHECK (result_json IS NULL OR json_valid(result_json))","CHECK ((phase = 'published' AND result_json IS NOT NULL AND result_status IS NOT NULL)"].every(r=>l.includes(r))}async function m(t){if(!await c(t)&&(await t.batch([`CREATE TABLE IF NOT EXISTS operation_executions (
|
|
2
|
-
run_id TEXT PRIMARY KEY REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
3
|
-
claim_token TEXT NOT NULL,
|
|
4
|
-
expires_at_ms INTEGER NOT NULL CHECK (expires_at_ms > 0),
|
|
5
|
-
phase TEXT NOT NULL CHECK (phase IN ('claimed', 'effects_started', 'published', 'unknown')),
|
|
6
|
-
result_json TEXT CHECK (result_json IS NULL OR json_valid(result_json)),
|
|
7
|
-
result_status TEXT CHECK (result_status IS NULL OR result_status IN ('succeeded', 'failed', 'cancelled', 'timed_out', 'interrupted', 'unknown')),
|
|
8
|
-
CHECK ((phase = 'published' AND result_json IS NOT NULL AND result_status IS NOT NULL)
|
|
9
|
-
OR (phase <> 'published' AND result_json IS NULL AND result_status IS NULL))
|
|
10
|
-
)`,"CREATE INDEX IF NOT EXISTS operation_executions_expiry ON operation_executions(phase, expires_at_ms)",`CREATE TABLE IF NOT EXISTS operation_debit_plans (
|
|
11
|
-
run_id TEXT NOT NULL REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
12
|
-
label TEXT NOT NULL,
|
|
13
|
-
debit_key TEXT NOT NULL CHECK (length(debit_key) BETWEEN 1 AND 500),
|
|
14
|
-
amount_mc INTEGER NOT NULL CHECK (amount_mc > 0),
|
|
15
|
-
operation TEXT NOT NULL,
|
|
16
|
-
description TEXT NOT NULL,
|
|
17
|
-
refund_operation TEXT NOT NULL,
|
|
18
|
-
source_surface TEXT NOT NULL,
|
|
19
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
20
|
-
PRIMARY KEY (run_id, label)
|
|
21
|
-
)`,"CREATE UNIQUE INDEX IF NOT EXISTS operation_debit_plans_key ON operation_debit_plans(debit_key)",`CREATE TABLE IF NOT EXISTS operation_wallet_fences (
|
|
22
|
-
id TEXT PRIMARY KEY,
|
|
23
|
-
allowed INTEGER NOT NULL CONSTRAINT operation_wallet_claim_current CHECK (allowed = 1)
|
|
24
|
-
)`,{sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[X]},{sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[v]}],"write"),await f(t),!await c(t)))throw Error("Operation execution schema is incomplete")}async function S(t){let[e,_,E,a,i,l,r]=await Promise.all([t.execute("PRAGMA table_info(operation_debit_plans)"),t.execute("PRAGMA index_info(operation_debit_plans_key)"),t.execute("PRAGMA index_list(operation_debit_plans)"),t.execute("PRAGMA foreign_key_list(operation_debit_plans)"),t.execute("PRAGMA table_info(operation_wallet_fences)"),t.execute("SELECT name, sql FROM sqlite_master WHERE type = 'table' AND name IN ('operation_debit_plans', 'operation_wallet_fences')"),t.execute({sql:"SELECT 1 FROM schema_migrations WHERE version = ?",args:[U]})]),s=T=>String(l.rows.find(u=>u.name===T)?.sql??"").replace(/\s+/g," ");return["run_id","label","debit_key","amount_mc","operation","description","refund_operation","source_surface"].every(T=>e.rows.some(u=>u.name===T&&Number(u.notnull)===1))&&e.rows.some(T=>T.name==="run_id"&&Number(T.pk)===1)&&e.rows.some(T=>T.name==="label"&&Number(T.pk)===2)&&_.rows.map(T=>T.name).join(",")==="debit_key"&&E.rows.some(T=>T.name==="operation_debit_plans_key"&&Number(T.unique)===1)&&a.rows.some(T=>T.table==="operation_runs"&&T.from==="run_id"&&T.to==="id"&&T.on_delete==="CASCADE")&&s("operation_debit_plans").includes("CHECK (amount_mc > 0)")&&s("operation_debit_plans").includes("CHECK (length(debit_key) BETWEEN 1 AND 500)")&&i.rows.some(T=>T.name==="id"&&Number(T.pk)===1)&&i.rows.some(T=>T.name==="allowed"&&Number(T.notnull)===1)&&s("operation_wallet_fences").includes("CONSTRAINT operation_wallet_claim_current CHECK (allowed = 1)")&&r.rows.length===1}async function f(t){let e="CHECK (length(debit_key) BETWEEN 1 AND 500)",E=await(async()=>String((await t.execute("SELECT sql FROM sqlite_master WHERE type='table' AND name='operation_debit_plans'")).rows[0]?.sql??"").replace(/\s+/g," "))();if(!E.includes(e)&&!E.includes("CHECK (debit_key LIKE 'operation-debit:%')"))throw Error("Unrecognized operation debit-plan schema");let a=E.includes(e)?[]:[`CREATE TABLE IF NOT EXISTS operation_debit_plans_v2 (
|
|
25
|
-
run_id TEXT NOT NULL REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
26
|
-
label TEXT NOT NULL,
|
|
27
|
-
debit_key TEXT NOT NULL CHECK (length(debit_key) BETWEEN 1 AND 500),
|
|
28
|
-
amount_mc INTEGER NOT NULL CHECK (amount_mc > 0),
|
|
29
|
-
operation TEXT NOT NULL,
|
|
30
|
-
description TEXT NOT NULL,
|
|
31
|
-
refund_operation TEXT NOT NULL,
|
|
32
|
-
source_surface TEXT NOT NULL,
|
|
33
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
34
|
-
PRIMARY KEY (run_id, label)
|
|
35
|
-
)`,`INSERT INTO operation_debit_plans_v2 (run_id,label,debit_key,amount_mc,operation,description,refund_operation,source_surface,created_at)
|
|
36
|
-
SELECT run_id,label,debit_key,amount_mc,operation,description,refund_operation,source_surface,created_at FROM operation_debit_plans`,"DROP TABLE operation_debit_plans","ALTER TABLE operation_debit_plans_v2 RENAME TO operation_debit_plans","CREATE UNIQUE INDEX operation_debit_plans_key ON operation_debit_plans(debit_key)"];try{await t.batch([...a,{sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[U]}],"write")}catch(i){if(!await S(t).catch(()=>!1))throw i}}var d="2026-10-12.1",C="data-2026-07-28-site-extract-counters.1",w=["admin_credit_adjustment_events","admin_credit_adjustments","billing_authorizations","billing_credits","billing_debits","billing_debit_allocations","billing_events","browser_profile_labels","connected_account_billing","concurrency_locks","credit_lot_expirations","credit_lots","credit_lot_repairs","free_credit_refreshes","harvest_attempts","inbox_messages","jobs","kpo_jobs","kpo_phase_log","ledger","oauth_clients","oauth_codes","oauth_tokens","operation_attempts","operation_billing_links","operation_coverage_defects","operation_runs","mcp_analytics_requests","maps_place_runs","maps_place_attempts","maps_place_run_events","maps_place_reviews","maps_place_images","page_snapshots","password_reset_tokens","rate_limits","request_events","provider_reconciliation_runs","provider_account_windows","provider_usage_receipts","serp_identities","site_audit_jobs","site_audit_phase_log","site_extract_jobs","site_extract_pages","stripe_events","users","workflow_artifacts","workflow_runs","workflow_webhook_deliveries","workshop_registrations"],D=["admin_credit_adjustment_events_reference","admin_credit_adjustments_user_created","billing_authorizations_user_status","billing_credits_user_status","billing_debits_user_status","billing_events_authorization","billing_events_user_created_at","concurrency_locks_active_user","concurrency_locks_operation","concurrency_locks_user_status","credit_lots_user_active","credit_lot_repairs_user_applied","harvest_attempts_job_id","harvest_attempts_provider_lookup","harvest_attempts_user_created_at","inbox_messages_user_sent_at","jobs_created_at_status_user","jobs_status","jobs_user_created_at_status","jobs_user_id","kpo_jobs_status","kpo_jobs_user_id","kpo_phase_log_job_id","ledger_stripe_pi_unique","ledger_user_id","oauth_tokens_identity","operation_attempts_provider_status","operation_attempts_run_number","operation_billing_links_run","operation_coverage_defects_created","operation_runs_idempotency_scope","operation_runs_status_started","operation_runs_tool_started","operation_runs_user_started","mcp_analytics_requests_user_started","mcp_analytics_requests_started","maps_place_runs_owner_key","maps_place_runs_status_lease","maps_place_attempts_run_number","maps_place_reviews_order","maps_place_images_order","page_snapshots_user_checked_at","prt_user_id","request_events_created_at","request_events_user_created_at","provider_reconciliation_runs_provider_started","provider_account_windows_lookup","provider_usage_receipts_attempt","provider_usage_receipts_pending","provider_usage_receipts_provider_source","stripe_events_due","serp_identities_user_name","site_audit_jobs_status","site_audit_jobs_user_id","site_audit_phase_log_job_id","site_extract_jobs_status","site_extract_jobs_idempotency","site_extract_jobs_user_id","site_extract_pages_job_id","workflow_artifacts_run","workflow_runs_idempotency","workflow_runs_schedule","workflow_runs_user_created","workflow_webhook_deliveries_run","workshop_registrations_event_status"],h=["credit_lots_bounds_insert","credit_lots_bounds_update","credit_lots_one_migration_insert","credit_lots_one_migration_update"],k={maps_place_runs:["request_fingerprint","field_states_json","core_json","checkpoint_revision","current_attempt_id","current_fence_token","lease_expires_at","billing_state"],maps_place_attempts:["attempt_number","resume_key_hash","fence_token","hold_key","held_amount_mc","final_amount_mc","billing_state"],maps_place_reviews:["review_key","record_json"],maps_place_images:["media_key","record_json"],credit_lots:["never_expires"],harvest_attempts:["debug_json","browser_provider","provider_session_id","provider_session_observed_at","provider_lookup_status","provider_status","provider_error_code","provider_error_message","provider_reason_source","provider_duration_ms","provider_bandwidth_bytes","provider_captcha","provider_checked_at","provider_detail_json","provider_disconnect_observed","provider_disconnect_message"],jobs:["public_error_json"],oauth_tokens:["replaced_by","rotated_at"],provider_usage_receipts:["provider_product","billing_tier","billable_event","measurement_source","rate_numerator","rate_denominator","rate_policy_version","rate_effective_at"],site_extract_jobs:["dispatch_claim_token","dispatch_claim_until","dispatched_at","settlement_plan_json","settlement_receipt_json","execution_generation","refinalize_until","attempted_urls","successful_urls","failed_urls","idempotency_key","request_fingerprint","dispatch_attempts","next_dispatch_at","dispatch_error","settlement_attempts","next_settlement_at","settlement_error","public_error_json"],stripe_events:["attempt_count","claim_token","claimed_at","completed_at","event_type","last_error","last_error_code","next_attempt_at","received_at","status","stripe_created_at","updated_at"],users:["balance_mc","concurrency_stripe_sub_id","concurrency_pack_quantity","extra_concurrency_slots","key_active","memory_identity","memory_key","memory_plan","memory_provisioned","memory_subscription_id","password_hash","stripe_customer_id","subscription_concurrency","subscription_id","subscription_tier"],workshop_registrations:["field_notes_email_id","reminder_48h_email_id","reminder_24h_email_id","reminder_1h_email_id"],workflow_artifacts:["content"],workflow_runs:["step_index","step_log_json","step_state_json","total_steps","webhook_url"]},o="provider_usage_receipts",N="provider_usage_receipts_measured_v1",x="cost_state IN ('pending', 'estimated', 'measured', 'actual', 'unavailable')";function b(t=o){if(t!==o&&t!==N)throw new Error(`Unsupported provider receipt table name: ${t}`);return`
|
|
37
|
-
CREATE TABLE IF NOT EXISTS ${t} (
|
|
38
|
-
id TEXT PRIMARY KEY,
|
|
39
|
-
attempt_id TEXT NOT NULL REFERENCES operation_attempts(id) ON DELETE CASCADE,
|
|
40
|
-
provider TEXT NOT NULL,
|
|
41
|
-
account_scope_hash TEXT NOT NULL,
|
|
42
|
-
method TEXT NOT NULL,
|
|
43
|
-
provider_source_key TEXT,
|
|
44
|
-
provider_source_key_hash TEXT,
|
|
45
|
-
cost_state TEXT NOT NULL DEFAULT 'pending'
|
|
46
|
-
CHECK (cost_state IN ('pending', 'estimated', 'measured', 'actual', 'unavailable')),
|
|
47
|
-
provider_product TEXT,
|
|
48
|
-
billing_tier TEXT,
|
|
49
|
-
billable_event TEXT,
|
|
50
|
-
measurement_source TEXT,
|
|
51
|
-
rate_numerator INTEGER CHECK (rate_numerator IS NULL OR rate_numerator >= 0),
|
|
52
|
-
rate_denominator INTEGER CHECK (rate_denominator IS NULL OR rate_denominator > 0),
|
|
53
|
-
rate_policy_version TEXT,
|
|
54
|
-
rate_effective_at TEXT,
|
|
55
|
-
units REAL CHECK (units IS NULL OR units >= 0),
|
|
56
|
-
unit_type TEXT,
|
|
57
|
-
amount_usd_nanos INTEGER CHECK (amount_usd_nanos IS NULL OR amount_usd_nanos >= 0),
|
|
58
|
-
currency TEXT NOT NULL DEFAULT 'USD',
|
|
59
|
-
rate_source TEXT,
|
|
60
|
-
zero_cost_reason TEXT,
|
|
61
|
-
provider_status TEXT,
|
|
62
|
-
provider_duration_ms INTEGER CHECK (provider_duration_ms IS NULL OR provider_duration_ms >= 0),
|
|
63
|
-
provider_captcha INTEGER CHECK (provider_captcha IS NULL OR provider_captcha IN (0, 1)),
|
|
64
|
-
error_code TEXT,
|
|
65
|
-
error_message TEXT,
|
|
66
|
-
checked_at TEXT,
|
|
67
|
-
finalized_at TEXT,
|
|
68
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
69
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
70
|
-
CHECK (provider_source_key IS NULL OR provider_source_key_hash IS NOT NULL),
|
|
71
|
-
CHECK (cost_state <> 'pending' OR (amount_usd_nanos IS NULL AND finalized_at IS NULL)),
|
|
72
|
-
CHECK (cost_state <> 'actual' OR (amount_usd_nanos IS NOT NULL AND finalized_at IS NOT NULL
|
|
73
|
-
AND (amount_usd_nanos > 0 OR zero_cost_reason IS NOT NULL))),
|
|
74
|
-
CHECK (cost_state NOT IN ('estimated', 'measured', 'unavailable') OR finalized_at IS NOT NULL),
|
|
75
|
-
CHECK (cost_state <> 'measured' OR (amount_usd_nanos IS NOT NULL
|
|
76
|
-
AND (amount_usd_nanos > 0 OR zero_cost_reason IS NOT NULL)))
|
|
77
|
-
)
|
|
78
|
-
`}async function g(t){let e=await t.execute({sql:"SELECT sql FROM sqlite_master WHERE type = 'table' AND name = ?",args:[o]});return e.rows[0]?.sql==null?null:String(e.rows[0].sql)}function F(t){return t==null||t.includes(x)}async function j(t){let e=await g(t);if(F(e))return"not_needed";if((await t.execute({sql:"SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1",args:[N]})).rows.length>0)throw new Error(`Refusing provider receipt migration because ${N} already exists`);let a=(await t.execute(`PRAGMA table_info(${o})`)).rows.map(i=>String(i.name)).map(i=>`"${i.replaceAll('"','""')}"`).join(", ");if(!a)throw new Error("Provider receipt migration found no source columns");return await t.batch([b(N),`INSERT INTO ${N} (${a}) SELECT ${a} FROM ${o}`,`DROP TABLE ${o}`,`ALTER TABLE ${N} RENAME TO ${o}`,"CREATE INDEX provider_usage_receipts_attempt ON provider_usage_receipts(attempt_id, created_at)","CREATE INDEX provider_usage_receipts_pending ON provider_usage_receipts(cost_state, checked_at, created_at) WHERE cost_state = 'pending'","CREATE UNIQUE INDEX provider_usage_receipts_provider_source ON provider_usage_receipts(provider, account_scope_hash, method, provider_source_key_hash) WHERE provider_source_key_hash IS NOT NULL"],"write"),"rebuilt"}function L(t){return t.map(e=>`'${e.replaceAll("'","''")}'`).join(", ")}async function p(t){let e=[`(SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name IN (${L(w)})) = ${w.length}`,`(SELECT COUNT(*) FROM sqlite_master WHERE type = 'index' AND name IN (${L(D)})) = ${D.length}`,`(SELECT COUNT(*) FROM sqlite_master WHERE type = 'trigger' AND name IN (${L(h)})) = ${h.length}`,...Object.entries(k).map(([E,a])=>`(SELECT COUNT(*) FROM pragma_table_info('${E}') WHERE name IN (${L(a)})) = ${a.length}`),`(SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = '${o}' AND instr(sql, '${x.replaceAll("'","''")}') > 0) = 1`],_=await t.execute(`SELECT ${e.join(" AND ")} AS ready`);return Number(_.rows[0]?.ready??0)===1}async function q(t=n()){let e=!1;try{e=(await t.execute({sql:"SELECT 1 AS applied FROM schema_migrations WHERE version = ? LIMIT 1",args:[d]})).rows.length===1}catch(E){let a=E instanceof Error?E.message.toLowerCase():String(E).toLowerCase();if(!a.includes("no such table")||!a.includes("schema_migrations"))throw E}let _=e?await p(t)&&await c(t):!1;return{coreSchemaVersion:d,migrationApplied:e,schemaReady:_}}async function G(t){await t.execute(`
|
|
79
|
-
UPDATE site_extract_jobs SET
|
|
80
|
-
attempted_urls = done_urls,
|
|
81
|
-
successful_urls = (
|
|
82
|
-
SELECT COUNT(*) FROM site_extract_pages
|
|
83
|
-
WHERE job_id = site_extract_jobs.id
|
|
84
|
-
AND CASE
|
|
85
|
-
WHEN json_valid(page) = 0 THEN 0
|
|
86
|
-
WHEN json_extract(page, '$.extractionStatus') IS NOT NULL
|
|
87
|
-
THEN json_extract(page, '$.extractionStatus') = 'successful'
|
|
88
|
-
ELSE COALESCE(
|
|
89
|
-
json_extract(page, '$.status') >= 200
|
|
90
|
-
AND json_extract(page, '$.status') < 300
|
|
91
|
-
AND json_extract(page, '$.wordCount') > 0,
|
|
92
|
-
0
|
|
93
|
-
)
|
|
94
|
-
END
|
|
95
|
-
),
|
|
96
|
-
failed_urls = MAX(0, done_urls - (
|
|
97
|
-
SELECT COUNT(*) FROM site_extract_pages
|
|
98
|
-
WHERE job_id = site_extract_jobs.id
|
|
99
|
-
AND CASE
|
|
100
|
-
WHEN json_valid(page) = 0 THEN 0
|
|
101
|
-
WHEN json_extract(page, '$.extractionStatus') IS NOT NULL
|
|
102
|
-
THEN json_extract(page, '$.extractionStatus') = 'successful'
|
|
103
|
-
ELSE COALESCE(
|
|
104
|
-
json_extract(page, '$.status') >= 200
|
|
105
|
-
AND json_extract(page, '$.status') < 300
|
|
106
|
-
AND json_extract(page, '$.wordCount') > 0,
|
|
107
|
-
0
|
|
108
|
-
)
|
|
109
|
-
END
|
|
110
|
-
))
|
|
111
|
-
WHERE done_urls > 0
|
|
112
|
-
AND attempted_urls = 0
|
|
113
|
-
AND successful_urls = 0
|
|
114
|
-
AND failed_urls = 0
|
|
115
|
-
`)}async function O(t){(await t.execute({sql:"SELECT 1 AS applied FROM schema_migrations WHERE version = ? LIMIT 1",args:[C]})).rows.length>0||(await G(t),await t.execute({sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[C]}))}async function W(t=n()){if(process.env.OAUTH_MAINTENANCE_MODE!=="true")throw new Error("Secured main OAuth schema migration requires OAUTH_MAINTENANCE_MODE=true");await I(t)}async function $(t=n()){return A(t)}async function M(t={}){let e=n(),_;try{_=await e.execute({sql:"SELECT 1 AS applied FROM schema_migrations WHERE version = ? LIMIT 1",args:[d]})}catch(a){let i=a instanceof Error?a.message.toLowerCase():String(a).toLowerCase();if(!i.includes("no such table")||!i.includes("schema_migrations"))throw a;await e.execute(`
|
|
116
|
-
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
117
|
-
version TEXT PRIMARY KEY,
|
|
118
|
-
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
119
|
-
)
|
|
120
|
-
`),_={rows:[]}}if(_.rows.length>0){if(!t.verifyCurrentSchema)return;if(await p(e)&&await c(e)){t.runDataRepairs&&await O(e);return}}let E=await g(e);if(!F(E))throw new Error("Provider receipt schema requires the explicit operator migration: run npm run db:migrate before starting the new application release");if(await p(e)){await m(e),await O(e),await e.execute({sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[d]});return}await e.execute(`
|
|
121
|
-
CREATE TABLE IF NOT EXISTS users (
|
|
122
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
123
|
-
email TEXT UNIQUE NOT NULL,
|
|
124
|
-
name TEXT,
|
|
125
|
-
api_key TEXT UNIQUE NOT NULL,
|
|
126
|
-
password_hash TEXT,
|
|
127
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
128
|
-
active INTEGER NOT NULL DEFAULT 1
|
|
129
|
-
)
|
|
130
|
-
`),await e.execute(`
|
|
131
|
-
CREATE TABLE IF NOT EXISTS jobs (
|
|
132
|
-
id TEXT PRIMARY KEY,
|
|
133
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
134
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
135
|
-
query TEXT NOT NULL,
|
|
136
|
-
options TEXT NOT NULL,
|
|
137
|
-
callback_url TEXT,
|
|
138
|
-
result TEXT,
|
|
139
|
-
error TEXT,
|
|
140
|
-
public_error_json TEXT,
|
|
141
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
142
|
-
started_at TEXT,
|
|
143
|
-
completed_at TEXT
|
|
144
|
-
)
|
|
145
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS jobs_user_id ON jobs(user_id)"),await e.execute("CREATE INDEX IF NOT EXISTS jobs_status ON jobs(status)");try{await e.execute("ALTER TABLE jobs ADD COLUMN public_error_json TEXT")}catch{}await e.execute("CREATE INDEX IF NOT EXISTS jobs_created_at_status_user ON jobs(created_at, status, user_id)"),await e.execute("CREATE INDEX IF NOT EXISTS jobs_user_created_at_status ON jobs(user_id, created_at, status)"),await e.execute(`
|
|
146
|
-
CREATE TABLE IF NOT EXISTS harvest_attempts (
|
|
147
|
-
id TEXT PRIMARY KEY,
|
|
148
|
-
job_id TEXT NOT NULL REFERENCES jobs(id),
|
|
149
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
150
|
-
attempt_number INTEGER NOT NULL,
|
|
151
|
-
max_attempts INTEGER NOT NULL,
|
|
152
|
-
query TEXT NOT NULL,
|
|
153
|
-
location TEXT,
|
|
154
|
-
max_questions INTEGER NOT NULL,
|
|
155
|
-
status TEXT NOT NULL,
|
|
156
|
-
outcome TEXT,
|
|
157
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_session_id TEXT,
|
|
158
|
-
question_count INTEGER,
|
|
159
|
-
duration_ms INTEGER,
|
|
160
|
-
error TEXT,
|
|
161
|
-
will_retry INTEGER,
|
|
162
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_delete_started INTEGER NOT NULL DEFAULT 0,
|
|
163
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_delete_succeeded INTEGER,
|
|
164
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_delete_error TEXT,
|
|
165
|
-
browser_close_succeeded INTEGER,
|
|
166
|
-
browser_close_error TEXT,
|
|
167
|
-
debug_json TEXT,
|
|
168
|
-
browser_provider TEXT,
|
|
169
|
-
provider_session_id TEXT,
|
|
170
|
-
provider_session_observed_at TEXT,
|
|
171
|
-
provider_lookup_status TEXT,
|
|
172
|
-
provider_status TEXT,
|
|
173
|
-
provider_error_code TEXT,
|
|
174
|
-
provider_error_message TEXT,
|
|
175
|
-
provider_reason_source TEXT,
|
|
176
|
-
provider_duration_ms INTEGER,
|
|
177
|
-
provider_bandwidth_bytes INTEGER,
|
|
178
|
-
provider_captcha INTEGER,
|
|
179
|
-
provider_checked_at TEXT,
|
|
180
|
-
provider_detail_json TEXT,
|
|
181
|
-
provider_disconnect_observed INTEGER,
|
|
182
|
-
provider_disconnect_message TEXT,
|
|
183
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
184
|
-
completed_at TEXT,
|
|
185
|
-
UNIQUE(job_id, attempt_number)
|
|
186
|
-
)
|
|
187
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS harvest_attempts_job_id ON harvest_attempts(job_id)"),await e.execute("CREATE INDEX IF NOT EXISTS harvest_attempts_user_created_at ON harvest_attempts(user_id, created_at DESC)");try{await e.execute("ALTER TABLE harvest_attempts ADD COLUMN debug_json TEXT")}catch{}for(let a of["browser_provider TEXT","provider_session_id TEXT","provider_session_observed_at TEXT","provider_lookup_status TEXT","provider_status TEXT","provider_error_code TEXT","provider_error_message TEXT","provider_reason_source TEXT","provider_duration_ms INTEGER","provider_bandwidth_bytes INTEGER","provider_captcha INTEGER","provider_checked_at TEXT","provider_detail_json TEXT","provider_disconnect_observed INTEGER","provider_disconnect_message TEXT"])try{await e.execute(`ALTER TABLE harvest_attempts ADD COLUMN ${a}`)}catch{}await e.execute("CREATE INDEX IF NOT EXISTS harvest_attempts_provider_lookup ON harvest_attempts(browser_provider, provider_lookup_status, provider_checked_at)");try{await e.execute("ALTER TABLE users ADD COLUMN password_hash TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN key_active INTEGER NOT NULL DEFAULT 1")}catch{}await e.execute(`
|
|
188
|
-
CREATE TABLE IF NOT EXISTS kpo_jobs (
|
|
189
|
-
id TEXT PRIMARY KEY,
|
|
190
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
191
|
-
status TEXT NOT NULL,
|
|
192
|
-
entity_name TEXT NOT NULL,
|
|
193
|
-
entity_type TEXT NOT NULL,
|
|
194
|
-
url TEXT,
|
|
195
|
-
request TEXT NOT NULL,
|
|
196
|
-
result TEXT,
|
|
197
|
-
error TEXT,
|
|
198
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
199
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
200
|
-
)
|
|
201
|
-
`),await e.execute(`
|
|
202
|
-
CREATE TABLE IF NOT EXISTS kpo_phase_log (
|
|
203
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
204
|
-
job_id TEXT NOT NULL REFERENCES kpo_jobs(id),
|
|
205
|
-
phase TEXT NOT NULL,
|
|
206
|
-
output TEXT NOT NULL,
|
|
207
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
208
|
-
)
|
|
209
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS kpo_jobs_user_id ON kpo_jobs(user_id)"),await e.execute("CREATE INDEX IF NOT EXISTS kpo_jobs_status ON kpo_jobs(status)"),await e.execute("CREATE INDEX IF NOT EXISTS kpo_phase_log_job_id ON kpo_phase_log(job_id)");try{await e.execute("ALTER TABLE users ADD COLUMN stripe_customer_id TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN balance_mc INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN extra_concurrency_slots INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN concurrency_stripe_sub_id TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN concurrency_pack_quantity INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN subscription_concurrency INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN subscription_tier TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN subscription_id TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN memory_key TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN memory_identity TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN memory_plan TEXT NOT NULL DEFAULT 'free'")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN memory_subscription_id TEXT")}catch{}try{await e.execute("ALTER TABLE users ADD COLUMN memory_provisioned INTEGER NOT NULL DEFAULT 0")}catch{}await e.execute(`
|
|
210
|
-
CREATE TABLE IF NOT EXISTS concurrency_locks (
|
|
211
|
-
id TEXT PRIMARY KEY,
|
|
212
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
213
|
-
operation TEXT NOT NULL,
|
|
214
|
-
status TEXT NOT NULL DEFAULT 'active',
|
|
215
|
-
acquired_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
216
|
-
expires_at TEXT NOT NULL,
|
|
217
|
-
released_at TEXT,
|
|
218
|
-
metadata TEXT
|
|
219
|
-
)
|
|
220
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS concurrency_locks_user_status ON concurrency_locks(user_id, status, expires_at)"),await e.execute("CREATE INDEX IF NOT EXISTS concurrency_locks_operation ON concurrency_locks(operation, status, expires_at)"),await e.execute("CREATE INDEX IF NOT EXISTS concurrency_locks_active_user ON concurrency_locks(user_id, expires_at) WHERE status = 'active'"),await e.execute(`
|
|
221
|
-
CREATE TABLE IF NOT EXISTS ledger (
|
|
222
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
223
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
224
|
-
amount_mc INTEGER NOT NULL,
|
|
225
|
-
operation TEXT NOT NULL,
|
|
226
|
-
description TEXT,
|
|
227
|
-
stripe_pi TEXT,
|
|
228
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
229
|
-
)
|
|
230
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS ledger_user_id ON ledger(user_id)"),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS ledger_stripe_pi_unique ON ledger(stripe_pi) WHERE stripe_pi IS NOT NULL"),await e.execute(`
|
|
231
|
-
CREATE TABLE IF NOT EXISTS credit_lots (
|
|
232
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
233
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
234
|
-
amount_mc INTEGER NOT NULL,
|
|
235
|
-
remaining_mc INTEGER NOT NULL,
|
|
236
|
-
source TEXT NOT NULL,
|
|
237
|
-
stripe_pi TEXT,
|
|
238
|
-
granted_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
239
|
-
expires_at TEXT NOT NULL,
|
|
240
|
-
never_expires INTEGER NOT NULL DEFAULT 0
|
|
241
|
-
)
|
|
242
|
-
`);try{await e.execute("ALTER TABLE credit_lots ADD COLUMN never_expires INTEGER NOT NULL DEFAULT 0")}catch{}await e.execute("CREATE INDEX IF NOT EXISTS credit_lots_user_active ON credit_lots(user_id, expires_at, remaining_mc)"),await e.execute(`
|
|
243
|
-
CREATE TABLE IF NOT EXISTS credit_lot_expirations (
|
|
244
|
-
lot_id INTEGER PRIMARY KEY REFERENCES credit_lots(id),
|
|
245
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
246
|
-
amount_mc INTEGER NOT NULL,
|
|
247
|
-
claim_token TEXT NOT NULL UNIQUE,
|
|
248
|
-
expired_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
249
|
-
)
|
|
250
|
-
`),await e.execute(`
|
|
251
|
-
CREATE TRIGGER IF NOT EXISTS credit_lots_bounds_insert
|
|
252
|
-
BEFORE INSERT ON credit_lots
|
|
253
|
-
WHEN NEW.amount_mc < 0
|
|
254
|
-
OR NEW.remaining_mc < 0
|
|
255
|
-
OR NEW.remaining_mc > NEW.amount_mc
|
|
256
|
-
BEGIN
|
|
257
|
-
SELECT RAISE(ABORT, 'invalid credit lot bounds');
|
|
258
|
-
END
|
|
259
|
-
`),await e.execute(`
|
|
260
|
-
CREATE TRIGGER IF NOT EXISTS credit_lots_bounds_update
|
|
261
|
-
BEFORE UPDATE OF amount_mc, remaining_mc ON credit_lots
|
|
262
|
-
WHEN NEW.amount_mc < 0
|
|
263
|
-
OR NEW.remaining_mc < 0
|
|
264
|
-
OR NEW.remaining_mc > NEW.amount_mc
|
|
265
|
-
BEGIN
|
|
266
|
-
SELECT RAISE(ABORT, 'invalid credit lot bounds');
|
|
267
|
-
END
|
|
268
|
-
`),await e.execute(`
|
|
269
|
-
CREATE TRIGGER IF NOT EXISTS credit_lots_one_migration_insert
|
|
270
|
-
BEFORE INSERT ON credit_lots
|
|
271
|
-
WHEN NEW.source = 'migration'
|
|
272
|
-
AND EXISTS (
|
|
273
|
-
SELECT 1 FROM credit_lots
|
|
274
|
-
WHERE user_id = NEW.user_id AND source = 'migration'
|
|
275
|
-
)
|
|
276
|
-
BEGIN
|
|
277
|
-
SELECT RAISE(ABORT, 'duplicate migration lot');
|
|
278
|
-
END
|
|
279
|
-
`),await e.execute(`
|
|
280
|
-
CREATE TRIGGER IF NOT EXISTS credit_lots_one_migration_update
|
|
281
|
-
BEFORE UPDATE OF source, user_id ON credit_lots
|
|
282
|
-
WHEN NEW.source = 'migration'
|
|
283
|
-
AND EXISTS (
|
|
284
|
-
SELECT 1 FROM credit_lots
|
|
285
|
-
WHERE user_id = NEW.user_id
|
|
286
|
-
AND source = 'migration'
|
|
287
|
-
AND id != OLD.id
|
|
288
|
-
)
|
|
289
|
-
BEGIN
|
|
290
|
-
SELECT RAISE(ABORT, 'duplicate migration lot');
|
|
291
|
-
END
|
|
292
|
-
`),await e.execute(`
|
|
293
|
-
CREATE TABLE IF NOT EXISTS credit_lot_repairs (
|
|
294
|
-
repair_id TEXT PRIMARY KEY,
|
|
295
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
296
|
-
report_sha256 TEXT NOT NULL,
|
|
297
|
-
classification TEXT NOT NULL,
|
|
298
|
-
before_json TEXT NOT NULL,
|
|
299
|
-
plan_json TEXT NOT NULL,
|
|
300
|
-
after_json TEXT,
|
|
301
|
-
status TEXT NOT NULL DEFAULT 'claimed',
|
|
302
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
303
|
-
applied_at TEXT
|
|
304
|
-
)
|
|
305
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS credit_lot_repairs_user_applied ON credit_lot_repairs(user_id, applied_at)"),await e.execute(`
|
|
306
|
-
CREATE TABLE IF NOT EXISTS free_credit_refreshes (
|
|
307
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
308
|
-
month TEXT NOT NULL,
|
|
309
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
310
|
-
PRIMARY KEY (user_id, month)
|
|
311
|
-
)
|
|
312
|
-
`),await e.execute(`
|
|
313
|
-
CREATE TABLE IF NOT EXISTS billing_authorizations (
|
|
314
|
-
id TEXT PRIMARY KEY,
|
|
315
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
316
|
-
idempotency_key TEXT NOT NULL UNIQUE,
|
|
317
|
-
billing_class TEXT NOT NULL,
|
|
318
|
-
status TEXT NOT NULL,
|
|
319
|
-
minimum_amount_mc INTEGER NOT NULL,
|
|
320
|
-
maximum_amount_mc INTEGER NOT NULL,
|
|
321
|
-
token_hash TEXT NOT NULL,
|
|
322
|
-
metadata TEXT,
|
|
323
|
-
expires_at TEXT NOT NULL,
|
|
324
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
325
|
-
settled_at TEXT
|
|
326
|
-
)
|
|
327
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS billing_authorizations_user_status ON billing_authorizations(user_id, status, expires_at)"),await e.execute(`
|
|
328
|
-
CREATE TABLE IF NOT EXISTS billing_events (
|
|
329
|
-
id TEXT PRIMARY KEY,
|
|
330
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
331
|
-
authorization_id TEXT REFERENCES billing_authorizations(id),
|
|
332
|
-
idempotency_key TEXT NOT NULL UNIQUE,
|
|
333
|
-
billing_class TEXT NOT NULL,
|
|
334
|
-
source_surface TEXT NOT NULL,
|
|
335
|
-
status TEXT NOT NULL,
|
|
336
|
-
amount_mc INTEGER NOT NULL DEFAULT 0,
|
|
337
|
-
raw_cost_usd_nanos INTEGER,
|
|
338
|
-
multiplier_bps INTEGER,
|
|
339
|
-
input_tokens INTEGER,
|
|
340
|
-
output_tokens INTEGER,
|
|
341
|
-
cached_tokens INTEGER,
|
|
342
|
-
model_steps INTEGER,
|
|
343
|
-
metadata TEXT,
|
|
344
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
345
|
-
settled_at TEXT
|
|
346
|
-
)
|
|
347
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS billing_events_user_created_at ON billing_events(user_id, created_at DESC)"),await e.execute("CREATE INDEX IF NOT EXISTS billing_events_authorization ON billing_events(authorization_id)"),await e.execute(`
|
|
348
|
-
CREATE TABLE IF NOT EXISTS billing_debits (
|
|
349
|
-
idempotency_key TEXT PRIMARY KEY,
|
|
350
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
351
|
-
amount_mc INTEGER NOT NULL,
|
|
352
|
-
operation TEXT NOT NULL,
|
|
353
|
-
description TEXT,
|
|
354
|
-
status TEXT NOT NULL DEFAULT 'claimed',
|
|
355
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
356
|
-
applied_at TEXT
|
|
357
|
-
)
|
|
358
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS billing_debits_user_status ON billing_debits(user_id, status)"),await e.execute(`
|
|
359
|
-
CREATE TABLE IF NOT EXISTS billing_debit_allocations (
|
|
360
|
-
debit_idempotency_key TEXT NOT NULL REFERENCES billing_debits(idempotency_key),
|
|
361
|
-
lot_id INTEGER NOT NULL REFERENCES credit_lots(id),
|
|
362
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
363
|
-
amount_mc INTEGER NOT NULL,
|
|
364
|
-
expires_at TEXT NOT NULL,
|
|
365
|
-
PRIMARY KEY (debit_idempotency_key, lot_id)
|
|
366
|
-
)
|
|
367
|
-
`),await e.execute(`
|
|
368
|
-
CREATE TABLE IF NOT EXISTS connected_account_billing (
|
|
369
|
-
user_id INTEGER PRIMARY KEY REFERENCES users(id),
|
|
370
|
-
stripe_subscription_id TEXT,
|
|
371
|
-
stripe_subscription_item_id TEXT,
|
|
372
|
-
price_id TEXT,
|
|
373
|
-
quantity INTEGER NOT NULL DEFAULT 0,
|
|
374
|
-
status TEXT NOT NULL DEFAULT 'pending',
|
|
375
|
-
last_error_code TEXT,
|
|
376
|
-
checked_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
377
|
-
synced_at TEXT,
|
|
378
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
379
|
-
)
|
|
380
|
-
`),await e.execute(`
|
|
381
|
-
CREATE TABLE IF NOT EXISTS connected_account_charges (
|
|
382
|
-
user_id INTEGER NOT NULL,
|
|
383
|
-
connection_id TEXT NOT NULL,
|
|
384
|
-
period_start TEXT NOT NULL,
|
|
385
|
-
amount_mc INTEGER NOT NULL,
|
|
386
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
387
|
-
PRIMARY KEY (user_id, connection_id, period_start)
|
|
388
|
-
)
|
|
389
|
-
`),await e.execute(`
|
|
390
|
-
CREATE TABLE IF NOT EXISTS connected_account_charge_transfers (
|
|
391
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
392
|
-
user_id INTEGER NOT NULL,
|
|
393
|
-
period_start TEXT NOT NULL,
|
|
394
|
-
from_connection_id TEXT NOT NULL,
|
|
395
|
-
to_connection_id TEXT NOT NULL,
|
|
396
|
-
provider_config_key TEXT NOT NULL,
|
|
397
|
-
transferred_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
398
|
-
UNIQUE (user_id, period_start, from_connection_id),
|
|
399
|
-
CHECK (from_connection_id <> to_connection_id)
|
|
400
|
-
)
|
|
401
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS connected_account_charge_transfers_destination ON connected_account_charge_transfers(user_id, period_start, to_connection_id, transferred_at DESC)"),await e.execute(`
|
|
402
|
-
CREATE TABLE IF NOT EXISTS billing_credits (
|
|
403
|
-
idempotency_key TEXT PRIMARY KEY,
|
|
404
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
405
|
-
amount_mc INTEGER NOT NULL,
|
|
406
|
-
operation TEXT NOT NULL,
|
|
407
|
-
description TEXT,
|
|
408
|
-
status TEXT NOT NULL DEFAULT 'claimed',
|
|
409
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
410
|
-
applied_at TEXT
|
|
411
|
-
)
|
|
412
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS billing_credits_user_status ON billing_credits(user_id, status)"),await e.execute(`
|
|
413
|
-
CREATE TABLE IF NOT EXISTS operation_runs (
|
|
414
|
-
id TEXT PRIMARY KEY,
|
|
415
|
-
user_id INTEGER REFERENCES users(id),
|
|
416
|
-
owner_scope_hash TEXT NOT NULL,
|
|
417
|
-
tool TEXT NOT NULL,
|
|
418
|
-
idempotency_scope_hash TEXT,
|
|
419
|
-
request_fingerprint TEXT,
|
|
420
|
-
job_id TEXT,
|
|
421
|
-
request_id TEXT,
|
|
422
|
-
deployment_commit TEXT,
|
|
423
|
-
normalized_flags_json TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(normalized_flags_json)),
|
|
424
|
-
status TEXT NOT NULL DEFAULT 'running'
|
|
425
|
-
CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled', 'timed_out', 'interrupted', 'unknown')),
|
|
426
|
-
failure_class TEXT,
|
|
427
|
-
started_at TEXT NOT NULL,
|
|
428
|
-
ended_at TEXT,
|
|
429
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
430
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
431
|
-
CHECK ((idempotency_scope_hash IS NULL AND request_fingerprint IS NULL)
|
|
432
|
-
OR (idempotency_scope_hash IS NOT NULL AND request_fingerprint IS NOT NULL)),
|
|
433
|
-
CHECK ((status = 'running' AND ended_at IS NULL) OR (status <> 'running' AND ended_at IS NOT NULL))
|
|
434
|
-
)
|
|
435
|
-
`),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS operation_runs_idempotency_scope ON operation_runs(idempotency_scope_hash) WHERE idempotency_scope_hash IS NOT NULL"),await e.execute("CREATE INDEX IF NOT EXISTS operation_runs_user_started ON operation_runs(user_id, started_at DESC)"),await e.execute("CREATE INDEX IF NOT EXISTS operation_runs_tool_started ON operation_runs(tool, started_at DESC)"),await e.execute("CREATE INDEX IF NOT EXISTS operation_runs_status_started ON operation_runs(status, started_at)"),await e.execute(`
|
|
436
|
-
CREATE TABLE IF NOT EXISTS maps_place_runs (
|
|
437
|
-
id TEXT PRIMARY KEY,
|
|
438
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
439
|
-
idempotency_key_hash TEXT NOT NULL,
|
|
440
|
-
request_fingerprint TEXT NOT NULL,
|
|
441
|
-
declaration_json TEXT NOT NULL CHECK (json_valid(declaration_json)),
|
|
442
|
-
status TEXT NOT NULL DEFAULT 'queued' CHECK (status IN ('queued','running','interrupted','complete','partial','failed','cancelled')),
|
|
443
|
-
billing_state TEXT NOT NULL DEFAULT 'unreserved' CHECK (billing_state IN ('unreserved','held','settling','settled','refunded','pending_reconciliation')),
|
|
444
|
-
field_states_json TEXT NOT NULL CHECK (json_valid(field_states_json)),
|
|
445
|
-
core_json TEXT CHECK (core_json IS NULL OR json_valid(core_json)),
|
|
446
|
-
verified INTEGER NOT NULL DEFAULT 0 CHECK (verified IN (0,1)),
|
|
447
|
-
checkpoint_revision INTEGER NOT NULL DEFAULT 0 CHECK (checkpoint_revision >= 0),
|
|
448
|
-
current_attempt_id TEXT,
|
|
449
|
-
current_fence_token TEXT,
|
|
450
|
-
lease_expires_at TEXT,
|
|
451
|
-
operation_run_id TEXT,
|
|
452
|
-
concurrency_lock_id TEXT,
|
|
453
|
-
error_code TEXT,
|
|
454
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
455
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
456
|
-
UNIQUE(user_id, idempotency_key_hash)
|
|
457
|
-
)
|
|
458
|
-
`),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS maps_place_runs_owner_key ON maps_place_runs(user_id,idempotency_key_hash)"),await e.execute("CREATE INDEX IF NOT EXISTS maps_place_runs_status_lease ON maps_place_runs(status,lease_expires_at)"),await e.execute(`
|
|
459
|
-
CREATE TABLE IF NOT EXISTS maps_place_attempts (
|
|
460
|
-
id TEXT PRIMARY KEY,
|
|
461
|
-
run_id TEXT NOT NULL REFERENCES maps_place_runs(id) ON DELETE CASCADE,
|
|
462
|
-
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
463
|
-
resume_key_hash TEXT,
|
|
464
|
-
fence_token TEXT NOT NULL,
|
|
465
|
-
status TEXT NOT NULL CHECK (status IN ('running','complete','partial','failed','interrupted','cancelled')),
|
|
466
|
-
lease_expires_at TEXT NOT NULL,
|
|
467
|
-
hold_key TEXT NOT NULL,
|
|
468
|
-
held_amount_mc INTEGER NOT NULL DEFAULT 0,
|
|
469
|
-
final_amount_mc INTEGER,
|
|
470
|
-
billing_state TEXT NOT NULL DEFAULT 'unreserved',
|
|
471
|
-
started_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
472
|
-
ended_at TEXT,
|
|
473
|
-
UNIQUE(run_id,attempt_number),
|
|
474
|
-
UNIQUE(run_id,resume_key_hash)
|
|
475
|
-
)
|
|
476
|
-
`),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS maps_place_attempts_run_number ON maps_place_attempts(run_id,attempt_number)"),await e.execute(`
|
|
477
|
-
CREATE TABLE IF NOT EXISTS maps_place_run_events (
|
|
478
|
-
id TEXT PRIMARY KEY,
|
|
479
|
-
run_id TEXT NOT NULL REFERENCES maps_place_runs(id) ON DELETE CASCADE,
|
|
480
|
-
attempt_id TEXT,
|
|
481
|
-
revision INTEGER NOT NULL,
|
|
482
|
-
event_type TEXT NOT NULL,
|
|
483
|
-
details_json TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(details_json)),
|
|
484
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
485
|
-
)
|
|
486
|
-
`),await e.execute(`
|
|
487
|
-
CREATE TABLE IF NOT EXISTS maps_place_reviews (
|
|
488
|
-
run_id TEXT NOT NULL REFERENCES maps_place_runs(id) ON DELETE CASCADE,
|
|
489
|
-
review_key TEXT NOT NULL,
|
|
490
|
-
ordinal INTEGER NOT NULL,
|
|
491
|
-
record_json TEXT NOT NULL CHECK (json_valid(record_json)),
|
|
492
|
-
PRIMARY KEY(run_id,review_key)
|
|
493
|
-
)
|
|
494
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS maps_place_reviews_order ON maps_place_reviews(run_id,ordinal,review_key)"),await e.execute(`
|
|
495
|
-
CREATE TABLE IF NOT EXISTS maps_place_images (
|
|
496
|
-
run_id TEXT NOT NULL REFERENCES maps_place_runs(id) ON DELETE CASCADE,
|
|
497
|
-
media_key TEXT NOT NULL,
|
|
498
|
-
ordinal INTEGER NOT NULL,
|
|
499
|
-
record_json TEXT NOT NULL CHECK (json_valid(record_json)),
|
|
500
|
-
PRIMARY KEY(run_id,media_key)
|
|
501
|
-
)
|
|
502
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS maps_place_images_order ON maps_place_images(run_id,ordinal,media_key)"),await e.execute(`
|
|
503
|
-
CREATE TABLE IF NOT EXISTS operation_attempts (
|
|
504
|
-
id TEXT PRIMARY KEY,
|
|
505
|
-
run_id TEXT NOT NULL REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
506
|
-
parent_attempt_id TEXT,
|
|
507
|
-
attempt_number INTEGER NOT NULL CHECK (attempt_number > 0),
|
|
508
|
-
edge_kind TEXT CHECK (edge_kind IN ('next_phase', 'parallel_child', 'same_method_retry', 'provider_fallback', 'durable_resume', 'reconciliation')),
|
|
509
|
-
retry_kind TEXT CHECK (retry_kind IN ('same_method', 'provider_fallback', 'durable_resume', 'reconciliation')),
|
|
510
|
-
retry_reason TEXT,
|
|
511
|
-
retry_owner TEXT,
|
|
512
|
-
method TEXT NOT NULL,
|
|
513
|
-
provider TEXT,
|
|
514
|
-
normalized_flags_json TEXT NOT NULL DEFAULT '{}' CHECK (json_valid(normalized_flags_json)),
|
|
515
|
-
status TEXT NOT NULL DEFAULT 'running'
|
|
516
|
-
CHECK (status IN ('running', 'succeeded', 'failed', 'cancelled', 'timed_out', 'interrupted', 'unknown')),
|
|
517
|
-
error_code TEXT,
|
|
518
|
-
error_message TEXT,
|
|
519
|
-
started_at TEXT NOT NULL,
|
|
520
|
-
ended_at TEXT,
|
|
521
|
-
duration_ms INTEGER CHECK (duration_ms IS NULL OR duration_ms >= 0),
|
|
522
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
523
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
524
|
-
UNIQUE (id, run_id),
|
|
525
|
-
FOREIGN KEY (parent_attempt_id, run_id) REFERENCES operation_attempts(id, run_id) ON DELETE RESTRICT,
|
|
526
|
-
CHECK ((attempt_number = 1 AND parent_attempt_id IS NULL AND edge_kind IS NULL AND retry_kind IS NULL)
|
|
527
|
-
OR (attempt_number > 1 AND parent_attempt_id IS NOT NULL AND edge_kind IS NOT NULL)),
|
|
528
|
-
CHECK (retry_kind IS NULL OR edge_kind IN ('same_method_retry', 'provider_fallback', 'durable_resume', 'reconciliation')),
|
|
529
|
-
CHECK ((status = 'running' AND ended_at IS NULL AND duration_ms IS NULL)
|
|
530
|
-
OR (status <> 'running' AND ended_at IS NOT NULL AND duration_ms IS NOT NULL))
|
|
531
|
-
)
|
|
532
|
-
`),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS operation_attempts_run_number ON operation_attempts(run_id, attempt_number)"),await e.execute("CREATE INDEX IF NOT EXISTS operation_attempts_provider_status ON operation_attempts(provider, status, started_at)"),await e.execute(b()),await e.execute("CREATE INDEX IF NOT EXISTS provider_usage_receipts_attempt ON provider_usage_receipts(attempt_id, created_at)"),await e.execute("CREATE INDEX IF NOT EXISTS provider_usage_receipts_pending ON provider_usage_receipts(cost_state, checked_at, created_at) WHERE cost_state = 'pending'"),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS provider_usage_receipts_provider_source ON provider_usage_receipts(provider, account_scope_hash, method, provider_source_key_hash) WHERE provider_source_key_hash IS NOT NULL"),await e.execute(`
|
|
533
|
-
CREATE TABLE IF NOT EXISTS provider_reconciliation_runs (
|
|
534
|
-
id TEXT PRIMARY KEY,
|
|
535
|
-
provider TEXT NOT NULL,
|
|
536
|
-
status TEXT NOT NULL DEFAULT 'running' CHECK (status IN ('running', 'completed', 'failed')),
|
|
537
|
-
checked_count INTEGER NOT NULL DEFAULT 0 CHECK (checked_count >= 0),
|
|
538
|
-
completed_count INTEGER NOT NULL DEFAULT 0 CHECK (completed_count >= 0),
|
|
539
|
-
pending_count INTEGER NOT NULL DEFAULT 0 CHECK (pending_count >= 0),
|
|
540
|
-
unavailable_count INTEGER NOT NULL DEFAULT 0 CHECK (unavailable_count >= 0),
|
|
541
|
-
failed_count INTEGER NOT NULL DEFAULT 0 CHECK (failed_count >= 0),
|
|
542
|
-
error_code TEXT,
|
|
543
|
-
started_at TEXT NOT NULL,
|
|
544
|
-
completed_at TEXT,
|
|
545
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
546
|
-
CHECK ((status = 'running' AND completed_at IS NULL) OR (status <> 'running' AND completed_at IS NOT NULL))
|
|
547
|
-
)
|
|
548
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS provider_reconciliation_runs_provider_started ON provider_reconciliation_runs(provider, started_at DESC)"),await e.execute(`
|
|
549
|
-
CREATE TABLE IF NOT EXISTS provider_account_windows (
|
|
550
|
-
id TEXT PRIMARY KEY,
|
|
551
|
-
provider TEXT NOT NULL,
|
|
552
|
-
provider_product TEXT NOT NULL,
|
|
553
|
-
account_scope_hash TEXT NOT NULL,
|
|
554
|
-
window_start TEXT NOT NULL,
|
|
555
|
-
window_end TEXT NOT NULL,
|
|
556
|
-
source TEXT NOT NULL,
|
|
557
|
-
source_observed_at TEXT NOT NULL,
|
|
558
|
-
account_total_usd_nanos INTEGER NOT NULL CHECK (account_total_usd_nanos >= 0),
|
|
559
|
-
actual_usd_nanos INTEGER NOT NULL CHECK (actual_usd_nanos >= 0),
|
|
560
|
-
measured_usd_nanos INTEGER NOT NULL CHECK (measured_usd_nanos >= 0),
|
|
561
|
-
estimated_usd_nanos INTEGER NOT NULL CHECK (estimated_usd_nanos >= 0),
|
|
562
|
-
unattributed_usd_nanos INTEGER NOT NULL,
|
|
563
|
-
pending_count INTEGER NOT NULL CHECK (pending_count >= 0),
|
|
564
|
-
unavailable_count INTEGER NOT NULL CHECK (unavailable_count >= 0),
|
|
565
|
-
receipt_count INTEGER NOT NULL CHECK (receipt_count >= 0),
|
|
566
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
567
|
-
CHECK (window_start < window_end),
|
|
568
|
-
CHECK (account_total_usd_nanos = actual_usd_nanos + measured_usd_nanos + estimated_usd_nanos + unattributed_usd_nanos),
|
|
569
|
-
UNIQUE (provider, provider_product, account_scope_hash, window_start, window_end, source)
|
|
570
|
-
)
|
|
571
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS provider_account_windows_lookup ON provider_account_windows(provider, provider_product, window_start, window_end)"),await e.execute(`
|
|
572
|
-
CREATE TABLE IF NOT EXISTS operation_coverage_defects (
|
|
573
|
-
id TEXT PRIMARY KEY,
|
|
574
|
-
tool TEXT NOT NULL,
|
|
575
|
-
method TEXT NOT NULL,
|
|
576
|
-
phase TEXT NOT NULL,
|
|
577
|
-
error_code TEXT NOT NULL,
|
|
578
|
-
run_id TEXT,
|
|
579
|
-
attempt_id TEXT,
|
|
580
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
581
|
-
)
|
|
582
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS operation_coverage_defects_created ON operation_coverage_defects(created_at, tool, method)"),await e.execute(`
|
|
583
|
-
CREATE TABLE IF NOT EXISTS operation_billing_links (
|
|
584
|
-
run_id TEXT NOT NULL REFERENCES operation_runs(id) ON DELETE CASCADE,
|
|
585
|
-
billing_table TEXT NOT NULL CHECK (billing_table IN ('billing_authorizations', 'billing_events', 'billing_debits', 'billing_credits', 'ledger')),
|
|
586
|
-
billing_key TEXT NOT NULL,
|
|
587
|
-
relation TEXT NOT NULL CHECK (relation IN ('hold', 'settlement', 'debit', 'refund', 'refund_pending')),
|
|
588
|
-
amount_mc INTEGER CHECK (amount_mc IS NULL OR amount_mc >= 0),
|
|
589
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
590
|
-
PRIMARY KEY (run_id, billing_table, billing_key, relation)
|
|
591
|
-
)
|
|
592
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS operation_billing_links_run ON operation_billing_links(run_id, created_at)"),await e.execute(`
|
|
593
|
-
CREATE TABLE IF NOT EXISTS admin_credit_adjustments (
|
|
594
|
-
reference TEXT PRIMARY KEY,
|
|
595
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
596
|
-
direction TEXT NOT NULL,
|
|
597
|
-
amount_mc INTEGER NOT NULL,
|
|
598
|
-
reason TEXT NOT NULL,
|
|
599
|
-
actor TEXT NOT NULL,
|
|
600
|
-
status TEXT NOT NULL DEFAULT 'applied',
|
|
601
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
602
|
-
updated_at TEXT
|
|
603
|
-
)
|
|
604
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS admin_credit_adjustments_user_created ON admin_credit_adjustments(user_id, created_at)"),await e.execute(`
|
|
605
|
-
CREATE TABLE IF NOT EXISTS admin_credit_adjustment_events (
|
|
606
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
607
|
-
reference TEXT NOT NULL REFERENCES admin_credit_adjustments(reference),
|
|
608
|
-
seq INTEGER NOT NULL,
|
|
609
|
-
kind TEXT NOT NULL,
|
|
610
|
-
from_amount_mc INTEGER,
|
|
611
|
-
to_amount_mc INTEGER,
|
|
612
|
-
from_reason TEXT,
|
|
613
|
-
to_reason TEXT,
|
|
614
|
-
moved_mc INTEGER NOT NULL DEFAULT 0,
|
|
615
|
-
actor TEXT NOT NULL,
|
|
616
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
617
|
-
UNIQUE (reference, seq)
|
|
618
|
-
)
|
|
619
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS admin_credit_adjustment_events_reference ON admin_credit_adjustment_events(reference)"),await e.execute(`
|
|
620
|
-
CREATE TABLE IF NOT EXISTS site_audit_jobs (
|
|
621
|
-
id TEXT PRIMARY KEY,
|
|
622
|
-
user_id INTEGER,
|
|
623
|
-
status TEXT DEFAULT 'pending',
|
|
624
|
-
client_domain TEXT,
|
|
625
|
-
session_path TEXT,
|
|
626
|
-
request TEXT,
|
|
627
|
-
result TEXT,
|
|
628
|
-
error TEXT,
|
|
629
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
630
|
-
updated_at TEXT DEFAULT (datetime('now'))
|
|
631
|
-
)
|
|
632
|
-
`),await e.execute(`
|
|
633
|
-
CREATE TABLE IF NOT EXISTS site_audit_phase_log (
|
|
634
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
635
|
-
job_id TEXT REFERENCES site_audit_jobs(id),
|
|
636
|
-
phase TEXT,
|
|
637
|
-
completed_at TEXT DEFAULT (datetime('now')),
|
|
638
|
-
output_summary TEXT
|
|
639
|
-
)
|
|
640
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS site_audit_jobs_user_id ON site_audit_jobs(user_id)"),await e.execute("CREATE INDEX IF NOT EXISTS site_audit_jobs_status ON site_audit_jobs(status)"),await e.execute("CREATE INDEX IF NOT EXISTS site_audit_phase_log_job_id ON site_audit_phase_log(job_id)"),await e.execute(`
|
|
641
|
-
CREATE TABLE IF NOT EXISTS site_extract_jobs (
|
|
642
|
-
id TEXT PRIMARY KEY,
|
|
643
|
-
user_id INTEGER,
|
|
644
|
-
status TEXT DEFAULT 'pending',
|
|
645
|
-
dispatch_claim_token TEXT,
|
|
646
|
-
dispatch_claim_until TEXT,
|
|
647
|
-
dispatched_at TEXT,
|
|
648
|
-
settlement_plan_json TEXT,
|
|
649
|
-
settlement_receipt_json TEXT,
|
|
650
|
-
execution_generation INTEGER NOT NULL DEFAULT 0,
|
|
651
|
-
refinalize_until TEXT,
|
|
652
|
-
start_url TEXT,
|
|
653
|
-
options TEXT,
|
|
654
|
-
total_urls INTEGER DEFAULT 0,
|
|
655
|
-
done_urls INTEGER DEFAULT 0,
|
|
656
|
-
attempted_urls INTEGER DEFAULT 0,
|
|
657
|
-
successful_urls INTEGER DEFAULT 0,
|
|
658
|
-
failed_urls INTEGER DEFAULT 0,
|
|
659
|
-
idempotency_key TEXT,
|
|
660
|
-
request_fingerprint TEXT,
|
|
661
|
-
dispatch_attempts INTEGER DEFAULT 0,
|
|
662
|
-
next_dispatch_at TEXT,
|
|
663
|
-
dispatch_error TEXT,
|
|
664
|
-
settlement_attempts INTEGER DEFAULT 0,
|
|
665
|
-
next_settlement_at TEXT,
|
|
666
|
-
settlement_error TEXT,
|
|
667
|
-
artifacts TEXT,
|
|
668
|
-
error TEXT,
|
|
669
|
-
public_error_json TEXT,
|
|
670
|
-
billed_mc INTEGER,
|
|
671
|
-
created_at TEXT DEFAULT (datetime('now')),
|
|
672
|
-
updated_at TEXT DEFAULT (datetime('now'))
|
|
673
|
-
)
|
|
674
|
-
`),await e.execute(`
|
|
675
|
-
CREATE TABLE IF NOT EXISTS site_extract_pages (
|
|
676
|
-
job_id TEXT,
|
|
677
|
-
url TEXT,
|
|
678
|
-
page TEXT,
|
|
679
|
-
PRIMARY KEY (job_id, url)
|
|
680
|
-
)
|
|
681
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS site_extract_jobs_user_id ON site_extract_jobs(user_id)"),await e.execute("CREATE INDEX IF NOT EXISTS site_extract_jobs_status ON site_extract_jobs(status)"),await e.execute("CREATE INDEX IF NOT EXISTS site_extract_pages_job_id ON site_extract_pages(job_id)");try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN dispatch_claim_token TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN dispatch_claim_until TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN dispatched_at TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN settlement_plan_json TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN settlement_receipt_json TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN execution_generation INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN refinalize_until TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN attempted_urls INTEGER DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN successful_urls INTEGER DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN failed_urls INTEGER DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN idempotency_key TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN request_fingerprint TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN dispatch_attempts INTEGER DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN next_dispatch_at TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN dispatch_error TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN settlement_attempts INTEGER DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN next_settlement_at TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN settlement_error TEXT")}catch{}try{await e.execute("ALTER TABLE site_extract_jobs ADD COLUMN public_error_json TEXT")}catch{}await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS site_extract_jobs_idempotency ON site_extract_jobs(user_id, idempotency_key) WHERE idempotency_key IS NOT NULL"),await e.execute(`
|
|
682
|
-
CREATE TABLE IF NOT EXISTS password_reset_tokens (
|
|
683
|
-
token TEXT PRIMARY KEY,
|
|
684
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
685
|
-
expires_at TEXT NOT NULL,
|
|
686
|
-
used INTEGER NOT NULL DEFAULT 0,
|
|
687
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
688
|
-
)
|
|
689
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS prt_user_id ON password_reset_tokens(user_id)"),await e.execute(`
|
|
690
|
-
CREATE TABLE IF NOT EXISTS rate_limits (
|
|
691
|
-
scope TEXT NOT NULL,
|
|
692
|
-
key_hash TEXT NOT NULL,
|
|
693
|
-
window_start INTEGER NOT NULL,
|
|
694
|
-
count INTEGER NOT NULL DEFAULT 0,
|
|
695
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
696
|
-
PRIMARY KEY (scope, key_hash, window_start)
|
|
697
|
-
)
|
|
698
|
-
`),await e.execute(`
|
|
699
|
-
CREATE TABLE IF NOT EXISTS request_events (
|
|
700
|
-
id TEXT PRIMARY KEY,
|
|
701
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
702
|
-
source TEXT NOT NULL,
|
|
703
|
-
status TEXT NOT NULL,
|
|
704
|
-
query TEXT NOT NULL,
|
|
705
|
-
location TEXT,
|
|
706
|
-
result_count INTEGER,
|
|
707
|
-
result TEXT,
|
|
708
|
-
error TEXT,
|
|
709
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
710
|
-
)
|
|
711
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS request_events_user_created_at ON request_events(user_id, created_at DESC)"),await e.execute("CREATE INDEX IF NOT EXISTS request_events_created_at ON request_events(created_at)"),await R(e),await e.execute(`
|
|
712
|
-
CREATE TABLE IF NOT EXISTS workflow_runs (
|
|
713
|
-
id TEXT PRIMARY KEY,
|
|
714
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
715
|
-
schedule_id TEXT,
|
|
716
|
-
workflow_id TEXT NOT NULL,
|
|
717
|
-
input_json TEXT NOT NULL,
|
|
718
|
-
status TEXT NOT NULL DEFAULT 'queued',
|
|
719
|
-
manifest_json TEXT,
|
|
720
|
-
error_message TEXT,
|
|
721
|
-
queued_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
722
|
-
started_at TEXT,
|
|
723
|
-
completed_at TEXT,
|
|
724
|
-
idempotency_key TEXT,
|
|
725
|
-
step_index INTEGER NOT NULL DEFAULT 0,
|
|
726
|
-
total_steps INTEGER,
|
|
727
|
-
step_state_json TEXT,
|
|
728
|
-
step_log_json TEXT,
|
|
729
|
-
webhook_url TEXT
|
|
730
|
-
)
|
|
731
|
-
`);try{await e.execute("ALTER TABLE workflow_runs ADD COLUMN step_index INTEGER NOT NULL DEFAULT 0")}catch{}try{await e.execute("ALTER TABLE workflow_runs ADD COLUMN total_steps INTEGER")}catch{}try{await e.execute("ALTER TABLE workflow_runs ADD COLUMN step_state_json TEXT")}catch{}try{await e.execute("ALTER TABLE workflow_runs ADD COLUMN step_log_json TEXT")}catch{}try{await e.execute("ALTER TABLE workflow_runs ADD COLUMN webhook_url TEXT")}catch{}await e.execute("CREATE INDEX IF NOT EXISTS workflow_runs_user_created ON workflow_runs(user_id, queued_at DESC)"),await e.execute("CREATE INDEX IF NOT EXISTS workflow_runs_schedule ON workflow_runs(schedule_id, queued_at DESC)"),await e.execute("CREATE UNIQUE INDEX IF NOT EXISTS workflow_runs_idempotency ON workflow_runs(idempotency_key) WHERE idempotency_key IS NOT NULL"),await e.execute(`
|
|
732
|
-
CREATE TABLE IF NOT EXISTS workflow_artifacts (
|
|
733
|
-
id TEXT PRIMARY KEY,
|
|
734
|
-
run_id TEXT NOT NULL REFERENCES workflow_runs(id),
|
|
735
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
736
|
-
kind TEXT NOT NULL,
|
|
737
|
-
label TEXT NOT NULL,
|
|
738
|
-
path TEXT NOT NULL,
|
|
739
|
-
content_type TEXT NOT NULL,
|
|
740
|
-
bytes INTEGER,
|
|
741
|
-
rows_count INTEGER,
|
|
742
|
-
content TEXT,
|
|
743
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
744
|
-
)
|
|
745
|
-
`);try{await e.execute("ALTER TABLE workflow_artifacts ADD COLUMN content TEXT")}catch{}await e.execute("CREATE INDEX IF NOT EXISTS workflow_artifacts_run ON workflow_artifacts(run_id)"),await e.execute(`
|
|
746
|
-
CREATE TABLE IF NOT EXISTS workflow_webhook_deliveries (
|
|
747
|
-
id TEXT PRIMARY KEY,
|
|
748
|
-
run_id TEXT NOT NULL REFERENCES workflow_runs(id),
|
|
749
|
-
schedule_id TEXT,
|
|
750
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
751
|
-
webhook_url TEXT NOT NULL,
|
|
752
|
-
status TEXT NOT NULL,
|
|
753
|
-
attempts INTEGER NOT NULL DEFAULT 0,
|
|
754
|
-
last_error TEXT,
|
|
755
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
756
|
-
delivered_at TEXT
|
|
757
|
-
)
|
|
758
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS workflow_webhook_deliveries_run ON workflow_webhook_deliveries(run_id)"),await e.execute(`
|
|
759
|
-
CREATE TABLE IF NOT EXISTS stripe_events (
|
|
760
|
-
event_id TEXT PRIMARY KEY,
|
|
761
|
-
status TEXT NOT NULL DEFAULT 'processed',
|
|
762
|
-
attempt_count INTEGER NOT NULL DEFAULT 1,
|
|
763
|
-
claim_token TEXT,
|
|
764
|
-
event_type TEXT,
|
|
765
|
-
stripe_created_at INTEGER,
|
|
766
|
-
received_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
767
|
-
claimed_at TEXT,
|
|
768
|
-
next_attempt_at TEXT,
|
|
769
|
-
completed_at TEXT,
|
|
770
|
-
last_error TEXT,
|
|
771
|
-
last_error_code TEXT,
|
|
772
|
-
processed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
773
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
774
|
-
)
|
|
775
|
-
`);for(let a of["status TEXT NOT NULL DEFAULT 'processed'","attempt_count INTEGER NOT NULL DEFAULT 1","claim_token TEXT","event_type TEXT","stripe_created_at INTEGER","received_at TEXT","claimed_at TEXT","next_attempt_at TEXT","completed_at TEXT","last_error TEXT","last_error_code TEXT","updated_at TEXT"])try{await e.execute(`ALTER TABLE stripe_events ADD COLUMN ${a}`)}catch{}await e.execute(`
|
|
776
|
-
UPDATE stripe_events
|
|
777
|
-
SET updated_at = COALESCE(updated_at, processed_at),
|
|
778
|
-
received_at = COALESCE(received_at, processed_at, updated_at, datetime('now')),
|
|
779
|
-
claimed_at = CASE WHEN status = 'processing' THEN COALESCE(claimed_at, updated_at, processed_at) ELSE claimed_at END,
|
|
780
|
-
next_attempt_at = CASE WHEN status = 'failed' THEN COALESCE(next_attempt_at, datetime('now')) ELSE next_attempt_at END,
|
|
781
|
-
completed_at = CASE WHEN status = 'processed' THEN COALESCE(completed_at, processed_at, updated_at) ELSE completed_at END,
|
|
782
|
-
status = CASE WHEN status = 'failed' THEN 'retryable' ELSE COALESCE(status, 'processed') END,
|
|
783
|
-
attempt_count = CASE WHEN status = 'pending' THEN MAX(0, COALESCE(attempt_count, 0)) ELSE MAX(1, COALESCE(attempt_count, 1)) END
|
|
784
|
-
WHERE updated_at IS NULL
|
|
785
|
-
OR received_at IS NULL
|
|
786
|
-
OR status IS NULL
|
|
787
|
-
OR status = 'failed'
|
|
788
|
-
OR (status = 'processing' AND claimed_at IS NULL)
|
|
789
|
-
OR (status = 'processed' AND completed_at IS NULL)
|
|
790
|
-
OR attempt_count IS NULL
|
|
791
|
-
OR attempt_count < 0
|
|
792
|
-
`),await e.execute(`
|
|
793
|
-
CREATE INDEX IF NOT EXISTS stripe_events_due
|
|
794
|
-
ON stripe_events(status, next_attempt_at, claimed_at, received_at)
|
|
795
|
-
`),await e.execute(`
|
|
796
|
-
CREATE TABLE IF NOT EXISTS oauth_clients (
|
|
797
|
-
client_id TEXT PRIMARY KEY,
|
|
798
|
-
redirect_uris TEXT NOT NULL,
|
|
799
|
-
name TEXT,
|
|
800
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
801
|
-
)
|
|
802
|
-
`),await e.execute(`
|
|
803
|
-
CREATE TABLE IF NOT EXISTS oauth_codes (
|
|
804
|
-
code TEXT PRIMARY KEY,
|
|
805
|
-
client_id TEXT NOT NULL,
|
|
806
|
-
redirect_uri TEXT NOT NULL,
|
|
807
|
-
code_challenge TEXT NOT NULL,
|
|
808
|
-
identity TEXT NOT NULL,
|
|
809
|
-
scope TEXT NOT NULL,
|
|
810
|
-
resource TEXT,
|
|
811
|
-
expires_at TEXT NOT NULL,
|
|
812
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
813
|
-
)
|
|
814
|
-
`),await e.execute(`
|
|
815
|
-
CREATE TABLE IF NOT EXISTS oauth_tokens (
|
|
816
|
-
refresh_token TEXT PRIMARY KEY,
|
|
817
|
-
client_id TEXT NOT NULL,
|
|
818
|
-
identity TEXT NOT NULL,
|
|
819
|
-
scope TEXT NOT NULL,
|
|
820
|
-
resource TEXT,
|
|
821
|
-
expires_at TEXT NOT NULL,
|
|
822
|
-
revoked INTEGER NOT NULL DEFAULT 0,
|
|
823
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
824
|
-
)
|
|
825
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS oauth_tokens_identity ON oauth_tokens(identity)");for(let a of["replaced_by TEXT","rotated_at TEXT"])try{await e.execute(`ALTER TABLE oauth_tokens ADD COLUMN ${a}`)}catch{}await e.execute(`
|
|
826
|
-
CREATE TABLE IF NOT EXISTS page_snapshots (
|
|
827
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
828
|
-
url TEXT NOT NULL,
|
|
829
|
-
content_hash TEXT NOT NULL,
|
|
830
|
-
content TEXT NOT NULL,
|
|
831
|
-
title TEXT,
|
|
832
|
-
content_bytes INTEGER NOT NULL,
|
|
833
|
-
truncated INTEGER NOT NULL DEFAULT 0,
|
|
834
|
-
checked_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
835
|
-
PRIMARY KEY (user_id, url)
|
|
836
|
-
)
|
|
837
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS page_snapshots_user_checked_at ON page_snapshots(user_id, checked_at DESC)"),await e.execute(`
|
|
838
|
-
CREATE TABLE IF NOT EXISTS inbox_messages (
|
|
839
|
-
id TEXT PRIMARY KEY,
|
|
840
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
841
|
-
subject TEXT NOT NULL,
|
|
842
|
-
body_md TEXT NOT NULL,
|
|
843
|
-
source TEXT NOT NULL DEFAULT 'operator',
|
|
844
|
-
sent_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
845
|
-
opened_at TEXT,
|
|
846
|
-
deleted_at TEXT
|
|
847
|
-
)
|
|
848
|
-
`),await e.execute("CREATE INDEX IF NOT EXISTS inbox_messages_user_sent_at ON inbox_messages(user_id, sent_at DESC)"),await e.execute(`
|
|
849
|
-
CREATE TABLE IF NOT EXISTS workshop_registrations (
|
|
850
|
-
id TEXT PRIMARY KEY,
|
|
851
|
-
event_slug TEXT NOT NULL,
|
|
852
|
-
email TEXT NOT NULL,
|
|
853
|
-
first_name TEXT NOT NULL,
|
|
854
|
-
last_name TEXT,
|
|
855
|
-
status TEXT NOT NULL,
|
|
856
|
-
zoom_registrant_id TEXT,
|
|
857
|
-
zoom_join_url TEXT,
|
|
858
|
-
resend_contact_id TEXT,
|
|
859
|
-
confirmation_email_id TEXT,
|
|
860
|
-
field_notes_email_id TEXT,
|
|
861
|
-
reminder_48h_email_id TEXT,
|
|
862
|
-
reminder_24h_email_id TEXT,
|
|
863
|
-
reminder_1h_email_id TEXT,
|
|
864
|
-
last_error TEXT,
|
|
865
|
-
registered_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
866
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
867
|
-
UNIQUE(event_slug, email)
|
|
868
|
-
)
|
|
869
|
-
`);for(let a of["field_notes_email_id TEXT","reminder_48h_email_id TEXT","reminder_24h_email_id TEXT","reminder_1h_email_id TEXT"])try{await e.execute(`ALTER TABLE workshop_registrations ADD COLUMN ${a}`)}catch{}if(await e.execute(`
|
|
870
|
-
CREATE INDEX IF NOT EXISTS workshop_registrations_event_status
|
|
871
|
-
ON workshop_registrations(event_slug, status, registered_at)
|
|
872
|
-
`),await e.execute(`
|
|
873
|
-
CREATE TABLE IF NOT EXISTS browser_profile_labels (
|
|
874
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
875
|
-
profile TEXT NOT NULL,
|
|
876
|
-
label TEXT NOT NULL,
|
|
877
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
878
|
-
updated_at TEXT,
|
|
879
|
-
PRIMARY KEY (user_id, profile)
|
|
880
|
-
)
|
|
881
|
-
`),await e.execute(`
|
|
882
|
-
CREATE TABLE IF NOT EXISTS serp_identities (
|
|
883
|
-
id TEXT PRIMARY KEY,
|
|
884
|
-
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
885
|
-
name TEXT NOT NULL,
|
|
886
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_profile_name TEXT NOT NULL,
|
|
887
|
-
\u006b\u0065\u0072\u006e\u0065\u006c_proxy_id TEXT NOT NULL,
|
|
888
|
-
proxy_type TEXT NOT NULL DEFAULT 'isp',
|
|
889
|
-
country TEXT NOT NULL DEFAULT 'US',
|
|
890
|
-
status TEXT NOT NULL DEFAULT 'ready',
|
|
891
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
892
|
-
updated_at TEXT,
|
|
893
|
-
last_used_at TEXT,
|
|
894
|
-
UNIQUE(user_id, name)
|
|
895
|
-
)
|
|
896
|
-
`),await e.execute(`
|
|
897
|
-
CREATE UNIQUE INDEX IF NOT EXISTS serp_identities_user_name
|
|
898
|
-
ON serp_identities(user_id, name)
|
|
899
|
-
`),!await p(e))throw new Error("core schema migration finished without all required tables, indexes, and columns");await m(e),await O(e),await e.execute({sql:"INSERT OR IGNORE INTO schema_migrations (version) VALUES (?)",args:[d]})}async function z(t={}){let e=await j(n());return await M(t),{providerUsageReceipts:e}}export{d as CORE_SCHEMA_VERSION,C as SITE_EXTRACT_COUNTER_REPAIR_VERSION,q as inspectCurrentCoreSchema,M as migrate,z as migrateCoreSchemaForRelease,W as migrateSecuredMainOAuthSchema,$ as verifySecuredMainOAuthSchema};
|