@pie-players/pie-assessment-toolkit 0.2.5 → 0.2.9

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 (257) hide show
  1. package/README.md +200 -67
  2. package/dist/attempt/TestSession.d.ts +23 -21
  3. package/dist/attempt/TestSession.d.ts.map +1 -1
  4. package/dist/attempt/TestSession.js +17 -15
  5. package/dist/attempt/TestSession.js.map +1 -1
  6. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts +50 -0
  7. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts.map +1 -0
  8. package/dist/attempt/adapters/activity-to-test-attempt-session.js +135 -0
  9. package/dist/attempt/adapters/activity-to-test-attempt-session.js.map +1 -0
  10. package/dist/components/ItemToolBar.custom-element.js +628 -0
  11. package/dist/components/PieAssessmentToolkit.custom-element.js +670 -0
  12. package/dist/components/item-toolbar-element.d.ts +3 -0
  13. package/dist/components/item-toolbar-element.d.ts.map +1 -0
  14. package/dist/components/item-toolbar-element.js +2 -0
  15. package/dist/components/item-toolbar-element.js.map +1 -0
  16. package/dist/components/pie-assessment-toolkit-element.d.ts +3 -0
  17. package/dist/components/pie-assessment-toolkit-element.d.ts.map +1 -0
  18. package/dist/components/pie-assessment-toolkit-element.js +2 -0
  19. package/dist/components/pie-assessment-toolkit-element.js.map +1 -0
  20. package/dist/context/assessment-toolkit-context.d.ts +52 -0
  21. package/dist/context/assessment-toolkit-context.d.ts.map +1 -0
  22. package/dist/context/assessment-toolkit-context.js +6 -0
  23. package/dist/context/assessment-toolkit-context.js.map +1 -0
  24. package/dist/context/runtime-context-consumer.d.ts +14 -0
  25. package/dist/context/runtime-context-consumer.d.ts.map +1 -0
  26. package/dist/context/runtime-context-consumer.js +52 -0
  27. package/dist/context/runtime-context-consumer.js.map +1 -0
  28. package/dist/index.d.ts +53 -42
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +34 -32
  31. package/dist/index.js.map +1 -1
  32. package/dist/runtime/RuntimeRegistry.d.ts +13 -0
  33. package/dist/runtime/RuntimeRegistry.d.ts.map +1 -0
  34. package/dist/runtime/RuntimeRegistry.js +50 -0
  35. package/dist/runtime/RuntimeRegistry.js.map +1 -0
  36. package/dist/runtime/SectionRuntimeEngine.d.ts +45 -0
  37. package/dist/runtime/SectionRuntimeEngine.d.ts.map +1 -0
  38. package/dist/runtime/SectionRuntimeEngine.js +81 -0
  39. package/dist/runtime/SectionRuntimeEngine.js.map +1 -0
  40. package/dist/runtime/registration-events.d.ts +19 -0
  41. package/dist/runtime/registration-events.d.ts.map +1 -0
  42. package/dist/runtime/registration-events.js +4 -0
  43. package/dist/runtime/registration-events.js.map +1 -0
  44. package/dist/runtime/runtime-event-guards.d.ts +3 -0
  45. package/dist/runtime/runtime-event-guards.d.ts.map +1 -0
  46. package/dist/runtime/runtime-event-guards.js +9 -0
  47. package/dist/runtime/runtime-event-guards.js.map +1 -0
  48. package/dist/runtime/tool-host-contract.d.ts +30 -0
  49. package/dist/runtime/tool-host-contract.d.ts.map +1 -0
  50. package/dist/runtime/tool-host-contract.js +48 -0
  51. package/dist/runtime/tool-host-contract.js.map +1 -0
  52. package/dist/services/HighlightCoordinator.d.ts +2 -2
  53. package/dist/services/HighlightCoordinator.d.ts.map +1 -1
  54. package/dist/services/HighlightCoordinator.js +1 -1
  55. package/dist/services/HighlightCoordinator.js.map +1 -1
  56. package/dist/services/I18nService.js +1 -1
  57. package/dist/services/I18nService.js.map +1 -1
  58. package/dist/services/PNPToolResolver.d.ts +2 -2
  59. package/dist/services/PNPToolResolver.d.ts.map +1 -1
  60. package/dist/services/PNPToolResolver.js +1 -1
  61. package/dist/services/PNPToolResolver.js.map +1 -1
  62. package/dist/services/TTSService.d.ts +5 -3
  63. package/dist/services/TTSService.d.ts.map +1 -1
  64. package/dist/services/TTSService.js +13 -12
  65. package/dist/services/TTSService.js.map +1 -1
  66. package/dist/services/ThemeProvider.d.ts +2 -1
  67. package/dist/services/ThemeProvider.d.ts.map +1 -1
  68. package/dist/services/ThemeProvider.js +82 -46
  69. package/dist/services/ThemeProvider.js.map +1 -1
  70. package/dist/services/ToolConfigResolver.d.ts +1 -1
  71. package/dist/services/ToolConfigResolver.js +1 -1
  72. package/dist/services/ToolCoordinator.d.ts +2 -2
  73. package/dist/services/ToolCoordinator.d.ts.map +1 -1
  74. package/dist/services/ToolCoordinator.js +1 -1
  75. package/dist/services/ToolCoordinator.js.map +1 -1
  76. package/dist/services/ToolRegistry.d.ts +66 -69
  77. package/dist/services/ToolRegistry.d.ts.map +1 -1
  78. package/dist/services/ToolRegistry.js +72 -22
  79. package/dist/services/ToolRegistry.js.map +1 -1
  80. package/dist/services/ToolkitCoordinator.d.ts +112 -14
  81. package/dist/services/ToolkitCoordinator.d.ts.map +1 -1
  82. package/dist/services/ToolkitCoordinator.js +508 -77
  83. package/dist/services/ToolkitCoordinator.js.map +1 -1
  84. package/dist/services/createDefaultToolRegistry.d.ts +15 -10
  85. package/dist/services/createDefaultToolRegistry.d.ts.map +1 -1
  86. package/dist/services/createDefaultToolRegistry.js +13 -17
  87. package/dist/services/createDefaultToolRegistry.js.map +1 -1
  88. package/dist/services/defaultPersonalNeedsProfile.d.ts +4 -0
  89. package/dist/services/defaultPersonalNeedsProfile.d.ts.map +1 -0
  90. package/dist/services/defaultPersonalNeedsProfile.js +25 -0
  91. package/dist/services/defaultPersonalNeedsProfile.js.map +1 -0
  92. package/dist/services/interfaces.d.ts +67 -7
  93. package/dist/services/interfaces.d.ts.map +1 -1
  94. package/dist/services/interfaces.js.map +1 -1
  95. package/dist/services/pnp-standard-features.d.ts +3 -4
  96. package/dist/services/pnp-standard-features.d.ts.map +1 -1
  97. package/dist/services/pnp-standard-features.js +0 -3
  98. package/dist/services/pnp-standard-features.js.map +1 -1
  99. package/dist/services/section-controller-types.d.ts +32 -0
  100. package/dist/services/section-controller-types.d.ts.map +1 -0
  101. package/dist/services/section-controller-types.js +2 -0
  102. package/dist/services/section-controller-types.js.map +1 -0
  103. package/dist/services/tool-context.d.ts +4 -4
  104. package/dist/services/tool-context.d.ts.map +1 -1
  105. package/dist/services/tool-context.js +106 -17
  106. package/dist/services/tool-context.js.map +1 -1
  107. package/dist/services/tool-instance-id.d.ts +17 -0
  108. package/dist/services/tool-instance-id.d.ts.map +1 -0
  109. package/dist/services/tool-instance-id.js +61 -0
  110. package/dist/services/tool-instance-id.js.map +1 -0
  111. package/dist/services/tool-providers/DesmosToolProvider.d.ts +1 -1
  112. package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -1
  113. package/dist/services/tool-providers/IToolProvider.d.ts +2 -3
  114. package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -1
  115. package/dist/services/tool-providers/IToolProvider.js +1 -2
  116. package/dist/services/tool-providers/IToolProvider.js.map +1 -1
  117. package/dist/services/tool-providers/MathJsToolProvider.d.ts +25 -0
  118. package/dist/services/tool-providers/MathJsToolProvider.d.ts.map +1 -0
  119. package/dist/services/tool-providers/MathJsToolProvider.js +53 -0
  120. package/dist/services/tool-providers/MathJsToolProvider.js.map +1 -0
  121. package/dist/services/tool-providers/TIToolProvider.d.ts +1 -1
  122. package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -1
  123. package/dist/services/tool-providers/TIToolProvider.js +1 -1
  124. package/dist/services/tool-providers/TIToolProvider.js.map +1 -1
  125. package/dist/services/tool-providers/TTSToolProvider.d.ts +1 -1
  126. package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -1
  127. package/dist/services/tool-providers/TTSToolProvider.js +1 -1
  128. package/dist/services/tool-providers/TTSToolProvider.js.map +1 -1
  129. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +1 -1
  130. package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -1
  131. package/dist/services/tool-providers/index.d.ts +11 -9
  132. package/dist/services/tool-providers/index.d.ts.map +1 -1
  133. package/dist/services/tool-providers/index.js +5 -4
  134. package/dist/services/tool-providers/index.js.map +1 -1
  135. package/dist/services/tools-config-normalizer.d.ts +26 -0
  136. package/dist/services/tools-config-normalizer.d.ts.map +1 -0
  137. package/dist/services/tools-config-normalizer.js +63 -0
  138. package/dist/services/tools-config-normalizer.js.map +1 -0
  139. package/dist/services/tts/provider-interface.d.ts +1 -1
  140. package/dist/services/tts/provider-interface.d.ts.map +1 -1
  141. package/dist/tools/calculators/desmos-provider.js +1 -1
  142. package/dist/tools/calculators/desmos-provider.js.map +1 -1
  143. package/dist/tools/calculators/mathjs-provider.js +1 -1
  144. package/dist/tools/calculators/mathjs-provider.js.map +1 -1
  145. package/dist/tools/calculators/ti-provider.d.ts.map +1 -1
  146. package/dist/tools/calculators/ti-provider.js +127 -4
  147. package/dist/tools/calculators/ti-provider.js.map +1 -1
  148. package/dist/tools/client.d.ts +9 -8
  149. package/dist/tools/client.d.ts.map +1 -1
  150. package/dist/tools/client.js +9 -8
  151. package/dist/tools/client.js.map +1 -1
  152. package/dist/tools/default-tool-module-loaders.d.ts +9 -0
  153. package/dist/tools/default-tool-module-loaders.d.ts.map +1 -0
  154. package/dist/tools/default-tool-module-loaders.js +17 -0
  155. package/dist/tools/default-tool-module-loaders.js.map +1 -0
  156. package/dist/tools/index.d.ts +4 -3
  157. package/dist/tools/index.d.ts.map +1 -1
  158. package/dist/tools/index.js +4 -3
  159. package/dist/tools/index.js.map +1 -1
  160. package/dist/tools/library-loader.d.ts +2 -2
  161. package/dist/tools/library-loader.d.ts.map +1 -1
  162. package/dist/tools/library-loader.js +7 -2
  163. package/dist/tools/library-loader.js.map +1 -1
  164. package/dist/tools/registrations/accessibility-tools.d.ts +2 -10
  165. package/dist/tools/registrations/accessibility-tools.d.ts.map +1 -1
  166. package/dist/tools/registrations/accessibility-tools.js +97 -115
  167. package/dist/tools/registrations/accessibility-tools.js.map +1 -1
  168. package/dist/tools/registrations/calculator.d.ts +3 -3
  169. package/dist/tools/registrations/calculator.d.ts.map +1 -1
  170. package/dist/tools/registrations/calculator.js +35 -56
  171. package/dist/tools/registrations/calculator.js.map +1 -1
  172. package/dist/tools/registrations/interaction-tools.d.ts +1 -1
  173. package/dist/tools/registrations/interaction-tools.d.ts.map +1 -1
  174. package/dist/tools/registrations/interaction-tools.js +79 -54
  175. package/dist/tools/registrations/interaction-tools.js.map +1 -1
  176. package/dist/tools/registrations/measurement-tools.d.ts +1 -1
  177. package/dist/tools/registrations/measurement-tools.d.ts.map +1 -1
  178. package/dist/tools/registrations/measurement-tools.js +65 -40
  179. package/dist/tools/registrations/measurement-tools.js.map +1 -1
  180. package/dist/tools/registrations/subject-specific-tools.d.ts +1 -1
  181. package/dist/tools/registrations/subject-specific-tools.d.ts.map +1 -1
  182. package/dist/tools/registrations/subject-specific-tools.js +65 -40
  183. package/dist/tools/registrations/subject-specific-tools.js.map +1 -1
  184. package/dist/tools/registrations/tts.d.ts +2 -2
  185. package/dist/tools/registrations/tts.d.ts.map +1 -1
  186. package/dist/tools/registrations/tts.js +28 -42
  187. package/dist/tools/registrations/tts.js.map +1 -1
  188. package/dist/tools/response-discovery.d.ts +13 -15
  189. package/dist/tools/response-discovery.d.ts.map +1 -1
  190. package/dist/tools/response-discovery.js +23 -80
  191. package/dist/tools/response-discovery.js.map +1 -1
  192. package/dist/tools/tool-coordinator.d.ts +1 -1
  193. package/dist/tools/tool-coordinator.d.ts.map +1 -1
  194. package/dist/tools/tool-tag-map.d.ts +4 -4
  195. package/dist/tools/tool-tag-map.d.ts.map +1 -1
  196. package/dist/tools/tool-tag-map.js +2 -3
  197. package/dist/tools/tool-tag-map.js.map +1 -1
  198. package/dist/tools/types.d.ts +3 -1
  199. package/dist/tools/types.d.ts.map +1 -1
  200. package/dist/tools/variant-resolver.d.ts +1 -1
  201. package/dist/tools/variant-resolver.d.ts.map +1 -1
  202. package/package.json +25 -28
  203. package/src/README.md +16 -32
  204. package/src/components/ItemToolBar.svelte +489 -0
  205. package/src/components/PNPProvenanceViewer.svelte +14 -4
  206. package/src/components/PieAssessmentToolkit.svelte +517 -0
  207. package/src/components/ToolButton.svelte +11 -11
  208. package/src/components/ToolButtonGroup.svelte +27 -11
  209. package/src/tools/README.md +6 -5
  210. package/src/tools/calculators/README.md +4 -4
  211. package/dist/player/AssessmentPlayer.d.ts +0 -397
  212. package/dist/player/AssessmentPlayer.d.ts.map +0 -1
  213. package/dist/player/AssessmentPlayer.js +0 -974
  214. package/dist/player/AssessmentPlayer.js.map +0 -1
  215. package/dist/player/index.d.ts +0 -17
  216. package/dist/player/index.d.ts.map +0 -1
  217. package/dist/player/index.js +0 -15
  218. package/dist/player/index.js.map +0 -1
  219. package/dist/player/navigation-types.d.ts +0 -63
  220. package/dist/player/navigation-types.d.ts.map +0 -1
  221. package/dist/player/navigation-types.js +0 -7
  222. package/dist/player/navigation-types.js.map +0 -1
  223. package/dist/player/qti-navigation.d.ts +0 -29
  224. package/dist/player/qti-navigation.d.ts.map +0 -1
  225. package/dist/player/qti-navigation.js +0 -160
  226. package/dist/player/qti-navigation.js.map +0 -1
  227. package/dist/reference-layout/index.d.ts +0 -19
  228. package/dist/reference-layout/index.d.ts.map +0 -1
  229. package/dist/reference-layout/index.js +0 -20
  230. package/dist/reference-layout/index.js.map +0 -1
  231. package/dist/services/AnnotationToolbarConfig.d.ts +0 -134
  232. package/dist/services/AnnotationToolbarConfig.d.ts.map +0 -1
  233. package/dist/services/AnnotationToolbarConfig.js +0 -100
  234. package/dist/services/AnnotationToolbarConfig.js.map +0 -1
  235. package/dist/services/AssessmentAuthoringService.d.ts +0 -60
  236. package/dist/services/AssessmentAuthoringService.d.ts.map +0 -1
  237. package/dist/services/AssessmentAuthoringService.js +0 -183
  238. package/dist/services/AssessmentAuthoringService.js.map +0 -1
  239. package/dist/services/PNPMapper.d.ts +0 -81
  240. package/dist/services/PNPMapper.d.ts.map +0 -1
  241. package/dist/services/PNPMapper.js +0 -108
  242. package/dist/services/PNPMapper.js.map +0 -1
  243. package/src/components/PNPProfileTester.example.svelte +0 -188
  244. package/src/components/PNPProfileTester.svelte +0 -397
  245. package/src/components/QuestionToolBar.svelte +0 -483
  246. package/src/player/AssessmentLayout.svelte +0 -68
  247. package/src/player/README.md +0 -154
  248. package/src/reference-layout/README.md +0 -135
  249. package/src/reference-layout/ReferenceLayout.svelte +0 -201
  250. package/src/reference-layout/components/AssessmentContent.svelte +0 -259
  251. package/src/reference-layout/components/AssessmentFooter.svelte +0 -89
  252. package/src/reference-layout/components/AssessmentHeader.svelte +0 -250
  253. package/src/reference-layout/components/AssessmentNavigation.svelte +0 -134
  254. package/src/reference-layout/components/AssessmentToolsBar.svelte +0 -176
  255. package/src/reference-layout/components/ItemPanel.svelte +0 -200
  256. package/src/reference-layout/components/NotesPanel.svelte +0 -179
  257. package/src/reference-layout/components/PassagePanel.svelte +0 -76
