node-type-registry 0.34.0 → 0.36.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.
Files changed (79) hide show
  1. package/blueprint-types.generated.d.ts +263 -60
  2. package/blueprint-types.generated.js +30 -0
  3. package/codegen/generate-types.js +3 -1
  4. package/data/data-aggregate-limit-counter.d.ts +1 -1
  5. package/data/data-aggregate-limit-counter.js +4 -4
  6. package/data/data-billing-meter.d.ts +1 -1
  7. package/data/data-billing-meter.js +4 -4
  8. package/data/data-chunks.d.ts +2 -2
  9. package/data/data-chunks.js +6 -6
  10. package/data/data-composite-field.js +4 -2
  11. package/data/data-direct-owner.js +5 -0
  12. package/data/data-entity-membership.js +5 -0
  13. package/data/data-feature-flag.d.ts +1 -1
  14. package/data/data-feature-flag.js +4 -4
  15. package/data/data-file-embedding.d.ts +1 -1
  16. package/data/data-file-embedding.js +9 -27
  17. package/data/data-image-embedding.d.ts +4 -4
  18. package/data/data-image-embedding.js +13 -31
  19. package/data/data-job-trigger.d.ts +1 -1
  20. package/data/data-job-trigger.js +4 -4
  21. package/data/data-jsonb.js +2 -1
  22. package/data/data-limit-counter.d.ts +1 -1
  23. package/data/data-limit-counter.js +4 -4
  24. package/data/data-ownership-in-entity.js +5 -0
  25. package/data/data-peoplestamps.js +5 -0
  26. package/data/data-publishable.js +2 -2
  27. package/data/data-slug.js +3 -4
  28. package/data/data-tags.js +2 -1
  29. package/data/index.d.ts +10 -8
  30. package/data/index.js +13 -9
  31. package/data/process-extraction.d.ts +14 -0
  32. package/data/process-extraction.js +108 -0
  33. package/data/process-image-versions.d.ts +15 -0
  34. package/data/process-image-versions.js +139 -0
  35. package/data/search-unified.js +12 -0
  36. package/data/search-vector.js +1 -16
  37. package/esm/blueprint-types.generated.d.ts +263 -60
  38. package/esm/blueprint-types.generated.js +30 -0
  39. package/esm/codegen/generate-types.js +3 -1
  40. package/esm/data/data-aggregate-limit-counter.d.ts +1 -1
  41. package/esm/data/data-aggregate-limit-counter.js +3 -3
  42. package/esm/data/data-billing-meter.d.ts +1 -1
  43. package/esm/data/data-billing-meter.js +3 -3
  44. package/esm/data/data-chunks.d.ts +2 -2
  45. package/esm/data/data-chunks.js +5 -5
  46. package/esm/data/data-composite-field.js +4 -2
  47. package/esm/data/data-direct-owner.js +5 -0
  48. package/esm/data/data-entity-membership.js +5 -0
  49. package/esm/data/data-feature-flag.d.ts +1 -1
  50. package/esm/data/data-feature-flag.js +3 -3
  51. package/esm/data/data-file-embedding.d.ts +1 -1
  52. package/esm/data/data-file-embedding.js +8 -26
  53. package/esm/data/data-image-embedding.d.ts +4 -4
  54. package/esm/data/data-image-embedding.js +12 -30
  55. package/esm/data/data-job-trigger.d.ts +1 -1
  56. package/esm/data/data-job-trigger.js +3 -3
  57. package/esm/data/data-jsonb.js +2 -1
  58. package/esm/data/data-limit-counter.d.ts +1 -1
  59. package/esm/data/data-limit-counter.js +3 -3
  60. package/esm/data/data-ownership-in-entity.js +5 -0
  61. package/esm/data/data-peoplestamps.js +5 -0
  62. package/esm/data/data-publishable.js +2 -2
  63. package/esm/data/data-slug.js +3 -4
  64. package/esm/data/data-tags.js +2 -1
  65. package/esm/data/index.d.ts +10 -8
  66. package/esm/data/index.js +10 -8
  67. package/esm/data/process-extraction.d.ts +14 -0
  68. package/esm/data/process-extraction.js +105 -0
  69. package/esm/data/process-image-versions.d.ts +15 -0
  70. package/esm/data/process-image-versions.js +136 -0
  71. package/esm/data/search-unified.js +12 -0
  72. package/esm/data/search-vector.js +1 -16
  73. package/esm/module-presets/auth-hardened.js +4 -2
  74. package/esm/module-presets/b2b-storage.js +4 -2
  75. package/esm/module-presets/b2b.js +4 -2
  76. package/module-presets/auth-hardened.js +4 -2
  77. package/module-presets/b2b-storage.js +4 -2
  78. package/module-presets/b2b.js +4 -2
  79. package/package.json +2 -2
@@ -20,6 +20,41 @@ export interface TriggerCondition {
20
20
  /** Negated condition. */
21
21
  NOT?: TriggerCondition;
22
22
  }
