@happyvertical/smrt-tags 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,726 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-06-23T01:11:20.374Z",
4
+ "packageName": "@happyvertical/smrt-tags",
5
+ "packageVersion": "0.30.0",
6
+ "sourceManifestPath": "dist/manifest.json",
7
+ "agentDocPath": "AGENTS.md",
8
+ "sourceHashes": {
9
+ "manifest": "0a6e25a6a55fe5ec165e1c9b4184ec4cef02a56db951fbf9e146e52848c5e9f7",
10
+ "packageJson": "7272892d617762d6f4ddf26b884227c80ab861fdb950a3cd8295b93bdffa341a",
11
+ "agents": "900516b49407d5a521c2f0f2bdb2d4ab0c97e620808115718779f7ecf3ace222"
12
+ },
13
+ "exports": [
14
+ ".",
15
+ "./manifest",
16
+ "./manifest.json",
17
+ "./utils"
18
+ ],
19
+ "dependencies": {
20
+ "@happyvertical/ai": "catalog:",
21
+ "@happyvertical/files": "catalog:",
22
+ "@happyvertical/logger": "catalog:",
23
+ "@happyvertical/smrt-core": "workspace:*",
24
+ "@happyvertical/smrt-tenancy": "workspace:*",
25
+ "@happyvertical/sql": "catalog:",
26
+ "@happyvertical/utils": "catalog:",
27
+ "@types/node": "25.0.9",
28
+ "typescript": "^5.9.3",
29
+ "vite": "^7.3.1",
30
+ "vitest": "^4.0.17"
31
+ },
32
+ "smrtDependencies": [
33
+ "@happyvertical/smrt-core",
34
+ "@happyvertical/smrt-tenancy"
35
+ ],
36
+ "sdkDependencies": [
37
+ "@happyvertical/ai",
38
+ "@happyvertical/files",
39
+ "@happyvertical/logger",
40
+ "@happyvertical/sql",
41
+ "@happyvertical/utils"
42
+ ],
43
+ "tags": [],
44
+ "risks": [],
45
+ "objects": [
46
+ {
47
+ "name": "TagAlias",
48
+ "qualifiedName": "@happyvertical/smrt-tags:TagAlias",
49
+ "collection": "tagaliases",
50
+ "tableName": "tag_aliases",
51
+ "packageName": "@happyvertical/smrt-tags",
52
+ "extends": "SmrtObject",
53
+ "fields": [
54
+ {
55
+ "name": "created_at",
56
+ "type": "datetime",
57
+ "required": false,
58
+ "columnType": "TIMESTAMP"
59
+ },
60
+ {
61
+ "name": "updated_at",
62
+ "type": "datetime",
63
+ "required": false,
64
+ "columnType": "TIMESTAMP"
65
+ },
66
+ {
67
+ "name": "tagSlug",
68
+ "type": "text",
69
+ "required": false,
70
+ "columnType": "TEXT"
71
+ },
72
+ {
73
+ "name": "alias",
74
+ "type": "text",
75
+ "required": true,
76
+ "columnType": "TEXT"
77
+ },
78
+ {
79
+ "name": "language",
80
+ "type": "text",
81
+ "required": false,
82
+ "columnType": "TEXT"
83
+ },
84
+ {
85
+ "name": "tenantId",
86
+ "type": "text",
87
+ "required": false,
88
+ "columnType": "UUID"
89
+ },
90
+ {
91
+ "name": "createdAt",
92
+ "type": "datetime",
93
+ "required": false,
94
+ "columnType": "TIMESTAMP"
95
+ }
96
+ ],
97
+ "relationships": [],
98
+ "methods": [
99
+ "classifyConstraintError",
100
+ "clearEmbeddings",
101
+ "delete",
102
+ "describe",
103
+ "destroy",
104
+ "do",
105
+ "executeToolCall",
106
+ "forget",
107
+ "forgetScope",
108
+ "generateEmbeddings",
109
+ "getAiUsageSnapshot",
110
+ "getAliasesForTag",
111
+ "getAvailableTools",
112
+ "getEmbedding",
113
+ "getFields",
114
+ "getId",
115
+ "getRelated",
116
+ "getSavedId",
117
+ "getSlug",
118
+ "getTag",
119
+ "hasStaleEmbeddings",
120
+ "initialize",
121
+ "is",
122
+ "isRelatedLoaded",
123
+ "isSaved",
124
+ "listAiUsage",
125
+ "loadDataFromDb",
126
+ "loadFromId",
127
+ "loadFromSlug",
128
+ "loadRelated",
129
+ "loadRelatedMany",
130
+ "markAsPersisted",
131
+ "recall",
132
+ "recallAll",
133
+ "remember",
134
+ "resetAiUsage",
135
+ "save",
136
+ "searchByAlias",
137
+ "summarizeAiUsage",
138
+ "toJSON",
139
+ "toPlainObject",
140
+ "toPublicJSON"
141
+ ],
142
+ "surfaces": [
143
+ {
144
+ "kind": "api",
145
+ "name": "tagaliases.list",
146
+ "operation": "list",
147
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
148
+ "path": "/tagaliases",
149
+ "method": "GET"
150
+ },
151
+ {
152
+ "kind": "api",
153
+ "name": "tagaliases.get",
154
+ "operation": "get",
155
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
156
+ "path": "/tagaliases/[id]",
157
+ "method": "GET"
158
+ },
159
+ {
160
+ "kind": "api",
161
+ "name": "tagaliases.create",
162
+ "operation": "create",
163
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
164
+ "path": "/tagaliases",
165
+ "method": "POST"
166
+ },
167
+ {
168
+ "kind": "api",
169
+ "name": "tagaliases.update",
170
+ "operation": "update",
171
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
172
+ "path": "/tagaliases/[id]",
173
+ "method": "PATCH"
174
+ },
175
+ {
176
+ "kind": "api",
177
+ "name": "tagaliases.delete",
178
+ "operation": "delete",
179
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
180
+ "path": "/tagaliases/[id]",
181
+ "method": "DELETE"
182
+ },
183
+ {
184
+ "kind": "cli",
185
+ "name": "tagalias_list",
186
+ "operation": "list",
187
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
188
+ },
189
+ {
190
+ "kind": "cli",
191
+ "name": "tagalias_get",
192
+ "operation": "get",
193
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
194
+ },
195
+ {
196
+ "kind": "cli",
197
+ "name": "tagalias_create",
198
+ "operation": "create",
199
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
200
+ },
201
+ {
202
+ "kind": "cli",
203
+ "name": "tagalias_update",
204
+ "operation": "update",
205
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
206
+ },
207
+ {
208
+ "kind": "cli",
209
+ "name": "tagalias_delete",
210
+ "operation": "delete",
211
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
212
+ },
213
+ {
214
+ "kind": "mcp",
215
+ "name": "tagalias_list",
216
+ "operation": "list",
217
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
218
+ },
219
+ {
220
+ "kind": "mcp",
221
+ "name": "tagalias_get",
222
+ "operation": "get",
223
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
224
+ },
225
+ {
226
+ "kind": "mcp",
227
+ "name": "tagalias_create",
228
+ "operation": "create",
229
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
230
+ }
231
+ ],
232
+ "relationshipFeatures": [
233
+ "uuidColumns"
234
+ ],
235
+ "tags": [],
236
+ "risks": []
237
+ },
238
+ {
239
+ "name": "TagAliasCollection",
240
+ "qualifiedName": "@happyvertical/smrt-tags:TagAliasCollection",
241
+ "collection": "tagaliases",
242
+ "tableName": "tag_alias_collections",
243
+ "packageName": "@happyvertical/smrt-tags",
244
+ "extends": "SmrtCollection",
245
+ "fields": [],
246
+ "relationships": [],
247
+ "methods": [
248
+ "addAlias",
249
+ "bulkAddAliases",
250
+ "findByTenant",
251
+ "findGlobal",
252
+ "findMatchingAliases",
253
+ "findWithGlobals",
254
+ "getAliasesByLanguage",
255
+ "getAliasesForTag",
256
+ "removeAlias",
257
+ "searchByAlias"
258
+ ],
259
+ "surfaces": [],
260
+ "relationshipFeatures": [
261
+ "uuidColumns"
262
+ ],
263
+ "tags": [],
264
+ "risks": []
265
+ },
266
+ {
267
+ "name": "Tag",
268
+ "qualifiedName": "@happyvertical/smrt-tags:Tag",
269
+ "collection": "tags",
270
+ "tableName": "tags",
271
+ "packageName": "@happyvertical/smrt-tags",
272
+ "extends": "SmrtHierarchical",
273
+ "fields": [
274
+ {
275
+ "name": "created_at",
276
+ "type": "datetime",
277
+ "required": false,
278
+ "columnType": "TIMESTAMP"
279
+ },
280
+ {
281
+ "name": "updated_at",
282
+ "type": "datetime",
283
+ "required": false,
284
+ "columnType": "TIMESTAMP"
285
+ },
286
+ {
287
+ "name": "parentId",
288
+ "type": "foreignKey",
289
+ "required": false,
290
+ "related": "Tag",
291
+ "columnType": "UUID"
292
+ },
293
+ {
294
+ "name": "name",
295
+ "type": "text",
296
+ "required": true,
297
+ "columnType": "TEXT"
298
+ },
299
+ {
300
+ "name": "level",
301
+ "type": "integer",
302
+ "required": false,
303
+ "columnType": "INTEGER"
304
+ },
305
+ {
306
+ "name": "description",
307
+ "type": "text",
308
+ "required": false,
309
+ "columnType": "TEXT"
310
+ },
311
+ {
312
+ "name": "metadata",
313
+ "type": "text",
314
+ "required": false,
315
+ "columnType": "TEXT"
316
+ },
317
+ {
318
+ "name": "tenantId",
319
+ "type": "text",
320
+ "required": false,
321
+ "columnType": "UUID"
322
+ },
323
+ {
324
+ "name": "createdAt",
325
+ "type": "datetime",
326
+ "required": false,
327
+ "columnType": "TIMESTAMP"
328
+ },
329
+ {
330
+ "name": "updatedAt",
331
+ "type": "datetime",
332
+ "required": false,
333
+ "columnType": "TIMESTAMP"
334
+ }
335
+ ],
336
+ "relationships": [
337
+ {
338
+ "name": "parentId",
339
+ "type": "foreignKey",
340
+ "required": false,
341
+ "related": "Tag",
342
+ "columnType": "UUID"
343
+ }
344
+ ],
345
+ "methods": [
346
+ "classifyConstraintError",
347
+ "clearEmbeddings",
348
+ "delete",
349
+ "describe",
350
+ "destroy",
351
+ "do",
352
+ "executeToolCall",
353
+ "forget",
354
+ "forgetScope",
355
+ "generateEmbeddings",
356
+ "getAiUsageSnapshot",
357
+ "getAncestors",
358
+ "getAvailableTools",
359
+ "getBySlug",
360
+ "getChildren",
361
+ "getDescendants",
362
+ "getEmbedding",
363
+ "getFields",
364
+ "getHierarchy",
365
+ "getId",
366
+ "getMetadata",
367
+ "getParent",
368
+ "getRelated",
369
+ "getRootTags",
370
+ "getSavedId",
371
+ "getSlug",
372
+ "hasStaleEmbeddings",
373
+ "initialize",
374
+ "is",
375
+ "isRelatedLoaded",
376
+ "isSaved",
377
+ "listAiUsage",
378
+ "loadDataFromDb",
379
+ "loadFromId",
380
+ "loadFromSlug",
381
+ "loadRelated",
382
+ "loadRelatedMany",
383
+ "markAsPersisted",
384
+ "moveTo",
385
+ "recall",
386
+ "recallAll",
387
+ "remember",
388
+ "resetAiUsage",
389
+ "save",
390
+ "setMetadata",
391
+ "summarizeAiUsage",
392
+ "toJSON",
393
+ "toPlainObject",
394
+ "toPublicJSON",
395
+ "updateMetadata"
396
+ ],
397
+ "surfaces": [
398
+ {
399
+ "kind": "api",
400
+ "name": "tags.list",
401
+ "operation": "list",
402
+ "objectName": "@happyvertical/smrt-tags:Tag",
403
+ "path": "/tags",
404
+ "method": "GET"
405
+ },
406
+ {
407
+ "kind": "api",
408
+ "name": "tags.get",
409
+ "operation": "get",
410
+ "objectName": "@happyvertical/smrt-tags:Tag",
411
+ "path": "/tags/[id]",
412
+ "method": "GET"
413
+ },
414
+ {
415
+ "kind": "api",
416
+ "name": "tags.create",
417
+ "operation": "create",
418
+ "objectName": "@happyvertical/smrt-tags:Tag",
419
+ "path": "/tags",
420
+ "method": "POST"
421
+ },
422
+ {
423
+ "kind": "api",
424
+ "name": "tags.update",
425
+ "operation": "update",
426
+ "objectName": "@happyvertical/smrt-tags:Tag",
427
+ "path": "/tags/[id]",
428
+ "method": "PATCH"
429
+ },
430
+ {
431
+ "kind": "api",
432
+ "name": "tags.delete",
433
+ "operation": "delete",
434
+ "objectName": "@happyvertical/smrt-tags:Tag",
435
+ "path": "/tags/[id]",
436
+ "method": "DELETE"
437
+ },
438
+ {
439
+ "kind": "cli",
440
+ "name": "tag_list",
441
+ "operation": "list",
442
+ "objectName": "@happyvertical/smrt-tags:Tag"
443
+ },
444
+ {
445
+ "kind": "cli",
446
+ "name": "tag_get",
447
+ "operation": "get",
448
+ "objectName": "@happyvertical/smrt-tags:Tag"
449
+ },
450
+ {
451
+ "kind": "cli",
452
+ "name": "tag_create",
453
+ "operation": "create",
454
+ "objectName": "@happyvertical/smrt-tags:Tag"
455
+ },
456
+ {
457
+ "kind": "cli",
458
+ "name": "tag_update",
459
+ "operation": "update",
460
+ "objectName": "@happyvertical/smrt-tags:Tag"
461
+ },
462
+ {
463
+ "kind": "cli",
464
+ "name": "tag_delete",
465
+ "operation": "delete",
466
+ "objectName": "@happyvertical/smrt-tags:Tag"
467
+ },
468
+ {
469
+ "kind": "mcp",
470
+ "name": "tag_list",
471
+ "operation": "list",
472
+ "objectName": "@happyvertical/smrt-tags:Tag"
473
+ },
474
+ {
475
+ "kind": "mcp",
476
+ "name": "tag_get",
477
+ "operation": "get",
478
+ "objectName": "@happyvertical/smrt-tags:Tag"
479
+ },
480
+ {
481
+ "kind": "mcp",
482
+ "name": "tag_create",
483
+ "operation": "create",
484
+ "objectName": "@happyvertical/smrt-tags:Tag"
485
+ },
486
+ {
487
+ "kind": "mcp",
488
+ "name": "tag_update",
489
+ "operation": "update",
490
+ "objectName": "@happyvertical/smrt-tags:Tag"
491
+ }
492
+ ],
493
+ "relationshipFeatures": [
494
+ "SmrtHierarchical",
495
+ "foreignKey",
496
+ "uuidColumns"
497
+ ],
498
+ "tags": [],
499
+ "risks": []
500
+ },
501
+ {
502
+ "name": "TagCollection",
503
+ "qualifiedName": "@happyvertical/smrt-tags:TagCollection",
504
+ "collection": "tags",
505
+ "tableName": "tag_collections",
506
+ "packageName": "@happyvertical/smrt-tags",
507
+ "extends": "SmrtCollection",
508
+ "fields": [],
509
+ "relationships": [],
510
+ "methods": [
511
+ "calculateLevel",
512
+ "cleanupUnused",
513
+ "findByTenant",
514
+ "findGlobal",
515
+ "findWithGlobals",
516
+ "getChildren",
517
+ "getHierarchy",
518
+ "getOrCreate",
519
+ "getRootTags",
520
+ "listByContext",
521
+ "mergeTag",
522
+ "moveTag"
523
+ ],
524
+ "surfaces": [],
525
+ "relationshipFeatures": [
526
+ "uuidColumns"
527
+ ],
528
+ "tags": [],
529
+ "risks": []
530
+ }
531
+ ],
532
+ "surfaces": [
533
+ {
534
+ "kind": "api",
535
+ "name": "tagaliases.list",
536
+ "operation": "list",
537
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
538
+ "path": "/tagaliases",
539
+ "method": "GET"
540
+ },
541
+ {
542
+ "kind": "api",
543
+ "name": "tagaliases.get",
544
+ "operation": "get",
545
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
546
+ "path": "/tagaliases/[id]",
547
+ "method": "GET"
548
+ },
549
+ {
550
+ "kind": "api",
551
+ "name": "tagaliases.create",
552
+ "operation": "create",
553
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
554
+ "path": "/tagaliases",
555
+ "method": "POST"
556
+ },
557
+ {
558
+ "kind": "api",
559
+ "name": "tagaliases.update",
560
+ "operation": "update",
561
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
562
+ "path": "/tagaliases/[id]",
563
+ "method": "PATCH"
564
+ },
565
+ {
566
+ "kind": "api",
567
+ "name": "tagaliases.delete",
568
+ "operation": "delete",
569
+ "objectName": "@happyvertical/smrt-tags:TagAlias",
570
+ "path": "/tagaliases/[id]",
571
+ "method": "DELETE"
572
+ },
573
+ {
574
+ "kind": "cli",
575
+ "name": "tagalias_list",
576
+ "operation": "list",
577
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
578
+ },
579
+ {
580
+ "kind": "cli",
581
+ "name": "tagalias_get",
582
+ "operation": "get",
583
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
584
+ },
585
+ {
586
+ "kind": "cli",
587
+ "name": "tagalias_create",
588
+ "operation": "create",
589
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
590
+ },
591
+ {
592
+ "kind": "cli",
593
+ "name": "tagalias_update",
594
+ "operation": "update",
595
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
596
+ },
597
+ {
598
+ "kind": "cli",
599
+ "name": "tagalias_delete",
600
+ "operation": "delete",
601
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
602
+ },
603
+ {
604
+ "kind": "mcp",
605
+ "name": "tagalias_list",
606
+ "operation": "list",
607
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
608
+ },
609
+ {
610
+ "kind": "mcp",
611
+ "name": "tagalias_get",
612
+ "operation": "get",
613
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
614
+ },
615
+ {
616
+ "kind": "mcp",
617
+ "name": "tagalias_create",
618
+ "operation": "create",
619
+ "objectName": "@happyvertical/smrt-tags:TagAlias"
620
+ },
621
+ {
622
+ "kind": "api",
623
+ "name": "tags.list",
624
+ "operation": "list",
625
+ "objectName": "@happyvertical/smrt-tags:Tag",
626
+ "path": "/tags",
627
+ "method": "GET"
628
+ },
629
+ {
630
+ "kind": "api",
631
+ "name": "tags.get",
632
+ "operation": "get",
633
+ "objectName": "@happyvertical/smrt-tags:Tag",
634
+ "path": "/tags/[id]",
635
+ "method": "GET"
636
+ },
637
+ {
638
+ "kind": "api",
639
+ "name": "tags.create",
640
+ "operation": "create",
641
+ "objectName": "@happyvertical/smrt-tags:Tag",
642
+ "path": "/tags",
643
+ "method": "POST"
644
+ },
645
+ {
646
+ "kind": "api",
647
+ "name": "tags.update",
648
+ "operation": "update",
649
+ "objectName": "@happyvertical/smrt-tags:Tag",
650
+ "path": "/tags/[id]",
651
+ "method": "PATCH"
652
+ },
653
+ {
654
+ "kind": "api",
655
+ "name": "tags.delete",
656
+ "operation": "delete",
657
+ "objectName": "@happyvertical/smrt-tags:Tag",
658
+ "path": "/tags/[id]",
659
+ "method": "DELETE"
660
+ },
661
+ {
662
+ "kind": "cli",
663
+ "name": "tag_list",
664
+ "operation": "list",
665
+ "objectName": "@happyvertical/smrt-tags:Tag"
666
+ },
667
+ {
668
+ "kind": "cli",
669
+ "name": "tag_get",
670
+ "operation": "get",
671
+ "objectName": "@happyvertical/smrt-tags:Tag"
672
+ },
673
+ {
674
+ "kind": "cli",
675
+ "name": "tag_create",
676
+ "operation": "create",
677
+ "objectName": "@happyvertical/smrt-tags:Tag"
678
+ },
679
+ {
680
+ "kind": "cli",
681
+ "name": "tag_update",
682
+ "operation": "update",
683
+ "objectName": "@happyvertical/smrt-tags:Tag"
684
+ },
685
+ {
686
+ "kind": "cli",
687
+ "name": "tag_delete",
688
+ "operation": "delete",
689
+ "objectName": "@happyvertical/smrt-tags:Tag"
690
+ },
691
+ {
692
+ "kind": "mcp",
693
+ "name": "tag_list",
694
+ "operation": "list",
695
+ "objectName": "@happyvertical/smrt-tags:Tag"
696
+ },
697
+ {
698
+ "kind": "mcp",
699
+ "name": "tag_get",
700
+ "operation": "get",
701
+ "objectName": "@happyvertical/smrt-tags:Tag"
702
+ },
703
+ {
704
+ "kind": "mcp",
705
+ "name": "tag_create",
706
+ "operation": "create",
707
+ "objectName": "@happyvertical/smrt-tags:Tag"
708
+ },
709
+ {
710
+ "kind": "mcp",
711
+ "name": "tag_update",
712
+ "operation": "update",
713
+ "objectName": "@happyvertical/smrt-tags:Tag"
714
+ }
715
+ ],
716
+ "prompts": [],
717
+ "relationshipsV2": {
718
+ "foreignKeyFields": 1,
719
+ "crossPackageRefFields": 0,
720
+ "junctionCollections": 0,
721
+ "hierarchicalObjects": 1,
722
+ "polymorphicAssociations": 0,
723
+ "uuidColumns": 7
724
+ },
725
+ "agentDoc": "# @happyvertical/smrt-tags\n\nHierarchical tagging with context-scoped slugs and multi-language aliases.\n\n## Models\n\n- **Tag** (STI, extends `SmrtHierarchical`): public identifier is `slug` (not UUID) + `context` (default: 'global'), but the hierarchy FK is `parentId` (UUID) since R3-B. `TagCollection.moveTag` / `mergeTag` / `getChildren` keep slug-string signatures and resolve to UUIDs internally. `level` is a denormalised depth recalculated on `moveTag`. Metadata JSON.\n- **TagAlias**: language-specific translations/aliases (ISO 639-1 `language` code, nullable). Optional context scoping.\n\n## Key Collection Methods\n\n- `getOrCreate(slug, options)`: auto-generates name from slug\n- `moveTag(slug, newParentSlug)`: circular reference detection, level recalculation\n- `mergeTag(sourceSlug, targetSlug)`: moves children + aliases from source to target, then deletes source\n- `cleanupUnused()`: only deletes tags with no children AND no aliases\n- `findWithGlobals(tenantId)`: tenant + global tags\n\n## Gotchas\n\n- **Slug stored in protected `_slug`**: has override getter/setter (not standard SmrtObject slug behavior)\n- **Context defaults to 'global'**: if not specified\n- **Optional tenancy** with nullable tenantId\n"
726
+ }