@happyvertical/smrt-education 0.59.1 → 0.60.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 (43) hide show
  1. package/AGENTS.md +3 -1
  2. package/README.md +7 -2
  3. package/agents/class-crunchlabs.md +8 -4
  4. package/agents/course-bundle-import.md +89 -10
  5. package/agents/lesson-materials.md +21 -4
  6. package/dist/chunks/course-authoring-contracts-C4Hqba-e.js.map +1 -1
  7. package/dist/chunks/{course-bundle-zip-5KUe3C5H.js → course-bundle-zip-CGR1Ci0Z.js} +3 -2
  8. package/dist/chunks/course-bundle-zip-CGR1Ci0Z.js.map +1 -0
  9. package/dist/chunks/{workbook-photo-service-CjcB0y8Y.js → workbook-photo-service-DHP5ja82.js} +103 -46
  10. package/dist/chunks/workbook-photo-service-DHP5ja82.js.map +1 -0
  11. package/dist/course-authoring-contracts.d.ts +1 -1
  12. package/dist/course-authoring-contracts.d.ts.map +1 -1
  13. package/dist/course-bundle-contracts.d.ts +2 -0
  14. package/dist/course-bundle-contracts.d.ts.map +1 -1
  15. package/dist/course-bundle-manifest-v2.d.ts +24 -1
  16. package/dist/course-bundle-manifest-v2.d.ts.map +1 -1
  17. package/dist/course-bundle-models.d.ts +88 -0
  18. package/dist/course-bundle-models.d.ts.map +1 -1
  19. package/dist/course-bundle-service.d.ts +153 -7
  20. package/dist/course-bundle-service.d.ts.map +1 -1
  21. package/dist/course-bundle.d.ts +17 -0
  22. package/dist/course-bundle.d.ts.map +1 -1
  23. package/dist/document-converter.d.ts +8 -0
  24. package/dist/document-converter.d.ts.map +1 -1
  25. package/dist/hearth-class-crunchlabs.d.ts +3 -2
  26. package/dist/hearth-class-crunchlabs.d.ts.map +1 -1
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +844 -133
  30. package/dist/index.js.map +1 -1
  31. package/dist/ingestion.js +1 -1
  32. package/dist/lesson-assets.d.ts +19 -0
  33. package/dist/lesson-assets.d.ts.map +1 -1
  34. package/dist/manifest.json +1803 -145
  35. package/dist/node.js +1 -1
  36. package/dist/smrt-knowledge.json +571 -15
  37. package/dist/sources/class-crunchlabs.d.ts +7 -0
  38. package/dist/sources/class-crunchlabs.d.ts.map +1 -1
  39. package/dist/submission-service.d.ts +24 -4
  40. package/dist/submission-service.d.ts.map +1 -1
  41. package/package.json +8 -8
  42. package/dist/chunks/course-bundle-zip-5KUe3C5H.js.map +0 -1
  43. package/dist/chunks/workbook-photo-service-CjcB0y8Y.js.map +0 -1
@@ -186,8 +186,15 @@ export interface ClassCrunchLabsBundlePart {
186
186
  /** The lesson numbers this part carries. */
187
187
  lessons: number[];
188
188
  }