23
+ /** Declaratively attaches billing usage-recording triggers to a table. On INSERT the named meter is incremented via record_usage; on DELETE it is decremented (reversal). On UPDATE, if the entity_field changes, the old entity is decremented and the new entity is incremented. Requires a provisioned billing_module for the target database. */
24
+ export interface BillingMeterParams {
25
+ meter_slug: string;
26
+ entity_field?: string;
27
+ quantity?: number;
28
+ events?: ('INSERT' | 'DELETE' | 'UPDATE')[];
29
+ }
30
+ /** Adds a CHECK constraint that validates a column value is greater than a threshold (single-column: column > value) or that one column is greater than another (cross-column: columns[0] > columns[1]). Compiled via AST helpers. */
31
+ export interface CheckGreaterThanParams {
32
+ column?: string;
33
+ value?: number;
34
+ columns?: string[];
35
+ }
36
+ /** Adds a CHECK constraint that validates a column value is less than a threshold (single-column: column < value) or that one column is less than another (cross-column: columns[0] < columns[1]). Compiled via AST helpers. */
37
+ export interface CheckLessThanParams {
38
+ column?: string;
39
+ value?: number;
40
+ columns?: string[];
41
+ }
42
+ /** Adds a CHECK constraint that validates two columns are not equal (columns[0] != columns[1]). Useful for preventing self-referencing rows. Compiled via AST helpers. */
43
+ export interface CheckNotEqualParams {
44
+ columns: string[];
45
+ }
46
+ /** Adds a CHECK constraint that validates a column value is one of an allowed set (e.g. tier IN ('free', 'paid', 'custom')). Compiled to column = ANY(ARRAY[...]) via AST helpers. */
47
+ export interface CheckOneOfParams {
48
+ column: string;
49
+ values: string[];
50
+ }
51
+ /** Enables bulk mutation smart tags on a table. When provisioned, adds @behavior tags for the selected bulk operations (insert, upsert, update, delete). Requires the graphile-bulk-mutations plugin. */
52
+ export interface DataBulkParams {
53
+ insert?: boolean;
54
+ upsert?: boolean;
55
+ update?: boolean;
56
+ delete?: boolean;
57
+ }
23
58
  /** Creates a derived text field that automatically concatenates multiple source fields via BEFORE INSERT/UPDATE triggers. Used to produce a unified text representation (e.g., embedding_text) from multiple columns on a table. The trigger fires with '_000' prefix to run before Search* triggers alphabetically. */