package/README.md CHANGED
@@ -32,8 +32,15 @@ player.toolCoordinator = toolCoordinator;
32
32
  const toolkitCoordinator = new ToolkitCoordinator({
33
33
  assessmentId: 'my-assessment',
34
34
  tools: {
35
- tts: { enabled: true },
36
- answerEliminator: { enabled: true }
35
+ providers: {
36
+ tts: { enabled: true, backend: 'browser' },
37
+ calculator: { enabled: true, provider: 'desmos' }
38
+ },
39
+ placement: {
40
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
41
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
42
+ passage: ['textToSpeech']
43
+ }
37
44
  }
38
45
  });
39
46
 
@@ -76,8 +83,15 @@ import { ToolkitCoordinator } from '@pie-players/pie-assessment-toolkit';
76
83
  const coordinator = new ToolkitCoordinator({
77
84
  assessmentId: 'demo-assessment',
78
85
  tools: {
79
- tts: { enabled: true, defaultVoice: 'en-US' },
80
- answerEliminator: { enabled: true }
86
+ providers: {
87
+ tts: { enabled: true, backend: 'browser', defaultVoice: 'en-US' },
88
+ calculator: { enabled: true, provider: 'desmos' }
89
+ },
90
+ placement: {
91
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
92
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
93
+ passage: ['textToSpeech']
94
+ }
81
95
  },
82
96
  accessibility: {
83
97
  catalogs: assessment.accessibilityCatalogs || [],
@@ -122,18 +136,61 @@ player.toolCoordinator = toolCoordinator;
122
136
  // ...
123
137
  ```
124
138
 
125
- ## Tool Architecture: Item-Level vs Floating Tools
139
+ ## Tool Configuration Model
140
+
141
+ The toolkit uses one canonical `tools` model with three concerns:
142
+
143
+ - `policy`: allow/block constraints (global gates)
144
+ - `placement`: where tools appear (`assessment`, `section`, `item`, `passage`, `rubric`, plus custom registered levels)
145
+ - `providers`: provider/runtime options (calculator, tts, etc.)
146
+
147
+ Example:
148
+
149
+ ```typescript
150
+ tools: {
151
+ policy: {
152
+ allowed: ['calculator', 'textToSpeech', 'answerEliminator', 'graph', 'periodicTable'],
153
+ blocked: ['graph']
154
+ },
155
+ placement: {
156
+ assessment: [],
157
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
158
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
159
+ passage: ['textToSpeech'],
160
+ rubric: []
161
+ },
162
+ providers: {
163
+ calculator: { provider: 'desmos', authFetcher: async () => ({ apiKey: '...' }) },
164
+ tts: { enabled: true, backend: 'browser', defaultVoice: 'en-US' }
165
+ }
166
+ }
167
+ ```
168
+
169
+ ### Scope and Lifecycle
170
+
171
+ The runtime still distinguishes between contextual (`item`/`passage`) and section-wide tools:
172
+
173
+ Tool instances use structured IDs so scope is explicit:
174
+
175
+ ```text
176
+ <toolId>:<scopeLevel>:<scopeId>[:inline]
177
+ ```
126
178
 
127
- The toolkit distinguishes between two fundamentally different categories of tools based on their scope and lifecycle:
179
+ Examples:
180
+ - `calculator:section:section-1`
181
+ - `calculator:item:item-42`
182
+ - `textToSpeech:passage:passage-1`
183
+ - `highlighter:rubric:rubric-3`
128
184
 
129
- ### Item-Level Tools (`tools` configuration)
185
+ ### Item-Level Tools (`tools.placement.item`)
130
186
 
131
187
  Tools that operate **within the context of a specific question/item**:
132
188
 
133
189
  ```typescript
134
190
  tools: {
135
- tts: { enabled: true }, // Reads this question's text
136
- answerEliminator: { enabled: true } // Strikes through this item's choices
191
+ placement: {
192
+ item: ['calculator', 'textToSpeech', 'answerEliminator']
193
+ }
137
194
  }
138
195
  ```
139
196
 
@@ -152,24 +209,22 @@ tools: {
152
209
  **Example Use Case:**
153
210
  A student uses answer eliminator on Question 3 to cross out choices B and D. When they navigate to Question 4, they see fresh, uneliminated choices. When they return to Question 3, their eliminations are restored.
154
211
 
155
- ### Section-Level Floating Tools (`floatingTools` configuration)
212
+ ### Section-Level Tools (`tools.placement.section`)
156
213
 
157
214
  Tools that **float above the entire assessment** and persist across questions:
158
215
 
159
216
  ```typescript
160
- floatingTools: {
161
- calculator: {
162
- enabled: true,
163
- provider: 'desmos',
164
- authFetcher: async () => { /* ... */ }
217
+ tools: {
218
+ placement: {
219
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler', 'colorScheme']
165
220
  },
166
- graph: { enabled: true },
167
- periodicTable: { enabled: true },
168
- protractor: { enabled: true },
169
- ruler: { enabled: true },
170
- lineReader: { enabled: true },
171
- magnifier: { enabled: true },
172
- colorScheme: { enabled: true }
221
+ providers: {
222
+ calculator: {
223
+ enabled: true,
224
+ provider: 'desmos',
225
+ authFetcher: async () => { /* ... */ }
226
+ }
227
+ }
173
228
  }
174
229
  ```
175
230
 
@@ -215,27 +270,24 @@ Complete example showing both types:
215
270
  const coordinator = new ToolkitCoordinator({
216
271
  assessmentId: 'math-exam',
217
272
  tools: {
218
- // Item-level: Different for each question
219
- tts: { enabled: true },
220
- answerEliminator: { enabled: true }
221
- },
222
- floatingTools: {
223
- // Section-level: Shared across all questions
224
- calculator: {
225
- enabled: true,
226
- provider: 'desmos',
227
- authFetcher: async () => {
228
- const response = await fetch('/api/tools/desmos/auth');
229
- return response.json();
230
- }
273
+ placement: {
274
+ // Contextual placement
275
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
276
+ passage: ['textToSpeech'],
277
+ // Section-level utilities
278
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler', 'colorScheme']
231
279
  },
232
- graph: { enabled: true },
233
- periodicTable: { enabled: true },
234
- protractor: { enabled: true },
235
- ruler: { enabled: true },
236
- lineReader: { enabled: true },
237
- magnifier: { enabled: true },
238
- colorScheme: { enabled: true }
280
+ providers: {
281
+ calculator: {
282
+ enabled: true,
283
+ provider: 'desmos',
284
+ authFetcher: async () => {
285
+ const response = await fetch('/api/tools/desmos/auth');
286
+ return response.json();
287
+ }
288
+ },
289
+ tts: { enabled: true, backend: 'browser' }
290
+ }
239
291
  },
240
292
  accessibility: {
241
293
  catalogs: [],
@@ -252,24 +304,50 @@ For most use cases, simply enable all available tools:
252
304
  const coordinator = new ToolkitCoordinator({
253
305
  assessmentId: 'my-assessment',
254
306
  tools: {
255
- tts: { enabled: true },
256
- answerEliminator: { enabled: true }
257
- },
258
- floatingTools: {
259
- calculator: { enabled: true, provider: 'desmos' },
260
- graph: { enabled: true },
261
- periodicTable: { enabled: true },
262
- protractor: { enabled: true },
263
- ruler: { enabled: true },
264
- lineReader: { enabled: true },
265
- magnifier: { enabled: true },
266
- colorScheme: { enabled: true }
307
+ placement: {
308
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
309
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
310
+ passage: ['textToSpeech']
311
+ },
312
+ providers: {
313
+ calculator: { enabled: true, provider: 'desmos' },
314
+ tts: { enabled: true, backend: 'browser' }
315
+ }
267
316
  }
268
317
  });
269
318
  ```
270
319
 
271
320
  The ToolkitCoordinator handles all internal complexity (service initialization, provider management, state coordination). The only special configuration is `authFetcher` for Desmos calculator (optional - falls back to local calculator if not provided).
272
321
 
322
+ ## Test Attempt Session Adapter (pie backend)
323
+
324
+ The toolkit exposes a canonical `TestAttemptSession` runtime and a deterministic adapter for pie backend activity payloads from `../../kds/pie-api-aws`.
325
+
326
+ ```typescript
327
+ import {
328
+ mapActivityToTestAttemptSession,
329
+ toItemSessionsRecord,
330
+ buildActivitySessionPatchFromTestAttemptSession
331
+ } from "@pie-players/pie-assessment-toolkit";
332
+
333
+ const testAttemptSession = mapActivityToTestAttemptSession({
334
+ activityDefinition,
335
+ activitySession
336
+ });
337
+
338
+ // Use in section-player handoff (same item session shape as item players expect)
339
+ const itemSessions = toItemSessionsRecord(testAttemptSession);
340
+
341
+ // Host-owned backend persistence payload
342
+ const patch = buildActivitySessionPatchFromTestAttemptSession(testAttemptSession);
343
+ ```
344
+
345
+ ### Integration Boundary
346
+
347
+ - `@pie-players/pie-section-player` stays backend-agnostic and emits session/state changes.
348
+ - Host applications own backend I/O to pie backend (`../../kds/pie-api-aws`).
349
+ - Hosts decide persistence policy (immediate, debounced, checkpoint, submit).
350
+
273
351
  ## Implementation Status
274
352
 
275
353
  ### ✅ Core Infrastructure
@@ -315,18 +393,30 @@ The toolkit integrates seamlessly with the **PIE Section Player**:
315
393
  export interface ToolkitCoordinatorConfig {
316
394
  assessmentId: string; // Required: unique assessment identifier
317
395
  tools?: {
318
- tts?: {
319
- enabled?: boolean;
320
- defaultVoice?: string;
321
- rate?: number;
322
- provider?: 'browser' | 'server';
396
+ policy?: {
397
+ allowed?: string[];
398
+ blocked?: string[];
323
399
  };
324
- answerEliminator?: {
325
- enabled?: boolean;
326
- strategy?: 'strikethrough' | 'hide';
400
+ placement?: {
401
+ assessment?: string[];
402
+ section?: string[];
403
+ item?: string[];
404
+ passage?: string[];
405
+ rubric?: string[];
406
+ };
407
+ providers?: {
408
+ tts?: {
409
+ enabled?: boolean;
410
+ backend?: 'browser' | 'polly' | 'google' | 'server';
411
+ defaultVoice?: string;
412
+ rate?: number;
413
+ };
414
+ calculator?: {
415
+ enabled?: boolean;
416
+ provider?: 'desmos' | 'ti' | 'mathjs';
417
+ authFetcher?: () => Promise<Record<string, unknown>>;
418
+ };
327
419
  };
328
- highlighter?: { enabled?: boolean };
329
- // ... other tools
330
420
  };
331
421
  accessibility?: {
332
422
  catalogs?: any[];
@@ -565,7 +655,14 @@ The section player provides automatic ToolkitCoordinator integration:
565
655
  // Create coordinator
566
656
  const coordinator = new ToolkitCoordinator({
567
657
  assessmentId: 'my-assessment',
568
- tools: { tts: { enabled: true } }
658
+ tools: {
659
+ providers: { tts: { enabled: true, backend: 'browser' } },
660
+ placement: {
661
+ section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
662
+ item: ['calculator', 'textToSpeech', 'answerEliminator'],
663
+ passage: ['textToSpeech']
664
+ }
665
+ }
569
666
  });
570
667
 
571
668
  // Pass to player
@@ -576,12 +673,41 @@ The section player provides automatic ToolkitCoordinator integration:
576
673
  // Player automatically:
577
674
  // - Extracts services from coordinator
578
675
  // - Generates section ID
579
- // - Passes services to all child components
676
+ // - Provides runtime context to child components
580
677
  // - Manages SSML extraction
581
678
  // - Handles catalog lifecycle
582
679
  </script>
583
680
  ```
584
681
 
682
+ ### Runtime Context Contract
683
+
684
+ The toolkit now exports a shared context key used by section-player and toolkit
685
+ components:
686
+
687
+ ```typescript
688
+ import {
689
+ assessmentToolkitRuntimeContext,
690
+ type AssessmentToolkitRuntimeContext
691
+ } from "@pie-players/pie-assessment-toolkit";
692
+ ```
693
+
694
+ `AssessmentToolkitRuntimeContext` carries ambient orchestration dependencies
695
+ that should not be prop-drilled through intermediate components:
696
+
697
+ - `toolkitCoordinator`
698
+ - `toolCoordinator`
699
+ - `ttsService`
700
+ - `highlightCoordinator`
701
+ - `catalogResolver`
702
+ - `elementToolStateStore`
703
+ - `assessmentId`
704
+ - `sectionId`
705
+
706
+ These runtime fields are expected to be present once the section-player
707
+ provider is established (host-supplied coordinator or lazily created by
708
+ section-player). Use explicit props/events for direct content contracts, and
709
+ use runtime context for cross-cutting orchestration scope.
710
+
585
711
  ### Standalone Sections (No Coordinator Provided)
586
712
 
587
713
  If no coordinator is provided, the section player creates a default one:
@@ -593,7 +719,14 @@ player.section = mySection;
593
719
  // Internally creates:
594
720
  // new ToolkitCoordinator({
595
721
  // assessmentId: 'anon_...', // auto-generated
596
- // tools: { tts: { enabled: true }, answerEliminator: { enabled: true } }
722
+ // tools: {
723
+ // providers: { tts: { enabled: true, backend: 'browser' }, calculator: { enabled: true, provider: 'desmos' } },
724
+ // placement: {
725
+ // section: ['calculator', 'graph', 'periodicTable', 'protractor', 'lineReader', 'ruler'],
726
+ // item: ['calculator', 'textToSpeech', 'answerEliminator'],
727
+ // passage: ['textToSpeech']
728
+ // }
729
+ // }
597
730
  // })
598
731
  ```
599
732
 
@@ -3,12 +3,12 @@ export interface StorageLike {
3
3
  setItem(key: string, value: string): void;
4
4
  removeItem(key: string): void;
5
5
  }
6
- export interface TestSessionNavigationState {
6
+ export interface TestAttemptSessionNavigationState {
7
7
  currentItemIndex: number;
8
8
  visitedItemIdentifiers: string[];
9
9
  currentSectionIdentifier?: string;
10
10
  }
11
- export interface TestSessionRealization {
11
+ export interface TestAttemptSessionRealization {
12
12
  /**
13
13
  * Deterministic seed for shuffling/selection.
14
14
  * (Future: use for QTI ordering.shuffle / selection rules.)
@@ -19,7 +19,7 @@ export interface TestSessionRealization {
19
19
  */
20
20
  itemIdentifiers: string[];
21
21
  }
22
- export interface ItemSession {
22
+ export interface TestAttemptItemSession {
23
23
  /**
24
24
  * QTI assessmentItemRef identifier (same as questionRef.identifier).
25
25
  */
@@ -33,23 +33,24 @@ export interface ItemSession {
33
33
  startedAt?: string;
34
34
  updatedAt?: string;
35
35
  completedAt?: string;
36
+ session?: unknown;
36
37
  }
37
- export interface TestSession {
38
+ export interface TestAttemptSession {
38
39
  version: 1;
39
40
  /**
40
41
  * QTI-like identifier for the delivery attempt (administration).
41
42
  */
42
- testSessionIdentifier: string;
43
+ testAttemptSessionIdentifier: string;
43
44
  assessmentId: string;
44
45
  startedAt: string;
45
46
  updatedAt: string;
46
47
  completedAt?: string;
47
- navigationState: TestSessionNavigationState;
48
- realization: TestSessionRealization;
48
+ navigationState: TestAttemptSessionNavigationState;
49
+ realization: TestAttemptSessionRealization;
49
50
  /**
50
51
  * Keyed by QTI item identifier (questionRef.identifier).
51
52
  */
52
- itemSessions: Record<string, ItemSession>;
53
+ itemSessions: Record<string, TestAttemptItemSession>;
53
54
  /**
54
55
  * QTI 3.0 context variables (global assessment-level variables).
55
56
  * Managed by ContextVariableStore.
@@ -59,32 +60,33 @@ export interface TestSession {
59
60
  export declare function createMemoryStorage(initial?: Record<string, string>): StorageLike;
60
61
  export declare function getBrowserLocalStorage(): StorageLike | null;
61
62
  export declare function getOrCreateAnonymousDeviceId(storage: StorageLike): string;
62
- export declare function createTestSessionIdentifier(args: {
63
+ export declare function createTestAttemptSessionIdentifier(args: {
63
64
  assessmentId: string;
64
65
  assignmentId?: string | null;
65
66
  userId?: string | null;
66
67
  storage: StorageLike;
67
68
  }): {
68
- testSessionIdentifier: string;
69
+ testAttemptSessionIdentifier: string;
69
70
  seed: string;
70
71
  };
71
- export declare function getTestSessionStorageKey(testSessionIdentifier: string): string;
72
- export declare function loadTestSession(storage: StorageLike, testSessionIdentifier: string): TestSession | null;
73
- export declare function saveTestSession(storage: StorageLike, session: TestSession): void;
74
- export declare function createNewTestSession(args: {
75
- testSessionIdentifier: string;
72
+ export declare function getTestAttemptSessionStorageKey(testAttemptSessionIdentifier: string): string;
73
+ export declare function loadTestAttemptSession(storage: StorageLike, testAttemptSessionIdentifier: string): TestAttemptSession | null;
74
+ export declare function saveTestAttemptSession(storage: StorageLike, session: TestAttemptSession): void;
75
+ export declare function createNewTestAttemptSession(args: {
76
+ testAttemptSessionIdentifier: string;
76
77
  assessmentId: string;
77
78
  seed: string;
78
79
  itemIdentifiers: string[];
79
- }): TestSession;
80
- export declare function upsertVisitedItem(session: TestSession, itemIdentifier: string): TestSession;
81
- export declare function setCurrentPosition(session: TestSession, args: {
80
+ }): TestAttemptSession;
81
+ export declare function upsertVisitedItem(session: TestAttemptSession, itemIdentifier: string): TestAttemptSession;
82
+ export declare function setCurrentPosition(session: TestAttemptSession, args: {
82
83
  currentItemIndex: number;
83
84
  currentSectionIdentifier?: string;
84
- }): TestSession;
85
- export declare function upsertItemSessionFromPieSessionChange(session: TestSession, args: {
85
+ }): TestAttemptSession;
86
+ export declare function upsertItemSessionFromPieSessionChange(session: TestAttemptSession, args: {
86
87
  itemIdentifier: string;
87
88
  pieSessionId: string;
88
89
  isCompleted?: boolean;
89
- }): TestSession;
90
+ session?: unknown;
91
+ }): TestAttemptSession;
90
92
  //# sourceMappingURL=TestSession.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestSession.d.ts","sourceRoot":"","sources":["../../src/attempt/TestSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestSession.d.ts","sourceRoot":"","sources":["../../src/attempt/TestSession.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- const TEST_SESSION_VERSION = 1;
2
- const STORAGE_PREFIX = "pieoneer:testSession:v1:";
1
+ const TEST_ATTEMPT_SESSION_VERSION = 1;
2
+ const STORAGE_PREFIX = "pieoneer:testAttemptSession:v1:";
3
3
  const ANON_DEVICE_ID_KEY = "pieoneer:anonymousDeviceId:v1";
4
4
  export function createMemoryStorage(initial = {}) {
5
5
  const store = new Map(Object.entries(initial));
@@ -64,7 +64,7 @@ export function getOrCreateAnonymousDeviceId(storage) {
64
64
  storage.setItem(ANON_DEVICE_ID_KEY, created);
65
65
  return created;
66
66
  }
67
- export function createTestSessionIdentifier(args) {
67
+ export function createTestAttemptSessionIdentifier(args) {
68
68
  const { assessmentId, assignmentId, userId, storage } = args;
69
69
  if (!assessmentId) {
70
70
  throw new Error("assessmentId is required to create a TestSession identifier");
@@ -72,39 +72,40 @@ export function createTestSessionIdentifier(args) {
72
72
  const subject = userId || getOrCreateAnonymousDeviceId(storage);
73
73
  const source = `v1|${assessmentId}|${assignmentId || ""}|${subject}`;
74
74
  const seed = fnv1a32Hex(source);
75
- return { testSessionIdentifier: `ts_v1_${seed}`, seed };
75
+ return { testAttemptSessionIdentifier: `tas_v1_${seed}`, seed };
76
76
  }
77
- export function getTestSessionStorageKey(testSessionIdentifier) {
78
- return `${STORAGE_PREFIX}${testSessionIdentifier}`;
77
+ export function getTestAttemptSessionStorageKey(testAttemptSessionIdentifier) {
78
+ return `${STORAGE_PREFIX}${testAttemptSessionIdentifier}`;
79
79
  }
80
- export function loadTestSession(storage, testSessionIdentifier) {
81
- const raw = storage.getItem(getTestSessionStorageKey(testSessionIdentifier));
80
+ export function loadTestAttemptSession(storage, testAttemptSessionIdentifier) {
81
+ const raw = storage.getItem(getTestAttemptSessionStorageKey(testAttemptSessionIdentifier));
82
82
  if (!raw)
83
83
  return null;
84
84
  try {
85
85
  const parsed = JSON.parse(raw);
86
- if (!parsed || parsed.version !== TEST_SESSION_VERSION)
86
+ if (!parsed || parsed.version !== TEST_ATTEMPT_SESSION_VERSION)
87
87
  return null;
88
- if (parsed.testSessionIdentifier !== testSessionIdentifier)
88
+ if (parsed.testAttemptSessionIdentifier !== testAttemptSessionIdentifier) {
89
89
  return null;
90
+ }
90
91
  return parsed;
91
92
  }
92
93
  catch {
93
94
  return null;
94
95
  }
95
96
  }
96
- export function saveTestSession(storage, session) {
97
+ export function saveTestAttemptSession(storage, session) {
97
98
  const updated = {
98
99
  ...session,
99
100
  updatedAt: nowIso(),
100
101
  };
101
- storage.setItem(getTestSessionStorageKey(session.testSessionIdentifier), JSON.stringify(updated));
102
+ storage.setItem(getTestAttemptSessionStorageKey(session.testAttemptSessionIdentifier), JSON.stringify(updated));
102
103
  }
103
- export function createNewTestSession(args) {
104
+ export function createNewTestAttemptSession(args) {
104
105
  const startedAt = nowIso();
105
106
  return {
106
- version: TEST_SESSION_VERSION,
107
- testSessionIdentifier: args.testSessionIdentifier,
107
+ version: TEST_ATTEMPT_SESSION_VERSION,
108
+ testAttemptSessionIdentifier: args.testAttemptSessionIdentifier,
108
109
  assessmentId: args.assessmentId,
109
110
  startedAt,
110
111
  updatedAt: startedAt,
@@ -162,6 +163,7 @@ export function upsertItemSessionFromPieSessionChange(session, args) {
162
163
  startedAt: existing?.startedAt || now,
163
164
  updatedAt: now,
164
165
  completedAt: completed ? existing?.completedAt || now : undefined,
166
+ session: args.session ?? existing?.session,
165
167
  };
166
168
  return {
167
169
  ...session,
@@ -1 +1 @@
1
- {"version":3,"file":"TestSession.js","sourceRoot":"","sources":["../../src/attempt/TestSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestSession.js","sourceRoot":"","sources":["../../src/attempt/TestSession.ts"],"names":[],"mappings":"AAyEA,MAAM,4BAA4B,GAAG,CAAU,CAAC;AAChD,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAE3D,MAAM,UAAU,mBAAmB,CAClC,UAAkC,EAAE;IAEpC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,OAAO;QACN,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjB,CAAC;QACD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE;YACjB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,IAAI,CAAC;QACJ,oCAAoC;QACpC,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAC/C,oCAAoC;QACpC,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QACtC,oCAAoC;QACpC,OAAO,MAAM,CAAC,YAAY,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,MAAM;IACd,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACjC,CAAC;AAED,kEAAkE;AAClE,SAAS,UAAU,CAAC,KAAa;IAChC,IAAI,IAAI,GAAG,UAAU,CAAC,CAAC,eAAe;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,0CAA0C;QAC1C,IAAI;YACH,CAAC,IAAI;gBACJ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;oBACX,CAAC,IAAI,IAAI,CAAC,CAAC;oBACX,CAAC,IAAI,IAAI,CAAC,CAAC;oBACX,CAAC,IAAI,IAAI,CAAC,CAAC;oBACX,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChB,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ;IAChB,MAAM,SAAS,GAAI,UAAkB,EAAE,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAoB;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAKlD;IACA,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,YAAY,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CACd,6DAA6D,CAC7D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,YAAY,IAAI,YAAY,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,4BAA4B,EAAE,UAAU,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC9C,4BAAoC;IAEpC,OAAO,GAAG,cAAc,GAAG,4BAA4B,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,OAAoB,EACpB,4BAAoC;IAEpC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAC1B,+BAA+B,CAAC,4BAA4B,CAAC,CAC7D,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,4BAA4B;YAAE,OAAO,IAAI,CAAC;QAC5E,IAAI,MAAM,CAAC,4BAA4B,KAAK,4BAA4B,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,OAAoB,EACpB,OAA2B;IAE3B,MAAM,OAAO,GAAuB;QACnC,GAAG,OAAO;QACV,SAAS,EAAE,MAAM,EAAE;KACnB,CAAC;IACF,OAAO,CAAC,OAAO,CACd,+BAA+B,CAAC,OAAO,CAAC,4BAA4B,CAAC,EACrE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAK3C;IACA,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO;QACN,OAAO,EAAE,4BAA4B;QACrC,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;QAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,SAAS;QACT,SAAS,EAAE,SAAS;QACpB,eAAe,EAAE;YAChB,gBAAgB,EAAE,CAAC,CAAC;YACpB,sBAAsB,EAAE,EAAE;SAC1B;QACD,WAAW,EAAE;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,IAAI,CAAC,eAAe;SACrC;QACD,YAAY,EAAE,EAAE;KAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,OAA2B,EAC3B,cAAsB;IAEtB,IAAI,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO;QACN,GAAG,OAAO;QACV,eAAe,EAAE;YAChB,GAAG,OAAO,CAAC,eAAe;YAC1B,sBAAsB,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;SAC3C;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,OAA2B,EAC3B,IAGC;IAED,OAAO;QACN,GAAG,OAAO;QACV,eAAe,EAAE;YAChB,GAAG,OAAO,CAAC,eAAe;YAC1B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;SACvD;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qCAAqC,CACpD,OAA2B,EAC3B,IAKC;IAED,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC3D,IAAI,CAAC,cAAc,IAAI,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC;IAErD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAEtD,MAAM,YAAY,GACjB,QAAQ,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,KAAK,YAAY;QAC1E,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC;QAC3B,CAAC,CAAC,QAAQ;YACT,CAAC,CAAC,QAAQ,CAAC,YAAY;YACvB,CAAC,CAAC,CAAC,CAAC;IAEP,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE3D,MAAM,IAAI,GAA2B;QACpC,cAAc;QACd,YAAY;QACZ,YAAY;QACZ,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;QACrC,SAAS,EAAE,GAAG;QACd,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS;QACjE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO;KAC1C,CAAC;IAEF,OAAO;QACN,GAAG,OAAO;QACV,YAAY,EAAE;YACb,GAAG,OAAO,CAAC,YAAY;YACvB,CAAC,cAAc,CAAC,EAAE,IAAI;SACtB;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { TestAttemptSession } from "../TestSession.js";
2
+ export interface PieBackendActivityItemRef {
3
+ identifier?: string;
4
+ item?: {
5
+ id?: string;
6
+ identifier?: string;
7
+ };
8
+ }
9
+ export interface PieBackendActivityDefinition {
10
+ id?: string;
11
+ identifier?: string;
12
+ assessmentId?: string;
13
+ assessmentItemRefs?: PieBackendActivityItemRef[];
14
+ }
15
+ export interface PieBackendActivitySession {
16
+ id?: string;
17
+ activitySessionId?: string;
18
+ startedAt?: string;
19
+ updatedAt?: string;
20
+ completedAt?: string;
21
+ currentItemIndex?: number;
22
+ currentSectionIdentifier?: string;
23
+ visitedItemIdentifiers?: string[];
24
+ itemSessions?: Record<string, unknown>;
25
+ }
26
+ export interface MapActivityToTestAttemptSessionArgs {
27
+ activityDefinition?: PieBackendActivityDefinition | null;
28
+ activitySession?: PieBackendActivitySession | null;
29
+ itemRefs?: PieBackendActivityItemRef[];
30
+ itemSessionsByItemIdentifier?: Record<string, unknown>;
31
+ assessmentId?: string;
32
+ testAttemptSessionIdentifier?: string;
33
+ }
34
+ export interface ActivitySessionPatchPayload {
35
+ activitySession: {
36
+ id: string;
37
+ startedAt?: string;
38
+ updatedAt?: string;
39
+ completedAt?: string;
40
+ currentItemIndex: number;
41
+ currentSectionIdentifier?: string;
42
+ visitedItemIdentifiers: string[];
43
+ itemSessions: Record<string, unknown>;
44
+ };
45
+ }
46
+ export declare function mapActivityToTestAttemptSession(args: MapActivityToTestAttemptSessionArgs): TestAttemptSession;
47
+ export declare function toItemSessionsRecord(testAttemptSession: TestAttemptSession): Record<string, unknown>;
48
+ export declare function buildActivitySessionPatchFromTestAttemptSession(testAttemptSession: TestAttemptSession): ActivitySessionPatchPayload;
49
+ export declare function buildActivitySessionItemUpdate(testAttemptSession: TestAttemptSession, itemIdentifier: string): ActivitySessionPatchPayload;
50
+ //# sourceMappingURL=activity-to-test-attempt-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-to-test-attempt-session.d.ts","sourceRoot":"","sources":["../../../src/attempt/adapters/activity-to-test-attempt-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,kBAAkB,EAClB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,yBAAyB;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACF;AAED,MAAM,WAAW,4BAA4B;IAC5C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,yBAAyB;IACzC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,mCAAmC;IACnD,kBAAkB,CAAC,EAAE,4BAA4B,GAAG,IAAI,CAAC;IACzD,eAAe,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACvC,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,2BAA2B;IAC3C,eAAe,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;QAClC,sBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;CACF;AAsGD,wBAAgB,+BAA+B,CAC9C,IAAI,EAAE,mCAAmC,GACvC,kBAAkB,CAgCpB;AAED,wBAAgB,oBAAoB,CACnC,kBAAkB,EAAE,kBAAkB,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAED,wBAAgB,+CAA+C,CAC9D,kBAAkB,EAAE,kBAAkB,GACpC,2BAA2B,CAgB7B;AAED,wBAAgB,8BAA8B,CAC7C,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,GACpB,2BAA2B,CAc7B"}