@soulbatical/tetra-core 0.10.4 → 0.11.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/README.md +78 -38
- package/dist/core/createApp.d.ts +1 -1
- package/dist/core/createApp.d.ts.map +1 -1
- package/dist/core/createApp.js +77 -2
- package/dist/core/createApp.js.map +1 -1
- package/dist/core/dualWriteProxy.d.ts +7 -2
- package/dist/core/dualWriteProxy.d.ts.map +1 -1
- package/dist/core/dualWriteProxy.js +16 -5
- package/dist/core/dualWriteProxy.js.map +1 -1
- package/dist/core/routeContext.d.ts +24 -0
- package/dist/core/routeContext.d.ts.map +1 -1
- package/dist/core/routeContext.js +31 -4
- package/dist/core/routeContext.js.map +1 -1
- package/dist/core/systemDb.d.ts +2 -2
- package/dist/core/systemDb.js +2 -2
- package/dist/generators/rls-checker.d.ts +1 -1
- package/dist/generators/rls-checker.js +1 -1
- package/dist/generators/rls-exec-sql.d.ts +1 -1
- package/dist/generators/rls-exec-sql.js +1 -1
- package/dist/generators/rpc/index.d.ts +1 -1
- package/dist/generators/rpc/index.js +1 -1
- package/dist/index.d.ts +3 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -32
- package/dist/index.js.map +1 -1
- package/dist/middleware/securityMiddleware.d.ts +1 -1
- package/dist/middleware/securityMiddleware.d.ts.map +1 -1
- package/dist/middleware/validateBody.d.ts.map +1 -1
- package/dist/middleware/validateBody.js +51 -8
- package/dist/middleware/validateBody.js.map +1 -1
- package/dist/shared/rfc7807ErrorResponse.d.ts +7 -0
- package/dist/shared/rfc7807ErrorResponse.d.ts.map +1 -1
- package/dist/shared/rfc7807ErrorResponse.js +19 -5
- package/dist/shared/rfc7807ErrorResponse.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +16 -1
- package/dist/utils/logger.js.map +1 -1
- package/package.json +33 -77
- package/dist/affiliate.d.ts +0 -11
- package/dist/affiliate.d.ts.map +0 -1
- package/dist/affiliate.js +0 -10
- package/dist/affiliate.js.map +0 -1
- package/dist/billing.d.ts +0 -8
- package/dist/billing.d.ts.map +0 -1
- package/dist/billing.js +0 -7
- package/dist/billing.js.map +0 -1
- package/dist/email.d.ts +0 -9
- package/dist/email.d.ts.map +0 -1
- package/dist/email.js +0 -8
- package/dist/email.js.map +0 -1
- package/dist/generators/rls-exec-sql.sql +0 -57
- package/dist/generators.d.ts +0 -15
- package/dist/generators.d.ts.map +0 -1
- package/dist/generators.js +0 -12
- package/dist/generators.js.map +0 -1
- package/dist/mcp.d.ts +0 -8
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js +0 -7
- package/dist/mcp.js.map +0 -1
- package/dist/planner.d.ts +0 -8
- package/dist/planner.d.ts.map +0 -1
- package/dist/planner.js +0 -7
- package/dist/planner.js.map +0 -1
- package/dist/shared/affiliate/AffiliateAttributionService.d.ts +0 -47
- package/dist/shared/affiliate/AffiliateAttributionService.d.ts.map +0 -1
- package/dist/shared/affiliate/AffiliateAttributionService.js +0 -308
- package/dist/shared/affiliate/AffiliateAttributionService.js.map +0 -1
- package/dist/shared/affiliate/AffiliateClickService.d.ts +0 -35
- package/dist/shared/affiliate/AffiliateClickService.d.ts.map +0 -1
- package/dist/shared/affiliate/AffiliateClickService.js +0 -87
- package/dist/shared/affiliate/AffiliateClickService.js.map +0 -1
- package/dist/shared/affiliate/affiliateFeatureConfig.d.ts +0 -11
- package/dist/shared/affiliate/affiliateFeatureConfig.d.ts.map +0 -1
- package/dist/shared/affiliate/affiliateFeatureConfig.js +0 -242
- package/dist/shared/affiliate/affiliateFeatureConfig.js.map +0 -1
- package/dist/shared/affiliate/index.d.ts +0 -11
- package/dist/shared/affiliate/index.d.ts.map +0 -1
- package/dist/shared/affiliate/index.js +0 -13
- package/dist/shared/affiliate/index.js.map +0 -1
- package/dist/shared/affiliate/routes.d.ts +0 -87
- package/dist/shared/affiliate/routes.d.ts.map +0 -1
- package/dist/shared/affiliate/routes.js +0 -404
- package/dist/shared/affiliate/routes.js.map +0 -1
- package/dist/shared/affiliate/types.d.ts +0 -170
- package/dist/shared/affiliate/types.d.ts.map +0 -1
- package/dist/shared/affiliate/types.js +0 -11
- package/dist/shared/affiliate/types.js.map +0 -1
- package/dist/shared/billing/BillingService.d.ts +0 -56
- package/dist/shared/billing/BillingService.d.ts.map +0 -1
- package/dist/shared/billing/BillingService.js +0 -588
- package/dist/shared/billing/BillingService.js.map +0 -1
- package/dist/shared/billing/SeatBillingService.d.ts +0 -106
- package/dist/shared/billing/SeatBillingService.d.ts.map +0 -1
- package/dist/shared/billing/SeatBillingService.js +0 -292
- package/dist/shared/billing/SeatBillingService.js.map +0 -1
- package/dist/shared/billing/index.d.ts +0 -30
- package/dist/shared/billing/index.d.ts.map +0 -1
- package/dist/shared/billing/index.js +0 -27
- package/dist/shared/billing/index.js.map +0 -1
- package/dist/shared/billing/routes.d.ts +0 -45
- package/dist/shared/billing/routes.d.ts.map +0 -1
- package/dist/shared/billing/routes.js +0 -184
- package/dist/shared/billing/routes.js.map +0 -1
- package/dist/shared/billing/seat-pricing.d.ts +0 -53
- package/dist/shared/billing/seat-pricing.d.ts.map +0 -1
- package/dist/shared/billing/seat-pricing.js +0 -81
- package/dist/shared/billing/seat-pricing.js.map +0 -1
- package/dist/shared/billing/types.d.ts +0 -109
- package/dist/shared/billing/types.d.ts.map +0 -1
- package/dist/shared/billing/types.js +0 -8
- package/dist/shared/billing/types.js.map +0 -1
- package/dist/shared/email/EmailService.d.ts +0 -64
- package/dist/shared/email/EmailService.d.ts.map +0 -1
- package/dist/shared/email/EmailService.js +0 -300
- package/dist/shared/email/EmailService.js.map +0 -1
- package/dist/shared/email/adminRoutes.d.ts +0 -30
- package/dist/shared/email/adminRoutes.d.ts.map +0 -1
- package/dist/shared/email/adminRoutes.js +0 -227
- package/dist/shared/email/adminRoutes.js.map +0 -1
- package/dist/shared/email/gmail.d.ts +0 -208
- package/dist/shared/email/gmail.d.ts.map +0 -1
- package/dist/shared/email/gmail.js +0 -626
- package/dist/shared/email/gmail.js.map +0 -1
- package/dist/shared/email/index.d.ts +0 -15
- package/dist/shared/email/index.d.ts.map +0 -1
- package/dist/shared/email/index.js +0 -18
- package/dist/shared/email/index.js.map +0 -1
- package/dist/shared/email/mailgun.d.ts +0 -18
- package/dist/shared/email/mailgun.d.ts.map +0 -1
- package/dist/shared/email/mailgun.js +0 -76
- package/dist/shared/email/mailgun.js.map +0 -1
- package/dist/shared/email/sanitize.d.ts +0 -25
- package/dist/shared/email/sanitize.d.ts.map +0 -1
- package/dist/shared/email/sanitize.js +0 -39
- package/dist/shared/email/sanitize.js.map +0 -1
- package/dist/shared/email/smtp.d.ts +0 -20
- package/dist/shared/email/smtp.d.ts.map +0 -1
- package/dist/shared/email/smtp.js +0 -53
- package/dist/shared/email/smtp.js.map +0 -1
- package/dist/shared/email/types.d.ts +0 -113
- package/dist/shared/email/types.d.ts.map +0 -1
- package/dist/shared/email/types.js +0 -7
- package/dist/shared/email/types.js.map +0 -1
- package/dist/shared/email/webhookRoutes.d.ts +0 -29
- package/dist/shared/email/webhookRoutes.d.ts.map +0 -1
- package/dist/shared/email/webhookRoutes.js +0 -125
- package/dist/shared/email/webhookRoutes.js.map +0 -1
- package/dist/shared/mcp/index.d.ts +0 -51
- package/dist/shared/mcp/index.d.ts.map +0 -1
- package/dist/shared/mcp/index.js +0 -51
- package/dist/shared/mcp/index.js.map +0 -1
- package/dist/shared/mcp/mcp-auth-routes.d.ts +0 -26
- package/dist/shared/mcp/mcp-auth-routes.d.ts.map +0 -1
- package/dist/shared/mcp/mcp-auth-routes.js +0 -141
- package/dist/shared/mcp/mcp-auth-routes.js.map +0 -1
- package/dist/shared/mcp/mcp-db.d.ts +0 -99
- package/dist/shared/mcp/mcp-db.d.ts.map +0 -1
- package/dist/shared/mcp/mcp-db.js +0 -106
- package/dist/shared/mcp/mcp-db.js.map +0 -1
- package/dist/shared/mcp/mcp-routes.d.ts +0 -29
- package/dist/shared/mcp/mcp-routes.d.ts.map +0 -1
- package/dist/shared/mcp/mcp-routes.js +0 -171
- package/dist/shared/mcp/mcp-routes.js.map +0 -1
- package/dist/shared/mcp/mcp-tokens-routes.d.ts +0 -35
- package/dist/shared/mcp/mcp-tokens-routes.d.ts.map +0 -1
- package/dist/shared/mcp/mcp-tokens-routes.js +0 -94
- package/dist/shared/mcp/mcp-tokens-routes.js.map +0 -1
- package/dist/shared/mcp/mcp-usage-routes.d.ts +0 -17
- package/dist/shared/mcp/mcp-usage-routes.d.ts.map +0 -1
- package/dist/shared/mcp/mcp-usage-routes.js +0 -81
- package/dist/shared/mcp/mcp-usage-routes.js.map +0 -1
- package/dist/shared/mcp/tenant-context.d.ts +0 -59
- package/dist/shared/mcp/tenant-context.d.ts.map +0 -1
- package/dist/shared/mcp/tenant-context.js +0 -136
- package/dist/shared/mcp/tenant-context.js.map +0 -1
- package/dist/shared/mcp/types.d.ts +0 -74
- package/dist/shared/mcp/types.d.ts.map +0 -1
- package/dist/shared/mcp/types.js +0 -7
- package/dist/shared/mcp/types.js.map +0 -1
- package/dist/shared/planner/GoogleCalendarService.d.ts +0 -137
- package/dist/shared/planner/GoogleCalendarService.d.ts.map +0 -1
- package/dist/shared/planner/GoogleCalendarService.js +0 -525
- package/dist/shared/planner/GoogleCalendarService.js.map +0 -1
- package/dist/shared/planner/PlannerService.d.ts +0 -264
- package/dist/shared/planner/PlannerService.d.ts.map +0 -1
- package/dist/shared/planner/PlannerService.js +0 -1393
- package/dist/shared/planner/PlannerService.js.map +0 -1
- package/dist/shared/planner/index.d.ts +0 -37
- package/dist/shared/planner/index.d.ts.map +0 -1
- package/dist/shared/planner/index.js +0 -35
- package/dist/shared/planner/index.js.map +0 -1
- package/dist/shared/planner/intervals.d.ts +0 -60
- package/dist/shared/planner/intervals.d.ts.map +0 -1
- package/dist/shared/planner/intervals.js +0 -141
- package/dist/shared/planner/intervals.js.map +0 -1
- package/dist/shared/planner/routes.d.ts +0 -69
- package/dist/shared/planner/routes.d.ts.map +0 -1
- package/dist/shared/planner/routes.js +0 -770
- package/dist/shared/planner/routes.js.map +0 -1
- package/dist/shared/planner/types.d.ts +0 -328
- package/dist/shared/planner/types.d.ts.map +0 -1
- package/dist/shared/planner/types.js +0 -9
- package/dist/shared/planner/types.js.map +0 -1
- package/dist/shared/storage/ImageProcessingService.d.ts +0 -32
- package/dist/shared/storage/ImageProcessingService.d.ts.map +0 -1
- package/dist/shared/storage/ImageProcessingService.js +0 -127
- package/dist/shared/storage/ImageProcessingService.js.map +0 -1
- package/dist/shared/storage/StorageProxyService.d.ts +0 -47
- package/dist/shared/storage/StorageProxyService.d.ts.map +0 -1
- package/dist/shared/storage/StorageProxyService.js +0 -196
- package/dist/shared/storage/StorageProxyService.js.map +0 -1
- package/dist/shared/storage/StorageUploadService.d.ts +0 -126
- package/dist/shared/storage/StorageUploadService.d.ts.map +0 -1
- package/dist/shared/storage/StorageUploadService.js +0 -206
- package/dist/shared/storage/StorageUploadService.js.map +0 -1
- package/dist/shared/storage/creative-urls.d.ts +0 -14
- package/dist/shared/storage/creative-urls.d.ts.map +0 -1
- package/dist/shared/storage/creative-urls.js +0 -30
- package/dist/shared/storage/creative-urls.js.map +0 -1
- package/dist/shared/storage/index.d.ts +0 -28
- package/dist/shared/storage/index.d.ts.map +0 -1
- package/dist/shared/storage/index.js +0 -27
- package/dist/shared/storage/index.js.map +0 -1
- package/dist/shared/storage/routes.d.ts +0 -42
- package/dist/shared/storage/routes.d.ts.map +0 -1
- package/dist/shared/storage/routes.js +0 -160
- package/dist/shared/storage/routes.js.map +0 -1
- package/dist/shared/storage/types.d.ts +0 -53
- package/dist/shared/storage/types.d.ts.map +0 -1
- package/dist/shared/storage/types.js +0 -2
- package/dist/shared/storage/types.js.map +0 -1
- package/dist/shared/telegram/index.d.ts +0 -4
- package/dist/shared/telegram/index.d.ts.map +0 -1
- package/dist/shared/telegram/index.js +0 -3
- package/dist/shared/telegram/index.js.map +0 -1
- package/dist/shared/telegram/routes.d.ts +0 -43
- package/dist/shared/telegram/routes.d.ts.map +0 -1
- package/dist/shared/telegram/routes.js +0 -868
- package/dist/shared/telegram/routes.js.map +0 -1
- package/dist/shared/telegram/types.d.ts +0 -168
- package/dist/shared/telegram/types.d.ts.map +0 -1
- package/dist/shared/telegram/types.js +0 -7
- package/dist/shared/telegram/types.js.map +0 -1
- package/dist/shared/telegram/utils.d.ts +0 -44
- package/dist/shared/telegram/utils.d.ts.map +0 -1
- package/dist/shared/telegram/utils.js +0 -121
- package/dist/shared/telegram/utils.js.map +0 -1
- package/dist/storage.d.ts +0 -9
- package/dist/storage.d.ts.map +0 -1
- package/dist/storage.js +0 -8
- package/dist/storage.js.map +0 -1
- package/dist/telemetry.d.ts +0 -9
- package/dist/telemetry.d.ts.map +0 -1
- package/dist/telemetry.js +0 -8
- package/dist/telemetry.js.map +0 -1
- package/scripts/postinstall.js +0 -79
- package/src/shared/affiliate/migrations/001_create_affiliates.sql +0 -49
- package/src/shared/affiliate/migrations/002_create_affiliate_commissions.sql +0 -31
- package/src/shared/affiliate/migrations/003_create_affiliate_clicks.sql +0 -26
- package/src/shared/affiliate/migrations/004_create_affiliate_payments.sql +0 -34
- package/src/shared/affiliate/migrations/005_create_affiliate_tier_history.sql +0 -19
- package/src/shared/affiliate/migrations/006_create_affiliate_rpc_functions.sql +0 -209
- package/src/shared/affiliate/migrations/007_create_affiliate_rls_policies.sql +0 -123
- package/src/shared/billing/migrations/00000000000001_billing.sql +0 -114
- package/src/shared/email/migrations/000_create_email_logs.sql +0 -27
- package/src/shared/email/migrations/001_create_email_templates.sql +0 -27
- package/src/shared/email/migrations/002_add_rls_baseline_policies.sql +0 -37
- package/src/shared/email/migrations/003_create_gmail_accounts.sql +0 -82
- package/src/shared/email/migrations/004_add_email_logs_tracking_columns.sql +0 -15
- package/src/shared/mcp/migrations/001_mcp_api_tokens.sql +0 -21
- package/src/shared/mcp/migrations/002_mcp_audit_log.sql +0 -16
package/README.md
CHANGED
|
@@ -5,10 +5,18 @@ The foundation framework for Tetra platform projects (Soulbatical BV) — config
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm install
|
|
8
|
+
npm install file:../vendor/tetra/soulbatical-tetra-core-0.11.0.tgz
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
For deployable consumers, pack private artifacts in the Tetra repo with:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm run pack:private
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
and copy the required `.tgz` files into the consumer repo.
|
|
18
|
+
|
|
19
|
+
Only install the peer dependencies you actually use. Most are optional. Generator and RLS surfaces belong only in `@soulbatical/tetra-supabase`. Frontend surfaces belong only in `@soulbatical/tetra-ui`. Installing `@soulbatical/tetra-core` must not mutate the consumer repo; hooks/CI/config setup is explicit via `npx tetra-setup`.
|
|
12
20
|
|
|
13
21
|
```bash
|
|
14
22
|
# Always needed
|
|
@@ -29,38 +37,21 @@ npm install pino
|
|
|
29
37
|
|
|
30
38
|
## Subpath Exports
|
|
31
39
|
|
|
32
|
-
|
|
40
|
+
`tetra-core` is intentionally narrow. Use the foundation entrypoint and only the explicitly supported subpaths:
|
|
33
41
|
|
|
34
42
|
```typescript
|
|
35
43
|
// Main barrel — core framework (controllers, factories, middleware, validators, db clients)
|
|
36
44
|
import { createApp, authenticateToken, BaseQueryController, addQueryRoutes } from '@soulbatical/tetra-core';
|
|
37
45
|
|
|
38
|
-
// Frontend hooks + components
|
|
39
|
-
import { useFeature,
|
|
40
|
-
|
|
41
|
-
// Billing — Stripe + Mollie integration
|
|
42
|
-
import { BillingService, addBillingRoutes } from '@soulbatical/tetra-core/billing';
|
|
43
|
-
|
|
44
|
-
// Storage — file upload + image processing (multer + sharp)
|
|
45
|
-
import { addStorageUploadRoutes, ImageProcessingService } from '@soulbatical/tetra-core/storage';
|
|
46
|
-
|
|
47
|
-
// MCP — expose backend as Model Context Protocol server
|
|
48
|
-
import { addMcpRoutes, addMcpAuthRoutes } from '@soulbatical/tetra-core/mcp';
|
|
49
|
-
|
|
50
|
-
// Email — Mailgun, SMTP, Gmail OAuth
|
|
51
|
-
import { EmailService, sendMailgunEmail, GmailClient } from '@soulbatical/tetra-core/email';
|
|
52
|
-
|
|
53
|
-
// Planner — scheduling, availability, Google Calendar
|
|
54
|
-
import { PlannerService, addPlannerRoutes } from '@soulbatical/tetra-core/planner';
|
|
55
|
-
|
|
56
|
-
// Affiliate — attribution, tracking, commissions
|
|
57
|
-
import { AffiliateAttributionService, addAffiliateAdminRoutes } from '@soulbatical/tetra-core/affiliate';
|
|
46
|
+
// Frontend hooks + components now live in tetra-ui + tetra-contracts
|
|
47
|
+
import { useFeature, FeatureTable, FeatureFilters } from '@soulbatical/tetra-ui/feature';
|
|
48
|
+
import type { FeatureConfig } from '@soulbatical/tetra-contracts';
|
|
58
49
|
|
|
59
50
|
// Auth — public auth routes (login, register, invite, magic link)
|
|
60
51
|
import { addPublicAuthRoutes } from '@soulbatical/tetra-core/auth';
|
|
61
52
|
|
|
62
53
|
// Generators — RLS + RPC SQL generation from FeatureConfig
|
|
63
|
-
import { RPCGenerator, generateRLS, runRLSCheck } from '@soulbatical/tetra-
|
|
54
|
+
import { RPCGenerator, generateRLS, runRLSCheck } from '@soulbatical/tetra-supabase';
|
|
64
55
|
|
|
65
56
|
// License — offline key validation for Pro features
|
|
66
57
|
import { validateLicense, isFeatureAvailable, generateLicenseKey } from '@soulbatical/tetra-core/license';
|
|
@@ -68,21 +59,70 @@ import { validateLicense, isFeatureAvailable, generateLicenseKey } from '@soulba
|
|
|
68
59
|
|
|
69
60
|
| Subpath | What you get | Extra peer deps |
|
|
70
61
|
|---------|-------------|-----------------|
|
|
71
|
-
| `.` | App bootstrap, controllers, factories, middleware, validators, DB clients, cron, logging
|
|
72
|
-
| `./frontend` | useFeature, DataTable, FilterBar (React hooks + components) | react, @tanstack/react-table |
|
|
73
|
-
| `./billing` | BillingService, Stripe/Mollie routes + webhooks | stripe, @mollie/api-client |
|
|
74
|
-
| `./storage` | Upload routes, image processing, storage proxy | multer, sharp |
|
|
75
|
-
| `./mcp` | MCP server routes, auth, token management | @modelcontextprotocol/sdk |
|
|
76
|
-
| `./email` | EmailService, Mailgun, SMTP, Gmail OAuth | — (nodemailer is a hard dep) |
|
|
77
|
-
| `./planner` | PlannerService, Google Calendar, availability, booking | — |
|
|
78
|
-
| `./affiliate` | Attribution, click tracking, commission routes | — |
|
|
62
|
+
| `.` | App bootstrap, controllers, factories, middleware, validators, DB clients, cron, logging | express, @supabase/supabase-js |
|
|
79
63
|
| `./auth` | Public auth routes (login, register, invite, magic link) | — |
|
|
80
|
-
| `./generators` | RPCGenerator, RLS generator, RLS auditor/checker | — |
|
|
81
64
|
| `./license` | License key validation, generation, feature gating | — |
|
|
82
65
|
|
|
66
|
+
Optional runtime domains now move into dedicated packages. Billing is the first extracted block:
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
import { BillingService, addBillingRoutes } from '@soulbatical/tetra-billing';
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Storage is extracted the same way:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { addStorageUploadRoutes, StorageUploadService } from '@soulbatical/tetra-storage';
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Email is extracted the same way:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { EmailService, addEmailAdminRoutes } from '@soulbatical/tetra-email';
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
MCP is extracted the same way:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { addMcpRoutes, mcpDB } from '@soulbatical/tetra-mcp';
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Telegram is extracted the same way:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { addTelegramRoutes, TelegramSecretError } from '@soulbatical/tetra-telegram';
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`@soulbatical/tetra-core` no longer re-exports Telegram routes or helpers. Treat `@soulbatical/tetra-telegram` as the only valid runtime owner.
|
|
97
|
+
|
|
98
|
+
Affiliate is extracted the same way:
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import {
|
|
102
|
+
addAffiliateAdminRoutes,
|
|
103
|
+
addAffiliatePublicRoutes,
|
|
104
|
+
AffiliateAttributionService,
|
|
105
|
+
} from '@soulbatical/tetra-affiliate';
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Meta API helpers stay in `tetra-core`, but only behind the explicit subpath:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { META_API_BASE, metaGet, metaPost } from '@soulbatical/tetra-core/meta-api';
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Do not import Meta API helpers from the root `@soulbatical/tetra-core` barrel.
|
|
115
|
+
|
|
116
|
+
Frontend contracts and components are extracted too:
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import type { FeatureConfig } from '@soulbatical/tetra-contracts';
|
|
120
|
+
import { useFeature, FeatureTable, FeatureFilters } from '@soulbatical/tetra-ui/feature';
|
|
121
|
+
```
|
|
122
|
+
|
|
83
123
|
## Licensing
|
|
84
124
|
|
|
85
|
-
Tetra
|
|
125
|
+
Tetra packages are available via npm and can also be packed as deployable tarballs for private consumers. Pro features (billing, planner, email, storage, MCP) require a license key. Free features (createApp, auth, DB clients, middleware, validators, crypto helpers) work without a key.
|
|
86
126
|
|
|
87
127
|
```bash
|
|
88
128
|
# Backend — set in .env or Doppler
|
|
@@ -176,7 +216,7 @@ router.delete('/admin/users/:id', authenticateToken, requireRole('admin', 'owner
|
|
|
176
216
|
One config drives everything — filters, counts, sorting, pagination, RPC names, REST paths:
|
|
177
217
|
|
|
178
218
|
```typescript
|
|
179
|
-
import type { FeatureConfig } from '@soulbatical/tetra-
|
|
219
|
+
import type { FeatureConfig } from '@soulbatical/tetra-contracts';
|
|
180
220
|
|
|
181
221
|
export const trackConfig: FeatureConfig = {
|
|
182
222
|
tableName: 'tracks',
|
|
@@ -217,10 +257,10 @@ addMutationRoutes(router, { config: trackConfig, controller: trackMutationContro
|
|
|
217
257
|
|
|
218
258
|
### RPC Generator
|
|
219
259
|
|
|
220
|
-
Generate SQL from your FeatureConfig — never write list/filter/count queries by hand:
|
|
260
|
+
Generate SQL from your `FeatureConfig` — never write list/filter/count queries by hand:
|
|
221
261
|
|
|
222
262
|
```typescript
|
|
223
|
-
import { RPCGenerator, DetailRPCGenerator } from '@soulbatical/tetra-
|
|
263
|
+
import { RPCGenerator, DetailRPCGenerator } from '@soulbatical/tetra-supabase';
|
|
224
264
|
|
|
225
265
|
const generator = new RPCGenerator(trackConfig, {
|
|
226
266
|
aliasMap: { tracks: 't', users_public: 'u' },
|
|
@@ -232,7 +272,7 @@ generator.writeMigrations({ force: true });
|
|
|
232
272
|
### RLS Generator + Auditor
|
|
233
273
|
|
|
234
274
|
```typescript
|
|
235
|
-
import { generateRLS, runRLSCheck } from '@soulbatical/tetra-
|
|
275
|
+
import { generateRLS, runRLSCheck } from '@soulbatical/tetra-supabase';
|
|
236
276
|
|
|
237
277
|
const rls = generateRLS({ tableName: 'tracks', tableType: 'org_owned' });
|
|
238
278
|
const report = await runRLSCheck(supabase); // 26 audit checks
|
package/dist/core/createApp.d.ts
CHANGED
|
@@ -112,7 +112,7 @@ export declare function createApp(config: CreateAppConfig): {
|
|
|
112
112
|
shutdown: () => Promise<void>;
|
|
113
113
|
security: {
|
|
114
114
|
enforceHTTPS: (req: Request, res: Response, next: NextFunction) => void;
|
|
115
|
-
securityHeaders: (req: import("http").IncomingMessage, res: import("http").ServerResponse, next: (err?: unknown) => void) => void;
|
|
115
|
+
securityHeaders: (req: import("node:http").IncomingMessage, res: import("node:http").ServerResponse, next: (err?: unknown) => void) => void;
|
|
116
116
|
configureCORS: (req: Request, res: Response, next: NextFunction) => void | express.Response<any, Record<string, any>>;
|
|
117
117
|
generalRateLimiter: import("express-rate-limit").RateLimitRequestHandler;
|
|
118
118
|
strictRateLimiter: import("express-rate-limit").RateLimitRequestHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../src/core/createApp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../src/core/createApp.ts"],"names":[],"mappings":"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"}
|
package/dist/core/createApp.js
CHANGED
|
@@ -37,7 +37,7 @@ import { configureSecurity } from '../middleware/securityMiddleware.js';
|
|
|
37
37
|
import { authenticateToken, requireOrgAdmin, requireSuperAdmin } from '../middleware/authMiddleware.js';
|
|
38
38
|
import { requireCronSecret } from '../middleware/cronMiddleware.js';
|
|
39
39
|
import { requireInternalKey } from '../middleware/internalKeyMiddleware.js';
|
|
40
|
-
import { runInRouteContext } from './routeContext.js';
|
|
40
|
+
import { runInRouteContext, TetraSecurityViolation } from './routeContext.js';
|
|
41
41
|
import { validateEnvironment } from '../utils/validateEnvironment.js';
|
|
42
42
|
import { RFC7807ErrorResponse } from '../shared/rfc7807ErrorResponse.js';
|
|
43
43
|
// Note: auditRoutes (Express stack scanning) is NOT used here.
|
|
@@ -114,6 +114,54 @@ export function createApp(config) {
|
|
|
114
114
|
// ── Express app ──
|
|
115
115
|
const app = express();
|
|
116
116
|
app.set('trust proxy', config.trustProxy ?? 1);
|
|
117
|
+
// ── HTTP Parameter Pollution guard ──
|
|
118
|
+
// SECURITY: With the default 'extended' parser, `?id=1&id=2` becomes
|
|
119
|
+
// req.query.id = ['1', '2']. Handlers that type-narrow to string crash
|
|
120
|
+
// on the resulting array with a 500. We install a custom query parser that
|
|
121
|
+
// keeps only the FIRST value for duplicate keys, which matches the type
|
|
122
|
+
// (string | undefined) that handler code almost always expects. Explicit
|
|
123
|
+
// array syntax (`?id[]=1&id[]=2`) still produces an array because the
|
|
124
|
+
// bracketed key is unique.
|
|
125
|
+
app.set('query parser', (qs) => {
|
|
126
|
+
const out = {};
|
|
127
|
+
if (!qs)
|
|
128
|
+
return out;
|
|
129
|
+
const pairs = qs.split('&');
|
|
130
|
+
for (const pair of pairs) {
|
|
131
|
+
if (!pair)
|
|
132
|
+
continue;
|
|
133
|
+
const eq = pair.indexOf('=');
|
|
134
|
+
const rawKey = eq === -1 ? pair : pair.slice(0, eq);
|
|
135
|
+
const rawVal = eq === -1 ? '' : pair.slice(eq + 1);
|
|
136
|
+
let key;
|
|
137
|
+
let value;
|
|
138
|
+
try {
|
|
139
|
+
key = decodeURIComponent(rawKey.replace(/\+/g, ' '));
|
|
140
|
+
value = decodeURIComponent(rawVal.replace(/\+/g, ' '));
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Malformed percent-encoding: keep raw so we don't crash on bad input.
|
|
144
|
+
key = rawKey;
|
|
145
|
+
value = rawVal;
|
|
146
|
+
}
|
|
147
|
+
// Bracketed keys keep their array semantics: `?id[]=1&id[]=2` → ['1','2'].
|
|
148
|
+
if (key.endsWith('[]')) {
|
|
149
|
+
const arrKey = key.slice(0, -2);
|
|
150
|
+
const existing = out[arrKey];
|
|
151
|
+
if (Array.isArray(existing))
|
|
152
|
+
existing.push(value);
|
|
153
|
+
else if (existing !== undefined)
|
|
154
|
+
out[arrKey] = [existing, value];
|
|
155
|
+
else
|
|
156
|
+
out[arrKey] = [value];
|
|
157
|
+
}
|
|
158
|
+
else if (out[key] === undefined) {
|
|
159
|
+
// Duplicate plain keys: keep only the first value (HPP-safe default).
|
|
160
|
+
out[key] = value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
});
|
|
117
165
|
// ── Request correlation ID ──
|
|
118
166
|
app.use((req, _res, next) => {
|
|
119
167
|
if (!req.headers['x-request-id']) {
|
|
@@ -141,6 +189,20 @@ export function createApp(config) {
|
|
|
141
189
|
const bodyLimit = config.bodyLimit || '50mb';
|
|
142
190
|
app.use(express.json({ limit: bodyLimit }));
|
|
143
191
|
app.use(express.urlencoded({ extended: true, limit: bodyLimit }));
|
|
192
|
+
// ── Body safety net ──
|
|
193
|
+
// SECURITY: Tetra handlers commonly do `const { x } = req.body` before
|
|
194
|
+
// schema validation. If the client sends an empty body, wrong content-type,
|
|
195
|
+
// or `null` JSON, Express leaves req.body as undefined/null which crashes
|
|
196
|
+
// the destructure with a Node error string ("Cannot destructure property
|
|
197
|
+
// 'x' of 'req.body' as it is undefined"). That string then leaks through
|
|
198
|
+
// the 500-body and fingerprints the handler. Normalize to {} so downstream
|
|
199
|
+
// validators (validateBody, Zod) can handle it cleanly with a 400.
|
|
200
|
+
app.use((req, _res, next) => {
|
|
201
|
+
if (req.body === undefined || req.body === null) {
|
|
202
|
+
req.body = {};
|
|
203
|
+
}
|
|
204
|
+
next();
|
|
205
|
+
});
|
|
144
206
|
// ── Cookie parser ──
|
|
145
207
|
if (!config.skipCookieParser) {
|
|
146
208
|
app.use(cookieParser());
|
|
@@ -349,7 +411,20 @@ export function createApp(config) {
|
|
|
349
411
|
}
|
|
350
412
|
// ── Global error handler ──
|
|
351
413
|
const errorHandler = config.errorHandler || ((err, _req, res, _next) => {
|
|
352
|
-
|
|
414
|
+
// Tetra security violations carry a separate internalDetail. Log THAT,
|
|
415
|
+
// but the 500 body below gets the generic public `err.message`.
|
|
416
|
+
const logPayload = {
|
|
417
|
+
error: err,
|
|
418
|
+
requestId: _req.headers['x-request-id'],
|
|
419
|
+
};
|
|
420
|
+
if (err instanceof TetraSecurityViolation) {
|
|
421
|
+
logPayload.tetraSecurity = {
|
|
422
|
+
caller: err.caller,
|
|
423
|
+
access: err.access,
|
|
424
|
+
internalDetail: err.internalDetail,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
logger.error(logPayload, 'Global error handler triggered');
|
|
353
428
|
const sentry = getSentry();
|
|
354
429
|
if (sentry && isSentryActive()) {
|
|
355
430
|
sentry.captureException(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../src/core/createApp.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createApp.js","sourceRoot":"","sources":["../../src/core/createApp.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
* Dual-Write Proxy — Intercepts Supabase writes and mirrors to RuVector daemon.
|
|
3
3
|
*
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
|
-
* also fires a fire-and-forget RPC to the
|
|
5
|
+
* also fires a fire-and-forget RPC to the configured dual-write daemon.
|
|
6
6
|
*
|
|
7
7
|
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
8
|
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
9
|
*
|
|
10
|
-
* Activation:
|
|
10
|
+
* Activation:
|
|
11
|
+
* - DUAL_WRITE=1
|
|
12
|
+
* - or TETRA_DUAL_WRITE_TARGETS=supabase,ruvector
|
|
13
|
+
*
|
|
14
|
+
* Legacy compatibility:
|
|
15
|
+
* - STELLA_STORES=supabase,ruvector
|
|
11
16
|
*/
|
|
12
17
|
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
13
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAmO3D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CASpE"}
|
|
@@ -2,21 +2,32 @@
|
|
|
2
2
|
* Dual-Write Proxy — Intercepts Supabase writes and mirrors to RuVector daemon.
|
|
3
3
|
*
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
|
-
* also fires a fire-and-forget RPC to the
|
|
5
|
+
* also fires a fire-and-forget RPC to the configured dual-write daemon.
|
|
6
6
|
*
|
|
7
7
|
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
8
|
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
9
|
*
|
|
10
|
-
* Activation:
|
|
10
|
+
* Activation:
|
|
11
|
+
* - DUAL_WRITE=1
|
|
12
|
+
* - or TETRA_DUAL_WRITE_TARGETS=supabase,ruvector
|
|
13
|
+
*
|
|
14
|
+
* Legacy compatibility:
|
|
15
|
+
* - STELLA_STORES=supabase,ruvector
|
|
11
16
|
*/
|
|
12
17
|
import { connect } from 'node:net';
|
|
13
|
-
const
|
|
18
|
+
const DEFAULT_SOCKET_PATH = '/tmp/tetra-dual-write.sock';
|
|
14
19
|
const RPC_TIMEOUT_MS = 5_000;
|
|
15
20
|
// ─── Daemon RPC (lightweight, no dependency on stella) ──────
|
|
16
21
|
let daemonSocket = null;
|
|
17
22
|
let daemonConnected = false;
|
|
18
23
|
let daemonConnecting = false;
|
|
19
24
|
let rpcId = 0;
|
|
25
|
+
function getSocketPath() {
|
|
26
|
+
return (process.env.TETRA_DUAL_WRITE_SOCKET_PATH
|
|
27
|
+
|| process.env.DUAL_WRITE_SOCKET_PATH
|
|
28
|
+
|| process.env.STELLA_DAEMON_SOCKET_PATH
|
|
29
|
+
|| DEFAULT_SOCKET_PATH);
|
|
30
|
+
}
|
|
20
31
|
function connectDaemon() {
|
|
21
32
|
if (daemonConnected)
|
|
22
33
|
return Promise.resolve();
|
|
@@ -24,7 +35,7 @@ function connectDaemon() {
|
|
|
24
35
|
return new Promise(r => setTimeout(r, 500));
|
|
25
36
|
daemonConnecting = true;
|
|
26
37
|
return new Promise((resolve) => {
|
|
27
|
-
const sock = connect(
|
|
38
|
+
const sock = connect(getSocketPath());
|
|
28
39
|
const timeout = setTimeout(() => {
|
|
29
40
|
sock.destroy();
|
|
30
41
|
daemonConnecting = false;
|
|
@@ -201,7 +212,7 @@ function mirrorToDaemon(table, op, args, filters) {
|
|
|
201
212
|
export function isDualWriteEnabled() {
|
|
202
213
|
if (process.env.DUAL_WRITE === '1')
|
|
203
214
|
return true;
|
|
204
|
-
const stores = process.env.STELLA_STORES || '';
|
|
215
|
+
const stores = process.env.TETRA_DUAL_WRITE_TARGETS || process.env.STELLA_STORES || '';
|
|
205
216
|
return stores.includes('ruvector');
|
|
206
217
|
}
|
|
207
218
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,5 +39,29 @@ export declare function getCurrentRouteAccess(): RouteAccess | undefined;
|
|
|
39
39
|
* Get the current route prefix for error messages.
|
|
40
40
|
*/
|
|
41
41
|
export declare function getCurrentRoutePrefix(): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Tetra security violation thrown by assertMinimumAccess.
|
|
44
|
+
*
|
|
45
|
+
* Carries TWO messages:
|
|
46
|
+
* - `message` (inherited): generic, safe to include in client-facing 500 bodies.
|
|
47
|
+
* - `internalDetail`: full diagnostic with route/caller/remediation, for logs
|
|
48
|
+
* and Sentry only. Never put this in a response body.
|
|
49
|
+
*
|
|
50
|
+
* Rationale: prior versions threw Error with the raw "[TETRA SECURITY]
|
|
51
|
+
* systemDB('foo') BLOCKED in 'public' route..." string as `message`, which the
|
|
52
|
+
* global error handler then leaked as the 500 `detail`. That discloses Tetra's
|
|
53
|
+
* internal DB taxonomy, route access levels, and caller names to unauthenticated
|
|
54
|
+
* clients (pentest finding A-1). Splitting public/internal fixes the leak even
|
|
55
|
+
* when a downstream handler naively puts `err.message` in a response body.
|
|
56
|
+
*/
|
|
57
|
+
export declare class TetraSecurityViolation extends Error {
|
|
58
|
+
readonly internalDetail: string;
|
|
59
|
+
readonly access: RouteAccess | undefined;
|
|
60
|
+
readonly caller: string;
|
|
61
|
+
constructor(publicMessage: string, internalDetail: string, opts: {
|
|
62
|
+
access?: RouteAccess;
|
|
63
|
+
caller: string;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
42
66
|
export declare function assertMinimumAccess(required: RouteAccess, callerName: string): void;
|
|
43
67
|
//# sourceMappingURL=routeContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeContext.d.ts","sourceRoot":"","sources":["../../src/core/routeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAUpG;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAEzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,SAAS,CAE/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE1D;AAqBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"routeContext.d.ts","sourceRoot":"","sources":["../../src/core/routeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;AAUpG;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,CAEzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,SAAS,CAE/D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE1D;AAqBD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,cAAc,EAAE,MAAM,CAAC;IACvC,SAAgB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChD,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE;QAC/D,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB;CAOF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAgCnF"}
|
|
@@ -64,26 +64,53 @@ const ACCESS_RANK = {
|
|
|
64
64
|
cron: 3,
|
|
65
65
|
internal: 3,
|
|
66
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Tetra security violation thrown by assertMinimumAccess.
|
|
69
|
+
*
|
|
70
|
+
* Carries TWO messages:
|
|
71
|
+
* - `message` (inherited): generic, safe to include in client-facing 500 bodies.
|
|
72
|
+
* - `internalDetail`: full diagnostic with route/caller/remediation, for logs
|
|
73
|
+
* and Sentry only. Never put this in a response body.
|
|
74
|
+
*
|
|
75
|
+
* Rationale: prior versions threw Error with the raw "[TETRA SECURITY]
|
|
76
|
+
* systemDB('foo') BLOCKED in 'public' route..." string as `message`, which the
|
|
77
|
+
* global error handler then leaked as the 500 `detail`. That discloses Tetra's
|
|
78
|
+
* internal DB taxonomy, route access levels, and caller names to unauthenticated
|
|
79
|
+
* clients (pentest finding A-1). Splitting public/internal fixes the leak even
|
|
80
|
+
* when a downstream handler naively puts `err.message` in a response body.
|
|
81
|
+
*/
|
|
82
|
+
export class TetraSecurityViolation extends Error {
|
|
83
|
+
internalDetail;
|
|
84
|
+
access;
|
|
85
|
+
caller;
|
|
86
|
+
constructor(publicMessage, internalDetail, opts) {
|
|
87
|
+
super(publicMessage);
|
|
88
|
+
this.name = 'TetraSecurityViolation';
|
|
89
|
+
this.internalDetail = internalDetail;
|
|
90
|
+
this.access = opts.access;
|
|
91
|
+
this.caller = opts.caller;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
67
94
|
export function assertMinimumAccess(required, callerName) {
|
|
68
95
|
const current = getCurrentRouteAccess();
|
|
69
96
|
// ── No context = BLOCKED. Always. No exceptions. ──
|
|
70
97
|
if (current === undefined) {
|
|
71
|
-
throw new
|
|
98
|
+
throw new TetraSecurityViolation('Configuration error', `[TETRA SECURITY] ${callerName} BLOCKED — no route context.\n` +
|
|
72
99
|
`Every privileged DB call must run inside a route context. This means:\n` +
|
|
73
100
|
` - HTTP routes: use createApp() (sets context automatically)\n` +
|
|
74
101
|
` - Cron jobs: wrap in runInRouteContext('cron', fn)\n` +
|
|
75
102
|
` - Startup/init: wrap in runInRouteContext('internal', fn)\n` +
|
|
76
103
|
` - Tests: wrap in runInRouteContext('internal', fn)\n` +
|
|
77
|
-
`There are NO exceptions. Manual Express without createApp() is not supported
|
|
104
|
+
`There are NO exceptions. Manual Express without createApp() is not supported.`, { caller: callerName });
|
|
78
105
|
}
|
|
79
106
|
// ── Context exists, check rank ──
|
|
80
107
|
const currentRank = ACCESS_RANK[current];
|
|
81
108
|
const requiredRank = ACCESS_RANK[required];
|
|
82
109
|
if (currentRank < requiredRank) {
|
|
83
110
|
const prefix = getCurrentRoutePrefix() || '(unknown route)';
|
|
84
|
-
throw new
|
|
111
|
+
throw new TetraSecurityViolation('Configuration error', `[TETRA SECURITY] ${callerName} BLOCKED in '${current}' route (${prefix}). ` +
|
|
85
112
|
`Minimum access level: '${required}'. ` +
|
|
86
|
-
getRemediationHint(current, callerName));
|
|
113
|
+
getRemediationHint(current, callerName), { access: current, caller: callerName });
|
|
87
114
|
}
|
|
88
115
|
}
|
|
89
116
|
function getRemediationHint(access, callerName) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeContext.js","sourceRoot":"","sources":["../../src/core/routeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAqB,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAI,MAAmB,EAAE,EAAW,EAAE,MAAe;IACpF,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAgC;IAC/C,MAAM,EAAE,CAAC;IACT,aAAa,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,QAAqB,EAAE,UAAkB;IAC3E,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IAExC,qDAAqD;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"routeContext.js","sourceRoot":"","sources":["../../src/core/routeContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAUrD,MAAM,YAAY,GAAG,IAAI,iBAAiB,EAAqB,CAAC;AAEhE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAI,MAAmB,EAAE,EAAW,EAAE,MAAe;IACpF,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,YAAY,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AACzC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAgC;IAC/C,MAAM,EAAE,CAAC;IACT,aAAa,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,CAAC;IACb,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/B,cAAc,CAAS;IACvB,MAAM,CAA0B;IAChC,MAAM,CAAS;IAE/B,YAAY,aAAqB,EAAE,cAAsB,EAAE,IAG1D;QACC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAqB,EAAE,UAAkB;IAC3E,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IAExC,qDAAqD;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,sBAAsB,CAC9B,qBAAqB,EACrB,oBAAoB,UAAU,gCAAgC;YAC9D,yEAAyE;YACzE,iEAAiE;YACjE,wDAAwD;YACxD,+DAA+D;YAC/D,wDAAwD;YACxD,+EAA+E,EAC/E,EAAE,MAAM,EAAE,UAAU,EAAE,CACvB,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,qBAAqB,EAAE,IAAI,iBAAiB,CAAC;QAC5D,MAAM,IAAI,sBAAsB,CAC9B,qBAAqB,EACrB,oBAAoB,UAAU,gBAAgB,OAAO,YAAY,MAAM,KAAK;YAC5E,0BAA0B,QAAQ,KAAK;YACvC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,EACvC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CACxC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB,EAAE,UAAkB;IACjE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,sCAAsC,UAAU,wDAAwD,CAAC;QAClH,KAAK,eAAe;YAClB,OAAO,CACL,sEAAsE;gBACtE,yCAAyC;gBACzC,GAAG,UAAU,+EAA+E,CAC7F,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,sCAAsC,UAAU,yCAAyC,CAAC;QACnG;YACE,OAAO,oDAAoD,MAAM,WAAW,CAAC;IACjF,CAAC;AACH,CAAC"}
|
package/dist/core/systemDb.d.ts
CHANGED
|
@@ -34,8 +34,8 @@ import { SupabaseClient } from '@supabase/supabase-js';
|
|
|
34
34
|
/**
|
|
35
35
|
* Create a system-level Supabase client (service role key, bypasses RLS).
|
|
36
36
|
*
|
|
37
|
-
* When DUAL_WRITE=1 or
|
|
38
|
-
* automatically mirrored to the
|
|
37
|
+
* When DUAL_WRITE=1 or TETRA_DUAL_WRITE_TARGETS contains 'ruvector', all writes
|
|
38
|
+
* are automatically mirrored to the configured dual-write daemon (fire-and-forget).
|
|
39
39
|
*
|
|
40
40
|
* @param context - WHY system access is needed (e.g., 'stripe-webhook', 'token-refresh-cron')
|
|
41
41
|
*/
|
package/dist/core/systemDb.js
CHANGED
|
@@ -38,8 +38,8 @@ const logger = createLogger('security:db:system');
|
|
|
38
38
|
/**
|
|
39
39
|
* Create a system-level Supabase client (service role key, bypasses RLS).
|
|
40
40
|
*
|
|
41
|
-
* When DUAL_WRITE=1 or
|
|
42
|
-
* automatically mirrored to the
|
|
41
|
+
* When DUAL_WRITE=1 or TETRA_DUAL_WRITE_TARGETS contains 'ruvector', all writes
|
|
42
|
+
* are automatically mirrored to the configured dual-write daemon (fire-and-forget).
|
|
43
43
|
*
|
|
44
44
|
* @param context - WHY system access is needed (e.g., 'stripe-webhook', 'token-refresh-cron')
|
|
45
45
|
*/
|