24
59
  export interface DataCompositeFieldParams {
25
60
  target?: string;
@@ -31,18 +66,14 @@ export interface DataDirectOwnerParams {
31
66
  owner_field_name?: string;
32
67
  include_id?: boolean;
33
68
  include_user_fk?: boolean;
69
+ create_index?: boolean;
34
70
  }
35
71
  /** Adds entity reference for organization/group scoping. Enables AuthzEntityMembership, AuthzMembership, AuthzOrgHierarchy authorization. */
36
72
  export interface DataEntityMembershipParams {
37
73
  entity_field_name?: string;
38
74
  include_id?: boolean;
39
75
  include_user_fk?: boolean;
40
- }
41
- /** Gates a table behind a feature flag backed by the cap tables. Attaches a BEFORE INSERT trigger that checks whether the named feature cap value is > 0. Features are modeled as caps with max=0 (disabled) or max=1 (enabled) in limit_caps / limit_caps_defaults tables. Resolution: COALESCE(per-entity cap, scope default, 0). */
42
- export interface DataFeatureFlagParams {
43
- feature_name: string;
44
- scope?: 'app' | 'org';
45
- entity_field?: string;
76
+ create_index?: boolean;
46
77
  }
47
78
  /** BEFORE INSERT trigger that forces a field to the value of jwt_public.current_user_id(). Prevents clients from spoofing the actor/uploader identity. The field value is always overwritten regardless of what the client provides. */
48
79
  export interface DataForceCurrentUserParams {
@@ -52,18 +83,6 @@ export interface DataForceCurrentUserParams {
52
83
  export interface DataIdParams {
53
84
  field_name?: string;
54
85
  }
55
- /** Composition wrapper that creates a vector embedding field with HNSW/IVFFlat index (via SearchVector) and a job trigger with compound conditions (via DataJobTrigger) that fires on INSERT for image files matching mime_type patterns. Designed for storage file tables. */
56
- export interface DataImageEmbeddingParams {
57
- field_name?: string;
58
- dimensions?: number;
59
- index_method?: 'hnsw' | 'ivfflat';
60
- metric?: 'cosine' | 'l2' | 'ip';
61
- task_identifier?: string;
62
- mime_patterns?: string[];
63
- payload_custom?: {
64
- [key: string]: unknown;
65
- };
66
- }
67
86
  /** BEFORE UPDATE trigger that prevents changes to a list of specified fields after INSERT. Raises an exception if any of the listed fields have changed. Unlike FieldImmutable (single-field), this handles multiple fields in a single trigger for efficiency. */
68
87
  export interface DataImmutableFieldsParams {
69
88
  fields: string[];
@@ -80,34 +99,6 @@ export interface DataInheritFromParentParams {
80
99
  parent_table?: string;
81
100
  parent_schema?: string;
82
101
  }
83
- /** Dynamically creates PostgreSQL triggers that enqueue jobs via app_jobs.add_job() when table rows are inserted, updated, or deleted. Supports configurable payload strategies (full row, row ID, selected fields, or custom mapping), conditional firing via WHEN clauses, watched field changes, and extended job options (queue, priority, delay, max attempts). */
84
- export interface DataJobTriggerParams {
85
- task_identifier: string;
86
- payload_strategy?: 'row' | 'row_id' | 'fields' | 'custom';
87
- payload_fields?: string[];
88
- payload_custom?: {
89
- [key: string]: unknown;
90
- };
91
- events?: ('INSERT' | 'UPDATE' | 'DELETE')[];
92
- include_old?: boolean;
93
- include_meta?: boolean;
94
- condition_field?: string;
95
- condition_value?: string;
96
- conditions?: TriggerCondition | TriggerCondition[];
97
- watch_fields?: string[];
98
- job_key?: string;
99
- queue_name?: string;
100
- priority?: number;
101
- run_at_delay?: string;
102
- max_attempts?: number;
103
- }
104
- /** Declaratively attaches limit-tracking triggers to a table. On INSERT the named limit is incremented; on DELETE it is decremented. Requires a provisioned limits_module for the target scope. */
105
- export interface DataLimitCounterParams {
106
- limit_name: string;
107
- scope?: 'app' | 'org';
108
- actor_field?: string;
109
- events?: ('INSERT' | 'DELETE' | 'UPDATE')[];
110
- }
111
102
  /** Adds a JSONB column with optional GIN index for containment queries (@>, ?, ?|, ?&). Standard pattern for semi-structured metadata. */
112
103
  export interface DataJsonbParams {
113
104
  field_name?: string;
@@ -126,6 +117,7 @@ export interface DataOwnershipInEntityParams {
126
117
  entity_field_name?: string;
127
118
  include_id?: boolean;
128
119
  include_user_fk?: boolean;
120
+ create_index?: boolean;
129
121
  }
130
122
  /** Adds user tracking for creates/updates with created_by and updated_by columns. */
131
123
  export interface DataPeoplestampsParams {
@@ -133,6 +125,7 @@ export interface DataPeoplestampsParams {
133
125
  updated_by_field?: string;
134
126
  include_id?: boolean;
135
127
  include_user_fk?: boolean;
128
+ create_index?: boolean;
136
129
  }
137
130
  /** Adds publish state columns (is_published, published_at) for content visibility. Enables AuthzPublishable and AuthzTemporal authorization. */
138
131
  export interface DataPublishableParams {
@@ -140,9 +133,14 @@ export interface DataPublishableParams {
140
133
  published_at_field?: string;
141
134
  include_id?: boolean;
142
135
  }
136
+ /** Creates per-table subscriber tables in subscriptions_public with RLS policies derived from source table SELECT policies. Attaches statement-level triggers to emit changes to subscribers. */
137
+ export interface DataRealtimeParams {
138
+ operations?: ('INSERT' | 'UPDATE' | 'DELETE')[];
139
+ subscriber_table_name?: string;
140
+ }
143
141
  /** Auto-generates URL-friendly slugs from field values on insert/update. Attaches BEFORE INSERT and BEFORE UPDATE triggers that call inflection.slugify() on the target field. References fields by name in data jsonb. */
144
142
  export interface DataSlugParams {
145
- field_name: string;
143
+ field_name?: string;
146
144
  source_field_name?: string;
147
145
  }
148
146
  /** Adds soft delete support with deleted_at and is_deleted columns. */
@@ -177,6 +175,25 @@ export type TableOrganizationSettingsParams = {};
177
175
  export type TableUserProfilesParams = {};
178
176
  /** Creates a user settings table for user-specific configuration. Uses AuthzDirectOwner for access control. */
179
177
  export type TableUserSettingsParams = {};
178
+ /** Declaratively attaches aggregate limit-tracking triggers to a table. On INSERT the named limit is incremented per entity; on DELETE it is decremented. Uses org_limit_aggregates_inc/dec for per-entity (org-level) aggregate limits rather than per-user limits. Requires a provisioned limits_module for the target database. */
179
+ export interface LimitAggregateParams {
180
+ limit_name: string;
181
+ entity_field?: string;
182
+ events?: ('INSERT' | 'DELETE' | 'UPDATE')[];
183
+ }
184
+ /** Gates a table behind a feature flag backed by the cap tables. Attaches a BEFORE INSERT trigger that checks whether the named feature cap value is > 0. Features are modeled as caps with max=0 (disabled) or max=1 (enabled) in limit_caps / limit_caps_defaults tables. Resolution: COALESCE(per-entity cap, scope default, 0). */
185
+ export interface LimitFeatureFlagParams {
186
+ feature_name: string;
187
+ scope?: 'app' | 'org';
188
+ entity_field?: string;
189
+ }
190
+ /** Declaratively attaches limit-tracking triggers to a table. On INSERT the named limit is incremented; on DELETE it is decremented. Requires a provisioned limits_module for the target scope. */
191
+ export interface LimitCounterParams {
192
+ limit_name: string;
193
+ scope?: 'app' | 'org';
194
+ actor_field?: string;
195
+ events?: ('INSERT' | 'DELETE' | 'UPDATE')[];
196
+ }
180
197
  /** Creates a BM25 index on an existing text column using pg_textsearch. Enables statistical relevance ranking with configurable k1 and b parameters. The BM25 index is auto-detected by graphile-search. */
181
198
  export interface SearchBm25Params {
182
199
  field_name: string;
@@ -258,6 +275,8 @@ export interface SearchUnifiedParams {
258
275
  chunking_task_name?: string;
259
276
  };
260
277
  };
278
+ embedding_text_field?: string;
279
+ composite_format?: 'labeled' | 'plain';
261
280
  trgm_fields?: string[];
262
281
  search_config?: {
263
282
  weights?: {
@@ -269,7 +288,7 @@ export interface SearchUnifiedParams {
269
288
  boost_recency_decay?: number;
270
289
  };
271
290
  }
272
- /** Adds a vector embedding column with HNSW or IVFFlat index for similarity search. Supports configurable dimensions, distance metrics (cosine, l2, ip), stale tracking strategies (column, null, hash), and automatic job enqueue triggers for embedding generation. */
291
+ /** Adds a vector embedding column with HNSW or IVFFlat index for similarity search. Supports configurable dimensions, distance metrics (cosine, l2, ip), per-field {field_name}_updated_at timestamp tracking (read-only in GraphQL), and automatic job enqueue triggers for embedding generation. */
273
292
  export interface SearchVectorParams {
274
293
  field_name?: string;
275
294
  dimensions?: number;
@@ -278,11 +297,9 @@ export interface SearchVectorParams {
278
297
  index_options?: {
279
298
  [key: string]: unknown;
280
299
  };
281
- include_stale_field?: boolean;
282
300
  source_fields?: string[];
283
301
  enqueue_job?: boolean;
284
302
  job_task_name?: string;
285
- stale_strategy?: 'column' | 'null' | 'hash';
286
303
  chunks?: {
287
304
  content_field_name?: string;
288
305
  chunk_size?: number;
@@ -295,6 +312,139 @@ export interface SearchVectorParams {
295
312
  chunking_task_name?: string;
296
313
  };
297
314
  }
315
+ /** Dynamically creates PostgreSQL triggers that enqueue jobs via app_jobs.add_job() when table rows are inserted, updated, or deleted. Supports configurable payload strategies (full row, row ID, selected fields, or custom mapping), conditional firing via WHEN clauses, watched field changes, and extended job options (queue, priority, delay, max attempts). */
316
+ export interface JobTriggerParams {
317
+ task_identifier: string;
318
+ payload_strategy?: 'row' | 'row_id' | 'fields' | 'custom';
319
+ payload_fields?: string[];
320
+ payload_custom?: {
321
+ [key: string]: unknown;
322
+ };
323
+ events?: ('INSERT' | 'UPDATE' | 'DELETE')[];
324
+ include_old?: boolean;
325
+ include_meta?: boolean;
326
+ condition_field?: string;
327
+ condition_value?: string;
328
+ conditions?: TriggerCondition | TriggerCondition[];
329
+ watch_fields?: string[];
330
+ job_key?: string;
331
+ queue_name?: string;
332
+ priority?: number;
333
+ run_at_delay?: string;
334
+ max_attempts?: number;
335
+ }
336
+ /** Creates a chunked-embedding child table for any parent table. Provisions the chunks table with content, chunk_index, embedding vector, metadata, HNSW index, inherited RLS, and optional job trigger for automatic text splitting. Composed internally by ProcessFileEmbedding (enabled by default in extract mode) but can also be used standalone. */
337
+ export interface ProcessChunksParams {
338
+ content_field_name?: string;
339
+ chunk_size?: number;
340
+ chunk_overlap?: number;
341
+ chunk_strategy?: 'fixed' | 'sentence' | 'paragraph' | 'semantic';
342
+ dimensions?: number;
343
+ metric?: 'cosine' | 'l2' | 'ip';
344
+ chunks_table_name?: string;
345
+ metadata_fields?: string[];
346
+ enqueue_chunking_job?: boolean;
347
+ chunking_task_name?: string;
348
+ }
349
+ /** Generic, MIME-scoped embedding node for file tables. Supports two modes: direct (whole-file to single vector, e.g. CLIP for images) when extraction is omitted, or extract (file to text to chunks to per-chunk vectors) when extraction config is provided. Composes SearchVector + JobTrigger + ProcessChunks (enabled by default in extract mode) internally. Multiple instances can coexist on the same table with different MIME scopes, field names, and embedding strategies. */
350
+ export interface ProcessFileEmbeddingParams {
351
+ field_name?: string;
352
+ dimensions?: number;
353
+ index_method?: 'hnsw' | 'ivfflat';
354
+ metric?: 'cosine' | 'l2' | 'ip';
355
+ index_options?: {
356
+ [key: string]: unknown;
357
+ };
358
+ mime_patterns?: string[];
359
+ task_identifier?: string;
360
+ events?: ('INSERT' | 'UPDATE')[];
361
+ payload_custom?: {
362
+ [key: string]: unknown;
363
+ };
364
+ trigger_conditions?: TriggerCondition | TriggerCondition[];
365
+ extraction?: {
366
+ text_field?: string;
367
+ metadata_field?: string;
368
+ };
369
+ include_chunks?: boolean;
370
+ chunks?: {
371
+ content_field_name?: string;
372
+ chunk_size?: number;
373
+ chunk_overlap?: number;
374
+ chunk_strategy?: 'fixed' | 'sentence' | 'paragraph' | 'semantic';
375
+ metadata_fields?: string[];
376
+ enqueue_chunking_job?: boolean;
377
+ chunking_task_name?: string;
378
+ };
379
+ }
380
+ /** Image-specific preset of ProcessFileEmbedding. Delegates to ProcessFileEmbedding with image-oriented defaults: dimensions=512 (CLIP), mime_patterns=['image/%'], task_identifier='process_image_embedding', direct mode (no extraction). Accepts all ProcessFileEmbedding parameters — any overrides are forwarded through. */
381
+ export interface ProcessImageEmbeddingParams {
382
+ field_name?: string;
383
+ dimensions?: number;
384
+ index_method?: 'hnsw' | 'ivfflat';
385
+ metric?: 'cosine' | 'l2' | 'ip';
386
+ index_options?: {
387
+ [key: string]: unknown;
388
+ };
389
+ mime_patterns?: string[];
390
+ task_identifier?: string;
391
+ events?: ('INSERT' | 'UPDATE')[];
392
+ payload_custom?: {
393
+ [key: string]: unknown;
394
+ };
395
+ trigger_conditions?: TriggerCondition | TriggerCondition[];
396
+ extraction?: {
397
+ text_field?: string;
398
+ metadata_field?: string;
399
+ };
400
+ chunks?: {
401
+ content_field_name?: string;
402
+ chunk_size?: number;
403
+ chunk_overlap?: number;
404
+ chunk_strategy?: 'fixed' | 'sentence' | 'paragraph' | 'semantic';
405
+ metadata_fields?: {
406
+ [key: string]: unknown;
407
+ };
408
+ enqueue_chunking_job?: boolean;
409
+ chunking_task_name?: string;
410
+ };
411
+ }
412
+ /** Creates extraction output fields and a job trigger for file text extraction. Fires when a file is uploaded (status = 'uploaded') or on INSERT. The external worker extracts text/metadata from the file (PDF, DOCX, HTML, etc.) and writes the result back to the configured output fields. Typically used upstream of ProcessFileEmbedding or ProcessChunks. */
413
+ export interface ProcessExtractionParams {
414
+ text_field?: string;
415
+ metadata_field?: string;
416
+ mime_patterns?: string[];
417
+ task_identifier?: string;
418
+ events?: ('INSERT' | 'UPDATE')[];
419
+ payload_custom?: {
420
+ [key: string]: unknown;
421
+ };
422
+ trigger_conditions?: TriggerCondition | TriggerCondition[];
423
+ queue_name?: string;
424
+ max_attempts?: number;
425
+ priority?: number;
426
+ }
427
+ /** Creates a job trigger for image variant generation. Fires when an image file is uploaded (status = 'uploaded') or on INSERT. The external worker generates resized, cropped, or reformatted versions (thumbnails, previews, WebP conversions, etc.) and stores them as new file records linked to the source image. */
428
+ export interface ProcessImageVersionsParams {
429
+ versions: {
430
+ name: string;
431
+ width?: number;
432
+ height?: number;
433
+ fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside';
434
+ format?: 'jpeg' | 'png' | 'webp' | 'avif';
435
+ quality?: number;
436
+ }[];
437
+ mime_patterns?: string[];
438
+ task_identifier?: string;
439
+ events?: ('INSERT' | 'UPDATE')[];
440
+ payload_custom?: {
441
+ [key: string]: unknown;
442
+ };
443
+ trigger_conditions?: TriggerCondition | TriggerCondition[];
444
+ queue_name?: string;
445
+ max_attempts?: number;
446
+ priority?: number;
447
+ }
298
448
  /** Allows all access. Generates TRUE expression. */
299
449
  export type AuthzAllowAllParams = {};
300
450
  /** App-level membership check (hardcoded membership_type=1). Verifies the user has app membership (optionally with specific permission) without binding to any entity from the row. Uses EXISTS subquery against SPRT table. For entity-scoped checks (org, channel, etc.), use AuthzEntityMembership instead. */
@@ -315,6 +465,16 @@ export interface AuthzCompositeParams {
315
465
  }
316
466
  /** Denies all access. Generates FALSE expression. */
317
467
  export type AuthzDenyAllParams = {};
468
+ /** Path-scoped file sharing via ltree containment. Grants access when a path_shares row matches the current user, bucket, and an ancestor path with the required permission. */
469
+ export interface AuthzFilePathParams {
470
+ shares_schema: string;
471
+ shares_table: string;
472
+ files_schema?: string;
473
+ files_table: string;
474
+ permission_field: string;
475
+ bucket_field?: string;
476
+ path_field?: string;
477
+ }
318
478
  /** Direct equality comparison between a table column and the current user ID. Simplest authorization pattern with no subqueries. */
319
479
  export interface AuthzDirectOwnerParams {
320
480
  entity_field: string;
@@ -536,7 +696,7 @@ export interface BlueprintField {
536
696
  /** An RLS policy entry for a blueprint table. Uses $type to match the blueprint JSON convention. */
537
697
  export interface BlueprintPolicy {
538
698
  /** Authz* policy type name (e.g., "AuthzDirectOwner", "AuthzAllowAll"). */
539
- $type: 'AuthzAllowAll' | 'AuthzAppMembership' | 'AuthzComposite' | 'AuthzDenyAll' | 'AuthzDirectOwner' | 'AuthzDirectOwnerAny' | 'AuthzEntityMembership' | 'AuthzMemberList' | 'AuthzNotReadOnly' | 'AuthzOrgHierarchy' | 'AuthzPeerOwnership' | 'AuthzPublishable' | 'AuthzRelatedEntityMembership' | 'AuthzRelatedMemberList' | 'AuthzRelatedPeerOwnership' | 'AuthzTemporal';
699
+ $type: 'AuthzAllowAll' | 'AuthzAppMembership' | 'AuthzComposite' | 'AuthzDenyAll' | 'AuthzFilePath' | 'AuthzDirectOwner' | 'AuthzDirectOwnerAny' | 'AuthzEntityMembership' | 'AuthzMemberList' | 'AuthzNotReadOnly' | 'AuthzOrgHierarchy' | 'AuthzPeerOwnership' | 'AuthzPublishable' | 'AuthzRelatedEntityMembership' | 'AuthzRelatedMemberList' | 'AuthzRelatedPeerOwnership' | 'AuthzTemporal';
540
700
  /** Privileges this policy applies to (e.g., ["select"], ["insert", "update", "delete"]). */
541
701
  privileges?: string[];
542
702
  /** Whether this policy is permissive (true) or restrictive (false). Defaults to true. */
@@ -660,6 +820,10 @@ export interface BlueprintStorageConfig {
660
820
  default_max_file_size?: number;
661
821
  /** CORS allowed origins for the storage module. */
662
822
  allowed_origins?: string[];
823
+ /** Enable deferred upload confirmation via HeadObject. When true, creates SECURITY DEFINER status transition functions (confirm_uploaded, mark_processed) and an AFTER INSERT trigger that enqueues a storage:confirm_upload job. The job verifies the file exists in S3 before transitioning status from requested to uploaded. Defaults to false. */
824
+ has_confirm_upload?: boolean;
825
+ /** Delay before the first upload confirmation attempt (PostgreSQL interval string, e.g. "30 seconds"). Only used when has_confirm_upload is true. Defaults to "30 seconds". */
826
+ confirm_upload_delay?: string;
663
827
  /** Per-table overrides for storage tables. Each key targets a specific storage table (files, buckets) and uses the same shape as table_provision: { nodes, fields, grants, use_rls, policies }. Fanned out to secure_table_provision targeting the corresponding table. When a key includes policies[], those REPLACE the default storage policies for that table; tables without a key still get defaults. */
664
828
  provisions?: {
665
829
  files?: BlueprintEntityTableProvision;
@@ -714,7 +878,7 @@ export interface BlueprintEntityType {
714
878
  storage?: BlueprintStorageConfig;
715
879
  }
716
880
  /** String shorthand -- just the node type name. */
717
- export type BlueprintNodeShorthand = 'AuthzAllowAll' | 'AuthzAppMembership' | 'AuthzComposite' | 'AuthzDenyAll' | 'AuthzDirectOwner' | 'AuthzDirectOwnerAny' | 'AuthzEntityMembership' | 'AuthzMemberList' | 'AuthzNotReadOnly' | 'AuthzOrgHierarchy' | 'AuthzPeerOwnership' | 'AuthzPublishable' | 'AuthzRelatedEntityMembership' | 'AuthzRelatedMemberList' | 'AuthzRelatedPeerOwnership' | 'AuthzTemporal' | 'DataCompositeField' | 'DataDirectOwner' | 'DataEntityMembership' | 'DataFeatureFlag' | 'DataForceCurrentUser' | 'DataId' | 'DataImageEmbedding' | 'DataImmutableFields' | 'DataInflection' | 'DataInheritFromParent' | 'DataJobTrigger' | 'DataLimitCounter' | 'DataJsonb' | 'DataOwnedFields' | 'DataOwnershipInEntity' | 'DataPeoplestamps' | 'DataPublishable' | 'DataSlug' | 'DataSoftDelete' | 'DataStatusField' | 'DataTags' | 'DataTimestamps' | 'SearchBm25' | 'SearchFullText' | 'SearchSpatial' | 'SearchSpatialAggregate' | 'SearchTrgm' | 'SearchUnified' | 'SearchVector' | 'TableOrganizationSettings' | 'TableUserProfiles' | 'TableUserSettings';
881
+ export type BlueprintNodeShorthand = 'AuthzAllowAll' | 'AuthzAppMembership' | 'AuthzComposite' | 'AuthzDenyAll' | 'AuthzFilePath' | 'AuthzDirectOwner' | 'AuthzDirectOwnerAny' | 'AuthzEntityMembership' | 'AuthzMemberList' | 'AuthzNotReadOnly' | 'AuthzOrgHierarchy' | 'AuthzPeerOwnership' | 'AuthzPublishable' | 'AuthzRelatedEntityMembership' | 'AuthzRelatedMemberList' | 'AuthzRelatedPeerOwnership' | 'AuthzTemporal' | 'CheckGreaterThan' | 'CheckLessThan' | 'CheckNotEqual' | 'CheckOneOf' | 'LimitAggregate' | 'BillingMeter' | 'DataBulk' | 'ProcessChunks' | 'DataCompositeField' | 'DataDirectOwner' | 'DataEntityMembership' | 'ProcessFileEmbedding' | 'LimitFeatureFlag' | 'DataForceCurrentUser' | 'DataId' | 'ProcessImageEmbedding' | 'DataImmutableFields' | 'DataInflection' | 'DataInheritFromParent' | 'JobTrigger' | 'LimitCounter' | 'DataJsonb' | 'DataOwnedFields' | 'ProcessExtraction' | 'ProcessImageVersions' | 'DataOwnershipInEntity' | 'DataPeoplestamps' | 'DataPublishable' | 'DataRealtime' | 'DataSlug' | 'DataSoftDelete' | 'DataStatusField' | 'DataTags' | 'DataTimestamps' | 'SearchBm25' | 'SearchFullText' | 'SearchSpatial' | 'SearchSpatialAggregate' | 'SearchTrgm' | 'SearchUnified' | 'SearchVector' | 'TableOrganizationSettings' | 'TableUserProfiles' | 'TableUserSettings';
718
882
  /** Object form -- { $type, data } with typed parameters. */
719
883
  export type BlueprintNodeObject = {
720
884
  $type: 'AuthzAllowAll';
@@ -728,6 +892,9 @@ export type BlueprintNodeObject = {
728
892
  } | {
729
893
  $type: 'AuthzDenyAll';
730
894
  data?: Record<string, never>;
895
+ } | {
896
+ $type: 'AuthzFilePath';
897
+ data: AuthzFilePathParams;
731
898
  } | {
732
899
  $type: 'AuthzDirectOwner';
733
900
  data: AuthzDirectOwnerParams;
@@ -764,6 +931,30 @@ export type BlueprintNodeObject = {
764
931
  } | {
765
932
  $type: 'AuthzTemporal';
766
933
  data: AuthzTemporalParams;
934
+ } | {
935
+ $type: 'CheckGreaterThan';
936
+ data: CheckGreaterThanParams;
937
+ } | {
938
+ $type: 'CheckLessThan';
939
+ data: CheckLessThanParams;
940
+ } | {
941
+ $type: 'CheckNotEqual';
942
+ data: CheckNotEqualParams;
943
+ } | {
944
+ $type: 'CheckOneOf';
945
+ data: CheckOneOfParams;
946
+ } | {
947
+ $type: 'LimitAggregate';
948
+ data: LimitAggregateParams;
949
+ } | {
950
+ $type: 'BillingMeter';
951
+ data: BillingMeterParams;
952
+ } | {
953
+ $type: 'DataBulk';
954
+ data: DataBulkParams;
955
+ } | {
956
+ $type: 'ProcessChunks';
957
+ data: ProcessChunksParams;
767
958
  } | {
768
959
  $type: 'DataCompositeField';
769
960
  data: DataCompositeFieldParams;
@@ -774,8 +965,11 @@ export type BlueprintNodeObject = {
774
965
  $type: 'DataEntityMembership';
775
966
  data: DataEntityMembershipParams;
776
967
  } | {
777
- $type: 'DataFeatureFlag';
778
- data: DataFeatureFlagParams;
968
+ $type: 'ProcessFileEmbedding';
969
+ data: ProcessFileEmbeddingParams;
970
+ } | {
971
+ $type: 'LimitFeatureFlag';
972
+ data: LimitFeatureFlagParams;
779
973
  } | {
780
974
  $type: 'DataForceCurrentUser';
781
975
  data: DataForceCurrentUserParams;
@@ -783,8 +977,8 @@ export type BlueprintNodeObject = {
783
977
  $type: 'DataId';
784
978
  data: DataIdParams;
785
979
  } | {
786
- $type: 'DataImageEmbedding';
787
- data: DataImageEmbeddingParams;
980
+ $type: 'ProcessImageEmbedding';
981
+ data: ProcessImageEmbeddingParams;
788
982
  } | {
789
983
  $type: 'DataImmutableFields';
790
984
  data: DataImmutableFieldsParams;
@@ -795,17 +989,23 @@ export type BlueprintNodeObject = {
795
989
  $type: 'DataInheritFromParent';
796
990
  data: DataInheritFromParentParams;
797
991
  } | {
798
- $type: 'DataJobTrigger';
799
- data: DataJobTriggerParams;
992
+ $type: 'JobTrigger';
993
+ data: JobTriggerParams;
800
994
  } | {
801
- $type: 'DataLimitCounter';
802
- data: DataLimitCounterParams;
995
+ $type: 'LimitCounter';
996
+ data: LimitCounterParams;
803
997
  } | {
804
998
  $type: 'DataJsonb';
805
999
  data: DataJsonbParams;
806
1000
  } | {
807
1001
  $type: 'DataOwnedFields';
808
1002
  data: DataOwnedFieldsParams;
1003
+ } | {
1004
+ $type: 'ProcessExtraction';
1005
+ data: ProcessExtractionParams;
1006
+ } | {
1007
+ $type: 'ProcessImageVersions';
1008
+ data: ProcessImageVersionsParams;
809
1009
  } | {
810
1010
  $type: 'DataOwnershipInEntity';
811
1011
  data: DataOwnershipInEntityParams;
@@ -815,6 +1015,9 @@ export type BlueprintNodeObject = {
815
1015
  } | {
816
1016
  $type: 'DataPublishable';
817
1017
  data: DataPublishableParams;
1018
+ } | {
1019
+ $type: 'DataRealtime';
1020
+ data: DataRealtimeParams;
818
1021
  } | {
819
1022
  $type: 'DataSlug';
820
1023
  data: DataSlugParams;
@@ -14,18 +14,48 @@ Object.defineProperty(exports, "__esModule", { value: true });
14
14
  * ===========================================================================
15
15
  */
16
16
  ;
17
+ /**
18
+ * ===========================================================================
19
+ * Billing node type parameters
20
+ * ===========================================================================
21
+ */
22
+ ;
23
+ /**
24
+ * ===========================================================================
25
+ * Check node type parameters
26
+ * ===========================================================================
27
+ */
28
+ ;
17
29
  /**
18
30
  * ===========================================================================
19
31
  * Data node type parameters
20
32
  * ===========================================================================
21
33
  */
22
34
  ;
35
+ /**
36
+ * ===========================================================================
37
+ * Limit node type parameters
38
+ * ===========================================================================
39
+ */
40
+ ;
23
41
  /**
24
42
  * ===========================================================================
25
43
  * Search node type parameters
26
44
  * ===========================================================================
27
45
  */
28
46
  ;
47
+ /**
48
+ * ===========================================================================
49
+ * Job node type parameters
50
+ * ===========================================================================
51
+ */
52
+ ;
53
+ /**
54
+ * ===========================================================================
55
+ * Process node type parameters
56
+ * ===========================================================================
57
+ */
58
+ ;
29
59
  /**
30
60
  * ===========================================================================
31
61
  * Authz node type parameters
@@ -520,6 +520,8 @@ function buildBlueprintStorageConfig() {
520
520
  addJSDoc(optionalProp('download_url_expiry_seconds', t.tsNumberKeyword()), 'Override for presigned download URL expiry time in seconds.'),
521
521
  addJSDoc(optionalProp('default_max_file_size', t.tsNumberKeyword()), 'Default maximum file size in bytes for the storage module.'),
522
522
  addJSDoc(optionalProp('allowed_origins', t.tsArrayType(t.tsStringKeyword())), 'CORS allowed origins for the storage module.'),
523
+ addJSDoc(optionalProp('has_confirm_upload', t.tsBooleanKeyword()), 'Enable deferred upload confirmation via HeadObject. When true, creates SECURITY DEFINER status transition functions (confirm_uploaded, mark_processed) and an AFTER INSERT trigger that enqueues a storage:confirm_upload job. The job verifies the file exists in S3 before transitioning status from requested to uploaded. Defaults to false.'),
524
+ addJSDoc(optionalProp('confirm_upload_delay', t.tsStringKeyword()), 'Delay before the first upload confirmation attempt (PostgreSQL interval string, e.g. "30 seconds"). Only used when has_confirm_upload is true. Defaults to "30 seconds".'),
523
525
  addJSDoc(optionalProp('provisions', t.tsTypeLiteral([
524
526
  optionalProp('files', t.tsTypeReference(t.identifier('BlueprintEntityTableProvision'))),
525
527
  optionalProp('buckets', t.tsTypeReference(t.identifier('BlueprintEntityTableProvision')))
@@ -616,7 +618,7 @@ function buildProgram(meta) {
616
618
  statements.push(sectionComment('Shared recursive types'));
617
619
  statements.push(buildTriggerConditionInterface());
618
620
  // -- Parameter interfaces grouped by category --
619
- const categoryOrder = ['data', 'search', 'authz', 'relation', 'view'];
621
+ const categoryOrder = ['billing', 'check', 'data', 'limit', 'search', 'job', 'process', 'authz', 'relation', 'view'];
620
622
  for (const cat of categoryOrder) {
621
623
  const nts = categories.get(cat);
622
624
  if (!nts || nts.length === 0)
@@ -1,2 +1,2 @@
1
1
  import type { NodeTypeDefinition } from '../types';
2
- export declare const DataAggregateLimitCounter: NodeTypeDefinition;
2
+ export declare const LimitAggregate: NodeTypeDefinition;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DataAggregateLimitCounter = void 0;
4
- exports.DataAggregateLimitCounter = {
5
- name: 'DataAggregateLimitCounter',
3
+ exports.LimitAggregate = void 0;
4
+ exports.LimitAggregate = {
5
+ name: 'LimitAggregate',
6
6
  slug: 'data_aggregate_limit_counter',
7
- category: 'data',
7
+ category: 'limit',
8
8
  display_name: 'Aggregate Limit Counter',
9
9
  description: 'Declaratively attaches aggregate limit-tracking triggers to a table. On INSERT the named limit is incremented per entity; on DELETE it is decremented. Uses org_limit_aggregates_inc/dec for per-entity (org-level) aggregate limits rather than per-user limits. Requires a provisioned limits_module for the target database.',
10
10
  parameter_schema: {
@@ -1,2 +1,2 @@
1
1
  import type { NodeTypeDefinition } from '../types';
2
- export declare const DataBillingMeter: NodeTypeDefinition;
2
+ export declare const BillingMeter: NodeTypeDefinition;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DataBillingMeter = void 0;
4
- exports.DataBillingMeter = {
5
- name: 'DataBillingMeter',
3
+ exports.BillingMeter = void 0;
4
+ exports.BillingMeter = {
5
+ name: 'BillingMeter',
6
6
  slug: 'data_billing_meter',
7
- category: 'data',
7
+ category: 'billing',
8
8
  display_name: 'Billing Meter',
9
9
  description: 'Declaratively attaches billing usage-recording triggers to a table. On INSERT the named meter is incremented via record_usage; on DELETE it is decremented (reversal). On UPDATE, if the entity_field changes, the old entity is decremented and the new entity is incremented. Requires a provisioned billing_module for the target database.',
10
10
  parameter_schema: {
@@ -11,8 +11,8 @@ import type { NodeTypeDefinition } from '../types';
11
11
  * - RLS policies inherited from parent
12
12
  * - Optional job trigger for automatic chunking on INSERT/UPDATE
13
13
  *
14
- * This node is also composed internally by DataFileEmbedding (enabled by
14
+ * This node is also composed internally by ProcessFileEmbedding (enabled by
15
15
  * default in extract mode). Use it standalone when you want a chunks table
16
16
  * without the full file-embedding pipeline.
17
17
  */
18
- export declare const DataChunks: NodeTypeDefinition;
18
+ export declare const ProcessChunks: NodeTypeDefinition;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DataChunks = void 0;
3
+ exports.ProcessChunks = void 0;
4
4
  /**
5
5
  * Standalone chunking node type.
6
6
  *
@@ -13,19 +13,19 @@ exports.DataChunks = void 0;
13
13
  * - RLS policies inherited from parent
14
14
  * - Optional job trigger for automatic chunking on INSERT/UPDATE
15
15
  *
16
- * This node is also composed internally by DataFileEmbedding (enabled by
16
+ * This node is also composed internally by ProcessFileEmbedding (enabled by
17
17
  * default in extract mode). Use it standalone when you want a chunks table
18
18
  * without the full file-embedding pipeline.
19
19
  */
20
- exports.DataChunks = {
21
- name: 'DataChunks',
20
+ exports.ProcessChunks = {
21
+ name: 'ProcessChunks',
22
22
  slug: 'data_chunks',
23
- category: 'data',
23
+ category: 'process',
24
24
  display_name: 'Chunks',
25
25
  description: 'Creates a chunked-embedding child table for any parent table. ' +
26
26
  'Provisions the chunks table with content, chunk_index, embedding vector, ' +
27
27
  'metadata, HNSW index, inherited RLS, and optional job trigger for ' +
28
- 'automatic text splitting. Composed internally by DataFileEmbedding ' +
28
+ 'automatic text splitting. Composed internally by ProcessFileEmbedding ' +
29
29
  '(enabled by default in extract mode) but can also be used standalone.',
30
30
  parameter_schema: {
31
31
  type: 'object',