@happyvertical/smrt-features 0.51.12 → 0.51.14

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.
@@ -3,13 +3,13 @@
3
3
  "sensitiveFieldsExcluded": true,
4
4
  "generatedAt": "1970-01-01T00:00:00.000Z",
5
5
  "packageName": "@happyvertical/smrt-features",
6
- "packageVersion": "0.51.12",
6
+ "packageVersion": "0.51.14",
7
7
  "sourceManifestPath": "dist/manifest.json",
8
8
  "agentDocPath": "AGENTS.md",
9
9
  "sourceHashes": {
10
- "manifest": "f5b1bd5f5c099d392268562facd30e6a0053dddeec2f6d90dc3d13fe5dae329b",
11
- "packageJson": "9ae7938ea0c7a75118f9c56c2b67c164eda555e2ceadd247857b927c9fc7cb71",
12
- "agents": "0d14be2150e562d6834a67a6fd2a5d8bf63a1654e1f5a5165d1c97c2057574a8"
10
+ "manifest": "a823cd9897d2c1a768e8cac81d1596f248a155c128346a640b8a70f1b75123c8",
11
+ "packageJson": "a874bac5e98cad360a55bdb58099f78f62dd9c78e379db08a946b6be51090be2",
12
+ "agents": "fc12985efb3020621dc7e4d688c711c3b6d72ee0f3999d372eb24252e75f2db8"
13
13
  },
14
14
  "exports": [
15
15
  ".",
@@ -21,7 +21,7 @@
21
21
  "@happyvertical/smrt-cli": "workspace:*",
22
22
  "@happyvertical/smrt-users": "workspace:*",
23
23
  "@happyvertical/smrt-vitest": "workspace:*",
24
- "@types/node": "24.13.2",
24
+ "@types/node": "24.13.6",
25
25
  "typescript": "5.9.3",
26
26
  "vite": "8.1.4",
27
27
  "vitest": "4.1.10"
@@ -145,61 +145,20 @@
145
145
  "conflictColumns": [
146
146
  "feature_key"
147
147
  ],
148
- "surfaces": [
149
- {
150
- "kind": "api",
151
- "name": "featuredefinitions.list",
152
- "operation": "list",
153
- "objectName": "@happyvertical/smrt-features:FeatureDefinition",
154
- "path": "/featuredefinitions",
155
- "method": "GET"
156
- },
157
- {
158
- "kind": "api",
159
- "name": "featuredefinitions.get",
160
- "operation": "get",
161
- "objectName": "@happyvertical/smrt-features:FeatureDefinition",
162
- "path": "/featuredefinitions/[id]",
163
- "method": "GET"
164
- },
165
- {
166
- "kind": "cli",
167
- "name": "featuredefinition_list",
168
- "operation": "list",
169
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
170
- },
171
- {
172
- "kind": "cli",
173
- "name": "featuredefinition_get",
174
- "operation": "get",
175
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
176
- },
177
- {
178
- "kind": "mcp",
179
- "name": "featuredefinition_list",
180
- "operation": "list",
181
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
182
- },
183
- {
184
- "kind": "mcp",
185
- "name": "featuredefinition_get",
186
- "operation": "get",
187
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
188
- }
189
- ],
148
+ "surfaces": [],
190
149
  "withheldSurfaces": [
191
150
  {
192
151
  "kind": "api",
193
152
  "operation": "getMetadata",
194
- "code": "not-included",
195
- "reason": "not listed in api.include",
153
+ "code": "api-disabled",
154
+ "reason": "api is disabled",
196
155
  "objectName": "@happyvertical/smrt-features:FeatureDefinition"
197
156
  },
198
157
  {
199
158
  "kind": "api",
200
159
  "operation": "setMetadata",
201
- "code": "not-included",
202
- "reason": "not listed in api.include",
160
+ "code": "api-disabled",
161
+ "reason": "api is disabled",
203
162
  "objectName": "@happyvertical/smrt-features:FeatureDefinition"
204
163
  }
205
164
  ],
@@ -249,65 +208,27 @@
249
208
  "returns": "Promise<object>"
250
209
  }
251
210
  ],
