@timeback/sdk 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +10 -8
  2. package/dist/chunk-1cqa51je.js +2 -0
  3. package/dist/chunk-3ew9vn2d.js +2 -0
  4. package/dist/chunk-6b0ppq9d.js +2 -0
  5. package/dist/chunk-92nnwa7t.js +2 -0
  6. package/dist/chunk-bavxzt1k.js +2 -0
  7. package/dist/chunk-c8pw96sp.js +10 -0
  8. package/dist/chunk-edk3nfj7.js +2 -0
  9. package/dist/chunk-g67efaph.js +4 -0
  10. package/dist/chunk-pd91g539.js +1 -0
  11. package/dist/chunk-sgcwg4j6.js +1 -0
  12. package/dist/client/adapters/react/hooks/types.d.ts +2 -29
  13. package/dist/client/adapters/react/hooks/types.d.ts.map +1 -1
  14. package/dist/client/adapters/react/hooks/useTimebackVerification.d.ts.map +1 -1
  15. package/dist/client/adapters/react/index.js +2 -2
  16. package/dist/client/adapters/solid/types.d.ts +2 -29
  17. package/dist/client/adapters/solid/types.d.ts.map +1 -1
  18. package/dist/client/adapters/solid/types.ts +2 -18
  19. package/dist/client/adapters/svelte/stores/client.d.ts.map +1 -1
  20. package/dist/client/adapters/svelte/stores/client.ts +2 -9
  21. package/dist/client/adapters/svelte/stores/profile.d.ts +1 -1
  22. package/dist/client/adapters/svelte/stores/profile.d.ts.map +1 -1
  23. package/dist/client/adapters/svelte/stores/profile.ts +4 -11
  24. package/dist/client/adapters/svelte/stores/verification.d.ts.map +1 -1
  25. package/dist/client/adapters/svelte/stores/verification.ts +1 -10
  26. package/dist/client/adapters/svelte/types.d.ts +1 -29
  27. package/dist/client/adapters/svelte/types.d.ts.map +1 -1
  28. package/dist/client/adapters/vue/provider.d.ts.map +1 -1
  29. package/dist/client/adapters/vue/provider.ts +4 -11
  30. package/dist/client/adapters/vue/types.d.ts +2 -29
  31. package/dist/client/adapters/vue/types.d.ts.map +1 -1
  32. package/dist/client/adapters/vue/types.ts +2 -18
  33. package/dist/client/auth/types.d.ts +1 -1
  34. package/dist/client/index.d.ts +1 -1
  35. package/dist/client/lib/activity/activity.class.d.ts +130 -22
  36. package/dist/client/lib/activity/activity.class.d.ts.map +1 -1
  37. package/dist/client/lib/activity/transport.d.ts +15 -0
  38. package/dist/client/lib/activity/transport.d.ts.map +1 -0
  39. package/dist/client/lib/activity/types.d.ts +53 -0
  40. package/dist/client/lib/activity/types.d.ts.map +1 -0
  41. package/dist/client/lib/utils.d.ts +18 -0
  42. package/dist/client/lib/utils.d.ts.map +1 -1
  43. package/dist/client/lib/utils.ts +109 -0
  44. package/dist/client/namespaces/activity.d.ts +49 -7
  45. package/dist/client/namespaces/activity.d.ts.map +1 -1
  46. package/dist/client/timeback-client.class.d.ts +7 -1
  47. package/dist/client/timeback-client.class.d.ts.map +1 -1
  48. package/dist/client.d.ts +1 -1
  49. package/dist/client.js +1 -1
  50. package/dist/identity.d.ts +2 -5
  51. package/dist/identity.d.ts.map +1 -1
  52. package/dist/identity.js +1 -1
  53. package/dist/index.d.ts +7 -3
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +30 -21
  56. package/dist/server/adapters/express.d.ts.map +1 -1
  57. package/dist/server/adapters/express.js +1 -1
  58. package/dist/server/adapters/native.d.ts.map +1 -1
  59. package/dist/server/adapters/native.js +2 -2
  60. package/dist/server/adapters/nextjs.js +1 -1
  61. package/dist/server/adapters/nuxt.d.ts.map +1 -1
  62. package/dist/server/adapters/nuxt.js +1 -1
  63. package/dist/server/adapters/solid-start.d.ts.map +1 -1
  64. package/dist/server/adapters/solid-start.js +1 -1
  65. package/dist/server/adapters/svelte-kit.d.ts.map +1 -1
  66. package/dist/server/adapters/svelte-kit.js +1 -1
  67. package/dist/server/adapters/tanstack-start.d.ts.map +1 -1
  68. package/dist/server/adapters/tanstack-start.js +1 -1
  69. package/dist/server/adapters/types.d.ts +16 -4
  70. package/dist/server/adapters/types.d.ts.map +1 -1
  71. package/dist/server/adapters/utils.d.ts +1 -1
  72. package/dist/server/adapters/utils.d.ts.map +1 -1
  73. package/dist/server/handlers/activity/attempts.d.ts +1 -1
  74. package/dist/server/handlers/activity/attempts.d.ts.map +1 -1
  75. package/dist/server/handlers/activity/caliper.d.ts +54 -16
  76. package/dist/server/handlers/activity/caliper.d.ts.map +1 -1
  77. package/dist/server/handlers/activity/heartbeat-handler.d.ts +15 -0
  78. package/dist/server/handlers/activity/heartbeat-handler.d.ts.map +1 -0
  79. package/dist/server/handlers/activity/index.d.ts +5 -3
  80. package/dist/server/handlers/activity/index.d.ts.map +1 -1
  81. package/dist/server/handlers/activity/progress.d.ts +2 -2
  82. package/dist/server/handlers/activity/progress.d.ts.map +1 -1
  83. package/dist/server/handlers/activity/schema.d.ts +40 -6
  84. package/dist/server/handlers/activity/schema.d.ts.map +1 -1
  85. package/dist/server/handlers/activity/submit-handler.d.ts +29 -0
  86. package/dist/server/handlers/activity/submit-handler.d.ts.map +1 -0
  87. package/dist/server/handlers/activity/submit.d.ts +44 -0
  88. package/dist/server/handlers/activity/submit.d.ts.map +1 -0
  89. package/dist/server/handlers/activity/types.d.ts +126 -5
  90. package/dist/server/handlers/activity/types.d.ts.map +1 -1
  91. package/dist/server/handlers/identity/handler.d.ts +23 -4
  92. package/dist/server/handlers/identity/handler.d.ts.map +1 -1
  93. package/dist/server/handlers/identity/index.d.ts +2 -2
  94. package/dist/server/handlers/identity/index.d.ts.map +1 -1
  95. package/dist/server/handlers/identity/oidc.d.ts.map +1 -1
  96. package/dist/server/handlers/identity/types.d.ts +0 -6
  97. package/dist/server/handlers/identity/types.d.ts.map +1 -1
  98. package/dist/server/handlers/index.d.ts +3 -3
  99. package/dist/server/handlers/index.d.ts.map +1 -1
  100. package/dist/server/handlers/user/handler.d.ts.map +1 -1
  101. package/dist/server/handlers/user/profile.d.ts.map +1 -1
  102. package/dist/server/handlers/user/types.d.ts +3 -0
  103. package/dist/server/handlers/user/types.d.ts.map +1 -1
  104. package/dist/server/handlers/user/verify.d.ts.map +1 -1
  105. package/dist/server/index.d.ts +1 -1
  106. package/dist/server/index.d.ts.map +1 -1
  107. package/dist/server/lib/hooks.d.ts +20 -0
  108. package/dist/server/lib/hooks.d.ts.map +1 -0
  109. package/dist/server/lib/index.d.ts +4 -2
  110. package/dist/server/lib/index.d.ts.map +1 -1
  111. package/dist/server/lib/logger.d.ts +36 -9
  112. package/dist/server/lib/logger.d.ts.map +1 -1
  113. package/dist/server/lib/resolve.d.ts +1 -1
  114. package/dist/server/lib/resolve.d.ts.map +1 -1
  115. package/dist/server/lib/utils.d.ts +23 -2
  116. package/dist/server/lib/utils.d.ts.map +1 -1
  117. package/dist/server/lib/validation.d.ts +55 -0
  118. package/dist/server/lib/validation.d.ts.map +1 -0
  119. package/dist/server/namespaces/activity/index.d.ts +8 -0
  120. package/dist/server/namespaces/activity/index.d.ts.map +1 -0
  121. package/dist/server/namespaces/activity/record.d.ts +49 -0
  122. package/dist/server/namespaces/activity/record.d.ts.map +1 -0
  123. package/dist/server/namespaces/activity/schema.d.ts +50 -0
  124. package/dist/server/namespaces/activity/schema.d.ts.map +1 -0
  125. package/dist/server/namespaces/user/get-profile.d.ts +32 -0
  126. package/dist/server/namespaces/user/get-profile.d.ts.map +1 -0
  127. package/dist/server/namespaces/user/index.d.ts +8 -0
  128. package/dist/server/namespaces/user/index.d.ts.map +1 -0
  129. package/dist/server/namespaces/user/verify.d.ts +28 -0
  130. package/dist/server/namespaces/user/verify.d.ts.map +1 -0
  131. package/dist/server/timeback-identity.d.ts +3 -3
  132. package/dist/server/timeback.d.ts +5 -3
  133. package/dist/server/timeback.d.ts.map +1 -1
  134. package/dist/server/types.d.ts +407 -14
  135. package/dist/server/types.d.ts.map +1 -1
  136. package/dist/shared/constants.d.ts +7 -0
  137. package/dist/shared/constants.d.ts.map +1 -1
  138. package/dist/shared/constants.ts +51 -0
  139. package/dist/shared/index.d.ts +9 -0
  140. package/dist/shared/index.d.ts.map +1 -0
  141. package/dist/shared/schemas.d.ts +57 -0
  142. package/dist/shared/schemas.d.ts.map +1 -0
  143. package/dist/shared/types.d.ts +287 -18
  144. package/dist/shared/types.d.ts.map +1 -1
  145. package/dist/shared/types.ts +636 -0
  146. package/package.json +7 -10
  147. package/dist/chunk-07j8zre9.js +0 -2
  148. package/dist/chunk-5171mkp2.js +0 -2
  149. package/dist/chunk-63afdp3y.js +0 -8
  150. package/dist/chunk-8gg8n8v9.js +0 -2
  151. package/dist/chunk-9se82640.js +0 -1
  152. package/dist/chunk-agpf1x3g.js +0 -16
  153. package/dist/chunk-hnf0tart.js +0 -2
  154. package/dist/chunk-qr0bbnsr.js +0 -1
  155. package/dist/chunk-whc53e0y.js +0 -11
  156. package/dist/chunk-x9gvef7q.js +0 -1
  157. package/dist/edge.d.ts +0 -13
  158. package/dist/edge.d.ts.map +0 -1
  159. package/dist/edge.js +0 -1
  160. package/dist/server/handlers/activity/handler.d.ts +0 -32
  161. package/dist/server/handlers/activity/handler.d.ts.map +0 -1
  162. package/dist/shared/xp-calculator.d.ts +0 -25
  163. package/dist/shared/xp-calculator.d.ts.map +0 -1
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Shared Zod Schemas
3
+ *
4
+ * Zod schemas for shared types used across client and server.
5
+ */
6
+ import * as z from 'zod';
7
+ /**
8
+ * Zod schema for grade-based course selector.
9
+ *
10
+ * @see {@link SubjectGradeCourseRef}
11
+ */
12
+ export declare const subjectGradeCourseRefSchema: z.ZodObject<{
13
+ subject: z.ZodEnum<{
14
+ FastMath: "FastMath";
15
+ Language: "Language";
16
+ Math: "Math";
17
+ None: "None";
18
+ Other: "Other";
19
+ Reading: "Reading";
20
+ Science: "Science";
21
+ "Social Studies": "Social Studies";
22
+ Vocabulary: "Vocabulary";
23
+ Writing: "Writing";
24
+ }>;
25
+ grade: z.ZodUnion<readonly [z.ZodLiteral<-1>, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>, z.ZodLiteral<6>, z.ZodLiteral<7>, z.ZodLiteral<8>, z.ZodLiteral<9>, z.ZodLiteral<10>, z.ZodLiteral<11>, z.ZodLiteral<12>, z.ZodLiteral<13>]>;
26
+ }, z.core.$strip>;
27
+ /**
28
+ * Zod schema for code-based course selector.
29
+ *
30
+ * @see {@link CourseCodeRef}
31
+ */
32
+ export declare const courseCodeRefSchema: z.ZodObject<{
33
+ code: z.ZodString;
34
+ }, z.core.$strip>;
35
+ /**
36
+ * Zod schema for activity course reference (union of subject+grade or code).
37
+ *
38
+ * @see {@link ActivityCourseRef}
39
+ */
40
+ export declare const activityCourseRefSchema: z.ZodUnion<readonly [z.ZodObject<{
41
+ subject: z.ZodEnum<{
42
+ FastMath: "FastMath";
43
+ Language: "Language";
44
+ Math: "Math";
45
+ None: "None";
46
+ Other: "Other";
47
+ Reading: "Reading";
48
+ Science: "Science";
49
+ "Social Studies": "Social Studies";
50
+ Vocabulary: "Vocabulary";
51
+ Writing: "Writing";
52
+ }>;
53
+ grade: z.ZodUnion<readonly [z.ZodLiteral<-1>, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>, z.ZodLiteral<6>, z.ZodLiteral<7>, z.ZodLiteral<8>, z.ZodLiteral<9>, z.ZodLiteral<10>, z.ZodLiteral<11>, z.ZodLiteral<12>, z.ZodLiteral<13>]>;
54
+ }, z.core.$strip>, z.ZodObject<{
55
+ code: z.ZodString;
56
+ }, z.core.$strip>]>;
57
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/shared/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAWxB;;;;GAIG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;iBAGtC,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB;;iBAE9B,CAAA;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;mBAA8D,CAAA"}
@@ -124,13 +124,15 @@ export interface CourseCodeRef {
124
124
  * - **Grade-based**: `{ subject, grade }` — K-12 style
125
125
  * - **Grade-less**: `{ code }` — CS/skill-based
126
126
  *
127
- * @example Grade-based
127
+ * @example
128
128
  * ```typescript
129
+ * // Grade-based
129
130
  * { subject: 'Math', grade: 3 }
130
131
  * ```
131
132
  *
132
- * @example Grade-less
133
+ * @example
133
134
  * ```typescript
135
+ * // Grade-less
134
136
  * { code: 'CS-101' }
135
137
  * ```
136
138
  */
@@ -142,6 +144,70 @@ export type ActivityCourseRef = SubjectGradeCourseRef | CourseCodeRef;
142
144
  * @returns True if grade-based selector
143
145
  */
144
146
  export declare function isSubjectGradeCourseRef(ref: ActivityCourseRef): ref is SubjectGradeCourseRef;
147
+ /**
148
+ * Time tracking configuration options.
149
+ *
150
+ * Controls how the SDK tracks and reports time-spent data via heartbeats.
151
+ */
152
+ export interface TimeTrackingOptions {
153
+ /**
154
+ * Interval in milliseconds between automatic heartbeat flushes.
155
+ * @default 15000 (15 seconds)
156
+ */
157
+ flushIntervalMs?: number;
158
+ /**
159
+ * Whether to pause time tracking when the tab is not visible.
160
+ * @default true
161
+ */
162
+ visibilityAware?: boolean;
163
+ /**
164
+ * Whether to flush accumulated time when the tab becomes hidden.
165
+ * @default true
166
+ */
167
+ flushOnVisibilityHidden?: boolean;
168
+ /**
169
+ * Whether to attempt a best-effort flush on page unload (pagehide event).
170
+ *
171
+ * Implementation notes:
172
+ * - Prefer `navigator.sendBeacon()` when available and safe to use
173
+ * - Fall back to `fetch(..., { keepalive: true })` otherwise
174
+ *
175
+ * sendBeacon cannot set arbitrary headers (e.g. Authorization), so
176
+ * integrations that rely on bearer tokens typically use the keepalive
177
+ * fetch fallback.
178
+ * @default true
179
+ */
180
+ flushOnPageHide?: boolean;
181
+ /**
182
+ * Timeout in milliseconds after which hidden time stops being tracked.
183
+ *
184
+ * When the tab is hidden for longer than this duration, heartbeats stop
185
+ * and the hidden time is not counted. When the user returns, tracking
186
+ * resumes fresh without counting the extended absence.
187
+ *
188
+ * Set to `null` or `Infinity` to disable (always track hidden time).
189
+ * @default 600000 (10 minutes)
190
+ */
191
+ hiddenTimeoutMs?: number | null;
192
+ /**
193
+ * Number of retry attempts for failed heartbeat sends.
194
+ *
195
+ * Set to `0` (default) for no retries. Retries use exponential backoff
196
+ * with delays configured by `retryDelaysMs`.
197
+ *
198
+ * @default 0
199
+ */
200
+ retryAttempts?: number;
201
+ /**
202
+ * Delay schedule (in milliseconds) between retry attempts.
203
+ *
204
+ * Each index corresponds to the delay before that retry attempt.
205
+ * If more attempts are made than there are entries, the last value is reused.
206
+ *
207
+ * @default [100, 300, 1000]
208
+ */
209
+ retryDelaysMs?: number[];
210
+ }
145
211
  /**
146
212
  * Activity start parameters.
147
213
  *
@@ -182,9 +248,18 @@ export interface ActivityParams {
182
248
  * Use a short, URL-safe slug like `"fractions-with-like-denominators"` or
183
249
  * `"lesson-1"`. Special characters will be URI-encoded.
184
250
  *
185
- * @example 'fractions-with-like-denominators'
186
- * @example 'ccss.math.content.3.nf.a.1'
187
- * @example 'lesson-1'
251
+ * @example
252
+ * ```typescript
253
+ * // 'fractions-with-like-denominators'
254
+ * ```
255
+ * @example
256
+ * ```typescript
257
+ * // 'ccss.math.content.3.nf.a.1'
258
+ * ```
259
+ * @example
260
+ * ```typescript
261
+ * // 'lesson-1'
262
+ * ```
188
263
  */
189
264
  id: string;
190
265
  /**
@@ -192,11 +267,71 @@ export interface ActivityParams {
192
267
  *
193
268
  * This is sent as `object.activity.name` in Caliper events.
194
269
  *
195
- * @example 'Fractions with Like Denominators'
270
+ * @example
271
+ * ```typescript
272
+ * // 'Fractions with Like Denominators'
273
+ * ```
196
274
  */
197
275
  name: string;
198
276
  /** Course selector (must match a unique course in timeback.config.json) */
199
277
  course: ActivityCourseRef;
278
+ /**
279
+ * Optional run identifier for correlating events across sessions.
280
+ *
281
+ * When resuming an activity, provide the same `runId` from the previous session
282
+ * to correlate time-spent events with the eventual completion event.
283
+ *
284
+ * If not provided, the SDK generates a new UUID.
285
+ */
286
+ runId?: string;
287
+ /**
288
+ * Time tracking configuration options.
289
+ *
290
+ * Heartbeats are enabled by default. Use this to customize flush intervals
291
+ * or disable visibility-aware tracking.
292
+ *
293
+ * Set to `false` to disable client-side time tracking entirely. When
294
+ * disabled, no heartbeats are sent, no visibility handlers are registered,
295
+ * and `end()` skips the final time flush. Use this when time is managed
296
+ * server-side (e.g. via `timeback.activity.record()`).
297
+ */
298
+ time?: TimeTrackingOptions | false;
299
+ /**
300
+ * Called when a heartbeat or submission fails.
301
+ *
302
+ * Heartbeat errors are non-fatal — the SDK continues tracking time
303
+ * regardless. Submit errors (from `end()`) are also surfaced here
304
+ * before being re-thrown.
305
+ *
306
+ * @param error - The error that occurred
307
+ * @param context - Details about the failed operation
308
+ */
309
+ onError?: (error: Error, context: ActivityErrorContext) => void;
310
+ /**
311
+ * Called when the activity is paused (via `pause()` or visibility timeout).
312
+ */
313
+ onPause?: () => void;
314
+ /**
315
+ * Called when the activity resumes after being paused.
316
+ */
317
+ onResume?: () => void;
318
+ /**
319
+ * Called after each successful heartbeat flush.
320
+ *
321
+ * @param elapsedMs - Active milliseconds reported in this flush
322
+ */
323
+ onFlush?: (elapsedMs: number) => void;
324
+ }
325
+ /**
326
+ * Context passed to the `onError` callback.
327
+ */
328
+ export interface ActivityErrorContext {
329
+ /** Which operation failed — aligns with Caliper event types. */
330
+ type: 'timeSpent' | 'completion';
331
+ /** The activity slug passed to `activity.start()`. */
332
+ activityId: string;
333
+ /** The `runId` for this activity instance. */
334
+ runId: string;
200
335
  }
