@happyvertical/smrt-education 0.57.8 → 0.57.10

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/catalog-sync.md +35 -0
  2. package/agents/ingestion.md +93 -0
  3. package/agents/learner-service.md +9 -0
  4. package/agents/source-import.md +9 -0
  5. package/agents/submission-service.md +18 -0
  6. package/dist/catalog-acquisition-service.d.ts +58 -0
  7. package/dist/catalog-acquisition-service.d.ts.map +1 -0
  8. package/dist/catalog-collections.d.ts +18 -0
  9. package/dist/catalog-collections.d.ts.map +1 -0
  10. package/dist/catalog-contracts.d.ts +88 -0
  11. package/dist/catalog-contracts.d.ts.map +1 -0
  12. package/dist/catalog-database-sync-store.d.ts +13 -0
  13. package/dist/catalog-database-sync-store.d.ts.map +1 -0
  14. package/dist/catalog-materialization-service.d.ts +78 -0
  15. package/dist/catalog-materialization-service.d.ts.map +1 -0
  16. package/dist/catalog-models.d.ts +63 -0
  17. package/dist/catalog-models.d.ts.map +1 -0
  18. package/dist/catalog-policy.d.ts +12 -0
  19. package/dist/catalog-policy.d.ts.map +1 -0
  20. package/dist/catalog-read-service.d.ts +44 -0
  21. package/dist/catalog-read-service.d.ts.map +1 -0
  22. package/dist/catalog-sync-service.d.ts +19 -0
  23. package/dist/catalog-sync-service.d.ts.map +1 -0
  24. package/dist/collections.d.ts +4 -1
  25. package/dist/collections.d.ts.map +1 -1
  26. package/dist/hearth-catalog-providers.d.ts +74 -0
  27. package/dist/hearth-catalog-providers.d.ts.map +1 -0
  28. package/dist/hearth-easy-peasy-grade4.d.ts +40 -0
  29. package/dist/hearth-easy-peasy-grade4.d.ts.map +1 -0
  30. package/dist/index.d.ts +28 -6
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2279 -175
  33. package/dist/index.js.map +1 -1
  34. package/dist/ingestion-isolation.d.ts +8 -0
  35. package/dist/ingestion-isolation.d.ts.map +1 -0
  36. package/dist/ingestion.d.ts +103 -0
  37. package/dist/ingestion.d.ts.map +1 -0
  38. package/dist/ingestion.js +364 -0
  39. package/dist/ingestion.js.map +1 -0
  40. package/dist/learner-service.d.ts +74 -1
  41. package/dist/learner-service.d.ts.map +1 -1
  42. package/dist/manifest.json +2686 -481
  43. package/dist/smrt-knowledge.json +713 -14
  44. package/dist/source-import-service.d.ts +11 -1
  45. package/dist/source-import-service.d.ts.map +1 -1
  46. package/dist/sources/easy-peasy-parser.d.ts.map +1 -1
  47. package/dist/sources/google-drive-adapter.d.ts +125 -0
  48. package/dist/sources/google-drive-adapter.d.ts.map +1 -0
  49. package/dist/sources/illustrative-mathematics-parser.d.ts +8 -0
  50. package/dist/sources/illustrative-mathematics-parser.d.ts.map +1 -0
  51. package/dist/sources/oer-commons-rss-parser.d.ts +8 -0
  52. package/dist/sources/oer-commons-rss-parser.d.ts.map +1 -0
  53. package/dist/submission-service.d.ts +48 -1
  54. package/dist/submission-service.d.ts.map +1 -1
  55. package/dist/submissions.d.ts +18 -0
  56. package/dist/submissions.d.ts.map +1 -1
  57. package/package.json +16 -10
@@ -6,11 +6,13 @@ export interface SourceImportRequest {
6
6
  sourceId: string;
7
7
  /** Host-stable identity, independent of the page's current URL. */
8
8
  courseRef: string;
9
+ /** Optional trusted catalog classification retained on the tenant course. */
10
+ subject?: string;
9
11
  pageUrl: string;
10
12
  destination: 'private' | 'group';
11
13
  }
