@timeback/core 0.2.1-beta.20260314151810 → 0.2.1-beta.20260315040428

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.
@@ -7,7 +7,7 @@ import {
7
7
  validateNonEmptyString,
8
8
  validateUuid,
9
9
  validateWithSchema
10
- } from "./chunk-k030r9e8.js";
10
+ } from "./chunk-qt3x4rwv.js";
11
11
 
12
12
  // ../edubridge/src/utils.ts
13
13
  var log = createScopedLogger("edubridge");
@@ -793,7 +793,9 @@ var EduBridgeEnrollment = z7.object({
793
793
  school: z7.object({
794
794
  id: z7.string(),
795
795
  name: z7.string()
796
- })
796
+ }),
797
+ testOutSupported: z7.boolean(),
798
+ testOutEligible: z7.boolean()
797
799
  });
798
800
  var SubjectMetrics = z7.object({
799
801
  activityMetrics: z7.object({
@@ -1591,6 +1593,10 @@ var PowerPathPlacementQueryParams = z10.object({
1591
1593
  student: NonEmptyString,
1592
1594
  subject: TimebackSubject
1593
1595
  });
1596
+ var PowerPathMakeExternalStudentTestOutAssignmentInput = z10.object({
1597
+ oneRosterSourcedId: NonEmptyString,
1598
+ subject: NonEmptyString
1599
+ });
1594
1600
  var PowerPathRenderConfigUpsertInput = z10.object({
1595
1601
  courseIds: z10.array(NonEmptyString).min(1),
1596
1602
  rendererId: NonEmptyString,
@@ -1863,6 +1869,23 @@ var QtiLessonFeedbackInput = z11.object({
1863
1869
  lessonId: NonEmptyString,
1864
1870
  humanApproved: z11.boolean().optional()
1865
1871
  }).strict();
1872
+ // ../../types/src/zod/reporting.ts
1873
+ import { z as z12 } from "zod/v4";
1874
+ var ReportingAuthMode = z12.enum(["creator_only", "same_org", "all_orgs"]);
1875
+ var ReportingSavedQueryId = z12.string().uuid();
1876
+ var ReportingUserEmail = z12.email();
1877
+ var ReportingQueryInput = z12.object({
1878
+ sql: NonEmptyString
1879
+ });
1880
+ var PersistReportingQueryInput = z12.object({
1881
+ endpointName: NonEmptyString,
1882
+ sql: NonEmptyString,
1883
+ authMode: ReportingAuthMode,
1884
+ description: NonEmptyString.optional()
1885
+ });
1886
+ var RemoveReportingQueryInput = z12.object({
1887
+ endpointId: ReportingSavedQueryId
1888
+ });
1866
1889
  // ../edubridge/src/resources/analytics.ts
1867
1890
  class AnalyticsResource {
1868
1891
  transport;
@@ -2127,4 +2150,4 @@ function createEdubridgeClient(registry = DEFAULT_PROVIDER_REGISTRY) {
2127
2150
 
2128
2151
  // ../edubridge/src/client.ts
2129
2152
  var EdubridgeClient = createEdubridgeClient();
2130
- export { ActivityCompletedInput, TimeSpentInput, CaliperEnvelopeInput, CaliperSendEventsInput, CaliperListEventsParams, QuestionSeenInput, QuestionAnsweredInput, QuestionGradedInput, WebhookCreateInput, WebhookUpdateInput, WebhookFilterCreateInput, WebhookFilterUpdateInput, CasePackageInput, ClrCredentialInput, OneRosterUserCreateInput, OneRosterCourseCreateInput, OneRosterClassCreateInput, OneRosterEnrollmentCreateInput, OneRosterCategoryCreateInput, OneRosterLineItemCreateInput, OneRosterResultCreateInput, OneRosterScoreScaleCreateInput, OneRosterAssessmentLineItemCreateInput, OneRosterAssessmentResultCreateInput, OneRosterOrgCreateInput, OneRosterSchoolCreateInput, OneRosterAcademicSessionCreateInput, OneRosterComponentResourceCreateInput, OneRosterCourseComponentCreateInput, OneRosterEnrollInput, OneRosterAgentInput, OneRosterCredentialInput, OneRosterDemographicsCreateInput, OneRosterResourceCreateInput, OneRosterCourseStructureInput, OneRosterBulkResultsInput, PowerPathCreateExternalPlacementTestInput, PowerPathCreateExternalTestOutInput, PowerPathCreateInternalTestInput, PowerPathCreateNewAttemptInput, PowerPathFinalStudentAssessmentResponseInput, PowerPathLessonPlansCreateInput, PowerPathLessonPlanOperationsInput, PowerPathLessonPlanUpdateStudentItemResponseInput, PowerPathMakeExternalTestAssignmentInput, PowerPathPlacementResetUserPlacementInput, PowerPathResetAttemptInput, PowerPathScreeningResetSessionInput, PowerPathScreeningAssignTestInput, PowerPathTestAssignmentsCreateInput, PowerPathTestAssignmentsUpdateInput, PowerPathTestAssignmentsBulkInput, PowerPathTestAssignmentsImportInput, PowerPathTestAssignmentsListParams, PowerPathTestAssignmentsAdminParams, PowerPathUpdateStudentQuestionResponseInput, PowerPathGetAssessmentProgressParams, PowerPathGetNextQuestionParams, PowerPathGetAttemptsParams, PowerPathTestOutParams, PowerPathImportExternalTestAssignmentResultsParams, PowerPathPlacementQueryParams, PowerPathRenderConfigUpsertInput, PowerPathSyllabusQueryParams, QtiAssessmentItemXmlCreateInput, QtiAssessmentItemJsonCreateInput, QtiAssessmentItemCreateInput, QtiAssessmentItemUpdateInput, QtiAssessmentItemProcessResponseInput, QtiAssessmentItemRef, QtiAssessmentSection, QtiTestPart, QtiReorderItemsInput, QtiAssessmentTestMetadataUpdateInput, QtiAssessmentTestCreateInput, QtiAssessmentTestUpdateInput, QtiStimulusCreateInput, QtiStimulusUpdateInput, QtiValidateInput, QtiValidateBatchInput, QtiLessonFeedbackInput, aggregateActivityMetrics, EdubridgeClient };
2153
+ export { ActivityCompletedInput, TimeSpentInput, CaliperEnvelopeInput, CaliperSendEventsInput, CaliperListEventsParams, QuestionSeenInput, QuestionAnsweredInput, QuestionGradedInput, WebhookCreateInput, WebhookUpdateInput, WebhookFilterCreateInput, WebhookFilterUpdateInput, CasePackageInput, ClrCredentialInput, OneRosterUserCreateInput, OneRosterCourseCreateInput, OneRosterClassCreateInput, OneRosterEnrollmentCreateInput, OneRosterCategoryCreateInput, OneRosterLineItemCreateInput, OneRosterResultCreateInput, OneRosterScoreScaleCreateInput, OneRosterAssessmentLineItemCreateInput, OneRosterAssessmentResultCreateInput, OneRosterOrgCreateInput, OneRosterSchoolCreateInput, OneRosterAcademicSessionCreateInput, OneRosterComponentResourceCreateInput, OneRosterCourseComponentCreateInput, OneRosterEnrollInput, OneRosterAgentInput, OneRosterCredentialInput, OneRosterDemographicsCreateInput, OneRosterResourceCreateInput, OneRosterCourseStructureInput, OneRosterBulkResultsInput, PowerPathCreateExternalPlacementTestInput, PowerPathCreateExternalTestOutInput, PowerPathCreateInternalTestInput, PowerPathCreateNewAttemptInput, PowerPathFinalStudentAssessmentResponseInput, PowerPathLessonPlansCreateInput, PowerPathLessonPlanOperationsInput, PowerPathLessonPlanUpdateStudentItemResponseInput, PowerPathMakeExternalTestAssignmentInput, PowerPathPlacementResetUserPlacementInput, PowerPathResetAttemptInput, PowerPathScreeningResetSessionInput, PowerPathScreeningAssignTestInput, PowerPathTestAssignmentsCreateInput, PowerPathTestAssignmentsUpdateInput, PowerPathTestAssignmentsBulkInput, PowerPathTestAssignmentsImportInput, PowerPathTestAssignmentsListParams, PowerPathTestAssignmentsAdminParams, PowerPathUpdateStudentQuestionResponseInput, PowerPathGetAssessmentProgressParams, PowerPathGetNextQuestionParams, PowerPathGetAttemptsParams, PowerPathTestOutParams, PowerPathImportExternalTestAssignmentResultsParams, PowerPathPlacementQueryParams, PowerPathMakeExternalStudentTestOutAssignmentInput, PowerPathRenderConfigUpsertInput, PowerPathSyllabusQueryParams, QtiAssessmentItemXmlCreateInput, QtiAssessmentItemJsonCreateInput, QtiAssessmentItemCreateInput, QtiAssessmentItemUpdateInput, QtiAssessmentItemProcessResponseInput, QtiAssessmentItemRef, QtiAssessmentSection, QtiTestPart, QtiReorderItemsInput, QtiAssessmentTestMetadataUpdateInput, QtiAssessmentTestCreateInput, QtiAssessmentTestUpdateInput, QtiStimulusCreateInput, QtiStimulusUpdateInput, QtiValidateInput, QtiValidateBatchInput, QtiLessonFeedbackInput, ReportingUserEmail, ReportingQueryInput, PersistReportingQueryInput, aggregateActivityMetrics, EdubridgeClient };
@@ -644,6 +644,13 @@ var BEYONDAI_PATHS = {
644
644
  webhookFilterUpdate: "/webhook-filters/{id}",
645
645
  webhookFilterDelete: "/webhook-filters/{id}",
646
646
  webhookFiltersByWebhook: "/webhook-filters/webhook/{webhookId}"
647
+ },
648
+ reporting: {
649
+ mcp: "/lambda/mcp/reporting",
650
+ savedQueryExecute: "/lambda/reporting/saved-queries/{id}",
651
+ adminGroupCheck: "/lambda/mcp/admin/users/{email}/group",
652
+ adminGroupAdd: "/lambda/mcp/admin/users/{email}/group",
653
+ adminGroupRemove: "/lambda/mcp/admin/users/{email}/group"
647
654
  }
648
655
  };
649
656
  var LEARNWITHAI_PATHS = {
@@ -660,6 +667,7 @@ var LEARNWITHAI_PATHS = {
660
667
  resources: "/resources/1.0"
661
668
  },
662
669
  webhooks: null,
670
+ reporting: null,
663
671
  edubridge: null,
664
672
  powerpath: null,
665
673
  clr: null,
@@ -688,6 +696,7 @@ function resolvePathProfiles(pathProfile, customPaths) {
688
696
  caliper: customPaths?.caliper ?? basePaths.caliper,
689
697
  oneroster: customPaths?.oneroster ?? basePaths.oneroster,
690
698
  webhooks: customPaths?.webhooks ?? basePaths.webhooks,
699
+ reporting: customPaths?.reporting ?? basePaths.reporting,
691
700
  edubridge: customPaths?.edubridge ?? basePaths.edubridge,
692
701
  powerpath: customPaths?.powerpath ?? basePaths.powerpath,
693
702
  clr: customPaths?.clr ?? basePaths.clr,
@@ -749,6 +758,10 @@ class TimebackProvider {
749
758
  baseUrl: platformEndpoints.caliper[env],
750
759
  authUrl: this.authUrl
751
760
  },
761
+ reporting: {
762
+ baseUrl: platformEndpoints.api[env],
763
+ authUrl: this.authUrl
764
+ },
752
765
  qti: {
753
766
  baseUrl: platformEndpoints.qti[env],
754
767
  authUrl: this.authUrl
@@ -766,6 +779,7 @@ class TimebackProvider {
766
779
  case: { baseUrl: config.baseUrl, authUrl: this.authUrl },
767
780
  caliper: { baseUrl: config.baseUrl, authUrl: this.authUrl },
768
781
  webhooks: { baseUrl: config.baseUrl, authUrl: this.authUrl },
782
+ reporting: { baseUrl: config.baseUrl, authUrl: this.authUrl },
769
783
  qti: { baseUrl: config.baseUrl, authUrl: this.authUrl }
770
784
  };
771
785
  } else if (isServicesConfig(config)) {
package/dist/client.d.ts CHANGED
@@ -6,6 +6,7 @@ import type { AuthCheckResult, TimebackProvider } from '@timeback/internal-clien
6
6
  import type { OneRosterClientInstance } from '@timeback/oneroster';
7
7
  import type { PowerPathClientInstance } from '@timeback/powerpath';
8
8
  import type { QtiClientInstance } from '@timeback/qti';
9
+ import type { ReportingClientInstance } from '@timeback/reporting';
9
10
  import type { WebhooksClientInstance } from '@timeback/webhooks';
10
11
  import type { TimebackClientConfig } from './types/index';
11
12
  /**
@@ -20,6 +21,7 @@ import type { TimebackClientConfig } from './types/index';
20
21
  * - **OneRoster**: Rostering and gradebook data
21
22
  * - **Edubridge**: Simplified enrollments and analytics
22
23
  * - **Caliper**: Learning analytics events
24
+ * - **Reporting**: Ad-hoc queries and saved reporting endpoints
23
25
  * - **QTI**: Assessment content management
24
26
  * - **PowerPath**: Placement tests, lesson plans, and assessments
25
27
  * - **CLR**: Comprehensive Learner Record credentials
@@ -83,6 +85,7 @@ export declare class TimebackClient {
83
85
  private _powerpath?;
84
86
  private _clr?;
85
87
  private _case?;
88
+ private _reporting?;
86
89
  private _webhooks?;
87
90
  /**
88
91
  * Creates a new Timeback client.
@@ -162,6 +165,16 @@ export declare class TimebackClient {
162
165
  * @throws {Error} If client has been closed or service not configured
163
166
  */
164
167
  get case(): CaseClientInstance;
168
+ /**
169
+ * Reporting API client for reporting queries and saved reporting endpoints.
170
+ *
171
+ * Lazily initialized on first access. Shares OAuth tokens with other
172
+ * sub-clients through the provider.
173
+ *
174
+ * @returns The Reporting client instance
175
+ * @throws {Error} If client has been closed or service not configured
176
+ */
177
+ get reporting(): ReportingClientInstance;
165
178
  /**
166
179
  * Webhooks API client for managing webhook registrations and filters.
167
180
  *
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,CAAuB;IACxC,OAAO,CAAC,IAAI,CAAC,CAAmB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAmB;IAChC,OAAO,CAAC,KAAK,CAAC,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAC,CAAwB;IAE1C;;;;;;OAMG;IACH,YAAY,MAAM,CAAC,EAAE,oBAAoB,EAUxC;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,OAAO,IAAI,qBAAqB,CASnC;IAED;;;;;;;;OAQG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAS3B;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAS3B;IAED;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,kBAAkB,CAS7B;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CASrC;IAMD;;;;;;;;OAQG;IACH,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAGpC;IAED;;;;;;;OAOG;IACH,KAAK,IAAI,IAAI,CAeZ;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;;;OAIG;IACH,WAAW,IAAI,gBAAgB,CAE9B;IAED;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAOrB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzD;;;;GAIG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,OAAO,CAAQ;IAEvB,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,CAAuB;IACxC,OAAO,CAAC,IAAI,CAAC,CAAmB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAmB;IAChC,OAAO,CAAC,KAAK,CAAC,CAAoB;IAClC,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,SAAS,CAAC,CAAwB;IAE1C;;;;;;OAMG;IACH,YAAY,MAAM,CAAC,EAAE,oBAAoB,EAUxC;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,OAAO,IAAI,qBAAqB,CASnC;IAED;;;;;;;;OAQG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAS3B;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,GAAG,IAAI,iBAAiB,CAS3B;IAED;;;;;;;;OAQG;IACH,IAAI,IAAI,IAAI,kBAAkB,CAS7B;IAED;;;;;;;;OAQG;IACH,IAAI,SAAS,IAAI,uBAAuB,CASvC;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,sBAAsB,CASrC;IAMD;;;;;;;;OAQG;IACH,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC,CAGpC;IAED;;;;;;;OAOG;IACH,KAAK,IAAI,IAAI,CAgBZ;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED;;;;OAIG;IACH,WAAW,IAAI,gBAAgB,CAE9B;IAED;;OAEG;IACH,OAAO,CAAC,UAAU;IAMlB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAgBrB"}
package/dist/errors.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  NotFoundError,
5
5
  UnauthorizedError,
6
6
  ValidationError
7
- } from "./chunk-k030r9e8.js";
7
+ } from "./chunk-qt3x4rwv.js";
8
8
  import"./chunk-3j7jywnx.js";
9
9
  export {
10
10
  ValidationError,
package/dist/index.js CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  OneRosterSchoolCreateInput,
29
29
  OneRosterScoreScaleCreateInput,
30
30
  OneRosterUserCreateInput,
31
+ PersistReportingQueryInput,
31
32
  PowerPathCreateExternalPlacementTestInput,
32
33
  PowerPathCreateExternalTestOutInput,
33
34
  PowerPathCreateInternalTestInput,
@@ -40,6 +41,7 @@ import {
40
41
  PowerPathLessonPlanOperationsInput,
41
42
  PowerPathLessonPlanUpdateStudentItemResponseInput,
42
43
  PowerPathLessonPlansCreateInput,
44
+ PowerPathMakeExternalStudentTestOutAssignmentInput,
43
45
  PowerPathMakeExternalTestAssignmentInput,
44
46
  PowerPathPlacementQueryParams,
45
47
  PowerPathPlacementResetUserPlacementInput,
@@ -76,12 +78,14 @@ import {
76
78
  QuestionAnsweredInput,
77
79
  QuestionGradedInput,
78
80
  QuestionSeenInput,
81
+ ReportingQueryInput,
82
+ ReportingUserEmail,
79
83
  TimeSpentInput,
80
84
  WebhookCreateInput,
81
85
  WebhookFilterCreateInput,
82
86
  WebhookFilterUpdateInput,
83
87
  WebhookUpdateInput
84
- } from "./chunk-y0b5t60e.js";
88
+ } from "./chunk-87h1b7ca.js";
85
89
  import {
86
90
  ApiError,
87
91
  BaseTransport,
@@ -107,7 +111,7 @@ import {
107
111
  validateUuid,
108
112
  validateWithSchema,
109
113
  whereToFilter
110
- } from "./chunk-k030r9e8.js";
114
+ } from "./chunk-qt3x4rwv.js";
111
115
  import {
112
116
  CALIPER_DATA_VERSION,
113
117
  CALIPER_ENV_VARS,
@@ -3000,6 +3004,22 @@ class TestAssignmentsResource {
3000
3004
  });
3001
3005
  }
3002
3006
  }
3007
+ // ../powerpath/src/resources/test-out.ts
3008
+ class TestOutResource {
3009
+ transport;
3010
+ constructor(transport) {
3011
+ this.transport = transport;
3012
+ }
3013
+ getEligibility(studentId, subject) {
3014
+ validateNonEmptyString(studentId, "studentId");
3015
+ validateNonEmptyString(subject, "subject");
3016
+ return this.transport.request(`${this.transport.paths.base}/test-out/getTestOutEligibility/${encodeURIComponent(studentId)}/${encodeURIComponent(subject)}`);
3017
+ }
3018
+ createAssignment(input) {
3019
+ validateWithSchema(PowerPathMakeExternalStudentTestOutAssignmentInput, input, "make external student test out assignment");
3020
+ return this.transport.request(`${this.transport.paths.base}/test-out/makeExternalStudentTestOutAssignment`, { method: "POST", body: input });
3021
+ }
3022
+ }
3003
3023
  // ../powerpath/src/factory.ts
3004
3024
  function createPowerPathClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3005
3025
  return class PowerPathClient {
@@ -3012,6 +3032,7 @@ function createPowerPathClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3012
3032
  screening;
3013
3033
  syllabus;
3014
3034
  testAssignments;
3035
+ testOut;
3015
3036
  constructor(config = {}) {
3016
3037
  const resolved = resolveToProvider6(config, registry);
3017
3038
  if (resolved.mode === "transport") {
@@ -3044,6 +3065,7 @@ function createPowerPathClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3044
3065
  this.screening = new ScreeningResource(this.transport);
3045
3066
  this.syllabus = new SyllabusResource(this.transport);
3046
3067
  this.testAssignments = new TestAssignmentsResource(this.transport);
3068
+ this.testOut = new TestOutResource(this.transport);
3047
3069
  }
3048
3070
  getTransport() {
3049
3071
  return this.transport;
@@ -3623,6 +3645,187 @@ function createQtiClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3623
3645
 
3624
3646
  // ../qti/src/client.ts
3625
3647
  var QtiClient = createQtiClient();
3648
+ // ../reporting/src/constants.ts
3649
+ var REPORTING_ENV_VARS = {
3650
+ baseUrl: ["TIMEBACK_API_BASE_URL", "TIMEBACK_BASE_URL", "REPORTING_BASE_URL"],
3651
+ authUrl: ["TIMEBACK_API_AUTH_URL", "TIMEBACK_AUTH_URL", "REPORTING_TOKEN_URL"],
3652
+ clientId: ["TIMEBACK_API_CLIENT_ID", "TIMEBACK_CLIENT_ID", "REPORTING_CLIENT_ID"],
3653
+ clientSecret: [
3654
+ "TIMEBACK_API_CLIENT_SECRET",
3655
+ "TIMEBACK_CLIENT_SECRET",
3656
+ "REPORTING_CLIENT_SECRET"
3657
+ ]
3658
+ };
3659
+
3660
+ // ../reporting/src/lib/resolve.ts
3661
+ function resolveToProvider8(config, registry = DEFAULT_PROVIDER_REGISTRY) {
3662
+ return resolveToProvider(config, REPORTING_ENV_VARS, registry);
3663
+ }
3664
+
3665
+ // ../reporting/src/utils.ts
3666
+ var log7 = createScopedLogger("reporting");
3667
+
3668
+ // ../reporting/src/lib/transport.ts
3669
+ class Transport7 extends BaseTransport {
3670
+ paths;
3671
+ constructor(config) {
3672
+ super({ config, logger: log7 });
3673
+ this.paths = config.paths;
3674
+ }
3675
+ async callTool(name, args) {
3676
+ const response = await this.request(this.paths.mcp, {
3677
+ method: "POST",
3678
+ body: {
3679
+ jsonrpc: "2.0",
3680
+ id: crypto.randomUUID(),
3681
+ method: "tools/call",
3682
+ params: {
3683
+ name,
3684
+ arguments: args
3685
+ }
3686
+ }
3687
+ });
3688
+ if (response.error) {
3689
+ throw new ApiError(response.error.message, 500, response.error.data ?? response.error);
3690
+ }
3691
+ const rawContent = response.result?.content?.[0]?.text;
3692
+ if (!rawContent) {
3693
+ throw new ApiError("Missing reporting MCP result content", 500, response);
3694
+ }
3695
+ let payload;
3696
+ try {
3697
+ payload = JSON.parse(rawContent);
3698
+ } catch {
3699
+ throw new ApiError("Invalid reporting MCP response payload", 500, {
3700
+ body: rawContent
3701
+ });
3702
+ }
3703
+ const hasToolError = response.result?.isError === true || typeof payload === "object" && payload !== null && "isError" in payload && payload.isError === true;
3704
+ if (hasToolError) {
3705
+ const message = typeof payload === "object" && payload !== null && "error" in payload && typeof payload.error === "string" ? payload.error : `Reporting MCP tool failed: ${name}`;
3706
+ throw new ApiError(message, 500, payload);
3707
+ }
3708
+ return payload;
3709
+ }
3710
+ }
3711
+
3712
+ // ../reporting/src/resources/admin.ts
3713
+ class AdminResource {
3714
+ transport;
3715
+ constructor(transport) {
3716
+ this.transport = transport;
3717
+ }
3718
+ checkGroupMembership(email) {
3719
+ const validEmail = validateWithSchema(ReportingUserEmail, email, "reporting email");
3720
+ log7.debug("Checking reporting group membership", { email: validEmail });
3721
+ const path = this.transport.paths.adminGroupCheck.replace("{email}", encodeURIComponent(validEmail));
3722
+ return this.transport.request(path);
3723
+ }
3724
+ addToGroup(email) {
3725
+ const validEmail = validateWithSchema(ReportingUserEmail, email, "reporting email");
3726
+ log7.debug("Adding user to reporting group", { email: validEmail });
3727
+ const path = this.transport.paths.adminGroupAdd.replace("{email}", encodeURIComponent(validEmail));
3728
+ return this.transport.request(path, { method: "POST" });
3729
+ }
3730
+ removeFromGroup(email) {
3731
+ const validEmail = validateWithSchema(ReportingUserEmail, email, "reporting email");
3732
+ log7.debug("Removing user from reporting group", { email: validEmail });
3733
+ const path = this.transport.paths.adminGroupRemove.replace("{email}", encodeURIComponent(validEmail));
3734
+ return this.transport.request(path, { method: "DELETE" });
3735
+ }
3736
+ }
3737
+ // ../reporting/src/resources/queries.ts
3738
+ class QueriesResource {
3739
+ transport;
3740
+ constructor(transport) {
3741
+ this.transport = transport;
3742
+ }
3743
+ run(sql) {
3744
+ const input = validateWithSchema(ReportingQueryInput, { sql }, "reporting query");
3745
+ log7.debug("Running reporting query");
3746
+ return this.transport.callTool("getData", input);
3747
+ }
3748
+ }
3749
+ // ../reporting/src/resources/saved-queries.ts
3750
+ class SavedQueriesResource {
3751
+ transport;
3752
+ constructor(transport) {
3753
+ this.transport = transport;
3754
+ }
3755
+ execute(id) {
3756
+ validateUuid(id, "savedQueryId");
3757
+ log7.debug("Executing saved reporting query", { id });
3758
+ const path = this.transport.paths.savedQueryExecute.replace("{id}", encodeURIComponent(id));
3759
+ return this.transport.request(path);
3760
+ }
3761
+ create(input) {
3762
+ const payload = validateWithSchema(PersistReportingQueryInput, input, "saved reporting query");
3763
+ log7.debug("Creating saved reporting query", { endpointName: payload.endpointName });
3764
+ return this.transport.callTool("persistQueryToAPI", payload);
3765
+ }
3766
+ list() {
3767
+ log7.debug("Listing saved reporting queries");
3768
+ return this.transport.callTool("listApiEndpoints", {});
3769
+ }
3770
+ remove(id) {
3771
+ validateUuid(id, "savedQueryId");
3772
+ log7.debug("Removing saved reporting query", { id });
3773
+ return this.transport.callTool("removeApiEndpoint", {
3774
+ endpointId: id
3775
+ });
3776
+ }
3777
+ }
3778
+ // ../reporting/src/factory.ts
3779
+ function createReportingClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3780
+ return class ReportingClient {
3781
+ transport;
3782
+ _provider;
3783
+ queries;
3784
+ savedQueries;
3785
+ admin;
3786
+ constructor(config = {}) {
3787
+ const resolved = resolveToProvider8(config, registry);
3788
+ if (resolved.mode === "transport") {
3789
+ this.transport = resolved.transport;
3790
+ log7.info("Client initialized with custom transport");
3791
+ } else {
3792
+ const { provider } = resolved;
3793
+ const { baseUrl, paths } = provider.getEndpointWithPaths("reporting");
3794
+ const tokenProvider = provider.getTokenProvider("reporting");
3795
+ if (!tokenProvider) {
3796
+ throw new Error("Reporting API requires authentication");
3797
+ }
3798
+ this._provider = provider;
3799
+ this.transport = new Transport7({
3800
+ baseUrl,
3801
+ tokenProvider,
3802
+ timeout: provider.timeout,
3803
+ paths
3804
+ });
3805
+ log7.info("Client initialized", {
3806
+ platform: provider.platform,
3807
+ env: provider.env,
3808
+ baseUrl
3809
+ });
3810
+ }
3811
+ this.queries = new QueriesResource(this.transport);
3812
+ this.savedQueries = new SavedQueriesResource(this.transport);
3813
+ this.admin = new AdminResource(this.transport);
3814
+ }
3815
+ getTransport() {
3816
+ return this.transport;
3817
+ }
3818
+ checkAuth() {
3819
+ if (!this._provider) {
3820
+ throw new Error("Cannot check auth: client initialized with custom transport");
3821
+ }
3822
+ return this._provider.checkAuth();
3823
+ }
3824
+ };
3825
+ }
3826
+
3827
+ // ../reporting/src/client.ts
3828
+ var ReportingClient = createReportingClient();
3626
3829
  // ../webhooks/src/constants.ts
3627
3830
  var WEBHOOKS_ENV_VARS = {
3628
3831
  baseUrl: ["TIMEBACK_API_BASE_URL", "TIMEBACK_BASE_URL", "WEBHOOKS_BASE_URL"],
@@ -3636,18 +3839,18 @@ var WEBHOOKS_ENV_VARS = {
3636
3839
  };
3637
3840
 
3638
3841
  // ../webhooks/src/lib/resolve.ts
3639
- function resolveToProvider8(config, registry = DEFAULT_PROVIDER_REGISTRY) {
3842
+ function resolveToProvider9(config, registry = DEFAULT_PROVIDER_REGISTRY) {
3640
3843
  return resolveToProvider(config, WEBHOOKS_ENV_VARS, registry);
3641
3844
  }
3642
3845
 
3643
3846
  // ../webhooks/src/utils.ts
3644
- var log7 = createScopedLogger("webhooks");
3847
+ var log8 = createScopedLogger("webhooks");
3645
3848
 
3646
3849
  // ../webhooks/src/lib/transport.ts
3647
- class Transport7 extends BaseTransport {
3850
+ class Transport8 extends BaseTransport {
3648
3851
  paths;
3649
3852
  constructor(config) {
3650
- super({ config, logger: log7 });
3853
+ super({ config, logger: log8 });
3651
3854
  this.paths = config.paths;
3652
3855
  }
3653
3856
  }
@@ -3663,13 +3866,13 @@ class WebhooksResource {
3663
3866
  if (sensor) {
3664
3867
  params.sensor = sensor;
3665
3868
  }
3666
- log7.debug("Listing webhooks", { sensor });
3869
+ log8.debug("Listing webhooks", { sensor });
3667
3870
  const response = await this.transport.request(this.transport.paths.webhookList, { params });
3668
3871
  return response.webhooks;
3669
3872
  }
3670
3873
  async get(id) {
3671
3874
  validateNonEmptyString(id, "webhookId");
3672
- log7.debug("Getting webhook", { id });
3875
+ log8.debug("Getting webhook", { id });
3673
3876
  const path = this.transport.paths.webhookGet.replace("{id}", encodeURIComponent(id));
3674
3877
  const response = await this.transport.request(path);
3675
3878
  if (!response.webhook) {
@@ -3679,15 +3882,15 @@ class WebhooksResource {
3679
3882
  }
3680
3883
  async create(input) {
3681
3884
  validateWithSchema(WebhookCreateInput, input, "webhook");
3682
- log7.debug("Creating webhook", { name: input.name });
3885
+ log8.debug("Creating webhook", { name: input.name });
3683
3886
  const response = await this.transport.request(this.transport.paths.webhookCreate, { method: "POST", body: input });
3684
- log7.info("Webhook created", { id: response.webhook.id, name: response.webhook.name });
3887
+ log8.info("Webhook created", { id: response.webhook.id, name: response.webhook.name });
3685
3888
  return response.webhook;
3686
3889
  }
3687
3890
  async update(id, input) {
3688
3891
  validateNonEmptyString(id, "webhookId");
3689
3892
  validateWithSchema(WebhookUpdateInput, input, "webhook");
3690
- log7.debug("Updating webhook", { id });
3893
+ log8.debug("Updating webhook", { id });
3691
3894
  const path = this.transport.paths.webhookUpdate.replace("{id}", encodeURIComponent(id));
3692
3895
  const response = await this.transport.request(path, {
3693
3896
  method: "PUT",
@@ -3697,32 +3900,32 @@ class WebhooksResource {
3697
3900
  }
3698
3901
  async delete(id) {
3699
3902
  validateNonEmptyString(id, "webhookId");
3700
- log7.debug("Deleting webhook", { id });
3903
+ log8.debug("Deleting webhook", { id });
3701
3904
  const path = this.transport.paths.webhookDelete.replace("{id}", encodeURIComponent(id));
3702
3905
  const response = await this.transport.request(path, {
3703
3906
  method: "DELETE"
3704
3907
  });
3705
- log7.info("Webhook deleted", { id });
3908
+ log8.info("Webhook deleted", { id });
3706
3909
  return response;
3707
3910
  }
3708
3911
  async activate(id) {
3709
3912
  validateNonEmptyString(id, "webhookId");
3710
- log7.debug("Activating webhook", { id });
3913
+ log8.debug("Activating webhook", { id });
3711
3914
  const path = this.transport.paths.webhookActivate.replace("{id}", encodeURIComponent(id));
3712
3915
  const response = await this.transport.request(path, {
3713
3916
  method: "PUT"
3714
3917
  });
3715
- log7.info("Webhook activated", { id });
3918
+ log8.info("Webhook activated", { id });
3716
3919
  return response.webhook;
3717
3920
  }
3718
3921
  async deactivate(id) {
3719
3922
  validateNonEmptyString(id, "webhookId");
3720
- log7.debug("Deactivating webhook", { id });
3923
+ log8.debug("Deactivating webhook", { id });
3721
3924
  const path = this.transport.paths.webhookDeactivate.replace("{id}", encodeURIComponent(id));
3722
3925
  const response = await this.transport.request(path, {
3723
3926
  method: "PUT"
3724
3927
  });
3725
- log7.info("Webhook deactivated", { id });
3928
+ log8.info("Webhook deactivated", { id });
3726
3929
  return response.webhook;
3727
3930
  }
3728
3931
  }
@@ -3733,13 +3936,13 @@ class WebhookFiltersResource {
3733
3936
  this.transport = transport;
3734
3937
  }
3735
3938
  async list() {
3736
- log7.debug("Listing webhook filters");
3939
+ log8.debug("Listing webhook filters");
3737
3940
  const response = await this.transport.request(this.transport.paths.webhookFilterList);
3738
3941
  return response.filters;
3739
3942
  }
3740
3943
  async get(id) {
3741
3944
  validateNonEmptyString(id, "webhookFilterId");
3742
- log7.debug("Getting webhook filter", { id });
3945
+ log8.debug("Getting webhook filter", { id });
3743
3946
  const path = this.transport.paths.webhookFilterGet.replace("{id}", encodeURIComponent(id));
3744
3947
  const response = await this.transport.request(path);
3745
3948
  if (!response.filter) {
@@ -3749,25 +3952,25 @@ class WebhookFiltersResource {
3749
3952
  }
3750
3953
  async listByWebhook(webhookId) {
3751
3954
  validateNonEmptyString(webhookId, "webhookId");
3752
- log7.debug("Listing webhook filters by webhook", { webhookId });
3955
+ log8.debug("Listing webhook filters by webhook", { webhookId });
3753
3956
  const path = this.transport.paths.webhookFiltersByWebhook.replace("{webhookId}", encodeURIComponent(webhookId));
3754
3957
  const response = await this.transport.request(path);
3755
3958
  return response.filters;
3756
3959
  }
3757
3960
  async create(input) {
3758
3961
  validateWithSchema(WebhookFilterCreateInput, input, "webhook filter");
3759
- log7.debug("Creating webhook filter", {
3962
+ log8.debug("Creating webhook filter", {
3760
3963
  webhookId: input.webhookId,
3761
3964
  filterKey: input.filterKey
3762
3965
  });
3763
3966
  const response = await this.transport.request(this.transport.paths.webhookFilterCreate, { method: "POST", body: input });
3764
- log7.info("Webhook filter created", { webhookId: input.webhookId });
3967
+ log8.info("Webhook filter created", { webhookId: input.webhookId });
3765
3968
  return response.filter;
3766
3969
  }
3767
3970
  async update(id, input) {
3768
3971
  validateNonEmptyString(id, "webhookFilterId");
3769
3972
  validateWithSchema(WebhookFilterUpdateInput, input, "webhook filter");
3770
- log7.debug("Updating webhook filter", { id });
3973
+ log8.debug("Updating webhook filter", { id });
3771
3974
  const path = this.transport.paths.webhookFilterUpdate.replace("{id}", encodeURIComponent(id));
3772
3975
  const response = await this.transport.request(path, {
3773
3976
  method: "PUT",
@@ -3777,12 +3980,12 @@ class WebhookFiltersResource {
3777
3980
  }
3778
3981
  async delete(id) {
3779
3982
  validateNonEmptyString(id, "webhookFilterId");
3780
- log7.debug("Deleting webhook filter", { id });
3983
+ log8.debug("Deleting webhook filter", { id });
3781
3984
  const path = this.transport.paths.webhookFilterDelete.replace("{id}", encodeURIComponent(id));
3782
3985
  const response = await this.transport.request(path, {
3783
3986
  method: "DELETE"
3784
3987
  });
3785
- log7.info("Webhook filter deleted", { id });
3988
+ log8.info("Webhook filter deleted", { id });
3786
3989
  return response;
3787
3990
  }
3788
3991
  }
@@ -3794,10 +3997,10 @@ function createWebhooksClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3794
3997
  webhooks;
3795
3998
  webhookFilters;
3796
3999
  constructor(config = {}) {
3797
- const resolved = resolveToProvider8(config, registry);
4000
+ const resolved = resolveToProvider9(config, registry);
3798
4001
  if (resolved.mode === "transport") {
3799
4002
  this.transport = resolved.transport;
3800
- log7.info("Client initialized with custom transport");
4003
+ log8.info("Client initialized with custom transport");
3801
4004
  } else {
3802
4005
  const { provider } = resolved;
3803
4006
  const { baseUrl, paths } = provider.getEndpointWithPaths("webhooks");
@@ -3806,13 +4009,13 @@ function createWebhooksClient(registry = DEFAULT_PROVIDER_REGISTRY) {
3806
4009
  throw new Error("Webhooks API requires authentication");
3807
4010
  }
3808
4011
  this._provider = provider;
3809
- this.transport = new Transport7({
4012
+ this.transport = new Transport8({
3810
4013
  baseUrl,
3811
4014
  tokenProvider,
3812
4015
  timeout: provider.timeout,
3813
4016
  paths
3814
4017
  });
3815
- log7.info("Client initialized", {
4018
+ log8.info("Client initialized", {
3816
4019
  platform: provider.platform,
3817
4020
  env: provider.env,
3818
4021
  baseUrl
@@ -3866,6 +4069,7 @@ class TimebackClient {
3866
4069
  _powerpath;
3867
4070
  _clr;
3868
4071
  _case;
4072
+ _reporting;
3869
4073
  _webhooks;
3870
4074
  constructor(config) {
3871
4075
  const resolved = resolveToProvider(config ?? {}, TIMEBACK_ENV_VARS);
@@ -3930,6 +4134,14 @@ class TimebackClient {
3930
4134
  }
3931
4135
  return this._case;
3932
4136
  }
4137
+ get reporting() {
4138
+ this.assertOpen();
4139
+ this.assertService("reporting");
4140
+ if (!this._reporting) {
4141
+ this._reporting = new ReportingClient({ provider: this.provider });
4142
+ }
4143
+ return this._reporting;
4144
+ }
3933
4145
  get webhooks() {
3934
4146
  this.assertOpen();
3935
4147
  this.assertService("webhooks");
@@ -3954,6 +4166,7 @@ class TimebackClient {
3954
4166
  this._powerpath = undefined;
3955
4167
  this._clr = undefined;
3956
4168
  this._case = undefined;
4169
+ this._reporting = undefined;
3957
4170
  this._webhooks = undefined;
3958
4171
  this._closed = true;
3959
4172
  }
package/dist/utils.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  aggregateActivityMetrics
3
- } from "./chunk-y0b5t60e.js";
4
- import"./chunk-k030r9e8.js";
3
+ } from "./chunk-87h1b7ca.js";
4
+ import"./chunk-qt3x4rwv.js";
5
5
  import"./chunk-3j7jywnx.js";
6
6
  export {
7
7
  aggregateActivityMetrics
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@timeback/core",
3
- "version": "0.2.1-beta.20260314151810",
3
+ "version": "0.2.1-beta.20260315040428",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -46,6 +46,7 @@
46
46
  "@timeback/oneroster": "0.2.0",
47
47
  "@timeback/powerpath": "0.2.0",
48
48
  "@timeback/qti": "0.2.0",
49
+ "@timeback/reporting": "0.1.0",
49
50
  "@timeback/webhooks": "0.2.0",
50
51
  "@types/bun": "latest",
51
52
  "esbuild": "^0.27.3"