@happyvertical/smrt-education 0.57.40 → 0.57.42

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 (54) hide show
  1. package/AGENTS.md +12 -0
  2. package/README.md +10 -0
  3. package/agents/enrollment-notes.md +42 -0
  4. package/agents/group-sharing.md +278 -0
  5. package/agents/learner-plan.md +66 -0
  6. package/agents/submission-service.md +16 -1
  7. package/agents/workbook-service.md +39 -3
  8. package/dist/chunks/{workbook-photo-service-DCmqeWLd.js → workbook-photo-service-C6mbUUp6.js} +721 -280
  9. package/dist/chunks/workbook-photo-service-C6mbUUp6.js.map +1 -0
  10. package/dist/enrollment-note-service.d.ts +24 -0
  11. package/dist/enrollment-note-service.d.ts.map +1 -0
  12. package/dist/enrollment-notes.d.ts +22 -0
  13. package/dist/enrollment-notes.d.ts.map +1 -0
  14. package/dist/group-sharing-authorization.d.ts +67 -0
  15. package/dist/group-sharing-authorization.d.ts.map +1 -0
  16. package/dist/group-sharing-comments.d.ts +30 -0
  17. package/dist/group-sharing-comments.d.ts.map +1 -0
  18. package/dist/group-sharing-contracts.d.ts +201 -0
  19. package/dist/group-sharing-contracts.d.ts.map +1 -0
  20. package/dist/group-sharing-hash.d.ts +3 -0
  21. package/dist/group-sharing-hash.d.ts.map +1 -0
  22. package/dist/group-sharing-models.d.ts +106 -0
  23. package/dist/group-sharing-models.d.ts.map +1 -0
  24. package/dist/group-sharing-policy.d.ts +19 -0
  25. package/dist/group-sharing-policy.d.ts.map +1 -0
  26. package/dist/group-sharing-reader.d.ts +45 -0
  27. package/dist/group-sharing-reader.d.ts.map +1 -0
  28. package/dist/group-sharing-service.d.ts +108 -0
  29. package/dist/group-sharing-service.d.ts.map +1 -0
  30. package/dist/group-sharing-workspace.d.ts +10 -0
  31. package/dist/group-sharing-workspace.d.ts.map +1 -0
  32. package/dist/index.d.ts +13 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2266 -56
  35. package/dist/index.js.map +1 -1
  36. package/dist/ingestion.js +1 -1
  37. package/dist/learner-plan-service.d.ts +46 -0
  38. package/dist/learner-plan-service.d.ts.map +1 -0
  39. package/dist/learner-service.d.ts +1 -1
  40. package/dist/learner-service.d.ts.map +1 -1
  41. package/dist/manifest.json +5610 -1922
  42. package/dist/recipes.d.ts +24 -0
  43. package/dist/recipes.d.ts.map +1 -1
  44. package/dist/smrt-knowledge.json +1455 -48
  45. package/dist/submission-service.d.ts +3 -0
  46. package/dist/submission-service.d.ts.map +1 -1
  47. package/dist/workbook-completion.d.ts +38 -0
  48. package/dist/workbook-completion.d.ts.map +1 -0
  49. package/dist/workbook-contracts.d.ts +33 -0
  50. package/dist/workbook-contracts.d.ts.map +1 -1
  51. package/dist/workbook-service.d.ts +6 -1
  52. package/dist/workbook-service.d.ts.map +1 -1
  53. package/package.json +9 -9
  54. package/dist/chunks/workbook-photo-service-DCmqeWLd.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import { type LearnerRequest, LearnerService } from './learner-service.js';
