timeback-studio 0.1.2 → 0.1.3

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.
package/dist/bin.js CHANGED
@@ -16886,7 +16886,7 @@ async function loadCredentials(environment) {
16886
16886
  }
16887
16887
  // ../internal/cli-infra/src/ui.ts
16888
16888
  function intro(title) {
16889
- console.log();
16889
+ console.log("");
16890
16890
  Ie(bgCyan(black(` ${title} `)));
16891
16891
  }
16892
16892
  var outro = {
@@ -16929,7 +16929,7 @@ var playcademyParser = {
16929
16929
  import { existsSync } from "node:fs";
16930
16930
  import { readFile as readFile2 } from "node:fs/promises";
16931
16931
  import { basename, relative, resolve } from "node:path";
16932
- import { createJiti } from "jiti";
16932
+ import { pathToFileURL } from "node:url";
16933
16933
  // ../types/src/zod/primitives.ts
16934
16934
  var IsoDateTimeRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
16935
16935
  var IsoDateTimeString = exports_external.string().min(1).regex(IsoDateTimeRegex, "must be a valid ISO 8601 datetime");
@@ -16989,6 +16989,47 @@ var OneRosterUserRole = exports_external.enum([
16989
16989
  "teacher"
16990
16990
  ]);
16991
16991
  var EnrollmentRole = exports_external.enum(["administrator", "proctor", "student", "teacher"]);
16992
+ var ResourceType = exports_external.enum([
16993
+ "qti",
16994
+ "text",
16995
+ "audio",
16996
+ "video",
16997
+ "interactive",
16998
+ "visual",
16999
+ "course-material",
17000
+ "assessment-bank"
17001
+ ]);
17002
+ var QtiSubType = exports_external.enum(["qti-test", "qti-question", "qti-stimulus", "qti-test-bank"]);
17003
+ var CourseMaterialSubType = exports_external.enum(["unit", "course", "resource-collection"]);
17004
+ var QuestionType = exports_external.enum([
17005
+ "choice",
17006
+ "order",
17007
+ "associate",
17008
+ "match",
17009
+ "hotspot",
17010
+ "hottext",
17011
+ "select-point",
17012
+ "graphic-order",
17013
+ "graphic-associate",
17014
+ "graphic-gap-match",
17015
+ "text-entry",
17016
+ "extended-text",
17017
+ "inline-choice",
17018
+ "upload",
17019
+ "slider",
17020
+ "drawing",
17021
+ "media",
17022
+ "custom"
17023
+ ]);
17024
+ var Difficulty = exports_external.enum(["easy", "medium", "hard"]);
17025
+ var LearningObjectiveSetSchema = exports_external.array(exports_external.object({
17026
+ source: exports_external.string(),
17027
+ learningObjectiveIds: exports_external.array(exports_external.string())
17028
+ }));
17029
+ var FastFailConfigSchema = exports_external.object({
17030
+ consecutive_failures: exports_external.number().int().min(1).optional(),
17031
+ stagnation_limit: exports_external.number().int().min(1).optional()
17032
+ }).optional();
16992
17033
  var LessonType = exports_external.enum(["powerpath-100", "quiz", "test-out", "placement", "unit-test", "alpha-read-article"]).nullable();
16993
17034
  var IMSErrorResponse = exports_external.object({
16994
17035
  imsx_codeMajor: exports_external.enum(["failure", "success"]),
@@ -17065,7 +17106,11 @@ var ActivityCompletedInput = exports_external.object({
17065
17106
  eventTime: IsoDateTimeString.optional(),
17066
17107
  metricsId: exports_external.string().optional(),
17067
17108
  id: exports_external.string().optional(),
17068
- extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
17109
+ extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
17110
+ attempt: exports_external.number().int().min(1).optional(),
17111
+ generatedExtensions: exports_external.object({
17112
+ pctCompleteApp: exports_external.number().optional()
17113
+ }).loose().optional()
17069
17114
  }).strict();
17070
17115
  var TimeSpentInput = exports_external.object({
17071
17116
  actor: TimebackUser,
@@ -17181,16 +17226,59 @@ var CourseDefaults = exports_external.object({
17181
17226
  level: exports_external.string().optional(),
17182
17227
  metadata: CourseMetadata.optional()
17183
17228
  });
17229
+ var CourseEnvOverrides = exports_external.object({
17230
+ level: exports_external.string().optional(),
17231
+ sensor: exports_external.string().url().optional(),
17232
+ launchUrl: exports_external.string().url().optional(),
17233
+ metadata: CourseMetadata.optional()
17234
+ });
17235
+ var CourseOverrides = exports_external.object({
17236
+ staging: CourseEnvOverrides.optional(),
17237
+ production: CourseEnvOverrides.optional()
17238
+ });
17184
17239
  var CourseConfig = CourseDefaults.extend({
17185
17240
  subject: TimebackSubject,
17186
- grade: TimebackGrade,
17187
- ids: CourseIds.nullable().optional()
17241
+ grade: TimebackGrade.optional(),
17242
+ ids: CourseIds.nullable().optional(),
17243
+ sensor: exports_external.string().url().optional(),
17244
+ launchUrl: exports_external.string().url().optional(),
17245
+ overrides: CourseOverrides.optional()
17188
17246
  });
17189
17247
  var TimebackConfig = exports_external.object({
17190
17248
  name: exports_external.string().min(1, "App name is required"),
17191
17249
  defaults: CourseDefaults.optional(),
17192
17250
  courses: exports_external.array(CourseConfig).min(1, "At least one course is required"),
17193
- sensors: exports_external.array(exports_external.string().url()).optional()
17251
+ sensor: exports_external.string().url().optional(),
17252
+ launchUrl: exports_external.string().url().optional()
17253
+ }).refine((config2) => {
17254
+ return config2.courses.every((c) => c.grade !== undefined || c.courseCode !== undefined);
17255
+ }, {
17256
+ message: "Each course must have either a grade or a courseCode",
17257
+ path: ["courses"]
17258
+ }).refine((config2) => {
17259
+ const withGrade = config2.courses.filter((c) => c.grade !== undefined);
17260
+ const keys = withGrade.map((c) => `${c.subject}:${c.grade}`);
17261
+ return new Set(keys).size === keys.length;
17262
+ }, {
17263
+ message: "Duplicate (subject, grade) pair found; each must be unique",
17264
+ path: ["courses"]
17265
+ }).refine((config2) => {
17266
+ const withCode = config2.courses.filter((c) => c.courseCode !== undefined);
17267
+ const codes = withCode.map((c) => c.courseCode);
17268
+ return new Set(codes).size === codes.length;
17269
+ }, {
17270
+ message: "Duplicate courseCode found; each must be unique",
17271
+ path: ["courses"]
17272
+ }).refine((config2) => {
17273
+ return config2.courses.every((c) => c.sensor !== undefined || config2.sensor !== undefined);
17274
+ }, {
17275
+ message: "Each course must have an effective sensor; set a top-level `sensor` or per-course `sensor`",
17276
+ path: ["courses"]
17277
+ }).refine((config2) => {
17278
+ return config2.courses.every((c) => c.launchUrl !== undefined || config2.launchUrl !== undefined);
17279
+ }, {
17280
+ message: "Each course must have an effective launchUrl; set a top-level `launchUrl` or per-course `launchUrl`",
17281
+ path: ["courses"]
17194
17282
  });
17195
17283
  // ../types/src/zod/edubridge.ts
17196
17284
  var EdubridgeDateString = exports_external.union([IsoDateString, IsoDateTimeString]);
@@ -17441,20 +17529,45 @@ var OneRosterScoreScaleCreateInput = exports_external.object({
17441
17529
  }).strict();
17442
17530
  var OneRosterAssessmentLineItemCreateInput = exports_external.object({
17443
17531
  sourcedId: NonEmptyString2.optional(),
17532
+ status: Status.optional(),
17533
+ dateLastModified: IsoDateTimeString.optional(),
17444
17534
  title: NonEmptyString2.describe("title must be a non-empty string"),
17445
- class: Ref,
17446
- school: Ref,
17447
- category: Ref,
17448
- assignDate: OneRosterDateString,
17449
- dueDate: OneRosterDateString,
17450
- status: Status,
17535
+ description: exports_external.string().nullable().optional(),
17536
+ class: Ref.nullable().optional(),
17537
+ parentAssessmentLineItem: Ref.nullable().optional(),
17538
+ scoreScale: Ref.nullable().optional(),
17539
+ resultValueMin: exports_external.number().nullable().optional(),
17540
+ resultValueMax: exports_external.number().nullable().optional(),
17541
+ component: Ref.nullable().optional(),
17542
+ componentResource: Ref.nullable().optional(),
17543
+ learningObjectiveSet: exports_external.array(exports_external.object({
17544
+ source: exports_external.string(),
17545
+ learningObjectiveIds: exports_external.array(exports_external.string())
17546
+ })).optional().nullable(),
17547
+ course: Ref.nullable().optional(),
17451
17548
  metadata: Metadata
17452
17549
  }).strict();
17550
+ var LearningObjectiveResult = exports_external.object({
17551
+ learningObjectiveId: exports_external.string(),
17552
+ score: exports_external.number().optional(),
17553
+ textScore: exports_external.string().optional()
17554
+ });
17555
+ var LearningObjectiveScoreSetSchema = exports_external.array(exports_external.object({
17556
+ source: exports_external.string(),
17557
+ learningObjectiveResults: exports_external.array(LearningObjectiveResult)
17558
+ }));
17453
17559
  var OneRosterAssessmentResultCreateInput = exports_external.object({
17454
17560
  sourcedId: NonEmptyString2.optional(),
17455
- lineItem: Ref,
17561
+ status: Status.optional(),
17562
+ dateLastModified: IsoDateTimeString.optional(),
17563
+ metadata: Metadata,
17564
+ assessmentLineItem: Ref,
17456
17565
  student: Ref,
17457
- scoreDate: OneRosterDateString,
17566
+ score: exports_external.number().nullable().optional(),
17567
+ textScore: exports_external.string().nullable().optional(),
17568
+ scoreDate: exports_external.string().datetime(),
17569
+ scoreScale: Ref.nullable().optional(),
17570
+ scorePercentile: exports_external.number().nullable().optional(),
17458
17571
  scoreStatus: exports_external.enum([
17459
17572
  "exempt",
17460
17573
  "fully graded",
@@ -17462,9 +17575,12 @@ var OneRosterAssessmentResultCreateInput = exports_external.object({
17462
17575
  "partially graded",
17463
17576
  "submitted"
17464
17577
  ]),
17465
- score: exports_external.string().optional(),
17466
- status: Status,
17467
- metadata: Metadata
17578
+ comment: exports_external.string().nullable().optional(),
17579
+ learningObjectiveSet: LearningObjectiveScoreSetSchema.nullable().optional(),
17580
+ inProgress: exports_external.string().nullable().optional(),
17581
+ incomplete: exports_external.string().nullable().optional(),
17582
+ late: exports_external.string().nullable().optional(),
17583
+ missing: exports_external.string().nullable().optional()
17468
17584
  }).strict();
17469
17585
  var OneRosterOrgCreateInput = exports_external.object({
17470
17586
  sourcedId: NonEmptyString2.optional(),
@@ -17532,6 +17648,75 @@ var OneRosterCredentialInput = exports_external.object({
17532
17648
  var OneRosterDemographicsCreateInput = exports_external.object({
17533
17649
  sourcedId: NonEmptyString2.describe("sourcedId must be a non-empty string")
17534
17650
  }).loose();
17651
+ var CommonResourceMetadataSchema = exports_external.object({
17652
+ type: ResourceType,
17653
+ subject: TimebackSubject.nullish(),
17654
+ grades: exports_external.array(TimebackGrade).nullish(),
17655
+ language: exports_external.string().nullish(),
17656
+ xp: exports_external.number().nullish(),
17657
+ url: exports_external.url().nullish(),
17658
+ keywords: exports_external.array(exports_external.string()).nullish(),
17659
+ learningObjectiveSet: LearningObjectiveSetSchema.nullish(),
17660
+ lessonType: exports_external.string().nullish()
17661
+ }).passthrough();
17662
+ var QtiMetadataSchema = CommonResourceMetadataSchema.extend({
17663
+ type: exports_external.literal("qti"),
17664
+ subType: QtiSubType,
17665
+ questionType: QuestionType.optional(),
17666
+ difficulty: Difficulty.optional()
17667
+ });
17668
+ var TextMetadataSchema = CommonResourceMetadataSchema.extend({
17669
+ type: exports_external.literal("text"),
17670
+ format: exports_external.string(),
17671
+ author: exports_external.string().optional(),
17672
+ pageCount: exports_external.number().optional()
17673
+ });
17674
+ var AudioMetadataSchema = CommonResourceMetadataSchema.extend({
17675
+ type: exports_external.literal("audio"),
17676
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
17677
+ format: exports_external.string(),
17678
+ speaker: exports_external.string().optional()
17679
+ });
17680
+ var VideoMetadataSchema = CommonResourceMetadataSchema.extend({
17681
+ type: exports_external.literal("video"),
17682
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
17683
+ captionsAvailable: exports_external.boolean().optional(),
17684
+ format: exports_external.string()
17685
+ });
17686
+ var InteractiveMetadataSchema = CommonResourceMetadataSchema.extend({
17687
+ type: exports_external.literal("interactive"),
17688
+ launchUrl: exports_external.url().optional(),
17689
+ toolProvider: exports_external.string().optional(),
17690
+ instructionalMethod: exports_external.string().optional(),
17691
+ courseIdOnFail: exports_external.string().nullable().optional(),
17692
+ fail_fast: FastFailConfigSchema
17693
+ });
17694
+ var VisualMetadataSchema = CommonResourceMetadataSchema.extend({
17695
+ type: exports_external.literal("visual"),
17696
+ format: exports_external.string(),
17697
+ resolution: exports_external.string().optional()
17698
+ });
17699
+ var CourseMaterialMetadataSchema = CommonResourceMetadataSchema.extend({
17700
+ type: exports_external.literal("course-material"),
17701
+ subType: CourseMaterialSubType,
17702
+ author: exports_external.string().optional(),
17703
+ format: exports_external.string(),
17704
+ instructionalMethod: exports_external.string().optional()
17705
+ });
17706
+ var AssessmentBankMetadataSchema = CommonResourceMetadataSchema.extend({
17707
+ type: exports_external.literal("assessment-bank"),
17708
+ resources: exports_external.array(exports_external.string())
17709
+ });
17710
+ var ResourceMetadataSchema = exports_external.discriminatedUnion("type", [
17711
+ QtiMetadataSchema,
17712
+ TextMetadataSchema,
17713
+ AudioMetadataSchema,
17714
+ VideoMetadataSchema,
17715
+ InteractiveMetadataSchema,
17716
+ VisualMetadataSchema,
17717
+ CourseMaterialMetadataSchema,
17718
+ AssessmentBankMetadataSchema
17719
+ ]);
17535
17720
  var OneRosterResourceCreateInput = exports_external.object({
17536
17721
  sourcedId: NonEmptyString2.optional(),
17537
17722
  title: NonEmptyString2.describe("title must be a non-empty string"),
@@ -17541,7 +17726,7 @@ var OneRosterResourceCreateInput = exports_external.object({
17541
17726
  vendorId: exports_external.string().optional(),
17542
17727
  applicationId: exports_external.string().optional(),
17543
17728
  status: Status.optional(),
17544
- metadata: Metadata
17729
+ metadata: ResourceMetadataSchema.nullable().optional()
17545
17730
  }).strict();
17546
17731
  var CourseStructureItem = exports_external.object({
17547
17732
  url: NonEmptyString2.describe("courseStructure.url must be a non-empty string"),
@@ -17566,6 +17751,268 @@ var OneRosterBulkResultItem = exports_external.object({
17566
17751
  student: Ref
17567
17752
  }).loose();
17568
17753
  var OneRosterBulkResultsInput = exports_external.array(OneRosterBulkResultItem).min(1, "results must have at least one item");
17754
+ // ../types/src/zod/powerpath.ts
17755
+ var NonEmptyString3 = exports_external.string().trim().min(1);
17756
+ var ToolProvider = exports_external.enum(["edulastic", "mastery-track"]);
17757
+ var LessonTypeRequired = exports_external.enum([
17758
+ "powerpath-100",
17759
+ "quiz",
17760
+ "test-out",
17761
+ "placement",
17762
+ "unit-test",
17763
+ "alpha-read-article"
17764
+ ]);
17765
+ var GradeArray = exports_external.array(TimebackGrade);
17766
+ var ResourceMetadata = exports_external.record(exports_external.string(), exports_external.unknown()).optional();
17767
+ var ExternalTestBase = exports_external.object({
17768
+ courseId: NonEmptyString3,
17769
+ lessonTitle: NonEmptyString3.optional(),
17770
+ launchUrl: exports_external.url().optional(),
17771
+ toolProvider: ToolProvider,
17772
+ unitTitle: NonEmptyString3.optional(),
17773
+ courseComponentSourcedId: NonEmptyString3.optional(),
17774
+ vendorId: NonEmptyString3.optional(),
17775
+ description: NonEmptyString3.optional(),
17776
+ resourceMetadata: ResourceMetadata.nullable().optional(),
17777
+ grades: GradeArray
17778
+ });
17779
+ var ExternalTestOut = ExternalTestBase.extend({
17780
+ lessonType: exports_external.literal("test-out"),
17781
+ xp: exports_external.number()
17782
+ });
17783
+ var ExternalPlacement = ExternalTestBase.extend({
17784
+ lessonType: exports_external.literal("placement"),
17785
+ courseIdOnFail: NonEmptyString3.optional(),
17786
+ xp: exports_external.number().optional()
17787
+ });
17788
+ var InternalTestBase = exports_external.object({
17789
+ courseId: NonEmptyString3,
17790
+ lessonType: LessonTypeRequired,
17791
+ lessonTitle: NonEmptyString3.optional(),
17792
+ unitTitle: NonEmptyString3.optional(),
17793
+ courseComponentSourcedId: NonEmptyString3.optional(),
17794
+ resourceMetadata: ResourceMetadata.nullable().optional(),
17795
+ xp: exports_external.number().optional(),
17796
+ grades: GradeArray.optional(),
17797
+ courseIdOnFail: NonEmptyString3.optional()
17798
+ });
17799
+ var PowerPathCreateInternalTestInput = exports_external.union([
17800
+ InternalTestBase.extend({
17801
+ testType: exports_external.literal("qti"),
17802
+ qti: exports_external.object({
17803
+ url: exports_external.url(),
17804
+ title: NonEmptyString3.optional(),
17805
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
17806
+ })
17807
+ }),
17808
+ InternalTestBase.extend({
17809
+ testType: exports_external.literal("assessment-bank"),
17810
+ assessmentBank: exports_external.object({
17811
+ resources: exports_external.array(exports_external.object({
17812
+ url: exports_external.url(),
17813
+ title: NonEmptyString3.optional(),
17814
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
17815
+ }))
17816
+ })
17817
+ })
17818
+ ]);
17819
+ var PowerPathCreateNewAttemptInput = exports_external.object({
17820
+ student: NonEmptyString3,
17821
+ lesson: NonEmptyString3
17822
+ });
17823
+ var PowerPathFinalStudentAssessmentResponseInput = exports_external.object({
17824
+ student: NonEmptyString3,
17825
+ lesson: NonEmptyString3
17826
+ });
17827
+ var PowerPathLessonPlansCreateInput = exports_external.object({
17828
+ courseId: NonEmptyString3,
17829
+ userId: NonEmptyString3,
17830
+ classId: NonEmptyString3.optional()
17831
+ });
17832
+ var LessonPlanTarget = exports_external.object({
17833
+ type: exports_external.enum(["component", "resource"]),
17834
+ id: NonEmptyString3
17835
+ });
17836
+ var PowerPathLessonPlanOperationInput = exports_external.union([
17837
+ exports_external.object({
17838
+ type: exports_external.literal("set-skipped"),
17839
+ payload: exports_external.object({
17840
+ target: LessonPlanTarget,
17841
+ value: exports_external.boolean()
17842
+ })
17843
+ }),
17844
+ exports_external.object({
17845
+ type: exports_external.literal("add-custom-resource"),
17846
+ payload: exports_external.object({
17847
+ resource_id: NonEmptyString3,
17848
+ parent_component_id: NonEmptyString3,
17849
+ skipped: exports_external.boolean().optional()
17850
+ })
17851
+ }),
17852
+ exports_external.object({
17853
+ type: exports_external.literal("move-item-before"),
17854
+ payload: exports_external.object({
17855
+ target: LessonPlanTarget,
17856
+ reference_id: NonEmptyString3
17857
+ })
17858
+ }),
17859
+ exports_external.object({
17860
+ type: exports_external.literal("move-item-after"),
17861
+ payload: exports_external.object({
17862
+ target: LessonPlanTarget,
17863
+ reference_id: NonEmptyString3
17864
+ })
17865
+ }),
17866
+ exports_external.object({
17867
+ type: exports_external.literal("move-item-to-start"),
17868
+ payload: exports_external.object({
17869
+ target: LessonPlanTarget
17870
+ })
17871
+ }),
17872
+ exports_external.object({
17873
+ type: exports_external.literal("move-item-to-end"),
17874
+ payload: exports_external.object({
17875
+ target: LessonPlanTarget
17876
+ })
17877
+ }),
17878
+ exports_external.object({
17879
+ type: exports_external.literal("change-item-parent"),
17880
+ payload: exports_external.object({
17881
+ target: LessonPlanTarget,
17882
+ new_parent_id: NonEmptyString3,
17883
+ position: exports_external.enum(["start", "end"]).optional()
17884
+ })
17885
+ })
17886
+ ]);
17887
+ var PowerPathLessonPlanOperationsInput = exports_external.object({
17888
+ operation: exports_external.array(PowerPathLessonPlanOperationInput),
17889
+ reason: NonEmptyString3.optional()
17890
+ });
17891
+ var PowerPathLessonPlanUpdateStudentItemResponseInput = exports_external.object({
17892
+ studentId: NonEmptyString3,
17893
+ componentResourceId: NonEmptyString3,
17894
+ result: exports_external.object({
17895
+ status: exports_external.enum(["active", "tobedeleted"]),
17896
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
17897
+ score: exports_external.number().optional(),
17898
+ textScore: NonEmptyString3.optional(),
17899
+ scoreDate: NonEmptyString3,
17900
+ scorePercentile: exports_external.number().optional(),
17901
+ scoreStatus: ScoreStatus,
17902
+ comment: NonEmptyString3.optional(),
17903
+ learningObjectiveSet: exports_external.array(exports_external.object({
17904
+ source: NonEmptyString3,
17905
+ learningObjectiveResults: exports_external.array(exports_external.object({
17906
+ learningObjectiveId: NonEmptyString3,
17907
+ score: exports_external.number().optional(),
17908
+ textScore: NonEmptyString3.optional()
17909
+ }))
17910
+ })).optional(),
17911
+ inProgress: NonEmptyString3.optional(),
17912
+ incomplete: NonEmptyString3.optional(),
17913
+ late: NonEmptyString3.optional(),
17914
+ missing: NonEmptyString3.optional()
17915
+ })
17916
+ });
17917
+ var PowerPathMakeExternalTestAssignmentInput = exports_external.object({
17918
+ student: NonEmptyString3,
17919
+ lesson: NonEmptyString3,
17920
+ applicationName: NonEmptyString3.optional(),
17921
+ testId: NonEmptyString3.optional(),
17922
+ skipCourseEnrollment: exports_external.boolean().optional()
17923
+ });
17924
+ var PowerPathPlacementResetUserPlacementInput = exports_external.object({
17925
+ student: NonEmptyString3,
17926
+ subject: TimebackSubject
17927
+ });
17928
+ var PowerPathResetAttemptInput = exports_external.object({
17929
+ student: NonEmptyString3,
17930
+ lesson: NonEmptyString3
17931
+ });
17932
+ var PowerPathScreeningResetSessionInput = exports_external.object({
17933
+ userId: NonEmptyString3
17934
+ });
17935
+ var PowerPathScreeningAssignTestInput = exports_external.object({
17936
+ userId: NonEmptyString3,
17937
+ subject: exports_external.enum(["Math", "Reading", "Language", "Science"])
17938
+ });
17939
+ var PowerPathTestAssignmentsCreateInput = exports_external.object({
17940
+ student: NonEmptyString3,
17941
+ subject: TimebackSubject,
17942
+ grade: TimebackGrade,
17943
+ testName: NonEmptyString3.optional()
17944
+ });
17945
+ var PowerPathTestAssignmentsUpdateInput = exports_external.object({
17946
+ testName: NonEmptyString3
17947
+ });
17948
+ var PowerPathTestAssignmentItemInput = exports_external.object({
17949
+ student: NonEmptyString3,
17950
+ subject: TimebackSubject,
17951
+ grade: TimebackGrade,
17952
+ testName: NonEmptyString3.optional()
17953
+ });
17954
+ var PowerPathTestAssignmentsBulkInput = exports_external.object({
17955
+ items: exports_external.array(PowerPathTestAssignmentItemInput)
17956
+ });
17957
+ var PowerPathTestAssignmentsImportInput = exports_external.object({
17958
+ spreadsheetUrl: exports_external.url(),
17959
+ sheet: NonEmptyString3
17960
+ });
17961
+ var PowerPathTestAssignmentsListParams = exports_external.object({
17962
+ student: NonEmptyString3,
17963
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
17964
+ subject: NonEmptyString3.optional(),
17965
+ grade: TimebackGrade.optional(),
17966
+ limit: exports_external.number().int().positive().max(3000).optional(),
17967
+ offset: exports_external.number().int().nonnegative().optional()
17968
+ });
17969
+ var PowerPathTestAssignmentsAdminParams = exports_external.object({
17970
+ student: NonEmptyString3.optional(),
17971
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
17972
+ subject: NonEmptyString3.optional(),
17973
+ grade: TimebackGrade.optional(),
17974
+ limit: exports_external.number().int().positive().max(3000).optional(),
17975
+ offset: exports_external.number().int().nonnegative().optional()
17976
+ });
17977
+ var PowerPathUpdateStudentQuestionResponseInput = exports_external.object({
17978
+ student: NonEmptyString3,
17979
+ question: NonEmptyString3,
17980
+ response: exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)]).optional(),
17981
+ responses: exports_external.record(exports_external.string(), exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)])).optional(),
17982
+ lesson: NonEmptyString3
17983
+ });
17984
+ var PowerPathGetAssessmentProgressParams = exports_external.object({
17985
+ student: NonEmptyString3,
17986
+ lesson: NonEmptyString3,
17987
+ attempt: exports_external.number().int().positive().optional()
17988
+ });
17989
+ var PowerPathGetNextQuestionParams = exports_external.object({
17990
+ student: NonEmptyString3,
17991
+ lesson: NonEmptyString3
17992
+ });
17993
+ var PowerPathGetAttemptsParams = exports_external.object({
17994
+ student: NonEmptyString3,
17995
+ lesson: NonEmptyString3
17996
+ });
17997
+ var PowerPathTestOutParams = exports_external.object({
17998
+ student: NonEmptyString3,
17999
+ lesson: NonEmptyString3.optional(),
18000
+ finalized: exports_external.boolean().optional(),
18001
+ toolProvider: NonEmptyString3.optional(),
18002
+ attempt: exports_external.number().int().positive().optional()
18003
+ });
18004
+ var PowerPathImportExternalTestAssignmentResultsParams = exports_external.object({
18005
+ student: NonEmptyString3,
18006
+ lesson: NonEmptyString3,
18007
+ applicationName: NonEmptyString3.optional()
18008
+ });
18009
+ var PowerPathPlacementQueryParams = exports_external.object({
18010
+ student: NonEmptyString3,
18011
+ subject: TimebackSubject
18012
+ });
18013
+ var PowerPathSyllabusQueryParams = exports_external.object({
18014
+ status: exports_external.enum(["active", "tobedeleted"]).optional()
18015
+ });
17569
18016
  // ../types/src/zod/qti.ts
17570
18017
  var QtiAssessmentItemType = exports_external.enum([
17571
18018
  "choice",
@@ -17818,9 +18265,24 @@ var QtiLessonFeedbackInput = exports_external.object({
17818
18265
  }).strict();
17819
18266
  // ../internal/cli-infra/src/config/timeback.ts
17820
18267
  var FILE_PATTERNS2 = ["timeback.config.ts", "timeback.config.js", "timeback.config.mjs"];
17821
- var jiti = createJiti(import.meta.url, { fsCache: false });
18268
+ var isBun = typeof globalThis.Bun !== "undefined";
18269
+ var jitiInstance = null;
18270
+ async function getJiti() {
18271
+ if (jitiInstance)
18272
+ return jitiInstance;
18273
+ const { createJiti } = await import("jiti");
18274
+ jitiInstance = createJiti(import.meta.url, { fsCache: false });
18275
+ return jitiInstance;
18276
+ }
17822
18277
  async function importModule(fullPath) {
17823
- const module = await jiti.import(fullPath);
18278
+ let module;
18279
+ if (isBun) {
18280
+ const fileUrl = pathToFileURL(fullPath).href;
18281
+ module = await import(fileUrl);
18282
+ } else {
18283
+ const jiti = await getJiti();
18284
+ module = await jiti.import(fullPath);
18285
+ }
17824
18286
  return module.default ?? module;
17825
18287
  }
17826
18288
  function deriveCourseIds(config3) {
@@ -18132,29 +18594,18 @@ function isValidUrl(url2) {
18132
18594
  return false;
18133
18595
  }
18134
18596
  }
18135
- async function promptSensors() {
18136
- const wantSensors = await ye({
18137
- message: "Add Caliper sensor URLs for event filtering?",
18138
- initialValue: false
18139
- });
18140
- if (isCancelled(wantSensors)) {
18141
- return;
18142
- }
18143
- if (!wantSensors) {
18144
- return [];
18145
- }
18597
+ async function promptSensor(options) {
18598
+ const { defaultValue } = options ?? {};
18146
18599
  const input = await he({
18147
- message: "Sensor URLs (comma-separated)",
18148
- placeholder: "https://myapp.example.com/caliper/sensors/activity",
18600
+ message: "Sensor URL (your app origin, used for activity tracking)",
18601
+ placeholder: "https://myapp.example.com",
18602
+ defaultValue,
18149
18603
  validate: (value) => {
18150
18604
  if (!value.trim()) {
18151
- return "Enter at least one sensor URL";
18605
+ return "Sensor URL is required for activity tracking";
18152
18606
  }
18153
- const urls = value.split(",").map((s) => s.trim());
18154
- for (const url2 of urls) {
18155
- if (!isValidUrl(url2)) {
18156
- return `Invalid URL: ${url2}`;
18157
- }
18607
+ if (!isValidUrl(value.trim())) {
18608
+ return "Invalid URL format";
18158
18609
  }
18159
18610
  return;
18160
18611
  }
@@ -18162,7 +18613,26 @@ async function promptSensors() {
18162
18613
  if (isCancelled(input)) {
18163
18614
  return;
18164
18615
  }
18165
- return input.split(",").map((s) => s.trim()).filter(Boolean);
18616
+ return input.trim();
18617
+ }
18618
+ // ../internal/cli-infra/src/sensors/utils.ts
18619
+ function deriveSensorsFromConfig(config3) {
18620
+ const sensors = new Set;
18621
+ if (config3.sensor) {
18622
+ sensors.add(config3.sensor);
18623
+ }
18624
+ for (const course of config3.courses) {
18625
+ if (course.sensor) {
18626
+ sensors.add(course.sensor);
18627
+ }
18628
+ if (course.overrides?.staging?.sensor) {
18629
+ sensors.add(course.overrides.staging.sensor);
18630
+ }
18631
+ if (course.overrides?.production?.sensor) {
18632
+ sensors.add(course.overrides.production.sensor);
18633
+ }
18634
+ }
18635
+ return Array.from(sensors);
18166
18636
  }
18167
18637
  // src/cli/commands/credentials/add.ts
18168
18638
  async function addCredentials(options = {}) {
@@ -18726,8 +19196,8 @@ async function promptImportApp(credentials, configuredEnvs) {
18726
19196
  if (!result.success) {
18727
19197
  return result;
18728
19198
  }
18729
- const sensors = await promptSensors();
18730
- if (sensors === undefined) {
19199
+ const sensor = await promptSensor();
19200
+ if (sensor === undefined) {
18731
19201
  return { success: false, cancelled: true };
18732
19202
  }
18733
19203
  return {
@@ -18735,7 +19205,7 @@ async function promptImportApp(credentials, configuredEnvs) {
18735
19205
  name: result.appName,
18736
19206
  courses: result.courses,
18737
19207
  environment: result.environment,
18738
- sensors: sensors.length > 0 ? sensors : undefined
19208
+ sensor
18739
19209
  };
18740
19210
  } catch (error48) {
18741
19211
  const message = error48 instanceof Error ? error48.message : "Unknown error";
@@ -18765,7 +19235,7 @@ async function promptNoConfig(credentials, configuredEnvs, opts = {}) {
18765
19235
  // src/cli/commands/serve/config.ts
18766
19236
  import { basename as basename2 } from "node:path";
18767
19237
  function buildUserConfigFromImport(result) {
18768
- const { name, courses, sensors } = result;
19238
+ const { name, courses, sensor } = result;
18769
19239
  const courseIds = {
18770
19240
  staging: [],
18771
19241
  production: []
@@ -18778,8 +19248,8 @@ function buildUserConfigFromImport(result) {
18778
19248
  }
18779
19249
  return {
18780
19250
  name,
19251
+ sensor,
18781
19252
  courses,
18782
- sensors,
18783
19253
  version: "0.0.0",
18784
19254
  path: "",
18785
19255
  courseIds
@@ -18853,17 +19323,16 @@ async function resolveFromConfigOrImport(credentials, configuredEnvs, defaultEnv
18853
19323
  function parseSensors(sensors) {
18854
19324
  return sensors.split(",").map((s) => s.trim()).filter(Boolean);
18855
19325
  }
18856
- function applyCliOverrides(config3, opts) {
19326
+ function getEffectiveSensors(config3, opts) {
18857
19327
  if (opts.sensors) {
18858
- config3.sensors = parseSensors(opts.sensors);
19328
+ return parseSensors(opts.sensors);
18859
19329
  }
19330
+ const derived = deriveSensorsFromConfig(config3);
19331
+ return derived.length > 0 ? derived : undefined;
18860
19332
  }
18861
19333
  async function resolveConfig(courseIds, opts, credentials, configuredEnvs, defaultEnv) {
18862
19334
  const parserOpts = { playcademy: opts.playcademy };
18863
19335
  const resolved = courseIds.length > 0 ? await resolveFromCourseIds(courseIds, defaultEnv, credentials, configuredEnvs) : await resolveFromConfigOrImport(credentials, configuredEnvs, defaultEnv, parserOpts);
18864
- if (!resolved)
18865
- return null;
18866
- applyCliOverrides(resolved.userConfig, opts);
18867
19336
  return resolved;
18868
19337
  }
18869
19338
 
@@ -22001,7 +22470,7 @@ function createEnvMiddleware(ctx, manager) {
22001
22470
  }, 400);
22002
22471
  }
22003
22472
  const client = manager.get(env2);
22004
- const sensors = ctx.userConfig.sensors;
22473
+ const sensors = ctx.derivedSensors;
22005
22474
  c.set("env", env2);
22006
22475
  c.set("client", client);
22007
22476
  c.set("sensors", sensors);
@@ -22540,7 +23009,8 @@ async function serveCommand(courseIds, opts) {
22540
23009
  serverConfig,
22541
23010
  userConfig: resolved.userConfig,
22542
23011
  credentials,
22543
- defaultEnvironment: resolved.environment
23012
+ defaultEnvironment: resolved.environment,
23013
+ derivedSensors: getEffectiveSensors(resolved.userConfig, opts)
22544
23014
  };
22545
23015
  startServer(ctx, serverConfig, resolved.configFile);
22546
23016
  }