201
336
  /**
202
337
  * Activity metrics (optional performance data).
@@ -212,19 +347,23 @@ export interface ActivityMetrics {
212
347
  masteredUnits?: number;
213
348
  }
214
349
  /**
215
- * Data passed to `Activity.end()` when completing an activity.
350
+ * Question count metrics for activity completion.
216
351
  *
217
- * @example Basic usage
352
+ * @example
218
353
  * ```typescript
354
+ * // Basic usage
219
355
  * await activity.end({
356
+ * xpEarned: 100,
220
357
  * totalQuestions: 10,
221
358
  * correctQuestions: 8,
222
359
  * })
223
360
  * ```
224
361
  *
225
- * @example With time override
362
+ * @example
226
363
  * ```typescript
364
+ * // With time override
227
365
  * await activity.end({
366
+ * xpEarned: 100,
228
367
  * totalQuestions: 10,
229
368
  * correctQuestions: 8,
230
369
  * time: { active: 42000, inactive: 3000 },
@@ -250,9 +389,31 @@ type QuestionCountMetrics = {
250
389
  /** Omit question counts entirely. */
251
390
  correctQuestions?: undefined;
252
391
  };
253
- export type ActivityEndData = QuestionCountMetrics & {
254
- /** XP earned from this activity */
255
- xpEarned?: number;
392
+ /** Optional time override for activity.end() */
393
+ interface ActivityEndTimeOverride {
394
+ /** Active time in milliseconds */
395
+ active: number;
396
+ /** Inactive/paused time in milliseconds (defaults to 0) */
397
+ inactive?: number;
398
+ }
399
+ /**
400
+ * Time-only end: final flush without completion event.
401
+ *
402
+ * Call `activity.end()` with no args or just a time override to flush
403
+ * accumulated time without sending an ActivityCompletedEvent.
404
+ */
405
+ type ActivityEndTimeOnly = {
406
+ totalQuestions?: undefined;
407
+ correctQuestions?: undefined;
408
+ xpEarned?: undefined;
409
+ masteredUnits?: undefined;
410
+ pctComplete?: undefined;
411
+ time?: ActivityEndTimeOverride;
412
+ };
413
+ /** Completion end: flush + ActivityCompletedEvent. */
414
+ type ActivityEndCompletion = QuestionCountMetrics & {
415
+ /** XP earned from this activity. */
416
+ xpEarned: number;
256
417
  /** Number of units mastered */
257
418
  masteredUnits?: number;
258
419
  /**
@@ -263,13 +424,17 @@ export type ActivityEndData = QuestionCountMetrics & {
263
424
  * Optional time override. When provided, the SDK uses these values instead
264
425
  * of the internal timer. Values are clamped to >= 0 and rounded to integers.
265
426
  */
266
- time?: {
267
- /** Active time in milliseconds */
268
- active: number;
269
- /** Inactive/paused time in milliseconds (defaults to 0) */
270
- inactive?: number;
271
- };
427
+ time?: ActivityEndTimeOverride;
272
428
  };
429
+ /**
430
+ * Data for ending an activity.
431
+ *
432
+ * Two modes:
433
+ * - **Time-only**: `activity.end()` or `activity.end({ time: {...} })` — final
434
+ * flush only, no completion event
435
+ * - **Completion**: `activity.end({ xpEarned, ... })` — final flush + completion event
436
+ */
437
+ export type ActivityEndData = ActivityEndTimeOnly | ActivityEndCompletion;
273
438
  /**
274
439
  * Activity state sent to the server when ending.
275
440
  *
@@ -311,6 +476,76 @@ export interface ActivityEndPayload {
311
476
  */
312
477
  pctComplete?: number;
313
478
  }
