@objectstack/service-feed 3.0.7

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.
@@ -0,0 +1,978 @@
1
+ import { Plugin, PluginContext } from '@objectstack/core';
2
+ import { IFeedService, ListFeedOptions, FeedListResult, CreateFeedItemInput, UpdateFeedItemInput, SubscribeInput } from '@objectstack/spec/contracts';
3
+ import * as _objectstack_spec_data from '@objectstack/spec/data';
4
+ import { FeedItem as FeedItem$1, Reaction, RecordSubscription as RecordSubscription$1 } from '@objectstack/spec/data';
5
+ import { z } from 'zod';
6
+
7
+ /**
8
+ * Configuration options for InMemoryFeedAdapter.
9
+ */
10
+ interface InMemoryFeedAdapterOptions {
11
+ /** Maximum number of feed items to store (0 = unlimited) */
12
+ maxItems?: number;
13
+ }
14
+ /**
15
+ * In-memory Feed/Chatter adapter implementing IFeedService.
16
+ *
17
+ * Uses Map-backed stores for feed items, reactions, and subscriptions.
18
+ * Supports feed CRUD, emoji reactions, threaded replies, and record subscriptions.
19
+ *
20
+ * Suitable for single-process environments, development, and testing.
21
+ * For production deployments, use a database-backed adapter.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * const feed = new InMemoryFeedAdapter();
26
+ *
27
+ * const item = await feed.createFeedItem({
28
+ * object: 'account',
29
+ * recordId: 'rec_123',
30
+ * type: 'comment',
31
+ * actor: { type: 'user', id: 'user_1', name: 'Alice' },
32
+ * body: 'Great progress!',
33
+ * });
34
+ *
35
+ * const list = await feed.listFeed({ object: 'account', recordId: 'rec_123' });
36
+ * ```
37
+ */
38
+ declare class InMemoryFeedAdapter implements IFeedService {
39
+ private readonly items;
40
+ private counter;
41
+ private readonly subscriptions;
42
+ private readonly maxItems;
43
+ constructor(options?: InMemoryFeedAdapterOptions);
44
+ listFeed(options: ListFeedOptions): Promise<FeedListResult>;
45
+ createFeedItem(input: CreateFeedItemInput): Promise<FeedItem$1>;
46
+ updateFeedItem(feedId: string, input: UpdateFeedItemInput): Promise<FeedItem$1>;
47
+ deleteFeedItem(feedId: string): Promise<void>;
48
+ getFeedItem(feedId: string): Promise<FeedItem$1 | null>;
49
+ addReaction(feedId: string, emoji: string, userId: string): Promise<Reaction[]>;
50
+ removeReaction(feedId: string, emoji: string, userId: string): Promise<Reaction[]>;
51
+ subscribe(input: SubscribeInput): Promise<RecordSubscription$1>;
52
+ unsubscribe(object: string, recordId: string, userId: string): Promise<boolean>;
53
+ getSubscription(object: string, recordId: string, userId: string): Promise<RecordSubscription$1 | null>;
54
+ /**
55
+ * Get the total number of feed items stored.
56
+ */
57
+ getItemCount(): number;
58
+ /**
59
+ * Get the total number of subscriptions stored.
60
+ */
61
+ getSubscriptionCount(): number;
62
+ private subscriptionKey;
63
+ private findSubscription;
64
+ }
65
+
66
+ /**
67
+ * Configuration options for the FeedServicePlugin.
68
+ */
69
+ interface FeedServicePluginOptions {
70
+ /** Feed adapter type (default: 'memory') */
71
+ adapter?: 'memory';
72
+ /** Options for the in-memory adapter */
73
+ memory?: InMemoryFeedAdapterOptions;
74
+ }
75
+ /**
76
+ * FeedServicePlugin — Production IFeedService implementation.
77
+ *
78
+ * Registers a Feed/Chatter service with the kernel during the init phase.
79
+ * Currently supports in-memory storage for single-process environments.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * import { ObjectKernel } from '@objectstack/core';
84
+ * import { FeedServicePlugin } from '@objectstack/service-feed';
85
+ *
86
+ * const kernel = new ObjectKernel();
87
+ * kernel.use(new FeedServicePlugin());
88
+ * await kernel.bootstrap();
89
+ *
90
+ * const feed = kernel.getService('feed');
91
+ * const item = await feed.createFeedItem({
92
+ * object: 'account',
93
+ * recordId: 'rec_123',
94
+ * type: 'comment',
95
+ * actor: { type: 'user', id: 'user_1', name: 'Alice' },
96
+ * body: 'Great progress!',
97
+ * });
98
+ * ```
99
+ */
100
+ declare class FeedServicePlugin implements Plugin {
101
+ name: string;
102
+ version: string;
103
+ type: string;
104
+ private readonly options;
105
+ constructor(options?: FeedServicePluginOptions);
106
+ init(ctx: PluginContext): Promise<void>;
107
+ }
108
+
109
+ /**
110
+ * XState-inspired State Machine Protocol
111
+ * Used to define strict business logic constraints and lifecycle management.
112
+ * Prevent AI "hallucinations" by enforcing valid valid transitions.
113
+ */
114
+ /**
115
+ * References a named action (side effect)
116
+ * Can be a script, a webhook, or a field update.
117
+ */
118
+ declare const ActionRefSchema: z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
119
+ type: z.ZodString;
120
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
121
+ }, z.core.$strip>]>;
122
+ /**
123
+ * State Transition Definition
124
+ * "When EVENT happens, if GUARD is true, go to TARGET and run ACTIONS"
125
+ */
126
+ declare const TransitionSchema: z.ZodObject<{
127
+ target: z.ZodOptional<z.ZodString>;
128
+ cond: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
129
+ type: z.ZodString;
130
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
131
+ }, z.core.$strip>]>>;
132
+ actions: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
133
+ type: z.ZodString;
134
+ params: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
135
+ }, z.core.$strip>]>>>;
136
+ description: z.ZodOptional<z.ZodString>;
137
+ }, z.core.$strip>;
138
+ type ActionRef = z.infer<typeof ActionRefSchema>;
139
+ type Transition = z.infer<typeof TransitionSchema>;
140
+ type StateNodeConfig = {
141
+ type?: 'atomic' | 'compound' | 'parallel' | 'final' | 'history';
142
+ entry?: ActionRef[];
143
+ exit?: ActionRef[];
144
+ on?: Record<string, string | Transition | Transition[]>;
145
+ always?: Transition[];
146
+ initial?: string;
147
+ states?: Record<string, StateNodeConfig>;
148
+ meta?: {
149
+ label?: string;
150
+ description?: string;
151
+ color?: string;
152
+ aiInstructions?: string;
153
+ };
154
+ };
155
+
156
+ /**
157
+ * Feed Item Object
158
+ *
159
+ * System object for storing feed/chatter items including comments,
160
+ * field changes, tasks, events, and system activities.
161
+ *
162
+ * Belongs to `service-feed` package per "protocol + service ownership" pattern.
163
+ */
164
+ declare const FeedItem: {
165
+ name: string;
166
+ active: boolean;
167
+ isSystem: boolean;
168
+ abstract: boolean;
169
+ datasource: string;
170
+ fields: Record<string, {
171
+ type: "number" | "boolean" | "file" | "email" | "tags" | "date" | "lookup" | "json" | "text" | "textarea" | "url" | "phone" | "password" | "markdown" | "html" | "richtext" | "currency" | "percent" | "datetime" | "time" | "toggle" | "select" | "multiselect" | "radio" | "checkboxes" | "master_detail" | "tree" | "image" | "avatar" | "video" | "audio" | "formula" | "summary" | "autonumber" | "location" | "address" | "code" | "color" | "rating" | "slider" | "signature" | "qrcode" | "progress" | "vector";
172
+ required: boolean;
173
+ searchable: boolean;
174
+ multiple: boolean;
175
+ unique: boolean;
176
+ deleteBehavior: "set_null" | "cascade" | "restrict";
177
+ auditTrail: boolean;
178
+ hidden: boolean;
179
+ readonly: boolean;
180
+ sortable: boolean;
181
+ index: boolean;
182
+ externalId: boolean;
183
+ name?: string | undefined;
184
+ label?: string | undefined;
185
+ description?: string | undefined;
186
+ format?: string | undefined;
187
+ columnName?: string | undefined;
188
+ defaultValue?: unknown;
189
+ maxLength?: number | undefined;
190
+ minLength?: number | undefined;
191
+ precision?: number | undefined;
192
+ scale?: number | undefined;
193
+ min?: number | undefined;
194
+ max?: number | undefined;
195
+ options?: {
196
+ label: string;
197
+ value: string;
198
+ color?: string | undefined;
199
+ default?: boolean | undefined;
200
+ }[] | undefined;
201
+ reference?: string | undefined;
202
+ referenceFilters?: string[] | undefined;
203
+ writeRequiresMasterRead?: boolean | undefined;
204
+ expression?: string | undefined;
205
+ summaryOperations?: {
206
+ object: string;
207
+ field: string;
208
+ function: "count" | "min" | "max" | "sum" | "avg";
209
+ } | undefined;
210
+ language?: string | undefined;
211
+ theme?: string | undefined;
212
+ lineNumbers?: boolean | undefined;
213
+ maxRating?: number | undefined;
214
+ allowHalf?: boolean | undefined;
215
+ displayMap?: boolean | undefined;
216
+ allowGeocoding?: boolean | undefined;
217
+ addressFormat?: "us" | "uk" | "international" | undefined;
218
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
219
+ allowAlpha?: boolean | undefined;
220
+ presetColors?: string[] | undefined;
221
+ step?: number | undefined;
222
+ showValue?: boolean | undefined;
223
+ marks?: Record<string, string> | undefined;
224
+ barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
225
+ qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
226
+ displayValue?: boolean | undefined;
227
+ allowScanning?: boolean | undefined;
228
+ currencyConfig?: {
229
+ precision: number;
230
+ currencyMode: "dynamic" | "fixed";
231
+ defaultCurrency: string;
232
+ } | undefined;
233
+ vectorConfig?: {
234
+ dimensions: number;
235
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
236
+ normalized: boolean;
237
+ indexed: boolean;
238
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
239
+ } | undefined;
240
+ fileAttachmentConfig?: {
241
+ virusScan: boolean;
242
+ virusScanOnUpload: boolean;
243
+ quarantineOnThreat: boolean;
244
+ allowMultiple: boolean;
245
+ allowReplace: boolean;
246
+ allowDelete: boolean;
247
+ requireUpload: boolean;
248
+ extractMetadata: boolean;
249
+ extractText: boolean;
250
+ versioningEnabled: boolean;
251
+ publicRead: boolean;
252
+ presignedUrlExpiry: number;
253
+ minSize?: number | undefined;
254
+ maxSize?: number | undefined;
255
+ allowedTypes?: string[] | undefined;
256
+ blockedTypes?: string[] | undefined;
257
+ allowedMimeTypes?: string[] | undefined;
258
+ blockedMimeTypes?: string[] | undefined;
259
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
260
+ storageProvider?: string | undefined;
261
+ storageBucket?: string | undefined;
262
+ storagePrefix?: string | undefined;
263
+ imageValidation?: {
264
+ generateThumbnails: boolean;
265
+ preserveMetadata: boolean;
266
+ autoRotate: boolean;
267
+ minWidth?: number | undefined;
268
+ maxWidth?: number | undefined;
269
+ minHeight?: number | undefined;
270
+ maxHeight?: number | undefined;
271
+ aspectRatio?: string | undefined;
272
+ thumbnailSizes?: {
273
+ name: string;
274
+ width: number;
275
+ height: number;
276
+ crop: boolean;
277
+ }[] | undefined;
278
+ } | undefined;
279
+ maxVersions?: number | undefined;
280
+ } | undefined;
281
+ encryptionConfig?: {
282
+ enabled: boolean;
283
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
284
+ keyManagement: {
285
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
286
+ keyId?: string | undefined;
287
+ rotationPolicy?: {
288
+ enabled: boolean;
289
+ frequencyDays: number;
290
+ retainOldVersions: number;
291
+ autoRotate: boolean;
292
+ } | undefined;
293
+ };
294
+ scope: "record" | "field" | "table" | "database";
295
+ deterministicEncryption: boolean;
296
+ searchableEncryption: boolean;
297
+ } | undefined;
298
+ maskingRule?: {
299
+ field: string;
300
+ strategy: "redact" | "partial" | "hash" | "tokenize" | "randomize" | "nullify" | "substitute";
301
+ preserveFormat: boolean;
302
+ preserveLength: boolean;
303
+ pattern?: string | undefined;
304
+ roles?: string[] | undefined;
305
+ exemptRoles?: string[] | undefined;
306
+ } | undefined;
307
+ dependencies?: string[] | undefined;
308
+ cached?: {
309
+ enabled: boolean;
310
+ ttl: number;
311
+ invalidateOn: string[];
312
+ } | undefined;
313
+ dataQuality?: {
314
+ uniqueness: boolean;
315
+ completeness: number;
316
+ accuracy?: {
317
+ source: string;
318
+ threshold: number;
319
+ } | undefined;
320
+ } | undefined;
321
+ group?: string | undefined;
322
+ conditionalRequired?: string | undefined;
323
+ inlineHelpText?: string | undefined;
324
+ trackFeedHistory?: boolean | undefined;
325
+ caseSensitive?: boolean | undefined;
326
+ autonumberFormat?: string | undefined;
327
+ }>;
328
+ label?: string | undefined;
329
+ pluralLabel?: string | undefined;
330
+ description?: string | undefined;
331
+ icon?: string | undefined;
332
+ tags?: string[] | undefined;
333
+ tableName?: string | undefined;
334
+ indexes?: {
335
+ fields: string[];
336
+ type: "hash" | "btree" | "gin" | "gist" | "fulltext";
337
+ unique: boolean;
338
+ name?: string | undefined;
339
+ partial?: string | undefined;
340
+ }[] | undefined;
341
+ tenancy?: {
342
+ enabled: boolean;
343
+ strategy: "shared" | "isolated" | "hybrid";
344
+ tenantField: string;
345
+ crossTenantAccess: boolean;
346
+ } | undefined;
347
+ softDelete?: {
348
+ enabled: boolean;
349
+ field: string;
350
+ cascadeDelete: boolean;
351
+ } | undefined;
352
+ versioning?: {
353
+ enabled: boolean;
354
+ strategy: "snapshot" | "delta" | "event-sourcing";
355
+ versionField: string;
356
+ retentionDays?: number | undefined;
357
+ } | undefined;
358
+ partitioning?: {
359
+ enabled: boolean;
360
+ strategy: "hash" | "range" | "list";
361
+ key: string;
362
+ interval?: string | undefined;
363
+ } | undefined;
364
+ cdc?: {
365
+ enabled: boolean;
366
+ events: ("update" | "delete" | "insert")[];
367
+ destination: string;
368
+ } | undefined;
369
+ validations?: _objectstack_spec_data.BaseValidationRuleShape[] | undefined;
370
+ stateMachines?: Record<string, {
371
+ id: string;
372
+ initial: string;
373
+ states: Record<string, StateNodeConfig>;
374
+ description?: string | undefined;
375
+ contextSchema?: Record<string, unknown> | undefined;
376
+ on?: Record<string, string | {
377
+ target?: string | undefined;
378
+ cond?: string | {
379
+ type: string;
380
+ params?: Record<string, unknown> | undefined;
381
+ } | undefined;
382
+ actions?: (string | {
383
+ type: string;
384
+ params?: Record<string, unknown> | undefined;
385
+ })[] | undefined;
386
+ description?: string | undefined;
387
+ } | {
388
+ target?: string | undefined;
389
+ cond?: string | {
390
+ type: string;
391
+ params?: Record<string, unknown> | undefined;
392
+ } | undefined;
393
+ actions?: (string | {
394
+ type: string;
395
+ params?: Record<string, unknown> | undefined;
396
+ })[] | undefined;
397
+ description?: string | undefined;
398
+ }[]> | undefined;
399
+ }> | undefined;
400
+ displayNameField?: string | undefined;
401
+ recordName?: {
402
+ type: "text" | "autonumber";
403
+ displayFormat?: string | undefined;
404
+ startNumber?: number | undefined;
405
+ } | undefined;
406
+ titleFormat?: string | undefined;
407
+ compactLayout?: string[] | undefined;
408
+ search?: {
409
+ fields: string[];
410
+ displayFields?: string[] | undefined;
411
+ filters?: string[] | undefined;
412
+ } | undefined;
413
+ enable?: {
414
+ trackHistory: boolean;
415
+ searchable: boolean;
416
+ apiEnabled: boolean;
417
+ files: boolean;
418
+ feeds: boolean;
419
+ activities: boolean;
420
+ trash: boolean;
421
+ mru: boolean;
422
+ clone: boolean;
423
+ apiMethods?: ("search" | "list" | "update" | "delete" | "upsert" | "history" | "get" | "create" | "bulk" | "aggregate" | "restore" | "purge" | "import" | "export")[] | undefined;
424
+ } | undefined;
425
+ recordTypes?: string[] | undefined;
426
+ sharingModel?: "private" | "full" | "read" | "read_write" | undefined;
427
+ keyPrefix?: string | undefined;
428
+ };
429
+
430
+ /**
431
+ * Feed Reaction Object
432
+ *
433
+ * System object for storing individual emoji reactions on feed items.
434
+ * Each row represents one user's reaction on one feed item.
435
+ *
436
+ * Belongs to `service-feed` package per "protocol + service ownership" pattern.
437
+ */
438
+ declare const FeedReaction: {
439
+ name: string;
440
+ active: boolean;
441
+ isSystem: boolean;
442
+ abstract: boolean;
443
+ datasource: string;
444
+ fields: Record<string, {
445
+ type: "number" | "boolean" | "file" | "email" | "tags" | "date" | "lookup" | "json" | "text" | "textarea" | "url" | "phone" | "password" | "markdown" | "html" | "richtext" | "currency" | "percent" | "datetime" | "time" | "toggle" | "select" | "multiselect" | "radio" | "checkboxes" | "master_detail" | "tree" | "image" | "avatar" | "video" | "audio" | "formula" | "summary" | "autonumber" | "location" | "address" | "code" | "color" | "rating" | "slider" | "signature" | "qrcode" | "progress" | "vector";
446
+ required: boolean;
447
+ searchable: boolean;
448
+ multiple: boolean;
449
+ unique: boolean;
450
+ deleteBehavior: "set_null" | "cascade" | "restrict";
451
+ auditTrail: boolean;
452
+ hidden: boolean;
453
+ readonly: boolean;
454
+ sortable: boolean;
455
+ index: boolean;
456
+ externalId: boolean;
457
+ name?: string | undefined;
458
+ label?: string | undefined;
459
+ description?: string | undefined;
460
+ format?: string | undefined;
461
+ columnName?: string | undefined;
462
+ defaultValue?: unknown;
463
+ maxLength?: number | undefined;
464
+ minLength?: number | undefined;
465
+ precision?: number | undefined;
466
+ scale?: number | undefined;
467
+ min?: number | undefined;
468
+ max?: number | undefined;
469
+ options?: {
470
+ label: string;
471
+ value: string;
472
+ color?: string | undefined;
473
+ default?: boolean | undefined;
474
+ }[] | undefined;
475
+ reference?: string | undefined;
476
+ referenceFilters?: string[] | undefined;
477
+ writeRequiresMasterRead?: boolean | undefined;
478
+ expression?: string | undefined;
479
+ summaryOperations?: {
480
+ object: string;
481
+ field: string;
482
+ function: "count" | "min" | "max" | "sum" | "avg";
483
+ } | undefined;
484
+ language?: string | undefined;
485
+ theme?: string | undefined;
486
+ lineNumbers?: boolean | undefined;
487
+ maxRating?: number | undefined;
488
+ allowHalf?: boolean | undefined;
489
+ displayMap?: boolean | undefined;
490
+ allowGeocoding?: boolean | undefined;
491
+ addressFormat?: "us" | "uk" | "international" | undefined;
492
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
493
+ allowAlpha?: boolean | undefined;
494
+ presetColors?: string[] | undefined;
495
+ step?: number | undefined;
496
+ showValue?: boolean | undefined;
497
+ marks?: Record<string, string> | undefined;
498
+ barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
499
+ qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
500
+ displayValue?: boolean | undefined;
501
+ allowScanning?: boolean | undefined;
502
+ currencyConfig?: {
503
+ precision: number;
504
+ currencyMode: "dynamic" | "fixed";
505
+ defaultCurrency: string;
506
+ } | undefined;
507
+ vectorConfig?: {
508
+ dimensions: number;
509
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
510
+ normalized: boolean;
511
+ indexed: boolean;
512
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
513
+ } | undefined;
514
+ fileAttachmentConfig?: {
515
+ virusScan: boolean;
516
+ virusScanOnUpload: boolean;
517
+ quarantineOnThreat: boolean;
518
+ allowMultiple: boolean;
519
+ allowReplace: boolean;
520
+ allowDelete: boolean;
521
+ requireUpload: boolean;
522
+ extractMetadata: boolean;
523
+ extractText: boolean;
524
+ versioningEnabled: boolean;
525
+ publicRead: boolean;
526
+ presignedUrlExpiry: number;
527
+ minSize?: number | undefined;
528
+ maxSize?: number | undefined;
529
+ allowedTypes?: string[] | undefined;
530
+ blockedTypes?: string[] | undefined;
531
+ allowedMimeTypes?: string[] | undefined;
532
+ blockedMimeTypes?: string[] | undefined;
533
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
534
+ storageProvider?: string | undefined;
535
+ storageBucket?: string | undefined;
536
+ storagePrefix?: string | undefined;
537
+ imageValidation?: {
538
+ generateThumbnails: boolean;
539
+ preserveMetadata: boolean;
540
+ autoRotate: boolean;
541
+ minWidth?: number | undefined;
542
+ maxWidth?: number | undefined;
543
+ minHeight?: number | undefined;
544
+ maxHeight?: number | undefined;
545
+ aspectRatio?: string | undefined;
546
+ thumbnailSizes?: {
547
+ name: string;
548
+ width: number;
549
+ height: number;
550
+ crop: boolean;
551
+ }[] | undefined;
552
+ } | undefined;
553
+ maxVersions?: number | undefined;
554
+ } | undefined;
555
+ encryptionConfig?: {
556
+ enabled: boolean;
557
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
558
+ keyManagement: {
559
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
560
+ keyId?: string | undefined;
561
+ rotationPolicy?: {
562
+ enabled: boolean;
563
+ frequencyDays: number;
564
+ retainOldVersions: number;
565
+ autoRotate: boolean;
566
+ } | undefined;
567
+ };
568
+ scope: "record" | "field" | "table" | "database";
569
+ deterministicEncryption: boolean;
570
+ searchableEncryption: boolean;
571
+ } | undefined;
572
+ maskingRule?: {
573
+ field: string;
574
+ strategy: "redact" | "partial" | "hash" | "tokenize" | "randomize" | "nullify" | "substitute";
575
+ preserveFormat: boolean;
576
+ preserveLength: boolean;
577
+ pattern?: string | undefined;
578
+ roles?: string[] | undefined;
579
+ exemptRoles?: string[] | undefined;
580
+ } | undefined;
581
+ dependencies?: string[] | undefined;
582
+ cached?: {
583
+ enabled: boolean;
584
+ ttl: number;
585
+ invalidateOn: string[];
586
+ } | undefined;
587
+ dataQuality?: {
588
+ uniqueness: boolean;
589
+ completeness: number;
590
+ accuracy?: {
591
+ source: string;
592
+ threshold: number;
593
+ } | undefined;
594
+ } | undefined;
595
+ group?: string | undefined;
596
+ conditionalRequired?: string | undefined;
597
+ inlineHelpText?: string | undefined;
598
+ trackFeedHistory?: boolean | undefined;
599
+ caseSensitive?: boolean | undefined;
600
+ autonumberFormat?: string | undefined;
601
+ }>;
602
+ label?: string | undefined;
603
+ pluralLabel?: string | undefined;
604
+ description?: string | undefined;
605
+ icon?: string | undefined;
606
+ tags?: string[] | undefined;
607
+ tableName?: string | undefined;
608
+ indexes?: {
609
+ fields: string[];
610
+ type: "hash" | "btree" | "gin" | "gist" | "fulltext";
611
+ unique: boolean;
612
+ name?: string | undefined;
613
+ partial?: string | undefined;
614
+ }[] | undefined;
615
+ tenancy?: {
616
+ enabled: boolean;
617
+ strategy: "shared" | "isolated" | "hybrid";
618
+ tenantField: string;
619
+ crossTenantAccess: boolean;
620
+ } | undefined;
621
+ softDelete?: {
622
+ enabled: boolean;
623
+ field: string;
624
+ cascadeDelete: boolean;
625
+ } | undefined;
626
+ versioning?: {
627
+ enabled: boolean;
628
+ strategy: "snapshot" | "delta" | "event-sourcing";
629
+ versionField: string;
630
+ retentionDays?: number | undefined;
631
+ } | undefined;
632
+ partitioning?: {
633
+ enabled: boolean;
634
+ strategy: "hash" | "range" | "list";
635
+ key: string;
636
+ interval?: string | undefined;
637
+ } | undefined;
638
+ cdc?: {
639
+ enabled: boolean;
640
+ events: ("update" | "delete" | "insert")[];
641
+ destination: string;
642
+ } | undefined;
643
+ validations?: _objectstack_spec_data.BaseValidationRuleShape[] | undefined;
644
+ stateMachines?: Record<string, {
645
+ id: string;
646
+ initial: string;
647
+ states: Record<string, StateNodeConfig>;
648
+ description?: string | undefined;
649
+ contextSchema?: Record<string, unknown> | undefined;
650
+ on?: Record<string, string | {
651
+ target?: string | undefined;
652
+ cond?: string | {
653
+ type: string;
654
+ params?: Record<string, unknown> | undefined;
655
+ } | undefined;
656
+ actions?: (string | {
657
+ type: string;
658
+ params?: Record<string, unknown> | undefined;
659
+ })[] | undefined;
660
+ description?: string | undefined;
661
+ } | {
662
+ target?: string | undefined;
663
+ cond?: string | {
664
+ type: string;
665
+ params?: Record<string, unknown> | undefined;
666
+ } | undefined;
667
+ actions?: (string | {
668
+ type: string;
669
+ params?: Record<string, unknown> | undefined;
670
+ })[] | undefined;
671
+ description?: string | undefined;
672
+ }[]> | undefined;
673
+ }> | undefined;
674
+ displayNameField?: string | undefined;
675
+ recordName?: {
676
+ type: "text" | "autonumber";
677
+ displayFormat?: string | undefined;
678
+ startNumber?: number | undefined;
679
+ } | undefined;
680
+ titleFormat?: string | undefined;
681
+ compactLayout?: string[] | undefined;
682
+ search?: {
683
+ fields: string[];
684
+ displayFields?: string[] | undefined;
685
+ filters?: string[] | undefined;
686
+ } | undefined;
687
+ enable?: {
688
+ trackHistory: boolean;
689
+ searchable: boolean;
690
+ apiEnabled: boolean;
691
+ files: boolean;
692
+ feeds: boolean;
693
+ activities: boolean;
694
+ trash: boolean;
695
+ mru: boolean;
696
+ clone: boolean;
697
+ apiMethods?: ("search" | "list" | "update" | "delete" | "upsert" | "history" | "get" | "create" | "bulk" | "aggregate" | "restore" | "purge" | "import" | "export")[] | undefined;
698
+ } | undefined;
699
+ recordTypes?: string[] | undefined;
700
+ sharingModel?: "private" | "full" | "read" | "read_write" | undefined;
701
+ keyPrefix?: string | undefined;
702
+ };
703
+
704
+ /**
705
+ * Record Subscription Object
706
+ *
707
+ * System object for storing record-level notification subscriptions.
708
+ * Enables Airtable-style bell icon for record change notifications.
709
+ *
710
+ * Belongs to `service-feed` package per "protocol + service ownership" pattern.
711
+ */
712
+ declare const RecordSubscription: {
713
+ name: string;
714
+ active: boolean;
715
+ isSystem: boolean;
716
+ abstract: boolean;
717
+ datasource: string;
718
+ fields: Record<string, {
719
+ type: "number" | "boolean" | "file" | "email" | "tags" | "date" | "lookup" | "json" | "text" | "textarea" | "url" | "phone" | "password" | "markdown" | "html" | "richtext" | "currency" | "percent" | "datetime" | "time" | "toggle" | "select" | "multiselect" | "radio" | "checkboxes" | "master_detail" | "tree" | "image" | "avatar" | "video" | "audio" | "formula" | "summary" | "autonumber" | "location" | "address" | "code" | "color" | "rating" | "slider" | "signature" | "qrcode" | "progress" | "vector";
720
+ required: boolean;
721
+ searchable: boolean;
722
+ multiple: boolean;
723
+ unique: boolean;
724
+ deleteBehavior: "set_null" | "cascade" | "restrict";
725
+ auditTrail: boolean;
726
+ hidden: boolean;
727
+ readonly: boolean;
728
+ sortable: boolean;
729
+ index: boolean;
730
+ externalId: boolean;
731
+ name?: string | undefined;
732
+ label?: string | undefined;
733
+ description?: string | undefined;
734
+ format?: string | undefined;
735
+ columnName?: string | undefined;
736
+ defaultValue?: unknown;
737
+ maxLength?: number | undefined;
738
+ minLength?: number | undefined;
739
+ precision?: number | undefined;
740
+ scale?: number | undefined;
741
+ min?: number | undefined;
742
+ max?: number | undefined;
743
+ options?: {
744
+ label: string;
745
+ value: string;
746
+ color?: string | undefined;
747
+ default?: boolean | undefined;
748
+ }[] | undefined;
749
+ reference?: string | undefined;
750
+ referenceFilters?: string[] | undefined;
751
+ writeRequiresMasterRead?: boolean | undefined;
752
+ expression?: string | undefined;
753
+ summaryOperations?: {
754
+ object: string;
755
+ field: string;
756
+ function: "count" | "min" | "max" | "sum" | "avg";
757
+ } | undefined;
758
+ language?: string | undefined;
759
+ theme?: string | undefined;
760
+ lineNumbers?: boolean | undefined;
761
+ maxRating?: number | undefined;
762
+ allowHalf?: boolean | undefined;
763
+ displayMap?: boolean | undefined;
764
+ allowGeocoding?: boolean | undefined;
765
+ addressFormat?: "us" | "uk" | "international" | undefined;
766
+ colorFormat?: "hex" | "rgb" | "rgba" | "hsl" | undefined;
767
+ allowAlpha?: boolean | undefined;
768
+ presetColors?: string[] | undefined;
769
+ step?: number | undefined;
770
+ showValue?: boolean | undefined;
771
+ marks?: Record<string, string> | undefined;
772
+ barcodeFormat?: "qr" | "ean13" | "ean8" | "code128" | "code39" | "upca" | "upce" | undefined;
773
+ qrErrorCorrection?: "L" | "M" | "Q" | "H" | undefined;
774
+ displayValue?: boolean | undefined;
775
+ allowScanning?: boolean | undefined;
776
+ currencyConfig?: {
777
+ precision: number;
778
+ currencyMode: "dynamic" | "fixed";
779
+ defaultCurrency: string;
780
+ } | undefined;
781
+ vectorConfig?: {
782
+ dimensions: number;
783
+ distanceMetric: "cosine" | "euclidean" | "dotProduct" | "manhattan";
784
+ normalized: boolean;
785
+ indexed: boolean;
786
+ indexType?: "flat" | "hnsw" | "ivfflat" | undefined;
787
+ } | undefined;
788
+ fileAttachmentConfig?: {
789
+ virusScan: boolean;
790
+ virusScanOnUpload: boolean;
791
+ quarantineOnThreat: boolean;
792
+ allowMultiple: boolean;
793
+ allowReplace: boolean;
794
+ allowDelete: boolean;
795
+ requireUpload: boolean;
796
+ extractMetadata: boolean;
797
+ extractText: boolean;
798
+ versioningEnabled: boolean;
799
+ publicRead: boolean;
800
+ presignedUrlExpiry: number;
801
+ minSize?: number | undefined;
802
+ maxSize?: number | undefined;
803
+ allowedTypes?: string[] | undefined;
804
+ blockedTypes?: string[] | undefined;
805
+ allowedMimeTypes?: string[] | undefined;
806
+ blockedMimeTypes?: string[] | undefined;
807
+ virusScanProvider?: "custom" | "clamav" | "virustotal" | "metadefender" | undefined;
808
+ storageProvider?: string | undefined;
809
+ storageBucket?: string | undefined;
810
+ storagePrefix?: string | undefined;
811
+ imageValidation?: {
812
+ generateThumbnails: boolean;
813
+ preserveMetadata: boolean;
814
+ autoRotate: boolean;
815
+ minWidth?: number | undefined;
816
+ maxWidth?: number | undefined;
817
+ minHeight?: number | undefined;
818
+ maxHeight?: number | undefined;
819
+ aspectRatio?: string | undefined;
820
+ thumbnailSizes?: {
821
+ name: string;
822
+ width: number;
823
+ height: number;
824
+ crop: boolean;
825
+ }[] | undefined;
826
+ } | undefined;
827
+ maxVersions?: number | undefined;
828
+ } | undefined;
829
+ encryptionConfig?: {
830
+ enabled: boolean;
831
+ algorithm: "aes-256-gcm" | "aes-256-cbc" | "chacha20-poly1305";
832
+ keyManagement: {
833
+ provider: "local" | "aws-kms" | "azure-key-vault" | "gcp-kms" | "hashicorp-vault";
834
+ keyId?: string | undefined;
835
+ rotationPolicy?: {
836
+ enabled: boolean;
837
+ frequencyDays: number;
838
+ retainOldVersions: number;
839
+ autoRotate: boolean;
840
+ } | undefined;
841
+ };
842
+ scope: "record" | "field" | "table" | "database";
843
+ deterministicEncryption: boolean;
844
+ searchableEncryption: boolean;
845
+ } | undefined;
846
+ maskingRule?: {
847
+ field: string;
848
+ strategy: "redact" | "partial" | "hash" | "tokenize" | "randomize" | "nullify" | "substitute";
849
+ preserveFormat: boolean;
850
+ preserveLength: boolean;
851
+ pattern?: string | undefined;
852
+ roles?: string[] | undefined;
853
+ exemptRoles?: string[] | undefined;
854
+ } | undefined;
855
+ dependencies?: string[] | undefined;
856
+ cached?: {
857
+ enabled: boolean;
858
+ ttl: number;
859
+ invalidateOn: string[];
860
+ } | undefined;
861
+ dataQuality?: {
862
+ uniqueness: boolean;
863
+ completeness: number;
864
+ accuracy?: {
865
+ source: string;
866
+ threshold: number;
867
+ } | undefined;
868
+ } | undefined;
869
+ group?: string | undefined;
870
+ conditionalRequired?: string | undefined;
871
+ inlineHelpText?: string | undefined;
872
+ trackFeedHistory?: boolean | undefined;
873
+ caseSensitive?: boolean | undefined;
874
+ autonumberFormat?: string | undefined;
875
+ }>;
876
+ label?: string | undefined;
877
+ pluralLabel?: string | undefined;
878
+ description?: string | undefined;
879
+ icon?: string | undefined;
880
+ tags?: string[] | undefined;
881
+ tableName?: string | undefined;
882
+ indexes?: {
883
+ fields: string[];
884
+ type: "hash" | "btree" | "gin" | "gist" | "fulltext";
885
+ unique: boolean;
886
+ name?: string | undefined;
887
+ partial?: string | undefined;
888
+ }[] | undefined;
889
+ tenancy?: {
890
+ enabled: boolean;
891
+ strategy: "shared" | "isolated" | "hybrid";
892
+ tenantField: string;
893
+ crossTenantAccess: boolean;
894
+ } | undefined;
895
+ softDelete?: {
896
+ enabled: boolean;
897
+ field: string;
898
+ cascadeDelete: boolean;
899
+ } | undefined;
900
+ versioning?: {
901
+ enabled: boolean;
902
+ strategy: "snapshot" | "delta" | "event-sourcing";
903
+ versionField: string;
904
+ retentionDays?: number | undefined;
905
+ } | undefined;
906
+ partitioning?: {
907
+ enabled: boolean;
908
+ strategy: "hash" | "range" | "list";
909
+ key: string;
910
+ interval?: string | undefined;
911
+ } | undefined;
912
+ cdc?: {
913
+ enabled: boolean;
914
+ events: ("update" | "delete" | "insert")[];
915
+ destination: string;
916
+ } | undefined;
917
+ validations?: _objectstack_spec_data.BaseValidationRuleShape[] | undefined;
918
+ stateMachines?: Record<string, {
919
+ id: string;
920
+ initial: string;
921
+ states: Record<string, StateNodeConfig>;
922
+ description?: string | undefined;
923
+ contextSchema?: Record<string, unknown> | undefined;
924
+ on?: Record<string, string | {
925
+ target?: string | undefined;
926
+ cond?: string | {
927
+ type: string;
928
+ params?: Record<string, unknown> | undefined;
929
+ } | undefined;
930
+ actions?: (string | {
931
+ type: string;
932
+ params?: Record<string, unknown> | undefined;
933
+ })[] | undefined;
934
+ description?: string | undefined;
935
+ } | {
936
+ target?: string | undefined;
937
+ cond?: string | {
938
+ type: string;
939
+ params?: Record<string, unknown> | undefined;
940
+ } | undefined;
941
+ actions?: (string | {
942
+ type: string;
943
+ params?: Record<string, unknown> | undefined;
944
+ })[] | undefined;
945
+ description?: string | undefined;
946
+ }[]> | undefined;
947
+ }> | undefined;
948
+ displayNameField?: string | undefined;
949
+ recordName?: {
950
+ type: "text" | "autonumber";
951
+ displayFormat?: string | undefined;
952
+ startNumber?: number | undefined;
953
+ } | undefined;
954
+ titleFormat?: string | undefined;
955
+ compactLayout?: string[] | undefined;
956
+ search?: {
957
+ fields: string[];
958
+ displayFields?: string[] | undefined;
959
+ filters?: string[] | undefined;
960
+ } | undefined;
961
+ enable?: {
962
+ trackHistory: boolean;
963
+ searchable: boolean;
964
+ apiEnabled: boolean;
965
+ files: boolean;
966
+ feeds: boolean;
967
+ activities: boolean;
968
+ trash: boolean;
969
+ mru: boolean;
970
+ clone: boolean;
971
+ apiMethods?: ("search" | "list" | "update" | "delete" | "upsert" | "history" | "get" | "create" | "bulk" | "aggregate" | "restore" | "purge" | "import" | "export")[] | undefined;
972
+ } | undefined;
973
+ recordTypes?: string[] | undefined;
974
+ sharingModel?: "private" | "full" | "read" | "read_write" | undefined;
975
+ keyPrefix?: string | undefined;
976
+ };
977
+
978
+ export { FeedItem, FeedReaction, FeedServicePlugin, type FeedServicePluginOptions, InMemoryFeedAdapter, type InMemoryFeedAdapterOptions, RecordSubscription };