@timeback/sdk 0.1.9 → 0.1.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 (147) hide show
  1. package/dist/chunk-3mqpr9vx.js +2 -0
  2. package/dist/chunk-92nnwa7t.js +2 -0
  3. package/dist/{chunk-agpf1x3g.js → chunk-af3xwwsv.js} +1 -1
  4. package/dist/{chunk-07j8zre9.js → chunk-b8649tw4.js} +1 -1
  5. package/dist/{chunk-63afdp3y.js → chunk-bd09q1fw.js} +6 -6
  6. package/dist/chunk-js665z11.js +1 -0
  7. package/dist/chunk-nsr7a2dv.js +2 -0
  8. package/dist/chunk-sgcwg4j6.js +1 -0
  9. package/dist/{chunk-9se82640.js → chunk-txwjkpfz.js} +1 -1
  10. package/dist/client/adapters/react/hooks/types.d.ts +2 -29
  11. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
  12. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
  13. package/dist/client/adapters/react/index.js +2 -2
  14. package/dist/client/adapters/solid/types.d.ts +2 -29
  15. package/dist/client/adapters/solid/types.d.ts.map +1 -1
  16. package/dist/client/adapters/solid/types.ts +2 -18
  17. package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -1
  18. package/dist/client/adapters/svelte/stores/client.ts +2 -9
  19. package/dist/client/adapters/svelte/stores/profile.d.ts +1 -1
  20. package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -1
  21. package/dist/client/adapters/svelte/stores/profile.ts +4 -11
  22. package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -1
  23. package/dist/client/adapters/svelte/stores/verification.ts +1 -10
  24. package/dist/client/adapters/svelte/types.d.ts +1 -29
  25. package/dist/client/adapters/svelte/types.d.ts.map +1 -1
  26. package/dist/client/adapters/vue/provider.d.ts.map +1 -1
  27. package/dist/client/adapters/vue/provider.ts +4 -11
  28. package/dist/client/adapters/vue/types.d.ts +2 -29
  29. package/dist/client/adapters/vue/types.d.ts.map +1 -1
  30. package/dist/client/adapters/vue/types.ts +2 -18
  31. package/dist/client/auth/types.d.ts +1 -1
  32. package/dist/client/index.d.ts +1 -1
  33. package/dist/client/lib/activity/activity.class.d.ts +130 -22
  34. package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
  35. package/dist/client/lib/activity/transport.d.ts +15 -0
  36. package/dist/client/lib/activity/transport.d.ts.map +1 -0
  37. package/dist/client/lib/activity/types.d.ts +53 -0
  38. package/dist/client/lib/activity/types.d.ts.map +1 -0
  39. package/dist/client/lib/utils.d.ts +18 -0
  40. package/dist/client/lib/utils.d.ts.map +1 -1
  41. package/dist/client/lib/utils.ts +109 -0
  42. package/dist/client/namespaces/activity.d.ts +45 -6
  43. package/dist/client/namespaces/activity.d.ts.map +1 -1
  44. package/dist/client/timeback-client.class.d.ts +7 -1
  45. package/dist/client/timeback-client.class.d.ts.map +1 -1
  46. package/dist/client.d.ts +1 -1
  47. package/dist/client.js +1 -1
  48. package/dist/edge.js +1 -1
  49. package/dist/identity.js +1 -1
  50. package/dist/index.d.ts +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +22 -22
  53. package/dist/server/adapters/express.d.ts.map +1 -1
  54. package/dist/server/adapters/express.js +1 -1
  55. package/dist/server/adapters/native.d.ts.map +1 -1
  56. package/dist/server/adapters/native.js +1 -1
  57. package/dist/server/adapters/nextjs.js +1 -1
  58. package/dist/server/adapters/nuxt.d.ts.map +1 -1
  59. package/dist/server/adapters/nuxt.js +1 -1
  60. package/dist/server/adapters/solid-start.d.ts.map +1 -1
  61. package/dist/server/adapters/solid-start.js +1 -1
  62. package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
  63. package/dist/server/adapters/svelte-kit.js +1 -1
  64. package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
  65. package/dist/server/adapters/tanstack-start.js +1 -1
  66. package/dist/server/adapters/utils.d.ts +1 -1
  67. package/dist/server/adapters/utils.d.ts.map +1 -1
  68. package/dist/server/handlers/activity/caliper.d.ts +50 -14
  69. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  70. package/dist/server/handlers/activity/heartbeat-handler.d.ts +15 -0
  71. package/dist/server/handlers/activity/heartbeat-handler.d.ts.map +1 -0
  72. package/dist/server/handlers/activity/index.d.ts +5 -3
  73. package/dist/server/handlers/activity/index.d.ts.map +1 -1
  74. package/dist/server/handlers/activity/progress.d.ts +2 -2
  75. package/dist/server/handlers/activity/progress.d.ts.map +1 -1
  76. package/dist/server/handlers/activity/schema.d.ts +40 -6
  77. package/dist/server/handlers/activity/schema.d.ts.map +1 -1
  78. package/dist/server/handlers/activity/submit-handler.d.ts +29 -0
  79. package/dist/server/handlers/activity/submit-handler.d.ts.map +1 -0
  80. package/dist/server/handlers/activity/submit.d.ts +44 -0
  81. package/dist/server/handlers/activity/submit.d.ts.map +1 -0
  82. package/dist/server/handlers/activity/types.d.ts +126 -5
  83. package/dist/server/handlers/activity/types.d.ts.map +1 -1
  84. package/dist/server/handlers/identity/handler.d.ts +23 -4
  85. package/dist/server/handlers/identity/handler.d.ts.map +1 -1
  86. package/dist/server/handlers/identity/index.d.ts +2 -2
  87. package/dist/server/handlers/identity/index.d.ts.map +1 -1
  88. package/dist/server/handlers/identity/oidc.d.ts.map +1 -1
  89. package/dist/server/handlers/identity/types.d.ts +0 -6
  90. package/dist/server/handlers/identity/types.d.ts.map +1 -1
  91. package/dist/server/handlers/index.d.ts +3 -3
  92. package/dist/server/handlers/index.d.ts.map +1 -1
  93. package/dist/server/handlers/user/handler.d.ts.map +1 -1
  94. package/dist/server/handlers/user/profile.d.ts.map +1 -1
  95. package/dist/server/handlers/user/types.d.ts +3 -0
  96. package/dist/server/handlers/user/types.d.ts.map +1 -1
  97. package/dist/server/handlers/user/verify.d.ts.map +1 -1
  98. package/dist/server/index.d.ts +1 -1
  99. package/dist/server/index.d.ts.map +1 -1
  100. package/dist/server/lib/hooks.d.ts +20 -0
  101. package/dist/server/lib/hooks.d.ts.map +1 -0
  102. package/dist/server/lib/index.d.ts +4 -2
  103. package/dist/server/lib/index.d.ts.map +1 -1
  104. package/dist/server/lib/logger.d.ts +36 -9
  105. package/dist/server/lib/logger.d.ts.map +1 -1
  106. package/dist/server/lib/resolve.d.ts +1 -1
  107. package/dist/server/lib/resolve.d.ts.map +1 -1
  108. package/dist/server/lib/utils.d.ts +19 -1
  109. package/dist/server/lib/utils.d.ts.map +1 -1
  110. package/dist/server/lib/validation.d.ts +55 -0
  111. package/dist/server/lib/validation.d.ts.map +1 -0
  112. package/dist/server/namespaces/activity/index.d.ts +8 -0
  113. package/dist/server/namespaces/activity/index.d.ts.map +1 -0
  114. package/dist/server/namespaces/activity/record.d.ts +49 -0
  115. package/dist/server/namespaces/activity/record.d.ts.map +1 -0
  116. package/dist/server/namespaces/activity/schema.d.ts +50 -0
  117. package/dist/server/namespaces/activity/schema.d.ts.map +1 -0
  118. package/dist/server/namespaces/user/get-profile.d.ts +32 -0
  119. package/dist/server/namespaces/user/get-profile.d.ts.map +1 -0
  120. package/dist/server/namespaces/user/index.d.ts +8 -0
  121. package/dist/server/namespaces/user/index.d.ts.map +1 -0
  122. package/dist/server/namespaces/user/verify.d.ts +28 -0
  123. package/dist/server/namespaces/user/verify.d.ts.map +1 -0
  124. package/dist/server/timeback.d.ts +1 -1
  125. package/dist/server/timeback.d.ts.map +1 -1
  126. package/dist/server/types.d.ts +394 -12
  127. package/dist/server/types.d.ts.map +1 -1
  128. package/dist/shared/constants.d.ts +7 -0
  129. package/dist/shared/constants.d.ts.map +1 -1
  130. package/dist/shared/constants.ts +51 -0
  131. package/dist/shared/index.d.ts +9 -0
  132. package/dist/shared/index.d.ts.map +1 -0
  133. package/dist/shared/schemas.d.ts +57 -0
  134. package/dist/shared/schemas.d.ts.map +1 -0
  135. package/dist/shared/types.d.ts +263 -10
  136. package/dist/shared/types.d.ts.map +1 -1
  137. package/dist/shared/types.ts +620 -0
  138. package/package.json +2 -2
  139. package/dist/chunk-5171mkp2.js +0 -2
  140. package/dist/chunk-8gg8n8v9.js +0 -2
  141. package/dist/chunk-hnf0tart.js +0 -2
  142. package/dist/chunk-qr0bbnsr.js +0 -1
  143. package/dist/chunk-x9gvef7q.js +0 -1
  144. package/dist/server/handlers/activity/handler.d.ts +0 -32
  145. package/dist/server/handlers/activity/handler.d.ts.map +0 -1
  146. package/dist/shared/xp-calculator.d.ts +0 -25
  147. package/dist/shared/xp-calculator.d.ts.map +0 -1
