@happyvertical/smrt-education 0.57.51 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/AGENTS.md +13 -8
  2. package/README.md +36 -2
  3. package/agents/course-bundle-import.md +80 -2
  4. package/agents/course-work-design.md +144 -0
  5. package/agents/group-sharing.md +5 -1
  6. package/agents/learner-plan.md +3 -3
  7. package/agents/learner-service.md +1 -1
  8. package/agents/lesson-materials.md +52 -0
  9. package/agents/{workbook-service.md → lesson-work-service.md} +164 -95
  10. package/agents/{workbook-test-matrix.md → lesson-work-test-matrix.md} +3 -3
  11. package/agents/photo-intake.md +37 -50
  12. package/agents/question-records.md +1 -1
  13. package/agents/submission-service.md +22 -6
  14. package/dist/catalog-service.d.ts +1 -1
  15. package/dist/catalog-service.d.ts.map +1 -1
  16. package/dist/catalog.d.ts +11 -0
  17. package/dist/catalog.d.ts.map +1 -1
  18. package/dist/chunks/{workbook-photo-service-BtMQsbhq.js → workbook-photo-service-COtyQL1y.js} +5927 -4963
  19. package/dist/chunks/workbook-photo-service-COtyQL1y.js.map +1 -0
  20. package/dist/course-authoring-contracts.d.ts +5 -1
  21. package/dist/course-authoring-contracts.d.ts.map +1 -1
  22. package/dist/course-authoring-service.d.ts.map +1 -1
  23. package/dist/course-bundle-contracts.d.ts +23 -3
  24. package/dist/course-bundle-contracts.d.ts.map +1 -1
  25. package/dist/course-bundle-models.d.ts +3 -0
  26. package/dist/course-bundle-models.d.ts.map +1 -1
  27. package/dist/course-bundle-service.d.ts +45 -1
  28. package/dist/course-bundle-service.d.ts.map +1 -1
  29. package/dist/course-bundle.d.ts +32 -0
  30. package/dist/course-bundle.d.ts.map +1 -1
  31. package/dist/course-work-migration.d.ts +27 -0
  32. package/dist/course-work-migration.d.ts.map +1 -0
  33. package/dist/document-converter.d.ts +138 -0
  34. package/dist/document-converter.d.ts.map +1 -0
  35. package/dist/group-sharing-contracts.d.ts +3 -3
  36. package/dist/group-sharing-contracts.d.ts.map +1 -1
  37. package/dist/group-sharing-policy.d.ts +4 -4
  38. package/dist/group-sharing-policy.d.ts.map +1 -1
  39. package/dist/group-sharing-reader.d.ts.map +1 -1
  40. package/dist/index.d.ts +15 -12
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +737 -49
  43. package/dist/index.js.map +1 -1
  44. package/dist/ingestion.d.ts +12 -11
  45. package/dist/ingestion.d.ts.map +1 -1
  46. package/dist/ingestion.js +63 -56
  47. package/dist/ingestion.js.map +1 -1
  48. package/dist/learner-plan-service.d.ts +1 -1
  49. package/dist/learner-plan-service.d.ts.map +1 -1
  50. package/dist/learner-service.d.ts +19 -5
  51. package/dist/learner-service.d.ts.map +1 -1
  52. package/dist/lesson-assets.d.ts +66 -2
  53. package/dist/lesson-assets.d.ts.map +1 -1
  54. package/dist/lesson-pages.d.ts +36 -0
  55. package/dist/lesson-pages.d.ts.map +1 -0
  56. package/dist/{workbook-completion.d.ts → lesson-work-completion.d.ts} +10 -10
  57. package/dist/lesson-work-completion.d.ts.map +1 -0
  58. package/dist/{workbook-contracts.d.ts → lesson-work-contracts.d.ts} +100 -52
  59. package/dist/lesson-work-contracts.d.ts.map +1 -0
  60. package/dist/lesson-work-models.d.ts +118 -0
  61. package/dist/lesson-work-models.d.ts.map +1 -0
  62. package/dist/lesson-work-service.d.ts +239 -0
  63. package/dist/lesson-work-service.d.ts.map +1 -0
  64. package/dist/manifest.json +6420 -5299
  65. package/dist/smrt-knowledge.json +2156 -1740
  66. package/dist/submission-service.d.ts +135 -5
  67. package/dist/submission-service.d.ts.map +1 -1
  68. package/dist/submissions.d.ts +2 -0
  69. package/dist/submissions.d.ts.map +1 -1
  70. package/dist/work-answer-regions.d.ts +11 -0
  71. package/dist/work-answer-regions.d.ts.map +1 -0
  72. package/dist/work-layout.d.ts +13 -0
  73. package/dist/work-layout.d.ts.map +1 -0
  74. package/dist/workbook-photo-contracts.d.ts +9 -7
  75. package/dist/workbook-photo-contracts.d.ts.map +1 -1
  76. package/dist/workbook-photo-ingestion.d.ts +1 -1
  77. package/dist/workbook-photo-ingestion.d.ts.map +1 -1
  78. package/dist/workbook-photo-models.d.ts +5 -5
  79. package/dist/workbook-photo-models.d.ts.map +1 -1
  80. package/dist/workbook-photo-service.d.ts +13 -10
  81. package/dist/workbook-photo-service.d.ts.map +1 -1
  82. package/package.json +8 -8
  83. package/dist/chunks/workbook-photo-service-BtMQsbhq.js.map +0 -1
  84. package/dist/workbook-answer-regions.d.ts +0 -11
  85. package/dist/workbook-answer-regions.d.ts.map +0 -1
  86. package/dist/workbook-completion.d.ts.map +0 -1
  87. package/dist/workbook-contracts.d.ts.map +0 -1
  88. package/dist/workbook-layout.d.ts +0 -13
  89. package/dist/workbook-layout.d.ts.map +0 -1
  90. package/dist/workbook-models.d.ts +0 -129
  91. package/dist/workbook-models.d.ts.map +0 -1
  92. package/dist/workbook-service.d.ts +0 -163
  93. package/dist/workbook-service.d.ts.map +0 -1
