@happyvertical/smrt-education 0.57.43 → 0.57.44

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 (82) hide show
  1. package/AGENTS.md +12 -0
  2. package/README.md +5 -0
  3. package/agents/course-authoring-service.md +179 -0
  4. package/agents/course-generation-review.md +79 -0
  5. package/agents/learner-service.md +33 -0
  6. package/agents/question-records.md +100 -0
  7. package/dist/chunks/{workbook-photo-service-C6mbUUp6.js → workbook-photo-service-BxvZDqjM.js} +1440 -309
  8. package/dist/chunks/workbook-photo-service-BxvZDqjM.js.map +1 -0
  9. package/dist/course-append-only.d.ts +15 -0
  10. package/dist/course-append-only.d.ts.map +1 -0
  11. package/dist/course-authoring-contracts.d.ts +464 -0
  12. package/dist/course-authoring-contracts.d.ts.map +1 -0
  13. package/dist/course-authoring-licence.d.ts +15 -0
  14. package/dist/course-authoring-licence.d.ts.map +1 -0
  15. package/dist/course-authoring-models.d.ts +291 -0
  16. package/dist/course-authoring-models.d.ts.map +1 -0
  17. package/dist/course-authoring-service.d.ts +244 -0
  18. package/dist/course-authoring-service.d.ts.map +1 -0
  19. package/dist/course-delegation.d.ts +26 -0
  20. package/dist/course-delegation.d.ts.map +1 -0
  21. package/dist/course-generation-contracts.d.ts +150 -0
  22. package/dist/course-generation-contracts.d.ts.map +1 -0
  23. package/dist/course-generation-models.d.ts +94 -0
  24. package/dist/course-generation-models.d.ts.map +1 -0
  25. package/dist/course-generation-output.d.ts +31 -0
  26. package/dist/course-generation-output.d.ts.map +1 -0
  27. package/dist/course-generation-proposal-generator.d.ts +94 -0
  28. package/dist/course-generation-proposal-generator.d.ts.map +1 -0
  29. package/dist/course-generation-review-service.d.ts +149 -0
  30. package/dist/course-generation-review-service.d.ts.map +1 -0
  31. package/dist/course-release-scope.d.ts +37 -0
  32. package/dist/course-release-scope.d.ts.map +1 -0
  33. package/dist/course-review-contracts.d.ts +127 -0
  34. package/dist/course-review-contracts.d.ts.map +1 -0
  35. package/dist/course-review-digest.d.ts +4 -0
  36. package/dist/course-review-digest.d.ts.map +1 -0
  37. package/dist/course-review-evaluation.d.ts +63 -0
  38. package/dist/course-review-evaluation.d.ts.map +1 -0
  39. package/dist/course-review-gate.d.ts +15 -0
  40. package/dist/course-review-gate.d.ts.map +1 -0
  41. package/dist/course-review-models.d.ts +96 -0
  42. package/dist/course-review-models.d.ts.map +1 -0
  43. package/dist/group-sharing-contracts.d.ts +5 -0
  44. package/dist/group-sharing-contracts.d.ts.map +1 -1
  45. package/dist/group-sharing-policy.d.ts.map +1 -1
  46. package/dist/group-sharing-reader.d.ts.map +1 -1
  47. package/dist/index.d.ts +27 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +5658 -116
  50. package/dist/index.js.map +1 -1
  51. package/dist/ingestion.js +1 -1
  52. package/dist/learner-plan-service.d.ts.map +1 -1
  53. package/dist/learner-service.d.ts +81 -7
  54. package/dist/learner-service.d.ts.map +1 -1
  55. package/dist/learners.d.ts +6 -0
  56. package/dist/learners.d.ts.map +1 -1
  57. package/dist/manifest.json +14304 -2177
  58. package/dist/question-authoring-service.d.ts +125 -0
  59. package/dist/question-authoring-service.d.ts.map +1 -0
  60. package/dist/question-content.d.ts +25 -0
  61. package/dist/question-content.d.ts.map +1 -0
  62. package/dist/question-contracts.d.ts +240 -0
  63. package/dist/question-contracts.d.ts.map +1 -0
  64. package/dist/question-models.d.ts +124 -0
  65. package/dist/question-models.d.ts.map +1 -0
  66. package/dist/question-render.d.ts +20 -0
  67. package/dist/question-render.d.ts.map +1 -0
  68. package/dist/question-response-contracts.d.ts +54 -0
  69. package/dist/question-response-contracts.d.ts.map +1 -0
  70. package/dist/question-response-service.d.ts +63 -0
  71. package/dist/question-response-service.d.ts.map +1 -0
  72. package/dist/question-rubric.d.ts +23 -0
  73. package/dist/question-rubric.d.ts.map +1 -0
  74. package/dist/smrt-knowledge.json +5410 -910
  75. package/dist/submission-service.d.ts.map +1 -1
  76. package/dist/submissions.d.ts +5 -0
  77. package/dist/submissions.d.ts.map +1 -1
  78. package/dist/workbook-contracts.d.ts +6 -0
  79. package/dist/workbook-contracts.d.ts.map +1 -1
  80. package/dist/workbook-models.d.ts.map +1 -1
  81. package/package.json +8 -8
  82. package/dist/chunks/workbook-photo-service-C6mbUUp6.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ import type { DatabaseInterface } from '@happyvertical/sql';
