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/index.js CHANGED
@@ -14776,7 +14776,7 @@ async function loadCredentials(environment) {
14776
14776
  }
14777
14777
  // ../internal/cli-infra/src/ui.ts
14778
14778
  function intro(title) {
14779
- console.log();
14779
+ console.log("");
14780
14780
  Ie(bgCyan(black(` ${title} `)));
14781
14781
  }
14782
14782
  var outro = {
@@ -14819,7 +14819,7 @@ var playcademyParser = {
14819
14819
  import { existsSync } from "node:fs";
14820
14820
  import { readFile as readFile2 } from "node:fs/promises";
14821
14821
  import { basename, relative, resolve } from "node:path";
14822
- import { createJiti } from "jiti";
14822
+ import { pathToFileURL } from "node:url";
14823
14823
  // ../types/src/zod/primitives.ts
14824
14824
  var IsoDateTimeRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
14825
14825
  var IsoDateTimeString = exports_external.string().min(1).regex(IsoDateTimeRegex, "must be a valid ISO 8601 datetime");
@@ -14879,6 +14879,47 @@ var OneRosterUserRole = exports_external.enum([
14879
14879
  "teacher"
14880
14880
  ]);
14881
14881
  var EnrollmentRole = exports_external.enum(["administrator", "proctor", "student", "teacher"]);
14882
+ var ResourceType = exports_external.enum([
14883
+ "qti",
14884
+ "text",
14885
+ "audio",
14886
+ "video",
14887
+ "interactive",
14888
+ "visual",
14889
+ "course-material",
14890
+ "assessment-bank"
14891
+ ]);
14892
+ var QtiSubType = exports_external.enum(["qti-test", "qti-question", "qti-stimulus", "qti-test-bank"]);
14893
+ var CourseMaterialSubType = exports_external.enum(["unit", "course", "resource-collection"]);
14894
+ var QuestionType = exports_external.enum([
14895
+ "choice",
14896
+ "order",
14897
+ "associate",
14898
+ "match",
14899
+ "hotspot",
14900
+ "hottext",
14901
+ "select-point",
14902
+ "graphic-order",
14903
+ "graphic-associate",
14904
+ "graphic-gap-match",
14905
+ "text-entry",
14906
+ "extended-text",
14907
+ "inline-choice",
14908
+ "upload",
14909
+ "slider",
14910
+ "drawing",
14911
+ "media",
14912
+ "custom"
14913
+ ]);
14914
+ var Difficulty = exports_external.enum(["easy", "medium", "hard"]);
14915
+ var LearningObjectiveSetSchema = exports_external.array(exports_external.object({
14916
+ source: exports_external.string(),
14917
+ learningObjectiveIds: exports_external.array(exports_external.string())
14918
+ }));
14919
+ var FastFailConfigSchema = exports_external.object({
14920
+ consecutive_failures: exports_external.number().int().min(1).optional(),
14921
+ stagnation_limit: exports_external.number().int().min(1).optional()
14922
+ }).optional();
14882
14923
  var LessonType = exports_external.enum(["powerpath-100", "quiz", "test-out", "placement", "unit-test", "alpha-read-article"]).nullable();
14883
14924
  var IMSErrorResponse = exports_external.object({
14884
14925
  imsx_codeMajor: exports_external.enum(["failure", "success"]),
@@ -14955,7 +14996,11 @@ var ActivityCompletedInput = exports_external.object({
14955
14996
  eventTime: IsoDateTimeString.optional(),
14956
14997
  metricsId: exports_external.string().optional(),
14957
14998
  id: exports_external.string().optional(),
14958
- extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
14999
+ extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
15000
+ attempt: exports_external.number().int().min(1).optional(),
15001
+ generatedExtensions: exports_external.object({
15002
+ pctCompleteApp: exports_external.number().optional()
15003
+ }).loose().optional()
14959
15004
  }).strict();
14960
15005
  var TimeSpentInput = exports_external.object({
14961
15006
  actor: TimebackUser,
@@ -15071,16 +15116,59 @@ var CourseDefaults = exports_external.object({
15071
15116
  level: exports_external.string().optional(),
15072
15117
  metadata: CourseMetadata.optional()
15073
15118
  });
15119
+ var CourseEnvOverrides = exports_external.object({
15120
+ level: exports_external.string().optional(),
15121
+ sensor: exports_external.string().url().optional(),
15122
+ launchUrl: exports_external.string().url().optional(),
15123
+ metadata: CourseMetadata.optional()
15124
+ });
15125
+ var CourseOverrides = exports_external.object({
15126
+ staging: CourseEnvOverrides.optional(),
15127
+ production: CourseEnvOverrides.optional()
15128
+ });
15074
15129
  var CourseConfig = CourseDefaults.extend({
15075
15130
  subject: TimebackSubject,
15076
- grade: TimebackGrade,
15077
- ids: CourseIds.nullable().optional()
15131
+ grade: TimebackGrade.optional(),
15132
+ ids: CourseIds.nullable().optional(),
15133
+ sensor: exports_external.string().url().optional(),
15134
+ launchUrl: exports_external.string().url().optional(),
15135
+ overrides: CourseOverrides.optional()
15078
15136
  });
15079
15137
  var TimebackConfig = exports_external.object({
15080
15138
  name: exports_external.string().min(1, "App name is required"),
15081
15139
  defaults: CourseDefaults.optional(),
15082
15140
  courses: exports_external.array(CourseConfig).min(1, "At least one course is required"),
15083
- sensors: exports_external.array(exports_external.string().url()).optional()
15141
+ sensor: exports_external.string().url().optional(),
15142
+ launchUrl: exports_external.string().url().optional()
15143
+ }).refine((config2) => {
15144
+ return config2.courses.every((c) => c.grade !== undefined || c.courseCode !== undefined);
15145
+ }, {
15146
+ message: "Each course must have either a grade or a courseCode",
15147
+ path: ["courses"]
15148
+ }).refine((config2) => {
15149
+ const withGrade = config2.courses.filter((c) => c.grade !== undefined);
15150
+ const keys = withGrade.map((c) => `${c.subject}:${c.grade}`);
15151
+ return new Set(keys).size === keys.length;
15152
+ }, {
15153
+ message: "Duplicate (subject, grade) pair found; each must be unique",
15154
+ path: ["courses"]
15155
+ }).refine((config2) => {
15156
+ const withCode = config2.courses.filter((c) => c.courseCode !== undefined);
15157
+ const codes = withCode.map((c) => c.courseCode);
15158
+ return new Set(codes).size === codes.length;
15159
+ }, {
15160
+ message: "Duplicate courseCode found; each must be unique",
15161
+ path: ["courses"]
15162
+ }).refine((config2) => {
15163
+ return config2.courses.every((c) => c.sensor !== undefined || config2.sensor !== undefined);
15164
+ }, {
15165
+ message: "Each course must have an effective sensor; set a top-level `sensor` or per-course `sensor`",
15166
+ path: ["courses"]
15167
+ }).refine((config2) => {
15168
+ return config2.courses.every((c) => c.launchUrl !== undefined || config2.launchUrl !== undefined);
15169
+ }, {
15170
+ message: "Each course must have an effective launchUrl; set a top-level `launchUrl` or per-course `launchUrl`",
15171
+ path: ["courses"]
15084
15172
  });
15085
15173
  // ../types/src/zod/edubridge.ts
15086
15174
  var EdubridgeDateString = exports_external.union([IsoDateString, IsoDateTimeString]);
@@ -15331,20 +15419,45 @@ var OneRosterScoreScaleCreateInput = exports_external.object({
15331
15419
  }).strict();
15332
15420
  var OneRosterAssessmentLineItemCreateInput = exports_external.object({
15333
15421
  sourcedId: NonEmptyString2.optional(),
15422
+ status: Status.optional(),
15423
+ dateLastModified: IsoDateTimeString.optional(),
15334
15424
  title: NonEmptyString2.describe("title must be a non-empty string"),
15335
- class: Ref,
15336
- school: Ref,
15337
- category: Ref,
15338
- assignDate: OneRosterDateString,
15339
- dueDate: OneRosterDateString,
15340
- status: Status,
15425
+ description: exports_external.string().nullable().optional(),
15426
+ class: Ref.nullable().optional(),
15427
+ parentAssessmentLineItem: Ref.nullable().optional(),
15428
+ scoreScale: Ref.nullable().optional(),
15429
+ resultValueMin: exports_external.number().nullable().optional(),
15430
+ resultValueMax: exports_external.number().nullable().optional(),
15431
+ component: Ref.nullable().optional(),
15432
+ componentResource: Ref.nullable().optional(),
15433
+ learningObjectiveSet: exports_external.array(exports_external.object({
15434
+ source: exports_external.string(),
15435
+ learningObjectiveIds: exports_external.array(exports_external.string())
15436
+ })).optional().nullable(),
15437
+ course: Ref.nullable().optional(),
15341
15438
  metadata: Metadata
15342
15439
  }).strict();
15440
+ var LearningObjectiveResult = exports_external.object({
15441
+ learningObjectiveId: exports_external.string(),
15442
+ score: exports_external.number().optional(),
15443
+ textScore: exports_external.string().optional()
15444
+ });
15445
+ var LearningObjectiveScoreSetSchema = exports_external.array(exports_external.object({
15446
+ source: exports_external.string(),
15447
+ learningObjectiveResults: exports_external.array(LearningObjectiveResult)
15448
+ }));
15343
15449
  var OneRosterAssessmentResultCreateInput = exports_external.object({
15344
15450
  sourcedId: NonEmptyString2.optional(),
15345
- lineItem: Ref,
15451
+ status: Status.optional(),
15452
+ dateLastModified: IsoDateTimeString.optional(),
15453
+ metadata: Metadata,
15454
+ assessmentLineItem: Ref,
15346
15455
  student: Ref,
15347
- scoreDate: OneRosterDateString,
15456
+ score: exports_external.number().nullable().optional(),
15457
+ textScore: exports_external.string().nullable().optional(),
15458
+ scoreDate: exports_external.string().datetime(),
15459
+ scoreScale: Ref.nullable().optional(),
15460
+ scorePercentile: exports_external.number().nullable().optional(),
15348
15461
  scoreStatus: exports_external.enum([
15349
15462
  "exempt",
15350
15463
  "fully graded",
@@ -15352,9 +15465,12 @@ var OneRosterAssessmentResultCreateInput = exports_external.object({
15352
15465
  "partially graded",
15353
15466
  "submitted"
15354
15467
  ]),
15355
- score: exports_external.string().optional(),
15356
- status: Status,
15357
- metadata: Metadata
15468
+ comment: exports_external.string().nullable().optional(),
15469
+ learningObjectiveSet: LearningObjectiveScoreSetSchema.nullable().optional(),
15470
+ inProgress: exports_external.string().nullable().optional(),
15471
+ incomplete: exports_external.string().nullable().optional(),
15472
+ late: exports_external.string().nullable().optional(),
15473
+ missing: exports_external.string().nullable().optional()
15358
15474
  }).strict();
15359
15475
  var OneRosterOrgCreateInput = exports_external.object({
15360
15476
  sourcedId: NonEmptyString2.optional(),
@@ -15422,6 +15538,75 @@ var OneRosterCredentialInput = exports_external.object({
15422
15538
  var OneRosterDemographicsCreateInput = exports_external.object({
15423
15539
  sourcedId: NonEmptyString2.describe("sourcedId must be a non-empty string")
15424
15540
  }).loose();
15541
+ var CommonResourceMetadataSchema = exports_external.object({
15542
+ type: ResourceType,
15543
+ subject: TimebackSubject.nullish(),
15544
+ grades: exports_external.array(TimebackGrade).nullish(),
15545
+ language: exports_external.string().nullish(),
15546
+ xp: exports_external.number().nullish(),
15547
+ url: exports_external.url().nullish(),
15548
+ keywords: exports_external.array(exports_external.string()).nullish(),
15549
+ learningObjectiveSet: LearningObjectiveSetSchema.nullish(),
15550
+ lessonType: exports_external.string().nullish()
15551
+ }).passthrough();
15552
+ var QtiMetadataSchema = CommonResourceMetadataSchema.extend({
15553
+ type: exports_external.literal("qti"),
15554
+ subType: QtiSubType,
15555
+ questionType: QuestionType.optional(),
15556
+ difficulty: Difficulty.optional()
15557
+ });
15558
+ var TextMetadataSchema = CommonResourceMetadataSchema.extend({
15559
+ type: exports_external.literal("text"),
15560
+ format: exports_external.string(),
15561
+ author: exports_external.string().optional(),
15562
+ pageCount: exports_external.number().optional()
15563
+ });
15564
+ var AudioMetadataSchema = CommonResourceMetadataSchema.extend({
15565
+ type: exports_external.literal("audio"),
15566
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
15567
+ format: exports_external.string(),
15568
+ speaker: exports_external.string().optional()
15569
+ });
15570
+ var VideoMetadataSchema = CommonResourceMetadataSchema.extend({
15571
+ type: exports_external.literal("video"),
15572
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
15573
+ captionsAvailable: exports_external.boolean().optional(),
15574
+ format: exports_external.string()
15575
+ });
15576
+ var InteractiveMetadataSchema = CommonResourceMetadataSchema.extend({
15577
+ type: exports_external.literal("interactive"),
15578
+ launchUrl: exports_external.url().optional(),
15579
+ toolProvider: exports_external.string().optional(),
15580
+ instructionalMethod: exports_external.string().optional(),
15581
+ courseIdOnFail: exports_external.string().nullable().optional(),
15582
+ fail_fast: FastFailConfigSchema
15583
+ });
15584
+ var VisualMetadataSchema = CommonResourceMetadataSchema.extend({
15585
+ type: exports_external.literal("visual"),
15586
+ format: exports_external.string(),
15587
+ resolution: exports_external.string().optional()
15588
+ });
15589
+ var CourseMaterialMetadataSchema = CommonResourceMetadataSchema.extend({
15590
+ type: exports_external.literal("course-material"),
15591
+ subType: CourseMaterialSubType,
15592
+ author: exports_external.string().optional(),
15593
+ format: exports_external.string(),
15594
+ instructionalMethod: exports_external.string().optional()
15595
+ });
15596
+ var AssessmentBankMetadataSchema = CommonResourceMetadataSchema.extend({
15597
+ type: exports_external.literal("assessment-bank"),
15598
+ resources: exports_external.array(exports_external.string())
15599
+ });
15600
+ var ResourceMetadataSchema = exports_external.discriminatedUnion("type", [
15601
+ QtiMetadataSchema,
15602
+ TextMetadataSchema,
15603
+ AudioMetadataSchema,
15604
+ VideoMetadataSchema,
15605
+ InteractiveMetadataSchema,
15606
+ VisualMetadataSchema,
15607
+ CourseMaterialMetadataSchema,
15608
+ AssessmentBankMetadataSchema
15609
+ ]);
15425
15610
  var OneRosterResourceCreateInput = exports_external.object({
15426
15611
  sourcedId: NonEmptyString2.optional(),
15427
15612
  title: NonEmptyString2.describe("title must be a non-empty string"),
@@ -15431,7 +15616,7 @@ var OneRosterResourceCreateInput = exports_external.object({
15431
15616
  vendorId: exports_external.string().optional(),
15432
15617
  applicationId: exports_external.string().optional(),
15433
15618
  status: Status.optional(),
15434
- metadata: Metadata
15619
+ metadata: ResourceMetadataSchema.nullable().optional()
15435
15620
  }).strict();
15436
15621
  var CourseStructureItem = exports_external.object({
15437
15622
  url: NonEmptyString2.describe("courseStructure.url must be a non-empty string"),
@@ -15456,6 +15641,268 @@ var OneRosterBulkResultItem = exports_external.object({
15456
15641
  student: Ref
15457
15642
  }).loose();
15458
15643
  var OneRosterBulkResultsInput = exports_external.array(OneRosterBulkResultItem).min(1, "results must have at least one item");
15644
+ // ../types/src/zod/powerpath.ts
15645
+ var NonEmptyString3 = exports_external.string().trim().min(1);
15646
+ var ToolProvider = exports_external.enum(["edulastic", "mastery-track"]);
15647
+ var LessonTypeRequired = exports_external.enum([
15648
+ "powerpath-100",
15649
+ "quiz",
15650
+ "test-out",
15651
+ "placement",
15652
+ "unit-test",
15653
+ "alpha-read-article"
15654
+ ]);
15655
+ var GradeArray = exports_external.array(TimebackGrade);
15656
+ var ResourceMetadata = exports_external.record(exports_external.string(), exports_external.unknown()).optional();
15657
+ var ExternalTestBase = exports_external.object({
15658
+ courseId: NonEmptyString3,
15659
+ lessonTitle: NonEmptyString3.optional(),
15660
+ launchUrl: exports_external.url().optional(),
15661
+ toolProvider: ToolProvider,
15662
+ unitTitle: NonEmptyString3.optional(),
15663
+ courseComponentSourcedId: NonEmptyString3.optional(),
15664
+ vendorId: NonEmptyString3.optional(),
15665
+ description: NonEmptyString3.optional(),
15666
+ resourceMetadata: ResourceMetadata.nullable().optional(),
15667
+ grades: GradeArray
15668
+ });
15669
+ var ExternalTestOut = ExternalTestBase.extend({
15670
+ lessonType: exports_external.literal("test-out"),
15671
+ xp: exports_external.number()
15672
+ });
15673
+ var ExternalPlacement = ExternalTestBase.extend({
15674
+ lessonType: exports_external.literal("placement"),
15675
+ courseIdOnFail: NonEmptyString3.optional(),
15676
+ xp: exports_external.number().optional()
15677
+ });
15678
+ var InternalTestBase = exports_external.object({
15679
+ courseId: NonEmptyString3,
15680
+ lessonType: LessonTypeRequired,
15681
+ lessonTitle: NonEmptyString3.optional(),
15682
+ unitTitle: NonEmptyString3.optional(),
15683
+ courseComponentSourcedId: NonEmptyString3.optional(),
15684
+ resourceMetadata: ResourceMetadata.nullable().optional(),
15685
+ xp: exports_external.number().optional(),
15686
+ grades: GradeArray.optional(),
15687
+ courseIdOnFail: NonEmptyString3.optional()
15688
+ });
15689
+ var PowerPathCreateInternalTestInput = exports_external.union([
15690
+ InternalTestBase.extend({
15691
+ testType: exports_external.literal("qti"),
15692
+ qti: exports_external.object({
15693
+ url: exports_external.url(),
15694
+ title: NonEmptyString3.optional(),
15695
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15696
+ })
15697
+ }),
15698
+ InternalTestBase.extend({
15699
+ testType: exports_external.literal("assessment-bank"),
15700
+ assessmentBank: exports_external.object({
15701
+ resources: exports_external.array(exports_external.object({
15702
+ url: exports_external.url(),
15703
+ title: NonEmptyString3.optional(),
15704
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15705
+ }))
15706
+ })
15707
+ })
15708
+ ]);
15709
+ var PowerPathCreateNewAttemptInput = exports_external.object({
15710
+ student: NonEmptyString3,
15711
+ lesson: NonEmptyString3
15712
+ });
15713
+ var PowerPathFinalStudentAssessmentResponseInput = exports_external.object({
15714
+ student: NonEmptyString3,
15715
+ lesson: NonEmptyString3
15716
+ });
15717
+ var PowerPathLessonPlansCreateInput = exports_external.object({
15718
+ courseId: NonEmptyString3,
15719
+ userId: NonEmptyString3,
15720
+ classId: NonEmptyString3.optional()
15721
+ });
15722
+ var LessonPlanTarget = exports_external.object({
15723
+ type: exports_external.enum(["component", "resource"]),
15724
+ id: NonEmptyString3
15725
+ });
15726
+ var PowerPathLessonPlanOperationInput = exports_external.union([
15727
+ exports_external.object({
15728
+ type: exports_external.literal("set-skipped"),
15729
+ payload: exports_external.object({
15730
+ target: LessonPlanTarget,
15731
+ value: exports_external.boolean()
15732
+ })
15733
+ }),
15734
+ exports_external.object({
15735
+ type: exports_external.literal("add-custom-resource"),
15736
+ payload: exports_external.object({
15737
+ resource_id: NonEmptyString3,
15738
+ parent_component_id: NonEmptyString3,
15739
+ skipped: exports_external.boolean().optional()
15740
+ })
15741
+ }),
15742
+ exports_external.object({
15743
+ type: exports_external.literal("move-item-before"),
15744
+ payload: exports_external.object({
15745
+ target: LessonPlanTarget,
15746
+ reference_id: NonEmptyString3
15747
+ })
15748
+ }),
15749
+ exports_external.object({
15750
+ type: exports_external.literal("move-item-after"),
15751
+ payload: exports_external.object({
15752
+ target: LessonPlanTarget,
15753
+ reference_id: NonEmptyString3
15754
+ })
15755
+ }),
15756
+ exports_external.object({
15757
+ type: exports_external.literal("move-item-to-start"),
15758
+ payload: exports_external.object({
15759
+ target: LessonPlanTarget
15760
+ })
15761
+ }),
15762
+ exports_external.object({
15763
+ type: exports_external.literal("move-item-to-end"),
15764
+ payload: exports_external.object({
15765
+ target: LessonPlanTarget
15766
+ })
15767
+ }),
15768
+ exports_external.object({
15769
+ type: exports_external.literal("change-item-parent"),
15770
+ payload: exports_external.object({
15771
+ target: LessonPlanTarget,
15772
+ new_parent_id: NonEmptyString3,
15773
+ position: exports_external.enum(["start", "end"]).optional()
15774
+ })
15775
+ })
15776
+ ]);
15777
+ var PowerPathLessonPlanOperationsInput = exports_external.object({
15778
+ operation: exports_external.array(PowerPathLessonPlanOperationInput),
15779
+ reason: NonEmptyString3.optional()
15780
+ });
15781
+ var PowerPathLessonPlanUpdateStudentItemResponseInput = exports_external.object({
15782
+ studentId: NonEmptyString3,
15783
+ componentResourceId: NonEmptyString3,
15784
+ result: exports_external.object({
15785
+ status: exports_external.enum(["active", "tobedeleted"]),
15786
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
15787
+ score: exports_external.number().optional(),
15788
+ textScore: NonEmptyString3.optional(),
15789
+ scoreDate: NonEmptyString3,
15790
+ scorePercentile: exports_external.number().optional(),
15791
+ scoreStatus: ScoreStatus,
15792
+ comment: NonEmptyString3.optional(),
15793
+ learningObjectiveSet: exports_external.array(exports_external.object({
15794
+ source: NonEmptyString3,
15795
+ learningObjectiveResults: exports_external.array(exports_external.object({
15796
+ learningObjectiveId: NonEmptyString3,
15797
+ score: exports_external.number().optional(),
15798
+ textScore: NonEmptyString3.optional()
15799
+ }))
15800
+ })).optional(),
15801
+ inProgress: NonEmptyString3.optional(),
15802
+ incomplete: NonEmptyString3.optional(),
15803
+ late: NonEmptyString3.optional(),
15804
+ missing: NonEmptyString3.optional()
15805
+ })
15806
+ });
15807
+ var PowerPathMakeExternalTestAssignmentInput = exports_external.object({
15808
+ student: NonEmptyString3,
15809
+ lesson: NonEmptyString3,
15810
+ applicationName: NonEmptyString3.optional(),
15811
+ testId: NonEmptyString3.optional(),
15812
+ skipCourseEnrollment: exports_external.boolean().optional()
15813
+ });
15814
+ var PowerPathPlacementResetUserPlacementInput = exports_external.object({
15815
+ student: NonEmptyString3,
15816
+ subject: TimebackSubject
15817
+ });
15818
+ var PowerPathResetAttemptInput = exports_external.object({
15819
+ student: NonEmptyString3,
15820
+ lesson: NonEmptyString3
15821
+ });
15822
+ var PowerPathScreeningResetSessionInput = exports_external.object({
15823
+ userId: NonEmptyString3
15824
+ });
15825
+ var PowerPathScreeningAssignTestInput = exports_external.object({
15826
+ userId: NonEmptyString3,
15827
+ subject: exports_external.enum(["Math", "Reading", "Language", "Science"])
15828
+ });
15829
+ var PowerPathTestAssignmentsCreateInput = exports_external.object({
15830
+ student: NonEmptyString3,
15831
+ subject: TimebackSubject,
15832
+ grade: TimebackGrade,
15833
+ testName: NonEmptyString3.optional()
15834
+ });
15835
+ var PowerPathTestAssignmentsUpdateInput = exports_external.object({
15836
+ testName: NonEmptyString3
15837
+ });
15838
+ var PowerPathTestAssignmentItemInput = exports_external.object({
15839
+ student: NonEmptyString3,
15840
+ subject: TimebackSubject,
15841
+ grade: TimebackGrade,
15842
+ testName: NonEmptyString3.optional()
15843
+ });
15844
+ var PowerPathTestAssignmentsBulkInput = exports_external.object({
15845
+ items: exports_external.array(PowerPathTestAssignmentItemInput)
15846
+ });
15847
+ var PowerPathTestAssignmentsImportInput = exports_external.object({
15848
+ spreadsheetUrl: exports_external.url(),
15849
+ sheet: NonEmptyString3
15850
+ });
15851
+ var PowerPathTestAssignmentsListParams = exports_external.object({
15852
+ student: NonEmptyString3,
15853
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
15854
+ subject: NonEmptyString3.optional(),
15855
+ grade: TimebackGrade.optional(),
15856
+ limit: exports_external.number().int().positive().max(3000).optional(),
15857
+ offset: exports_external.number().int().nonnegative().optional()
15858
+ });
15859
+ var PowerPathTestAssignmentsAdminParams = exports_external.object({
15860
+ student: NonEmptyString3.optional(),
15861
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
15862
+ subject: NonEmptyString3.optional(),
15863
+ grade: TimebackGrade.optional(),
15864
+ limit: exports_external.number().int().positive().max(3000).optional(),
15865
+ offset: exports_external.number().int().nonnegative().optional()
15866
+ });
15867
+ var PowerPathUpdateStudentQuestionResponseInput = exports_external.object({
15868
+ student: NonEmptyString3,
15869
+ question: NonEmptyString3,
15870
+ response: exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)]).optional(),
15871
+ responses: exports_external.record(exports_external.string(), exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)])).optional(),
15872
+ lesson: NonEmptyString3
15873
+ });
15874
+ var PowerPathGetAssessmentProgressParams = exports_external.object({
15875
+ student: NonEmptyString3,
15876
+ lesson: NonEmptyString3,
15877
+ attempt: exports_external.number().int().positive().optional()
15878
+ });
15879
+ var PowerPathGetNextQuestionParams = exports_external.object({
15880
+ student: NonEmptyString3,
15881
+ lesson: NonEmptyString3
15882
+ });
15883
+ var PowerPathGetAttemptsParams = exports_external.object({
15884
+ student: NonEmptyString3,
15885
+ lesson: NonEmptyString3
15886
+ });
15887
+ var PowerPathTestOutParams = exports_external.object({
15888
+ student: NonEmptyString3,
15889
+ lesson: NonEmptyString3.optional(),
15890
+ finalized: exports_external.boolean().optional(),
15891
+ toolProvider: NonEmptyString3.optional(),
15892
+ attempt: exports_external.number().int().positive().optional()
15893
+ });
15894
+ var PowerPathImportExternalTestAssignmentResultsParams = exports_external.object({
15895
+ student: NonEmptyString3,
15896
+ lesson: NonEmptyString3,
15897
+ applicationName: NonEmptyString3.optional()
15898
+ });
15899
+ var PowerPathPlacementQueryParams = exports_external.object({
15900
+ student: NonEmptyString3,
15901
+ subject: TimebackSubject
15902
+ });
15903
+ var PowerPathSyllabusQueryParams = exports_external.object({
15904
+ status: exports_external.enum(["active", "tobedeleted"]).optional()
15905
+ });
15459
15906
  // ../types/src/zod/qti.ts
15460
15907
  var QtiAssessmentItemType = exports_external.enum([
15461
15908
  "choice",
@@ -15708,9 +16155,24 @@ var QtiLessonFeedbackInput = exports_external.object({
15708
16155
  }).strict();
15709
16156
  // ../internal/cli-infra/src/config/timeback.ts
15710
16157
  var FILE_PATTERNS2 = ["timeback.config.ts", "timeback.config.js", "timeback.config.mjs"];
15711
- var jiti = createJiti(import.meta.url, { fsCache: false });
16158
+ var isBun = typeof globalThis.Bun !== "undefined";
16159
+ var jitiInstance = null;
16160
+ async function getJiti() {
16161
+ if (jitiInstance)
16162
+ return jitiInstance;
16163
+ const { createJiti } = await import("jiti");
16164
+ jitiInstance = createJiti(import.meta.url, { fsCache: false });
16165
+ return jitiInstance;
16166
+ }
15712
16167
  async function importModule(fullPath) {
15713
- const module = await jiti.import(fullPath);
16168
+ let module;
16169
+ if (isBun) {
16170
+ const fileUrl = pathToFileURL(fullPath).href;
16171
+ module = await import(fileUrl);
16172
+ } else {
16173
+ const jiti = await getJiti();
16174
+ module = await jiti.import(fullPath);
16175
+ }
15714
16176
  return module.default ?? module;
15715
16177
  }
15716
16178
  function deriveCourseIds(config3) {
@@ -16022,29 +16484,18 @@ function isValidUrl(url2) {
16022
16484
  return false;
16023
16485
  }
16024
16486
  }
16025
- async function promptSensors() {
16026
- const wantSensors = await ye({
16027
- message: "Add Caliper sensor URLs for event filtering?",
16028
- initialValue: false
16029
- });
16030
- if (isCancelled(wantSensors)) {
16031
- return;
16032
- }
16033
- if (!wantSensors) {
16034
- return [];
16035
- }
16487
+ async function promptSensor(options) {
16488
+ const { defaultValue } = options ?? {};
16036
16489
  const input = await he({
16037
- message: "Sensor URLs (comma-separated)",
16038
- placeholder: "https://myapp.example.com/caliper/sensors/activity",
16490
+ message: "Sensor URL (your app origin, used for activity tracking)",
16491
+ placeholder: "https://myapp.example.com",
16492
+ defaultValue,
16039
16493
  validate: (value) => {
16040
16494
  if (!value.trim()) {
16041
- return "Enter at least one sensor URL";
16495
+ return "Sensor URL is required for activity tracking";
16042
16496
  }
16043
- const urls = value.split(",").map((s) => s.trim());
16044
- for (const url2 of urls) {
16045
- if (!isValidUrl(url2)) {
16046
- return `Invalid URL: ${url2}`;
16047
- }
16497
+ if (!isValidUrl(value.trim())) {
16498
+ return "Invalid URL format";
16048
16499
  }
16049
16500
  return;
16050
16501
  }
@@ -16052,7 +16503,26 @@ async function promptSensors() {
16052
16503
  if (isCancelled(input)) {
16053
16504
  return;
16054
16505
  }
16055
- return input.split(",").map((s) => s.trim()).filter(Boolean);
16506
+ return input.trim();
16507
+ }
16508
+ // ../internal/cli-infra/src/sensors/utils.ts
16509
+ function deriveSensorsFromConfig(config3) {
16510
+ const sensors = new Set;
16511
+ if (config3.sensor) {
16512
+ sensors.add(config3.sensor);
16513
+ }
16514
+ for (const course of config3.courses) {
16515
+ if (course.sensor) {
16516
+ sensors.add(course.sensor);
16517
+ }
16518
+ if (course.overrides?.staging?.sensor) {
16519
+ sensors.add(course.overrides.staging.sensor);
16520
+ }
16521
+ if (course.overrides?.production?.sensor) {
16522
+ sensors.add(course.overrides.production.sensor);
16523
+ }
16524
+ }
16525
+ return Array.from(sensors);
16056
16526
  }
16057
16527
  // src/config/constants.ts
16058
16528
  var configValues = {
@@ -16616,8 +17086,8 @@ async function promptImportApp(credentials, configuredEnvs) {
16616
17086
  if (!result.success) {
16617
17087
  return result;
16618
17088
  }
16619
- const sensors = await promptSensors();
16620
- if (sensors === undefined) {
17089
+ const sensor = await promptSensor();
17090
+ if (sensor === undefined) {
16621
17091
  return { success: false, cancelled: true };
16622
17092
  }
16623
17093
  return {
@@ -16625,7 +17095,7 @@ async function promptImportApp(credentials, configuredEnvs) {
16625
17095
  name: result.appName,
16626
17096
  courses: result.courses,
16627
17097
  environment: result.environment,
16628
- sensors: sensors.length > 0 ? sensors : undefined
17098
+ sensor
16629
17099
  };
16630
17100
  } catch (error48) {
16631
17101
  const message = error48 instanceof Error ? error48.message : "Unknown error";
@@ -16655,7 +17125,7 @@ async function promptNoConfig(credentials, configuredEnvs, opts = {}) {
16655
17125
  // src/cli/commands/serve/config.ts
16656
17126
  import { basename as basename2 } from "node:path";
16657
17127
  function buildUserConfigFromImport(result) {
16658
- const { name, courses, sensors } = result;
17128
+ const { name, courses, sensor } = result;
16659
17129
  const courseIds = {
16660
17130
  staging: [],
16661
17131
  production: []
@@ -16668,8 +17138,8 @@ function buildUserConfigFromImport(result) {
16668
17138
  }
16669
17139
  return {
16670
17140
  name,
17141
+ sensor,
16671
17142
  courses,
16672
- sensors,
16673
17143
  version: "0.0.0",
16674
17144
  path: "",
16675
17145
  courseIds
@@ -16743,17 +17213,16 @@ async function resolveFromConfigOrImport(credentials, configuredEnvs, defaultEnv
16743
17213
  function parseSensors(sensors) {
16744
17214
  return sensors.split(",").map((s) => s.trim()).filter(Boolean);
16745
17215
  }
16746
- function applyCliOverrides(config3, opts) {
17216
+ function getEffectiveSensors(config3, opts) {
16747
17217
  if (opts.sensors) {
16748
- config3.sensors = parseSensors(opts.sensors);
17218
+ return parseSensors(opts.sensors);
16749
17219
  }
17220
+ const derived = deriveSensorsFromConfig(config3);
17221
+ return derived.length > 0 ? derived : undefined;
16750
17222
  }
16751
17223
  async function resolveConfig(courseIds, opts, credentials, configuredEnvs, defaultEnv) {
16752
17224
  const parserOpts = { playcademy: opts.playcademy };
16753
17225
  const resolved = courseIds.length > 0 ? await resolveFromCourseIds(courseIds, defaultEnv, credentials, configuredEnvs) : await resolveFromConfigOrImport(credentials, configuredEnvs, defaultEnv, parserOpts);
16754
- if (!resolved)
16755
- return null;
16756
- applyCliOverrides(resolved.userConfig, opts);
16757
17226
  return resolved;
16758
17227
  }
16759
17228
 
@@ -19891,7 +20360,7 @@ function createEnvMiddleware(ctx, manager) {
19891
20360
  }, 400);
19892
20361
  }
19893
20362
  const client = manager.get(env2);
19894
- const sensors = ctx.userConfig.sensors;
20363
+ const sensors = ctx.derivedSensors;
19895
20364
  c.set("env", env2);
19896
20365
  c.set("client", client);
19897
20366
  c.set("sensors", sensors);
@@ -20430,7 +20899,8 @@ async function serveCommand(courseIds, opts) {
20430
20899
  serverConfig,
20431
20900
  userConfig: resolved.userConfig,
20432
20901
  credentials,
20433
- defaultEnvironment: resolved.environment
20902
+ defaultEnvironment: resolved.environment,
20903
+ derivedSensors: getEffectiveSensors(resolved.userConfig, opts)
20434
20904
  };
20435
20905
  startServer(ctx, serverConfig, resolved.configFile);
20436
20906
  }