252
- "surfaces": [
253
- {
254
- "kind": "api",
255
- "name": "featuredefinitions.findByFeatureKey",
256
- "operation": "findByFeatureKey",
257
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
258
- "path": "/featuredefinitions/findByFeatureKey",
259
- "method": "POST"
260
- },
261
- {
262
- "kind": "api",
263
- "name": "featuredefinitions.findByPackageName",
264
- "operation": "findByPackageName",
265
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
266
- "path": "/featuredefinitions/findByPackageName",
267
- "method": "POST"
268
- },
211
+ "surfaces": [],
212
+ "withheldSurfaces": [
269
213
  {
270
214
  "kind": "api",
271
- "name": "featuredefinitions.upsertDefinition",
272
- "operation": "upsertDefinition",
273
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
274
- "path": "/featuredefinitions/upsertDefinition",
275
- "method": "POST"
276
- },
277
- {
278
- "kind": "cli",
279
- "name": "featuredefinitioncollection_findByFeatureKey",
280
215
  "operation": "findByFeatureKey",
216
+ "code": "api-disabled",
217
+ "reason": "api is disabled",
281
218
  "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
282
219
  },
283
220
  {
284
- "kind": "cli",
285
- "name": "featuredefinitioncollection_findByPackageName",
286
- "operation": "findByPackageName",
287
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
288
- },
289
- {
290
- "kind": "cli",
291
- "name": "featuredefinitioncollection_upsertDefinition",
292
- "operation": "upsertDefinition",
293
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
294
- },
295
- {
296
- "kind": "mcp",
297
- "name": "featuredefinitioncollection_findbyfeaturekey",
298
- "operation": "findByFeatureKey",
299
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
300
- },
301
- {
302
- "kind": "mcp",
303
- "name": "featuredefinitioncollection_findbypackagename",
221
+ "kind": "api",
304
222
  "operation": "findByPackageName",
223
+ "code": "api-disabled",
224
+ "reason": "api is disabled",
305
225
  "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
306
226
  },
307
227
  {
308
- "kind": "mcp",
309
- "name": "featuredefinitioncollection_upsertdefinition",
228
+ "kind": "api",
310
229
  "operation": "upsertDefinition",
230
+ "code": "api-disabled",
231
+ "reason": "api is disabled",
311
232
  "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
312
233
  }
313
234
  ],
@@ -377,128 +298,27 @@
377
298
  "scope_type",
378
299
  "scope_id"
379
300
  ],
380
- "surfaces": [
381
- {
382
- "kind": "api",
383
- "name": "featureoverrides.list",
384
- "operation": "list",
385
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
386
- "path": "/featureoverrides",
387
- "method": "GET"
388
- },
389
- {
390
- "kind": "api",
391
- "name": "featureoverrides.get",
392
- "operation": "get",
393
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
394
- "path": "/featureoverrides/[id]",
395
- "method": "GET"
396
- },
397
- {
398
- "kind": "api",
399
- "name": "featureoverrides.create",
400
- "operation": "create",
401
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
402
- "path": "/featureoverrides",
403
- "method": "POST"
404
- },
405
- {
406
- "kind": "api",
407
- "name": "featureoverrides.update",
408
- "operation": "update",
409
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
410
- "path": "/featureoverrides/[id]",
411
- "method": "PATCH"
412
- },
413
- {
414
- "kind": "api",
415
- "name": "featureoverrides.delete",
416
- "operation": "delete",
417
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
418
- "path": "/featureoverrides/[id]",
419
- "method": "DELETE"
420
- },
421
- {
422
- "kind": "cli",
423
- "name": "featureoverride_list",
424
- "operation": "list",
425
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
426
- },
427
- {
428
- "kind": "cli",
429
- "name": "featureoverride_get",
430
- "operation": "get",
431
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
432
- },
433
- {
434
- "kind": "cli",
435
- "name": "featureoverride_create",
436
- "operation": "create",
437
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
438
- },
439
- {
440
- "kind": "cli",
441
- "name": "featureoverride_update",
442
- "operation": "update",
443
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
444
- },
445
- {
446
- "kind": "cli",
447
- "name": "featureoverride_delete",
448
- "operation": "delete",
449
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
450
- },
451
- {
452
- "kind": "mcp",
453
- "name": "featureoverride_list",
454
- "operation": "list",
455
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
456
- },
457
- {
458
- "kind": "mcp",
459
- "name": "featureoverride_get",
460
- "operation": "get",
461
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
462
- },
463
- {
464
- "kind": "mcp",
465
- "name": "featureoverride_create",
466
- "operation": "create",
467
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
468
- },
469
- {
470
- "kind": "mcp",
471
- "name": "featureoverride_update",
472
- "operation": "update",
473
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
474
- },
475
- {
476
- "kind": "mcp",
477
- "name": "featureoverride_delete",
478
- "operation": "delete",
479
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
480
- }
481
- ],
301
+ "surfaces": [],
482
302
  "withheldSurfaces": [
483
303
  {
484
304
  "kind": "api",
485
305
  "operation": "isDisabled",
486
- "code": "not-included",
487
- "reason": "not listed in api.include",
306
+ "code": "api-disabled",
307
+ "reason": "api is disabled",
488
308
  "objectName": "@happyvertical/smrt-features:FeatureOverride"
489
309
  },
490
310
  {
491
311
  "kind": "api",
492
312
  "operation": "isEnabled",
493
- "code": "not-included",
494
- "reason": "not listed in api.include",
313
+ "code": "api-disabled",
314
+ "reason": "api is disabled",
495
315
  "objectName": "@happyvertical/smrt-features:FeatureOverride"
496
316
  },
497
317
  {
498
318
  "kind": "api",
499
319
  "operation": "isInherit",
500
- "code": "not-included",
501
- "reason": "not listed in api.include",
320
+ "code": "api-disabled",
321
+ "reason": "api is disabled",
502
322
  "objectName": "@happyvertical/smrt-features:FeatureOverride"
503
323
  }
504
324
  ],