479
+ /**
480
+ * Activity heartbeat payload for time-spent tracking.
481
+ *
482
+ * Sent periodically to report accumulated active time for a time window.
483
+ * The server builds a `TimeSpentEvent` from this data.
484
+ */
485
+ export interface ActivityHeartbeatPayload {
486
+ /**
487
+ * Activity slug (stable identifier for the learning object).
488
+ */
489
+ id: string;
490
+ /**
491
+ * Human-readable display name of the activity.
492
+ */
493
+ name: string;
494
+ /** Course selector (must match a unique course in timeback.config.json) */
495
+ course: ActivityCourseRef;
496
+ /**
497
+ * Run identifier for correlating heartbeats with the completion event.
498
+ */
499
+ runId: string;
500
+ /**
501
+ * ISO 8601 timestamp when this time window started.
502
+ */
503
+ startedAt: string;
504
+ /**
505
+ * ISO 8601 timestamp when this time window ended.
506
+ */
507
+ endedAt: string;
508
+ /**
509
+ * Active time in this window in milliseconds.
510
+ */
511
+ elapsedMs: number;
512
+ /**
513
+ * Paused time in this window in milliseconds.
514
+ */
515
+ pausedMs: number;
516
+ }
517
+ /**
518
+ * Activity submit payload for completion events.
519
+ *
520
+ * Sent when the activity completes with metrics.
521
+ * The server builds an `ActivityCompletedEvent` from this data.
522
+ */
523
+ export interface ActivitySubmitPayload {
524
+ /**
525
+ * Activity slug (stable identifier for the learning object).
526
+ */
527
+ id: string;
528
+ /**
529
+ * Human-readable display name of the activity.
530
+ */
531
+ name: string;
532
+ /** Course selector (must match a unique course in timeback.config.json) */
533
+ course: ActivityCourseRef;
534
+ /**
535
+ * Run identifier for correlating with previous heartbeats.
536
+ */
537
+ runId: string;
538
+ /**
539
+ * ISO 8601 timestamp when the activity ended.
540
+ */
541
+ endedAt: string;
542
+ /** Activity metrics */
543
+ metrics: ActivityMetrics;
544
+ /**
545
+ * App-reported course progress (per enrollment), as a percentage from 0–100.
546
+ */
547
+ pctComplete?: number;
548
+ }
314
549
  /**
315
550
  * Activity submission response.
316
551
  */
@@ -333,5 +568,39 @@ export type TimebackVerifyResult = {
333
568
  /** User does not exist in Timeback */
334
569
  verified: false;
335
570
  };
571
+ /**
572
+ * Verification state for the current user.
573
+ *
574
+ * Used by framework adapters (React, Vue, Svelte, Solid) to expose
575
+ * verification status as a state machine for UI consumption.
576
+ */
577
+ export type TimebackVerificationState = {
578
+ status: 'loading';
579
+ } | {
580
+ status: 'verified';
581
+ timebackId: string;
582
+ } | {
583
+ status: 'unverified';
584
+ } | {
585
+ status: 'error';
586
+ message: string;
587
+ };
588
+ /**
589
+ * Profile state for the current user.
590
+ *
591
+ * Used by framework adapters (React, Vue, Svelte, Solid) to expose
592
+ * profile fetching status as a state machine for UI consumption.
593
+ */
594
+ export type TimebackProfileState = {
595
+ status: 'idle';
596
+ } | {
597
+ status: 'loading';
598
+ } | {
599
+ status: 'loaded';
600
+ profile: TimebackProfile;
601
+ } | {
602
+ status: 'error';
603
+ message: string;
604
+ };
336
605
  export {};
337
606
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}