@happyvertical/smrt-features 0.30.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.
@@ -0,0 +1,508 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-06-23T01:12:10.606Z",
4
+ "packageName": "@happyvertical/smrt-features",
5
+ "packageVersion": "0.30.0",
6
+ "sourceManifestPath": "dist/manifest.json",
7
+ "agentDocPath": "AGENTS.md",
8
+ "sourceHashes": {
9
+ "manifest": "f4ae19083ae124fcd80c3f8e7f238d415cc8281a167986dcfa59d6aa0acf2b85",
10
+ "packageJson": "54365c3296057ee73082a0896692f25621dc9cdc8af85a03e6c23d96a0e72cd6",
11
+ "agents": "0d14be2150e562d6834a67a6fd2a5d8bf63a1654e1f5a5165d1c97c2057574a8"
12
+ },
13
+ "exports": [
14
+ ".",
15
+ "./manifest",
16
+ "./manifest.json"
17
+ ],
18
+ "dependencies": {
19
+ "@happyvertical/smrt-core": "workspace:*",
20
+ "@happyvertical/smrt-cli": "workspace:*",
21
+ "@happyvertical/smrt-users": "workspace:*",
22
+ "@happyvertical/smrt-vitest": "workspace:*",
23
+ "@types/node": "25.0.9",
24
+ "typescript": "^5.9.3",
25
+ "vite": "^7.3.1",
26
+ "vitest": "^4.0.17"
27
+ },
28
+ "smrtDependencies": [
29
+ "@happyvertical/smrt-cli",
30
+ "@happyvertical/smrt-core",
31
+ "@happyvertical/smrt-users",
32
+ "@happyvertical/smrt-vitest"
33
+ ],
34
+ "sdkDependencies": [],
35
+ "tags": [],
36
+ "risks": [],
37
+ "objects": [
38
+ {
39
+ "name": "FeatureDefinition",
40
+ "qualifiedName": "@happyvertical/smrt-features:FeatureDefinition",
41
+ "collection": "featuredefinitions",
42
+ "tableName": "_smrt_feature_definitions",
43
+ "packageName": "@happyvertical/smrt-features",
44
+ "extends": "SmrtObject",
45
+ "fields": [
46
+ {
47
+ "name": "featureKey",
48
+ "type": "text",
49
+ "required": false,
50
+ "columnType": "TEXT"
51
+ },
52
+ {
53
+ "name": "packageName",
54
+ "type": "text",
55
+ "required": false,
56
+ "columnType": "TEXT"
57
+ },
58
+ {
59
+ "name": "qualifiedClassName",
60
+ "type": "text",
61
+ "required": false,
62
+ "columnType": "TEXT"
63
+ },
64
+ {
65
+ "name": "className",
66
+ "type": "text",
67
+ "required": false,
68
+ "columnType": "TEXT"
69
+ },
70
+ {
71
+ "name": "localId",
72
+ "type": "text",
73
+ "required": false,
74
+ "columnType": "TEXT"
75
+ },
76
+ {
77
+ "name": "defaultEnabled",
78
+ "type": "boolean",
79
+ "required": false,
80
+ "columnType": "BOOLEAN"
81
+ },
82
+ {
83
+ "name": "label",
84
+ "type": "text",
85
+ "required": false,
86
+ "columnType": "TEXT"
87
+ },
88
+ {
89
+ "name": "description",
90
+ "type": "text",
91
+ "required": false,
92
+ "columnType": "TEXT"
93
+ },
94
+ {
95
+ "name": "metadata",
96
+ "type": "text",
97
+ "required": false,
98
+ "columnType": "TEXT"
99
+ },
100
+ {
101
+ "name": "visibility",
102
+ "type": "text",
103
+ "required": false,
104
+ "columnType": "TEXT"
105
+ }
106
+ ],
107
+ "relationships": [],
108
+ "methods": [
109
+ "getMetadata",
110
+ "setMetadata"
111
+ ],
112
+ "surfaces": [
113
+ {
114
+ "kind": "api",
115
+ "name": "featuredefinitions.list",
116
+ "operation": "list",
117
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition",
118
+ "path": "/featuredefinitions",
119
+ "method": "GET"
120
+ },
121
+ {
122
+ "kind": "api",
123
+ "name": "featuredefinitions.get",
124
+ "operation": "get",
125
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition",
126
+ "path": "/featuredefinitions/[id]",
127
+ "method": "GET"
128
+ },
129
+ {
130
+ "kind": "cli",
131
+ "name": "featuredefinition_list",
132
+ "operation": "list",
133
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
134
+ },
135
+ {
136
+ "kind": "cli",
137
+ "name": "featuredefinition_get",
138
+ "operation": "get",
139
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
140
+ },
141
+ {
142
+ "kind": "mcp",
143
+ "name": "featuredefinition_list",
144
+ "operation": "list",
145
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
146
+ },
147
+ {
148
+ "kind": "mcp",
149
+ "name": "featuredefinition_get",
150
+ "operation": "get",
151
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
152
+ }
153
+ ],
154
+ "relationshipFeatures": [
155
+ "uuidColumns"
156
+ ],
157
+ "tags": [],
158
+ "risks": []
159
+ },
160
+ {
161
+ "name": "FeatureDefinitionCollection",
162
+ "qualifiedName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
163
+ "collection": "featuredefinitions",
164
+ "tableName": "_smrt_feature_definitions",
165
+ "packageName": "@happyvertical/smrt-features",
166
+ "extends": "SmrtCollection",
167
+ "fields": [],
168
+ "relationships": [],
169
+ "methods": [
170
+ "findByFeatureKey",
171
+ "findByPackageName",
172
+ "upsertDefinition"
173
+ ],
174
+ "surfaces": [],
175
+ "relationshipFeatures": [
176
+ "uuidColumns"
177
+ ],
178
+ "tags": [],
179
+ "risks": []
180
+ },
181
+ {
182
+ "name": "FeatureOverride",
183
+ "qualifiedName": "@happyvertical/smrt-features:FeatureOverride",
184
+ "collection": "featureoverrides",
185
+ "tableName": "_smrt_feature_overrides",
186
+ "packageName": "@happyvertical/smrt-features",
187
+ "extends": "SmrtObject",
188
+ "fields": [
189
+ {
190
+ "name": "featureKey",
191
+ "type": "text",
192
+ "required": false,
193
+ "columnType": "TEXT"
194
+ },
195
+ {
196
+ "name": "scopeType",
197
+ "type": "text",
198
+ "required": false,
199
+ "columnType": "TEXT"
200
+ },
201
+ {
202
+ "name": "scopeId",
203
+ "type": "text",
204
+ "required": false,
205
+ "columnType": "TEXT"
206
+ },
207
+ {
208
+ "name": "effect",
209
+ "type": "text",
210
+ "required": false,
211
+ "columnType": "TEXT"
212
+ }
213
+ ],
214
+ "relationships": [],
215
+ "methods": [
216
+ "isDisabled",
217
+ "isEnabled",
218
+ "isInherit"
219
+ ],
220
+ "surfaces": [
221
+ {
222
+ "kind": "api",
223
+ "name": "featureoverrides.list",
224
+ "operation": "list",
225
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
226
+ "path": "/featureoverrides",
227
+ "method": "GET"
228
+ },
229
+ {
230
+ "kind": "api",
231
+ "name": "featureoverrides.get",
232
+ "operation": "get",
233
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
234
+ "path": "/featureoverrides/[id]",
235
+ "method": "GET"
236
+ },
237
+ {
238
+ "kind": "api",
239
+ "name": "featureoverrides.create",
240
+ "operation": "create",
241
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
242
+ "path": "/featureoverrides",
243
+ "method": "POST"
244
+ },
245
+ {
246
+ "kind": "api",
247
+ "name": "featureoverrides.update",
248
+ "operation": "update",
249
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
250
+ "path": "/featureoverrides/[id]",
251
+ "method": "PATCH"
252
+ },
253
+ {
254
+ "kind": "api",
255
+ "name": "featureoverrides.delete",
256
+ "operation": "delete",
257
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
258
+ "path": "/featureoverrides/[id]",
259
+ "method": "DELETE"
260
+ },
261
+ {
262
+ "kind": "cli",
263
+ "name": "featureoverride_list",
264
+ "operation": "list",
265
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
266
+ },
267
+ {
268
+ "kind": "cli",
269
+ "name": "featureoverride_get",
270
+ "operation": "get",
271
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
272
+ },
273
+ {
274
+ "kind": "cli",
275
+ "name": "featureoverride_create",
276
+ "operation": "create",
277
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
278
+ },
279
+ {
280
+ "kind": "cli",
281
+ "name": "featureoverride_update",
282
+ "operation": "update",
283
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
284
+ },
285
+ {
286
+ "kind": "cli",
287
+ "name": "featureoverride_delete",
288
+ "operation": "delete",
289
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
290
+ },
291
+ {
292
+ "kind": "mcp",
293
+ "name": "featureoverride_list",
294
+ "operation": "list",
295
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
296
+ },
297
+ {
298
+ "kind": "mcp",
299
+ "name": "featureoverride_get",
300
+ "operation": "get",
301
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
302
+ },
303
+ {
304
+ "kind": "mcp",
305
+ "name": "featureoverride_create",
306
+ "operation": "create",
307
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
308
+ },
309
+ {
310
+ "kind": "mcp",
311
+ "name": "featureoverride_update",
312
+ "operation": "update",
313
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
314
+ },
315
+ {
316
+ "kind": "mcp",
317
+ "name": "featureoverride_delete",
318
+ "operation": "delete",
319
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
320
+ }
321
+ ],
322
+ "relationshipFeatures": [
323
+ "uuidColumns"
324
+ ],
325
+ "tags": [],
326
+ "risks": []
327
+ },
328
+ {
329
+ "name": "FeatureOverrideCollection",
330
+ "qualifiedName": "@happyvertical/smrt-features:FeatureOverrideCollection",
331
+ "collection": "featureoverrides",
332
+ "tableName": "_smrt_feature_overrides",
333
+ "packageName": "@happyvertical/smrt-features",
334
+ "extends": "SmrtCollection",
335
+ "fields": [],
336
+ "relationships": [],
337
+ "methods": [
338
+ "findByFeatureAndScope",
339
+ "findByFeatureKey",
340
+ "getGlobalOverride",
341
+ "getOverrideMap",
342
+ "getTenantOverride",
343
+ "removeOverride",
344
+ "setGlobalOverride",
345
+ "setOverride",
346
+ "setTenantOverride"
347
+ ],
348
+ "surfaces": [],
349
+ "relationshipFeatures": [
350
+ "uuidColumns"
351
+ ],
352
+ "tags": [],
353
+ "risks": []
354
+ }
355
+ ],
356
+ "surfaces": [
357
+ {
358
+ "kind": "api",
359
+ "name": "featuredefinitions.list",
360
+ "operation": "list",
361
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition",
362
+ "path": "/featuredefinitions",
363
+ "method": "GET"
364
+ },
365
+ {
366
+ "kind": "api",
367
+ "name": "featuredefinitions.get",
368
+ "operation": "get",
369
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition",
370
+ "path": "/featuredefinitions/[id]",
371
+ "method": "GET"
372
+ },
373
+ {
374
+ "kind": "cli",
375
+ "name": "featuredefinition_list",
376
+ "operation": "list",
377
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
378
+ },
379
+ {
380
+ "kind": "cli",
381
+ "name": "featuredefinition_get",
382
+ "operation": "get",
383
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
384
+ },
385
+ {
386
+ "kind": "mcp",
387
+ "name": "featuredefinition_list",
388
+ "operation": "list",
389
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
390
+ },
391
+ {
392
+ "kind": "mcp",
393
+ "name": "featuredefinition_get",
394
+ "operation": "get",
395
+ "objectName": "@happyvertical/smrt-features:FeatureDefinition"
396
+ },
397
+ {
398
+ "kind": "api",
399
+ "name": "featureoverrides.list",
400
+ "operation": "list",
401
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
402
+ "path": "/featureoverrides",
403
+ "method": "GET"
404
+ },
405
+ {
406
+ "kind": "api",
407
+ "name": "featureoverrides.get",
408
+ "operation": "get",
409
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
410
+ "path": "/featureoverrides/[id]",
411
+ "method": "GET"
412
+ },
413
+ {
414
+ "kind": "api",
415
+ "name": "featureoverrides.create",
416
+ "operation": "create",
417
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
418
+ "path": "/featureoverrides",
419
+ "method": "POST"
420
+ },
421
+ {
422
+ "kind": "api",
423
+ "name": "featureoverrides.update",
424
+ "operation": "update",
425
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
426
+ "path": "/featureoverrides/[id]",
427
+ "method": "PATCH"
428
+ },
429
+ {
430
+ "kind": "api",
431
+ "name": "featureoverrides.delete",
432
+ "operation": "delete",
433
+ "objectName": "@happyvertical/smrt-features:FeatureOverride",
434
+ "path": "/featureoverrides/[id]",
435
+ "method": "DELETE"
436
+ },
437
+ {
438
+ "kind": "cli",
439
+ "name": "featureoverride_list",
440
+ "operation": "list",
441
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
442
+ },
443
+ {
444
+ "kind": "cli",
445
+ "name": "featureoverride_get",
446
+ "operation": "get",
447
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
448
+ },
449
+ {
450
+ "kind": "cli",
451
+ "name": "featureoverride_create",
452
+ "operation": "create",
453
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
454
+ },
455
+ {
456
+ "kind": "cli",
457
+ "name": "featureoverride_update",
458
+ "operation": "update",
459
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
460
+ },
461
+ {
462
+ "kind": "cli",
463
+ "name": "featureoverride_delete",
464
+ "operation": "delete",
465
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
466
+ },
467
+ {
468
+ "kind": "mcp",
469
+ "name": "featureoverride_list",
470
+ "operation": "list",
471
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
472
+ },
473
+ {
474
+ "kind": "mcp",
475
+ "name": "featureoverride_get",
476
+ "operation": "get",
477
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
478
+ },
479
+ {
480
+ "kind": "mcp",
481
+ "name": "featureoverride_create",
482
+ "operation": "create",
483
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
484
+ },
485
+ {
486
+ "kind": "mcp",
487
+ "name": "featureoverride_update",
488
+ "operation": "update",
489
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
490
+ },
491
+ {
492
+ "kind": "mcp",
493
+ "name": "featureoverride_delete",
494
+ "operation": "delete",
495
+ "objectName": "@happyvertical/smrt-features:FeatureOverride"
496
+ }
497
+ ],
498
+ "prompts": [],
499
+ "relationshipsV2": {
500
+ "foreignKeyFields": 0,
501
+ "crossPackageRefFields": 0,
502
+ "junctionCollections": 0,
503
+ "hierarchicalObjects": 0,
504
+ "polymorphicAssociations": 0,
505
+ "uuidColumns": 4
506
+ },
507
+ "agentDoc": "# smrt-features\n\nCode-first feature flag system with global, app-level, and tenant-hierarchy resolution.\n\n## Core pieces\n\n- `FeatureDefinition` (`_smrt_feature_definitions` table) — code-owned definition mirrored to DB at registration\n- `FeatureOverride` (`_smrt_feature_overrides` table) — runtime override state, scoped by `(featureKey, scopeType, scopeId)`\n- `FeatureResolver` — resolves the effective state of a feature in a given context, walking the scope chain\n- `FeatureSyncService` — keeps `_smrt_feature_definitions` in sync with code-registered defaults at boot\n\n## Resolution chain (priority high → low)\n\n1. User scope (`scopeType: 'user'`) — when context includes a userId\n2. Tenant scope (`scopeType: 'tenant'`) — walks up the tenant hierarchy when a `FeatureTenantHierarchyProvider` is configured (DI); otherwise resolves a flat tenant scope\n3. Global scope (`scopeType: 'global'`, `scopeId: GLOBAL_FEATURE_SCOPE_ID`)\n4. Definition default (registered in code)\n\n## Conventions\n\n- Feature keys should be namespaced by package or domain, e.g. `commerce.invoice.draft-mode`, `content.editor.ai-suggestions`\n- Definitions are code-owned. Don't write `FeatureDefinition` rows directly — use `FeatureSyncService.syncDefinitions()` at startup with the manifest of expected features\n- Overrides are write-time validated against the matching definition (effect must be a known `FeatureOverrideEffect`, scope must be valid for the definition's `allowedScopes`)\n- Tenant-hierarchy resolution is an optional integration wired by dependency injection (`FeatureTenantHierarchyProvider`), not a static dependency — `smrt-features` never imports `@happyvertical/smrt-users`. Without a configured provider, tenant-hierarchy resolution falls back to a flat tenant scope. (The consumer that wants hierarchy installs `smrt-users` itself and supplies the provider; `smrt-users` is a dev-only dependency here for tests.)\n\n## Integration with `@happyvertical/smrt-users`\n\nWhen `smrt-users` is present, `FeatureResolver` uses it to walk the tenant hierarchy (parent → grandparent → root). Configure via `FeatureTenantHierarchyProvider`. Without it, tenant lookup is single-level.\n"
508
+ }
@@ -0,0 +1,111 @@
1
+ import { SmartObjectManifest } from '@happyvertical/smrt-core';
2
+ import { SmrtClassOptions } from '@happyvertical/smrt-core';
3
+
4
+ export declare interface FeatureDefinitionOptions {
5
+ id?: string;
6
+ featureKey?: string;
7
+ packageName?: string;
8
+ qualifiedClassName?: string;
9
+ className?: string;
10
+ localId?: string;
11
+ defaultEnabled?: boolean;
12
+ label?: string;
13
+ description?: string;
14
+ metadata?: FeatureMetadata | string | null;
15
+ visibility?: string;
16
+ createdAt?: Date;
17
+ updatedAt?: Date;
18
+ }
19
+
20
+ export declare interface FeatureDefinitionSeed {
21
+ featureKey: string;
22
+ packageName: string;
23
+ qualifiedClassName: string;
24
+ className: string;
25
+ localId: string;
26
+ defaultEnabled: boolean;
27
+ label?: string;
28
+ description?: string;
29
+ metadata?: FeatureMetadata;
30
+ visibility?: string;
31
+ }
32
+
33
+ export declare interface FeatureMetadata {
34
+ [key: string]: unknown;
35
+ }
36
+
37
+ export declare enum FeatureOverrideEffect {
38
+ INHERIT = "inherit",
39
+ ENABLE = "enable",
40
+ DISABLE = "disable"
41
+ }
42
+
43
+ export declare interface FeatureOverrideOptions {
44
+ id?: string;
45
+ featureKey?: string;
46
+ scopeType?: FeatureScopeType;
47
+ scopeId?: string;
48
+ effect?: FeatureOverrideEffect;
49
+ createdAt?: Date;
50
+ updatedAt?: Date;
51
+ }
52
+
53
+ export declare interface FeatureResolutionContext {
54
+ tenantId?: string;
55
+ }
56
+
57
+ export declare interface FeatureResolverOptions {
58
+ tenantHierarchyLoader?: FeatureTenantHierarchyLoader;
59
+ }
60
+
61
+ export declare type FeatureScopeType = 'global' | 'tenant';
62
+
63
+ export declare interface FeatureSyncResult {
64
+ total: number;
65
+ created: number;
66
+ updated: number;
67
+ unchanged: number;
68
+ deleted: number;
69
+ featureKeys: string[];
70
+ }
71
+
72
+ export declare type FeatureTenantHierarchyLoader = (options: SmrtClassOptions) => Promise<FeatureTenantHierarchyProvider | null>;
73
+
74
+ export declare interface FeatureTenantHierarchyProvider {
75
+ getChain(tenantId: string): Promise<FeatureTenantNode[]>;
76
+ }
77
+
78
+ export declare interface FeatureTenantNode {
79
+ id: string;
80
+ inheritPermissions: boolean;
81
+ cascadePermissions: boolean;
82
+ }
83
+
84
+ export declare interface FeatureUsersModule {
85
+ TenantCollection: {
86
+ create(options: SmrtClassOptions): Promise<{
87
+ get(criteria: {
88
+ id: string;
89
+ }): Promise<any>;
90
+ getAncestorsFromRoot(tenantId: string): Promise<any[]>;
91
+ }>;
92
+ };
93
+ }
94
+
95
+ export declare const GLOBAL_FEATURE_SCOPE_ID = "*";
96
+
97
+ export { SmartObjectManifest }
98
+
99
+ export { SmrtClassOptions }
100
+
101
+ export declare interface SyncDefinitionsOptions {
102
+ classNames?: string[];
103
+ constructors?: Array<new (...args: any[]) => any>;
104
+ pruneStale?: boolean;
105
+ }
106
+
107
+ export declare interface SyncManifestOptions {
108
+ pruneStale?: boolean;
109
+ }
110
+
111
+ export { }
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ const GLOBAL_FEATURE_SCOPE_ID = "*";
2
+ var FeatureOverrideEffect = /* @__PURE__ */ ((FeatureOverrideEffect2) => {
3
+ FeatureOverrideEffect2["INHERIT"] = "inherit";
4
+ FeatureOverrideEffect2["ENABLE"] = "enable";
5
+ FeatureOverrideEffect2["DISABLE"] = "disable";
6
+ return FeatureOverrideEffect2;
7
+ })(FeatureOverrideEffect || {});
8
+ export {
9
+ FeatureOverrideEffect,
10
+ GLOBAL_FEATURE_SCOPE_ID
11
+ };
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type {\n SmartObjectManifest,\n SmrtClassOptions,\n} from '@happyvertical/smrt-core';\n\nexport const GLOBAL_FEATURE_SCOPE_ID = '*';\n\nexport type FeatureScopeType = 'global' | 'tenant';\n\nexport enum FeatureOverrideEffect {\n INHERIT = 'inherit',\n ENABLE = 'enable',\n DISABLE = 'disable',\n}\n\nexport interface FeatureMetadata {\n [key: string]: unknown;\n}\n\nexport interface FeatureDefinitionOptions {\n id?: string;\n featureKey?: string;\n packageName?: string;\n qualifiedClassName?: string;\n className?: string;\n localId?: string;\n defaultEnabled?: boolean;\n label?: string;\n description?: string;\n metadata?: FeatureMetadata | string | null;\n visibility?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface FeatureOverrideOptions {\n id?: string;\n featureKey?: string;\n scopeType?: FeatureScopeType;\n scopeId?: string;\n effect?: FeatureOverrideEffect;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface FeatureDefinitionSeed {\n featureKey: string;\n packageName: string;\n qualifiedClassName: string;\n className: string;\n localId: string;\n defaultEnabled: boolean;\n label?: string;\n description?: string;\n metadata?: FeatureMetadata;\n visibility?: string;\n}\n\nexport interface SyncDefinitionsOptions {\n classNames?: string[];\n constructors?: Array<new (...args: any[]) => any>;\n pruneStale?: boolean;\n}\n\nexport interface SyncManifestOptions {\n pruneStale?: boolean;\n}\n\nexport interface FeatureSyncResult {\n total: number;\n created: number;\n updated: number;\n unchanged: number;\n deleted: number;\n featureKeys: string[];\n}\n\nexport interface FeatureResolutionContext {\n tenantId?: string;\n}\n\nexport interface FeatureTenantNode {\n id: string;\n inheritPermissions: boolean;\n cascadePermissions: boolean;\n}\n\nexport interface FeatureTenantHierarchyProvider {\n getChain(tenantId: string): Promise<FeatureTenantNode[]>;\n}\n\nexport type FeatureTenantHierarchyLoader = (\n options: SmrtClassOptions,\n) => Promise<FeatureTenantHierarchyProvider | null>;\n\nexport interface FeatureResolverOptions {\n tenantHierarchyLoader?: FeatureTenantHierarchyLoader;\n}\n\nexport interface FeatureUsersModule {\n TenantCollection: {\n create(options: SmrtClassOptions): Promise<{\n get(criteria: { id: string }): Promise<any>;\n getAncestorsFromRoot(tenantId: string): Promise<any[]>;\n }>;\n };\n}\n\nexport type { SmrtClassOptions, SmartObjectManifest };\n"],"names":["FeatureOverrideEffect"],"mappings":"AAKO,MAAM,0BAA0B;AAIhC,IAAK,0CAAAA,2BAAL;AACLA,yBAAA,SAAA,IAAU;AACVA,yBAAA,QAAA,IAAS;AACTA,yBAAA,SAAA,IAAU;AAHA,SAAAA;AAAA,GAAA,yBAAA,CAAA,CAAA;"}