@happyvertical/smrt-education 0.57.41 → 0.57.43

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.
Files changed (38) hide show
  1. package/AGENTS.md +8 -0
  2. package/README.md +10 -0
  3. package/agents/group-sharing.md +278 -0
  4. package/agents/submission-service.md +10 -0
  5. package/dist/chunks/{workbook-photo-service-D5DUgh-C.js → workbook-photo-service-C6mbUUp6.js} +196 -65
  6. package/dist/chunks/workbook-photo-service-C6mbUUp6.js.map +1 -0
  7. package/dist/group-sharing-authorization.d.ts +67 -0
  8. package/dist/group-sharing-authorization.d.ts.map +1 -0
  9. package/dist/group-sharing-comments.d.ts +30 -0
  10. package/dist/group-sharing-comments.d.ts.map +1 -0
  11. package/dist/group-sharing-contracts.d.ts +201 -0
  12. package/dist/group-sharing-contracts.d.ts.map +1 -0
  13. package/dist/group-sharing-hash.d.ts +3 -0
  14. package/dist/group-sharing-hash.d.ts.map +1 -0
  15. package/dist/group-sharing-models.d.ts +106 -0
  16. package/dist/group-sharing-models.d.ts.map +1 -0
  17. package/dist/group-sharing-policy.d.ts +19 -0
  18. package/dist/group-sharing-policy.d.ts.map +1 -0
  19. package/dist/group-sharing-reader.d.ts +45 -0
  20. package/dist/group-sharing-reader.d.ts.map +1 -0
  21. package/dist/group-sharing-service.d.ts +108 -0
  22. package/dist/group-sharing-service.d.ts.map +1 -0
  23. package/dist/group-sharing-workspace.d.ts +10 -0
  24. package/dist/group-sharing-workspace.d.ts.map +1 -0
  25. package/dist/index.d.ts +8 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2032 -69
  28. package/dist/index.js.map +1 -1
  29. package/dist/ingestion.js +1 -1
  30. package/dist/manifest.json +2728 -1
  31. package/dist/recipes.d.ts +24 -0
  32. package/dist/recipes.d.ts.map +1 -1
  33. package/dist/smrt-knowledge.json +1073 -12
  34. package/dist/submission-service.d.ts +2 -0
  35. package/dist/submission-service.d.ts.map +1 -1
  36. package/dist/workbook-service.d.ts.map +1 -1
  37. package/package.json +9 -9
  38. package/dist/chunks/workbook-photo-service-D5DUgh-C.js.map +0 -1
@@ -2,7 +2,7 @@
2
2
  "version": "1.0.0",
3
3
  "timestamp": 0,
4
4
  "packageName": "@happyvertical/smrt-education",
5
- "packageVersion": "0.57.41",
5
+ "packageVersion": "0.57.43",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-education:CatalogProviderCollection": {
8
8
  "name": "catalogprovidercollection",
@@ -9785,6 +9785,2688 @@
9785
9785
  },
9786
9786
  "importPath": "@happyvertical/smrt-education"
9787
9787
  },
