@happyvertical/smrt-properties 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,755 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-06-23T01:12:10.424Z",
4
+ "packageName": "@happyvertical/smrt-properties",
5
+ "packageVersion": "0.30.0",
6
+ "sourceManifestPath": "dist/manifest.json",
7
+ "agentDocPath": "AGENTS.md",
8
+ "sourceHashes": {
9
+ "manifest": "1d04799e77dfdcd2c1b29a8bf03747ef145db50734a64263706363efc37a87fa",
10
+ "packageJson": "3fc487fb99c43218477083c6705906c44c060d3f650bc105882defefce5a2916",
11
+ "agents": "a0f6fb35fa6c32a8c94158511c5f1722e1a96c2fcc01e790ec4b424d02845743"
12
+ },
13
+ "exports": [
14
+ ".",
15
+ "./manifest",
16
+ "./manifest.json"
17
+ ],
18
+ "dependencies": {
19
+ "@happyvertical/smrt-core": "workspace:*",
20
+ "@happyvertical/smrt-prompts": "workspace:*",
21
+ "@happyvertical/smrt-tenancy": "workspace:*",
22
+ "@happyvertical/smrt-cli": "workspace:*",
23
+ "@happyvertical/smrt-vitest": "workspace:*",
24
+ "@happyvertical/sql": "catalog:",
25
+ "@types/node": "25.0.9",
26
+ "fast-glob": "3.3.3",
27
+ "typescript": "^5.9.3",
28
+ "vite": "^7.3.1",
29
+ "vitest": "^4.0.17"
30
+ },
31
+ "smrtDependencies": [
32
+ "@happyvertical/smrt-cli",
33
+ "@happyvertical/smrt-core",
34
+ "@happyvertical/smrt-prompts",
35
+ "@happyvertical/smrt-tenancy",
36
+ "@happyvertical/smrt-vitest"
37
+ ],
38
+ "sdkDependencies": [
39
+ "@happyvertical/sql"
40
+ ],
41
+ "tags": [],
42
+ "risks": [],
43
+ "objects": [
44
+ {
45
+ "name": "PropertyCollection",
46
+ "qualifiedName": "@happyvertical/smrt-properties:PropertyCollection",
47
+ "collection": "properties",
48
+ "tableName": "property_collections",
49
+ "packageName": "@happyvertical/smrt-properties",
50
+ "extends": "SmrtCollection",
51
+ "fields": [],
52
+ "relationships": [],
53
+ "methods": [
54
+ "countByStatus",
55
+ "findActive",
56
+ "findByDomain",
57
+ "findByOwner",
58
+ "findByRepository",
59
+ "findByStatus",
60
+ "findByTenant",
61
+ "findGlobal",
62
+ "findWithGlobals",
63
+ "getOrCreateByDomain"
64
+ ],
65
+ "surfaces": [],
66
+ "relationshipFeatures": [
67
+ "uuidColumns"
68
+ ],
69
+ "tags": [],
70
+ "risks": []
71
+ },
72
+ {
73
+ "name": "ZoneCollection",
74
+ "qualifiedName": "@happyvertical/smrt-properties:ZoneCollection",
75
+ "collection": "zones",
76
+ "tableName": "zone_collections",
77
+ "packageName": "@happyvertical/smrt-properties",
78
+ "extends": "SmrtCollection",
79
+ "fields": [],
80
+ "relationships": [],
81
+ "methods": [
82
+ "deleteZone",
83
+ "findByAllowedFormat",
84
+ "findByDimensions",
85
+ "findByPath",
86
+ "findByProperty",
87
+ "findByTenant",
88
+ "findByType",
89
+ "findChildren",
90
+ "findGlobal",
91
+ "findTopLevel",
92
+ "findWithGlobals",
93
+ "getAncestors",
94
+ "getDescendants",
95
+ "getMaxDepth",
96
+ "getTree",
97
+ "moveZone"
98
+ ],
99
+ "surfaces": [],
100
+ "relationshipFeatures": [
101
+ "uuidColumns"
102
+ ],
103
+ "tags": [],
104
+ "risks": []
105
+ },
106
+ {
107
+ "name": "Property",
108
+ "qualifiedName": "@happyvertical/smrt-properties:Property",
109
+ "collection": "properties",
110
+ "tableName": "properties",
111
+ "packageName": "@happyvertical/smrt-properties",
112
+ "extends": "SmrtObject",
113
+ "fields": [
114
+ {
115
+ "name": "created_at",
116
+ "type": "datetime",
117
+ "required": false,
118
+ "columnType": "TIMESTAMP"
119
+ },
120
+ {
121
+ "name": "updated_at",
122
+ "type": "datetime",
123
+ "required": false,
124
+ "columnType": "TIMESTAMP"
125
+ },
126
+ {
127
+ "name": "tenantId",
128
+ "type": "text",
129
+ "required": false,
130
+ "columnType": "UUID"
131
+ },
132
+ {
133
+ "name": "name",
134
+ "type": "text",
135
+ "required": false,
136
+ "columnType": "TEXT"
137
+ },
138
+ {
139
+ "name": "domain",
140
+ "type": "text",
141
+ "required": false,
142
+ "columnType": "TEXT"
143
+ },
144
+ {
145
+ "name": "url",
146
+ "type": "text",
147
+ "required": false,
148
+ "columnType": "TEXT"
149
+ },
150
+ {
151
+ "name": "description",
152
+ "type": "text",
153
+ "required": false,
154
+ "columnType": "TEXT"
155
+ },
156
+ {
157
+ "name": "repositoryId",
158
+ "type": "crossPackageRef",
159
+ "required": false,
160
+ "related": "@happyvertical/smrt-projects:Repository",
161
+ "columnType": "UUID"
162
+ },
163
+ {
164
+ "name": "ownerId",
165
+ "type": "crossPackageRef",
166
+ "required": false,
167
+ "related": "@happyvertical/smrt-profiles:Profile",
168
+ "columnType": "UUID"
169
+ },
170
+ {
171
+ "name": "status",
172
+ "type": "text",
173
+ "required": false,
174
+ "columnType": "TEXT"
175
+ },
176
+ {
177
+ "name": "metadata",
178
+ "type": "json",
179
+ "required": false,
180
+ "columnType": "JSON"
181
+ }
182
+ ],
183
+ "relationships": [
184
+ {
185
+ "name": "repositoryId",
186
+ "type": "crossPackageRef",
187
+ "required": false,
188
+ "related": "@happyvertical/smrt-projects:Repository",
189
+ "columnType": "UUID"
190
+ },
191
+ {
192
+ "name": "ownerId",
193
+ "type": "crossPackageRef",
194
+ "required": false,
195
+ "related": "@happyvertical/smrt-profiles:Profile",
196
+ "columnType": "UUID"
197
+ }
198
+ ],
199
+ "methods": [
200
+ "classifyConstraintError",
201
+ "clearEmbeddings",
202
+ "createZone",
203
+ "delete",
204
+ "describe",
205
+ "destroy",
206
+ "do",
207
+ "executeToolCall",
208
+ "forget",
209
+ "forgetScope",
210
+ "generateEmbeddings",
211
+ "getAiUsageSnapshot",
212
+ "getAvailableTools",
213
+ "getEmbedding",
214
+ "getFields",
215
+ "getId",
216
+ "getRelated",
217
+ "getSavedId",
218
+ "getSlug",
219
+ "getZoneTree",
220
+ "getZones",
221
+ "hasStaleEmbeddings",
222
+ "initialize",
223
+ "is",
224
+ "isActive",
225
+ "isRelatedLoaded",
226
+ "isSaved",
227
+ "listAiUsage",
228
+ "loadDataFromDb",
229
+ "loadFromId",
230
+ "loadFromSlug",
231
+ "loadRelated",
232
+ "loadRelatedMany",
233
+ "markAsPersisted",
234
+ "recall",
235
+ "recallAll",
236
+ "remember",
237
+ "resetAiUsage",
238
+ "save",
239
+ "summarize",
240
+ "summarizeAiUsage",
241
+ "toJSON",
242
+ "toPlainObject",
243
+ "toPublicJSON"
244
+ ],
245
+ "surfaces": [
246
+ {
247
+ "kind": "api",
248
+ "name": "properties.list",
249
+ "operation": "list",
250
+ "objectName": "@happyvertical/smrt-properties:Property",
251
+ "path": "/properties",
252
+ "method": "GET"
253
+ },
254
+ {
255
+ "kind": "api",
256
+ "name": "properties.get",
257
+ "operation": "get",
258
+ "objectName": "@happyvertical/smrt-properties:Property",
259
+ "path": "/properties/[id]",
260
+ "method": "GET"
261
+ },
262
+ {
263
+ "kind": "api",
264
+ "name": "properties.create",
265
+ "operation": "create",
266
+ "objectName": "@happyvertical/smrt-properties:Property",
267
+ "path": "/properties",
268
+ "method": "POST"
269
+ },
270
+ {
271
+ "kind": "api",
272
+ "name": "properties.update",
273
+ "operation": "update",
274
+ "objectName": "@happyvertical/smrt-properties:Property",
275
+ "path": "/properties/[id]",
276
+ "method": "PATCH"
277
+ },
278
+ {
279
+ "kind": "api",
280
+ "name": "properties.delete",
281
+ "operation": "delete",
282
+ "objectName": "@happyvertical/smrt-properties:Property",
283
+ "path": "/properties/[id]",
284
+ "method": "DELETE"
285
+ },
286
+ {
287
+ "kind": "cli",
288
+ "name": "property_list",
289
+ "operation": "list",
290
+ "objectName": "@happyvertical/smrt-properties:Property"
291
+ },
292
+ {
293
+ "kind": "cli",
294
+ "name": "property_get",
295
+ "operation": "get",
296
+ "objectName": "@happyvertical/smrt-properties:Property"
297
+ },
298
+ {
299
+ "kind": "cli",
300
+ "name": "property_create",
301
+ "operation": "create",
302
+ "objectName": "@happyvertical/smrt-properties:Property"
303
+ },
304
+ {
305
+ "kind": "cli",
306
+ "name": "property_update",
307
+ "operation": "update",
308
+ "objectName": "@happyvertical/smrt-properties:Property"
309
+ },
310
+ {
311
+ "kind": "cli",
312
+ "name": "property_delete",
313
+ "operation": "delete",
314
+ "objectName": "@happyvertical/smrt-properties:Property"
315
+ },
316
+ {
317
+ "kind": "mcp",
318
+ "name": "property_list",
319
+ "operation": "list",
320
+ "objectName": "@happyvertical/smrt-properties:Property"
321
+ },
322
+ {
323
+ "kind": "mcp",
324
+ "name": "property_get",
325
+ "operation": "get",
326
+ "objectName": "@happyvertical/smrt-properties:Property"
327
+ },
328
+ {
329
+ "kind": "mcp",
330
+ "name": "property_create",
331
+ "operation": "create",
332
+ "objectName": "@happyvertical/smrt-properties:Property"
333
+ }
334
+ ],
335
+ "relationshipFeatures": [
336
+ "crossPackageRef",
337
+ "uuidColumns"
338
+ ],
339
+ "tags": [],
340
+ "risks": []
341
+ },
342
+ {
343
+ "name": "Zone",
344
+ "qualifiedName": "@happyvertical/smrt-properties:Zone",
345
+ "collection": "zones",
346
+ "tableName": "zones",
347
+ "packageName": "@happyvertical/smrt-properties",
348
+ "extends": "SmrtHierarchical",
349
+ "fields": [
350
+ {
351
+ "name": "parentId",
352
+ "type": "foreignKey",
353
+ "required": false,
354
+ "related": "Zone",
355
+ "columnType": "UUID"
356
+ },
357
+ {
358
+ "name": "tenantId",
359
+ "type": "text",
360
+ "required": false,
361
+ "columnType": "UUID"
362
+ },
363
+ {
364
+ "name": "propertyId",
365
+ "type": "foreignKey",
366
+ "required": false,
367
+ "related": "Property",
368
+ "columnType": "UUID"
369
+ },
370
+ {
371
+ "name": "name",
372
+ "type": "text",
373
+ "required": false,
374
+ "columnType": "TEXT"
375
+ },
376
+ {
377
+ "name": "type",
378
+ "type": "text",
379
+ "required": false,
380
+ "columnType": "TEXT"
381
+ },
382
+ {
383
+ "name": "path",
384
+ "type": "text",
385
+ "required": false,
386
+ "columnType": "TEXT"
387
+ },
388
+ {
389
+ "name": "selector",
390
+ "type": "text",
391
+ "required": false,
392
+ "columnType": "TEXT"
393
+ },
394
+ {
395
+ "name": "position",
396
+ "type": "text",
397
+ "required": false,
398
+ "columnType": "TEXT"
399
+ },
400
+ {
401
+ "name": "width",
402
+ "type": "integer",
403
+ "required": false,
404
+ "columnType": "INTEGER"
405
+ },
406
+ {
407
+ "name": "height",
408
+ "type": "integer",
409
+ "required": false,
410
+ "columnType": "INTEGER"
411
+ },
412
+ {
413
+ "name": "allowedFormats",
414
+ "type": "json",
415
+ "required": false,
416
+ "columnType": "JSON"
417
+ },
418
+ {
419
+ "name": "defaultContentId",
420
+ "type": "text",
421
+ "required": false,
422
+ "columnType": "TEXT"
423
+ },
424
+ {
425
+ "name": "metadata",
426
+ "type": "json",
427
+ "required": false,
428
+ "columnType": "JSON"
429
+ }
430
+ ],
431
+ "relationships": [
432
+ {
433
+ "name": "parentId",
434
+ "type": "foreignKey",
435
+ "required": false,
436
+ "related": "Zone",
437
+ "columnType": "UUID"
438
+ },
439
+ {
440
+ "name": "propertyId",
441
+ "type": "foreignKey",
442
+ "required": false,
443
+ "related": "Property",
444
+ "columnType": "UUID"
445
+ }
446
+ ],
447
+ "methods": [
448
+ "createChild",
449
+ "getAncestors",
450
+ "getChildren",
451
+ "getDepth",
452
+ "getDescendants",
453
+ "getDimensionString",
454
+ "getFullPath",
455
+ "getHierarchy",
456
+ "getParent",
457
+ "getProperty",
458
+ "hasDimensions",
459
+ "isFormatAllowed",
460
+ "isTopLevel",
461
+ "moveTo",
462
+ "toTreeNode"
463
+ ],
464
+ "surfaces": [
465
+ {
466
+ "kind": "api",
467
+ "name": "zones.list",
468
+ "operation": "list",
469
+ "objectName": "@happyvertical/smrt-properties:Zone",
470
+ "path": "/zones",
471
+ "method": "GET"
472
+ },
473
+ {
474
+ "kind": "api",
475
+ "name": "zones.get",
476
+ "operation": "get",
477
+ "objectName": "@happyvertical/smrt-properties:Zone",
478
+ "path": "/zones/[id]",
479
+ "method": "GET"
480
+ },
481
+ {
482
+ "kind": "api",
483
+ "name": "zones.create",
484
+ "operation": "create",
485
+ "objectName": "@happyvertical/smrt-properties:Zone",
486
+ "path": "/zones",
487
+ "method": "POST"
488
+ },
489
+ {
490
+ "kind": "api",
491
+ "name": "zones.update",
492
+ "operation": "update",
493
+ "objectName": "@happyvertical/smrt-properties:Zone",
494
+ "path": "/zones/[id]",
495
+ "method": "PATCH"
496
+ },
497
+ {
498
+ "kind": "api",
499
+ "name": "zones.delete",
500
+ "operation": "delete",
501
+ "objectName": "@happyvertical/smrt-properties:Zone",
502
+ "path": "/zones/[id]",
503
+ "method": "DELETE"
504
+ },
505
+ {
506
+ "kind": "cli",
507
+ "name": "zone_list",
508
+ "operation": "list",
509
+ "objectName": "@happyvertical/smrt-properties:Zone"
510
+ },
511
+ {
512
+ "kind": "cli",
513
+ "name": "zone_get",
514
+ "operation": "get",
515
+ "objectName": "@happyvertical/smrt-properties:Zone"
516
+ },
517
+ {
518
+ "kind": "cli",
519
+ "name": "zone_create",
520
+ "operation": "create",
521
+ "objectName": "@happyvertical/smrt-properties:Zone"
522
+ },
523
+ {
524
+ "kind": "cli",
525
+ "name": "zone_update",
526
+ "operation": "update",
527
+ "objectName": "@happyvertical/smrt-properties:Zone"
528
+ },
529
+ {
530
+ "kind": "cli",
531
+ "name": "zone_delete",
532
+ "operation": "delete",
533
+ "objectName": "@happyvertical/smrt-properties:Zone"
534
+ },
535
+ {
536
+ "kind": "mcp",
537
+ "name": "zone_list",
538
+ "operation": "list",
539
+ "objectName": "@happyvertical/smrt-properties:Zone"
540
+ },
541
+ {
542
+ "kind": "mcp",
543
+ "name": "zone_get",
544
+ "operation": "get",
545
+ "objectName": "@happyvertical/smrt-properties:Zone"
546
+ },
547
+ {
548
+ "kind": "mcp",
549
+ "name": "zone_create",
550
+ "operation": "create",
551
+ "objectName": "@happyvertical/smrt-properties:Zone"
552
+ }
553
+ ],
554
+ "relationshipFeatures": [
555
+ "SmrtHierarchical",
556
+ "foreignKey",
557
+ "uuidColumns"
558
+ ],
559
+ "tags": [],
560
+ "risks": []
561
+ }
562
+ ],
563
+ "surfaces": [
564
+ {
565
+ "kind": "api",
566
+ "name": "properties.list",
567
+ "operation": "list",
568
+ "objectName": "@happyvertical/smrt-properties:Property",
569
+ "path": "/properties",
570
+ "method": "GET"
571
+ },
572
+ {
573
+ "kind": "api",
574
+ "name": "properties.get",
575
+ "operation": "get",
576
+ "objectName": "@happyvertical/smrt-properties:Property",
577
+ "path": "/properties/[id]",
578
+ "method": "GET"
579
+ },
580
+ {
581
+ "kind": "api",
582
+ "name": "properties.create",
583
+ "operation": "create",
584
+ "objectName": "@happyvertical/smrt-properties:Property",
585
+ "path": "/properties",
586
+ "method": "POST"
587
+ },
588
+ {
589
+ "kind": "api",
590
+ "name": "properties.update",
591
+ "operation": "update",
592
+ "objectName": "@happyvertical/smrt-properties:Property",
593
+ "path": "/properties/[id]",
594
+ "method": "PATCH"
595
+ },
596
+ {
597
+ "kind": "api",
598
+ "name": "properties.delete",
599
+ "operation": "delete",
600
+ "objectName": "@happyvertical/smrt-properties:Property",
601
+ "path": "/properties/[id]",
602
+ "method": "DELETE"
603
+ },
604
+ {
605
+ "kind": "cli",
606
+ "name": "property_list",
607
+ "operation": "list",
608
+ "objectName": "@happyvertical/smrt-properties:Property"
609
+ },
610
+ {
611
+ "kind": "cli",
612
+ "name": "property_get",
613
+ "operation": "get",
614
+ "objectName": "@happyvertical/smrt-properties:Property"
615
+ },
616
+ {
617
+ "kind": "cli",
618
+ "name": "property_create",
619
+ "operation": "create",
620
+ "objectName": "@happyvertical/smrt-properties:Property"
621
+ },
622
+ {
623
+ "kind": "cli",
624
+ "name": "property_update",
625
+ "operation": "update",
626
+ "objectName": "@happyvertical/smrt-properties:Property"
627
+ },
628
+ {
629
+ "kind": "cli",
630
+ "name": "property_delete",
631
+ "operation": "delete",
632
+ "objectName": "@happyvertical/smrt-properties:Property"
633
+ },
634
+ {
635
+ "kind": "mcp",
636
+ "name": "property_list",
637
+ "operation": "list",
638
+ "objectName": "@happyvertical/smrt-properties:Property"
639
+ },
640
+ {
641
+ "kind": "mcp",
642
+ "name": "property_get",
643
+ "operation": "get",
644
+ "objectName": "@happyvertical/smrt-properties:Property"
645
+ },
646
+ {
647
+ "kind": "mcp",
648
+ "name": "property_create",
649
+ "operation": "create",
650
+ "objectName": "@happyvertical/smrt-properties:Property"
651
+ },
652
+ {
653
+ "kind": "api",
654
+ "name": "zones.list",
655
+ "operation": "list",
656
+ "objectName": "@happyvertical/smrt-properties:Zone",
657
+ "path": "/zones",
658
+ "method": "GET"
659
+ },
660
+ {
661
+ "kind": "api",
662
+ "name": "zones.get",
663
+ "operation": "get",
664
+ "objectName": "@happyvertical/smrt-properties:Zone",
665
+ "path": "/zones/[id]",
666
+ "method": "GET"
667
+ },
668
+ {
669
+ "kind": "api",
670
+ "name": "zones.create",
671
+ "operation": "create",
672
+ "objectName": "@happyvertical/smrt-properties:Zone",
673
+ "path": "/zones",
674
+ "method": "POST"
675
+ },
676
+ {
677
+ "kind": "api",
678
+ "name": "zones.update",
679
+ "operation": "update",
680
+ "objectName": "@happyvertical/smrt-properties:Zone",
681
+ "path": "/zones/[id]",
682
+ "method": "PATCH"
683
+ },
684
+ {
685
+ "kind": "api",
686
+ "name": "zones.delete",
687
+ "operation": "delete",
688
+ "objectName": "@happyvertical/smrt-properties:Zone",
689
+ "path": "/zones/[id]",
690
+ "method": "DELETE"
691
+ },
692
+ {
693
+ "kind": "cli",
694
+ "name": "zone_list",
695
+ "operation": "list",
696
+ "objectName": "@happyvertical/smrt-properties:Zone"
697
+ },
698
+ {
699
+ "kind": "cli",
700
+ "name": "zone_get",
701
+ "operation": "get",
702
+ "objectName": "@happyvertical/smrt-properties:Zone"
703
+ },
704
+ {
705
+ "kind": "cli",
706
+ "name": "zone_create",
707
+ "operation": "create",
708
+ "objectName": "@happyvertical/smrt-properties:Zone"
709
+ },
710
+ {
711
+ "kind": "cli",
712
+ "name": "zone_update",
713
+ "operation": "update",
714
+ "objectName": "@happyvertical/smrt-properties:Zone"
715
+ },
716
+ {
717
+ "kind": "cli",
718
+ "name": "zone_delete",
719
+ "operation": "delete",
720
+ "objectName": "@happyvertical/smrt-properties:Zone"
721
+ },
722
+ {
723
+ "kind": "mcp",
724
+ "name": "zone_list",
725
+ "operation": "list",
726
+ "objectName": "@happyvertical/smrt-properties:Zone"
727
+ },
728
+ {
729
+ "kind": "mcp",
730
+ "name": "zone_get",
731
+ "operation": "get",
732
+ "objectName": "@happyvertical/smrt-properties:Zone"
733
+ },
734
+ {
735
+ "kind": "mcp",
736
+ "name": "zone_create",
737
+ "operation": "create",
738
+ "objectName": "@happyvertical/smrt-properties:Zone"
739
+ }
740
+ ],
741
+ "prompts": [
742
+ {
743
+ "filePath": "src/prompts.ts"
744
+ }
745
+ ],
746
+ "relationshipsV2": {
747
+ "foreignKeyFields": 2,
748
+ "crossPackageRefFields": 2,
749
+ "junctionCollections": 0,
750
+ "hierarchicalObjects": 1,
751
+ "polymorphicAssociations": 0,
752
+ "uuidColumns": 10
753
+ },
754
+ "agentDoc": "# @happyvertical/smrt-properties\n\nDigital properties (websites, apps) with hierarchical zones for content/ad placement.\n\n## Models\n\n- **Property** (STI): `domain`, `url`, optional repository/owner links. Status: active/inactive/pending. Methods dynamically import/create ZoneCollection for lazy loading.\n- **Zone**: hierarchical via `parentId`. `path`/`selector`/`dimensions` for placement. `allowedFormats` array. Tree operations: `getAncestors()`, `getDescendants()`, `getFullPath()`, `moveZone()` (with cycle detection).\n\n## ZoneCollection Key Methods\n\n`getTree()` (builds nested structure), `moveZone()` (validates against descendant cycles), `deleteZone(cascade?)` (cascade=false orphans children to parent), `findWithGlobals(tenantId)`.\n\nIn-memory depth caching prevents N+1 queries during tree operations.\n\n## Property Key Methods\n\n- `getZones()` / `getZoneTree()` / `createZone()` — ZoneCollection wrappers loaded lazily via dynamic import.\n- `isActive()` — convenience status check.\n- AI: `summarize()` (uses `smrtProperties.property.summarize` prompt via `@happyvertical/smrt-prompts`).\n\n## Prompt Registry\n\n`Property.summarize()` is registered with `@happyvertical/smrt-prompts` so tenants can override the template/model/params at runtime:\n\n```typescript\nimport { smrtPropertiesSummarizePrompt } from '@happyvertical/smrt-properties';\n// key: 'smrtProperties.property.summarize'\n```\n\nOnly non-PII fields are passed to the AI provider: `name`, `domain`, `description`, `status`, plus aggregate zone information (count + top-level zone names). Internal foreign-key fields (`ownerId`, `repositoryId`, `tenantId`) and the extensible `metadata` blob are intentionally excluded — `metadata` may contain analytics IDs or tenant-private configuration.\n\n## Gotchas\n\n- **Empty allowedFormats = all formats**: empty array means no restrictions, not no formats\n- **Zone dimensions nullable independently**: check `hasDimensions()` before using width/height\n- **deleteZone(cascade=false)**: doesn't delete children — moves them to parent (orphan pattern)\n- **Optional tenancy** on both models\n"
755
+ }