12
14
  export interface SourceImportAuthorization {
13
- action: 'education.source.import';
15
+ action: 'education.source.import' | 'education.source.ensure';
14
16
  actorTenantId: string;
15
17
  actorUserId: string;
16
18
  sourceId: string;
@@ -36,6 +38,13 @@ export interface SourceImportResult {
36
38
  /** Source-hosted packet link, returned without fetching or persisting its content. */
37
39
  packetUrl?: string;
38
40
  }
41
+ export interface EnsureEasyPeasyCourseSourceRequest {
42
+ tenantId: string;
43
+ actorUserId: string;
44
+ }
45
+ export interface EnsureEasyPeasyCourseSourceResult {
46
+ sourceId: string;
47
+ }
39
48
  /** Opt-in, pointer-only import. Host authorization defines family/group roles. */
40
49
  export declare class SourceImportService {
41
50
  private readonly db;
@@ -43,6 +52,7 @@ export declare class SourceImportService {
43
52
  private easyPeasy?;
44
53
  constructor(db: DatabaseInterface, authorize: SourceImportAuthorizer);
45
54
  registerEasyPeasy(registration: EasyPeasyRegistration): void;
55
+ ensureEasyPeasyCourseSource(input: EnsureEasyPeasyCourseSourceRequest): Promise<EnsureEasyPeasyCourseSourceResult>;
46
56
  private actor;
47
57
  private source;
48
58
  importCourse(input: SourceImportRequest): Promise<SourceImportResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"source-import-service.d.ts","sourceRoot":"","sources":["../src/source-import-service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAW5D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAM5B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;CAClC;AACD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,yBAAyB,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,yBAAyB,KAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAChC,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,aAAa,EAAE,IAAI,CAAC;IACpB,gFAAgF;IAChF,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7C;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuDD,kFAAkF;AAClF,qBAAa,mBAAmB;IAG5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAH5B,OAAO,CAAC,SAAS,CAAC,CAAkC;gBAEjC,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,sBAAsB;IAGpD,iBAAiB,CAAC,YAAY,EAAE,qBAAqB,GAAG,IAAI;IAc5D,OAAO,CAAC,KAAK;YAsBC,MAAM;IAwCd,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA6J5E"}
1
+ {"version":3,"file":"source-import-service.d.ts","sourceRoot":"","sources":["../src/source-import-service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAW5D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAM5B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;CAClC;AACD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,yBAAyB,GAAG,yBAAyB,CAAC;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,sBAAsB,GAAG,CACnC,OAAO,EAAE,yBAAyB,KAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAChC,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,aAAa,EAAE,IAAI,CAAC;IACpB,gFAAgF;IAChF,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KAC3B,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7C;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,kCAAkC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuDD,kFAAkF;AAClF,qBAAa,mBAAmB;IAG5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAH5B,OAAO,CAAC,SAAS,CAAC,CAAkC;gBAEjC,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,sBAAsB;IAGpD,iBAAiB,CAAC,YAAY,EAAE,qBAAqB,GAAG,IAAI;IActD,2BAA2B,CAC/B,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,iCAAiC,CAAC;IA8E7C,OAAO,CAAC,KAAK;YAwBC,MAAM;IAwCd,YAAY,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA+J5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"easy-peasy-parser.d.ts","sourceRoot":"","sources":["../../src/sources/easy-peasy-parser.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5E;AAiLD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,kBAAkB,CA+CpB"}
1
+ {"version":3,"file":"easy-peasy-parser.d.ts","sourceRoot":"","sources":["../../src/sources/easy-peasy-parser.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAY5E;AA+ZD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,kBAAkB,CA0DpB"}
@@ -0,0 +1,125 @@
1
+ import type { DriveAcquisition, DriveAcquisitionOptions, DriveFileMetadata, DriveMetadataPage, DriveMetadataPageOptions, GoogleDriveProvider } from '@happyvertical/files';
2
+ import type { CatalogAcquireAdapter, CatalogSourceRecord, CatalogSyncAdapter, CatalogSyncPage } from '../catalog-contracts.js';
3
+ export type { DriveAcquisition, DriveAcquisitionOptions, DriveFileMetadata, DriveMetadataPage, DriveMetadataPageOptions, };
4
+ /**
5
+ * Metadata-only Google Drive curriculum discovery.
6
+ *
7
+ * This module deliberately accepts the public @happyvertical/files Drive
8
+ * surface as a port. Hosts construct that SDK provider with their own
9
+ * application credentials and pass it here; neither discovery records nor
10
+ * checkpoints contain credentials or downloaded content.
11
+ */
12
+ export declare const DRIVE_CURRICULUM_SEED_ROOTS: readonly [{
13
+ readonly id: "1K_au1upSRuakX55PF3aZzQLHWI70KwZd";
14
+ readonly title: "Carnival of Collisions (Contact Forces)";
15
+ }, {
16
+ readonly id: "1N1xFJ2omm-M1TuAxDOXQxZndkw70-KxM";
17
+ readonly title: "Mission Maglev (Electric and Magnetic Forces)";
18
+ }, {
19
+ readonly id: "1v0LXs7iky2R4FsiqZkWOjWyJmRu-aVIa";
20
+ readonly title: "Rocks vs. Big Rigs, Unit-Wide View";
21
+ }, {
22
+ readonly id: "1sFDNXdw8q-xrhgy8HFAMELXUoqKgp9tu";
23
+ readonly title: "Operation Space Jump (Gravitational Forces)";
24
+ }];
25
+ /** The adapter only uses public SDK methods, never a raw Google API client. */
26
+ export type GoogleDriveFilesClient = Pick<GoogleDriveProvider, 'listMetadataPage' | 'getMetadataById' | 'acquireById'>;
27
+ export interface DriveCatalogRecord extends CatalogSourceRecord {
28
+ providerId: 'google-drive';
29
+ checksum?: string;
30
+ mimeType: string;
31
+ size?: number;
32
+ modifiedTime?: string;
33
+ }
34
+ export interface DriveExclusion {
35
+ stableId: string;
36
+ reason: 'missing-revision' | 'shortcut-target-inaccessible' | 'shortcut-target-outside-boundary' | 'shortcut-target-unsupported';
37
+ }
38
+ interface FolderCursor {
39
+ folderId: string;
40
+ pageToken?: string;
41
+ visibility: 'catalog' | 'teacher';
42
+ }
43
+ /** Serializable traversal state; persist it after every returned page. */
44
+ export interface DriveDiscoveryCheckpoint {
45
+ version: 1;
46
+ roots: string[];
47
+ pendingFolders: FolderCursor[];
48
+ visitedFolders: string[];
49
+ }
50
+ export interface DriveDiscoveryPage {
51
+ records: DriveCatalogRecord[];
52
+ exclusions: DriveExclusion[];
53
+ checkpoint?: DriveDiscoveryCheckpoint;
54
+ complete: boolean;
55
+ }
56
+ export interface DriveDiscoveryOptions {
57
+ /** Defaults to the four owner-authorized curriculum roots. */
58
+ roots?: readonly {
59
+ id: string;
60
+ title?: string;
61
+ }[];
62
+ checkpoint?: DriveDiscoveryCheckpoint;
63
+ pageSize?: number;
64
+ /**
65
+ * Exact Drive file IDs the trusted host has reviewed as learner-safe.
66
+ * Folder IDs never grant visibility to their contents.
67
+ */
68
+ studentSafeFileIds?: readonly string[];
69
+ /**
70
+ * Shortcut targets are re-read by ID and must pass this host boundary check
71
+ * before a folder can enter traversal. The secure default is deny.
72
+ */
73
+ authorizeShortcutTarget?: (target: DriveFileMetadata, context: {
74
+ sourceFolderId: string;
75
+ configuredRootIds: readonly string[];
76
+ }) => boolean | Promise<boolean>;
77
+ }
78
+ export interface DriveSelectionAuthorization {
79
+ stableId: string;
80
+ revision: string;
81
+ exportMimeType?: string;
82
+ /** True only after the host's resource-level license policy allows use. */
83
+ allowed: boolean;
84
+ }
85
+ export interface PinnedDriveContent {
86
+ stableId: string;
87
+ revision?: string;
88
+ checksum?: string;
89
+ sha256: string;
90
+ bytes: Buffer;
91
+ exportMimeType?: string;
92
+ }
93
+ /**
94
+ * One call reads at most one Drive metadata page. Repeated calls with the
95
+ * returned checkpoint provide durable pagination without content acquisition.
96
+ */
97
+ export declare class GoogleDriveCurriculumAdapter implements CatalogSyncAdapter, CatalogAcquireAdapter {
98
+ private readonly drive;
99
+ private readonly configuration;
100
+ static readonly providerId = "google-drive";
101
+ constructor(drive: GoogleDriveFilesClient, configuration?: Omit<DriveDiscoveryOptions, 'checkpoint'> & {
102
+ maxAcquisitionBytes?: number;
103
+ });
104
+ enumerate(input: {
105
+ cursor?: string;
106
+ }): Promise<CatalogSyncPage>;
107
+ discover(options?: DriveDiscoveryOptions): Promise<DriveDiscoveryPage>;
108
+ private resolveShortcut;
109
+ /**
110
+ * Content is available only after explicit selection and policy approval.
111
+ * A revision is mandatory so retries cannot silently acquire changed bytes.
112
+ */
113
+ acquireSelected(authorization: DriveSelectionAuthorization, options: Omit<DriveAcquisitionOptions, 'expectedRevision'>): Promise<PinnedDriveContent>;
114
+ acquire(input: {
115
+ providerId: string;
116
+ stableId: string;
117
+ revision: string;
118
+ format: string;
119
+ }): Promise<{
120
+ bytes: Uint8Array;
121
+ sha256: string;
122
+ revision: string;
123
+ }>;
124
+ }
125
+ //# sourceMappingURL=google-drive-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-drive-adapter.d.ts","sourceRoot":"","sources":["../../src/sources/google-drive-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CatalogSourceRecord } from '../catalog-contracts.js';
2
+ /**
3
+ * Parses the publicly linked K-5 family curriculum index published by the IM
4
+ * Certified Kendall Hunt site. It is deliberately metadata-only: unit and
5
+ * lesson pages are not fetched or acquired here.
6
+ */
7
+ export declare function parseIllustrativeMathematicsK5Index(html: string, revision: string, pageUrl?: string): CatalogSourceRecord[];
8
+ //# sourceMappingURL=illustrative-mathematics-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"illustrative-mathematics-parser.d.ts","sourceRoot":"","sources":["../../src/sources/illustrative-mathematics-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAWnE;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,SAAkD,GACxD,mBAAmB,EAAE,CAyDvB"}
@@ -0,0 +1,8 @@
1
+ import type { CatalogSourceRecord } from '../catalog-contracts.js';
2
+ /**
3
+ * Parses a configured OER Commons/ISKME RSS or Dublin Core feed without entity
4
+ * expansion or external resolution. The configured feed is authoritative for
5
+ * scope; this parser never represents its page as global catalog coverage.
6
+ */
7
+ export declare function parseOerCommonsRssFeed(xml: string, revision: string): CatalogSourceRecord[];
8
+ //# sourceMappingURL=oer-commons-rss-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oer-commons-rss-parser.d.ts","sourceRoot":"","sources":["../../src/sources/oer-commons-rss-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AA8DnE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,mBAAmB,EAAE,CA4CvB"}
@@ -2,7 +2,7 @@ import { type AssetRuntimeOptions } from '@happyvertical/smrt-assets';
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 } from './learner-service.js';
5
- import type { Grade, Submission } from './submissions.js';
5
+ import type { Grade, Submission, SubmissionKind } from './submissions.js';
6
6
  /** A single captured page. No model patches or pre-existing asset IDs are accepted. */
7
7
  export interface SubmissionPage {
8
8
  name: string;
@@ -18,6 +18,12 @@ export interface SubmissionAssetClaim {
18
18
  assetId: string;
19
19
  expiresAt: Date;
20
20
  }
21
+ /** Immutable external receipt binding for a scan; supplied only by a trusted host. */
22
+ export interface SubmissionIntake {
23
+ intakeItemId: string;
24
+ kind: SubmissionKind;
25
+ previousSubmissionId?: string;
26
+ }
21
27
  /** Server configuration; never populate this from request JSON. */
22
28
  export interface SubmissionServiceOptions {
23
29
  storage: AssetRuntimeOptions['storage'];
@@ -33,6 +39,9 @@ export type SubmissionView = Readonly<{
33
39
  status: Submission['status'];
34
40
  submittedAt: Date;
35
41
  notes: string;
42
+ kind: SubmissionKind;
43
+ previousSubmissionId: string | null;
44
+ intakeItemId: string | null;
36
45
  pages: ReadonlyArray<{
37
46
  assetId: string;
38
47
  sortOrder: number;
@@ -71,10 +80,31 @@ export declare class SubmissionService extends LearnerService {
71
80
  private progress;
72
81
  private requireSubmission;
73
82
  private view;
83
+ /** Recheck the exact assignment without creating progress or accepting bytes.
84
+ * Trusted intake bridges call this before reading retained evidence.
85
+ */
86
+ assertLessonAssignment(request: LessonRequest): Promise<void>;
74
87
  captureSubmission(request: LessonRequest & {
75
88
  requestKey: string;
76
89
  pages: readonly SubmissionPage[];
77
90
  notes?: string;
91
+ /** Trusted ingestion identity; ordinary host upload omits this. */
92
+ intake?: SubmissionIntake;
93
+ }): Promise<SubmissionView>;
94
+ /** Capture a blank workbook scan without claiming completion or a grade. */
95
+ captureBlankReference(request: LessonRequest & {
96
+ requestKey: string;
97
+ pages: readonly SubmissionPage[];
98
+ notes?: string;
99
+ intakeItemId: string;
100
+ }): Promise<SubmissionView>;
101
+ /** Rescan corrections as a new immutable completed-work attempt. */
102
+ resubmitSubmission(request: LessonRequest & {
103
+ previousSubmissionId: string;
104
+ requestKey: string;
105
+ pages: readonly SubmissionPage[];
106
+ notes?: string;
107
+ intakeItemId: string;
78
108
  }): Promise<SubmissionView>;
79
109
  getSubmission(request: SubmissionRequest): Promise<SubmissionView>;
80
110
  private grade;
@@ -82,6 +112,16 @@ export declare class SubmissionService extends LearnerService {
82
112
  score?: number | null;
83
113
  feedback?: string;
84
114
  }): Promise<SubmissionView>;
115
+ /** Bridge-only alias: uses the same guardian authorization and current-attempt checks. */
116
+ applyReviewedSubmission(request: SubmissionRequest & {
117
+ score?: number | null;
118
+ feedback?: string;
119
+ }): Promise<SubmissionView>;
120
+ /** Record a non-authoritative automated proposal; it never completes progress. */
121
+ proposeSubmissionGrade(request: SubmissionRequest & {
122
+ score?: number | null;
123
+ feedback?: string;
124
+ }): Promise<SubmissionView>;
85
125
  attestLesson(request: LessonRequest & {
86
126
  score?: number | null;
87
127
  feedback?: string;
@@ -92,6 +132,13 @@ export declare class SubmissionService extends LearnerService {
92
132
  url: string;
93
133
  expiresAt: Date;
94
134
  }>;
135
+ /** Sign only an exact authorized printable join; answer keys never qualify. */
136
+ signLessonPrintable(request: LessonRequest & {
137
+ assetId: string;
138
+ }): Promise<{
139
+ url: string;
140
+ expiresAt: Date;
141
+ }>;
95
142
  /** Extract inclusive one-based, disjoint ranges into private worksheet PDFs. */
96
143
  splitWorksheetPacket(request: LearnerRequest & {
97
144
  courseId: string;
@@ -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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"}
@@ -3,6 +3,8 @@ export type SubmissionStatus = 'captured' | 'extracting' | 'needs_review' | 'gra
3
3
  export type ExternalCompletionReporter = 'learner' | 'guardian' | 'source';
4
4
  export type SubmissionAssetRelationship = 'page' | 'attachment';
5
5
  export type GraderKind = 'auto' | 'ai' | 'guardian' | 'instructor';
6
+ /** Blank workbook evidence is deliberately distinct from completed work. */
7
+ export type SubmissionKind = 'blank_reference' | 'completed_work';
6
8
  /** Evidence that a learner completed one progress item. */
7
9
  export declare class Submission extends SmrtObject {
8
10
  tenantId: string;
@@ -16,6 +18,22 @@ export declare class Submission extends SmrtObject {
16
18
  captureKey: string;
17
19
  /** Service-owned content digest used to detect changed retry payloads. */
18
20
  captureDigest: string;
21
+ /** A retained blank workbook reference never becomes a completed attempt. */
22
+ kind: SubmissionKind;
23
+ /** Immutable predecessor for a correction/rescan chain. */
24
+ previousSubmissionId: string | null;
25
+ /** Stable external intake identity, unique in service scope when supplied. */
26
+ intakeItemId: string | null;
27
+ constructor(options?: Record<string, unknown>);
28
+ save(): Promise<this>;
29
+ }
30
+ /** Durable tenant/item claim for trusted ingestion receipts. This separate table
31
+ * keeps ordinary uploads (which have no intake item) out of the uniqueness key.
32
+ */
33
+ export declare class SubmissionIntakeBinding extends SmrtObject {
34
+ tenantId: string;
35
+ intakeItemId: string;
36
+ submissionId: string;
19
37
  constructor(options?: Record<string, unknown>);
20
38
  save(): Promise<this>;
21
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"submissions.d.ts","sourceRoot":"","sources":["../src/submissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAiElC,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,YAAY,GACZ,cAAc,GACd,QAAQ,GACR,UAAU,CAAC;AACf,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC3E,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,YAAY,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;AAEnE,2DAA2D;AAC3D,qBAEa,UAAW,SAAQ,UAAU;IAC5B,QAAQ,SAAM;IACiB,SAAS,SAAM;IAChB,QAAQ,SAAM;IACN,UAAU,SAAM;IAClE,WAAW,OAAc;IACzB,MAAM,EAAE,gBAAgB,CAAc;IACtC,KAAK,SAAM;IACX,8EAA8E;IAC9E,UAAU,SAAM;IAChB,0EAA0E;IAC1E,aAAa,SAAM;gBAEP,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA0BrC;AAED,oDAAoD;AACpD,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,SAAS,SAAK;IACd,OAAO,SAAM;IACb,SAAS,SAAQ;gBAEL,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKjD,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIvC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAIrC;AAED,wEAAwE;AACxE,qBACa,kBAAmB,SAAQ,UAAU;IAChD,UAAU,EAAE,0BAA0B,CAAa;IACnD,WAAW,SAAM;IACW,aAAa,SAAO;gBAEpC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC;AAED,sDAAsD;AACtD,qBACa,WAAY,SAAQ,UAAU;CAAG;AAE9C,uDAAuD;AACvD,qBAMa,eAAgB,SAAQ,UAAU;IACjC,QAAQ,SAAM;IACoB,YAAY,SAAM;IAEhE,OAAO,SAAM;IACc,YAAY,EAAE,2BAA2B,CAAU;IAC9E,SAAS,SAAK;gBAEF,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BrC;AAED,kFAAkF;AAClF,qBAEa,KAAM,SAAQ,UAAU;IACvB,QAAQ,SAAM;IACoB,YAAY,SAAM;IACrC,UAAU,EAAE,UAAU,CAAU;IAE3D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACM,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAChE;IACqC,cAAc,EAAE,MAAM,GAAG,IAAI,CAClE;IACP,aAAa,SAAQ;IACrB,QAAQ,SAAM;IACd,QAAQ,OAAc;gBAEV,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKjD,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI3C,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA0BrC"}
1
+ {"version":3,"file":"submissions.d.ts","sourceRoot":"","sources":["../src/submissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAiElC,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,YAAY,GACZ,cAAc,GACd,QAAQ,GACR,UAAU,CAAC;AACf,MAAM,MAAM,0BAA0B,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC3E,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,YAAY,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;AACnE,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAElE,2DAA2D;AAC3D,qBAEa,UAAW,SAAQ,UAAU;IAC5B,QAAQ,SAAM;IACiB,SAAS,SAAM;IAChB,QAAQ,SAAM;IACN,UAAU,SAAM;IAClE,WAAW,OAAc;IACzB,MAAM,EAAE,gBAAgB,CAAc;IACtC,KAAK,SAAM;IACX,8EAA8E;IAC9E,UAAU,SAAM;IAChB,0EAA0E;IAC1E,aAAa,SAAM;IACnB,6EAA6E;IAClD,IAAI,EAAE,cAAc,CAAoB;IACnE,2DAA2D;IACb,oBAAoB,EAC9D,MAAM,GACN,IAAI,CAAQ;IAChB,8EAA8E;IACrC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAEhE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA6CrC;AAED;;GAEG;AACH,qBAMa,uBAAwB,SAAQ,UAAU;IACzC,QAAQ,SAAM;IACe,YAAY,SAAM;IACb,YAAY,SAAM;gBAEpD,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAerC;AAED,oDAAoD;AACpD,qBACa,iBAAkB,SAAQ,UAAU;IAC/C,SAAS,SAAK;IACd,OAAO,SAAM;IACb,SAAS,SAAQ;gBAEL,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKjD,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIvC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAIrC;AAED,wEAAwE;AACxE,qBACa,kBAAmB,SAAQ,UAAU;IAChD,UAAU,EAAE,0BAA0B,CAAa;IACnD,WAAW,SAAM;IACW,aAAa,SAAO;gBAEpC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAKrC;AAED,sDAAsD;AACtD,qBACa,WAAY,SAAQ,UAAU;CAAG;AAE9C,uDAAuD;AACvD,qBAMa,eAAgB,SAAQ,UAAU;IACjC,QAAQ,SAAM;IACoB,YAAY,SAAM;IAEhE,OAAO,SAAM;IACc,YAAY,EAAE,2BAA2B,CAAU;IAC9E,SAAS,SAAK;gBAEF,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BrC;AAED,kFAAkF;AAClF,qBAEa,KAAM,SAAQ,UAAU;IACvB,QAAQ,SAAM;IACoB,YAAY,SAAM;IACrC,UAAU,EAAE,UAAU,CAAU;IAE3D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACM,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAChE;IACqC,cAAc,EAAE,MAAM,GAAG,IAAI,CAClE;IACP,aAAa,SAAQ;IACrB,QAAQ,SAAM;IACd,QAAQ,OAAc;gBAEV,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;IAKjD,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI3C,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIvC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CA0BrC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-education",
3
- "version": "0.57.8",
3
+ "version": "0.57.10",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Tenant-aware learning catalog models and authorized catalog access for SMRT",
6
6
  "type": "module",
@@ -18,19 +18,25 @@
18
18
  "import": "./dist/index.js"
19
19
  },
20
20
  "./manifest": "./dist/manifest.json",
21
- "./manifest.json": "./dist/manifest.json"
21
+ "./manifest.json": "./dist/manifest.json",
22
+ "./ingestion": {
23
+ "types": "./dist/ingestion.d.ts",
24
+ "import": "./dist/ingestion.js"
25
+ }
22
26
  },
23
27
  "dependencies": {
24
- "@happyvertical/smrt-assets": "0.57.8",
25
- "@happyvertical/smrt-core": "0.57.8",
26
- "@happyvertical/smrt-profiles": "0.57.8",
27
- "@happyvertical/smrt-tenancy": "0.57.8",
28
- "@happyvertical/smrt-users": "0.57.8",
29
- "@happyvertical/sql": "^0.105.2",
30
- "pdf-lib": "1.17.1"
28
+ "@happyvertical/smrt-assets": "0.57.10",
29
+ "@happyvertical/smrt-core": "0.57.10",
30
+ "@happyvertical/smrt-profiles": "0.57.10",
31
+ "@happyvertical/smrt-tenancy": "0.57.10",
32
+ "@happyvertical/smrt-users": "0.57.10",
33
+ "@happyvertical/files": "^0.105.3",
34
+ "@happyvertical/sql": "^0.105.3",
35
+ "pdf-lib": "1.17.1",
36
+ "@happyvertical/smrt-ingestion": "0.57.10"
31
37
  },
32
38
  "devDependencies": {
33
- "@happyvertical/smrt-vitest": "0.57.8",
39
+ "@happyvertical/smrt-vitest": "0.57.10",
34
40
  "@types/node": "24.13.6",
35
41
  "typescript": "6.0.3",
36
42
  "vite": "8.1.4",