189
+ /**
190
+ * The stable unit key every part of a unit carries (`course.key`): the
191
+ * provider and the unit name folded to a manifest key.
192
+ */
193
+ export declare function classCrunchLabsUnitKey(unitName: string): string;
189
194
  export interface ClassCrunchLabsBuild {
190
195
  unit: string;
196
+ /** The unit key in every part's manifest (`course.key`). */
197
+ unitKey: string;
191
198
  /**
192
199
  * The bundles to import, in order, each with `CourseBundleImportService`. A
193
200
  * unit that fits one archive is one part; a large one is split by lesson
@@ -1 +1 @@
1
- {"version":3,"file":"class-crunchlabs.d.ts","sourceRoot":"","sources":["../../src/sources/class-crunchlabs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"class-crunchlabs.d.ts","sourceRoot":"","sources":["../../src/sources/class-crunchlabs.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { type Asset, type AssetRuntime, type AssetRuntimeOptions } from '@happyv
2
2
  import type { DatabaseInterface } from '@happyvertical/sql';
3
3
  import type { CatalogAuthorizer } from './catalog-service.js';
4
4
  import { type LearnerAuthorizer, type LearnerRequest, LearnerService, LearnerValidationError } from './learner-service.js';
5
- import { type ExternalVideoProvider, type LessonAssetRelationship, type MaterialAudience } from './lesson-assets.js';
5
+ import { type ExternalVideoProvider, type LessonAssetRelationship, type MaterialAudience, type MaterialRendition } from './lesson-assets.js';
6
6
  import type { WorkAssistance } from './lesson-work-contracts.js';
7
7
  import { type LessonActivity } from './lesson-work-models.js';
8
8
  import type { Grade, Submission, SubmissionKind } from './submissions.js';
@@ -126,6 +126,20 @@ export type LessonMaterialView = Readonly<{
126
126
  videoId: string | null;
127
127
  /** Privacy-enhanced embed URL for an external video. */
128
128
  embedUrl: string | null;
129
+ /** Files only: the stored asset's MIME type, null when the host recorded none. */
130
+ mimeType: string | null;
131
+ /**
132
+ * Files only: `original` (the editable Word/PowerPoint file, guardian-only),
133
+ * `rendered` (the PDF rendered from an original), or null for a file as supplied.
134
+ */
135
+ rendition: MaterialRendition | null;
136
+ /** The other half of an original/rendered pair when this actor may see it. */
137
+ pairedMaterialId: string | null;
138
+ /**
139
+ * Files only: a first-page image recorded by the rendering step, null when
140
+ * none was (no converter, or it drew none). Sign with `thumbnail: true`.
141
+ */
142
+ thumbnailAssetId: string | null;
129
143
  }>;
130
144
  /** The page key a file carries: its own, or `p<position>` for older rows. */
131
145
  export declare function submissionPageKey(pageKey: string, sortOrder: number): string;