@@ -0,0 +1,118 @@
1
+ import { SmrtCollection, SmrtObject, type SmrtSaveOptions } from '@happyvertical/smrt-core';
2
+ /** Education-owned private lesson work record. Mutations go through LessonWorkService. */
3
+ export declare class LessonActivity extends SmrtObject {
4
+ tenantId: string;
5
+ learnerId: string;
6
+ captureKind: string;
7
+ photoIntakeId: string | null;
8
+ enrollmentId: string;
9
+ lessonId: string;
10
+ constructor(options?: Record<string, unknown>);
11
+ delete(): Promise<void>;
12
+ save(options?: SmrtSaveOptions): Promise<this>;
13
+ }
14
+ export declare class LessonActivityCollection extends SmrtCollection<LessonActivity> {
15
+ static readonly _itemClass: typeof LessonActivity;
16
+ }
17
+ /**
18
+ * Append-only placement of unfiled work: the head names the course, the
19
+ * learner's enrollment, lesson and optional lesson page the work now belongs
20
+ * to. Activity, attempt, submission and assessment IDs never move.
21
+ */
22
+ export declare class LessonWorkFiling extends SmrtObject {
23
+ tenantId: string;
24
+ learnerId: string;
25
+ sourceActivityId: string;
26
+ courseId: string;
27
+ enrollmentId: string;
28
+ lessonId: string;
29
+ lessonPageId: string | null;
30
+ previousRevisionId: string | null;
31
+ actorUserId: string;
32
+ requestKey: string;
33
+ reason: string;
34
+ digest: string;
35
+ recordedAt: Date;
36
+ constructor(options?: Record<string, unknown>);
37
+ delete(): Promise<void>;
38
+ save(options?: SmrtSaveOptions): Promise<this>;
39
+ }
40
+ export declare class LessonWorkFilingCollection extends SmrtCollection<LessonWorkFiling> {
41
+ static readonly _itemClass: typeof LessonWorkFiling;
42
+ }
43
+ /** Education-owned private lesson work record. Mutations go through LessonWorkService. */
44
+ export declare class WorkAttempt extends SmrtObject {
45
+ tenantId: string;
46
+ learnerId: string;
47
+ activityId: string;
48
+ submissionId: string;
49
+ previousAttemptId: string | null;
50
+ capturedAt: Date;
51
+ episodeId: string;
52
+ reviewRequired: boolean;
53
+ policyVersion: number;
54
+ assistance: string;
55
+ actorUserId: string;
56
+ sourceHashes: string;
57
+ constructor(options?: Record<string, unknown>);
58
+ delete(): Promise<void>;
59
+ save(options?: SmrtSaveOptions): Promise<this>;
60
+ }
61
+ export declare class WorkAttemptCollection extends SmrtCollection<WorkAttempt> {
62
+ static readonly _itemClass: typeof WorkAttempt;
63
+ }
64
+ /** Education-owned private lesson work record. Mutations go through LessonWorkService. */
65
+ export declare class WorkAssessmentRevision extends SmrtObject {
66
+ tenantId: string;
67
+ learnerId: string;
68
+ attemptId: string;
69
+ requestKey: string;
70
+ requestDigest: string;
71
+ kind: string;
72
+ actorUserId: string;
73
+ sourceRevisionId: string | null;
74
+ decisionReason: string;
75
+ supersedesId: string | null;
76
+ assessmentJson: string;
77
+ recordedAt: Date;
78
+ constructor(options?: Record<string, unknown>);
79
+ delete(): Promise<void>;
80
+ save(options?: SmrtSaveOptions): Promise<this>;
81
+ }
82
+ export declare class WorkAssessmentRevisionCollection extends SmrtCollection<WorkAssessmentRevision> {
83
+ static readonly _itemClass: typeof WorkAssessmentRevision;
84
+ }
85
+ /** Education-owned private lesson work record. Mutations go through LessonWorkService. */
86
+ export declare class WorkFeedbackRelease extends SmrtObject {
87
+ tenantId: string;
88
+ learnerId: string;
89
+ attemptId: string;
90
+ revisionId: string;
91
+ expectedHeadId: string | null;
92
+ requestKey: string;
93
+ actorUserId: string;
94
+ recordedAt: Date;
95
+ constructor(options?: Record<string, unknown>);
96
+ delete(): Promise<void>;
97
+ save(options?: SmrtSaveOptions): Promise<this>;
98
+ }
99
+ export declare class WorkFeedbackReleaseCollection extends SmrtCollection<WorkFeedbackRelease> {
100
+ static readonly _itemClass: typeof WorkFeedbackRelease;
101
+ }
102
+ /** Authenticated delivery acknowledgment; this does not assert comprehension. */
103
+ export declare class WorkFeedbackDelivery extends SmrtObject {
104
+ tenantId: string;
105
+ learnerId: string;
106
+ attemptId: string;
107
+ revisionId: string;
108
+ actorUserId: string;
109
+ requestKey: string;
110
+ recordedAt: Date;
111
+ constructor(options?: Record<string, unknown>);
112
+ save(options?: SmrtSaveOptions): Promise<this>;
113
+ delete(): Promise<void>;
114
+ }
115
+ export declare class WorkFeedbackDeliveryCollection extends SmrtCollection<WorkFeedbackDelivery> {
116
+ static readonly _itemClass: typeof WorkFeedbackDelivery;
117
+ }
118
+ //# sourceMappingURL=lesson-work-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-work-models.d.ts","sourceRoot":"","sources":["../src/lesson-work-models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import type { Course } from './catalog.js';
3
+ import type { CatalogAuthorizer } from './catalog-service.js';
4
+ import { type LearnerAuthorizer, type LearnerRequest } from './learner-service.js';
5
+ import { type LessonActivityView, type WorkAssessment, type WorkAssistance, type WorkAttemptView, type WorkCompletionDecisionView, type WorkConceptSummary, type WorkPreservationState, type WorkRevisionView, type WorkTimeline } from './lesson-work-contracts.js';
6
+ import { type LessonActivity } from './lesson-work-models.js';
7
+ import { type SubmissionPage, SubmissionService, type SubmissionServiceOptions } from './submission-service.js';
8
+ type ActivityRequest = LearnerRequest & {
9
+ activityId: string;
10
+ };
11
+ type AttemptRequest = ActivityRequest & {
12
+ submissionId: string;
13
+ };
14
+ /** Actor-bound durable lesson work workflow. No generated write surface. */
15
+ export declare class LessonWorkService extends SubmissionService {
16
+ private readonly workOptions;
17
+ constructor(db: DatabaseInterface, authorize: LearnerAuthorizer, authorizeCatalog: CatalogAuthorizer, workOptions: SubmissionServiceOptions & {
18
+ workVocabulary?: WorkAssessment['vocabulary'];
19
+ });
20
+ protected createTransactionService(db: DatabaseInterface): this;
21
+ /** Filed work snapshots the policy of the course it was placed in. */
22
+ protected workPolicy(activity: LessonActivity): Promise<{
23
+ reviewRequired: boolean;
24
+ policyVersion: number;
25
+ }>;
26
+ private serialize;
27
+ private activity;
28
+ private filingHead;
29
+ /** Effective placement: the filing head for filed work, else its own routing. */
30
+ private placement;
31
+ private lessonPages;
32
+ private activityView;
33
+ getLessonActivity(request: ActivityRequest): Promise<LessonActivityView>;
34
+ /** Receipt-bound technical routing only; the caller already owns the surrounding mutation. */
35
+ protected resolveUnfiledActivityInScope(request: LearnerRequest & {
36
+ intakeId: string;
37
+ }, action?: 'education.learner.submit' | 'education.learner.plan'): Promise<LessonActivityView>;
38
+ /** The family's course for a book key, created on first use. */
39
+ protected bookCourse(request: LearnerRequest, book: {
40
+ bookKey: string;
41
+ title: string;
42
+ edition?: string;
43
+ subject?: string;
44
+ }, create?: boolean): Promise<Course | null>;
45
+ /** The learner's enrollment in a course; book courses enroll on first use. */
46
+ protected courseEnrollment(request: LearnerRequest, course: Course, action: Parameters<LearnerAuthorizer>[0]['action']): Promise<string>;
47
+ /** Append a one-page Worksheet lesson to a family book or plain course. */
48
+ protected appendPageLesson(request: LearnerRequest, course: Course, page: {
49
+ pageKey?: string;
50
+ pageLabel: string;
51
+ }): Promise<{
52
+ lessonId: string;
53
+ lessonPageId: string | null;
54
+ }>;
55
+ /** Pages with this key across the course, earliest first. */
56
+ private coursePages;
57
+ /**
58
+ * Place unfiled work in a course: an existing lesson (and page), the page
59
+ * with that key, or a newly appended page lesson in a family book/plain
60
+ * course. Authored courses need the lesson first (`appendLesson`). Append-only;
61
+ * the work keeps its IDs, attempts and captured review policy.
62
+ */
63
+ fileLessonWork(request: ActivityRequest & {
64
+ courseId?: string;
65
+ newBook?: {
66
+ title: string;
67
+ edition?: string;
68
+ bookKey?: string;
69
+ subject?: string;
70
+ };
71
+ lessonId?: string;
72
+ pageKey?: string;
73
+ pageLabel?: string;
74
+ expectedRevisionId: string | null;
75
+ requestKey: string;
76
+ reason: string;
77
+ }): Promise<LessonActivityView>;
78
+ /**
79
+ * Mirror placed work onto the target lesson's progress: Done when the work's
80
+ * current attempt is complete, otherwise Doing. A projection, not evidence.
81
+ */
82
+ protected syncPlacedProgress(request: LearnerRequest, row: LessonActivity, target: {
83
+ enrollmentId: string;
84
+ lessonId: string;
85
+ }, mode?: 'filing' | 'change'): Promise<void>;
86
+ /**
87
+ * Keep a filed activity's placement progress in step after its completion
88
+ * changes (a decision, a new capture or a correction). Same transaction.
89
+ */
90
+ protected syncPlacement(request: LearnerRequest, row: LessonActivity): Promise<void>;
91
+ /** Explicit keys distinguish editions, repeated printed labels and page sides. */
92
+ resolveBookPageActivity(request: LearnerRequest & {
93
+ bookKey: string;
94
+ title: string;
95
+ edition?: string;
96
+ pageKey: string;
97
+ pageLabel: string;
98
+ }): Promise<LessonActivityView>;
99
+ /** Owning intake extension: caller validates evidence before upload-authorized creation. */
100
+ protected resolveBookPageActivityInScope(request: LearnerRequest & {
101
+ bookKey: string;
102
+ title: string;
103
+ edition?: string;
104
+ pageKey: string;
105
+ pageLabel: string;
106
+ }, action: 'education.learner.plan' | 'education.learner.submit'): Promise<LessonActivityView>;
107
+ /** Every activity of the learner, optionally only those placed in one course. */
108
+ listLessonActivities(request: LearnerRequest & {
109
+ courseId?: string;
110
+ filing?: 'unfiled' | 'filed' | 'identified';
111
+ }): Promise<LessonActivityView[]>;
112
+ /**
113
+ * Family course work policy. A guardian needs plan authority over every
114
+ * learner enrolled in the course; captures keep their snapshot.
115
+ */
116
+ /**
117
+ * Set or clear (`null` or '') a family book course's subject. A guardian
118
+ * needs plan authority over the request learner and every learner enrolled
119
+ * in it; shared catalog
120
+ * courses and courses without book identity are refused.
121
+ */
122
+ setBookCourseSubject(request: LearnerRequest & {
123
+ courseId: string;
124
+ subject: string | null;
125
+ }): Promise<{
126
+ courseId: string;
127
+ subject: string;
128
+ }>;
129
+ setCourseWorkPolicy(request: LearnerRequest & {
130
+ courseId: string;
131
+ expectedPolicyVersion: number;
132
+ reviewRequired: boolean;
133
+ }): Promise<{
134
+ courseId: string;
135
+ reviewRequired: boolean;
136
+ policyVersion: number;
137
+ }>;
138
+ private attempt;
139
+ private attemptView;
140
+ captureLessonWork(request: ActivityRequest & {
141
+ requestKey: string;
142
+ pages: readonly SubmissionPage[];
143
+ notes?: string;
144
+ previousSubmissionId?: string;
145
+ assistance?: WorkAssistance;
146
+ intakeItemId?: string;
147
+ }): Promise<WorkAttemptView>;
148
+ /** Trusted host lookup, preserving exact enrollment and actor authorization. */
149
+ getWorkAttemptBySubmission(request: LearnerRequest & {
150
+ enrollmentId: string;
151
+ submissionId: string;
152
+ }): Promise<WorkAttemptView | null>;
153
+ /** Authorized content-free preservation status; never exposes withheld marks. */
154
+ getWorkPreservationState(request: AttemptRequest): Promise<WorkPreservationState>;
155
+ /** Public data-only digest map used to preserve ingestion source anchors. */
156
+ getWorkSourceAnchors(request: AttemptRequest): Promise<{
157
+ assetId: string;
158
+ sha256: string;
159
+ pageCount: number;
160
+ }[]>;
161
+ /** Stable IDs only: historical prompts may themselves contain learner answers. */
162
+ getWorkQuestionIdentity(request: AttemptRequest): Promise<{
163
+ id: string;
164
+ }[]>;
165
+ /** Canonical transcriptions only for this exact capture, never its predecessor.
166
+ * A correction without its own revision receives IDs only. Both paths retain
167
+ * the same source/revision and full ancestry visibility checks as identity. */
168
+ getWorkQuestionContext(request: AttemptRequest & {
169
+ analysisRevision?: number;
170
+ }): Promise<{
171
+ kind: 'same_capture';
172
+ questions: {
173
+ id: string;
174
+ prompt: string;
175
+ }[];
176
+ } | {
177
+ kind: 'identity_only';
178
+ questions: {
179
+ id: string;
180
+ }[];
181
+ }>;
182
+ private revisionPayloadVisible;
183
+ private revisions;
184
+ private identityRevision;
185
+ /** Call after actor/resource authorization, only for own-learner projections.
186
+ * Semantic IDs are source content. A descendant release cannot publish a
187
+ * hidden ancestor; exact published ID sets keep old public snapshots usable. */
188
+ private questionIdentityVisible;
189
+ private validateAssessment;
190
+ private appendRevision;
191
+ recordWorkAnalysis(request: AttemptRequest & {
192
+ requestKey: string;
193
+ assessment: WorkAssessment;
194
+ }): Promise<WorkRevisionView>;
195
+ reviewWorkAssessment(request: AttemptRequest & {
196
+ revisionId: string;
197
+ expectedHeadId: string | null;
198
+ requestKey: string;
199
+ assessment?: WorkAssessment;
200
+ decisionReason?: string;
201
+ }): Promise<WorkRevisionView>;
202
+ completeLessonActivity(request: AttemptRequest & {
203
+ expectedAttemptId: string;
204
+ expectedHeadId: string | null;
205
+ requestKey: string;
206
+ }): Promise<WorkCompletionDecisionView>;
207
+ releaseWorkFeedback(request: AttemptRequest & {
208
+ revisionId: string;
209
+ requestKey: string;
210
+ expectedHeadId: string | null;
211
+ }): Promise<{
212
+ id: string;
213
+ revisionId: string;
214
+ createdAt: Date;
215
+ actorUserId: string;
216
+ }>;
217
+ /** Record an authenticated own-learner render acknowledgment, never 'read'. */
218
+ acknowledgeWorkFeedbackDelivery(request: AttemptRequest & {
219
+ revisionId: string;
220
+ requestKey: string;
221
+ }): Promise<{
222
+ id: string;
223
+ revisionId: string;
224
+ actorUserId: string;
225
+ createdAt: Date;
226
+ }>;
227
+ getWorkTimeline(request: ActivityRequest & {
228
+ cursor?: string;
229
+ limit?: number;
230
+ revisionId?: string;
231
+ }): Promise<WorkTimeline>;
232
+ /** Descriptive guardian projection; corrections stay within one practice episode. */
233
+ getConceptEvidenceSummary(request: ActivityRequest): Promise<{
234
+ algorithmVersion: 'workbook-descriptive-v1';
235
+ concepts: WorkConceptSummary[];
236
+ }>;
237
+ }
238
+ export {};
239
+ //# sourceMappingURL=lesson-work-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lesson-work-service.d.ts","sourceRoot":"","sources":["../src/lesson-work-service.ts"],"names":[],"mappings":"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"}