Skip to main content

chio_store_sqlite/
receipt_store.rs

1use std::collections::{BTreeMap, BTreeSet};
2use std::fs;
3use std::path::Path;
4use std::time::{SystemTime, UNIX_EPOCH};
5
6use chio_core::canonical::canonical_json_bytes;
7use chio_core::capability::{CapabilityToken, ChioScope};
8use chio_core::crypto::{sha256_hex, Signature};
9use chio_core::receipt::{
10    ChildRequestReceipt, ChioReceipt, Decision, FinancialReceiptMetadata,
11    GovernedTransactionReceiptMetadata, ReceiptAttributionMetadata, SettlementStatus,
12};
13use chio_core::session::OperationTerminalState;
14use chio_kernel::checkpoint::{KernelCheckpoint, KernelCheckpointBody};
15use chio_kernel::cost_attribution::{
16    CostAttributionChainHop, CostAttributionQuery, CostAttributionReceiptRow,
17    CostAttributionReport, CostAttributionSummary, LeafCostAttributionRow, RootCostAttributionRow,
18    MAX_COST_ATTRIBUTION_LIMIT,
19};
20use chio_kernel::dpop::DPOP_SCHEMA;
21use chio_kernel::operator_report::{
22    AuthorizationContextReport, AuthorizationContextRow, AuthorizationContextSenderConstraint,
23    AuthorizationContextSummary, BehavioralFeedGovernedActionSummary,
24    BehavioralFeedMeteredBillingRow, BehavioralFeedMeteredBillingSummary, BehavioralFeedQuery,
25    BehavioralFeedReceiptRow, BehavioralFeedReceiptSelection, BehavioralFeedSettlementSummary,
26    ChioOAuthAuthorizationDiscoveryMetadata, ChioOAuthAuthorizationExampleMapping,
27    ChioOAuthAuthorizationMetadataReport, ChioOAuthAuthorizationProfile,
28    ChioOAuthAuthorizationReviewPack, ChioOAuthAuthorizationReviewPackRecord,
29    ChioOAuthAuthorizationReviewPackSummary, ChioOAuthAuthorizationSupportBoundary,
30    ComplianceReport, EconomicCompletionFlowReport, EconomicCompletionFlowSummary,
31    EconomicReceiptMeteringProjection, EconomicReceiptProjectionReport,
32    EconomicReceiptProjectionRow, EconomicReceiptProjectionSummary,
33    EconomicReceiptSettlementProjection, GovernedAuthorizationCommerceDetail,
34    GovernedAuthorizationDetail, GovernedAuthorizationMeteredBillingDetail,
35    GovernedAuthorizationTransactionContext, MeteredBillingEvidenceRecord,
36    MeteredBillingReconciliationReport, MeteredBillingReconciliationRow,
37    MeteredBillingReconciliationState, MeteredBillingReconciliationSummary, OperatorReportQuery,
38    SettlementReconciliationReport, SettlementReconciliationRow, SettlementReconciliationState,
39    SettlementReconciliationSummary, SharedEvidenceQuery, SharedEvidenceReferenceReport,
40    SharedEvidenceReferenceRow, SharedEvidenceReferenceSummary,
41    CHIO_OAUTH_AUTHORIZATION_COMMERCE_DETAIL_TYPE, CHIO_OAUTH_AUTHORIZATION_CONTEXT_REPORT_SCHEMA,
42    CHIO_OAUTH_AUTHORIZATION_METADATA_SCHEMA, CHIO_OAUTH_AUTHORIZATION_METERED_BILLING_DETAIL_TYPE,
43    CHIO_OAUTH_AUTHORIZATION_REVIEW_PACK_SCHEMA, CHIO_OAUTH_AUTHORIZATION_TOOL_DETAIL_TYPE,
44    CHIO_OAUTH_SENDER_PROOF_CHIO_DPOP, ECONOMIC_COMPLETION_FLOW_SCHEMA,
45};
46use chio_kernel::receipt_analytics::{
47    AgentAnalyticsRow, AnalyticsTimeBucket, ReceiptAnalyticsMetrics, ReceiptAnalyticsQuery,
48    ReceiptAnalyticsResponse, TimeAnalyticsRow, ToolAnalyticsRow, MAX_ANALYTICS_GROUP_LIMIT,
49};
50use chio_kernel::receipt_query::{ReceiptQuery, ReceiptQueryResult, MAX_QUERY_LIMIT};
51use chio_kernel::receipt_store::{ReceiptLineageStatementLink, ReceiptLineageVerification};
52use chio_kernel::{
53    CapabilitySnapshot, CreditBondDisposition, CreditBondLifecycleState, CreditBondListQuery,
54    CreditBondListReport, CreditBondListSummary, CreditBondRow, CreditFacilityDisposition,
55    CreditFacilityLifecycleState, CreditFacilityListQuery, CreditFacilityListReport,
56    CreditFacilityListSummary, CreditFacilityRow, CreditLossLifecycleEventKind,
57    CreditLossLifecycleListQuery, CreditLossLifecycleListReport, CreditLossLifecycleListSummary,
58    CreditLossLifecycleRow, EvidenceChildReceiptScope, EvidenceExportQuery, ExposureLedgerQuery,
59    FederatedEvidenceShareImport, FederatedEvidenceShareSummary, LiabilityAutoBindDisposition,
60    LiabilityClaimPayoutReconciliationState, LiabilityClaimResponseDisposition,
61    LiabilityClaimSettlementReconciliationState, LiabilityClaimWorkflowQuery,
62    LiabilityClaimWorkflowReport, LiabilityClaimWorkflowRow, LiabilityClaimWorkflowSummary,
63    LiabilityMarketWorkflowQuery, LiabilityMarketWorkflowReport, LiabilityMarketWorkflowRow,
64    LiabilityMarketWorkflowSummary, LiabilityProviderLifecycleState, LiabilityProviderListQuery,
65    LiabilityProviderListReport, LiabilityProviderListSummary, LiabilityProviderResolutionQuery,
66    LiabilityProviderResolutionReport, LiabilityProviderRow, LiabilityQuoteDisposition,
67    ReceiptStore, ReceiptStoreError, RetentionConfig, SignedCreditBond, SignedCreditFacility,
68    SignedCreditLossLifecycle, SignedLiabilityAutoBindDecision, SignedLiabilityBoundCoverage,
69    SignedLiabilityClaimAdjudication, SignedLiabilityClaimDispute, SignedLiabilityClaimPackage,
70    SignedLiabilityClaimPayoutInstruction, SignedLiabilityClaimPayoutReceipt,
71    SignedLiabilityClaimResponse, SignedLiabilityClaimSettlementInstruction,
72    SignedLiabilityClaimSettlementReceipt, SignedLiabilityPlacement,
73    SignedLiabilityPricingAuthority, SignedLiabilityProvider, SignedLiabilityQuoteRequest,
74    SignedLiabilityQuoteResponse, SignedUnderwritingDecision, StoredChildReceipt,
75    StoredToolReceipt, UnderwritingAppealCreateRequest, UnderwritingAppealRecord,
76    UnderwritingAppealResolution, UnderwritingAppealResolveRequest, UnderwritingAppealStatus,
77    UnderwritingDecisionLifecycleState, UnderwritingDecisionListReport,
78    UnderwritingDecisionOutcome, UnderwritingDecisionQuery, UnderwritingDecisionRow,
79    UnderwritingDecisionSummary, CREDIT_BOND_LIST_REPORT_SCHEMA,
80    CREDIT_FACILITY_LIST_REPORT_SCHEMA, CREDIT_LOSS_LIFECYCLE_LIST_REPORT_SCHEMA,
81    LIABILITY_CLAIM_WORKFLOW_REPORT_SCHEMA, LIABILITY_MARKET_WORKFLOW_REPORT_SCHEMA,
82    LIABILITY_PROVIDER_LIST_REPORT_SCHEMA, LIABILITY_PROVIDER_RESOLUTION_REPORT_SCHEMA,
83};
84use r2d2::{Pool, PooledConnection};
85use r2d2_sqlite::SqliteConnectionManager;
86use rusqlite::{params, Connection, OptionalExtension};
87
88pub struct SqliteReceiptStore {
89    pub(crate) pool: Pool<SqliteConnectionManager>,
90    /// Phase 1.5 multi-tenant receipt isolation: when true, tenant-
91    /// scoped queries exclude the pre-multitenant NULL-tagged set. When
92    /// false, queries with `tenant_filter = Some(id)` return rows where
93    /// `tenant_id = id OR tenant_id IS NULL`, which keeps legacy
94    /// (pre-1.5) receipts visible during explicit compatibility mode.
95    pub(crate) strict_tenant_isolation: std::sync::atomic::AtomicBool,
96}
97
98type FederatedShareSubjectCorpus = (
99    FederatedEvidenceShareSummary,
100    Vec<StoredToolReceipt>,
101    Vec<CapabilitySnapshot>,
102);
103pub(crate) type SqliteStoreConnection = PooledConnection<SqliteConnectionManager>;
104
105#[path = "receipt_store/bootstrap.rs"]
106mod bootstrap;
107#[path = "receipt_store/evidence_retention.rs"]
108mod evidence_retention;
109#[path = "receipt_store/liability_claims.rs"]
110mod liability_claims;
111#[path = "receipt_store/liability_market.rs"]
112mod liability_market;
113#[path = "receipt_store/reports.rs"]
114mod reports;
115#[path = "receipt_store/support.rs"]
116mod support;
117#[cfg(test)]
118#[path = "receipt_store/tests.rs"]
119mod tests;
120#[path = "receipt_store/underwriting_credit.rs"]
121mod underwriting_credit;
122
123use support::*;
124pub(crate) use support::{decode_verified_child_receipt, decode_verified_chio_receipt};
125
126impl SqliteReceiptStore {
127    pub(crate) fn connection(&self) -> Result<SqliteStoreConnection, ReceiptStoreError> {
128        self.pool
129            .get()
130            .map_err(|error| ReceiptStoreError::Pool(error.to_string()))
131    }
132
133    /// Phase 1.5 multi-tenant receipt isolation: toggle strict-isolation
134    /// mode on tenant-scoped queries.
135    ///
136    /// When `strict = true`, a `tenant_filter = Some(id)` query returns
137    /// ONLY rows whose `tenant_id = id`. Legacy pre-1.5 receipts with
138    /// `tenant_id IS NULL` are excluded.
139    ///
140    /// When `strict = false`, the same query also includes rows where
141    /// `tenant_id IS NULL` -- the pre-multitenant "public" fallback
142    /// set -- so legacy receipts remain visible during an explicit
143    /// compatibility window.
144    ///
145    /// A `tenant_filter = None` admin / compat query always returns
146    /// every row regardless of this setting.
147    pub fn with_strict_tenant_isolation(&self, strict: bool) {
148        self.strict_tenant_isolation
149            .store(strict, std::sync::atomic::Ordering::SeqCst);
150    }
151
152    /// Read the current strict-tenant-isolation setting.
153    #[must_use]
154    pub fn strict_tenant_isolation_enabled(&self) -> bool {
155        self.strict_tenant_isolation
156            .load(std::sync::atomic::Ordering::SeqCst)
157    }
158}