@@ -273,7 +287,8 @@ export declare class SubmissionService extends LearnerService {
273
287
  /** Whether the actor is the learner themself (learner audience only). */
274
288
  private learnerAudienceOnly;
275
289
  private visibleTo;
276
- private materialName;
290
+ private materialAsset;
291
+ private fileView;
277
292
  /**
278
293
  * A lesson's materials for this actor: files by role and audience, then
279
294
  * external video references in step order. A learner sees only
@@ -285,17 +300,22 @@ export declare class SubmissionService extends LearnerService {
285
300
  enrollmentId: string;
286
301
  }): Promise<LessonMaterialView[]>;
287
302
  private signMaterial;
288
- /** Sign one lesson file the actor may see (learners: learner audience only). */
303
+ /**
304
+ * Sign one lesson file the actor may see (learners: learner audience only),
305
+ * or its recorded thumbnail with `thumbnail: true`.
306
+ */
289
307
  signLessonMaterial(request: LessonRequest & {
290
308
  materialId: string;
309
+ thumbnail?: boolean;
291
310
  }): Promise<{
292
311
  url: string;
293
312
  expiresAt: Date;
294
313
  }>;
295
- /** Sign one course-level file the actor may see. */
314
+ /** Sign one course-level file the actor may see, or its thumbnail. */
296
315
  signCourseMaterial(request: LearnerRequest & {
297
316
  enrollmentId: string;
298
317
  materialId: string;
318
+ thumbnail?: boolean;
299
319
  }): Promise<{
300
320
  url: string;
301
321
  expiresAt: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"submission-service.d.ts","sourceRoot":"","sources":["../src/submission-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submission-service.d.ts","sourceRoot":"","sources":["../src/submission-service.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.59.1",
3
+ "version": "0.60.0",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Tenant-aware learning catalog models and authorized catalog access for SMRT",
6
6
  "type": "module",
@@ -29,18 +29,18 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
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",
32
+ "@happyvertical/smrt-assets": "0.60.0",
33
+ "@happyvertical/smrt-core": "0.60.0",
34
+ "@happyvertical/smrt-profiles": "0.60.0",
35
+ "@happyvertical/smrt-tenancy": "0.60.0",
36
+ "@happyvertical/smrt-users": "0.60.0",
37
37
  "@happyvertical/files": "^0.111.3",
38
38
  "@happyvertical/sql": "^0.111.3",
39
39
  "pdf-lib": "1.17.1",
40
- "@happyvertical/smrt-ingestion": "0.59.1"
40
+ "@happyvertical/smrt-ingestion": "0.60.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@happyvertical/smrt-vitest": "0.59.1",
43
+ "@happyvertical/smrt-vitest": "0.60.0",
44
44
  "@types/node": "24.13.6",
45
45
  "typescript": "6.0.3",
46
46
  "vite": "8.1.6",
@@ -1 +0,0 @@
1
- {"version":3,"file":"course-bundle-zip-5KUe3C5H.js","names":[],"sources":["../../src/course-bundle-contracts.ts","../../src/course-bundle-zip.ts"],"sourcesContent":["import { CourseAuthoringError } from './course-authoring-contracts.js';\n\nconst KiB = 1024;\nconst MiB = 1024 * KiB;\n\n/**\n * Hard ceilings for untrusted course bundles (SMRT #4578). A host may lower any\n * of them per call (`resolveCourseBundleLimits`) but never raise them. Declared\n * sizes in an archive are never trusted: every cap is enforced on the bytes\n * actually produced.\n */\nexport interface CourseBundleLimits {\n /** Largest accepted archive (or total input of a plain file set), in bytes. */\n maxArchiveBytes: number;\n /** Most entries (files and directories) in one archive or file set. */\n maxEntries: number;\n /** Largest single inflated member. A larger honest member is recorded refused. */\n maxEntryBytes: number;\n /** Largest sum of inflated members. */\n maxTotalBytes: number;\n /** Largest inflated/compressed ratio for a member above `ratioFloorBytes`. */\n maxCompressionRatio: number;\n /** Members at or below this inflated size skip the ratio check. */\n ratioFloorBytes: number;\n /** Longest normalised path, in UTF-8 bytes. */\n maxPathBytes: number;\n /** Longest path segment, in UTF-8 bytes. */\n maxSegmentBytes: number;\n /** Deepest directory path (segments, including the file name). */\n maxPathDepth: number;\n /** Largest `manifest.json`. */\n maxManifestBytes: number;\n /** Most lessons one bundle may propose (matches the proposal schema). */\n maxLessons: number;\n /** Longest text member used as a lesson body, in characters. */\n maxLessonBodyChars: number;\n /** Most Word/PowerPoint members rendered per bundle; later ones are recorded unsupported. */\n maxOfficeMembers: number;\n /** Largest rendered PDF accepted back from the converter, in bytes. */\n maxRenderedBytes: number;\n /** Wall-clock budget for rendering one Office member, in milliseconds. */\n conversionTimeoutMs: number;\n}\n\nexport const COURSE_BUNDLE_LIMITS: Readonly<CourseBundleLimits> = Object.freeze(\n {\n maxArchiveBytes: 100 * MiB,\n maxEntries: 200,\n maxEntryBytes: 50 * MiB,\n maxTotalBytes: 200 * MiB,\n maxCompressionRatio: 100,\n ratioFloorBytes: 64 * KiB,\n maxPathBytes: 512,\n maxSegmentBytes: 255,\n maxPathDepth: 8,\n maxManifestBytes: 256 * KiB,\n maxLessons: 50,\n maxLessonBodyChars: 100_000,\n maxOfficeMembers: 50,\n maxRenderedBytes: 50 * MiB,\n conversionTimeoutMs: 60_000,\n },\n);\n\n/** Nested archives are never expanded: depth is one, and a zip member is unsupported evidence. */\nexport const COURSE_BUNDLE_MAX_ARCHIVE_DEPTH = 1;\n/** The original manifest schema version (page roles, no materials). */\nexport const COURSE_BUNDLE_MANIFEST_VERSION = 1;\n/** Manifest version 2: material roles and audience, lesson pages, course members, videos. */\nexport const COURSE_BUNDLE_MANIFEST_VERSION_2 = 2;\n/** Manifest location: the archive (or file set) root. */\nexport const COURSE_BUNDLE_MANIFEST_PATH = 'manifest.json';\n\n/** Clamp a host override to the hard ceilings; invalid values fall back to the ceiling. */\nexport function resolveCourseBundleLimits(\n override: Partial<CourseBundleLimits> = {},\n): CourseBundleLimits {\n const out = { ...COURSE_BUNDLE_LIMITS };\n for (const key of Object.keys(out) as Array<keyof CourseBundleLimits>) {\n const value = override[key];\n if (\n value !== undefined &&\n Number.isSafeInteger(value) &&\n value >= 1 &&\n value <= COURSE_BUNDLE_LIMITS[key]\n )\n out[key] = value;\n }\n return out;\n}\n\nexport type CourseBundleRefusalReason =\n | 'archive_too_large'\n | 'not_a_zip'\n | 'truncated'\n | 'ambiguous_end_record'\n | 'zip64_unsupported'\n | 'multi_disk'\n | 'too_many_entries'\n | 'invalid_central_directory'\n | 'invalid_entry'\n | 'unsupported_method'\n | 'encrypted_entry'\n | 'symlink_entry'\n | 'special_entry'\n | 'invalid_path'\n | 'path_too_deep'\n | 'duplicate_name'\n | 'entry_out_of_range'\n | 'overlapping_entries'\n | 'local_header_mismatch'\n | 'compression_ratio'\n | 'total_too_large'\n | 'size_mismatch'\n | 'bad_crc'\n | 'inflate_failed'\n | 'empty_bundle'\n | 'manifest_invalid'\n | 'manifest_version'\n | 'manifest_unknown_key'\n /** v2: a member role that is not a material role. */\n | 'manifest_role'\n /** v2: a learner audience on a guardian-only role, or an unknown audience. */\n | 'manifest_audience'\n /** v2: a page range that is malformed or names a member that cannot be paged. */\n | 'manifest_pages'\n /** v2: a video reference that is not an allowlisted YouTube id or URL. */\n | 'manifest_video'\n | 'manifest_missing_member'\n | 'manifest_duplicate_member'\n | 'duplicate_key'\n | 'too_many_lessons'\n | 'lesson_too_large';\n\n/**\n * The whole bundle is refused: it is hostile, damaged or outside the contract.\n * `reason` is stable; `entry` names the offending member path when one applies\n * (untrusted text, never rendered as markup).\n */\nexport class CourseBundleRefusedError extends CourseAuthoringError {\n constructor(\n readonly reason: CourseBundleRefusalReason,\n readonly entry?: string,\n ) {\n super('course-bundle-refused', `Course bundle refused: ${reason}.`);\n }\n}\nexport class CourseBundleNotFoundError extends CourseAuthoringError {\n constructor() {\n super('course-bundle-not-found', 'Course bundle import was not found.');\n }\n}\n\n/** What the bytes of a bundle member turned out to be (by content, never by name alone). */\nexport type CourseBundleMemberKind =\n | 'pdf'\n | 'image'\n | 'text'\n /** Word (`.docx`): rendered to PDF by the converter, text read by the SDK processor. */\n | 'docx'\n /** PowerPoint (`.pptx`): the deck is kept as the original and as rendered pages. */\n | 'pptx'\n /** Excel (`.xlsx`): rendered to PDF by the converter; no text reader. */\n | 'xlsx'\n | 'manifest'\n | 'unsupported';\nexport type CourseBundleMemberStatus =\n /** Supported, unique content: handed to extraction and eligible for a lesson. */\n | 'accepted'\n /** Identical bytes to an earlier accepted member: evidence only, never extracted twice. */\n | 'duplicate'\n /** Visible but not understood (unknown type, nested archive, unreadable text). */\n | 'unsupported'\n /** Understood and refused (encrypted PDF, oversize member). */\n | 'refused'\n /** The bundle manifest itself. */\n | 'metadata';\nexport type CourseBundleMemberReason =\n | 'unsupported_type'\n | 'nested_archive'\n | 'unreadable_text'\n | 'encrypted_pdf'\n | 'entry_too_large'\n | 'duplicate_content'\n /** The OOXML package failed the bounded zip checks (bomb, bad paths, damaged). */\n | 'unsafe_office'\n /** More Office members than `maxOfficeMembers`. */\n | 'office_limit'\n /** No `DocumentConverter` is configured: the member cannot be rendered. */\n | 'converter_unavailable'\n /** The converter could not be reached or failed (server side). */\n | 'converter_failed'\n | 'converter_timeout'\n | 'converter_too_large'\n /** The converter refused the file, or returned something that is not a PDF. */\n | 'converter_rejected';\n\n/**\n * Converter outcomes that a deliberate retry may repair. A bundle that was\n * never rendered or whose converter was unreachable can be rendered later;\n * a file the converter rejected, or a limit, cannot be fixed by asking again.\n */\nexport const COURSE_BUNDLE_RETRYABLE_REASONS: ReadonlySet<CourseBundleMemberReason> =\n new Set(['converter_unavailable', 'converter_failed', 'converter_timeout']);\n\nexport const COURSE_BUNDLE_PAGE_ROLES = [\n 'exercise',\n 'example',\n 'instructions',\n 'cover',\n 'answer_key',\n 'mixed',\n 'unknown',\n] as const;\nexport type CourseBundlePageRole = (typeof COURSE_BUNDLE_PAGE_ROLES)[number];\n\n/** Named progress stages, in order. */\nexport const COURSE_BUNDLE_STAGES = [\n 'unpack',\n 'classify',\n 'render',\n 'extract',\n 'propose',\n] as const;\nexport type CourseBundleStage = (typeof COURSE_BUNDLE_STAGES)[number];\n/** One progress event. A stage emits `completed: 0` first and `completed === total` last. */\nexport interface CourseBundleProgress {\n stage: CourseBundleStage;\n completed: number;\n total: number;\n}\n/** Observer only: a throwing listener never changes the import. */\nexport type CourseBundleProgressListener = (\n event: CourseBundleProgress,\n) => void;\n\n/** A bundle supplied as one zip archive or as a plain set of files. */\nexport type CourseBundleInput =\n | { archive: Uint8Array }\n | { files: ReadonlyArray<{ path: string; bytes: Uint8Array }> };\n","/**\n * Bounded zip reader for untrusted course bundles (SMRT #4578). Reads the End\n * Of Central Directory and central directory, validates every offset and size\n * against the real buffer, inflates with a hard output cap and checks CRC32.\n * Stored and deflate only; zip64, multi-disk, encryption and symlinks are\n * refused with typed reasons. Nothing here touches the filesystem.\n */\nimport {\n COURSE_BUNDLE_LIMITS,\n type CourseBundleLimits,\n type CourseBundleRefusalReason,\n CourseBundleRefusedError,\n} from './course-bundle-contracts.js';\n\nconst SIG_EOCD = 0x06054b50;\nconst SIG_ZIP64_LOCATOR = 0x07064b50;\nconst SIG_CENTRAL = 0x02014b50;\nconst SIG_LOCAL = 0x04034b50;\nconst EOCD_SIZE = 22;\nconst CENTRAL_SIZE = 46;\nconst LOCAL_SIZE = 30;\nconst MAX_COMMENT = 0xffff;\n\n/** One member read from an archive or file set, before classification. */\nexport interface RawBundleMember {\n /** Normalised, validated path. */\n path: string;\n size: number;\n /** Null only when the member was refused as oversize and never inflated. */\n bytes: Uint8Array | null;\n sha256: string | null;\n /** Set when the member was understood but not inflated. */\n refusal: 'entry_too_large' | null;\n}\n\nfunction node() {\n const get = (typeof process !== 'undefined' && process.getBuiltinModule) as\n | ((id: string) => unknown)\n | false;\n if (!get) throw new Error('Course bundle import requires a Node server');\n return {\n zlib: get('node:zlib') as typeof import('node:zlib'),\n crypto: get('node:crypto') as typeof import('node:crypto'),\n };\n}\n\nexport function sha256Hex(bytes: Uint8Array | string): string {\n return node().crypto.createHash('sha256').update(bytes).digest('hex');\n}\n\nlet crcTable: Uint32Array | undefined;\nexport function crc32(bytes: Uint8Array): number {\n if (!crcTable) {\n crcTable = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n crcTable[n] = c >>> 0;\n }\n }\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++)\n crc = (crcTable[(crc ^ bytes[i]) & 0xff] as number) ^ (crc >>> 8);\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nconst refuse = (reason: CourseBundleRefusalReason, entry?: string): never => {\n throw new CourseBundleRefusedError(reason, entry);\n};\n\nconst FORBIDDEN =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: refusing control characters in names\n /[\\u0000-\\u001f\\u007f-\\u009f\\u200b-\\u200f\\u2028-\\u202e\\u2066-\\u2069\\ufeff]/;\n/** True when the string has no lone UTF-16 surrogates. */\nexport function isWellFormedString(value: string): boolean {\n return !/[\\ud800-\\udbff](?![\\udc00-\\udfff])|(?<![\\ud800-\\udbff])[\\udc00-\\udfff]/.test(\n value,\n );\n}\n\n/**\n * Normalise and validate an entry or file name. Backslashes become `/`; empty,\n * `.` and `..` segments, absolute and drive-letter paths, `:` anywhere, NUL and\n * other control or bidi characters, over-long or over-deep paths are refused.\n * A trailing `/` (directory) is stripped and reported.\n */\nexport function normalizeBundlePath(\n raw: unknown,\n limits: CourseBundleLimits = COURSE_BUNDLE_LIMITS,\n): { path: string; directory: boolean } {\n if (typeof raw !== 'string' || raw.length === 0)\n return refuse('invalid_path');\n if (!isWellFormedString(raw) || FORBIDDEN.test(raw))\n return refuse('invalid_path');\n const text = raw.replaceAll('\\\\', '/');\n if (\n Buffer.byteLength(text) > limits.maxPathBytes ||\n text.startsWith('/') ||\n /^[A-Za-z]:/.test(text) ||\n text.includes(':')\n )\n return refuse('invalid_path');\n const directory = text.endsWith('/');\n const segments = (directory ? text.slice(0, -1) : text).split('/');\n for (const segment of segments)\n if (\n segment === '' ||\n segment === '.' ||\n segment === '..' ||\n Buffer.byteLength(segment) > limits.maxSegmentBytes\n )\n return refuse('invalid_path');\n if (segments.length > limits.maxPathDepth) return refuse('path_too_deep');\n return { path: segments.join('/'), directory };\n}\n\n/** Case- and normalisation-insensitive identity used to refuse colliding names. */\nexport const bundleNameKey = (path: string) =>\n path.normalize('NFC').toLowerCase();\n\ninterface CentralEntry {\n name: string;\n rawName: Uint8Array;\n method: number;\n crc: number;\n compressed: number;\n size: number;\n localOffset: number;\n directory: boolean;\n}\n\nfunction findEndRecord(bytes: Uint8Array, view: DataView): number {\n const low = Math.max(0, bytes.length - EOCD_SIZE - MAX_COMMENT);\n const candidates: number[] = [];\n for (let i = bytes.length - EOCD_SIZE; i >= low; i--) {\n if (view.getUint32(i, true) !== SIG_EOCD) continue;\n // The comment must run exactly to the end of the file, so a record forged\n // inside a comment can only count if it also fits; two fits are ambiguous.\n if (i + EOCD_SIZE + view.getUint16(i + 20, true) === bytes.length)\n candidates.push(i);\n }\n if (candidates.length === 0)\n return refuse(\n bytes.length >= 4 && view.getUint32(0, true) === SIG_LOCAL\n ? 'truncated'\n : 'not_a_zip',\n );\n if (candidates.length > 1) return refuse('ambiguous_end_record');\n return candidates[0] as number;\n}\n\n/**\n * Read every member of a zip archive. Throws `CourseBundleRefusedError` for a\n * hostile or damaged archive. A member whose honest declared size exceeds\n * `maxEntryBytes` is returned `entry_too_large` (visible, never inflated);\n * every other violation refuses the whole archive.\n */\nexport function readZipArchive(\n input: Uint8Array,\n limits: CourseBundleLimits = COURSE_BUNDLE_LIMITS,\n onProgress?: (completed: number, total: number) => void,\n): RawBundleMember[] {\n if (!(input instanceof Uint8Array)) return refuse('not_a_zip');\n if (input.length > limits.maxArchiveBytes) return refuse('archive_too_large');\n if (input.length < EOCD_SIZE) return refuse('not_a_zip');\n const bytes = input;\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const eocd = findEndRecord(bytes, view);\n if (eocd >= 20 && view.getUint32(eocd - 20, true) === SIG_ZIP64_LOCATOR)\n return refuse('zip64_unsupported');\n const disk = view.getUint16(eocd + 4, true);\n const cdDisk = view.getUint16(eocd + 6, true);\n const entriesDisk = view.getUint16(eocd + 8, true);\n const entries = view.getUint16(eocd + 10, true);\n const cdSize = view.getUint32(eocd + 12, true);\n const cdOffset = view.getUint32(eocd + 16, true);\n if (entries === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff)\n return refuse('zip64_unsupported');\n if (disk !== 0 || cdDisk !== 0 || entriesDisk !== entries)\n return refuse('multi_disk');\n if (entries === 0) return refuse('empty_bundle');\n if (entries > limits.maxEntries) return refuse('too_many_entries');\n if (\n cdSize < entries * CENTRAL_SIZE ||\n cdOffset + cdSize !== eocd // central directory must end exactly at the end record\n )\n return refuse('invalid_central_directory');\n\n const decoder = new TextDecoder('utf-8', { fatal: true });\n const central: CentralEntry[] = [];\n const names = new Set<string>();\n let at = cdOffset;\n for (let n = 0; n < entries; n++) {\n if (at + CENTRAL_SIZE > eocd || view.getUint32(at, true) !== SIG_CENTRAL)\n return refuse('invalid_central_directory');\n const madeBy = view.getUint16(at + 4, true);\n const flags = view.getUint16(at + 8, true);\n const method = view.getUint16(at + 10, true);\n const crc = view.getUint32(at + 16, true);\n const compressed = view.getUint32(at + 20, true);\n const size = view.getUint32(at + 24, true);\n const nameLength = view.getUint16(at + 28, true);\n const extraLength = view.getUint16(at + 30, true);\n const commentLength = view.getUint16(at + 32, true);\n const diskStart = view.getUint16(at + 34, true);\n const external = view.getUint32(at + 38, true);\n const localOffset = view.getUint32(at + 42, true);\n const next = at + CENTRAL_SIZE + nameLength + extraLength + commentLength;\n if (next > eocd) return refuse('invalid_central_directory');\n const rawName = bytes.subarray(\n at + CENTRAL_SIZE,\n at + CENTRAL_SIZE + nameLength,\n );\n let decoded: string;\n try {\n decoded = decoder.decode(rawName);\n } catch {\n return refuse('invalid_path');\n }\n const { path, directory } = normalizeBundlePath(decoded, limits);\n if (flags & (0x1 | 0x40 | 0x2000) || method === 99)\n return refuse('encrypted_entry', path);\n if (method !== 0 && method !== 8) return refuse('unsupported_method', path);\n if (\n compressed === 0xffffffff ||\n size === 0xffffffff ||\n localOffset === 0xffffffff\n )\n return refuse('zip64_unsupported', path);\n if (diskStart !== 0) return refuse('multi_disk', path);\n const host = madeBy >>> 8;\n if (host === 3) {\n const type = (external >>> 16) & 0o170000;\n if (type === 0o120000) return refuse('symlink_entry', path);\n if (type !== 0 && type !== 0o100000 && type !== 0o040000)\n return refuse('special_entry', path);\n } else if (external & 0x400) {\n return refuse('symlink_entry', path); // DOS reparse point\n }\n if (directory && (size !== 0 || compressed > 2))\n return refuse('invalid_entry', path);\n const key = bundleNameKey(path);\n if (names.has(key)) return refuse('duplicate_name', path);\n names.add(key);\n if (method === 0 && compressed !== size)\n return refuse('size_mismatch', path);\n if (\n size > limits.ratioFloorBytes &&\n method === 8 &&\n (compressed === 0 || size / compressed > limits.maxCompressionRatio)\n )\n return refuse('compression_ratio', path);\n central.push({\n name: path,\n rawName,\n method,\n crc,\n compressed,\n size,\n localOffset,\n directory,\n });\n at = next;\n }\n if (at !== eocd) return refuse('invalid_central_directory');\n\n // Local headers and data ranges: inside the file, before the central\n // directory, naming the same entry, never overlapping each other.\n const located: Array<CentralEntry & { start: number; end: number }> = [];\n const ranges: Array<[number, number, string]> = [];\n for (const entry of central) {\n if (entry.directory) continue;\n if (entry.localOffset + LOCAL_SIZE > cdOffset)\n return refuse('entry_out_of_range', entry.name);\n if (view.getUint32(entry.localOffset, true) !== SIG_LOCAL)\n return refuse('local_header_mismatch', entry.name);\n const flags = view.getUint16(entry.localOffset + 6, true);\n if (flags & (0x1 | 0x40 | 0x2000))\n return refuse('encrypted_entry', entry.name);\n if (view.getUint16(entry.localOffset + 8, true) !== entry.method)\n return refuse('local_header_mismatch', entry.name);\n const nameLength = view.getUint16(entry.localOffset + 26, true);\n const extraLength = view.getUint16(entry.localOffset + 28, true);\n const start = entry.localOffset + LOCAL_SIZE + nameLength + extraLength;\n const end = start + entry.compressed;\n if (end > cdOffset) return refuse('entry_out_of_range', entry.name);\n const local = bytes.subarray(\n entry.localOffset + LOCAL_SIZE,\n entry.localOffset + LOCAL_SIZE + nameLength,\n );\n if (\n local.length !== entry.rawName.length ||\n !local.every((b, i) => b === entry.rawName[i])\n )\n return refuse('local_header_mismatch', entry.name);\n located.push({ ...entry, start, end });\n ranges.push([entry.localOffset, end, entry.name]);\n }\n ranges.sort((a, b) => a[0] - b[0]);\n for (let i = 1; i < ranges.length; i++)\n if (\n (ranges[i] as [number, number, string])[0] <\n (ranges[i - 1] as [number, number, string])[1]\n )\n return refuse(\n 'overlapping_entries',\n (ranges[i] as [number, number, string])[2],\n );\n\n // Declared totals are checked up front, actual output again while inflating.\n let declared = 0;\n for (const entry of located)\n if (entry.size <= limits.maxEntryBytes) declared += entry.size;\n if (declared > limits.maxTotalBytes) return refuse('total_too_large');\n\n const { zlib } = node();\n const out: RawBundleMember[] = [];\n let total = 0;\n onProgress?.(0, located.length);\n for (const entry of [...located].sort((a, b) =>\n a.name < b.name ? -1 : a.name > b.name ? 1 : 0,\n )) {\n if (entry.size > limits.maxEntryBytes) {\n out.push({\n path: entry.name,\n size: entry.size,\n bytes: null,\n sha256: null,\n refusal: 'entry_too_large',\n });\n onProgress?.(out.length, located.length);\n continue;\n }\n const data = bytes.subarray(entry.start, entry.end);\n let inflated: Buffer;\n if (entry.method === 0) {\n inflated = Buffer.from(data);\n } else {\n try {\n inflated = zlib.inflateRawSync(data, {\n maxOutputLength: Math.max(entry.size, 1),\n });\n } catch (error) {\n return refuse(\n (error as { code?: string }).code === 'ERR_BUFFER_TOO_LARGE'\n ? 'size_mismatch'\n : 'inflate_failed',\n entry.name,\n );\n }\n }\n if (inflated.length !== entry.size)\n return refuse('size_mismatch', entry.name);\n if (crc32(inflated) !== entry.crc) return refuse('bad_crc', entry.name);\n total += inflated.length;\n if (total > limits.maxTotalBytes) return refuse('total_too_large');\n out.push({\n path: entry.name,\n size: inflated.length,\n bytes: inflated,\n sha256: sha256Hex(inflated),\n refusal: null,\n });\n onProgress?.(out.length, located.length);\n }\n return out;\n}\n\n/** Validate a plain file set the same way an archive is: paths, caps, duplicates. */\nexport function readFileSet(\n files: ReadonlyArray<{ path: string; bytes: Uint8Array }>,\n limits: CourseBundleLimits = COURSE_BUNDLE_LIMITS,\n onProgress?: (completed: number, total: number) => void,\n): RawBundleMember[] {\n if (!Array.isArray(files) || files.length === 0)\n return refuse('empty_bundle');\n if (files.length > limits.maxEntries) return refuse('too_many_entries');\n const names = new Set<string>();\n const out: RawBundleMember[] = [];\n let total = 0;\n let memberTotal = 0;\n onProgress?.(0, files.length);\n for (const file of files) {\n const { path, directory } = normalizeBundlePath(file?.path, limits);\n if (directory || !(file.bytes instanceof Uint8Array))\n return refuse('invalid_entry', path);\n const key = bundleNameKey(path);\n if (names.has(key)) return refuse('duplicate_name', path);\n names.add(key);\n total += file.bytes.length;\n if (total > limits.maxArchiveBytes) return refuse('archive_too_large');\n if (file.bytes.length > limits.maxEntryBytes) {\n out.push({\n path,\n size: file.bytes.length,\n bytes: null,\n sha256: null,\n refusal: 'entry_too_large',\n });\n } else {\n // Same member-byte bound as an archive's inflated total.\n memberTotal += file.bytes.length;\n if (memberTotal > limits.maxTotalBytes) return refuse('total_too_large');\n out.push({\n path,\n size: file.bytes.length,\n bytes: file.bytes,\n sha256: sha256Hex(file.bytes),\n refusal: null,\n });\n }\n onProgress?.(out.length, files.length);\n }\n return out.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));\n}\n"],"mappings":"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"}