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 +522 -52
- package/dist/cli/commands/serve/config.d.ts +9 -3
- package/dist/cli/commands/serve/config.d.ts.map +1 -1
- package/dist/cli/commands/serve/index.d.ts.map +1 -1
- package/dist/cli/lib/onboarding/import.d.ts.map +1 -1
- package/dist/cli/lib/onboarding/types.d.ts +1 -1
- package/dist/cli/lib/onboarding/types.d.ts.map +1 -1
- package/dist/config/types.d.ts +1 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/index.js +522 -52
- package/dist/server/controllers/status.d.ts +57 -2
- package/dist/server/controllers/status.d.ts.map +1 -1
- package/dist/server/lib/middleware.d.ts.map +1 -1
- package/package.json +2 -2
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 {
|
|
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
|
-
|
|
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
|
-
|
|
15336
|
-
|
|
15337
|
-
|
|
15338
|
-
|
|
15339
|
-
|
|
15340
|
-
|
|
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
|
-
|
|
15451
|
+
status: Status.optional(),
|
|
15452
|
+
dateLastModified: IsoDateTimeString.optional(),
|
|
15453
|
+
metadata: Metadata,
|
|
15454
|
+
assessmentLineItem: Ref,
|
|
15346
15455
|
student: Ref,
|
|
15347
|
-
|
|
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
|
-
|
|
15356
|
-
|
|
15357
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
16026
|
-
const
|
|
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
|
|
16038
|
-
placeholder: "https://myapp.example.com
|
|
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 "
|
|
16495
|
+
return "Sensor URL is required for activity tracking";
|
|
16042
16496
|
}
|
|
16043
|
-
|
|
16044
|
-
|
|
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.
|
|
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
|
|
16620
|
-
if (
|
|
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
|
-
|
|
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,
|
|
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
|
|
17216
|
+
function getEffectiveSensors(config3, opts) {
|
|
16747
17217
|
if (opts.sensors) {
|
|
16748
|
-
|
|
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.
|
|
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
|
}
|