@pie-players/pie-assessment-toolkit 0.2.0

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 (194) hide show
  1. package/README.md +520 -0
  2. package/dist/attempt/TestSession.d.ts +90 -0
  3. package/dist/attempt/TestSession.d.ts.map +1 -0
  4. package/dist/attempt/TestSession.js +174 -0
  5. package/dist/attempt/TestSession.js.map +1 -0
  6. package/dist/core/TypedEventBus.d.ts +48 -0
  7. package/dist/core/TypedEventBus.d.ts.map +1 -0
  8. package/dist/core/TypedEventBus.js +63 -0
  9. package/dist/core/TypedEventBus.js.map +1 -0
  10. package/dist/index.d.ts +37 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +44 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/item-loader.d.ts +45 -0
  15. package/dist/item-loader.d.ts.map +1 -0
  16. package/dist/item-loader.js +62 -0
  17. package/dist/item-loader.js.map +1 -0
  18. package/dist/player/AssessmentPlayer.d.ts +388 -0
  19. package/dist/player/AssessmentPlayer.d.ts.map +1 -0
  20. package/dist/player/AssessmentPlayer.js +965 -0
  21. package/dist/player/AssessmentPlayer.js.map +1 -0
  22. package/dist/player/index.d.ts +17 -0
  23. package/dist/player/index.d.ts.map +1 -0
  24. package/dist/player/index.js +15 -0
  25. package/dist/player/index.js.map +1 -0
  26. package/dist/player/navigation-types.d.ts +63 -0
  27. package/dist/player/navigation-types.d.ts.map +1 -0
  28. package/dist/player/navigation-types.js +7 -0
  29. package/dist/player/navigation-types.js.map +1 -0
  30. package/dist/player/qti-navigation.d.ts +29 -0
  31. package/dist/player/qti-navigation.d.ts.map +1 -0
  32. package/dist/player/qti-navigation.js +160 -0
  33. package/dist/player/qti-navigation.js.map +1 -0
  34. package/dist/reference-layout/index.d.ts +19 -0
  35. package/dist/reference-layout/index.d.ts.map +1 -0
  36. package/dist/reference-layout/index.js +20 -0
  37. package/dist/reference-layout/index.js.map +1 -0
  38. package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
  39. package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
  40. package/dist/services/AccessibilityCatalogResolver.js +249 -0
  41. package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
  42. package/dist/services/AssessmentAuthoringService.d.ts +60 -0
  43. package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
  44. package/dist/services/AssessmentAuthoringService.js +183 -0
  45. package/dist/services/AssessmentAuthoringService.js.map +1 -0
  46. package/dist/services/ContextVariableStore.d.ts +114 -0
  47. package/dist/services/ContextVariableStore.d.ts.map +1 -0
  48. package/dist/services/ContextVariableStore.js +207 -0
  49. package/dist/services/ContextVariableStore.js.map +1 -0
  50. package/dist/services/ElementToolStateStore.d.ts +125 -0
  51. package/dist/services/ElementToolStateStore.d.ts.map +1 -0
  52. package/dist/services/ElementToolStateStore.js +200 -0
  53. package/dist/services/ElementToolStateStore.js.map +1 -0
  54. package/dist/services/HighlightCoordinator.d.ts +179 -0
  55. package/dist/services/HighlightCoordinator.d.ts.map +1 -0
  56. package/dist/services/HighlightCoordinator.js +446 -0
  57. package/dist/services/HighlightCoordinator.js.map +1 -0
  58. package/dist/services/I18nService.d.ts +121 -0
  59. package/dist/services/I18nService.d.ts.map +1 -0
  60. package/dist/services/I18nService.js +276 -0
  61. package/dist/services/I18nService.js.map +1 -0
  62. package/dist/services/PNPMapper.d.ts +71 -0
  63. package/dist/services/PNPMapper.d.ts.map +1 -0
  64. package/dist/services/PNPMapper.js +98 -0
  65. package/dist/services/PNPMapper.js.map +1 -0
  66. package/dist/services/PNPToolResolver.d.ts +127 -0
  67. package/dist/services/PNPToolResolver.d.ts.map +1 -0
  68. package/dist/services/PNPToolResolver.js +222 -0
  69. package/dist/services/PNPToolResolver.js.map +1 -0
  70. package/dist/services/SSMLExtractor.d.ts +61 -0
  71. package/dist/services/SSMLExtractor.d.ts.map +1 -0
  72. package/dist/services/SSMLExtractor.js +181 -0
  73. package/dist/services/SSMLExtractor.js.map +1 -0
  74. package/dist/services/TTSService.d.ts +162 -0
  75. package/dist/services/TTSService.d.ts.map +1 -0
  76. package/dist/services/TTSService.js +465 -0
  77. package/dist/services/TTSService.js.map +1 -0
  78. package/dist/services/ThemeProvider.d.ts +95 -0
  79. package/dist/services/ThemeProvider.d.ts.map +1 -0
  80. package/dist/services/ThemeProvider.js +299 -0
  81. package/dist/services/ThemeProvider.js.map +1 -0
  82. package/dist/services/ToolConfigResolver.d.ts +162 -0
  83. package/dist/services/ToolConfigResolver.d.ts.map +1 -0
  84. package/dist/services/ToolConfigResolver.js +230 -0
  85. package/dist/services/ToolConfigResolver.js.map +1 -0
  86. package/dist/services/ToolCoordinator.d.ts +137 -0
  87. package/dist/services/ToolCoordinator.d.ts.map +1 -0
  88. package/dist/services/ToolCoordinator.js +318 -0
  89. package/dist/services/ToolCoordinator.js.map +1 -0
  90. package/dist/services/ToolkitCoordinator.d.ts +188 -0
  91. package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
  92. package/dist/services/ToolkitCoordinator.js +252 -0
  93. package/dist/services/ToolkitCoordinator.js.map +1 -0
  94. package/dist/services/interfaces.d.ts +391 -0
  95. package/dist/services/interfaces.d.ts.map +1 -0
  96. package/dist/services/interfaces.js +12 -0
  97. package/dist/services/interfaces.js.map +1 -0
  98. package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
  99. package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
  100. package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
  101. package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
  102. package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
  103. package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
  104. package/dist/services/tool-providers/IToolProvider.js +13 -0
  105. package/dist/services/tool-providers/IToolProvider.js.map +1 -0
  106. package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
  107. package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
  108. package/dist/services/tool-providers/TIToolProvider.js +123 -0
  109. package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
  110. package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
  111. package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
  112. package/dist/services/tool-providers/TTSToolProvider.js +168 -0
  113. package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
  114. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
  115. package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
  116. package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
  117. package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
  118. package/dist/services/tool-providers/index.d.ts +18 -0
  119. package/dist/services/tool-providers/index.d.ts.map +1 -0
  120. package/dist/services/tool-providers/index.js +15 -0
  121. package/dist/services/tool-providers/index.js.map +1 -0
  122. package/dist/services/tts/browser-provider.d.ts +24 -0
  123. package/dist/services/tts/browser-provider.d.ts.map +1 -0
  124. package/dist/services/tts/browser-provider.js +177 -0
  125. package/dist/services/tts/browser-provider.js.map +1 -0
  126. package/dist/services/tts/provider-interface.d.ts +131 -0
  127. package/dist/services/tts/provider-interface.d.ts.map +1 -0
  128. package/dist/services/tts/provider-interface.js +10 -0
  129. package/dist/services/tts/provider-interface.js.map +1 -0
  130. package/dist/tools/calculators/desmos-provider.d.ts +54 -0
  131. package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
  132. package/dist/tools/calculators/desmos-provider.js +384 -0
  133. package/dist/tools/calculators/desmos-provider.js.map +1 -0
  134. package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
  135. package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
  136. package/dist/tools/calculators/mathjs-provider.js +660 -0
  137. package/dist/tools/calculators/mathjs-provider.js.map +1 -0
  138. package/dist/tools/calculators/ti-provider.d.ts +122 -0
  139. package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
  140. package/dist/tools/calculators/ti-provider.js +587 -0
  141. package/dist/tools/calculators/ti-provider.js.map +1 -0
  142. package/dist/tools/client.d.ts +17 -0
  143. package/dist/tools/client.d.ts.map +1 -0
  144. package/dist/tools/client.js +26 -0
  145. package/dist/tools/client.js.map +1 -0
  146. package/dist/tools/index.d.ts +8 -0
  147. package/dist/tools/index.d.ts.map +1 -0
  148. package/dist/tools/index.js +10 -0
  149. package/dist/tools/index.js.map +1 -0
  150. package/dist/tools/library-loader.d.ts +63 -0
  151. package/dist/tools/library-loader.d.ts.map +1 -0
  152. package/dist/tools/library-loader.js +292 -0
  153. package/dist/tools/library-loader.js.map +1 -0
  154. package/dist/tools/response-discovery.d.ts +72 -0
  155. package/dist/tools/response-discovery.d.ts.map +1 -0
  156. package/dist/tools/response-discovery.js +183 -0
  157. package/dist/tools/response-discovery.js.map +1 -0
  158. package/dist/tools/tool-coordinator.d.ts +76 -0
  159. package/dist/tools/tool-coordinator.d.ts.map +1 -0
  160. package/dist/tools/tool-coordinator.js +197 -0
  161. package/dist/tools/tool-coordinator.js.map +1 -0
  162. package/dist/tools/types.d.ts +427 -0
  163. package/dist/tools/types.d.ts.map +1 -0
  164. package/dist/tools/types.js +13 -0
  165. package/dist/tools/types.js.map +1 -0
  166. package/dist/tools/variant-resolver.d.ts +48 -0
  167. package/dist/tools/variant-resolver.d.ts.map +1 -0
  168. package/dist/tools/variant-resolver.js +214 -0
  169. package/dist/tools/variant-resolver.js.map +1 -0
  170. package/dist/types/events.d.ts +157 -0
  171. package/dist/types/events.d.ts.map +1 -0
  172. package/dist/types/events.js +11 -0
  173. package/dist/types/events.js.map +1 -0
  174. package/dist/utils/logger.d.ts +7 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +11 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +71 -0
  179. package/src/README.md +626 -0
  180. package/src/components/QuestionToolBar.svelte +406 -0
  181. package/src/player/AssessmentLayout.svelte +68 -0
  182. package/src/player/README.md +154 -0
  183. package/src/reference-layout/README.md +135 -0
  184. package/src/reference-layout/ReferenceLayout.svelte +209 -0
  185. package/src/reference-layout/components/AssessmentContent.svelte +259 -0
  186. package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
  187. package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
  188. package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
  189. package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
  190. package/src/reference-layout/components/ItemPanel.svelte +200 -0
  191. package/src/reference-layout/components/NotesPanel.svelte +179 -0
  192. package/src/reference-layout/components/PassagePanel.svelte +76 -0
  193. package/src/tools/README.md +616 -0
  194. package/src/tools/calculators/README.md +395 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Browser TTS Provider