@@ -615,185 +435,69 @@
615
435
  "returns": "Promise<FeatureOverride>"
616
436
  }
617
437
  ],
618
- "surfaces": [
619
- {
620
- "kind": "api",
621
- "name": "featureoverrides.findByFeatureKey",
622
- "operation": "findByFeatureKey",
623
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
624
- "path": "/featureoverrides/findByFeatureKey",
625
- "method": "POST"
626
- },
438
+ "surfaces": [],
439
+ "withheldSurfaces": [
627
440
  {
628
441
  "kind": "api",
629
- "name": "featureoverrides.findByFeatureAndScope",
630
442
  "operation": "findByFeatureAndScope",
631
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
632
- "path": "/featureoverrides/findByFeatureAndScope",
633
- "method": "POST"
634
- },
635
- {
636
- "kind": "api",
637
- "name": "featureoverrides.getGlobalOverride",
638
- "operation": "getGlobalOverride",
639
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
640
- "path": "/featureoverrides/getGlobalOverride",
641
- "method": "POST"
642
- },
643
- {
644
- "kind": "api",
645
- "name": "featureoverrides.getTenantOverride",
646
- "operation": "getTenantOverride",
647
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
648
- "path": "/featureoverrides/getTenantOverride",
649
- "method": "POST"
650
- },
651
- {
652
- "kind": "api",
653
- "name": "featureoverrides.getOverrideMap",
654
- "operation": "getOverrideMap",
655
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
656
- "path": "/featureoverrides/getOverrideMap",
657
- "method": "POST"
658
- },
659
- {
660
- "kind": "api",
661
- "name": "featureoverrides.setOverride",
662
- "operation": "setOverride",
663
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
664
- "path": "/featureoverrides/setOverride",
665
- "method": "POST"
666
- },
667
- {
668
- "kind": "api",
669
- "name": "featureoverrides.setGlobalOverride",
670
- "operation": "setGlobalOverride",
671
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
672
- "path": "/featureoverrides/setGlobalOverride",
673
- "method": "POST"
674
- },
675
- {
676
- "kind": "api",
677
- "name": "featureoverrides.setTenantOverride",
678
- "operation": "setTenantOverride",
679
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
680
- "path": "/featureoverrides/setTenantOverride",
681
- "method": "POST"
443
+ "code": "api-disabled",
444
+ "reason": "api is disabled",
445
+ "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
682
446
  },
683
447
  {
684
448
  "kind": "api",
685
- "name": "featureoverrides.removeOverride",
686
- "operation": "removeOverride",
687
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
688
- "path": "/featureoverrides/removeOverride",
689
- "method": "POST"
690
- },
691
- {
692
- "kind": "cli",
693
- "name": "featureoverridecollection_findByFeatureKey",
694
449
  "operation": "findByFeatureKey",
450
+ "code": "api-disabled",
451
+ "reason": "api is disabled",
695
452
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
696
453
  },
697
454
  {
698
- "kind": "cli",
699
- "name": "featureoverridecollection_findByFeatureAndScope",
700
- "operation": "findByFeatureAndScope",
701
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
702
- },
703
- {
704
- "kind": "cli",
705
- "name": "featureoverridecollection_getGlobalOverride",
455
+ "kind": "api",
706
456
  "operation": "getGlobalOverride",
457
+ "code": "api-disabled",
458
+ "reason": "api is disabled",
707
459
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
708
460
  },
709
461
  {
710
- "kind": "cli",
711
- "name": "featureoverridecollection_getTenantOverride",
712
- "operation": "getTenantOverride",
713
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
714
- },
715
- {
716
- "kind": "cli",
717
- "name": "featureoverridecollection_getOverrideMap",
462
+ "kind": "api",
718
463
  "operation": "getOverrideMap",
464
+ "code": "api-disabled",
465
+ "reason": "api is disabled",
719
466
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
720
467
  },
721
468
  {
722
- "kind": "cli",
723
- "name": "featureoverridecollection_setOverride",
724
- "operation": "setOverride",
725
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
726
- },
727
- {
728
- "kind": "cli",
729
- "name": "featureoverridecollection_setGlobalOverride",
730
- "operation": "setGlobalOverride",
731
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
732
- },
733
- {
734
- "kind": "cli",
735
- "name": "featureoverridecollection_setTenantOverride",
736
- "operation": "setTenantOverride",
469
+ "kind": "api",
470
+ "operation": "getTenantOverride",
471
+ "code": "api-disabled",
472
+ "reason": "api is disabled",
737
473
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
738
474
  },
739
475
  {
740
- "kind": "cli",
741
- "name": "featureoverridecollection_removeOverride",
476
+ "kind": "api",
742
477
  "operation": "removeOverride",
478
+ "code": "api-disabled",
479
+ "reason": "api is disabled",
743
480
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
744
481
  },
745
482
  {
746
- "kind": "mcp",
747
- "name": "featureoverridecollection_findbyfeaturekey",
748
- "operation": "findByFeatureKey",
749
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
750
- },
751
- {
752
- "kind": "mcp",
753
- "name": "featureoverridecollection_findbyfeatureandscope",
754
- "operation": "findByFeatureAndScope",
755
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
756
- },
757
- {
758
- "kind": "mcp",
759
- "name": "featureoverridecollection_getglobaloverride",
760
- "operation": "getGlobalOverride",
761
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
762
- },
763
- {
764
- "kind": "mcp",
765
- "name": "featureoverridecollection_gettenantoverride",
766
- "operation": "getTenantOverride",
767
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
768
- },
769
- {
770
- "kind": "mcp",
771
- "name": "featureoverridecollection_getoverridemap",
772
- "operation": "getOverrideMap",
483
+ "kind": "api",
484
+ "operation": "setGlobalOverride",
485
+ "code": "api-disabled",
486
+ "reason": "api is disabled",
773
487
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
774
488
  },
775
489
  {
776
- "kind": "mcp",
777
- "name": "featureoverridecollection_setoverride",
490
+ "kind": "api",
778
491
  "operation": "setOverride",
492
+ "code": "api-disabled",
493
+ "reason": "api is disabled",
779
494
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
780
495
  },
781
496
  {
782
- "kind": "mcp",
783
- "name": "featureoverridecollection_setglobaloverride",
784
- "operation": "setGlobalOverride",
785
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
786
- },
787
- {
788
- "kind": "mcp",
789
- "name": "featureoverridecollection_settenantoverride",
497
+ "kind": "api",
790
498
  "operation": "setTenantOverride",
791
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
792
- },
793
- {
794
- "kind": "mcp",
795
- "name": "featureoverridecollection_removeoverride",
796
- "operation": "removeOverride",
499
+ "code": "api-disabled",
500
+ "reason": "api is disabled",
797
501
  "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
798
502
  }
799
503
  ],
@@ -804,388 +508,7 @@
804
508
  "risks": []
805
509
  }
