@happyvertical/smrt-education 0.58.0 → 0.59.1

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 (57) hide show
  1. package/AGENTS.md +6 -1
  2. package/agents/class-crunchlabs.md +83 -0
  3. package/agents/course-bundle-import.md +108 -18
  4. package/agents/group-sharing.md +7 -0
  5. package/dist/catalog-contracts.d.ts +6 -2
  6. package/dist/catalog-contracts.d.ts.map +1 -1
  7. package/dist/catalog-materialization-service.d.ts.map +1 -1
  8. package/dist/catalog-policy.d.ts +11 -1
  9. package/dist/catalog-policy.d.ts.map +1 -1
  10. package/dist/catalog-preview.d.ts +6 -1
  11. package/dist/catalog-preview.d.ts.map +1 -1
  12. package/dist/chunks/course-authoring-contracts-C4Hqba-e.js +131 -0
  13. package/dist/chunks/course-authoring-contracts-C4Hqba-e.js.map +1 -0
  14. package/dist/chunks/course-bundle-zip-5KUe3C5H.js +323 -0
  15. package/dist/chunks/course-bundle-zip-5KUe3C5H.js.map +1 -0
  16. package/dist/chunks/{workbook-photo-service-COtyQL1y.js → workbook-photo-service-CjcB0y8Y.js} +226 -130
  17. package/dist/chunks/workbook-photo-service-CjcB0y8Y.js.map +1 -0
  18. package/dist/course-authoring-contracts.d.ts +1 -1
  19. package/dist/course-authoring-contracts.d.ts.map +1 -1
  20. package/dist/course-bundle-contracts.d.ts +21 -3
  21. package/dist/course-bundle-contracts.d.ts.map +1 -1
  22. package/dist/course-bundle-manifest-util.d.ts +15 -0
  23. package/dist/course-bundle-manifest-util.d.ts.map +1 -0
  24. package/dist/course-bundle-manifest-v2.d.ts +66 -0
  25. package/dist/course-bundle-manifest-v2.d.ts.map +1 -0
  26. package/dist/course-bundle-models.d.ts +29 -1
  27. package/dist/course-bundle-models.d.ts.map +1 -1
  28. package/dist/course-bundle-service.d.ts +104 -5
  29. package/dist/course-bundle-service.d.ts.map +1 -1
  30. package/dist/course-bundle.d.ts +81 -2
  31. package/dist/course-bundle.d.ts.map +1 -1
  32. package/dist/document-converter.d.ts +30 -18
  33. package/dist/document-converter.d.ts.map +1 -1
  34. package/dist/group-sharing-contracts.d.ts +4 -0
  35. package/dist/group-sharing-contracts.d.ts.map +1 -1
  36. package/dist/group-sharing-reader.d.ts.map +1 -1
  37. package/dist/hearth-catalog-providers.d.ts +1 -1
  38. package/dist/hearth-catalog-providers.d.ts.map +1 -1
  39. package/dist/hearth-class-crunchlabs.d.ts +94 -0
  40. package/dist/hearth-class-crunchlabs.d.ts.map +1 -0
  41. package/dist/index.d.ts +5 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1654 -400
  44. package/dist/index.js.map +1 -1
  45. package/dist/ingestion.js +1 -1
  46. package/dist/manifest.json +418 -6
  47. package/dist/node.d.ts +3 -0
  48. package/dist/node.d.ts.map +1 -0
  49. package/dist/node.js +134 -0
  50. package/dist/node.js.map +1 -0
  51. package/dist/smrt-knowledge.json +164 -12
  52. package/dist/sources/class-crunchlabs-files.d.ts +8 -0
  53. package/dist/sources/class-crunchlabs-files.d.ts.map +1 -0
  54. package/dist/sources/class-crunchlabs.d.ts +217 -0
  55. package/dist/sources/class-crunchlabs.d.ts.map +1 -0
  56. package/package.json +12 -8
  57. package/dist/chunks/workbook-photo-service-COtyQL1y.js.map +0 -1
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Class CrunchLabs unit downloads to a course bundle (SMRT #4616).
3
+ *
4
+ * A unit download is a folder (or the zip parts a Drive export splits it into)
5
+ * holding `<Unit>_All Unit Wide Materials` and `<Unit>_Lesson <n>` folders. Files
6
+ * are lettered: A teacher manual, B slides, C student mission log, D status check
7
+ * assessment (plus guidance, editable), E handouts, F extras, G videos. The
8
+ * videos are not read: their names (`Lnn.step_Video_Kind_Title`) are matched,
9
+ * by unit, lesson and step, to the unit's YouTube course playlist and become
10
+ * external references.
11
+ *
12
+ * `buildClassCrunchLabsBundle` reads such a download and returns a manifest
13
+ * version 2 bundle for `CourseBundleImportService`. Nothing here touches the
14
+ * network: the playlist comes from an injected `ClassCrunchLabsPlaylistSource`,
15
+ * and files from an injected `ClassCrunchLabsFileSource` (Node folder and zip
16
+ * readers are in `class-crunchlabs-files.ts`). The files are CrunchLabs' own
17
+ * downloads, never hosted by us.
18
+ */
19
+ import type { DocumentConverter, OfficeDocumentKind } from '../document-converter.js';
20
+ export declare const CLASS_CRUNCHLABS_PROVIDER_ID: "class-crunchlabs";
21
+ export declare const CLASS_CRUNCHLABS_SUBJECT = "Science";
22
+ /** The licence a family's own copy of a CrunchLabs unit carries. */
23
+ export declare const CLASS_CRUNCHLABS_LICENSE_KIND: "personal-use-copy";
24
+ export declare class ClassCrunchLabsError extends Error {
25
+ readonly code: 'no_unit' | 'multiple_units' | 'empty_unit' | 'too_large' | 'access_denied';
26
+ readonly detail: readonly string[];
27
+ constructor(code: 'no_unit' | 'multiple_units' | 'empty_unit' | 'too_large' | 'access_denied', message: string, detail?: readonly string[]);
28
+ }
29
+ /** One file of a unit download. Bytes are read lazily, and only for files that are used. */
30
+ export interface ClassCrunchLabsFile {
31
+ /** Path inside its source (folder-relative, or the zip entry name). */
32
+ path: string;
33
+ size: number;
34
+ /** CRC-32 (lower-case hex) when known without reading, used to spot repeated exports. */
35
+ crc32?: string;
36
+ /** Orders repeated exports of the same unit: the larger value is the newer export. */
37
+ exportId?: string;
38
+ read(): Promise<Uint8Array>;
39
+ }
40
+ export interface ClassCrunchLabsFileSource {
41
+ files(): Promise<ClassCrunchLabsFile[]>;
42
+ }
43
+ /** An in-memory source (tests, or a host that already holds the files). */
44
+ export declare function memoryClassCrunchLabsSource(files: ReadonlyArray<{
45
+ path: string;
46
+ bytes?: Uint8Array;
47
+ size?: number;
48
+ exportId?: string;
49
+ crc32?: string;
50
+ }>): ClassCrunchLabsFileSource;
51
+ export interface ClassCrunchLabsPlaylistItem {
52
+ videoId: string;
53
+ title: string;
54
+ position: number;
55
+ }
56
+ /** A YouTube course playlist of the @ClassCrunchLabs channel. */
57
+ export interface ClassCrunchLabsPlaylist {
58
+ id: string;
59
+ title: string;
60
+ /** The unit the playlist belongs to when the source knows it; else derived from the title. */
61
+ unit?: string;
62
+ items: ClassCrunchLabsPlaylistItem[];
63
+ }
64
+ /** Injected: tests use fixtures, a host fetches the channel's playlists. Never called from a test with a network. */
65
+ export interface ClassCrunchLabsPlaylistSource {
66
+ playlists(): Promise<ClassCrunchLabsPlaylist[]>;
67
+ }
68
+ export type ClassCrunchLabsPageCounter = (input: {
69
+ bytes: Uint8Array;
70
+ kind: 'pdf' | OfficeDocumentKind;
71
+ }) => Promise<number | null>;
72
+ /** Case, punctuation and spacing insensitive key. */
73
+ export declare const classCrunchLabsKey: (value: string) => string;
74
+ export interface ClassCrunchLabsVideoName {
75
+ lesson: number;
76
+ /** Lower-case step such as `6` or `1b`. */
77
+ step: string;
78
+ /** The kind token as named, for example `MaterialsPrep`. */
79
+ kind: string;
80
+ /** Humanized title, `''` when the name has none. */
81
+ title: string;
82
+ }
83
+ /** Parse `Lnn.step_Video_Kind_Title_Unit.mp4`; null when the name is not a lesson video. */
84
+ export declare function parseClassCrunchLabsVideoName(fileName: string, unit: string): ClassCrunchLabsVideoName | null;
85
+ export interface ClassCrunchLabsVideoMatch {
86
+ lesson: number;
87
+ step: string;
88
+ kind: string;
89
+ title: string;
90
+ videoId: string;
91
+ playlistItem: string;
92
+ }
93
+ export interface ClassCrunchLabsVideoMiss {
94
+ lesson: number;
95
+ step: string;
96
+ kind: string;
97
+ title: string;
98
+ reason: 'no_playlist' | 'no_item' | 'ambiguous' | 'item_taken';
99
+ }
100
+ /** The (lesson, step) a playlist item title names: `L03.6`, `Lesson 3 ... Step 6`. */
101
+ export declare function parsePlaylistItemTitle(title: string): {
102
+ lesson: number;
103
+ step: string;
104
+ } | null;
105
+ /** The playlist for a unit: its title (or `unit`) names the unit; the shortest title wins. */
106
+ export declare function pickUnitPlaylist(playlists: readonly ClassCrunchLabsPlaylist[], unit: string): ClassCrunchLabsPlaylist | null;
107
+ /**
108
+ * Match lesson videos to playlist items by lesson and step. Two videos that
109
+ * share a step (a materials-prep and a hands-on video) are told apart by the
110
+ * item title naming their title or kind; if that cannot decide, they are left
111
+ * unmatched as `ambiguous` rather than guessed. Each item is used once.
112
+ */
113
+ export declare function matchClassCrunchLabsVideos(videos: readonly ClassCrunchLabsVideoName[], playlist: ClassCrunchLabsPlaylist | null): {
114
+ matched: ClassCrunchLabsVideoMatch[];
115
+ unmatched: ClassCrunchLabsVideoMiss[];
116
+ unusedItems: number;
117
+ };
118
+ export interface ClassCrunchLabsBuildOptions {
119
+ files: ClassCrunchLabsFileSource;
120
+ /** Without one, videos are reported unmatched (`no_playlist`) and no reference is written. */
121
+ playlists?: ClassCrunchLabsPlaylistSource;
122
+ /** Which unit when the download holds several; matched ignoring case and punctuation. */
123
+ unit?: string;
124
+ /**
125
+ * How many pages a mission log has, to write its lesson page range. Without
126
+ * one, or when it returns null, the lesson gets no page rows (a warning says so).
127
+ */
128
+ pageCounter?: ClassCrunchLabsPageCounter;
129
+ /**
130
+ * The unit-wide "(all lessons)" files (the combined manual, deck, mission log,
131
+ * status checks and handouts) repeat the per-lesson files and are large, so they
132
+ * are left out by default. The supply list, posters and other unit-wide extras
133
+ * are always course members.
134
+ */
135
+ includeUnitWideAggregates?: boolean;
136
+ /** Largest bundle part in bytes; default 90 MiB, never above the bundle archive limit. */
137
+ maxPartBytes?: number;
138
+ }
139
+ export interface ClassCrunchLabsReport {
140
+ unit: string;
141
+ lessons: number;
142
+ members: number;
143
+ courseMembers: number;
144
+ /** Bundles the unit was split into (1 unless it is large). */
145
+ parts: number;
146
+ pages: Array<{
147
+ lesson: number;
148
+ path: string;
149
+ pages: number;
150
+ }>;
151
+ videos: {
152
+ playlist: {
153
+ id: string;
154
+ title: string;
155
+ } | null;
156
+ matched: ClassCrunchLabsVideoMatch[];
157
+ unmatched: ClassCrunchLabsVideoMiss[];
158
+ unusedPlaylistItems: number;
159
+ /** Unit-level videos (a teaser): a course has no video of its own, so none is written. */
160
+ unitLevel: string[];
161
+ };
162
+ /** Same bytes under another name or place: only the preferred copy is bundled. */
163
+ duplicates: Array<{
164
+ path: string;
165
+ duplicateOf: string;
166
+ }>;
167
+ /** The same file in more than one export of the unit. */
168
+ duplicateExports: number;
169
+ /** A file that differs between exports: the newer export is used. */
170
+ superseded: number;
171
+ ignored: Array<{
172
+ path: string;
173
+ reason: string;
174
+ }>;
175
+ warnings: string[];
176
+ }
177
+ /** One importable bundle: a manifest version 2 and the files it names. */
178
+ export interface ClassCrunchLabsBundlePart {
179
+ bundle: {
180
+ files: Array<{
181
+ path: string;
182
+ bytes: Uint8Array;
183
+ }>;
184
+ };
185
+ manifest: Record<string, unknown>;
186
+ /** The lesson numbers this part carries. */
187
+ lessons: number[];
188
+ }
189
+ export interface ClassCrunchLabsBuild {
190
+ unit: string;
191
+ /**
192
+ * The bundles to import, in order, each with `CourseBundleImportService`. A
193
+ * unit that fits one archive is one part; a large one is split by lesson
194
+ * (course-level members go in the first part), never by file.
195
+ */
196
+ parts: ClassCrunchLabsBundlePart[];
197
+ /** The first part, for the usual single-bundle unit. */
198
+ bundle: ClassCrunchLabsBundlePart['bundle'];
199
+ manifest: Record<string, unknown>;
200
+ /** A family's own copy of a unit is a personal-use copy. */
201
+ licenseKind: typeof CLASS_CRUNCHLABS_LICENSE_KIND;
202
+ report: ClassCrunchLabsReport;
203
+ }
204
+ /** Read a Class CrunchLabs unit download and build a manifest version 2 bundle. */
205
+ export declare function buildClassCrunchLabsBundle(options: ClassCrunchLabsBuildOptions): Promise<ClassCrunchLabsBuild>;
206
+ /**
207
+ * A page counter for mission logs: PDFs are counted directly (`pdf-lib`), Word
208
+ * and PowerPoint files by asking the injected converter to render them. Without
209
+ * a converter, only PDFs are counted. The count is a convenience for the page
210
+ * range; the importer still renders the member itself.
211
+ */
212
+ export declare function createClassCrunchLabsPageCounter(options?: {
213
+ converter?: DocumentConverter;
214
+ timeoutMs?: number;
215
+ maxBytes?: number;
216
+ }): ClassCrunchLabsPageCounter;
217
+ //# sourceMappingURL=class-crunchlabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-crunchlabs.d.ts","sourceRoot":"","sources":["../../src/sources/class-crunchlabs.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-education",
3
- "version": "0.58.0",
3
+ "version": "0.59.1",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Tenant-aware learning catalog models and authorized catalog access for SMRT",
6
6
  "type": "module",
@@ -22,21 +22,25 @@
22
22
  "./ingestion": {
23
23
  "types": "./dist/ingestion.d.ts",
24
24
  "import": "./dist/ingestion.js"
25
+ },
26
+ "./node": {
27
+ "types": "./dist/node.d.ts",
28
+ "import": "./dist/node.js"
25
29
  }
26
30
  },