2
+ import { type LearnerRequest, LearnerService } from './learner-service.js';
3
+ import { type LearnerLessonView, type QuestionAssistance } from './question-contracts.js';
4
+ import { type LessonQuestionResponses, type QuestionResponseContent, type QuestionResponseView } from './question-response-contracts.js';
5
+ type LessonRequest = LearnerRequest & {
6
+ enrollmentId: string;
7
+ lessonId: string;
8
+ };
9
+ export type RecordQuestionResponseRequest = LessonRequest & {
10
+ questionRevisionId: string;
11
+ requestKey: string;
12
+ response: QuestionResponseContent;
13
+ /** Learners record online responses; printable/interactive need their own path. */
14
+ completionMode?: 'online';
15
+ assistance?: QuestionAssistance;
16
+ /** Names the response this one corrects; omit for a new attempt. */
17
+ correctsResponseId?: string;
18
+ };
19
+ export type GuardianCorrectionRequest = LessonRequest & {
20
+ questionRevisionId: string;
21
+ requestKey: string;
22
+ correctsResponseId: string;
23
+ /** Omit to record assistance only: the corrected response's answer is kept. */
24
+ response?: QuestionResponseContent;
25
+ assistance?: QuestionAssistance;
26
+ };
27
+ /**
28
+ * Guarded write path for learner question responses (SMRT #4515). Extends the
29
+ * learner boundary: the actor must be the learner (own enrollment) to record,
30
+ * or the authorized guardian to review/correct; the question revision must be in
31
+ * the enrollment's effective lesson set. Rows are append-only; question
32
+ * revisions are never written.
33
+ */
34
+ export declare class QuestionResponseService extends LearnerService {
35
+ protected createTransactionService(db: DatabaseInterface): this;
36
+ /** The learner records an online attempt, or corrects their own response. */
37
+ recordResponse(request: RecordQuestionResponseRequest): Promise<QuestionResponseView>;
38
+ /** A guardian appends a correction and/or assistance note; never overwrites. */
39
+ recordGuardianCorrection(request: GuardianCorrectionRequest): Promise<QuestionResponseView>;
40
+ /**
41
+ * The lesson's questions and recorded responses. The audience follows the
42
+ * actor: the learner gets the keyless bundle, an authorized guardian the
43
+ * keyed one. It is never a request choice.
44
+ */
45
+ readLessonResponses(request: LessonRequest): Promise<LessonQuestionResponses>;
46
+ /**
47
+ * One effective lesson for rendering, learner-safe. The audience is the same
48
+ * for the learner and an authorized guardian (`education.learner.read`, own or
49
+ * guardian relationship): the keyless bundle and an allowlisted lesson, never
50
+ * answer keys, rubrics, provenance, materials, source locators or the body of
51
+ * a personal-use-copy lesson. Keys are read through `QuestionAuthoringService.
52
+ * readReleasedLesson` (`read-draft`). A lesson outside the enrollment's
53
+ * effective set is a `QuestionResponseScopeError`.
54
+ */
55
+ readReleasedLesson(request: LessonRequest): Promise<LearnerLessonView>;
56
+ private view;
57
+ /** Effective lesson row to its immutable lesson revision's ordered question refs. */
58
+ private lessonQuestions;
59
+ private revisionRow;
60
+ private write;
61
+ }
62
+ export {};
63
+ //# sourceMappingURL=question-response-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-response-service.d.ts","sourceRoot":"","sources":["../src/question-response-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAI5D,OAAO,EAEL,KAAK,cAAc,EACnB,cAAc,EACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,KAAK,iBAAiB,EAItB,KAAK,kBAAkB,EAOxB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAI5B,KAAK,oBAAoB,EAC1B,MAAM,kCAAkC,CAAC;AAqH1C,KAAK,aAAa,GAAG,cAAc,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,MAAM,MAAM,6BAA6B,GAAG,aAAa,GAAG;IAC1D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,mFAAmF;IACnF,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG,aAAa,GAAG;IACtD,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,uBAAwB,SAAQ,cAAc;cACtC,wBAAwB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAQxE,6EAA6E;IACvE,cAAc,CAClB,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAIhC,gFAAgF;IAC1E,wBAAwB,CAC5B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC;IAIhC;;;;OAIG;IACG,mBAAmB,CACvB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,uBAAuB,CAAC;IA2DnC;;;;;;;;OAQG;IACG,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA0C5E,OAAO,CAAC,IAAI;IAuBZ,qFAAqF;YACvE,eAAe;YA6Cf,WAAW;YAYX,KAAK;CA0IpB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Pure rubric/answer-key shapes shared by the question models, the authoring
3
+ * service and `Grade`. Importing nothing keeps `submissions.ts` cycle-free.
4
+ */
5
+ export interface QuestionRubricCriterion {
6
+ id: string;
7
+ label: string;
8
+ /** Positive maximum points for this criterion. */
9
+ maxPoints: number;
10
+ }
11
+ export interface QuestionRubric {
12
+ criteria: QuestionRubricCriterion[];
13
+ }
14
+ /** Returns a normalized rubric or throws `Error` naming the first problem. */
15
+ export declare function parseQuestionRubric(value: unknown): QuestionRubric;
16
+ /**
17
+ * Validates `Grade.rubricResults` against the exact revision's rubric. A value
18
+ * is a finite number or `{ points: number }`, never above the criterion's
19
+ * maximum. Empty results stay empty (unscored is never zero); results against a
20
+ * revision without a rubric are rejected.
21
+ */
22
+ export declare function validateRubricResults(rubricJson: string | null | undefined, results: Record<string, unknown>): void;
23
+ //# sourceMappingURL=question-rubric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-rubric.d.ts","sourceRoot":"","sources":["../src/question-rubric.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;CACrC;AAID,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAuBlE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI,CAqBN"}