@@ -1 +0,0 @@
1
- import{z as H}from"zod/v4";import{z as _}from"zod/v4";var jZ=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/,x=_.string().min(1).regex(jZ,"must be a valid ISO 8601 datetime"),b=_.string().min(1).regex(/^\d{4}-\d{2}-\d{2}$/,"must be a valid ISO 8601 date (YYYY-MM-DD)"),L=_.enum(["Reading","Language","Vocabulary","Social Studies","Writing","Science","FastMath","Math","None","Other"]).meta({id:"TimebackSubject",description:"Subject area"}),F=_.union([_.literal(-1),_.literal(0),_.literal(1),_.literal(2),_.literal(3),_.literal(4),_.literal(5),_.literal(6),_.literal(7),_.literal(8),_.literal(9),_.literal(10),_.literal(11),_.literal(12),_.literal(13)]).meta({id:"TimebackGrade",description:"Grade level (-1 = Pre-K, 0 = K, 1-12 = grades, 13 = AP)"}),l=_.enum(["exempt","fully graded","not submitted","partially graded","submitted"]),T=_.enum(["department","school","district","local","state","national"]),C=_.enum(["administrator","aide","guardian","parent","proctor","relative","student","teacher"]),R=_.enum(["administrator","proctor","student","teacher"]),u=_.enum(["qti","text","audio","video","interactive","visual","course-material","assessment-bank"]),d=_.enum(["qti-test","qti-question","qti-stimulus","qti-test-bank"]),N=_.enum(["unit","course","resource-collection"]),c=_.enum(["choice","order","associate","match","hotspot","hottext","select-point","graphic-order","graphic-associate","graphic-gap-match","text-entry","extended-text","inline-choice","upload","slider","drawing","media","custom"]),p=_.enum(["easy","medium","hard"]),E=_.array(_.object({source:_.string(),learningObjectiveIds:_.array(_.string())})),y=_.object({consecutive_failures:_.number().int().min(1).optional(),stagnation_limit:_.number().int().min(1).optional()}).optional(),Wq=_.enum(["powerpath-100","quiz","test-out","placement","unit-test","alpha-read-article"]).nullable(),Xq=_.object({imsx_codeMajor:_.enum(["failure","success"]),imsx_severity:_.enum(["error","warning","status"]),imsx_description:_.string(),imsx_CodeMinor:_.object({imsx_codeMinorField:_.array(_.object({imsx_codeMinorFieldName:_.string(),imsx_codeMinorFieldValue:_.string()}))}).optional()});var PZ=H.object({staging:H.string().meta({description:"Course ID in staging environment"}).optional(),production:H.string().meta({description:"Course ID in production environment"}).optional()}).meta({id:"CourseIds",description:"Environment-specific course IDs (populated by sync)"}),GZ=H.enum(["base","hole-filling","optional"]).meta({id:"CourseType",description:"Course classification type"}),BZ=H.enum(["draft","testing","published","deactivated"]).meta({id:"PublishStatus",description:"Course publication status"}),AZ=H.object({dailyXp:H.number().int().positive().meta({description:"Target XP to earn per day"}).optional(),dailyLessons:H.number().int().positive().meta({description:"Target lessons to complete per day"}).optional(),dailyActiveMinutes:H.number().int().positive().meta({description:"Target active learning minutes per day"}).optional(),dailyAccuracy:H.number().int().min(0).max(100).meta({description:"Target accuracy percentage (0-100)"}).optional(),dailyMasteredUnits:H.number().int().positive().meta({description:"Target units to master per day"}).optional()}).meta({id:"CourseGoals",description:"Daily learning goals for a course"}),hZ=H.object({totalXp:H.number().int().positive().meta({description:"Total XP available in the course"}).optional(),totalLessons:H.number().int().positive().meta({description:"Total number of lessons/activities"}).optional(),totalGrades:H.number().int().positive().meta({description:"Total grade levels covered"}).optional()}).meta({id:"CourseMetrics",description:"Aggregate metrics for a course"}),g=H.object({courseType:GZ.optional(),isSupplemental:H.boolean().meta({description:"Whether this is supplemental to a base course"}).optional(),isCustom:H.boolean().meta({description:"Whether this is a custom course for an individual student"}).optional(),publishStatus:BZ.optional(),contactEmail:H.email().meta({description:"Contact email for course issues"}).optional(),primaryApp:H.string().meta({description:"Primary application identifier"}).optional(),goals:AZ.optional(),metrics:hZ.optional()}).meta({id:"CourseMetadata",description:"Course metadata (matches API metadata object)"}),m=H.object({courseCode:H.string().meta({description:"Course code (e.g., 'MATH101')"}).optional(),level:H.string().meta({description:"Course level (e.g., 'AP', 'Honors')"}).optional(),metadata:g.optional()}).meta({id:"CourseDefaults",description:"Default properties that apply to all courses unless overridden"}),s=H.object({level:H.string().meta({description:"Course level for this environment"}).optional(),sensor:H.url().meta({description:"Caliper sensor endpoint URL for this environment"}).optional(),launchUrl:H.url().meta({description:"LTI launch URL for this environment"}).optional(),metadata:g.optional()}).meta({id:"CourseEnvOverrides",description:"Environment-specific course overrides (non-identity fields)"}),OZ=H.object({staging:s.meta({description:"Overrides for staging environment"}).optional(),production:s.meta({description:"Overrides for production environment"}).optional()}).meta({id:"CourseOverrides",description:"Per-environment course overrides"}),vZ=m.extend({subject:L.meta({description:"Subject area for this course"}),grade:F.meta({description:"Grade level (-1 = Pre-K, 0 = K, 1-12 = grades, 13 = AP)"}).optional(),ids:PZ.nullable().optional(),sensor:H.url().meta({description:"Caliper sensor endpoint URL for this course"}).optional(),launchUrl:H.url().meta({description:"LTI launch URL for this course"}).optional(),overrides:OZ.optional()}).meta({id:"CourseConfig",description:"Configuration for a single course. Must have either grade or courseCode (or both)."}),Hq=H.object({$schema:H.string().meta({description:"JSON Schema reference for editor support"}).optional(),name:H.string().min(1,"App name is required").meta({description:"Display name for your app"}),defaults:m.meta({description:"Default properties applied to all courses"}).optional(),courses:H.array(vZ).min(1,"At least one course is required").meta({description:"Courses available in this app"}),sensor:H.url().meta({description:"Default Caliper sensor endpoint URL for all courses"}).optional(),launchUrl:H.url().meta({description:"Default LTI launch URL for all courses"}).optional()}).meta({id:"TimebackConfig",title:"Timeback Config",description:"Configuration schema for timeback.config.json files"}).refine((U)=>{return U.courses.every((j)=>j.grade!==void 0||j.courseCode!==void 0)},{message:"Each course must have either a grade or a courseCode",path:["courses"]}).refine((U)=>{let v=U.courses.filter((h)=>h.grade!==void 0).map((h)=>`${h.subject}:${h.grade}`);return new Set(v).size===v.length},{message:"Duplicate (subject, grade) pair found; each must be unique",path:["courses"]}).refine((U)=>{let v=U.courses.filter((h)=>h.courseCode!==void 0).map((h)=>h.courseCode);return new Set(v).size===v.length},{message:"Duplicate courseCode found; each must be unique",path:["courses"]}).refine((U)=>{return U.courses.every((j)=>{if(j.sensor!==void 0||U.sensor!==void 0)return!0;return[j.launchUrl,U.launchUrl,j.overrides?.staging?.launchUrl,j.overrides?.production?.launchUrl].filter(Boolean).length>0})},{message:"Each course must have an effective sensor. Either set `sensor` explicitly (top-level or per-course), or provide a `launchUrl` so sensor can be derived from its origin.",path:["courses"]});import{z as K}from"zod/v4";var k=K.object({id:K.string(),type:K.literal("TimebackUser"),email:K.string()}),D=K.object({id:K.string(),type:K.literal("TimebackActivityContext"),subject:L,app:K.object({name:K.string()}),activity:K.object({id:K.string().optional(),name:K.string()}).strict().optional(),course:K.object({id:K.string().optional(),name:K.string()}).strict().optional(),process:K.boolean().optional()}),S=K.object({"@context":K.literal("http://purl.imsglobal.org/ctx/caliper/v1p2"),id:K.string(),type:K.string(),eventTime:x,profile:K.literal("TimebackProfile"),actor:k,action:K.string(),object:D,edApp:K.object({id:K.string(),name:K.string().optional()}).optional()}),o=K.object({type:K.enum(["totalQuestions","correctQuestions","xpEarned","masteredUnits"]),value:K.number()}),IZ=K.object({id:K.string(),type:K.literal("TimebackActivityMetricsCollection"),attempt:K.number().optional(),items:K.array(o),extensions:K.record(K.string(),K.unknown()).optional()}),CZ=S.extend({type:K.literal("ActivityEvent"),action:K.literal("Completed"),generated:IZ}),r=K.object({type:K.enum(["active","inactive","waste","unknown","anti-pattern"]),value:K.number(),subType:K.string().optional()}),kZ=K.object({id:K.string(),type:K.literal("TimebackTimeSpentMetricsCollection"),items:K.array(r)}),DZ=S.extend({type:K.literal("TimeSpentEvent"),action:K.literal("SpentTime"),generated:kZ}),Fq=K.object({actor:k,object:D,metrics:K.array(o).min(1,"metrics must contain at least one metric"),eventTime:x.optional(),metricsId:K.string().optional(),id:K.string().optional(),extensions:K.record(K.string(),K.unknown()).optional(),attempt:K.number().int().min(1).optional(),generatedExtensions:K.object({pctCompleteApp:K.number().optional()}).loose().optional()}).strict(),Lq=K.object({actor:k,object:D,metrics:K.array(r).min(1,"metrics must contain at least one metric"),eventTime:x.optional(),metricsId:K.string().optional(),id:K.string().optional(),extensions:K.record(K.string(),K.unknown()).optional()}).strict(),QZ=K.union([CZ,DZ]),Uq=K.object({sensor:K.string(),sendTime:x,dataVersion:K.literal("http://purl.imsglobal.org/ctx/caliper/v1p2"),data:K.array(QZ)}),MZ=K.enum(["AnnotationProfile","AssessmentProfile","ToolUseProfile","GeneralProfile","FeedbackProfile","MediaProfile","SurveyProfile","ResourceManagementProfile","ForumProfile","AssignableProfile","GradingProfile","ReadingProfile","SessionProfile","SearchProfile","ToolLaunchProfile","TimebackProfile"]),B=K.union([K.string(),K.record(K.string(),K.unknown())]),fZ=K.object({id:K.string(),type:K.string(),extensions:K.object({email:K.email()}).loose()}).strict(),a=K.object({"@context":K.string().optional(),id:K.string(),type:K.string(),actor:K.union([K.string(),fZ,k]),action:K.string(),object:B,eventTime:x,profile:MZ,edApp:B.optional(),generated:B.optional(),target:B.optional(),referrer:B.optional(),group:B.optional(),membership:B.optional(),session:B.optional(),federatedSession:B.optional(),extensions:K.record(K.string(),K.unknown()).optional()}).strict(),jq=K.object({sensor:K.string().min(1,"sensor must be a non-empty string"),sendTime:x,dataVersion:K.literal("http://purl.imsglobal.org/ctx/caliper/v1p2"),data:K.array(a).min(1,"data must contain at least one event")}),Pq=K.object({sensor:K.string().min(1,"sensor must be a non-empty string"),events:K.array(a).min(1,"events must contain at least one event")}),Gq=K.object({limit:K.number().int().positive().optional(),offset:K.number().int().min(0).optional(),sensor:K.string().min(1).optional(),startDate:x.optional(),endDate:x.optional(),actorId:K.string().min(1).optional(),actorEmail:K.email().optional()}).strict();import{z as Y}from"zod/v4";var G=x,Oq=Y.object({id:Y.string(),role:Y.string(),beginDate:G.nullable(),endDate:G.nullable(),metadata:Y.object({goals:Y.object({dailyXp:Y.number().optional()}).optional(),metrics:Y.object({totalXp:Y.number().optional(),totalLessons:Y.number().optional()}).optional()}).optional(),course:Y.object({id:Y.string(),title:Y.string(),subjects:Y.array(Y.string()).nullable(),grades:Y.array(Y.string()).nullable()}),school:Y.object({id:Y.string(),name:Y.string()})}),bZ=Y.object({activityMetrics:Y.object({xpEarned:Y.number(),totalQuestions:Y.number(),correctQuestions:Y.number(),masteredUnits:Y.number()}),timeSpentMetrics:Y.object({activeSeconds:Y.number(),inactiveSeconds:Y.number(),wasteSeconds:Y.number()}),apps:Y.array(Y.string())}),lZ=Y.record(Y.string(),Y.record(Y.string(),bZ)),vq=Y.object({message:Y.string(),enrollmentId:Y.string(),startDate:G,endDate:G,facts:lZ,factsByApp:Y.unknown()}),A=Y.string().trim().min(1),i=Y.object({email:Y.email().optional(),studentId:A.optional()}).superRefine((U,j)=>{if(!U.email&&!U.studentId)j.addIssue({code:Y.ZodIssueCode.custom,message:"must provide either email or studentId",path:["email"]}),j.addIssue({code:Y.ZodIssueCode.custom,message:"must provide either email or studentId",path:["studentId"]})}),Iq=Y.object({subject:A,grade:A,courseId:A,orgSourcedId:A.optional()});var Cq=Y.object({userId:A}),kq=Y.object({sourcedId:A.optional(),role:R.optional(),beginDate:G.optional(),metadata:Y.record(Y.string(),Y.unknown()).optional()}),Dq=Y.object({fields:Y.string().optional(),limit:Y.number().int().positive().optional(),offset:Y.number().int().nonnegative().optional(),sort:Y.string().optional(),orderBy:Y.enum(["asc","desc"]).optional(),filter:Y.string().optional(),search:Y.string().optional(),roles:Y.array(C).min(1),orgSourcedIds:Y.array(A).optional()}),Qq=i.extend({startDate:G,endDate:G,timezone:Y.string().optional()}),Mq=i.extend({weekDate:G,timezone:Y.string().optional()}),fq=Y.object({enrollmentId:A,startDate:G.optional(),endDate:G.optional(),timezone:Y.string().optional()});import{z as q}from"zod/v4";var X=q.string().min(1),V=q.enum(["active","tobedeleted"]),w=q.record(q.string(),q.unknown()).nullable().optional(),$=q.object({sourcedId:X,type:q.string().optional(),href:q.string().optional()}).strict(),P=q.union([b,x]),TZ=q.object({roleType:q.enum(["primary","secondary"]),role:C,org:$,userProfile:q.string().optional(),metadata:w,beginDate:P.optional(),endDate:P.optional()}).strict(),Rq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string"),status:V.optional(),enabledUser:q.boolean(),givenName:X.describe("givenName must be a non-empty string"),familyName:X.describe("familyName must be a non-empty string"),middleName:X.optional(),username:X.optional(),email:q.email().optional(),roles:q.array(TZ).min(1,"roles must include at least one role"),userIds:q.array(q.object({type:X,identifier:X}).strict()).optional(),agents:q.array($).optional(),grades:q.array(F).optional(),identifier:X.optional(),sms:X.optional(),phone:X.optional(),pronouns:X.optional(),password:X.optional(),metadata:w}).strict(),uq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string").optional(),status:V.optional(),title:X.describe("title must be a non-empty string"),org:$,courseCode:X.optional(),subjects:q.array(L).optional(),grades:q.array(F).optional(),level:X.optional(),metadata:w}).strict(),dq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string").optional(),status:V.optional(),title:X.describe("title must be a non-empty string"),terms:q.array($).min(1,"terms must have at least one item"),course:$,org:$,classCode:X.optional(),classType:q.enum(["homeroom","scheduled"]).optional(),location:X.optional(),grades:q.array(F).optional(),subjects:q.array(L).optional(),subjectCodes:q.array(X).optional(),periods:q.array(X).optional(),metadata:w}).strict(),n=q.enum(["true","false"]),Nq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string").optional(),status:V.optional(),user:$,class:$,school:$.optional(),role:C,primary:n.optional(),beginDate:P.optional(),endDate:P.optional(),metadata:w}).strict(),cq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),status:V,weight:q.number().nullable().optional(),metadata:w}).strict(),pq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),class:$,school:$,category:$,assignDate:P,dueDate:P,status:V,description:q.string().optional(),resultValueMin:q.number().nullable().optional(),resultValueMax:q.number().nullable().optional(),scoreScale:$.optional(),metadata:w}).strict(),Eq=q.object({sourcedId:X.optional(),lineItem:$,student:$,class:$.optional(),scoreDate:P,scoreStatus:q.enum(["exempt","fully graded","not submitted","partially graded","submitted"]),score:q.number().nullable().optional(),textScore:q.string().nullable().optional(),status:V,comment:q.string().nullable().optional(),metadata:w}).strict(),yq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),status:V.optional(),type:q.string().optional(),class:$.optional(),course:$.nullable().optional(),scoreScaleValue:q.array(q.object({itemValueLHS:X,itemValueRHS:X,value:q.string().optional(),description:q.string().optional()}).strict()).optional(),minScore:q.number().optional(),maxScore:q.number().optional(),metadata:w}).strict(),sq=q.object({sourcedId:X.optional(),status:V.optional(),dateLastModified:x.optional(),title:X.describe("title must be a non-empty string"),description:q.string().nullable().optional(),class:$.nullable().optional(),parentAssessmentLineItem:$.nullable().optional(),scoreScale:$.nullable().optional(),resultValueMin:q.number().nullable().optional(),resultValueMax:q.number().nullable().optional(),component:$.nullable().optional(),componentResource:$.nullable().optional(),learningObjectiveSet:q.array(q.object({source:q.string(),learningObjectiveIds:q.array(q.string())})).optional().nullable(),course:$.nullable().optional(),metadata:w}).strict(),RZ=q.object({learningObjectiveId:q.string(),score:q.number().optional(),textScore:q.string().optional()}),uZ=q.array(q.object({source:q.string(),learningObjectiveResults:q.array(RZ)})),gq=q.object({sourcedId:X.optional(),status:V.optional(),dateLastModified:x.optional(),metadata:w,assessmentLineItem:$,student:$,score:q.number().nullable().optional(),textScore:q.string().nullable().optional(),scoreDate:q.string().datetime(),scoreScale:$.nullable().optional(),scorePercentile:q.number().nullable().optional(),scoreStatus:q.enum(["exempt","fully graded","not submitted","partially graded","submitted"]),comment:q.string().nullable().optional(),learningObjectiveSet:uZ.nullable().optional(),inProgress:q.string().nullable().optional(),incomplete:q.string().nullable().optional(),late:q.string().nullable().optional(),missing:q.string().nullable().optional()}).strict(),mq=q.object({sourcedId:X.optional(),status:V.optional(),name:X.describe("name must be a non-empty string"),type:T,identifier:X.optional(),parent:$.optional(),metadata:w}).strict(),Sq=q.object({sourcedId:X.optional(),status:V.optional(),name:X.describe("name must be a non-empty string"),type:q.literal("school").optional(),identifier:X.optional(),parent:$.optional(),metadata:w}).strict(),oq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string"),status:V,title:X.describe("title must be a non-empty string"),startDate:P,endDate:P,type:q.enum(["gradingPeriod","semester","schoolYear","term"]),schoolYear:X.describe("schoolYear must be a non-empty string"),org:$,parent:$.optional(),children:q.array($).optional(),metadata:w}).strict(),rq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),courseComponent:$,resource:$,status:V,metadata:w}).strict(),aq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),course:$,status:V,metadata:w}).strict(),iq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string"),role:q.enum(["student","teacher"]),primary:n.optional(),beginDate:P.optional(),endDate:P.optional(),metadata:w}).strict(),nq=q.object({agentSourcedId:X.describe("agentSourcedId must be a non-empty string")}).strict(),eq=q.object({type:X.describe("type must be a non-empty string"),username:X.describe("username must be a non-empty string"),password:q.string().optional(),metadata:w}).strict(),zq=q.object({sourcedId:X.describe("sourcedId must be a non-empty string")}).loose(),O=q.object({type:u,subject:L.nullish(),grades:q.array(F).nullish(),language:q.string().nullish(),xp:q.number().nullish(),url:q.url().nullish(),keywords:q.array(q.string()).nullish(),learningObjectiveSet:E.nullish(),lessonType:q.string().nullish()}).passthrough(),dZ=O.extend({type:q.literal("qti"),subType:d,questionType:c.optional(),difficulty:p.optional()}),NZ=O.extend({type:q.literal("text"),format:q.string(),author:q.string().optional(),pageCount:q.number().optional()}),cZ=O.extend({type:q.literal("audio"),duration:q.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),format:q.string(),speaker:q.string().optional()}),pZ=O.extend({type:q.literal("video"),duration:q.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),captionsAvailable:q.boolean().optional(),format:q.string()}),EZ=O.extend({type:q.literal("interactive"),launchUrl:q.url().optional(),toolProvider:q.string().optional(),instructionalMethod:q.string().optional(),courseIdOnFail:q.string().nullable().optional(),fail_fast:y}),yZ=O.extend({type:q.literal("visual"),format:q.string(),resolution:q.string().optional()}),sZ=O.extend({type:q.literal("course-material"),subType:N,author:q.string().optional(),format:q.string(),instructionalMethod:q.string().optional()}),gZ=O.extend({type:q.literal("assessment-bank"),resources:q.array(q.string())}),mZ=q.discriminatedUnion("type",[dZ,NZ,cZ,pZ,EZ,yZ,sZ,gZ]),tq=q.object({sourcedId:X.optional(),title:X.describe("title must be a non-empty string"),vendorResourceId:X.describe("vendorResourceId must be a non-empty string"),roles:q.array(q.enum(["primary","secondary"])).optional(),importance:q.enum(["primary","secondary"]).optional(),vendorId:q.string().optional(),applicationId:q.string().optional(),status:V.optional(),metadata:mZ.nullable().optional()}).strict(),SZ=q.object({url:X.describe("courseStructure.url must be a non-empty string"),skillCode:X.describe("courseStructure.skillCode must be a non-empty string"),lessonCode:X.describe("courseStructure.lessonCode must be a non-empty string"),title:X.describe("courseStructure.title must be a non-empty string"),"unit-title":X.describe("courseStructure.unit-title must be a non-empty string"),status:X.describe("courseStructure.status must be a non-empty string"),xp:q.number()}).loose(),ZJ=q.object({course:q.object({sourcedId:X.describe("course.sourcedId must be a non-empty string").optional(),title:X.describe("course.title must be a non-empty string"),org:$,status:V,metadata:w}).strict(),courseStructure:q.record(q.string(),SZ)}).strict(),oZ=q.object({student:$}).loose(),qJ=q.array(oZ).min(1,"results must have at least one item");import{z as J}from"zod/v4";var W=J.string().trim().min(1),rZ=J.enum(["edulastic","mastery-track"]),aZ=J.enum(["powerpath-100","quiz","test-out","placement","unit-test","alpha-read-article"]),z=J.array(F),t=J.record(J.string(),J.unknown()).optional(),ZZ=J.object({courseId:W,lessonTitle:W.optional(),launchUrl:J.url().optional(),toolProvider:rZ,unitTitle:W.optional(),courseComponentSourcedId:W.optional(),vendorId:W.optional(),description:W.optional(),resourceMetadata:t.nullable().optional(),grades:z}),XJ=ZZ.extend({lessonType:J.literal("test-out"),xp:J.number()}),YJ=ZZ.extend({lessonType:J.literal("placement"),courseIdOnFail:W.optional(),xp:J.number().optional()});var e=J.object({courseId:W,lessonType:aZ,lessonTitle:W.optional(),unitTitle:W.optional(),courseComponentSourcedId:W.optional(),resourceMetadata:t.nullable().optional(),xp:J.number().optional(),grades:z.optional(),courseIdOnFail:W.optional()}),_J=J.union([e.extend({testType:J.literal("qti"),qti:J.object({url:J.url(),title:W.optional(),metadata:J.record(J.string(),J.unknown()).optional()})}),e.extend({testType:J.literal("assessment-bank"),assessmentBank:J.object({resources:J.array(J.object({url:J.url(),title:W.optional(),metadata:J.record(J.string(),J.unknown()).optional()}))})})]),$J=J.object({student:W,lesson:W}),HJ=J.object({student:W,lesson:W}),wJ=J.object({courseId:W,userId:W,classId:W.optional()}),I=J.object({type:J.enum(["component","resource"]),id:W}),iZ=J.union([J.object({type:J.literal("set-skipped"),payload:J.object({target:I,value:J.boolean()})}),J.object({type:J.literal("add-custom-resource"),payload:J.object({resource_id:W,parent_component_id:W,skipped:J.boolean().optional()})}),J.object({type:J.literal("move-item-before"),payload:J.object({target:I,reference_id:W})}),J.object({type:J.literal("move-item-after"),payload:J.object({target:I,reference_id:W})}),J.object({type:J.literal("move-item-to-start"),payload:J.object({target:I})}),J.object({type:J.literal("move-item-to-end"),payload:J.object({target:I})}),J.object({type:J.literal("change-item-parent"),payload:J.object({target:I,new_parent_id:W,position:J.enum(["start","end"]).optional()})})]),VJ=J.object({operation:J.array(iZ),reason:W.optional()}),xJ=J.object({studentId:W,componentResourceId:W,result:J.object({status:J.enum(["active","tobedeleted"]),metadata:J.record(J.string(),J.unknown()).optional(),score:J.number().optional(),textScore:W.optional(),scoreDate:W,scorePercentile:J.number().optional(),scoreStatus:l,comment:W.optional(),learningObjectiveSet:J.array(J.object({source:W,learningObjectiveResults:J.array(J.object({learningObjectiveId:W,score:J.number().optional(),textScore:W.optional()}))})).optional(),inProgress:W.optional(),incomplete:W.optional(),late:W.optional(),missing:W.optional()})}),FJ=J.object({student:W,lesson:W,applicationName:W.optional(),testId:W.optional(),skipCourseEnrollment:J.boolean().optional()}),LJ=J.object({student:W,subject:L}),UJ=J.object({student:W,lesson:W}),jJ=J.object({userId:W}),PJ=J.object({userId:W,subject:J.enum(["Math","Reading","Language","Science"])}),GJ=J.object({student:W,subject:L,grade:F,testName:W.optional()}),BJ=J.object({testName:W}),nZ=J.object({student:W,subject:L,grade:F,testName:W.optional()}),AJ=J.object({items:J.array(nZ)}),hJ=J.object({spreadsheetUrl:J.url(),sheet:W}),OJ=J.object({student:W,status:J.enum(["assigned","in_progress","completed","failed","expired","cancelled"]).optional(),subject:W.optional(),grade:F.optional(),limit:J.number().int().positive().max(3000).optional(),offset:J.number().int().nonnegative().optional()}),vJ=J.object({student:W.optional(),status:J.enum(["assigned","in_progress","completed","failed","expired","cancelled"]).optional(),subject:W.optional(),grade:F.optional(),limit:J.number().int().positive().max(3000).optional(),offset:J.number().int().nonnegative().optional()}),IJ=J.object({student:W,question:W,response:J.union([W,J.array(W)]).optional(),responses:J.record(J.string(),J.union([W,J.array(W)])).optional(),lesson:W}),CJ=J.object({student:W,lesson:W,attempt:J.number().int().positive().optional()}),kJ=J.object({student:W,lesson:W}),DJ=J.object({student:W,lesson:W}),QJ=J.object({student:W,lesson:W.optional(),finalized:J.boolean().optional(),toolProvider:W.optional(),attempt:J.number().int().positive().optional()}),MJ=J.object({student:W,lesson:W,applicationName:W.optional()}),fJ=J.object({student:W,subject:L}),bJ=J.object({status:J.enum(["active","tobedeleted"]).optional()});import{z as Z}from"zod/v4";var JZ=Z.enum(["choice","text-entry","extended-text","inline-choice","match","order","associate","select-point","graphic-order","graphic-associate","graphic-gap-match","hotspot","hottext","slider","drawing","media","upload"]),Q=Z.enum(["single","multiple","ordered","record"]),M=Z.enum(["identifier","boolean","integer","float","string","point","pair","directedPair","duration","file","uri"]),eZ=Z.enum(["easy","medium","hard"]),zZ=Z.enum(["linear","nonlinear"]),tZ=Z.enum(["individual","simultaneous"]),f=Z.enum(["show","hide"]),KZ=Z.enum(["test","item","stimulus"]),uJ=Z.enum(["QUESTION","LESSON"]),Zq=Z.object({value:Z.array(Z.string())}).strict(),WZ=Z.object({identifier:Z.string().min(1),cardinality:Q,baseType:M.optional(),correctResponse:Zq}).strict(),XZ=Z.object({identifier:Z.string().min(1),cardinality:Q,baseType:M.optional()}).strict(),YZ=Z.object({identifier:Z.string().min(1),cardinality:Q.optional(),baseType:M,normalMaximum:Z.number().optional(),normalMinimum:Z.number().optional(),defaultValue:Z.object({value:Z.unknown().optional()}).strict().optional()}).strict(),qq=Z.object({outcomeIdentifier:Z.string().min(1),variableIdentifier:Z.string().min(1)}).strict(),_Z=Z.object({templateType:Z.enum(["match_correct","map_response"]),responseDeclarationIdentifier:Z.string().min(1),outcomeIdentifier:Z.string().min(1),correctResponseIdentifier:Z.string().min(1),incorrectResponseIdentifier:Z.string().min(1),inlineFeedback:qq.optional()}).strict(),Jq=Z.object({source:Z.string().min(1),learningObjectiveIds:Z.array(Z.string())}).strict(),$Z=Z.object({subject:Z.string().optional(),grade:F.optional(),difficulty:eZ.optional(),learningObjectiveSet:Z.array(Jq).optional()}).strict(),HZ=Z.object({outcomeIdentifier:Z.string().min(1),identifier:Z.string().min(1),showHide:f,content:Z.string(),title:Z.string()}).strict(),wZ=Z.object({outcomeIdentifier:Z.string().min(1),identifier:Z.string().min(1),showHide:f,content:Z.string(),class:Z.array(Z.string())}).strict(),VZ=Z.object({outcomeIdentifier:Z.string().min(1),identifier:Z.string().min(1),showHide:f,content:Z.string(),class:Z.array(Z.string())}).strict(),xZ=Z.object({href:Z.string().min(1),type:Z.string().min(1)}).strict(),FZ=Z.object({id:Z.string().min(1),support:Z.string(),content:Z.string()}).strict(),dJ=Z.object({page:Z.number().int().positive().optional(),limit:Z.number().int().positive().optional(),sort:Z.string().optional(),order:Z.enum(["asc","desc"]).optional()}).strict(),NJ=Z.object({identifier:Z.string().min(1),title:Z.string().min(1),type:JZ,qtiVersion:Z.string().optional(),timeDependent:Z.boolean().optional(),adaptive:Z.boolean().optional(),responseDeclarations:Z.array(WZ).optional(),outcomeDeclarations:Z.array(XZ).optional(),responseProcessing:_Z.optional(),metadata:$Z.optional(),modalFeedback:Z.array(HZ).optional(),feedbackInline:Z.array(wZ).optional(),feedbackBlock:Z.array(VZ).optional()}).strict(),cJ=Z.object({identifier:Z.string().min(1).optional(),title:Z.string().min(1),type:JZ,qtiVersion:Z.string().optional(),timeDependent:Z.boolean().optional(),adaptive:Z.boolean().optional(),responseDeclarations:Z.array(WZ).optional(),outcomeDeclarations:Z.array(XZ).optional(),responseProcessing:_Z.optional(),metadata:$Z.optional(),modalFeedback:Z.array(HZ).optional(),feedbackInline:Z.array(wZ).optional(),feedbackBlock:Z.array(VZ).optional(),rawXml:Z.string(),content:Z.record(Z.string(),Z.unknown())}).strict(),pJ=Z.object({response:Z.union([Z.string(),Z.array(Z.string())])}).strict(),LZ=Z.object({identifier:Z.string().min(1),href:Z.union([Z.string(),Z.array(Z.string()),Z.array(Z.array(Z.string()))]).optional(),sequence:Z.number().optional()}).strict(),qZ=Z.object({identifier:Z.string().min(1),title:Z.string().min(1),visible:Z.boolean(),required:Z.boolean().optional(),fixed:Z.boolean().optional(),sequence:Z.number().optional(),"qti-assessment-item-ref":Z.array(LZ).optional()}).strict(),UZ=Z.object({identifier:Z.string().min(1),navigationMode:zZ,submissionMode:tZ,"qti-assessment-section":Z.union([qZ,Z.array(qZ)])}).strict(),EJ=Z.object({items:Z.array(LZ).min(1)}).strict(),yJ=Z.object({metadata:Z.record(Z.string(),Z.unknown()).optional()}).strict(),sJ=Z.object({identifier:Z.string().min(1),title:Z.string().min(1),qtiVersion:Z.string().optional(),toolName:Z.string().optional(),toolVersion:Z.string().optional(),timeLimit:Z.number().optional(),maxAttempts:Z.number().optional(),toolsEnabled:Z.record(Z.string(),Z.boolean()).optional(),metadata:Z.record(Z.string(),Z.unknown()).optional(),"qti-test-part":UZ,"qti-outcome-declaration":Z.array(YZ).optional()}).strict(),gJ=Z.object({identifier:Z.string().min(1).optional(),title:Z.string().min(1),qtiVersion:Z.string().optional(),toolName:Z.string().optional(),toolVersion:Z.string().optional(),timeLimit:Z.number().optional(),maxAttempts:Z.number().optional(),toolsEnabled:Z.record(Z.string(),Z.boolean()).optional(),metadata:Z.record(Z.string(),Z.unknown()).optional(),"qti-test-part":UZ,"qti-outcome-declaration":Z.array(YZ).optional()}).strict(),mJ=Z.object({identifier:Z.string().min(1),title:Z.string().min(1),label:Z.string().optional(),language:Z.string().optional(),stylesheet:xZ.optional(),content:Z.string(),catalogInfo:Z.array(FZ).optional(),toolName:Z.string().optional(),toolVersion:Z.string().optional(),metadata:Z.record(Z.string(),Z.unknown()).optional()}).strict(),SJ=Z.object({identifier:Z.string().min(1).optional(),title:Z.string().min(1),label:Z.string().optional(),language:Z.string().optional(),stylesheet:xZ.optional(),content:Z.string(),catalogInfo:Z.array(FZ).optional(),toolName:Z.string().optional(),toolVersion:Z.string().optional(),metadata:Z.record(Z.string(),Z.unknown()).optional()}).strict(),oJ=Z.object({xml:Z.string().optional(),schema:KZ,entityId:Z.string().optional()}).strict(),rJ=Z.object({xml:Z.array(Z.string()),schema:KZ,entityIds:Z.array(Z.string())}).strict(),aJ=Z.object({questionId:Z.string().optional(),userId:Z.string().min(1),feedback:Z.string().min(1),lessonId:Z.string().min(1),humanApproved:Z.boolean().optional()}).strict();export{L as a,F as b,Hq as c};
@@ -1 +0,0 @@
1
- import{t as c,u as N}from"./chunk-9se82640.js";import{C as V,G as f,I as q,J as P,K as E,L as b}from"./chunk-hnf0tart.js";import{M as g,O as m}from"./chunk-07j8zre9.js";var X=null,x=!1,I=!1;function y(z){let F=z.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${F}$`)}function s(){if(X!==null)return;if(X=[],typeof process>"u"||!process.env?.DEBUG){I=!1;return}I=!0;let z=process.env.DEBUG.trim();if(z==="1"||z==="true"||z==="*"){x=!0;return}let K=z.split(",").map((Q)=>Q.trim()).filter(Boolean);for(let Q of K)if(Q.startsWith("-"))X.push({regex:y(Q.slice(1)),exclude:!0});else X.push({regex:y(Q),exclude:!1});if(!X.some((Q)=>!Q.exclude)&&X.length>0)x=!0}function d(z){if(s(),!I)return!0;if(x){if(z){for(let K of X)if(K.exclude&&K.regex.test(z))return!1}return!0}if(!z)return!1;for(let K of X)if(K.exclude&&K.regex.test(z))return!1;for(let K of X)if(!K.exclude&&K.regex.test(z))return!0;return!1}function C(){return typeof globalThis<"u"&&"window"in globalThis}function T(){if(C())return"browser";if(typeof process<"u"&&process.env){if(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.JENKINS_URL||process.env.BUILDKITE)return"ci"}return"terminal"}var h;if(!C())try{h=(await import("node:util")).inspect}catch{}var Y={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",yellow:"\x1B[33m",blue:"\x1B[34m",cyan:"\x1B[36m"};function t(z){switch(z){case"debug":return Y.blue;case"info":return Y.cyan;case"warn":return Y.yellow;case"error":return Y.red}}function r(z){switch(z){case"debug":return console.debug;case"info":return console.info;case"warn":return console.warn;case"error":return console.error}}function e(z){if(h)return h(z,{depth:null,colors:!0,breakLength:80,compact:!1});return JSON.stringify(z,null,2)}var O=(z)=>{let K=t(z.level),F=r(z.level),Q=z.level.toUpperCase().padEnd(5),W=z.timestamp.toISOString().replace(/\.\d{3}Z$/,""),$=`${Y.dim}[${W}]${Y.reset}`,B=`${K}${Q}${Y.reset}`,Z=z.scope?`${Y.bold}[${z.scope}]${Y.reset} `:"",J=`${$} ${B} ${Z}${z.message}`;if(z.context&&Object.keys(z.context).length>0)F(J,e(z.context));else F(J)};var z6={debug:"[DEBUG]",info:"[INFO]",warn:"[WARN]",error:"[ERROR]"};function K6(z){return Object.entries(z).map(([K,F])=>`${K}=${F6(F)}`).join(" ")}function F6(z){if(typeof z==="string")return z;if(typeof z==="number")return String(z);if(typeof z==="boolean")return String(z);if(z===null)return"null";if(z===void 0)return"undefined";return JSON.stringify(z)}var w=(z)=>{let K=[];if(K.push(z.timestamp.toISOString()),K.push(z6[z.level]),z.scope)K.push(`[${z.scope}]`);if(K.push(z.message),z.context&&Object.keys(z.context).length>0)K.push(K6(z.context));console.log(K.join(" "))};var D=(z)=>{let K={timestamp:z.timestamp.toISOString(),level:z.level,...z.scope&&{scope:z.scope},msg:z.message};if(z.context&&Object.keys(z.context).length>0)Object.assign(K,z.context);console.log(JSON.stringify(K))};var Q6={debug:"color: gray",info:"color: #0ea5e9",warn:"color: #f59e0b",error:"color: #ef4444; font-weight: bold"},W6={debug:"log",info:"info",warn:"warn",error:"error"},S=(z)=>{let K=W6[z.level],F=Q6[z.level],W=`%c${z.scope?`[${z.scope}]`:""} ${z.message}`;if(z.context&&Object.keys(z.context).length>0)console[K](W,F,z.context);else console[K](W,F)};var p=["debug","info","warn","error"];function Z6(z){switch(z){case"terminal":return O;case"ci":return w;case"production":return D;case"browser":return S;case"test":return()=>{}}}function $6(){if(typeof process<"u"&&process.env?.DEBUG)return"debug";return"info"}function B6(z,K){return p.indexOf(z)>=p.indexOf(K)}class A{scope;minLevel;environment;formatter;defaultContext;constructor(z={}){this.scope=z.scope,this.minLevel=z.minLevel??$6(),this.defaultContext=z.defaultContext??{},this.environment=z.environment??T(),this.formatter=Z6(this.environment)}child(z){let K=this.scope?`${this.scope}:${z}`:z;return new A({scope:K,minLevel:this.minLevel,environment:this.environment,defaultContext:{...this.defaultContext}})}withContext(z){return new A({scope:this.scope,minLevel:this.minLevel,environment:this.environment,defaultContext:{...this.defaultContext,...z}})}debug(z,K){this.log("debug",z,K)}info(z,K){this.log("info",z,K)}warn(z,K){this.log("warn",z,K)}error(z,K){this.log("error",z,K)}log(z,K,F){if(z==="debug"&&!d(this.scope))return;if(!B6(z,this.minLevel))return;let Q={level:z,message:K,scope:this.scope,context:F||Object.keys(this.defaultContext).length>0?{...this.defaultContext,...F}:void 0,timestamp:new Date};this.formatter(Q)}}function R(z={}){return new A(z)}function H6(){try{let z=typeof process>"u"?void 0:process.env.DEBUG;return z==="1"||z==="true"}catch{return!1}}function _(z){return R({scope:`timeback:${z}`,minLevel:H6()?"debug":"warn"})}var G=_("sso"),j=_("oidc");var u=new Map;async function U(z){let K=u.get(z);if(K)return K;let F=`${z}/.well-known/openid-configuration`,Q=await fetch(F);if(!Q.ok)throw j.error("Discovery fetch failed",{status:Q.status}),Error(`Failed to fetch OIDC discovery: ${Q.statusText}`);let W=await Q.json();return j.debug("Fetched OIDC discovery document",{authEndpoint:W.authorization_endpoint,tokenEndpoint:W.token_endpoint}),u.set(z,W),W}function k(z){switch(z){case"production":return"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_3uhuoRM3R";case"staging":return"https://cognito-idp.us-east-1.amazonaws.com/us-east-1_5EUwTP9XD";case"local":throw Error("Local environment is not yet supported for OIDC")}}async function L(z){let K=await U(z.issuer),F=new URL(K.authorization_endpoint);return F.searchParams.set("response_type","code"),F.searchParams.set("client_id",z.clientId),F.searchParams.set("redirect_uri",z.redirectUri),F.searchParams.set("scope","openid profile email"),F.searchParams.set("state",z.state),F.toString()}async function X6(z){let K=await U(z.issuer),F=await fetch(K.token_endpoint,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:z.clientId,client_secret:z.clientSecret,code:z.code,redirect_uri:z.redirectUri})});if(!F.ok){let W=await F.text();throw j.error("Token exchange failed",{status:F.status,body:W}),Error(`Token exchange failed: ${F.status} ${W}`)}let Q=await F.json();return j.debug("Received tokens from IdP",{expiresIn:Q.expires_in}),Q}async function Y6(z){let K=await U(z.issuer),F=await fetch(K.userinfo_endpoint,{headers:{Authorization:`Bearer ${z.accessToken}`}});if(!F.ok)throw Error(`UserInfo request failed: ${F.statusText}`);return F.json()}import{TimebackClient as J6}from"@timeback/core";var M=_("resolve");class H extends Error{code;constructor(z,K){super(z);this.code=K;this.name="TimebackUserResolutionError"}}function G6(z){return z.code==="timeback_user_ambiguous"?409:404}function M6(z){return{sub:z.sub,email:z.email,firstName:z.given_name,lastName:z.family_name,pictureUrl:z.picture}}async function i(z,K){let Q=(await z.oneroster.users.list({where:{email:K},limit:2})).data;if(Q.length===0)throw M.warn("No Timeback user found for email",{email:N(K)}),new H(`No Timeback user found with email: ${K}`,"timeback_user_not_found");if(Q.length>1)throw M.error("Multiple Timeback users found for email",{email:N(K),count:Q.length}),new H(`Multiple Timeback users found with email: ${K}`,"timeback_user_ambiguous");let W=Q[0];if(!W.sourcedId)throw new H("Timeback user is missing sourcedId","timeback_user_lookup_failed");return W}async function N6(z){let{env:K,apiCredentials:F,userInfo:Q}=z;if(!Q.email)throw M.error("Missing email in IdP user info",{sub:Q.sub}),new H("IdP did not return an email address, which is required to resolve Timeback identity","missing_email");let W=Q.email;M.debug("Resolving Timeback user by email",{email:N(W),env:K});let $=z.client,B=$??new J6({env:f(K),auth:{clientId:F.clientId,clientSecret:F.clientSecret}});try{let Z=await i(B,W);return{...{id:Z.sourcedId,email:Z.email??W,name:c(Z.givenName,Z.familyName),school:Z.primaryOrg?{id:Z.primaryOrg.sourcedId,name:Z.primaryOrg.name??Z.primaryOrg.sourcedId}:void 0,grade:Z.grades?.length?Math.max(...Z.grades):void 0},claims:M6(Q)}}catch(Z){if(Z instanceof H)throw Z;let J=Z instanceof Error?Z.message:"Unknown error";throw M.error("Failed to lookup Timeback user",{email:N(W),error:J}),new H(`Failed to lookup Timeback user: ${J}`,"timeback_user_lookup_failed")}finally{if(!$)B.close()}}async function j6(z){let{email:K,client:F}=z;M.debug("Looking up Timeback user ID by email",{email:N(K)});try{return(await i(F,K)).sourcedId}catch(Q){if(Q instanceof H)throw Q;let W=Q instanceof Error?Q.message:"Unknown error";throw M.error("Failed to lookup Timeback user",{email:N(K),error:W}),new H(`Failed to lookup Timeback user: ${W}`,"timeback_user_lookup_failed")}}function v(z,K,F,Q){return{error:z,errorCode:K,state:F,req:Q,redirect:P,json:q}}function l(z){try{return b(z)}catch{G.warn("Failed to decode state");return}}function A6(z,K,F,Q,W){let $=K.searchParams.get("error_description");G.error("IdP returned error",{error:z,description:$});let B=Error($??z);if(W)return W(v(B,z,F,Q));return q({error:z},400)}function _6(z,K,F){G.error("Missing authorization code in callback");let Q=Error("Missing authorization code");if(F)return F(v(Q,"missing_code",z,K));return q({error:"Missing authorization code"},400)}async function V6(z){let{req:K,env:F,clientId:Q,buildState:W}=z,$=z.issuer??k(F),B=new URL(K.url),Z=z.redirectUri;if(!Z){let o=B.pathname.replace(V.IDENTITY.SIGNIN,"");Z=`${B.origin}${o}${V.IDENTITY.CALLBACK}`}G.debug("SSO sign-in initiated",{env:F,issuer:$,clientId:Q,redirectUri:Z});let J=W?W({req:K,url:B}):{},n=E(J),a=await L({issuer:$,clientId:Q,redirectUri:Z,state:n});return P(a)}function q6(z){let K=new URL(z.url),F=K.searchParams.get("code"),Q=K.searchParams.get("error"),W=K.searchParams.get("state");G.debug("Received callback from IdP",{hasCode:!!F,error:Q});let $=W?l(W):void 0;return{url:K,code:F,errorParam:Q,state:$}}function O6(z,K){if(K)return K;let F=z.pathname.replace(V.IDENTITY.CALLBACK,"");return`${z.origin}${F}${V.IDENTITY.CALLBACK}`}export{_ as e,G as f,k as g,X6 as h,Y6 as i,H as j,G6 as k,N6 as l,j6 as m,v as n,A6 as o,_6 as p,V6 as q,q6 as r,O6 as s};
@@ -1,32 +0,0 @@
1
- /**
2
- * Activity Handler
3
- *
4
- * HTTP route handler for activity submissions.
5
- * Orchestrates validation, user resolution, gradebook writes, and Caliper event sending.
6
- */
7
- import { maybeWriteCompletionEntry as maybeWriteCompletionEntryImpl } from './completion';
8
- import { computeProgress as computeProgressImpl } from './progress';
9
- import type { ActivityHandler, ActivityHandlerConfig } from './types';
10
- /**
11
- * Internal dependencies for handler.
12
- *
13
- * This interface enables unit tests to inject mock implementations of
14
- * computeProgress and maybeWriteCompletionEntry without mocking the entire
15
- * TimebackClient.
16
- *
17
- * Not part of the public API - only exposed for testing purposes.
18
- */
19
- interface ActivityHandlerDeps {
20
- computeProgress: typeof computeProgressImpl;
21
- maybeWriteCompletionEntry: typeof maybeWriteCompletionEntryImpl;
22
- }
23
- /**
24
- * Create the activity POST handler.
25
- *
26
- * @param config - Handler configuration
27
- * @param deps - Internal dependencies (for testing only, not part of public API)
28
- * @returns The activity request handler
29
- */
30
- export declare function createActivityHandler(config: ActivityHandlerConfig, deps?: ActivityHandlerDeps): ActivityHandler;
31
- export {};
32
- //# sourceMappingURL=handler.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/activity/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,EAAE,yBAAyB,IAAI,6BAA6B,EAAE,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKnE,OAAO,KAAK,EACX,eAAe,EACf,qBAAqB,EAGrB,MAAM,SAAS,CAAA;AAQhB;;;;;;;;GAQG;AACH,UAAU,mBAAmB;IAC5B,eAAe,EAAE,OAAO,mBAAmB,CAAA;IAC3C,yBAAyB,EAAE,OAAO,6BAA6B,CAAA;CAC/D;AA+HD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,qBAAqB,EAC7B,IAAI,GAAE,mBAAiC,GACrC,eAAe,CAuLjB"}
@@ -1,25 +0,0 @@
1
- /**
2
- * XP Calculation Utilities
3
- *
4
- * Ported from playcademy `packages/timeback` so SDK users get consistent,
5
- * mastery-based XP behavior.
6
- *
7
- * XP is calculated from duration, accuracy, and attempt number:
8
- *
9
- * \( baseXp = durationMinutes \)
10
- * \( xp = baseXp \times accuracyMultiplier \times attemptMultiplier \)
11
- *
12
- * - Mastery threshold: 80% accuracy required to earn any XP.
13
- * - Perfect bonus: ~100% accuracy earns 1.25x multiplier (floating-point safe).
14
- * - Diminishing returns: attempt 1 = 1.0x, 2 = 0.5x, 3 = 0.25x, 4+ = 0x.
15
- */
16
- /**
17
- * Calculate XP based on duration, accuracy, and attempt number.
18
- *
19
- * @param durationSeconds - Total session duration in seconds
20
- * @param accuracy - Accuracy as decimal (0-1)
21
- * @param attemptNumber - Which attempt this is (1 = first, 2 = first re-attempt, etc.)
22
- * @returns Calculated XP, rounded to nearest tenth
23
- */
24
- export declare function calculateXp(durationSeconds: number, accuracy: number, attemptNumber: number): number;
25
- //# sourceMappingURL=xp-calculator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xp-calculator.d.ts","sourceRoot":"","sources":["../../src/shared/xp-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwDH;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAC1B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACnB,MAAM,CAkBR"}