3
+ *
4
+ * Text-to-speech provider using the browser's Web Speech API.
5
+ * Works in all modern browsers that support SpeechSynthesis.
6
+ *
7
+ * Part of PIE Assessment Toolkit.
8
+ */
9
+ /**
10
+ * Browser TTS Provider
11
+ *
12
+ * Stateless factory for creating browser-based TTS implementations.
13
+ */
14
+ export class BrowserTTSProvider {
15
+ providerId = "browser";
16
+ providerName = "Browser Speech Synthesis";
17
+ version = "1.0.0";
18
+ async initialize(config) {
19
+ // SSR guard
20
+ if (typeof window === "undefined") {
21
+ throw new Error("BrowserTTSProvider requires browser environment");
22
+ }
23
+ // Check browser support
24
+ if (!("speechSynthesis" in window)) {
25
+ throw new Error("Browser does not support Speech Synthesis API");
26
+ }
27
+ return new BrowserTTSProviderImpl(config);
28
+ }
29
+ supportsFeature(feature) {
30
+ // Browser supports all TTS features
31
+ return true;
32
+ }
33
+ getCapabilities() {
34
+ return {
35
+ supportsPause: true,
36
+ supportsResume: true,
37
+ supportsWordBoundary: true,
38
+ supportsVoiceSelection: true,
39
+ supportsRateControl: true,
40
+ supportsPitchControl: true,
41
+ };
42
+ }
43
+ destroy() {
44
+ // No cleanup needed for browser provider
45
+ }
46
+ }
47
+ /**
48
+ * Browser TTS Provider Implementation
49
+ *
50
+ * Handles actual speech synthesis using the Web Speech API.
51
+ */
52
+ class BrowserTTSProviderImpl {
53
+ utterance = null;
54
+ config = null;
55
+ _isPlaying = false;
56
+ _isPaused = false;
57
+ constructor(config) {
58
+ this.config = config;
59
+ }
60
+ async speak(text) {
61
+ return new Promise((resolve, reject) => {
62
+ if (!this.config) {
63
+ reject(new Error("TTS not initialized"));
64
+ return;
65
+ }
66
+ this.stop(); // Stop any ongoing speech
67
+ this.utterance = new SpeechSynthesisUtterance(text);
68
+ // Track for word boundary fallback
69
+ let lastBoundaryIndex = -1;
70
+ let boundaryCount = 0;
71
+ // Apply config
72
+ if (this.config.voice) {
73
+ const voices = speechSynthesis.getVoices();
74
+ const voice = voices.find((v) => v.name === this.config.voice);
75
+ if (voice)
76
+ this.utterance.voice = voice;
77
+ }
78
+ if (this.config.rate)
79
+ this.utterance.rate = this.config.rate;
80
+ if (this.config.pitch)
81
+ this.utterance.pitch = this.config.pitch;
82
+ // Set up event handlers
83
+ this.utterance.onstart = () => {
84
+ this._isPlaying = true;
85
+ this._isPaused = false;
86
+ };
87
+ this.utterance.onend = () => {
88
+ this._isPlaying = false;
89
+ this._isPaused = false;
90
+ resolve();
91
+ };
92
+ this.utterance.onerror = (event) => {
93
+ this._isPlaying = false;
94
+ this._isPaused = false;
95
+ // Ignore "interrupted" errors (expected when user stops TTS)
96
+ if (event.error === "interrupted" || event.error === "canceled") {
97
+ resolve(); // Treat interruption as successful completion
98
+ return;
99
+ }
100
+ reject(new Error(`Speech synthesis error: ${event.error}`));
101
+ };
102
+ this.utterance.onpause = () => {
103
+ this._isPaused = true;
104
+ };
105
+ this.utterance.onresume = () => {
106
+ this._isPaused = false;
107
+ };
108
+ // Word boundary events (if supported)
109
+ this.utterance.onboundary = (event) => {
110
+ console.log("[BrowserProvider] Boundary event:", event.name, "charIndex:", event.charIndex, "charLength:", event.charLength);
111
+ if (event.name === "word" && this.onWordBoundary) {
112
+ boundaryCount++;
113
+ // Detect if browser word boundaries are broken (Safari bug)
114
+ // If we get multiple events at the same position, boundaries don't work
115
+ if (event.charIndex === lastBoundaryIndex && boundaryCount > 2) {
116
+ console.warn("[BrowserProvider] Browser word boundaries broken - disabling word highlighting");
117
+ if (this.utterance) {
118
+ this.utterance.onboundary = null; // Stop listening
119
+ }
120
+ return;
121
+ }
122
+ lastBoundaryIndex = event.charIndex;
123
+ // Extract word from text
124
+ const word = text.substring(event.charIndex, event.charIndex + (event.charLength || 0));
125
+ console.log("[BrowserProvider] Calling onWordBoundary with word:", word, "at position:", event.charIndex);
126
+ this.onWordBoundary(word, event.charIndex);
127
+ }
128
+ };
129
+ // Start speaking
130
+ speechSynthesis.speak(this.utterance);
131
+ });
132
+ }
133
+ pause() {
134
+ if (this._isPlaying && !this._isPaused) {
135
+ speechSynthesis.pause();
136
+ }
137
+ }
138
+ resume() {
139
+ if (this._isPlaying && this._isPaused) {
140
+ speechSynthesis.resume();
141
+ }
142
+ }
143
+ stop() {
144
+ if (this._isPlaying) {
145
+ speechSynthesis.cancel();
146
+ this._isPlaying = false;
147
+ this._isPaused = false;
148
+ }
149
+ }
150
+ isPlaying() {
151
+ return this._isPlaying && !this._isPaused;
152
+ }
153
+ isPaused() {
154
+ return this._isPaused;
155
+ }
156
+ /**
157
+ * Update settings dynamically (rate, pitch, voice)
158
+ * Changes take effect on the next speak() call
159
+ */
160
+ updateSettings(settings) {
161
+ if (!this.config) {
162
+ this.config = {};
163
+ }
164
+ // Update config with new settings
165
+ if (settings.rate !== undefined) {
166
+ this.config.rate = settings.rate;
167
+ }
168
+ if (settings.pitch !== undefined) {
169
+ this.config.pitch = settings.pitch;
170
+ }
171
+ if (settings.voice !== undefined) {
172
+ this.config.voice = settings.voice;
173
+ }
174
+ }
175
+ onWordBoundary;
176
+ }
177
+ //# sourceMappingURL=browser-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-provider.js","sourceRoot":"","sources":["../../../src/services/tts/browser-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * TTS Provider Interfaces
3
+ *
4
+ * Defines the contract for text-to-speech providers.
5
+ * Providers are stateless factories that create configured TTS implementations.
6
+ *
7
+ * Part of PIE Assessment Toolkit.
8
+ */
9
+ import type { TTSConfig } from "../TTSService";
10
+ /**
11
+ * TTS Provider interface
12
+ *
13
+ * Providers are stateless factories that create TTS implementations.
14
+ * They describe capabilities and create configured instances.
15
+ */
16
+ export interface ITTSProvider {
17
+ /**
18
+ * Unique identifier for this provider
19
+ */
20
+ readonly providerId: string;
21
+ /**
22
+ * Human-readable provider name
23
+ */
24
+ readonly providerName: string;
25
+ /**
26
+ * Provider version
27
+ */
28
+ readonly version: string;
29
+ /**
30
+ * Initialize and create a configured TTS implementation
31
+ */
32
+ initialize(config: TTSConfig): Promise<ITTSProviderImplementation>;
33
+ /**
34
+ * Check if a specific feature is supported
35
+ */
36
+ supportsFeature(feature: TTSFeature): boolean;
37
+ /**
38
+ * Get provider capabilities
39
+ */
40
+ getCapabilities(): TTSProviderCapabilities;
41
+ /**
42
+ * Clean up provider resources
43
+ */
44
+ destroy(): void;
45
+ }
46
+ /**
47
+ * TTS Provider Implementation interface
48
+ *
49
+ * The actual TTS implementation that handles playback.
50
+ * Created by ITTSProvider.initialize()
51
+ */
52
+ export interface ITTSProviderImplementation {
53
+ /**
54
+ * Speak text
55
+ */
56
+ speak(text: string): Promise<void>;
57
+ /**
58
+ * Pause playback
59
+ */
60
+ pause(): void;
61
+ /**
62
+ * Resume playback
63
+ */
64
+ resume(): void;
65
+ /**
66
+ * Stop playback
67
+ */
68
+ stop(): void;
69
+ /**
70
+ * Check if currently playing
71
+ */
72
+ isPlaying(): boolean;
73
+ /**
74
+ * Check if paused
75
+ */
76
+ isPaused(): boolean;
77
+ /**
78
+ * Update settings dynamically (optional)
79
+ * Allows changing rate, pitch, and voice without full reinitialization.
80
+ * Changes take effect on the next speak() call.
81
+ */
82
+ updateSettings?(settings: Partial<TTSConfig>): void | Promise<void>;
83
+ /**
84
+ * Word boundary callback (optional)
85
+ * Called during speech for word highlighting
86
+ * @param word - The word being spoken (may be empty for server providers)
87
+ * @param position - Character position in the text
88
+ * @param length - Optional word length (for server providers with speech marks)
89
+ */
90
+ onWordBoundary?: (word: string, position: number, length?: number) => void;
91
+ }
92
+ /**
93
+ * TTS Provider capabilities
94
+ *
95
+ * Describes which features a provider supports
96
+ */
97
+ export interface TTSProviderCapabilities {
98
+ /**
99
+ * Supports pause/resume
100
+ */
101
+ supportsPause: boolean;
102
+ /**
103
+ * Supports resume after pause
104
+ */
105
+ supportsResume: boolean;
106
+ /**
107
+ * Supports word boundary events for highlighting
108
+ */
109
+ supportsWordBoundary: boolean;
110
+ /**
111
+ * Supports voice selection
112
+ */
113
+ supportsVoiceSelection: boolean;
114
+ /**
115
+ * Supports rate control (speed)
116
+ */
117
+ supportsRateControl: boolean;
118
+ /**
119
+ * Supports pitch control
120
+ */
121
+ supportsPitchControl: boolean;
122
+ /**
123
+ * Maximum text length (if limited)
124
+ */
125
+ maxTextLength?: number;
126
+ }
127
+ /**
128
+ * TTS features for capability checking
129
+ */
130
+ export type TTSFeature = "pause" | "resume" | "wordBoundary" | "voiceSelection" | "rateControl" | "pitchControl";
131
+ //# sourceMappingURL=provider-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-interface.d.ts","sourceRoot":"","sources":["../../../src/services/tts/provider-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAEnE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IAE9C;;OAEG;IACH,eAAe,IAAI,uBAAuB,CAAC;IAE3C;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;IAEf;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC;IAErB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpE;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3E;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACvC;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,cAAc,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,sBAAsB,EAAE,OAAO,CAAC;IAEhC;;OAEG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GACnB,OAAO,GACP,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * TTS Provider Interfaces
3
+ *
4
+ * Defines the contract for text-to-speech providers.
5
+ * Providers are stateless factories that create configured TTS implementations.
6
+ *
7
+ * Part of PIE Assessment Toolkit.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=provider-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-interface.js","sourceRoot":"","sources":["../../../src/services/tts/provider-interface.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Desmos Calculator Provider
3
+ * Implementation of CalculatorProvider for Desmos calculators
4
+ *
5
+ * Supports: Basic, Scientific, and Graphing calculators
6
+ * Based on Desmos API v1.10+
7
+ */
8
+ import type { Calculator, CalculatorProvider, CalculatorProviderCapabilities, CalculatorProviderConfig, CalculatorType } from "@pie-players/pie-calculator";
9
+ /**
10
+ * Desmos Calculator Provider Implementation
11
+ */
12
+ export declare class DesmosCalculatorProvider implements CalculatorProvider {
13
+ readonly providerId = "desmos";
14
+ readonly providerName = "Desmos";
15
+ readonly supportedTypes: CalculatorType[];
16
+ readonly version = "1.10";
17
+ private initialized;
18
+ private apiKey?;
19
+ /**
20
+ * Get the configured API key
21
+ */
22
+ getApiKey(): string | undefined;
23
+ /**
24
+ * Initialize Desmos library
25
+ * @param config Optional configuration including API key
26
+ */
27
+ initialize(config?: {
28
+ apiKey?: string;
29
+ }): Promise<void>;
30
+ /**
31
+ * Create a calculator instance
32
+ */
33
+ createCalculator(type: CalculatorType, container: HTMLElement, config?: CalculatorProviderConfig): Promise<Calculator>;
34
+ /**
35
+ * Check if type is supported
36
+ */
37
+ supportsType(type: CalculatorType): boolean;
38
+ /**
39
+ * Cleanup (no-op for Desmos)
40
+ */
41
+ destroy(): void;
42
+ /**
43
+ * Get provider capabilities
44
+ */
45
+ getCapabilities(): CalculatorProviderCapabilities;
46
+ }
47
+ /**
48
+ * Singleton provider instance (deprecated)
49
+ * @deprecated Instantiate DesmosCalculatorProvider directly instead:
50
+ * const provider = new DesmosCalculatorProvider();
51
+ * await provider.initialize();
52
+ */
53
+ export declare const desmosProvider: DesmosCalculatorProvider;
54
+ //# sourceMappingURL=desmos-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desmos-provider.d.ts","sourceRoot":"","sources":["../../../src/tools/calculators/desmos-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEX,UAAU,EACV,kBAAkB,EAClB,8BAA8B,EAC9B,wBAAwB,EAExB,cAAc,EAEd,MAAM,6BAA6B,CAAC;AAGrC;;GAEG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IAClE,QAAQ,CAAC,UAAU,YAAY;IAC/B,QAAQ,CAAC,YAAY,YAAY;IACjC,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,CAIvC;IACF,QAAQ,CAAC,OAAO,UAAU;IAE1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B;;;OAGG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC7D;;OAEG;IACG,gBAAgB,CACrB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC;IAYtB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAI3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,eAAe,IAAI,8BAA8B;CAUjD;AA6UD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,0BAAiC,CAAC"}