9788
+ "@happyvertical/smrt-education:EducationGroup": {
9789
+ "name": "educationgroup",
9790
+ "className": "EducationGroup",
9791
+ "qualifiedName": "@happyvertical/smrt-education:EducationGroup",
9792
+ "collection": "educationgroups",
9793
+ "description": "Independent group tenant metadata; no family authority is implied.",
9794
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
9795
+ "packageName": "@happyvertical/smrt-education",
9796
+ "fields": {
9797
+ "tenantId": {
9798
+ "type": "text",
9799
+ "required": true,
9800
+ "_meta": {
9801
+ "sqlType": "UUID",
9802
+ "__tenancy": {
9803
+ "isTenantIdField": true,
9804
+ "autoFilter": true,
9805
+ "required": true,
9806
+ "autoPopulate": true,
9807
+ "nullable": false,
9808
+ "mode": "required",
9809
+ "field": "tenantId",
9810
+ "allowSuperAdminBypass": false
9811
+ }
9812
+ }
9813
+ },
9814
+ "name": {
9815
+ "type": "text",
9816
+ "required": false
9817
+ },
9818
+ "active": {
9819
+ "type": "boolean",
9820
+ "required": true,
9821
+ "default": true
9822
+ },
9823
+ "creatorUserId": {
9824
+ "type": "crossPackageRef",
9825
+ "required": true,
9826
+ "related": "@happyvertical/smrt-users:User"
9827
+ },
9828
+ "creatorProfileId": {
9829
+ "type": "crossPackageRef",
9830
+ "required": true,
9831
+ "related": "@happyvertical/smrt-profiles:Profile"
9832
+ }
9833
+ },
9834
+ "methods": {
9835
+ "save": {
9836
+ "name": "save",
9837
+ "async": true,
9838
+ "parameters": [
9839
+ {
9840
+ "name": "options",
9841
+ "type": "SmrtSaveOptions",
9842
+ "optional": true
9843
+ }
9844
+ ],
9845
+ "returnType": "Promise<this>",
9846
+ "isStatic": false,
9847
+ "isPublic": true
9848
+ },
9849
+ "delete": {
9850
+ "name": "delete",
9851
+ "async": true,
9852
+ "parameters": [],
9853
+ "returnType": "Promise<void>",
9854
+ "isStatic": false,
9855
+ "isPublic": true
9856
+ }
9857
+ },
9858
+ "decoratorConfig": {
9859
+ "tableName": "education_groups",
9860
+ "conflictColumns": [
9861
+ "tenant_id"
9862
+ ],
9863
+ "api": false,
9864
+ "mcp": false,
9865
+ "cli": false,
9866
+ "ai": {
9867
+ "callable": []
9868
+ },
9869
+ "tenantScoped": {
9870
+ "mode": "required"
9871
+ }
9872
+ },
9873
+ "extends": "SmrtObject",
9874
+ "exportName": "EducationGroup",
9875
+ "collectionExportName": "EducationGroupCollection",
9876
+ "displayLabelField": "name",
9877
+ "validationRules": [
9878
+ {
9879
+ "field": "active",
9880
+ "rule": "required",
9881
+ "fieldType": "boolean"
9882
+ },
9883
+ {
9884
+ "field": "creatorUserId",
9885
+ "rule": "required",
9886
+ "fieldType": "crossPackageRef"
9887
+ },
9888
+ {
9889
+ "field": "creatorProfileId",
9890
+ "rule": "required",
9891
+ "fieldType": "crossPackageRef"
9892
+ }
9893
+ ],
9894
+ "schema": {
9895
+ "tableName": "education_groups",
9896
+ "ddl": "CREATE TABLE IF NOT EXISTS \"education_groups\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"name\" TEXT,\n \"active\" BOOLEAN NOT NULL DEFAULT TRUE,\n \"creator_user_id\" UUID NOT NULL,\n \"creator_profile_id\" UUID NOT NULL\n);",
9897
+ "columns": {
9898
+ "id": {
9899
+ "type": "UUID",
9900
+ "primaryKey": true,
9901
+ "referenceKind": "id",
9902
+ "notNull": true
9903
+ },
9904
+ "slug": {
9905
+ "type": "TEXT",
9906
+ "notNull": true
9907
+ },
9908
+ "context": {
9909
+ "type": "TEXT",
9910
+ "notNull": true,
9911
+ "default": ""
9912
+ },
9913
+ "created_at": {
9914
+ "type": "TIMESTAMP",
9915
+ "notNull": true,
9916
+ "default": "current_timestamp"
9917
+ },
9918
+ "updated_at": {
9919
+ "type": "TIMESTAMP",
9920
+ "notNull": true,
9921
+ "default": "current_timestamp"
9922
+ },
9923
+ "tenant_id": {
9924
+ "type": "UUID",
9925
+ "referenceKind": "tenantId",
9926
+ "notNull": true,
9927
+ "unique": false
9928
+ },
9929
+ "name": {
9930
+ "type": "TEXT",
9931
+ "notNull": false,
9932
+ "unique": false
9933
+ },
9934
+ "active": {
9935
+ "type": "BOOLEAN",
9936
+ "notNull": true,
9937
+ "unique": false,
9938
+ "default": true
9939
+ },
9940
+ "creator_user_id": {
9941
+ "type": "UUID",
9942
+ "referenceKind": "crossPackageRef",
9943
+ "notNull": true,
9944
+ "unique": false
9945
+ },
9946
+ "creator_profile_id": {
9947
+ "type": "UUID",
9948
+ "referenceKind": "crossPackageRef",
9949
+ "notNull": true,
9950
+ "unique": false
9951
+ }
9952
+ },
9953
+ "indexes": [
9954
+ {
9955
+ "name": "education_groups_tenant_id_idx",
9956
+ "columns": [
9957
+ "tenant_id"
9958
+ ],
9959
+ "unique": true
9960
+ },
9961
+ {
9962
+ "name": "education_groups_slug_context_idx",
9963
+ "columns": [
9964
+ "slug",
9965
+ "context"
9966
+ ]
9967
+ },
9968
+ {
9969
+ "name": "education_groups_tenant_id_created_at_idx",
9970
+ "columns": [
9971
+ "tenant_id",
9972
+ "created_at"
9973
+ ]
9974
+ },
9975
+ {
9976
+ "name": "education_groups_creator_user_id_idx",
9977
+ "columns": [
9978
+ "creator_user_id"
9979
+ ]
9980
+ },
9981
+ {
9982
+ "name": "education_groups_creator_profile_id_idx",
9983
+ "columns": [
9984
+ "creator_profile_id"
9985
+ ]
9986
+ }
9987
+ ],
9988
+ "version": "6e17e39b"
9989
+ },
9990
+ "importPath": "@happyvertical/smrt-education"
9991
+ },
9992
+ "@happyvertical/smrt-education:EducationGroupCollection": {
9993
+ "name": "educationgroupcollection",
9994
+ "className": "EducationGroupCollection",
9995
+ "qualifiedName": "@happyvertical/smrt-education:EducationGroupCollection",
9996
+ "collection": "educationgroups",
9997
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
9998
+ "packageName": "@happyvertical/smrt-education",
9999
+ "fields": {},
10000
+ "methods": {},
10001
+ "decoratorConfig": {
10002
+ "tableName": "education_groups",
10003
+ "api": false,
10004
+ "mcp": false,
10005
+ "cli": false
10006
+ },
10007
+ "extends": "SmrtCollection",
10008
+ "extendsTypeArg": "EducationGroup",
10009
+ "exportName": "EducationGroupCollection",
10010
+ "collectionExportName": "EducationGroupCollectionCollection",
10011
+ "schema": {
10012
+ "tableName": "education_groups",
10013
+ "ddl": "CREATE TABLE IF NOT EXISTS \"education_groups\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"name\" TEXT,\n \"active\" BOOLEAN NOT NULL DEFAULT TRUE,\n \"creator_user_id\" UUID NOT NULL,\n \"creator_profile_id\" UUID NOT NULL\n);",
10014
+ "columns": {
10015
+ "id": {
10016
+ "type": "UUID",
10017
+ "primaryKey": true,
10018
+ "referenceKind": "id",
10019
+ "notNull": true
10020
+ },
10021
+ "slug": {
10022
+ "type": "TEXT",
10023
+ "notNull": true
10024
+ },
10025
+ "context": {
10026
+ "type": "TEXT",
10027
+ "notNull": true,
10028
+ "default": ""
10029
+ },
10030
+ "created_at": {
10031
+ "type": "TIMESTAMP",
10032
+ "notNull": true,
10033
+ "default": "current_timestamp"
10034
+ },
10035
+ "updated_at": {
10036
+ "type": "TIMESTAMP",
10037
+ "notNull": true,
10038
+ "default": "current_timestamp"
10039
+ },
10040
+ "tenant_id": {
10041
+ "type": "UUID",
10042
+ "referenceKind": "tenantId",
10043
+ "notNull": true,
10044
+ "unique": false
10045
+ },
10046
+ "name": {
10047
+ "type": "TEXT",
10048
+ "notNull": false,
10049
+ "unique": false
10050
+ },
10051
+ "active": {
10052
+ "type": "BOOLEAN",
10053
+ "notNull": true,
10054
+ "unique": false,
10055
+ "default": true
10056
+ },
10057
+ "creator_user_id": {
10058
+ "type": "UUID",
10059
+ "referenceKind": "crossPackageRef",
10060
+ "notNull": true,
10061
+ "unique": false
10062
+ },
10063
+ "creator_profile_id": {
10064
+ "type": "UUID",
10065
+ "referenceKind": "crossPackageRef",
10066
+ "notNull": true,
10067
+ "unique": false
10068
+ }
10069
+ },
10070
+ "indexes": [
10071
+ {
10072
+ "name": "education_groups_tenant_id_idx",
10073
+ "columns": [
10074
+ "tenant_id"
10075
+ ],
10076
+ "unique": true
10077
+ },
10078
+ {
10079
+ "name": "education_groups_slug_context_idx",
10080
+ "columns": [
10081
+ "slug",
10082
+ "context"
10083
+ ]
10084
+ },
10085
+ {
10086
+ "name": "education_groups_tenant_id_created_at_idx",
10087
+ "columns": [
10088
+ "tenant_id",
10089
+ "created_at"
10090
+ ]
10091
+ },
10092
+ {
10093
+ "name": "education_groups_creator_user_id_idx",
10094
+ "columns": [
10095
+ "creator_user_id"
10096
+ ]
10097
+ },
10098
+ {
10099
+ "name": "education_groups_creator_profile_id_idx",
10100
+ "columns": [
10101
+ "creator_profile_id"
10102
+ ]
10103
+ }
10104
+ ],
10105
+ "version": "6e17e39b"
10106
+ },
10107
+ "importPath": "@happyvertical/smrt-education"
10108
+ },
10109
+ "@happyvertical/smrt-education:GroupLearnerInvitation": {
10110
+ "name": "grouplearnerinvitation",
10111
+ "className": "GroupLearnerInvitation",
10112
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerInvitation",
10113
+ "collection": "grouplearnerinvitations",
10114
+ "description": "Group-owned target selectors are opaque until the exact parent accepts.",
10115
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
10116
+ "packageName": "@happyvertical/smrt-education",
10117
+ "fields": {
10118
+ "tenantId": {
10119
+ "type": "text",
10120
+ "required": true,
10121
+ "_meta": {
10122
+ "sqlType": "UUID",
10123
+ "__tenancy": {
10124
+ "isTenantIdField": true,
10125
+ "autoFilter": true,
10126
+ "required": true,
10127
+ "autoPopulate": true,
10128
+ "nullable": false,
10129
+ "mode": "required",
10130
+ "field": "tenantId",
10131
+ "allowSuperAdminBypass": false
10132
+ }
10133
+ }
10134
+ },
10135
+ "groupId": {
10136
+ "type": "foreignKey",
10137
+ "required": true,
10138
+ "related": "EducationGroup",
10139
+ "_meta": {
10140
+ "required": true,
10141
+ "onDelete": "RESTRICT"
10142
+ }
10143
+ },
10144
+ "familyTenantId": {
10145
+ "type": "crossPackageRef",
10146
+ "required": true,
10147
+ "related": "@happyvertical/smrt-users:Tenant"
10148
+ },
10149
+ "learnerId": {
10150
+ "type": "text",
10151
+ "required": true,
10152
+ "_meta": {
10153
+ "sqlType": "UUID",
10154
+ "required": true
10155
+ }
10156
+ },
10157
+ "invitedParentUserId": {
10158
+ "type": "crossPackageRef",
10159
+ "required": true,
10160
+ "related": "@happyvertical/smrt-users:User"
10161
+ },
10162
+ "creatorUserId": {
10163
+ "type": "crossPackageRef",
10164
+ "required": true,
10165
+ "related": "@happyvertical/smrt-users:User"
10166
+ },
10167
+ "expiresAt": {
10168
+ "type": "text",
10169
+ "required": false
10170
+ },
10171
+ "status": {
10172
+ "type": "text",
10173
+ "required": false,
10174
+ "default": "pending",
10175
+ "enum": [
10176
+ "pending",
10177
+ "accepted",
10178
+ "revoked",
10179
+ "declined"
10180
+ ]
10181
+ },
10182
+ "acceptedMembershipId": {
10183
+ "type": "foreignKey",
10184
+ "required": false,
10185
+ "related": "GroupLearnerMembership",
10186
+ "_meta": {
10187
+ "nullable": true,
10188
+ "onDelete": "RESTRICT"
10189
+ }
10190
+ },
10191
+ "acceptedPolicyDigest": {
10192
+ "type": "text",
10193
+ "required": false
10194
+ }
10195
+ },
10196
+ "methods": {
10197
+ "save": {
10198
+ "name": "save",
10199
+ "async": true,
10200
+ "parameters": [
10201
+ {
10202
+ "name": "options",
10203
+ "type": "SmrtSaveOptions",
10204
+ "optional": true
10205
+ }
10206
+ ],
10207
+ "returnType": "Promise<this>",
10208
+ "isStatic": false,
10209
+ "isPublic": true
10210
+ },
10211
+ "delete": {
10212
+ "name": "delete",
10213
+ "async": true,
10214
+ "parameters": [],
10215
+ "returnType": "Promise<void>",
10216
+ "isStatic": false,
10217
+ "isPublic": true
10218
+ }
10219
+ },
10220
+ "decoratorConfig": {
10221
+ "tableName": "group_learner_invitations",
10222
+ "api": false,
10223
+ "mcp": false,
10224
+ "cli": false,
10225
+ "ai": {
10226
+ "callable": []
10227
+ },
10228
+ "tenantScoped": {
10229
+ "mode": "required"
10230
+ },
10231
+ "conflictColumns": [
10232
+ "tenant_id",
10233
+ "slug",
10234
+ "context"
10235
+ ]
10236
+ },
10237
+ "extends": "SmrtObject",
10238
+ "exportName": "GroupLearnerInvitation",
10239
+ "collectionExportName": "GroupLearnerInvitationCollection",
10240
+ "validationRules": [
10241
+ {
10242
+ "field": "groupId",
10243
+ "rule": "required",
10244
+ "fieldType": "foreignKey"
10245
+ },
10246
+ {
10247
+ "field": "familyTenantId",
10248
+ "rule": "required",
10249
+ "fieldType": "crossPackageRef"
10250
+ },
10251
+ {
10252
+ "field": "learnerId",
10253
+ "rule": "required",
10254
+ "fieldType": "text"
10255
+ },
10256
+ {
10257
+ "field": "invitedParentUserId",
10258
+ "rule": "required",
10259
+ "fieldType": "crossPackageRef"
10260
+ },
10261
+ {
10262
+ "field": "creatorUserId",
10263
+ "rule": "required",
10264
+ "fieldType": "crossPackageRef"
10265
+ }
10266
+ ],
10267
+ "schema": {
10268
+ "tableName": "group_learner_invitations",
10269
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_invitations\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"family_tenant_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"invited_parent_user_id\" UUID NOT NULL,\n \"creator_user_id\" UUID NOT NULL,\n \"expires_at\" TEXT,\n \"status\" TEXT DEFAULT 'pending',\n \"accepted_membership_id\" UUID,\n \"accepted_policy_digest\" TEXT\n);",
10270
+ "columns": {
10271
+ "id": {
10272
+ "type": "UUID",
10273
+ "primaryKey": true,
10274
+ "referenceKind": "id",
10275
+ "notNull": true
10276
+ },
10277
+ "slug": {
10278
+ "type": "TEXT",
10279
+ "notNull": true
10280
+ },
10281
+ "context": {
10282
+ "type": "TEXT",
10283
+ "notNull": true,
10284
+ "default": ""
10285
+ },
10286
+ "created_at": {
10287
+ "type": "TIMESTAMP",
10288
+ "notNull": true,
10289
+ "default": "current_timestamp"
10290
+ },
10291
+ "updated_at": {
10292
+ "type": "TIMESTAMP",
10293
+ "notNull": true,
10294
+ "default": "current_timestamp"
10295
+ },
10296
+ "tenant_id": {
10297
+ "type": "UUID",
10298
+ "referenceKind": "tenantId",
10299
+ "notNull": true,
10300
+ "unique": false
10301
+ },
10302
+ "group_id": {
10303
+ "type": "UUID",
10304
+ "referenceKind": "foreignKey",
10305
+ "notNull": true,
10306
+ "unique": false,
10307
+ "foreignKey": {
10308
+ "table": "education_groups",
10309
+ "column": "id",
10310
+ "onDelete": "RESTRICT",
10311
+ "onUpdate": "CASCADE"
10312
+ }
10313
+ },
10314
+ "family_tenant_id": {
10315
+ "type": "UUID",
10316
+ "referenceKind": "crossPackageRef",
10317
+ "notNull": true,
10318
+ "unique": false
10319
+ },
10320
+ "learner_id": {
10321
+ "type": "UUID",
10322
+ "notNull": true,
10323
+ "unique": false
10324
+ },
10325
+ "invited_parent_user_id": {
10326
+ "type": "UUID",
10327
+ "referenceKind": "crossPackageRef",
10328
+ "notNull": true,
10329
+ "unique": false
10330
+ },
10331
+ "creator_user_id": {
10332
+ "type": "UUID",
10333
+ "referenceKind": "crossPackageRef",
10334
+ "notNull": true,
10335
+ "unique": false
10336
+ },
10337
+ "expires_at": {
10338
+ "type": "TEXT",
10339
+ "notNull": false,
10340
+ "unique": false
10341
+ },
10342
+ "status": {
10343
+ "type": "TEXT",
10344
+ "notNull": false,
10345
+ "unique": false,
10346
+ "default": "pending"
10347
+ },
10348
+ "accepted_membership_id": {
10349
+ "type": "UUID",
10350
+ "referenceKind": "foreignKey",
10351
+ "notNull": false,
10352
+ "unique": false,
10353
+ "foreignKey": {
10354
+ "table": "group_learner_memberships",
10355
+ "column": "id",
10356
+ "onDelete": "RESTRICT",
10357
+ "onUpdate": "CASCADE"
10358
+ }
10359
+ },
10360
+ "accepted_policy_digest": {
10361
+ "type": "TEXT",
10362
+ "notNull": false,
10363
+ "unique": false
10364
+ }
10365
+ },
10366
+ "indexes": [
10367
+ {
10368
+ "name": "group_learner_invitations_slug_context_idx",
10369
+ "columns": [
10370
+ "tenant_id",
10371
+ "slug",
10372
+ "context"
10373
+ ],
10374
+ "unique": true
10375
+ },
10376
+ {
10377
+ "name": "group_learner_invitations_tenant_id_created_at_idx",
10378
+ "columns": [
10379
+ "tenant_id",
10380
+ "created_at"
10381
+ ]
10382
+ },
10383
+ {
10384
+ "name": "group_learner_invitations_group_id_idx",
10385
+ "columns": [
10386
+ "group_id"
10387
+ ]
10388
+ },
10389
+ {
10390
+ "name": "group_learner_invitations_family_tenant_id_idx",
10391
+ "columns": [
10392
+ "family_tenant_id"
10393
+ ]
10394
+ },
10395
+ {
10396
+ "name": "group_learner_invitations_invited_parent_user_id_idx",
10397
+ "columns": [
10398
+ "invited_parent_user_id"
10399
+ ]
10400
+ },
10401
+ {
10402
+ "name": "group_learner_invitations_creator_user_id_idx",
10403
+ "columns": [
10404
+ "creator_user_id"
10405
+ ]
10406
+ },
10407
+ {
10408
+ "name": "group_learner_invitations_accepted_membership_id_idx",
10409
+ "columns": [
10410
+ "accepted_membership_id"
10411
+ ]
10412
+ }
10413
+ ],
10414
+ "version": "fd61d2dd"
10415
+ },
10416
+ "importPath": "@happyvertical/smrt-education"
10417
+ },
10418
+ "@happyvertical/smrt-education:GroupLearnerInvitationCollection": {
10419
+ "name": "grouplearnerinvitationcollection",
10420
+ "className": "GroupLearnerInvitationCollection",
10421
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerInvitationCollection",
10422
+ "collection": "grouplearnerinvitations",
10423
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
10424
+ "packageName": "@happyvertical/smrt-education",
10425
+ "fields": {},
10426
+ "methods": {},
10427
+ "decoratorConfig": {
10428
+ "tableName": "group_learner_invitations",
10429
+ "api": false,
10430
+ "mcp": false,
10431
+ "cli": false
10432
+ },
10433
+ "extends": "SmrtCollection",
10434
+ "extendsTypeArg": "GroupLearnerInvitation",
10435
+ "exportName": "GroupLearnerInvitationCollection",
10436
+ "collectionExportName": "GroupLearnerInvitationCollectionCollection",
10437
+ "schema": {
10438
+ "tableName": "group_learner_invitations",
10439
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_invitations\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"family_tenant_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"invited_parent_user_id\" UUID NOT NULL,\n \"creator_user_id\" UUID NOT NULL,\n \"expires_at\" TEXT,\n \"status\" TEXT DEFAULT 'pending',\n \"accepted_membership_id\" UUID,\n \"accepted_policy_digest\" TEXT\n);",
10440
+ "columns": {
10441
+ "id": {
10442
+ "type": "UUID",
10443
+ "primaryKey": true,
10444
+ "referenceKind": "id",
10445
+ "notNull": true
10446
+ },
10447
+ "slug": {
10448
+ "type": "TEXT",
10449
+ "notNull": true
10450
+ },
10451
+ "context": {
10452
+ "type": "TEXT",
10453
+ "notNull": true,
10454
+ "default": ""
10455
+ },
10456
+ "created_at": {
10457
+ "type": "TIMESTAMP",
10458
+ "notNull": true,
10459
+ "default": "current_timestamp"
10460
+ },
10461
+ "updated_at": {
10462
+ "type": "TIMESTAMP",
10463
+ "notNull": true,
10464
+ "default": "current_timestamp"
10465
+ },
10466
+ "tenant_id": {
10467
+ "type": "UUID",
10468
+ "referenceKind": "tenantId",
10469
+ "notNull": true,
10470
+ "unique": false
10471
+ },
10472
+ "group_id": {
10473
+ "type": "UUID",
10474
+ "referenceKind": "foreignKey",
10475
+ "notNull": true,
10476
+ "unique": false,
10477
+ "foreignKey": {
10478
+ "table": "education_groups",
10479
+ "column": "id",
10480
+ "onDelete": "RESTRICT",
10481
+ "onUpdate": "CASCADE"
10482
+ }
10483
+ },
10484
+ "family_tenant_id": {
10485
+ "type": "UUID",
10486
+ "referenceKind": "crossPackageRef",
10487
+ "notNull": true,
10488
+ "unique": false
10489
+ },
10490
+ "learner_id": {
10491
+ "type": "UUID",
10492
+ "notNull": true,
10493
+ "unique": false
10494
+ },
10495
+ "invited_parent_user_id": {
10496
+ "type": "UUID",
10497
+ "referenceKind": "crossPackageRef",
10498
+ "notNull": true,
10499
+ "unique": false
10500
+ },
10501
+ "creator_user_id": {
10502
+ "type": "UUID",
10503
+ "referenceKind": "crossPackageRef",
10504
+ "notNull": true,
10505
+ "unique": false
10506
+ },
10507
+ "expires_at": {
10508
+ "type": "TEXT",
10509
+ "notNull": false,
10510
+ "unique": false
10511
+ },
10512
+ "status": {
10513
+ "type": "TEXT",
10514
+ "notNull": false,
10515
+ "unique": false,
10516
+ "default": "pending"
10517
+ },
10518
+ "accepted_membership_id": {
10519
+ "type": "UUID",
10520
+ "referenceKind": "foreignKey",
10521
+ "notNull": false,
10522
+ "unique": false,
10523
+ "foreignKey": {
10524
+ "table": "group_learner_memberships",
10525
+ "column": "id",
10526
+ "onDelete": "RESTRICT",
10527
+ "onUpdate": "CASCADE"
10528
+ }
10529
+ },
10530
+ "accepted_policy_digest": {
10531
+ "type": "TEXT",
10532
+ "notNull": false,
10533
+ "unique": false
10534
+ }
10535
+ },
10536
+ "indexes": [
10537
+ {
10538
+ "name": "group_learner_invitations_slug_context_idx",
10539
+ "columns": [
10540
+ "tenant_id",
10541
+ "slug",
10542
+ "context"
10543
+ ],
10544
+ "unique": true
10545
+ },
10546
+ {
10547
+ "name": "group_learner_invitations_tenant_id_created_at_idx",
10548
+ "columns": [
10549
+ "tenant_id",
10550
+ "created_at"
10551
+ ]
10552
+ },
10553
+ {
10554
+ "name": "group_learner_invitations_group_id_idx",
10555
+ "columns": [
10556
+ "group_id"
10557
+ ]
10558
+ },
10559
+ {
10560
+ "name": "group_learner_invitations_family_tenant_id_idx",
10561
+ "columns": [
10562
+ "family_tenant_id"
10563
+ ]
10564
+ },
10565
+ {
10566
+ "name": "group_learner_invitations_invited_parent_user_id_idx",
10567
+ "columns": [
10568
+ "invited_parent_user_id"
10569
+ ]
10570
+ },
10571
+ {
10572
+ "name": "group_learner_invitations_creator_user_id_idx",
10573
+ "columns": [
10574
+ "creator_user_id"
10575
+ ]
10576
+ },
10577
+ {
10578
+ "name": "group_learner_invitations_accepted_membership_id_idx",
10579
+ "columns": [
10580
+ "accepted_membership_id"
10581
+ ]
10582
+ }
10583
+ ],
10584
+ "version": "fd61d2dd"
10585
+ },
10586
+ "importPath": "@happyvertical/smrt-education"
10587
+ },
10588
+ "@happyvertical/smrt-education:GroupLearnerMembership": {
10589
+ "name": "grouplearnermembership",
10590
+ "className": "GroupLearnerMembership",
10591
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerMembership",
10592
+ "collection": "grouplearnermemberships",
10593
+ "description": "Family-owned per-child consent edge, never a users membership.",
10594
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
10595
+ "packageName": "@happyvertical/smrt-education",
10596
+ "fields": {
10597
+ "tenantId": {
10598
+ "type": "text",
10599
+ "required": true,
10600
+ "_meta": {
10601
+ "sqlType": "UUID",
10602
+ "__tenancy": {
10603
+ "isTenantIdField": true,
10604
+ "autoFilter": true,
10605
+ "required": true,
10606
+ "autoPopulate": true,
10607
+ "nullable": false,
10608
+ "mode": "required",
10609
+ "field": "tenantId",
10610
+ "allowSuperAdminBypass": false
10611
+ }
10612
+ }
10613
+ },
10614
+ "groupId": {
10615
+ "type": "foreignKey",
10616
+ "required": true,
10617
+ "related": "EducationGroup",
10618
+ "_meta": {
10619
+ "required": true,
10620
+ "onDelete": "RESTRICT"
10621
+ }
10622
+ },
10623
+ "learnerId": {
10624
+ "type": "foreignKey",
10625
+ "required": true,
10626
+ "related": "Learner",
10627
+ "_meta": {
10628
+ "required": true,
10629
+ "onDelete": "RESTRICT"
10630
+ }
10631
+ },
10632
+ "consentParentUserId": {
10633
+ "type": "crossPackageRef",
10634
+ "required": true,
10635
+ "related": "@happyvertical/smrt-users:User"
10636
+ },
10637
+ "status": {
10638
+ "type": "text",
10639
+ "required": false,
10640
+ "default": "active",
10641
+ "enum": [
10642
+ "active",
10643
+ "revoked"
10644
+ ]
10645
+ },
10646
+ "policyVersion": {
10647
+ "type": "integer",
10648
+ "required": true,
10649
+ "default": 1,
10650
+ "min": 1,
10651
+ "_meta": {
10652
+ "min": 1,
10653
+ "required": true
10654
+ }
10655
+ }
10656
+ },
10657
+ "methods": {
10658
+ "save": {
10659
+ "name": "save",
10660
+ "async": true,
10661
+ "parameters": [
10662
+ {
10663
+ "name": "options",
10664
+ "type": "SmrtSaveOptions",
10665
+ "optional": true
10666
+ }
10667
+ ],
10668
+ "returnType": "Promise<this>",
10669
+ "isStatic": false,
10670
+ "isPublic": true
10671
+ },
10672
+ "delete": {
10673
+ "name": "delete",
10674
+ "async": true,
10675
+ "parameters": [],
10676
+ "returnType": "Promise<void>",
10677
+ "isStatic": false,
10678
+ "isPublic": true
10679
+ }
10680
+ },
10681
+ "decoratorConfig": {
10682
+ "tableName": "group_learner_memberships",
10683
+ "conflictColumns": [
10684
+ "tenant_id",
10685
+ "learner_id",
10686
+ "group_id"
10687
+ ],
10688
+ "api": false,
10689
+ "mcp": false,
10690
+ "cli": false,
10691
+ "ai": {
10692
+ "callable": []
10693
+ },
10694
+ "tenantScoped": {
10695
+ "mode": "required"
10696
+ }
10697
+ },
10698
+ "extends": "SmrtObject",
10699
+ "exportName": "GroupLearnerMembership",
10700
+ "collectionExportName": "GroupLearnerMembershipCollection",
10701
+ "validationRules": [
10702
+ {
10703
+ "field": "groupId",
10704
+ "rule": "required",
10705
+ "fieldType": "foreignKey"
10706
+ },
10707
+ {
10708
+ "field": "learnerId",
10709
+ "rule": "required",
10710
+ "fieldType": "foreignKey"
10711
+ },
10712
+ {
10713
+ "field": "consentParentUserId",
10714
+ "rule": "required",
10715
+ "fieldType": "crossPackageRef"
10716
+ },
10717
+ {
10718
+ "field": "policyVersion",
10719
+ "rule": "required",
10720
+ "fieldType": "integer"
10721
+ },
10722
+ {
10723
+ "field": "policyVersion",
10724
+ "rule": "min",
10725
+ "value": 1,
10726
+ "fieldType": "integer"
10727
+ }
10728
+ ],
10729
+ "schema": {
10730
+ "tableName": "group_learner_memberships",
10731
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_memberships\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"consent_parent_user_id\" UUID NOT NULL,\n \"status\" TEXT DEFAULT 'active',\n \"policy_version\" INTEGER NOT NULL DEFAULT 1\n);",
10732
+ "columns": {
10733
+ "id": {
10734
+ "type": "UUID",
10735
+ "primaryKey": true,
10736
+ "referenceKind": "id",
10737
+ "notNull": true
10738
+ },
10739
+ "slug": {
10740
+ "type": "TEXT",
10741
+ "notNull": true
10742
+ },
10743
+ "context": {
10744
+ "type": "TEXT",
10745
+ "notNull": true,
10746
+ "default": ""
10747
+ },
10748
+ "created_at": {
10749
+ "type": "TIMESTAMP",
10750
+ "notNull": true,
10751
+ "default": "current_timestamp"
10752
+ },
10753
+ "updated_at": {
10754
+ "type": "TIMESTAMP",
10755
+ "notNull": true,
10756
+ "default": "current_timestamp"
10757
+ },
10758
+ "tenant_id": {
10759
+ "type": "UUID",
10760
+ "referenceKind": "tenantId",
10761
+ "notNull": true,
10762
+ "unique": false
10763
+ },
10764
+ "group_id": {
10765
+ "type": "UUID",
10766
+ "referenceKind": "foreignKey",
10767
+ "notNull": true,
10768
+ "unique": false,
10769
+ "foreignKey": {
10770
+ "table": "education_groups",
10771
+ "column": "id",
10772
+ "onDelete": "RESTRICT",
10773
+ "onUpdate": "CASCADE"
10774
+ }
10775
+ },
10776
+ "learner_id": {
10777
+ "type": "UUID",
10778
+ "referenceKind": "foreignKey",
10779
+ "notNull": true,
10780
+ "unique": false,
10781
+ "foreignKey": {
10782
+ "table": "learners",
10783
+ "column": "id",
10784
+ "onDelete": "RESTRICT",
10785
+ "onUpdate": "CASCADE"
10786
+ }
10787
+ },
10788
+ "consent_parent_user_id": {
10789
+ "type": "UUID",
10790
+ "referenceKind": "crossPackageRef",
10791
+ "notNull": true,
10792
+ "unique": false
10793
+ },
10794
+ "status": {
10795
+ "type": "TEXT",
10796
+ "notNull": false,
10797
+ "unique": false,
10798
+ "default": "active"
10799
+ },
10800
+ "policy_version": {
10801
+ "type": "INTEGER",
10802
+ "notNull": true,
10803
+ "unique": false,
10804
+ "default": 1
10805
+ }
10806
+ },
10807
+ "indexes": [
10808
+ {
10809
+ "name": "group_learner_memberships_tenant_id_learner_id_idx",
10810
+ "columns": [
10811
+ "tenant_id",
10812
+ "learner_id",
10813
+ "group_id"
10814
+ ],
10815
+ "unique": true
10816
+ },
10817
+ {
10818
+ "name": "group_learner_memberships_slug_context_idx",
10819
+ "columns": [
10820
+ "slug",
10821
+ "context"
10822
+ ]
10823
+ },
10824
+ {
10825
+ "name": "group_learner_memberships_tenant_id_created_at_idx",
10826
+ "columns": [
10827
+ "tenant_id",
10828
+ "created_at"
10829
+ ]
10830
+ },
10831
+ {
10832
+ "name": "group_learner_memberships_group_id_idx",
10833
+ "columns": [
10834
+ "group_id"
10835
+ ]
10836
+ },
10837
+ {
10838
+ "name": "group_learner_memberships_learner_id_idx",
10839
+ "columns": [
10840
+ "learner_id"
10841
+ ]
10842
+ },
10843
+ {
10844
+ "name": "group_learner_memberships_consent_parent_user_id_idx",
10845
+ "columns": [
10846
+ "consent_parent_user_id"
10847
+ ]
10848
+ }
10849
+ ],
10850
+ "version": "86b9feeb"
10851
+ },
10852
+ "importPath": "@happyvertical/smrt-education"
10853
+ },
10854
+ "@happyvertical/smrt-education:GroupLearnerMembershipCollection": {
10855
+ "name": "grouplearnermembershipcollection",
10856
+ "className": "GroupLearnerMembershipCollection",
10857
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerMembershipCollection",
10858
+ "collection": "grouplearnermemberships",
10859
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
10860
+ "packageName": "@happyvertical/smrt-education",
10861
+ "fields": {},
10862
+ "methods": {},
10863
+ "decoratorConfig": {
10864
+ "tableName": "group_learner_memberships",
10865
+ "api": false,
10866
+ "mcp": false,
10867
+ "cli": false
10868
+ },
10869
+ "extends": "SmrtCollection",
10870
+ "extendsTypeArg": "GroupLearnerMembership",
10871
+ "exportName": "GroupLearnerMembershipCollection",
10872
+ "collectionExportName": "GroupLearnerMembershipCollectionCollection",
10873
+ "schema": {
10874
+ "tableName": "group_learner_memberships",
10875
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_memberships\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"consent_parent_user_id\" UUID NOT NULL,\n \"status\" TEXT DEFAULT 'active',\n \"policy_version\" INTEGER NOT NULL DEFAULT 1\n);",
10876
+ "columns": {
10877
+ "id": {
10878
+ "type": "UUID",
10879
+ "primaryKey": true,
10880
+ "referenceKind": "id",
10881
+ "notNull": true
10882
+ },
10883
+ "slug": {
10884
+ "type": "TEXT",
10885
+ "notNull": true
10886
+ },
10887
+ "context": {
10888
+ "type": "TEXT",
10889
+ "notNull": true,
10890
+ "default": ""
10891
+ },
10892
+ "created_at": {
10893
+ "type": "TIMESTAMP",
10894
+ "notNull": true,
10895
+ "default": "current_timestamp"
10896
+ },
10897
+ "updated_at": {
10898
+ "type": "TIMESTAMP",
10899
+ "notNull": true,
10900
+ "default": "current_timestamp"
10901
+ },
10902
+ "tenant_id": {
10903
+ "type": "UUID",
10904
+ "referenceKind": "tenantId",
10905
+ "notNull": true,
10906
+ "unique": false
10907
+ },
10908
+ "group_id": {
10909
+ "type": "UUID",
10910
+ "referenceKind": "foreignKey",
10911
+ "notNull": true,
10912
+ "unique": false,
10913
+ "foreignKey": {
10914
+ "table": "education_groups",
10915
+ "column": "id",
10916
+ "onDelete": "RESTRICT",
10917
+ "onUpdate": "CASCADE"
10918
+ }
10919
+ },
10920
+ "learner_id": {
10921
+ "type": "UUID",
10922
+ "referenceKind": "foreignKey",
10923
+ "notNull": true,
10924
+ "unique": false,
10925
+ "foreignKey": {
10926
+ "table": "learners",
10927
+ "column": "id",
10928
+ "onDelete": "RESTRICT",
10929
+ "onUpdate": "CASCADE"
10930
+ }
10931
+ },
10932
+ "consent_parent_user_id": {
10933
+ "type": "UUID",
10934
+ "referenceKind": "crossPackageRef",
10935
+ "notNull": true,
10936
+ "unique": false
10937
+ },
10938
+ "status": {
10939
+ "type": "TEXT",
10940
+ "notNull": false,
10941
+ "unique": false,
10942
+ "default": "active"
10943
+ },
10944
+ "policy_version": {
10945
+ "type": "INTEGER",
10946
+ "notNull": true,
10947
+ "unique": false,
10948
+ "default": 1
10949
+ }
10950
+ },
10951
+ "indexes": [
10952
+ {
10953
+ "name": "group_learner_memberships_tenant_id_learner_id_idx",
10954
+ "columns": [
10955
+ "tenant_id",
10956
+ "learner_id",
10957
+ "group_id"
10958
+ ],
10959
+ "unique": true
10960
+ },
10961
+ {
10962
+ "name": "group_learner_memberships_slug_context_idx",
10963
+ "columns": [
10964
+ "slug",
10965
+ "context"
10966
+ ]
10967
+ },
10968
+ {
10969
+ "name": "group_learner_memberships_tenant_id_created_at_idx",
10970
+ "columns": [
10971
+ "tenant_id",
10972
+ "created_at"
10973
+ ]
10974
+ },
10975
+ {
10976
+ "name": "group_learner_memberships_group_id_idx",
10977
+ "columns": [
10978
+ "group_id"
10979
+ ]
10980
+ },
10981
+ {
10982
+ "name": "group_learner_memberships_learner_id_idx",
10983
+ "columns": [
10984
+ "learner_id"
10985
+ ]
10986
+ },
10987
+ {
10988
+ "name": "group_learner_memberships_consent_parent_user_id_idx",
10989
+ "columns": [
10990
+ "consent_parent_user_id"
10991
+ ]
10992
+ }
10993
+ ],
10994
+ "version": "86b9feeb"
10995
+ },
10996
+ "importPath": "@happyvertical/smrt-education"
10997
+ },
10998
+ "@happyvertical/smrt-education:GroupSharingPolicy": {
10999
+ "name": "groupsharingpolicy",
11000
+ "className": "GroupSharingPolicy",
11001
+ "qualifiedName": "@happyvertical/smrt-education:GroupSharingPolicy",
11002
+ "collection": "groupsharingpolicies",
11003
+ "description": "Immutable explicit policy snapshot.",
11004
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
11005
+ "packageName": "@happyvertical/smrt-education",
11006
+ "fields": {
11007
+ "tenantId": {
11008
+ "type": "text",
11009
+ "required": true,
11010
+ "_meta": {
11011
+ "sqlType": "UUID",
11012
+ "__tenancy": {
11013
+ "isTenantIdField": true,
11014
+ "autoFilter": true,
11015
+ "required": true,
11016
+ "autoPopulate": true,
11017
+ "nullable": false,
11018
+ "mode": "required",
11019
+ "field": "tenantId",
11020
+ "allowSuperAdminBypass": false
11021
+ }
11022
+ }
11023
+ },
11024
+ "membershipId": {
11025
+ "type": "foreignKey",
11026
+ "required": true,
11027
+ "related": "GroupLearnerMembership",
11028
+ "_meta": {
11029
+ "required": true,
11030
+ "onDelete": "RESTRICT"
11031
+ }
11032
+ },
11033
+ "version": {
11034
+ "type": "integer",
11035
+ "required": true,
11036
+ "default": 1,
11037
+ "min": 1,
11038
+ "_meta": {
11039
+ "min": 1,
11040
+ "required": true
11041
+ }
11042
+ },
11043
+ "schemaVersion": {
11044
+ "type": "integer",
11045
+ "required": true,
11046
+ "default": 1,
11047
+ "min": 1,
11048
+ "max": 1,
11049
+ "_meta": {
11050
+ "min": 1,
11051
+ "max": 1,
11052
+ "required": true
11053
+ }
11054
+ },
11055
+ "policyJson": {
11056
+ "type": "text",
11057
+ "required": true,
11058
+ "_meta": {
11059
+ "required": true
11060
+ }
11061
+ },
11062
+ "actorUserId": {
11063
+ "type": "crossPackageRef",
11064
+ "required": true,
11065
+ "related": "@happyvertical/smrt-users:User"
11066
+ },
11067
+ "recordedAt": {
11068
+ "type": "text",
11069
+ "required": false
11070
+ }
11071
+ },
11072
+ "methods": {
11073
+ "getPolicy": {
11074
+ "name": "getPolicy",
11075
+ "async": false,
11076
+ "parameters": [],
11077
+ "returnType": "GroupSharingPolicyV1",
11078
+ "isStatic": false,
11079
+ "isPublic": true
11080
+ },
11081
+ "setPolicy": {
11082
+ "name": "setPolicy",
11083
+ "async": false,
11084
+ "parameters": [
11085
+ {
11086
+ "name": "value",
11087
+ "type": "unknown",
11088
+ "optional": false
11089
+ }
11090
+ ],
11091
+ "returnType": "void",
11092
+ "isStatic": false,
11093
+ "isPublic": true
11094
+ },
11095
+ "save": {
11096
+ "name": "save",
11097
+ "async": true,
11098
+ "parameters": [
11099
+ {
11100
+ "name": "options",
11101
+ "type": "SmrtSaveOptions",
11102
+ "optional": true
11103
+ }
11104
+ ],
11105
+ "returnType": "Promise<this>",
11106
+ "isStatic": false,
11107
+ "isPublic": true
11108
+ },
11109
+ "delete": {
11110
+ "name": "delete",
11111
+ "async": true,
11112
+ "parameters": [],
11113
+ "returnType": "Promise<void>",
11114
+ "isStatic": false,
11115
+ "isPublic": true
11116
+ }
11117
+ },
11118
+ "decoratorConfig": {
11119
+ "tableName": "group_sharing_policies",
11120
+ "conflictColumns": [
11121
+ "tenant_id",
11122
+ "membership_id",
11123
+ "version"
11124
+ ],
11125
+ "api": false,
11126
+ "mcp": false,
11127
+ "cli": false,
11128
+ "ai": {
11129
+ "callable": []
11130
+ },
11131
+ "tenantScoped": {
11132
+ "mode": "required"
11133
+ }
11134
+ },
11135
+ "extends": "SmrtObject",
11136
+ "exportName": "GroupSharingPolicy",
11137
+ "collectionExportName": "GroupSharingPolicyCollection",
11138
+ "validationRules": [
11139
+ {
11140
+ "field": "membershipId",
11141
+ "rule": "required",
11142
+ "fieldType": "foreignKey"
11143
+ },
11144
+ {
11145
+ "field": "version",
11146
+ "rule": "required",
11147
+ "fieldType": "integer"
11148
+ },
11149
+ {
11150
+ "field": "version",
11151
+ "rule": "min",
11152
+ "value": 1,
11153
+ "fieldType": "integer"
11154
+ },
11155
+ {
11156
+ "field": "schemaVersion",
11157
+ "rule": "required",
11158
+ "fieldType": "integer"
11159
+ },
11160
+ {
11161
+ "field": "schemaVersion",
11162
+ "rule": "min",
11163
+ "value": 1,
11164
+ "fieldType": "integer"
11165
+ },
11166
+ {
11167
+ "field": "schemaVersion",
11168
+ "rule": "max",
11169
+ "value": 1,
11170
+ "fieldType": "integer"
11171
+ },
11172
+ {
11173
+ "field": "policyJson",
11174
+ "rule": "required",
11175
+ "fieldType": "text"
11176
+ },
11177
+ {
11178
+ "field": "actorUserId",
11179
+ "rule": "required",
11180
+ "fieldType": "crossPackageRef"
11181
+ }
11182
+ ],
11183
+ "schema": {
11184
+ "tableName": "group_sharing_policies",
11185
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_sharing_policies\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL,\n \"version\" INTEGER NOT NULL DEFAULT 1,\n \"schema_version\" INTEGER NOT NULL DEFAULT 1,\n \"policy_json\" TEXT NOT NULL,\n \"actor_user_id\" UUID NOT NULL,\n \"recorded_at\" TEXT\n);",
11186
+ "columns": {
11187
+ "id": {
11188
+ "type": "UUID",
11189
+ "primaryKey": true,
11190
+ "referenceKind": "id",
11191
+ "notNull": true
11192
+ },
11193
+ "slug": {
11194
+ "type": "TEXT",
11195
+ "notNull": true
11196
+ },
11197
+ "context": {
11198
+ "type": "TEXT",
11199
+ "notNull": true,
11200
+ "default": ""
11201
+ },
11202
+ "created_at": {
11203
+ "type": "TIMESTAMP",
11204
+ "notNull": true,
11205
+ "default": "current_timestamp"
11206
+ },
11207
+ "updated_at": {
11208
+ "type": "TIMESTAMP",
11209
+ "notNull": true,
11210
+ "default": "current_timestamp"
11211
+ },
11212
+ "tenant_id": {
11213
+ "type": "UUID",
11214
+ "referenceKind": "tenantId",
11215
+ "notNull": true,
11216
+ "unique": false
11217
+ },
11218
+ "membership_id": {
11219
+ "type": "UUID",
11220
+ "referenceKind": "foreignKey",
11221
+ "notNull": true,
11222
+ "unique": false,
11223
+ "foreignKey": {
11224
+ "table": "group_learner_memberships",
11225
+ "column": "id",
11226
+ "onDelete": "RESTRICT",
11227
+ "onUpdate": "CASCADE"
11228
+ }
11229
+ },
11230
+ "version": {
11231
+ "type": "INTEGER",
11232
+ "notNull": true,
11233
+ "unique": false,
11234
+ "default": 1
11235
+ },
11236
+ "schema_version": {
11237
+ "type": "INTEGER",
11238
+ "notNull": true,
11239
+ "unique": false,
11240
+ "default": 1
11241
+ },
11242
+ "policy_json": {
11243
+ "type": "TEXT",
11244
+ "notNull": true,
11245
+ "unique": false
11246
+ },
11247
+ "actor_user_id": {
11248
+ "type": "UUID",
11249
+ "referenceKind": "crossPackageRef",
11250
+ "notNull": true,
11251
+ "unique": false
11252
+ },
11253
+ "recorded_at": {
11254
+ "type": "TEXT",
11255
+ "notNull": false,
11256
+ "unique": false
11257
+ }
11258
+ },
11259
+ "indexes": [
11260
+ {
11261
+ "name": "group_sharing_policies_tenant_id_membership_id_idx",
11262
+ "columns": [
11263
+ "tenant_id",
11264
+ "membership_id",
11265
+ "version"
11266
+ ],
11267
+ "unique": true
11268
+ },
11269
+ {
11270
+ "name": "group_sharing_policies_slug_context_idx",
11271
+ "columns": [
11272
+ "slug",
11273
+ "context"
11274
+ ]
11275
+ },
11276
+ {
11277
+ "name": "group_sharing_policies_tenant_id_created_at_idx",
11278
+ "columns": [
11279
+ "tenant_id",
11280
+ "created_at"
11281
+ ]
11282
+ },
11283
+ {
11284
+ "name": "group_sharing_policies_membership_id_idx",
11285
+ "columns": [
11286
+ "membership_id"
11287
+ ]
11288
+ },
11289
+ {
11290
+ "name": "group_sharing_policies_actor_user_id_idx",
11291
+ "columns": [
11292
+ "actor_user_id"
11293
+ ]
11294
+ }
11295
+ ],
11296
+ "version": "40a8f170"
11297
+ },
11298
+ "importPath": "@happyvertical/smrt-education"
11299
+ },
11300
+ "@happyvertical/smrt-education:GroupSharingPolicyCollection": {
11301
+ "name": "groupsharingpolicycollection",
11302
+ "className": "GroupSharingPolicyCollection",
11303
+ "qualifiedName": "@happyvertical/smrt-education:GroupSharingPolicyCollection",
11304
+ "collection": "groupsharingpolicies",
11305
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
11306
+ "packageName": "@happyvertical/smrt-education",
11307
+ "fields": {},
11308
+ "methods": {},
11309
+ "decoratorConfig": {
11310
+ "tableName": "group_sharing_policies",
11311
+ "api": false,
11312
+ "mcp": false,
11313
+ "cli": false
11314
+ },
11315
+ "extends": "SmrtCollection",
11316
+ "extendsTypeArg": "GroupSharingPolicy",
11317
+ "exportName": "GroupSharingPolicyCollection",
11318
+ "collectionExportName": "GroupSharingPolicyCollectionCollection",
11319
+ "schema": {
11320
+ "tableName": "group_sharing_policies",
11321
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_sharing_policies\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL,\n \"version\" INTEGER NOT NULL DEFAULT 1,\n \"schema_version\" INTEGER NOT NULL DEFAULT 1,\n \"policy_json\" TEXT NOT NULL,\n \"actor_user_id\" UUID NOT NULL,\n \"recorded_at\" TEXT\n);",
11322
+ "columns": {
11323
+ "id": {
11324
+ "type": "UUID",
11325
+ "primaryKey": true,
11326
+ "referenceKind": "id",
11327
+ "notNull": true
11328
+ },
11329
+ "slug": {
11330
+ "type": "TEXT",
11331
+ "notNull": true
11332
+ },
11333
+ "context": {
11334
+ "type": "TEXT",
11335
+ "notNull": true,
11336
+ "default": ""
11337
+ },
11338
+ "created_at": {
11339
+ "type": "TIMESTAMP",
11340
+ "notNull": true,
11341
+ "default": "current_timestamp"
11342
+ },
11343
+ "updated_at": {
11344
+ "type": "TIMESTAMP",
11345
+ "notNull": true,
11346
+ "default": "current_timestamp"
11347
+ },
11348
+ "tenant_id": {
11349
+ "type": "UUID",
11350
+ "referenceKind": "tenantId",
11351
+ "notNull": true,
11352
+ "unique": false
11353
+ },
11354
+ "membership_id": {
11355
+ "type": "UUID",
11356
+ "referenceKind": "foreignKey",
11357
+ "notNull": true,
11358
+ "unique": false,
11359
+ "foreignKey": {
11360
+ "table": "group_learner_memberships",
11361
+ "column": "id",
11362
+ "onDelete": "RESTRICT",
11363
+ "onUpdate": "CASCADE"
11364
+ }
11365
+ },
11366
+ "version": {
11367
+ "type": "INTEGER",
11368
+ "notNull": true,
11369
+ "unique": false,
11370
+ "default": 1
11371
+ },
11372
+ "schema_version": {
11373
+ "type": "INTEGER",
11374
+ "notNull": true,
11375
+ "unique": false,
11376
+ "default": 1
11377
+ },
11378
+ "policy_json": {
11379
+ "type": "TEXT",
11380
+ "notNull": true,
11381
+ "unique": false
11382
+ },
11383
+ "actor_user_id": {
11384
+ "type": "UUID",
11385
+ "referenceKind": "crossPackageRef",
11386
+ "notNull": true,
11387
+ "unique": false
11388
+ },
11389
+ "recorded_at": {
11390
+ "type": "TEXT",
11391
+ "notNull": false,
11392
+ "unique": false
11393
+ }
11394
+ },
11395
+ "indexes": [
11396
+ {
11397
+ "name": "group_sharing_policies_tenant_id_membership_id_idx",
11398
+ "columns": [
11399
+ "tenant_id",
11400
+ "membership_id",
11401
+ "version"
11402
+ ],
11403
+ "unique": true
11404
+ },
11405
+ {
11406
+ "name": "group_sharing_policies_slug_context_idx",
11407
+ "columns": [
11408
+ "slug",
11409
+ "context"
11410
+ ]
11411
+ },
11412
+ {
11413
+ "name": "group_sharing_policies_tenant_id_created_at_idx",
11414
+ "columns": [
11415
+ "tenant_id",
11416
+ "created_at"
11417
+ ]
11418
+ },
11419
+ {
11420
+ "name": "group_sharing_policies_membership_id_idx",
11421
+ "columns": [
11422
+ "membership_id"
11423
+ ]
11424
+ },
11425
+ {
11426
+ "name": "group_sharing_policies_actor_user_id_idx",
11427
+ "columns": [
11428
+ "actor_user_id"
11429
+ ]
11430
+ }
11431
+ ],
11432
+ "version": "40a8f170"
11433
+ },
11434
+ "importPath": "@happyvertical/smrt-education"
11435
+ },
11436
+ "@happyvertical/smrt-education:GroupRevisionComment": {
11437
+ "name": "grouprevisioncomment",
11438
+ "className": "GroupRevisionComment",
11439
+ "qualifiedName": "@happyvertical/smrt-education:GroupRevisionComment",
11440
+ "collection": "grouprevisioncomments",
11441
+ "description": "Attributed revision comment, separate from grading and evidence.",
11442
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
11443
+ "packageName": "@happyvertical/smrt-education",
11444
+ "fields": {
11445
+ "tenantId": {
11446
+ "type": "text",
11447
+ "required": true,
11448
+ "_meta": {
11449
+ "sqlType": "UUID",
11450
+ "__tenancy": {
11451
+ "isTenantIdField": true,
11452
+ "autoFilter": true,
11453
+ "required": true,
11454
+ "autoPopulate": true,
11455
+ "nullable": false,
11456
+ "mode": "required",
11457
+ "field": "tenantId",
11458
+ "allowSuperAdminBypass": false
11459
+ }
11460
+ }
11461
+ },
11462
+ "membershipId": {
11463
+ "type": "foreignKey",
11464
+ "required": true,
11465
+ "related": "GroupLearnerMembership",
11466
+ "_meta": {
11467
+ "required": true,
11468
+ "onDelete": "RESTRICT"
11469
+ }
11470
+ },
11471
+ "learnerId": {
11472
+ "type": "foreignKey",
11473
+ "required": true,
11474
+ "related": "Learner",
11475
+ "_meta": {
11476
+ "required": true,
11477
+ "onDelete": "RESTRICT"
11478
+ }
11479
+ },
11480
+ "activityId": {
11481
+ "type": "foreignKey",
11482
+ "required": true,
11483
+ "related": "WorkbookActivity",
11484
+ "_meta": {
11485
+ "required": true,
11486
+ "onDelete": "RESTRICT"
11487
+ }
11488
+ },
11489
+ "attemptId": {
11490
+ "type": "foreignKey",
11491
+ "required": true,
11492
+ "related": "WorkbookAttempt",
11493
+ "_meta": {
11494
+ "required": true,
11495
+ "onDelete": "RESTRICT"
11496
+ }
11497
+ },
11498
+ "revisionId": {
11499
+ "type": "foreignKey",
11500
+ "required": true,
11501
+ "related": "WorkbookAssessmentRevision",
11502
+ "_meta": {
11503
+ "required": true,
11504
+ "onDelete": "RESTRICT"
11505
+ }
11506
+ },
11507
+ "authorUserId": {
11508
+ "type": "crossPackageRef",
11509
+ "required": true,
11510
+ "related": "@happyvertical/smrt-users:User"
11511
+ },
11512
+ "authorProfileId": {
11513
+ "type": "crossPackageRef",
11514
+ "required": true,
11515
+ "related": "@happyvertical/smrt-profiles:Profile"
11516
+ },
11517
+ "body": {
11518
+ "type": "text",
11519
+ "required": false
11520
+ },
11521
+ "recordedAt": {
11522
+ "type": "text",
11523
+ "required": false
11524
+ },
11525
+ "childVisible": {
11526
+ "type": "boolean",
11527
+ "required": true,
11528
+ "default": false
11529
+ },
11530
+ "visibilityActorUserId": {
11531
+ "type": "crossPackageRef",
11532
+ "required": false,
11533
+ "related": "@happyvertical/smrt-users:User",
11534
+ "_meta": {
11535
+ "nullable": true
11536
+ }
11537
+ },
11538
+ "visibilityChangedAt": {
11539
+ "type": "datetime",
11540
+ "required": false
11541
+ },
11542
+ "visibilityVersion": {
11543
+ "type": "integer",
11544
+ "required": true,
11545
+ "default": 0,
11546
+ "min": 0,
11547
+ "_meta": {
11548
+ "min": 0,
11549
+ "required": true
11550
+ }
11551
+ }
11552
+ },
11553
+ "methods": {
11554
+ "save": {
11555
+ "name": "save",
11556
+ "async": true,
11557
+ "parameters": [
11558
+ {
11559
+ "name": "options",
11560
+ "type": "SmrtSaveOptions",
11561
+ "optional": true
11562
+ }
11563
+ ],
11564
+ "returnType": "Promise<this>",
11565
+ "isStatic": false,
11566
+ "isPublic": true
11567
+ },
11568
+ "delete": {
11569
+ "name": "delete",
11570
+ "async": true,
11571
+ "parameters": [],
11572
+ "returnType": "Promise<void>",
11573
+ "isStatic": false,
11574
+ "isPublic": true
11575
+ }
11576
+ },
11577
+ "decoratorConfig": {
11578
+ "tableName": "group_revision_comments",
11579
+ "api": false,
11580
+ "mcp": false,
11581
+ "cli": false,
11582
+ "ai": {
11583
+ "callable": []
11584
+ },
11585
+ "tenantScoped": {
11586
+ "mode": "required"
11587
+ },
11588
+ "conflictColumns": [
11589
+ "tenant_id",
11590
+ "slug",
11591
+ "context"
11592
+ ]
11593
+ },
11594
+ "extends": "SmrtObject",
11595
+ "exportName": "GroupRevisionComment",
11596
+ "collectionExportName": "GroupRevisionCommentCollection",
11597
+ "validationRules": [
11598
+ {
11599
+ "field": "membershipId",
11600
+ "rule": "required",
11601
+ "fieldType": "foreignKey"
11602
+ },
11603
+ {
11604
+ "field": "learnerId",
11605
+ "rule": "required",
11606
+ "fieldType": "foreignKey"
11607
+ },
11608
+ {
11609
+ "field": "activityId",
11610
+ "rule": "required",
11611
+ "fieldType": "foreignKey"
11612
+ },
11613
+ {
11614
+ "field": "attemptId",
11615
+ "rule": "required",
11616
+ "fieldType": "foreignKey"
11617
+ },
11618
+ {
11619
+ "field": "revisionId",
11620
+ "rule": "required",
11621
+ "fieldType": "foreignKey"
11622
+ },
11623
+ {
11624
+ "field": "authorUserId",
11625
+ "rule": "required",
11626
+ "fieldType": "crossPackageRef"
11627
+ },
11628
+ {
11629
+ "field": "authorProfileId",
11630
+ "rule": "required",
11631
+ "fieldType": "crossPackageRef"
11632
+ },
11633
+ {
11634
+ "field": "childVisible",
11635
+ "rule": "required",
11636
+ "fieldType": "boolean"
11637
+ },
11638
+ {
11639
+ "field": "visibilityVersion",
11640
+ "rule": "required",
11641
+ "fieldType": "integer"
11642
+ },
11643
+ {
11644
+ "field": "visibilityVersion",
11645
+ "rule": "min",
11646
+ "value": 0,
11647
+ "fieldType": "integer"
11648
+ }
11649
+ ],
11650
+ "schema": {
11651
+ "tableName": "group_revision_comments",
11652
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_revision_comments\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"activity_id\" UUID NOT NULL,\n \"attempt_id\" UUID NOT NULL,\n \"revision_id\" UUID NOT NULL,\n \"author_user_id\" UUID NOT NULL,\n \"author_profile_id\" UUID NOT NULL,\n \"body\" TEXT,\n \"recorded_at\" TEXT,\n \"child_visible\" BOOLEAN NOT NULL DEFAULT FALSE,\n \"visibility_actor_user_id\" UUID,\n \"visibility_changed_at\" TIMESTAMP,\n \"visibility_version\" INTEGER NOT NULL DEFAULT 0\n);",
11653
+ "columns": {
11654
+ "id": {
11655
+ "type": "UUID",
11656
+ "primaryKey": true,
11657
+ "referenceKind": "id",
11658
+ "notNull": true
11659
+ },
11660
+ "slug": {
11661
+ "type": "TEXT",
11662
+ "notNull": true
11663
+ },
11664
+ "context": {
11665
+ "type": "TEXT",
11666
+ "notNull": true,
11667
+ "default": ""
11668
+ },
11669
+ "created_at": {
11670
+ "type": "TIMESTAMP",
11671
+ "notNull": true,
11672
+ "default": "current_timestamp"
11673
+ },
11674
+ "updated_at": {
11675
+ "type": "TIMESTAMP",
11676
+ "notNull": true,
11677
+ "default": "current_timestamp"
11678
+ },
11679
+ "tenant_id": {
11680
+ "type": "UUID",
11681
+ "referenceKind": "tenantId",
11682
+ "notNull": true,
11683
+ "unique": false
11684
+ },
11685
+ "membership_id": {
11686
+ "type": "UUID",
11687
+ "referenceKind": "foreignKey",
11688
+ "notNull": true,
11689
+ "unique": false,
11690
+ "foreignKey": {
11691
+ "table": "group_learner_memberships",
11692
+ "column": "id",
11693
+ "onDelete": "RESTRICT",
11694
+ "onUpdate": "CASCADE"
11695
+ }
11696
+ },
11697
+ "learner_id": {
11698
+ "type": "UUID",
11699
+ "referenceKind": "foreignKey",
11700
+ "notNull": true,
11701
+ "unique": false,
11702
+ "foreignKey": {
11703
+ "table": "learners",
11704
+ "column": "id",
11705
+ "onDelete": "RESTRICT",
11706
+ "onUpdate": "CASCADE"
11707
+ }
11708
+ },
11709
+ "activity_id": {
11710
+ "type": "UUID",
11711
+ "referenceKind": "foreignKey",
11712
+ "notNull": true,
11713
+ "unique": false,
11714
+ "foreignKey": {
11715
+ "table": "workbook_activities",
11716
+ "column": "id",
11717
+ "onDelete": "RESTRICT",
11718
+ "onUpdate": "CASCADE"
11719
+ }
11720
+ },
11721
+ "attempt_id": {
11722
+ "type": "UUID",
11723
+ "referenceKind": "foreignKey",
11724
+ "notNull": true,
11725
+ "unique": false,
11726
+ "foreignKey": {
11727
+ "table": "workbook_attempts",
11728
+ "column": "id",
11729
+ "onDelete": "RESTRICT",
11730
+ "onUpdate": "CASCADE"
11731
+ }
11732
+ },
11733
+ "revision_id": {
11734
+ "type": "UUID",
11735
+ "referenceKind": "foreignKey",
11736
+ "notNull": true,
11737
+ "unique": false,
11738
+ "foreignKey": {
11739
+ "table": "workbook_assessment_revisions",
11740
+ "column": "id",
11741
+ "onDelete": "RESTRICT",
11742
+ "onUpdate": "CASCADE"
11743
+ }
11744
+ },
11745
+ "author_user_id": {
11746
+ "type": "UUID",
11747
+ "referenceKind": "crossPackageRef",
11748
+ "notNull": true,
11749
+ "unique": false
11750
+ },
11751
+ "author_profile_id": {
11752
+ "type": "UUID",
11753
+ "referenceKind": "crossPackageRef",
11754
+ "notNull": true,
11755
+ "unique": false
11756
+ },
11757
+ "body": {
11758
+ "type": "TEXT",
11759
+ "notNull": false,
11760
+ "unique": false
11761
+ },
11762
+ "recorded_at": {
11763
+ "type": "TEXT",
11764
+ "notNull": false,
11765
+ "unique": false
11766
+ },
11767
+ "child_visible": {
11768
+ "type": "BOOLEAN",
11769
+ "notNull": true,
11770
+ "unique": false,
11771
+ "default": false
11772
+ },
11773
+ "visibility_actor_user_id": {
11774
+ "type": "UUID",
11775
+ "referenceKind": "crossPackageRef",
11776
+ "notNull": false,
11777
+ "unique": false
11778
+ },
11779
+ "visibility_changed_at": {
11780
+ "type": "TIMESTAMP",
11781
+ "notNull": false,
11782
+ "unique": false
11783
+ },
11784
+ "visibility_version": {
11785
+ "type": "INTEGER",
11786
+ "notNull": true,
11787
+ "unique": false,
11788
+ "default": 0
11789
+ }
11790
+ },
11791
+ "indexes": [
11792
+ {
11793
+ "name": "group_revision_comments_slug_context_idx",
11794
+ "columns": [
11795
+ "tenant_id",
11796
+ "slug",
11797
+ "context"
11798
+ ],
11799
+ "unique": true
11800
+ },
11801
+ {
11802
+ "name": "group_revision_comments_tenant_id_created_at_idx",
11803
+ "columns": [
11804
+ "tenant_id",
11805
+ "created_at"
11806
+ ]
11807
+ },
11808
+ {
11809
+ "name": "group_revision_comments_membership_id_idx",
11810
+ "columns": [
11811
+ "membership_id"
11812
+ ]
11813
+ },
11814
+ {
11815
+ "name": "group_revision_comments_learner_id_idx",
11816
+ "columns": [
11817
+ "learner_id"
11818
+ ]
11819
+ },
11820
+ {
11821
+ "name": "group_revision_comments_activity_id_idx",
11822
+ "columns": [
11823
+ "activity_id"
11824
+ ]
11825
+ },
11826
+ {
11827
+ "name": "group_revision_comments_attempt_id_idx",
11828
+ "columns": [
11829
+ "attempt_id"
11830
+ ]
11831
+ },
11832
+ {
11833
+ "name": "group_revision_comments_revision_id_idx",
11834
+ "columns": [
11835
+ "revision_id"
11836
+ ]
11837
+ },
11838
+ {
11839
+ "name": "group_revision_comments_author_user_id_idx",
11840
+ "columns": [
11841
+ "author_user_id"
11842
+ ]
11843
+ },
11844
+ {
11845
+ "name": "group_revision_comments_author_profile_id_idx",
11846
+ "columns": [
11847
+ "author_profile_id"
11848
+ ]
11849
+ },
11850
+ {
11851
+ "name": "group_revision_comments_visibility_actor_user_id_idx",
11852
+ "columns": [
11853
+ "visibility_actor_user_id"
11854
+ ]
11855
+ }
11856
+ ],
11857
+ "version": "720fccdb"
11858
+ },
11859
+ "importPath": "@happyvertical/smrt-education"
11860
+ },
11861
+ "@happyvertical/smrt-education:GroupRevisionCommentCollection": {
11862
+ "name": "grouprevisioncommentcollection",
11863
+ "className": "GroupRevisionCommentCollection",
11864
+ "qualifiedName": "@happyvertical/smrt-education:GroupRevisionCommentCollection",
11865
+ "collection": "grouprevisioncomments",
11866
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
11867
+ "packageName": "@happyvertical/smrt-education",
11868
+ "fields": {},
11869
+ "methods": {},
11870
+ "decoratorConfig": {
11871
+ "tableName": "group_revision_comments",
11872
+ "api": false,
11873
+ "mcp": false,
11874
+ "cli": false
11875
+ },
11876
+ "extends": "SmrtCollection",
11877
+ "extendsTypeArg": "GroupRevisionComment",
11878
+ "exportName": "GroupRevisionCommentCollection",
11879
+ "collectionExportName": "GroupRevisionCommentCollectionCollection",
11880
+ "schema": {
11881
+ "tableName": "group_revision_comments",
11882
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_revision_comments\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"activity_id\" UUID NOT NULL,\n \"attempt_id\" UUID NOT NULL,\n \"revision_id\" UUID NOT NULL,\n \"author_user_id\" UUID NOT NULL,\n \"author_profile_id\" UUID NOT NULL,\n \"body\" TEXT,\n \"recorded_at\" TEXT,\n \"child_visible\" BOOLEAN NOT NULL DEFAULT FALSE,\n \"visibility_actor_user_id\" UUID,\n \"visibility_changed_at\" TIMESTAMP,\n \"visibility_version\" INTEGER NOT NULL DEFAULT 0\n);",
11883
+ "columns": {
11884
+ "id": {
11885
+ "type": "UUID",
11886
+ "primaryKey": true,
11887
+ "referenceKind": "id",
11888
+ "notNull": true
11889
+ },
11890
+ "slug": {
11891
+ "type": "TEXT",
11892
+ "notNull": true
11893
+ },
11894
+ "context": {
11895
+ "type": "TEXT",
11896
+ "notNull": true,
11897
+ "default": ""
11898
+ },
11899
+ "created_at": {
11900
+ "type": "TIMESTAMP",
11901
+ "notNull": true,
11902
+ "default": "current_timestamp"
11903
+ },
11904
+ "updated_at": {
11905
+ "type": "TIMESTAMP",
11906
+ "notNull": true,
11907
+ "default": "current_timestamp"
11908
+ },
11909
+ "tenant_id": {
11910
+ "type": "UUID",
11911
+ "referenceKind": "tenantId",
11912
+ "notNull": true,
11913
+ "unique": false
11914
+ },
11915
+ "membership_id": {
11916
+ "type": "UUID",
11917
+ "referenceKind": "foreignKey",
11918
+ "notNull": true,
11919
+ "unique": false,
11920
+ "foreignKey": {
11921
+ "table": "group_learner_memberships",
11922
+ "column": "id",
11923
+ "onDelete": "RESTRICT",
11924
+ "onUpdate": "CASCADE"
11925
+ }
11926
+ },
11927
+ "learner_id": {
11928
+ "type": "UUID",
11929
+ "referenceKind": "foreignKey",
11930
+ "notNull": true,
11931
+ "unique": false,
11932
+ "foreignKey": {
11933
+ "table": "learners",
11934
+ "column": "id",
11935
+ "onDelete": "RESTRICT",
11936
+ "onUpdate": "CASCADE"
11937
+ }
11938
+ },
11939
+ "activity_id": {
11940
+ "type": "UUID",
11941
+ "referenceKind": "foreignKey",
11942
+ "notNull": true,
11943
+ "unique": false,
11944
+ "foreignKey": {
11945
+ "table": "workbook_activities",
11946
+ "column": "id",
11947
+ "onDelete": "RESTRICT",
11948
+ "onUpdate": "CASCADE"
11949
+ }
11950
+ },
11951
+ "attempt_id": {
11952
+ "type": "UUID",
11953
+ "referenceKind": "foreignKey",
11954
+ "notNull": true,
11955
+ "unique": false,
11956
+ "foreignKey": {
11957
+ "table": "workbook_attempts",
11958
+ "column": "id",
11959
+ "onDelete": "RESTRICT",
11960
+ "onUpdate": "CASCADE"
11961
+ }
11962
+ },
11963
+ "revision_id": {
11964
+ "type": "UUID",
11965
+ "referenceKind": "foreignKey",
11966
+ "notNull": true,
11967
+ "unique": false,
11968
+ "foreignKey": {
11969
+ "table": "workbook_assessment_revisions",
11970
+ "column": "id",
11971
+ "onDelete": "RESTRICT",
11972
+ "onUpdate": "CASCADE"
11973
+ }
11974
+ },
11975
+ "author_user_id": {
11976
+ "type": "UUID",
11977
+ "referenceKind": "crossPackageRef",
11978
+ "notNull": true,
11979
+ "unique": false
11980
+ },
11981
+ "author_profile_id": {
11982
+ "type": "UUID",
11983
+ "referenceKind": "crossPackageRef",
11984
+ "notNull": true,
11985
+ "unique": false
11986
+ },
11987
+ "body": {
11988
+ "type": "TEXT",
11989
+ "notNull": false,
11990
+ "unique": false
11991
+ },
11992
+ "recorded_at": {
11993
+ "type": "TEXT",
11994
+ "notNull": false,
11995
+ "unique": false
11996
+ },
11997
+ "child_visible": {
11998
+ "type": "BOOLEAN",
11999
+ "notNull": true,
12000
+ "unique": false,
12001
+ "default": false
12002
+ },
12003
+ "visibility_actor_user_id": {
12004
+ "type": "UUID",
12005
+ "referenceKind": "crossPackageRef",
12006
+ "notNull": false,
12007
+ "unique": false
12008
+ },
12009
+ "visibility_changed_at": {
12010
+ "type": "TIMESTAMP",
12011
+ "notNull": false,
12012
+ "unique": false
12013
+ },
12014
+ "visibility_version": {
12015
+ "type": "INTEGER",
12016
+ "notNull": true,
12017
+ "unique": false,
12018
+ "default": 0
12019
+ }
12020
+ },
12021
+ "indexes": [
12022
+ {
12023
+ "name": "group_revision_comments_slug_context_idx",
12024
+ "columns": [
12025
+ "tenant_id",
12026
+ "slug",
12027
+ "context"
12028
+ ],
12029
+ "unique": true
12030
+ },
12031
+ {
12032
+ "name": "group_revision_comments_tenant_id_created_at_idx",
12033
+ "columns": [
12034
+ "tenant_id",
12035
+ "created_at"
12036
+ ]
12037
+ },
12038
+ {
12039
+ "name": "group_revision_comments_membership_id_idx",
12040
+ "columns": [
12041
+ "membership_id"
12042
+ ]
12043
+ },
12044
+ {
12045
+ "name": "group_revision_comments_learner_id_idx",
12046
+ "columns": [
12047
+ "learner_id"
12048
+ ]
12049
+ },
12050
+ {
12051
+ "name": "group_revision_comments_activity_id_idx",
12052
+ "columns": [
12053
+ "activity_id"
12054
+ ]
12055
+ },
12056
+ {
12057
+ "name": "group_revision_comments_attempt_id_idx",
12058
+ "columns": [
12059
+ "attempt_id"
12060
+ ]
12061
+ },
12062
+ {
12063
+ "name": "group_revision_comments_revision_id_idx",
12064
+ "columns": [
12065
+ "revision_id"
12066
+ ]
12067
+ },
12068
+ {
12069
+ "name": "group_revision_comments_author_user_id_idx",
12070
+ "columns": [
12071
+ "author_user_id"
12072
+ ]
12073
+ },
12074
+ {
12075
+ "name": "group_revision_comments_author_profile_id_idx",
12076
+ "columns": [
12077
+ "author_profile_id"
12078
+ ]
12079
+ },
12080
+ {
12081
+ "name": "group_revision_comments_visibility_actor_user_id_idx",
12082
+ "columns": [
12083
+ "visibility_actor_user_id"
12084
+ ]
12085
+ }
12086
+ ],
12087
+ "version": "720fccdb"
12088
+ },
12089
+ "importPath": "@happyvertical/smrt-education"
12090
+ },
12091
+ "@happyvertical/smrt-education:GroupLearnerRosterEntry": {
12092
+ "name": "grouplearnerrosterentry",
12093
+ "className": "GroupLearnerRosterEntry",
12094
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerRosterEntry",
12095
+ "collection": "grouplearnerrosterentries",
12096
+ "description": "Group-owned opaque roster index; authoritative consent remains family-owned.",
12097
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
12098
+ "packageName": "@happyvertical/smrt-education",
12099
+ "fields": {
12100
+ "tenantId": {
12101
+ "type": "text",
12102
+ "required": true,
12103
+ "_meta": {
12104
+ "sqlType": "UUID",
12105
+ "__tenancy": {
12106
+ "isTenantIdField": true,
12107
+ "autoFilter": true,
12108
+ "required": true,
12109
+ "autoPopulate": true,
12110
+ "nullable": false,
12111
+ "mode": "required",
12112
+ "field": "tenantId",
12113
+ "allowSuperAdminBypass": false
12114
+ }
12115
+ }
12116
+ },
12117
+ "groupId": {
12118
+ "type": "foreignKey",
12119
+ "required": true,
12120
+ "related": "EducationGroup",
12121
+ "_meta": {
12122
+ "required": true,
12123
+ "onDelete": "RESTRICT"
12124
+ }
12125
+ },
12126
+ "familyTenantId": {
12127
+ "type": "crossPackageRef",
12128
+ "required": true,
12129
+ "related": "@happyvertical/smrt-users:Tenant"
12130
+ },
12131
+ "learnerId": {
12132
+ "type": "text",
12133
+ "required": true,
12134
+ "_meta": {
12135
+ "sqlType": "UUID",
12136
+ "required": true
12137
+ }
12138
+ },
12139
+ "membershipId": {
12140
+ "type": "foreignKey",
12141
+ "required": true,
12142
+ "related": "GroupLearnerMembership",
12143
+ "_meta": {
12144
+ "required": true,
12145
+ "onDelete": "RESTRICT"
12146
+ }
12147
+ }
12148
+ },
12149
+ "methods": {
12150
+ "save": {
12151
+ "name": "save",
12152
+ "async": true,
12153
+ "parameters": [
12154
+ {
12155
+ "name": "options",
12156
+ "type": "SmrtSaveOptions",
12157
+ "optional": true
12158
+ }
12159
+ ],
12160
+ "returnType": "Promise<this>",
12161
+ "isStatic": false,
12162
+ "isPublic": true
12163
+ },
12164
+ "delete": {
12165
+ "name": "delete",
12166
+ "async": true,
12167
+ "parameters": [],
12168
+ "returnType": "Promise<void>",
12169
+ "isStatic": false,
12170
+ "isPublic": true
12171
+ }
12172
+ },
12173
+ "decoratorConfig": {
12174
+ "tableName": "group_learner_roster_entries",
12175
+ "conflictColumns": [
12176
+ "tenant_id",
12177
+ "group_id",
12178
+ "membership_id"
12179
+ ],
12180
+ "api": false,
12181
+ "mcp": false,
12182
+ "cli": false,
12183
+ "ai": {
12184
+ "callable": []
12185
+ },
12186
+ "tenantScoped": {
12187
+ "mode": "required"
12188
+ }
12189
+ },
12190
+ "extends": "SmrtObject",
12191
+ "exportName": "GroupLearnerRosterEntry",
12192
+ "collectionExportName": "GroupLearnerRosterEntryCollection",
12193
+ "validationRules": [
12194
+ {
12195
+ "field": "groupId",
12196
+ "rule": "required",
12197
+ "fieldType": "foreignKey"
12198
+ },
12199
+ {
12200
+ "field": "familyTenantId",
12201
+ "rule": "required",
12202
+ "fieldType": "crossPackageRef"
12203
+ },
12204
+ {
12205
+ "field": "learnerId",
12206
+ "rule": "required",
12207
+ "fieldType": "text"
12208
+ },
12209
+ {
12210
+ "field": "membershipId",
12211
+ "rule": "required",
12212
+ "fieldType": "foreignKey"
12213
+ }
12214
+ ],
12215
+ "schema": {
12216
+ "tableName": "group_learner_roster_entries",
12217
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_roster_entries\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"family_tenant_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL\n);",
12218
+ "columns": {
12219
+ "id": {
12220
+ "type": "UUID",
12221
+ "primaryKey": true,
12222
+ "referenceKind": "id",
12223
+ "notNull": true
12224
+ },
12225
+ "slug": {
12226
+ "type": "TEXT",
12227
+ "notNull": true
12228
+ },
12229
+ "context": {
12230
+ "type": "TEXT",
12231
+ "notNull": true,
12232
+ "default": ""
12233
+ },
12234
+ "created_at": {
12235
+ "type": "TIMESTAMP",
12236
+ "notNull": true,
12237
+ "default": "current_timestamp"
12238
+ },
12239
+ "updated_at": {
12240
+ "type": "TIMESTAMP",
12241
+ "notNull": true,
12242
+ "default": "current_timestamp"
12243
+ },
12244
+ "tenant_id": {
12245
+ "type": "UUID",
12246
+ "referenceKind": "tenantId",
12247
+ "notNull": true,
12248
+ "unique": false
12249
+ },
12250
+ "group_id": {
12251
+ "type": "UUID",
12252
+ "referenceKind": "foreignKey",
12253
+ "notNull": true,
12254
+ "unique": false,
12255
+ "foreignKey": {
12256
+ "table": "education_groups",
12257
+ "column": "id",
12258
+ "onDelete": "RESTRICT",
12259
+ "onUpdate": "CASCADE"
12260
+ }
12261
+ },
12262
+ "family_tenant_id": {
12263
+ "type": "UUID",
12264
+ "referenceKind": "crossPackageRef",
12265
+ "notNull": true,
12266
+ "unique": false
12267
+ },
12268
+ "learner_id": {
12269
+ "type": "UUID",
12270
+ "notNull": true,
12271
+ "unique": false
12272
+ },
12273
+ "membership_id": {
12274
+ "type": "UUID",
12275
+ "referenceKind": "foreignKey",
12276
+ "notNull": true,
12277
+ "unique": false,
12278
+ "foreignKey": {
12279
+ "table": "group_learner_memberships",
12280
+ "column": "id",
12281
+ "onDelete": "RESTRICT",
12282
+ "onUpdate": "CASCADE"
12283
+ }
12284
+ }
12285
+ },
12286
+ "indexes": [
12287
+ {
12288
+ "name": "group_learner_roster_entries_tenant_id_group_id_idx",
12289
+ "columns": [
12290
+ "tenant_id",
12291
+ "group_id",
12292
+ "membership_id"
12293
+ ],
12294
+ "unique": true
12295
+ },
12296
+ {
12297
+ "name": "group_learner_roster_entries_slug_context_idx",
12298
+ "columns": [
12299
+ "slug",
12300
+ "context"
12301
+ ]
12302
+ },
12303
+ {
12304
+ "name": "group_learner_roster_entries_tenant_id_created_at_idx",
12305
+ "columns": [
12306
+ "tenant_id",
12307
+ "created_at"
12308
+ ]
12309
+ },
12310
+ {
12311
+ "name": "group_learner_roster_entries_group_id_idx",
12312
+ "columns": [
12313
+ "group_id"
12314
+ ]
12315
+ },
12316
+ {
12317
+ "name": "group_learner_roster_entries_family_tenant_id_idx",
12318
+ "columns": [
12319
+ "family_tenant_id"
12320
+ ]
12321
+ },
12322
+ {
12323
+ "name": "group_learner_roster_entries_membership_id_idx",
12324
+ "columns": [
12325
+ "membership_id"
12326
+ ]
12327
+ }
12328
+ ],
12329
+ "version": "c6ebaeb2"
12330
+ },
12331
+ "importPath": "@happyvertical/smrt-education"
12332
+ },
12333
+ "@happyvertical/smrt-education:GroupLearnerRosterEntryCollection": {
12334
+ "name": "grouplearnerrosterentrycollection",
12335
+ "className": "GroupLearnerRosterEntryCollection",
12336
+ "qualifiedName": "@happyvertical/smrt-education:GroupLearnerRosterEntryCollection",
12337
+ "collection": "grouplearnerrosterentries",
12338
+ "filePath": "/home/runner/work/smrt/smrt/packages/education/src/group-sharing-models.ts",
12339
+ "packageName": "@happyvertical/smrt-education",
12340
+ "fields": {},
12341
+ "methods": {},
12342
+ "decoratorConfig": {
12343
+ "tableName": "group_learner_roster_entries",
12344
+ "api": false,
12345
+ "mcp": false,
12346
+ "cli": false
12347
+ },
12348
+ "extends": "SmrtCollection",
12349
+ "extendsTypeArg": "GroupLearnerRosterEntry",
12350
+ "exportName": "GroupLearnerRosterEntryCollection",
12351
+ "collectionExportName": "GroupLearnerRosterEntryCollectionCollection",
12352
+ "schema": {
12353
+ "tableName": "group_learner_roster_entries",
12354
+ "ddl": "CREATE TABLE IF NOT EXISTS \"group_learner_roster_entries\" (\n \"id\" UUID PRIMARY KEY NOT NULL,\n \"slug\" TEXT NOT NULL,\n \"context\" TEXT NOT NULL DEFAULT '',\n \"created_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"updated_at\" TIMESTAMP NOT NULL DEFAULT current_timestamp,\n \"tenant_id\" UUID NOT NULL,\n \"group_id\" UUID NOT NULL,\n \"family_tenant_id\" UUID NOT NULL,\n \"learner_id\" UUID NOT NULL,\n \"membership_id\" UUID NOT NULL\n);",
12355
+ "columns": {
12356
+ "id": {
12357
+ "type": "UUID",
12358
+ "primaryKey": true,
12359
+ "referenceKind": "id",
12360
+ "notNull": true
12361
+ },
12362
+ "slug": {
12363
+ "type": "TEXT",
12364
+ "notNull": true
12365
+ },
12366
+ "context": {
12367
+ "type": "TEXT",
12368
+ "notNull": true,
12369
+ "default": ""
12370
+ },
12371
+ "created_at": {
12372
+ "type": "TIMESTAMP",
12373
+ "notNull": true,
12374
+ "default": "current_timestamp"
12375
+ },
12376
+ "updated_at": {
12377
+ "type": "TIMESTAMP",
12378
+ "notNull": true,
12379
+ "default": "current_timestamp"
12380
+ },
12381
+ "tenant_id": {
12382
+ "type": "UUID",
12383
+ "referenceKind": "tenantId",
12384
+ "notNull": true,
12385
+ "unique": false
12386
+ },
12387
+ "group_id": {
12388
+ "type": "UUID",
12389
+ "referenceKind": "foreignKey",
12390
+ "notNull": true,
12391
+ "unique": false,
12392
+ "foreignKey": {
12393
+ "table": "education_groups",
12394
+ "column": "id",
12395
+ "onDelete": "RESTRICT",
12396
+ "onUpdate": "CASCADE"
12397
+ }
12398
+ },
12399
+ "family_tenant_id": {
12400
+ "type": "UUID",
12401
+ "referenceKind": "crossPackageRef",
12402
+ "notNull": true,
12403
+ "unique": false
12404
+ },
12405
+ "learner_id": {
12406
+ "type": "UUID",
12407
+ "notNull": true,
12408
+ "unique": false
12409
+ },
12410
+ "membership_id": {
12411
+ "type": "UUID",
12412
+ "referenceKind": "foreignKey",
12413
+ "notNull": true,
12414
+ "unique": false,
12415
+ "foreignKey": {
12416
+ "table": "group_learner_memberships",
12417
+ "column": "id",
12418
+ "onDelete": "RESTRICT",
12419
+ "onUpdate": "CASCADE"
12420
+ }
12421
+ }
12422
+ },
12423
+ "indexes": [
12424
+ {
12425
+ "name": "group_learner_roster_entries_tenant_id_group_id_idx",
12426
+ "columns": [
12427
+ "tenant_id",
12428
+ "group_id",
12429
+ "membership_id"
12430
+ ],
12431
+ "unique": true
12432
+ },
12433
+ {
12434
+ "name": "group_learner_roster_entries_slug_context_idx",
12435
+ "columns": [
12436
+ "slug",
12437
+ "context"
12438
+ ]
12439
+ },
12440
+ {
12441
+ "name": "group_learner_roster_entries_tenant_id_created_at_idx",
12442
+ "columns": [
12443
+ "tenant_id",
12444
+ "created_at"
12445
+ ]
12446
+ },
12447
+ {
12448
+ "name": "group_learner_roster_entries_group_id_idx",
12449
+ "columns": [
12450
+ "group_id"
12451
+ ]
12452
+ },
12453
+ {
12454
+ "name": "group_learner_roster_entries_family_tenant_id_idx",
12455
+ "columns": [
12456
+ "family_tenant_id"
12457
+ ]
12458
+ },
12459
+ {
12460
+ "name": "group_learner_roster_entries_membership_id_idx",
12461
+ "columns": [
12462
+ "membership_id"
12463
+ ]
12464
+ }
12465
+ ],
12466
+ "version": "c6ebaeb2"
12467
+ },
12468
+ "importPath": "@happyvertical/smrt-education"
12469
+ },
9788
12470
  "@happyvertical/smrt-education:Learner": {
9789
12471
  "name": "learner",
9790
12472
  "className": "Learner",
@@ -18630,6 +21312,51 @@
18630
21312
  "Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627)."
18631
21313
  ]