3
+ export type EnrollmentParentNoteView = Readonly<{
4
+ id: string;
5
+ enrollmentId: string;
6
+ learnerId: string;
7
+ text: string;
8
+ authorUserId: string;
9
+ authorLabel: string;
10
+ createdAt: Date;
11
+ }>;
12
+ /** Internal extension shared by the public learner Plan service. */
13
+ export declare class EnrollmentNoteService extends LearnerService {
14
+ protected createTransactionService(db: DatabaseInterface): this;
15
+ listEnrollmentNotes(request: LearnerRequest & {
16
+ enrollmentId: string;
17
+ }): Promise<EnrollmentParentNoteView[]>;
18
+ addEnrollmentNote(request: LearnerRequest & {
19
+ enrollmentId: string;
20
+ text: string;
21
+ requestKey: string;
22
+ }): Promise<EnrollmentParentNoteView>;
23
+ }
24
+ //# sourceMappingURL=enrollment-note-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrollment-note-service.d.ts","sourceRoot":"","sources":["../src/enrollment-note-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAM5D,OAAO,EAAE,KAAK,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC,CAAC;AAcH,oEAAoE;AACpE,qBAAa,qBAAsB,SAAQ,cAAc;cACpC,wBAAwB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAQlE,mBAAmB,CACvB,OAAO,EAAE,cAAc,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAiBhC,iBAAiB,CACrB,OAAO,EAAE,cAAc,GAAG;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,GACA,OAAO,CAAC,wBAAwB,CAAC;CAkDrC"}
@@ -0,0 +1,22 @@
1
+ import { SmrtCollection, SmrtObject, type SmrtSaveOptions } from '@happyvertical/smrt-core';
2
+ export declare const ENROLLMENT_NOTE_MAX_LENGTH = 4000;
3
+ /** Notes are plain text; consumers render text, never HTML or markdown. */
4
+ export declare function validateEnrollmentNote(text: string, requestKey: string): void;
5
+ /** Private guardian annotations, separate from learning and assessment history. */
6
+ export declare class EnrollmentParentNote extends SmrtObject {
7
+ tenantId: string;
8
+ enrollmentId: string;
9
+ learnerId: string;
10
+ authorUserId: string;
11
+ authorLabel: string;
12
+ text: string;
13
+ requestKey: string;
14
+ recordedAt: Date;
15
+ constructor(options?: Record<string, unknown>);
16
+ delete(): Promise<void>;
17
+ save(options?: SmrtSaveOptions): Promise<this>;
18
+ }
19
+ export declare class EnrollmentParentNoteCollection extends SmrtCollection<EnrollmentParentNote> {
20
+ static readonly _itemClass: typeof EnrollmentParentNote;
21
+ }
22
+ //# sourceMappingURL=enrollment-notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enrollment-notes.d.ts","sourceRoot":"","sources":["../src/enrollment-notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACd,UAAU,EACV,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAGlC,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAe/C,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAe7E;AAED,mFAAmF;AACnF,qBAQa,oBAAqB,SAAQ,UAAU;IACtC,QAAQ,SAAM;IACoB,YAAY,SAAM;IACrB,SAAS,SAAM;IAE1D,YAAY,SAAM;IAClB,WAAW,SAAY;IACvB,IAAI,SAAM;IACV,UAAU,SAAM;IAChB,UAAU,OAAc;gBAEZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAQlC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA4B9D;AAED,qBAAa,8BAA+B,SAAQ,cAAc,CAAC,oBAAoB,CAAC;IACtF,MAAM,CAAC,QAAQ,CAAC,UAAU,8BAAwB;CACnD"}
@@ -0,0 +1,67 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import { type GroupSharingActor, type GroupSharingScope } from './group-sharing-contracts.js';
3
+ export type GroupSharingAction = 'education.group.create' | 'education.group.manage' | 'education.group.read' | 'education.group.invite' | 'education.group.share' | 'education.group.review' | 'education.group.comment' | 'education.group.child-comments';
4
+ export type GroupSharingAuthorizer = (request: GroupSharingActor & {
5
+ action: GroupSharingAction;
6
+ executor: DatabaseInterface;
7
+ groupId?: string;
8
+ groupTenantId?: string;
9
+ familyTenantId?: string;
10
+ learnerId?: string;
11
+ /** Host must validate current guardian type and effective terms on this executor. */
12
+ guardianRelationships?: ReadonlyArray<{
13
+ id: string;
14
+ typeId: string;
15
+ }>;
16
+ }) => boolean | Promise<boolean>;
17
+ /** Internal owning predicate; unavailable individual edges may be omitted, host/DB failures may not. */
18
+ export declare function isGroupSharingScopeDenial(error: unknown): boolean;
19
+ /** Same connection queue as workbook mutations, with a real rollback boundary. */
20
+ export declare function groupSharingTransaction<T>(db: DatabaseInterface, operation: (executor: DatabaseInterface) => Promise<T>): Promise<T>;
21
+ /** Internal owning boundary. Never returned from a public sharing operation. */
22
+ export declare class GroupSharingBoundary {
23
+ readonly db: DatabaseInterface;
24
+ readonly authorize: GroupSharingAuthorizer;
25
+ constructor(db: DatabaseInterface, authorize: GroupSharingAuthorizer);
26
+ private hostDecision;
27
+ requireIdentity(actor: GroupSharingActor): Promise<{
28
+ id: string;
29
+ profileId: string;
30
+ }>;
31
+ check(request: GroupSharingActor & {
32
+ groupId?: string;
33
+ familyTenantId?: string;
34
+ learnerId?: string;
35
+ }, action: GroupSharingAction, extra?: {
36
+ groupTenantId?: string;
37
+ guardianRelationships?: ReadonlyArray<{
38
+ id: string;
39
+ typeId: string;
40
+ }>;
41
+ }): Promise<void>;
42
+ /** Loading a group reveals no family data; its users tenant must remain active. */
43
+ loadGroup(groupId: string, allowInactive?: boolean): Promise<import("./group-sharing-models.js").EducationGroup>;
44
+ requireGroup(request: GroupSharingActor & {
45
+ groupId: string;
46
+ }, action?: GroupSharingAction): Promise<import("./group-sharing-models.js").EducationGroup>;
47
+ /** Discover only this actor's group metadata while retaining their authenticated session context. */
48
+ discoverGroup(request: GroupSharingActor & {
49
+ groupId: string;
50
+ }): Promise<import("./group-sharing-models.js").EducationGroup | null>;
51
+ /** Own-learner navigation is a separate capability and never synthesizes guardian authority. */
52
+ requireOwnLearner(request: Omit<GroupSharingScope, 'groupId'>): Promise<import("./learners.js").Learner>;
53
+ requireGuardian(request: Omit<GroupSharingScope, 'groupId'> & {
54
+ groupId?: string;
55
+ }, action?: GroupSharingAction): Promise<import("./learners.js").Learner>;
56
+ private loadLearner;
57
+ requireScope(request: GroupSharingScope, action?: GroupSharingAction, mode?: 'supervisor' | 'guardian' | 'child'): Promise<{
58
+ membership: import("./group-sharing-models.js").GroupLearnerMembership;
59
+ policyRecord: import("./group-sharing-models.js").GroupSharingPolicy;
60
+ policy: import("./group-sharing-contracts.js").GroupSharingPolicyV1;
61
+ group: import("./group-sharing-models.js").EducationGroup;
62
+ learner: import("./learners.js").Learner;
63
+ }>;
64
+ }
65
+ /** Fixed lock order shared with workbook: learner, exact group edge, then invitation/comment. */
66
+ export declare function lockGroupSharingScope(db: DatabaseInterface, request: Pick<GroupSharingScope, 'familyTenantId' | 'learnerId' | 'groupId'>): Promise<void>;
67
+ //# sourceMappingURL=group-sharing-authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-authorization.d.ts","sourceRoot":"","sources":["../src/group-sharing-authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import { type GroupSharingAuthorizer } from './group-sharing-authorization.js';
3
+ import { type GroupRevisionCommentView, type GroupSharedWorkSelector, type GroupSharingScope } from './group-sharing-contracts.js';
4
+ export type ListRevisionCommentsRequest = GroupSharedWorkSelector & {
5
+ /** Explicit paths prevent failed supervisor checks from falling back to family authority. */
6
+ access?: 'supervisor' | 'guardian' | 'child';
7
+ };
8
+ export type AddRevisionCommentRequest = GroupSharedWorkSelector & {
9
+ body: string;
10
+ };
11
+ export type SetCommentChildVisibilityRequest = GroupSharingScope & {
12
+ commentId: string;
13
+ expectedVersion: number;
14
+ visible: boolean;
15
+ };
16
+ /** Attributed discussion only: this service never writes assessment, grade or progress. */
17
+ export declare class GroupSharingCommentService {
18
+ private readonly db;
19
+ private readonly authorize;
20
+ /** @internal Only the queued GroupSharingService transaction may set this. */
21
+ private readonly executorBound;
22
+ constructor(db: DatabaseInterface, authorize: GroupSharingAuthorizer,
23
+ /** @internal Only the queued GroupSharingService transaction may set this. */
24
+ executorBound?: boolean);
25
+ private run;
26
+ addRevisionComment(input: AddRevisionCommentRequest): Promise<GroupRevisionCommentView>;
27
+ listRevisionComments(input: ListRevisionCommentsRequest): Promise<ReadonlyArray<GroupRevisionCommentView>>;
28
+ setCommentChildVisibility(input: SetCommentChildVisibilityRequest): Promise<GroupRevisionCommentView>;
29
+ }
30
+ //# sourceMappingURL=group-sharing-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-comments.d.ts","sourceRoot":"","sources":["../src/group-sharing-comments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAG5B,KAAK,iBAAiB,EACvB,MAAM,8BAA8B,CAAC;AAQtC,MAAM,MAAM,2BAA2B,GAAG,uBAAuB,GAAG;IAClE,6FAA6F;IAC7F,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;CAC9C,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,GAAG;IAChE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,MAAM,MAAM,gCAAgC,GAAG,iBAAiB,GAAG;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AA6HF,2FAA2F;AAC3F,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,sBAAsB;IAClD,8EAA8E;IAC7D,aAAa,UAAQ;IAExC,OAAO,CAAC,GAAG;IAML,kBAAkB,CACtB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,wBAAwB,CAAC;IA+C9B,oBAAoB,CACxB,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC;IAmG7C,yBAAyB,CAC7B,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,wBAAwB,CAAC;CA8DrC"}
@@ -0,0 +1,201 @@
1
+ import type { WorkbookAssessment, WorkbookConceptSummary } from './workbook-contracts.js';
2
+ export type GroupSharingSelector = {
3
+ mode: 'all';
4
+ } | {
5
+ mode: 'include';
6
+ values: string[];
7
+ };
8
+ export interface GroupSharingPolicyV1 {
9
+ schemaVersion: 1;
10
+ shareWork: boolean;
11
+ shareMedia: boolean;
12
+ shareFeedback: boolean;
13
+ shareProgress: boolean;
14
+ parentReviewedOnly: boolean;
15
+ commentVisibility: 'parent-only' | 'learner-visible';
16
+ historyFrom: string;
17
+ subjects: GroupSharingSelector;
18
+ courseIds: GroupSharingSelector;
19
+ }
20
+ export interface GroupSharingActor {
21
+ actorUserId: string;
22
+ sessionId: string;
23
+ }
24
+ export interface GroupSharingScope extends GroupSharingActor {
25
+ groupId: string;
26
+ familyTenantId: string;
27
+ learnerId: string;
28
+ }
29
+ export interface GroupSharedWorkSelector extends GroupSharingScope {
30
+ activityId: string;
31
+ attemptId: string;
32
+ revisionId?: string;
33
+ }
34
+ export interface GroupSharingWorkFacts {
35
+ capturedAt: string;
36
+ courseId: string | null;
37
+ subject: string | null;
38
+ parentReviewed: boolean;
39
+ }
40
+ export interface GroupSharingDecision {
41
+ eligible: boolean;
42
+ work: boolean;
43
+ media: boolean;
44
+ feedback: boolean;
45
+ progress: boolean;
46
+ reasons: string[];
47
+ }
48
+ export type GroupLearnerInvitationStatus = 'pending' | 'accepted' | 'revoked' | 'declined';
49
+ export type GroupLearnerMembershipStatus = 'active' | 'revoked';
50
+ export interface EducationGroupView {
51
+ readonly id: string;
52
+ readonly tenantId: string;
53
+ readonly name: string;
54
+ readonly active: boolean;
55
+ readonly creatorUserId: string;
56
+ readonly creatorProfileId: string;
57
+ }
58
+ export interface GroupLearnerInvitationView {
59
+ readonly id: string;
60
+ readonly groupId: string;
61
+ readonly familyTenantId: string;
62
+ readonly learnerId: string;
63
+ readonly invitedParentUserId: string;
64
+ readonly creatorUserId: string;
65
+ readonly expiresAt: string;
66
+ readonly status: GroupLearnerInvitationStatus;
67
+ readonly acceptedMembershipId: string | null;
68
+ readonly acceptedPolicyDigest: string;
69
+ }
70
+ /** Parent-only invitation detail; current exact guardian proof is required. */
71
+ export interface GroupLearnerParentInvitationView extends GroupLearnerInvitationView {
72
+ readonly groupName: string;
73
+ readonly learnerDisplayName: string;
74
+ }
75
+ export interface GroupLearnerMembershipView {
76
+ readonly id: string;
77
+ readonly familyTenantId: string;
78
+ readonly groupId: string;
79
+ readonly learnerId: string;
80
+ readonly consentParentUserId: string;
81
+ readonly status: GroupLearnerMembershipStatus;
82
+ readonly policyVersion: number;
83
+ }
84
+ /** Family-owned participation summary retained after leaving or group disabling. */
85
+ export interface GroupLearnerMembershipSummaryView extends GroupLearnerMembershipView {
86
+ readonly groupName: string;
87
+ readonly groupActive: boolean;
88
+ }
89
+ export interface GroupSharingPolicyHistoryEntryView {
90
+ readonly id: string;
91
+ readonly membershipId: string;
92
+ readonly familyTenantId: string;
93
+ readonly version: number;
94
+ readonly schemaVersion: 1;
95
+ readonly policy: GroupSharingPolicyV1;
96
+ readonly actorUserId: string;
97
+ readonly recordedAt: string;
98
+ }
99
+ export interface GroupSharingPolicyHistoryView {
100
+ readonly policies: ReadonlyArray<GroupSharingPolicyHistoryEntryView>;
101
+ readonly nextAfterVersion: number | null;
102
+ }
103
+ /** Authorized roster identity; exposes no family account or profile metadata. */
104
+ export interface GroupLearnerRosterView extends GroupLearnerMembershipView {
105
+ readonly learnerDisplayName: string;
106
+ }
107
+ export interface GroupSharedWorkView {
108
+ readonly activityId: string;
109
+ readonly attemptId: string;
110
+ readonly submissionId: string;
111
+ readonly capturedAt: string;
112
+ readonly courseId: string | null;
113
+ readonly subject: string | null;
114
+ readonly facets: GroupSharingDecision;
115
+ readonly revisionId: string | null;
116
+ readonly commentRevisionId: string | null;
117
+ readonly media: ReadonlyArray<{
118
+ assetId: string;
119
+ sha256: string;
120
+ pageCount: number;
121
+ }>;
122
+ }
123
+ export interface GroupSharedRevisionView {
124
+ readonly activityId: string;
125
+ readonly attemptId: string;
126
+ readonly submissionId: string;
127
+ readonly revisionId: string;
128
+ readonly createdAt: string;
129
+ readonly kind: 'ai' | 'guardian';
130
+ readonly assessment: WorkbookAssessment;
131
+ }
132
+ export interface GroupSharingPreview {
133
+ readonly policy: GroupSharingPolicyV1;
134
+ readonly works: ReadonlyArray<{
135
+ activityId: string;
136
+ attemptId: string;
137
+ submissionId: string;
138
+ decision: GroupSharingDecision;
139
+ }>;
140
+ }
141
+ export interface GroupSharedProgressView {
142
+ readonly algorithmVersion: 'workbook-descriptive-v1';
143
+ readonly counts: {
144
+ attempts: number;
145
+ episodes: number;
146
+ assistance: {
147
+ independent: number;
148
+ assisted: number;
149
+ unknown: number;
150
+ };
151
+ };
152
+ readonly concepts: ReadonlyArray<WorkbookConceptSummary>;
153
+ }
154
+ export interface GroupRevisionCommentView {
155
+ readonly id: string;
156
+ readonly familyTenantId: string;
157
+ readonly membershipId: string;
158
+ readonly learnerId: string;
159
+ readonly activityId: string;
160
+ readonly attemptId: string;
161
+ readonly revisionId: string;
162
+ readonly authorUserId: string;
163
+ readonly authorProfileId: string;
164
+ readonly body: string;
165
+ readonly recordedAt: string;
166
+ readonly childVisible: boolean;
167
+ readonly visibilityActorUserId: string | null;
168
+ readonly visibilityChangedAt: string | null;
169
+ readonly visibilityVersion: number;
170
+ }
171
+ export declare class GroupSharingAuthorizationError extends Error {
172
+ constructor(message?: string);
173
+ }
174
+ export declare class GroupSharingConflictError extends Error {
175
+ constructor(message?: string);
176
+ }
177
+ export declare class GroupSharingPolicyValidationError extends Error {
178
+ constructor(message?: string);
179
+ }
180
+ /** Reject missing/unknown fields and unsupported versions rather than widening consent. */
181
+ export declare function validateGroupSharingPolicy(value: unknown): asserts value is GroupSharingPolicyV1;
182
+ /** Stable representation for immutable acceptance digests and policy snapshots. */
183
+ export declare function canonicalGroupSharingPolicy(value: unknown): string;
184
+ /** Submitted opaque selectors only; conveys no family data or continuing authority. */
185
+ export interface GroupLearnerRosterEntryView {
186
+ readonly id: string;
187
+ readonly groupId: string;
188
+ readonly familyTenantId: string;
189
+ readonly learnerId: string;
190
+ readonly membershipId: string;
191
+ }
192
+ /** Current guardian choices for this learner, independent of any group consent. */
193
+ export interface GroupSharingPolicyOptionsView {
194
+ readonly courses: ReadonlyArray<{
195
+ id: string;
196
+ label: string;
197
+ subject: string | null;
198
+ }>;
199
+ readonly subjects: ReadonlyArray<string>;
200
+ }
201
+ //# sourceMappingURL=group-sharing-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-contracts.d.ts","sourceRoot":"","sources":["../src/group-sharing-contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Resolve server hashing only when called; recipe/model roots remain browser-safe. */
2
+ export declare function groupSharingDigest(value: string | Uint8Array): string;
3
+ //# sourceMappingURL=group-sharing-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-hash.d.ts","sourceRoot":"","sources":["../src/group-sharing-hash.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAMrE"}
@@ -0,0 +1,106 @@
1
+ import { SmrtCollection, SmrtObject, type SmrtSaveOptions } from '@happyvertical/smrt-core';
2
+ import { type GroupLearnerInvitationStatus, type GroupLearnerMembershipStatus, type GroupSharingPolicyV1 } from './group-sharing-contracts.js';
3
+ /** Independent group tenant metadata; no family authority is implied. */
4
+ export declare class EducationGroup extends SmrtObject {
5
+ tenantId: string;
6
+ name: string;
7
+ active: boolean;
8
+ creatorUserId: string;
9
+ creatorProfileId: string;
10
+ constructor(options?: Record<string, unknown>);
11
+ save(options?: SmrtSaveOptions): Promise<this>;
12
+ delete(): Promise<void>;
13
+ }
14
+ export declare class EducationGroupCollection extends SmrtCollection<EducationGroup> {
15
+ static readonly _itemClass: typeof EducationGroup;
16
+ }
17
+ /** Group-owned target selectors are opaque until the exact parent accepts. */
18
+ export declare class GroupLearnerInvitation extends SmrtObject {
19
+ tenantId: string;
20
+ groupId: string;
21
+ familyTenantId: string;
22
+ learnerId: string;
23
+ invitedParentUserId: string;
24
+ creatorUserId: string;
25
+ expiresAt: Date;
26
+ status: GroupLearnerInvitationStatus;
27
+ acceptedMembershipId: string | null;
28
+ acceptedPolicyDigest: string;
29
+ constructor(options?: Record<string, unknown>);
30
+ save(options?: SmrtSaveOptions): Promise<this>;
31
+ delete(): Promise<void>;
32
+ }
33
+ export declare class GroupLearnerInvitationCollection extends SmrtCollection<GroupLearnerInvitation> {
34
+ static readonly _itemClass: typeof GroupLearnerInvitation;
35
+ }
36
+ /** Family-owned per-child consent edge, never a users membership. */
37
+ export declare class GroupLearnerMembership extends SmrtObject {
38
+ tenantId: string;
39
+ groupId: string;
40
+ learnerId: string;
41
+ consentParentUserId: string;
42
+ status: GroupLearnerMembershipStatus;
43
+ policyVersion: number;
44
+ constructor(options?: Record<string, unknown>);
45
+ save(options?: SmrtSaveOptions): Promise<this>;
46
+ delete(): Promise<void>;
47
+ }
48
+ export declare class GroupLearnerMembershipCollection extends SmrtCollection<GroupLearnerMembership> {
49
+ static readonly _itemClass: typeof GroupLearnerMembership;
50
+ }
51
+ /** Immutable explicit policy snapshot. */
52
+ export declare class GroupSharingPolicy extends SmrtObject {
53
+ tenantId: string;
54
+ membershipId: string;
55
+ version: number;
56
+ schemaVersion: number;
57
+ policyJson: string;
58
+ actorUserId: string;
59
+ recordedAt: Date;
60
+ constructor(options?: Record<string, unknown>);
61
+ getPolicy(): GroupSharingPolicyV1;
62
+ setPolicy(value: unknown): void;
63
+ save(options?: SmrtSaveOptions): Promise<this>;
64
+ delete(): Promise<void>;
65
+ }
66
+ export declare class GroupSharingPolicyCollection extends SmrtCollection<GroupSharingPolicy> {
67
+ static readonly _itemClass: typeof GroupSharingPolicy;
68
+ }
69
+ /** Attributed revision comment, separate from grading and evidence. */
70
+ export declare class GroupRevisionComment extends SmrtObject {
71
+ tenantId: string;
72
+ membershipId: string;
73
+ learnerId: string;
74
+ activityId: string;
75
+ attemptId: string;
76
+ revisionId: string;
77
+ authorUserId: string;
78
+ authorProfileId: string;
79
+ body: string;
80
+ recordedAt: Date;
81
+ childVisible: boolean;
82
+ visibilityActorUserId: string | null;
83
+ visibilityChangedAt: Date | null;
84
+ visibilityVersion: number;
85
+ constructor(options?: Record<string, unknown>);
86
+ save(options?: SmrtSaveOptions): Promise<this>;
87
+ delete(): Promise<void>;
88
+ }
89
+ export declare class GroupRevisionCommentCollection extends SmrtCollection<GroupRevisionComment> {
90
+ static readonly _itemClass: typeof GroupRevisionComment;
91
+ }
92
+ /** Group-owned opaque roster index; authoritative consent remains family-owned. */
93
+ export declare class GroupLearnerRosterEntry extends SmrtObject {
94
+ tenantId: string;
95
+ groupId: string;
96
+ familyTenantId: string;
97
+ learnerId: string;
98
+ membershipId: string;
99
+ constructor(options?: Record<string, unknown>);
100
+ save(options?: SmrtSaveOptions): Promise<this>;
101
+ delete(): Promise<void>;
102
+ }
103
+ export declare class GroupLearnerRosterEntryCollection extends SmrtCollection<GroupLearnerRosterEntry> {
104
+ static readonly _itemClass: typeof GroupLearnerRosterEntry;
105
+ }
106
+ //# sourceMappingURL=group-sharing-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-models.d.ts","sourceRoot":"","sources":["../src/group-sharing-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type GroupSharingDecision, type GroupSharingPolicyV1, type GroupSharingWorkFacts } from './group-sharing-contracts.js';
2
+ import type { WorkbookAssessment, WorkbookConceptSummary } from './workbook-contracts.js';
3
+ /** All facets use the same fail-closed eligibility gates. Facts come from owned records. */
4
+ export declare function evaluateGroupSharingPolicy(policy: GroupSharingPolicyV1, facts: GroupSharingWorkFacts): GroupSharingDecision;
5
+ export interface WorkbookEvidenceInput {
6
+ attempt: {
7
+ submissionId: string;
8
+ episodeId: string;
9
+ previousAttemptId: string | null;
10
+ assistance: string;
11
+ capturedAt: Date;
12
+ };
13
+ revisionId: string;
14
+ assessment: WorkbookAssessment;
15
+ confirmed: boolean;
16
+ }
17
+ /** Owning workbook aggregation shared by family and filtered group projections. */
18
+ export declare function summarizeWorkbookEvidence(evidence: WorkbookEvidenceInput[]): WorkbookConceptSummary[];
19
+ //# sourceMappingURL=group-sharing-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-policy.d.ts","sourceRoot":"","sources":["../src/group-sharing-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAE3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,kBAAkB,EAElB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAEjC,4FAA4F;AAC5F,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,qBAAqB,GAC3B,oBAAoB,CA+BtB;AACD,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,IAAI,CAAC;KAClB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC;CACpB;AACD,mFAAmF;AACnF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,qBAAqB,EAAE,GAChC,sBAAsB,EAAE,CAsF1B"}
@@ -0,0 +1,45 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import { type GroupSharingAction, type GroupSharingAuthorizer } from './group-sharing-authorization.js';
3
+ import { type GroupSharedProgressView, type GroupSharedRevisionView, type GroupSharedWorkSelector, type GroupSharedWorkView, type GroupSharingPolicyOptionsView, type GroupSharingPolicyV1, type GroupSharingPreview, type GroupSharingScope } from './group-sharing-contracts.js';
4
+ import type { SubmissionServiceOptions } from './submission-service.js';
5
+ /** Exact immutable binding seam for comments already executing inside the owning transaction. */
6
+ export declare function readSharedRevisionInScope(db: DatabaseInterface, authorize: GroupSharingAuthorizer, request: GroupSharedWorkSelector, action?: GroupSharingAction): Promise<{
7
+ activityId: string;
8
+ attemptId: string;
9
+ submissionId: string;
10
+ revisionId: string;
11
+ }>;
12
+ /** Read-only owning boundary. Every method revalidates current authority on its active executor. */
13
+ export declare class GroupSharingReader {
14
+ private readonly db;
15
+ private readonly authorize;
16
+ private readonly options?;
17
+ private readonly executorBound;
18
+ constructor(db: DatabaseInterface, authorize: GroupSharingAuthorizer, options?: SubmissionServiceOptions | undefined, executorBound?: boolean);
19
+ private run;
20
+ /** Guardian-owned choices before invitation acceptance; never enumerates another child's courses. */
21
+ getSharingPolicyOptions(request: Omit<GroupSharingScope, 'groupId'>): Promise<GroupSharingPolicyOptionsView>;
22
+ private enumerate;
23
+ previewSharing(request: GroupSharingScope & {
24
+ policy?: GroupSharingPolicyV1;
25
+ }): Promise<GroupSharingPreview>;
26
+ private project;
27
+ listSharedWork(request: GroupSharingScope & {
28
+ cursor?: string;
29
+ limit?: number;
30
+ }): Promise<{
31
+ works: GroupSharedWorkView[];
32
+ nextCursor: string | null;
33
+ }>;
34
+ getSharedWork(request: GroupSharedWorkSelector): Promise<GroupSharedWorkView>;
35
+ getSharedRevision(request: GroupSharedWorkSelector): Promise<GroupSharedRevisionView>;
36
+ getSharedProgress(request: GroupSharingScope): Promise<GroupSharedProgressView>;
37
+ readSharedMedia(request: GroupSharedWorkSelector & {
38
+ assetId: string;
39
+ }): Promise<{
40
+ data: Buffer;
41
+ mimeType: string;
42
+ cacheControl: 'private, no-store';
43
+ }>;
44
+ }
45
+ //# sourceMappingURL=group-sharing-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-sharing-reader.d.ts","sourceRoot":"","sources":["../src/group-sharing-reader.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY5D,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAG5B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EAExB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEvB,MAAM,8BAA8B,CAAC;AAOtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AA4PxE,iGAAiG;AACjG,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,sBAAsB,EACjC,OAAO,EAAE,uBAAuB,EAChC,MAAM,GAAE,kBAA8C;;;;;GAcvD;AACD,oGAAoG;AACpG,qBAAa,kBAAkB;IAE3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAHb,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,sBAAsB,EACjC,OAAO,CAAC,EAAE,wBAAwB,YAAA,EAClC,aAAa,UAAQ;IAExC,OAAO,CAAC,GAAG;IA+CX,qGAAqG;IAC/F,uBAAuB,CAC3B,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAC1C,OAAO,CAAC,6BAA6B,CAAC;YA4E3B,SAAS;IAwCjB,cAAc,CAClB,OAAO,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,oBAAoB,CAAA;KAAE,GAC7D,OAAO,CAAC,mBAAmB,CAAC;IAqB/B,OAAO,CAAC,OAAO;IAkBT,cAAc,CAClB,OAAO,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/D,OAAO,CAAC;QAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAqBjE,aAAa,CACjB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,mBAAmB,CAAC;IAOzB,iBAAiB,CACrB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,uBAAuB,CAAC;IAsB7B,iBAAiB,CACrB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,uBAAuB,CAAC;IA+C7B,eAAe,CACnB,OAAO,EAAE,uBAAuB,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GACrD,OAAO,CAAC;QACT,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,mBAAmB,CAAC;KACnC,CAAC;CA2DH"}