27
31
  "dependencies": {
28
- "@happyvertical/smrt-assets": "0.58.0",
29
- "@happyvertical/smrt-core": "0.58.0",
30
- "@happyvertical/smrt-profiles": "0.58.0",
31
- "@happyvertical/smrt-tenancy": "0.58.0",
32
- "@happyvertical/smrt-users": "0.58.0",
32
+ "@happyvertical/smrt-assets": "0.59.1",
33
+ "@happyvertical/smrt-core": "0.59.1",
34
+ "@happyvertical/smrt-profiles": "0.59.1",
35
+ "@happyvertical/smrt-tenancy": "0.59.1",
36
+ "@happyvertical/smrt-users": "0.59.1",
33
37
  "@happyvertical/files": "^0.111.3",
34
38
  "@happyvertical/sql": "^0.111.3",
35
39
  "pdf-lib": "1.17.1",
36
- "@happyvertical/smrt-ingestion": "0.58.0"
40
+ "@happyvertical/smrt-ingestion": "0.59.1"
37
41
  },
38
42
  "devDependencies": {
39
- "@happyvertical/smrt-vitest": "0.58.0",
43
+ "@happyvertical/smrt-vitest": "0.59.1",
40
44
  "@types/node": "24.13.6",
41
45
  "typescript": "6.0.3",
42
46
  "vite": "8.1.6",