18632
21314
  }
21315
+ },
21316
+ {
21317
+ "id": "education.supervisor",
21318
+ "className": "EducationSupervisorRecipe",
21319
+ "label": "Homeschool groups",
21320
+ "summary": "Review parent-authorized learning work and retain revision-bound comments.",
21321
+ "synonyms": [
21322
+ "homeschool groups",
21323
+ "supervisor review"
21324
+ ],
21325
+ "models": [
21326
+ "@happyvertical/smrt-education:EducationGroup",
21327
+ "@happyvertical/smrt-education:GroupLearnerInvitation",
21328
+ "@happyvertical/smrt-education:GroupLearnerMembership",
21329
+ "@happyvertical/smrt-education:GroupLearnerRosterEntry",
21330
+ "@happyvertical/smrt-education:GroupSharingPolicy",
21331
+ "@happyvertical/smrt-education:GroupRevisionComment"
21332
+ ],
21333
+ "nav": [
21334
+ {
21335
+ "label": "Groups",
21336
+ "model": "@happyvertical/smrt-education:EducationGroup",
21337
+ "icon": "users",
21338
+ "description": "Groups and currently authorized shared learning work.",
21339
+ "noun": "group"
21340
+ }
21341
+ ],
21342
+ "requires": [],
21343
+ "section": {
21344
+ "id": "education",
21345
+ "label": "Education",
21346
+ "icon": "users",
21347
+ "description": "Courses and lessons for learning."
21348
+ },
21349
+ "help": {
21350
+ "markdown": "# Homeschool groups\n\nCompose `education.supervisor` with the education learner workflow to manage\nindependent group tenants and parent-approved links to existing family learners.\nRecipe discovery supplies models and navigation metadata; it grants no generated\nCRUD or family access.\n\nHosts use the closed group sharing services with a live session authorizer on\nthe supplied database executor. Supervisors remain group members, never family\nguardians. A parent must choose an explicit sharing policy when accepting a\ntargeted invitation. Work, revisions, source bytes and comment attribution remain\nfamily-owned after leaving a group.\n\nEvery roster, work, revision, media, comment and progress request must check\ncurrent authority and policy. Serve media through the authorized reader and a\nprivate, non-cacheable host response; never publish storage URLs. Saved parent\ncomment visibility defaults to parent-only. Supervisor comments cannot grade or\nchange learning evidence.\n\nSee the shipped `agents/group-sharing.md` contract for selectors, facet semantics,\ntransaction requirements and migration expectations.\n",
21351
+ "fieldRefs": []
21352
+ },
21353
+ "runtime": "both",
21354
+ "demo": {
21355
+ "mode": "server",
21356
+ "reasons": [
21357
+ "Needs a server because its package depends on @happyvertical/smrt-agents, @happyvertical/smrt-jobs, @happyvertical/smrt-profiles, @happyvertical/smrt-reports, @happyvertical/smrt-secrets, @happyvertical/smrt-tenancy, @happyvertical/smrt-users, which do not build for a browser (#3615, #3617, #3624, #3625, #3626, #3627)."
21358
+ ]
21359
+ }
18633
21360
  }
18634
21361
  ],
18635
21362
  "smrtDependencies": [