806
510
  ],
807
- "surfaces": [
808
- {
809
- "kind": "api",
810
- "name": "featuredefinitions.list",
811
- "operation": "list",
812
- "objectName": "@happyvertical/smrt-features:FeatureDefinition",
813
- "path": "/featuredefinitions",
814
- "method": "GET"
815
- },
816
- {
817
- "kind": "api",
818
- "name": "featuredefinitions.get",
819
- "operation": "get",
820
- "objectName": "@happyvertical/smrt-features:FeatureDefinition",
821
- "path": "/featuredefinitions/[id]",
822
- "method": "GET"
823
- },
824
- {
825
- "kind": "cli",
826
- "name": "featuredefinition_list",
827
- "operation": "list",
828
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
829
- },
830
- {
831
- "kind": "cli",
832
- "name": "featuredefinition_get",
833
- "operation": "get",
834
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
835
- },
836
- {
837
- "kind": "mcp",
838
- "name": "featuredefinition_list",
839
- "operation": "list",
840
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
841
- },
842
- {
843
- "kind": "mcp",
844
- "name": "featuredefinition_get",
845
- "operation": "get",
846
- "objectName": "@happyvertical/smrt-features:FeatureDefinition"
847
- },
848
- {
849
- "kind": "api",
850
- "name": "featuredefinitions.findByFeatureKey",
851
- "operation": "findByFeatureKey",
852
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
853
- "path": "/featuredefinitions/findByFeatureKey",
854
- "method": "POST"
855
- },
856
- {
857
- "kind": "api",
858
- "name": "featuredefinitions.findByPackageName",
859
- "operation": "findByPackageName",
860
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
861
- "path": "/featuredefinitions/findByPackageName",
862
- "method": "POST"
863
- },
864
- {
865
- "kind": "api",
866
- "name": "featuredefinitions.upsertDefinition",
867
- "operation": "upsertDefinition",
868
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection",
869
- "path": "/featuredefinitions/upsertDefinition",
870
- "method": "POST"
871
- },
872
- {
873
- "kind": "cli",
874
- "name": "featuredefinitioncollection_findByFeatureKey",
875
- "operation": "findByFeatureKey",
876
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
877
- },
878
- {
879
- "kind": "cli",
880
- "name": "featuredefinitioncollection_findByPackageName",
881
- "operation": "findByPackageName",
882
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
883
- },
884
- {
885
- "kind": "cli",
886
- "name": "featuredefinitioncollection_upsertDefinition",
887
- "operation": "upsertDefinition",
888
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
889
- },
890
- {
891
- "kind": "mcp",
892
- "name": "featuredefinitioncollection_findbyfeaturekey",
893
- "operation": "findByFeatureKey",
894
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
895
- },
896
- {
897
- "kind": "mcp",
898
- "name": "featuredefinitioncollection_findbypackagename",
899
- "operation": "findByPackageName",
900
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
901
- },
902
- {
903
- "kind": "mcp",
904
- "name": "featuredefinitioncollection_upsertdefinition",
905
- "operation": "upsertDefinition",
906
- "objectName": "@happyvertical/smrt-features:FeatureDefinitionCollection"
907
- },
908
- {
909
- "kind": "api",
910
- "name": "featureoverrides.list",
911
- "operation": "list",
912
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
913
- "path": "/featureoverrides",
914
- "method": "GET"
915
- },
916
- {
917
- "kind": "api",
918
- "name": "featureoverrides.get",
919
- "operation": "get",
920
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
921
- "path": "/featureoverrides/[id]",
922
- "method": "GET"
923
- },
924
- {
925
- "kind": "api",
926
- "name": "featureoverrides.create",
927
- "operation": "create",
928
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
929
- "path": "/featureoverrides",
930
- "method": "POST"
931
- },
932
- {
933
- "kind": "api",
934
- "name": "featureoverrides.update",
935
- "operation": "update",
936
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
937
- "path": "/featureoverrides/[id]",
938
- "method": "PATCH"
939
- },
940
- {
941
- "kind": "api",
942
- "name": "featureoverrides.delete",
943
- "operation": "delete",
944
- "objectName": "@happyvertical/smrt-features:FeatureOverride",
945
- "path": "/featureoverrides/[id]",
946
- "method": "DELETE"
947
- },
948
- {
949
- "kind": "cli",
950
- "name": "featureoverride_list",
951
- "operation": "list",
952
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
953
- },
954
- {
955
- "kind": "cli",
956
- "name": "featureoverride_get",
957
- "operation": "get",
958
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
959
- },
960
- {
961
- "kind": "cli",
962
- "name": "featureoverride_create",
963
- "operation": "create",
964
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
965
- },
966
- {
967
- "kind": "cli",
968
- "name": "featureoverride_update",
969
- "operation": "update",
970
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
971
- },
972
- {
973
- "kind": "cli",
974
- "name": "featureoverride_delete",
975
- "operation": "delete",
976
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
977
- },
978
- {
979
- "kind": "mcp",
980
- "name": "featureoverride_list",
981
- "operation": "list",
982
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
983
- },
984
- {
985
- "kind": "mcp",
986
- "name": "featureoverride_get",
987
- "operation": "get",
988
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
989
- },
990
- {
991
- "kind": "mcp",
992
- "name": "featureoverride_create",
993
- "operation": "create",
994
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
995
- },
996
- {
997
- "kind": "mcp",
998
- "name": "featureoverride_update",
999
- "operation": "update",
1000
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
1001
- },
1002
- {
1003
- "kind": "mcp",
1004
- "name": "featureoverride_delete",
1005
- "operation": "delete",
1006
- "objectName": "@happyvertical/smrt-features:FeatureOverride"
1007
- },
1008
- {
1009
- "kind": "api",
1010
- "name": "featureoverrides.findByFeatureKey",
1011
- "operation": "findByFeatureKey",
1012
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1013
- "path": "/featureoverrides/findByFeatureKey",
1014
- "method": "POST"
1015
- },
1016
- {
1017
- "kind": "api",
1018
- "name": "featureoverrides.findByFeatureAndScope",
1019
- "operation": "findByFeatureAndScope",
1020
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1021
- "path": "/featureoverrides/findByFeatureAndScope",
1022
- "method": "POST"
1023
- },
1024
- {
1025
- "kind": "api",
1026
- "name": "featureoverrides.getGlobalOverride",
1027
- "operation": "getGlobalOverride",
1028
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1029
- "path": "/featureoverrides/getGlobalOverride",
1030
- "method": "POST"
1031
- },
1032
- {
1033
- "kind": "api",
1034
- "name": "featureoverrides.getTenantOverride",
1035
- "operation": "getTenantOverride",
1036
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1037
- "path": "/featureoverrides/getTenantOverride",
1038
- "method": "POST"
1039
- },
1040
- {
1041
- "kind": "api",
1042
- "name": "featureoverrides.getOverrideMap",
1043
- "operation": "getOverrideMap",
1044
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1045
- "path": "/featureoverrides/getOverrideMap",
1046
- "method": "POST"
1047
- },
1048
- {
1049
- "kind": "api",
1050
- "name": "featureoverrides.setOverride",
1051
- "operation": "setOverride",
1052
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1053
- "path": "/featureoverrides/setOverride",
1054
- "method": "POST"
1055
- },
1056
- {
1057
- "kind": "api",
1058
- "name": "featureoverrides.setGlobalOverride",
1059
- "operation": "setGlobalOverride",
1060
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1061
- "path": "/featureoverrides/setGlobalOverride",
1062
- "method": "POST"
1063
- },
1064
- {
1065
- "kind": "api",
1066
- "name": "featureoverrides.setTenantOverride",
1067
- "operation": "setTenantOverride",
1068
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1069
- "path": "/featureoverrides/setTenantOverride",
1070
- "method": "POST"
1071
- },
1072
- {
1073
- "kind": "api",
1074
- "name": "featureoverrides.removeOverride",
1075
- "operation": "removeOverride",
1076
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection",
1077
- "path": "/featureoverrides/removeOverride",
1078
- "method": "POST"
1079
- },
1080
- {
1081
- "kind": "cli",
1082
- "name": "featureoverridecollection_findByFeatureKey",
1083
- "operation": "findByFeatureKey",
1084
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1085
- },
1086
- {
1087
- "kind": "cli",
1088
- "name": "featureoverridecollection_findByFeatureAndScope",
1089
- "operation": "findByFeatureAndScope",
1090
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1091
- },
1092
- {
1093
- "kind": "cli",
1094
- "name": "featureoverridecollection_getGlobalOverride",
1095
- "operation": "getGlobalOverride",
1096
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1097
- },
1098
- {
1099
- "kind": "cli",
1100
- "name": "featureoverridecollection_getTenantOverride",
1101
- "operation": "getTenantOverride",
1102
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1103
- },
1104
- {
1105
- "kind": "cli",
1106
- "name": "featureoverridecollection_getOverrideMap",
1107
- "operation": "getOverrideMap",
1108
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1109
- },
1110
- {
1111
- "kind": "cli",
1112
- "name": "featureoverridecollection_setOverride",
1113
- "operation": "setOverride",
1114
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1115
- },
1116
- {
1117
- "kind": "cli",
1118
- "name": "featureoverridecollection_setGlobalOverride",
1119
- "operation": "setGlobalOverride",
1120
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1121
- },
1122
- {
1123
- "kind": "cli",
1124
- "name": "featureoverridecollection_setTenantOverride",
1125
- "operation": "setTenantOverride",
1126
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1127
- },
1128
- {
1129
- "kind": "cli",
1130
- "name": "featureoverridecollection_removeOverride",
1131
- "operation": "removeOverride",
1132
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1133
- },
1134
- {
1135
- "kind": "mcp",
1136
- "name": "featureoverridecollection_findbyfeaturekey",
1137
- "operation": "findByFeatureKey",
1138
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1139
- },
1140
- {
1141
- "kind": "mcp",
1142
- "name": "featureoverridecollection_findbyfeatureandscope",
1143
- "operation": "findByFeatureAndScope",
1144
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1145
- },
1146
- {
1147
- "kind": "mcp",
1148
- "name": "featureoverridecollection_getglobaloverride",
1149
- "operation": "getGlobalOverride",
1150
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1151
- },
1152
- {
1153
- "kind": "mcp",
1154
- "name": "featureoverridecollection_gettenantoverride",
1155
- "operation": "getTenantOverride",
1156
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1157
- },
1158
- {
1159
- "kind": "mcp",
1160
- "name": "featureoverridecollection_getoverridemap",
1161
- "operation": "getOverrideMap",
1162
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1163
- },
1164
- {
1165
- "kind": "mcp",
1166
- "name": "featureoverridecollection_setoverride",
1167
- "operation": "setOverride",
1168
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1169
- },
1170
- {
1171
- "kind": "mcp",
1172
- "name": "featureoverridecollection_setglobaloverride",
1173
- "operation": "setGlobalOverride",
1174
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1175
- },
1176
- {
1177
- "kind": "mcp",
1178
- "name": "featureoverridecollection_settenantoverride",
1179
- "operation": "setTenantOverride",
1180
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1181
- },
1182
- {
1183
- "kind": "mcp",
1184
- "name": "featureoverridecollection_removeoverride",
1185
- "operation": "removeOverride",
1186
- "objectName": "@happyvertical/smrt-features:FeatureOverrideCollection"
1187
- }
1188
- ],
511
+ "surfaces": [],
1189
512
  "prompts": [],
1190
513
  "relationshipsV2": {
1191
514
  "foreignKeyFields": 0,
@@ -1195,5 +518,5 @@
1195
518
  "polymorphicAssociations": 0,
1196
519
  "uuidColumns": 4
1197
520
  },
1198
- "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"
521
+ "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- Neither object exposes generated REST routes, MCP tools, or CLI commands (`api: false`, `mcp: false`, `cli: false`, #3013): override rows can target any scope and the object is not tenant-scoped, so a generated authentication-only surface would let any signed-in principal set another tenant's flag. Hosts write overrides server-side with `FeatureOverrideService` (which requires an explicit authorizer for every write) or `FeatureOverrideCollection.setOverride()` / `removeOverride()` only after their own authorization decision.\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"
1199
522
  }