@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,10 @@
1
+ /**
2
+ * Tool system exports
3
+ *
4
+ * For custom elements and client-side code, use '$lib/assessment-toolkit/tools/client' instead.
5
+ */
6
+ // Re-export everything from client.ts (client-safe code)
7
+ export * from "./client";
8
+ // Variant resolver
9
+ export { VariantResolverImpl, variantResolver } from "./variant-resolver";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yDAAyD;AACzD,cAAc,UAAU,CAAC;AACzB,mBAAmB;AACnB,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Library Loader Service
3
+ * Dynamically loads external JavaScript libraries with retry logic and fallback URLs
4
+ *
5
+ * Based on architectural enhancements from renaissance-tool-analyses.md
6
+ * Supports both static and dynamic library loading
7
+ */
8
+ import type { LibraryConfig, LibraryLoader, LoaderStats } from "./types";
9
+ /**
10
+ * Implementation of LibraryLoader service
11
+ */
12
+ export declare class LibraryLoaderImpl implements LibraryLoader {
13
+ private loadedLibraries;
14
+ private pendingLoads;
15
+ private failedLibraries;
16
+ private stats;
17
+ /**
18
+ * Load a JavaScript library
19
+ */
20
+ loadScript(library: LibraryConfig): Promise<void>;
21
+ /**
22
+ * Load a stylesheet
23
+ */
24
+ loadStylesheet(url: string): Promise<void>;
25
+ /**
26
+ * Check if a library is already loaded
27
+ */
28
+ isLoaded(libraryId: string): boolean;
29
+ /**
30
+ * Preload multiple libraries in parallel
31
+ */
32
+ preload(libraries: LibraryConfig[]): Promise<void>;
33
+ /**
34
+ * Unload a library (remove script tag)
35
+ */
36
+ unload(libraryId: string): void;
37
+ /**
38
+ * Get loader statistics
39
+ */
40
+ getStats(): LoaderStats;
41
+ /**
42
+ * Load script with retry logic
43
+ */
44
+ private _loadScriptWithRetry;
45
+ /**
46
+ * Load script from a specific URL
47
+ */
48
+ private _loadScriptFromUrl;
49
+ /**
50
+ * Sleep utility for retry delays
51
+ */
52
+ private _sleep;
53
+ }
54
+ /**
55
+ * Singleton instance
56
+ */
57
+ export declare const libraryLoader: LibraryLoaderImpl;
58
+ /**
59
+ * Common library configurations
60
+ * Based on industry best practices and platform analyses
61
+ */
62
+ export declare const COMMON_LIBRARIES: Record<string, LibraryConfig>;
63
+ //# sourceMappingURL=library-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-loader.d.ts","sourceRoot":"","sources":["../../src/tools/library-loader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEzE;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACtD,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,KAAK,CAOX;IAEF;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDvD;;OAEG;IACG,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhD;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgB/B;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;YACW,oBAAoB;IA4ClC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkD1B;;OAEG;IACH,OAAO,CAAC,MAAM;CAGd;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,mBAA0B,CAAC;AAQrD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA0E1D,CAAC"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Library Loader Service
3
+ * Dynamically loads external JavaScript libraries with retry logic and fallback URLs
4
+ *
5
+ * Based on architectural enhancements from renaissance-tool-analyses.md
6
+ * Supports both static and dynamic library loading
7
+ */
8
+ /**
9
+ * Implementation of LibraryLoader service
10
+ */
11
+ export class LibraryLoaderImpl {
12
+ loadedLibraries = new Set();
13
+ pendingLoads = new Map();
14
+ failedLibraries = new Map();
15
+ stats = {
16
+ loaded: [],
17
+ failed: [],
18
+ pending: [],
19
+ cacheHits: 0,
20
+ cacheMisses: 0,
21
+ totalLoadTime: 0,
22
+ };
23
+ /**
24
+ * Load a JavaScript library
25
+ */
26
+ async loadScript(library) {
27
+ // SSR guard: Library loading should NEVER run on the server
28
+ if (typeof window === "undefined" || typeof document === "undefined") {
29
+ throw new Error("Library loader can only be used in the browser");
30
+ }
31
+ const startTime = performance.now();
32
+ // Check if already loaded
33
+ if (this.isLoaded(library.id)) {
34
+ this.stats.cacheHits++;
35
+ return;
36
+ }
37
+ // Check if already pending
38
+ const pending = this.pendingLoads.get(library.id);
39
+ if (pending) {
40
+ return pending;
41
+ }
42
+ this.stats.cacheMisses++;
43
+ // Start loading
44
+ const loadPromise = this._loadScriptWithRetry(library);
45
+ this.pendingLoads.set(library.id, loadPromise);
46
+ this.stats.pending.push(library.id);
47
+ try {
48
+ await loadPromise;
49
+ this.loadedLibraries.add(library.id);
50
+ this.stats.loaded.push(library.id);
51
+ const loadTime = performance.now() - startTime;
52
+ this.stats.totalLoadTime += loadTime;
53
+ console.log(`[LibraryLoader] Successfully loaded ${library.id} in ${loadTime.toFixed(2)}ms`);
54
+ }
55
+ catch (error) {
56
+ this.failedLibraries.set(library.id, error);
57
+ this.stats.failed.push(library.id);
58
+ console.error(`[LibraryLoader] Failed to load ${library.id}:`, error);
59
+ throw error;
60
+ }
61
+ finally {
62
+ this.pendingLoads.delete(library.id);
63
+ const pendingIndex = this.stats.pending.indexOf(library.id);
64
+ if (pendingIndex !== -1) {
65
+ this.stats.pending.splice(pendingIndex, 1);
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Load a stylesheet
71
+ */
72
+ async loadStylesheet(url) {
73
+ // SSR guard: Stylesheet loading should NEVER run on the server
74
+ if (typeof window === "undefined" || typeof document === "undefined") {
75
+ throw new Error("Stylesheet loader can only be used in the browser");
76
+ }
77
+ return new Promise((resolve, reject) => {
78
+ // Check if already loaded
79
+ const existing = document.querySelector(`link[href="${url}"]`);
80
+ if (existing) {
81
+ resolve();
82
+ return;
83
+ }
84
+ const link = document.createElement("link");
85
+ link.rel = "stylesheet";
86
+ link.href = url;
87
+ link.onload = () => resolve();
88
+ link.onerror = () => reject(new Error(`Failed to load stylesheet: ${url}`));
89
+ document.head.appendChild(link);
90
+ });
91
+ }
92
+ /**
93
+ * Check if a library is already loaded
94
+ */
95
+ isLoaded(libraryId) {
96
+ return this.loadedLibraries.has(libraryId);
97
+ }
98
+ /**
99
+ * Preload multiple libraries in parallel
100
+ */
101
+ async preload(libraries) {
102
+ const promises = libraries.map((lib) => this.loadScript(lib));
103
+ await Promise.all(promises);
104
+ }
105
+ /**
106
+ * Unload a library (remove script tag)
107
+ */
108
+ unload(libraryId) {
109
+ const script = document.querySelector(`script[data-library-id="${libraryId}"]`);
110
+ if (script) {
111
+ script.remove();
112
+ this.loadedLibraries.delete(libraryId);
113
+ // Remove from stats
114
+ const loadedIndex = this.stats.loaded.indexOf(libraryId);
115
+ if (loadedIndex !== -1) {
116
+ this.stats.loaded.splice(loadedIndex, 1);
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Get loader statistics
122
+ */
123
+ getStats() {
124
+ return { ...this.stats };
125
+ }
126
+ /**
127
+ * Load script with retry logic
128
+ */
129
+ async _loadScriptWithRetry(library) {
130
+ const urls = [library.url, ...(library.fallbackUrls || [])];
131
+ const maxAttempts = library.retry?.maxAttempts || 3;
132
+ const delay = library.retry?.delay || 1000;
133
+ const backoffMultiplier = library.retry?.backoffMultiplier || 2;
134
+ let lastError = null;
135
+ for (const url of urls) {
136
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
137
+ try {
138
+ await this._loadScriptFromUrl(url, library);
139
+ // Verify library loaded if globalVar specified
140
+ if (library.globalVar) {
141
+ if (!(library.globalVar in window)) {
142
+ throw new Error(`Library ${library.id} loaded but global ${library.globalVar} not found`);
143
+ }
144
+ }
145
+ return; // Success
146
+ }
147
+ catch (error) {
148
+ lastError = error;
149
+ console.warn(`[LibraryLoader] Attempt ${attempt}/${maxAttempts} failed for ${url}:`, error);
150
+ // Wait before retry (exponential backoff)
151
+ if (attempt < maxAttempts) {
152
+ const waitTime = delay * Math.pow(backoffMultiplier, attempt - 1);
153
+ await this._sleep(waitTime);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ throw new Error(`Failed to load library ${library.id} after trying all URLs: ${lastError?.message}`);
159
+ }
160
+ /**
161
+ * Load script from a specific URL
162
+ */
163
+ _loadScriptFromUrl(url, library) {
164
+ return new Promise((resolve, reject) => {
165
+ const script = document.createElement("script");
166
+ script.src = url;
167
+ script.dataset.libraryId = library.id;
168
+ if (library.async)
169
+ script.async = true;
170
+ if (library.defer)
171
+ script.defer = true;
172
+ if (library.integrity)
173
+ script.integrity = library.integrity;
174
+ if (library.crossorigin)
175
+ script.crossOrigin = library.crossorigin;
176
+ let timeoutId;
177
+ const cleanup = () => {
178
+ if (timeoutId)
179
+ clearTimeout(timeoutId);
180
+ script.onload = null;
181
+ script.onerror = null;
182
+ };
183
+ script.onload = () => {
184
+ cleanup();
185
+ resolve();
186
+ };
187
+ script.onerror = (error) => {
188
+ cleanup();
189
+ script.remove();
190
+ reject(new Error(`Script load error for ${url}: ${error}`));
191
+ };
192
+ // Timeout handling
193
+ if (library.timeout) {
194
+ timeoutId = window.setTimeout(() => {
195
+ cleanup();
196
+ script.remove();
197
+ reject(new Error(`Script load timeout for ${url} after ${library.timeout}ms`));
198
+ }, library.timeout);
199
+ }
200
+ document.head.appendChild(script);
201
+ });
202
+ }
203
+ /**
204
+ * Sleep utility for retry delays
205
+ */
206
+ _sleep(ms) {
207
+ return new Promise((resolve) => setTimeout(resolve, ms));
208
+ }
209
+ }
210
+ /**
211
+ * Singleton instance
212
+ */
213
+ export const libraryLoader = new LibraryLoaderImpl();
214
+ /**
215
+ * Desmos library version (matches the version in calculator.js)
216
+ * Update this when upgrading to a new version
217
+ */
218
+ const DESMOS_VERSION = "v1.10.1";
219
+ /**
220
+ * Common library configurations
221
+ * Based on industry best practices and platform analyses
222
+ */
223
+ export const COMMON_LIBRARIES = {
224
+ desmos: {
225
+ id: "desmos",
226
+ url: `/lib/desmos/${DESMOS_VERSION}/calculator.js`, // Self-hosted (prioritized) - versioned for better cache control
227
+ fallbackUrls: [
228
+ "https://www.desmos.com/api/v1.10/calculator.js",
229
+ "https://cdn.jsdelivr.net/npm/desmos@1.10/dist/calculator.js",
230
+ ],
231
+ globalVar: "Desmos",
232
+ timeout: 10000,
233
+ retry: { maxAttempts: 3, delay: 1000, backoffMultiplier: 2 },
234
+ },
235
+ mathjax: {
236
+ id: "mathjax",
237
+ url: "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js",
238
+ fallbackUrls: [
239
+ "https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js",
240
+ "/static/lib/mathjax/tex-mml-chtml.js",
241
+ ],
242
+ globalVar: "MathJax",
243
+ async: true,
244
+ retry: { maxAttempts: 2, delay: 1500 },
245
+ },
246
+ katex: {
247
+ id: "katex",
248
+ url: "https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js",
249
+ fallbackUrls: [
250
+ "https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.9/katex.min.js",
251
+ "/static/lib/katex/katex.min.js",
252
+ ],
253
+ globalVar: "katex",
254
+ timeout: 5000,
255
+ },
256
+ mathjs: {
257
+ id: "mathjs",
258
+ url: "https://cdn.jsdelivr.net/npm/mathjs@12.4.0/lib/browser/math.min.js",
259
+ fallbackUrls: [
260
+ "https://cdnjs.cloudflare.com/ajax/libs/mathjs/12.4.0/math.min.js",
261
+ "https://unpkg.com/mathjs@12.4.0/lib/browser/math.min.js",
262
+ "/static/lib/mathjs/math.min.js",
263
+ ],
264
+ globalVar: "math",
265
+ timeout: 8000,
266
+ retry: { maxAttempts: 3, delay: 1000, backoffMultiplier: 2 },
267
+ },
268
+ // TI Calculator emulators (placeholder URLs - replace with actual)
269
+ ti84: {
270
+ id: "ti-84-emulator",
271
+ url: "https://example.com/ti-84-emulator.js", // Replace with actual URL
272
+ fallbackUrls: ["/static/lib/ti-84-emulator.js"],
273
+ globalVar: "TI84",
274
+ timeout: 15000,
275
+ retry: { maxAttempts: 3, delay: 2000, backoffMultiplier: 2 },
276
+ },
277
+ ti108: {
278
+ id: "ti-108-emulator",
279
+ url: "https://example.com/ti-108-emulator.js", // Replace with actual URL
280
+ fallbackUrls: ["/static/lib/ti-108-emulator.js"],
281
+ globalVar: "TI108",
282
+ timeout: 15000,
283
+ },
284
+ ti34mv: {
285
+ id: "ti-34mv-emulator",
286
+ url: "https://example.com/ti-34mv-emulator.js", // Replace with actual URL
287
+ fallbackUrls: ["/static/lib/ti-34mv-emulator.js"],
288
+ globalVar: "TI34MV",
289
+ timeout: 15000,
290
+ },
291
+ };
292
+ //# sourceMappingURL=library-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-loader.js","sourceRoot":"","sources":["../../src/tools/library-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Response Discovery Service
3
+ * Finds and manages PIE response components for tool-to-response integration
4
+ *
5
+ * Enables tools (e.g., calculator) to insert content into response fields
6
+ * Based on capability-based interface pattern (inspired by VS Code extension API)
7
+ */
8
+ import type { ContentFormat, PIEResponseComponent, ResponseDiscoveryService } from "./types";
9
+ export declare class ResponseDiscoveryServiceImpl implements ResponseDiscoveryService {
10
+ private responses;
11
+ private activeResponseId;
12
+ private activeResponseListeners;
13
+ /**
14
+ * Get currently active (focused) response component
15
+ */
16
+ getActiveResponse(): PIEResponseComponent | null;
17
+ /**
18
+ * Get response by ID
19
+ */
20
+ getResponse(responseId: string): PIEResponseComponent | null;
21
+ /**
22
+ * Get all registered responses
23
+ */
24
+ getAllResponses(): PIEResponseComponent[];
25
+ /**
26
+ * Get responses that accept a specific content format
27
+ */
28
+ getResponsesAccepting(format: ContentFormat): PIEResponseComponent[];
29
+ /**
30
+ * Register a response component
31
+ */
32
+ registerResponse(response: PIEResponseComponent): void;
33
+ /**
34
+ * Unregister a response component
35
+ */
36
+ unregisterResponse(responseId: string): void;
37
+ /**
38
+ * Set active response (internal use)
39
+ */
40
+ setActiveResponse(responseId: string | null): void;
41
+ /**
42
+ * Listen for active response changes
43
+ */
44
+ onActiveResponseChanged(listener: (response: PIEResponseComponent | null) => void): void;
45
+ /**
46
+ * Auto-detect responses from DOM (helper method)
47
+ * Scans for PIE response elements and registers them
48
+ */
49
+ autoDiscoverResponses(rootElement?: HTMLElement): void;
50
+ /**
51
+ * Check if element implements PIEResponseComponent
52
+ */
53
+ private _implementsPIEResponse;
54
+ /**
55
+ * Setup focus tracking for active response detection
56
+ * Call this during initialization to automatically track active response
57
+ */
58
+ setupFocusTracking(): void;
59
+ /**
60
+ * Check if element belongs to a response
61
+ */
62
+ private _isResponseElement;
63
+ /**
64
+ * Clear all responses (for cleanup)
65
+ */
66
+ clear(): void;
67
+ }
68
+ /**
69
+ * Singleton instance
70
+ */
71
+ export declare const responseDiscovery: ResponseDiscoveryServiceImpl;
72
+ //# sourceMappingURL=response-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-discovery.d.ts","sourceRoot":"","sources":["../../src/tools/response-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACX,aAAa,EACb,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,SAAS,CAAC;AAEjB,qBAAa,4BAA6B,YAAW,wBAAwB;IAC5E,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,uBAAuB,CAExB;IAEP;;OAEG;IACH,iBAAiB,IAAI,oBAAoB,GAAG,IAAI;IAOhD;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI;IAI5D;;OAEG;IACH,eAAe,IAAI,oBAAoB,EAAE;IAIzC;;OAEG;IACH,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,EAAE;IAOpE;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAYtD;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAU5C;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAYlD;;OAEG;IACH,uBAAuB,CACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,KAAK,IAAI,GACvD,IAAI;IAIP;;;OAGG;IACH,qBAAqB,CAAC,WAAW,GAAE,WAA2B,GAAG,IAAI;IAwBrE;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAa9B;;;OAGG;IACH,kBAAkB,IAAI,IAAI;IAiD1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,KAAK,IAAI,IAAI;CAKb;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,8BAAqC,CAAC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Response Discovery Service
3
+ * Finds and manages PIE response components for tool-to-response integration
4
+ *
5
+ * Enables tools (e.g., calculator) to insert content into response fields
6
+ * Based on capability-based interface pattern (inspired by VS Code extension API)
7
+ */
8
+ export class ResponseDiscoveryServiceImpl {
9
+ responses = new Map();
10
+ activeResponseId = null;
11
+ activeResponseListeners = [];
12
+ /**
13
+ * Get currently active (focused) response component
14
+ */
15
+ getActiveResponse() {
16
+ if (!this.activeResponseId) {
17
+ return null;
18
+ }
19
+ return this.responses.get(this.activeResponseId) || null;
20
+ }
21
+ /**
22
+ * Get response by ID
23
+ */
24
+ getResponse(responseId) {
25
+ return this.responses.get(responseId) || null;
26
+ }
27
+ /**
28
+ * Get all registered responses
29
+ */
30
+ getAllResponses() {
31
+ return Array.from(this.responses.values());
32
+ }
33
+ /**
34
+ * Get responses that accept a specific content format
35
+ */
36
+ getResponsesAccepting(format) {
37
+ return this.getAllResponses().filter((response) => {
38
+ const capabilities = response.getCapabilities();
39
+ return capabilities.supportedFormats.includes(format);
40
+ });
41
+ }
42
+ /**
43
+ * Register a response component
44
+ */
45
+ registerResponse(response) {
46
+ this.responses.set(response.responseId, response);
47
+ console.log(`[ResponseDiscovery] Registered response: ${response.responseId}`);
48
+ // If this is the first response and no active response, set it as active
49
+ if (!this.activeResponseId && this.responses.size === 1) {
50
+ this.setActiveResponse(response.responseId);
51
+ }
52
+ }
53
+ /**
54
+ * Unregister a response component
55
+ */
56
+ unregisterResponse(responseId) {
57
+ this.responses.delete(responseId);
58
+ console.log(`[ResponseDiscovery] Unregistered response: ${responseId}`);
59
+ // If active response was removed, clear it
60
+ if (this.activeResponseId === responseId) {
61
+ this.setActiveResponse(null);
62
+ }
63
+ }
64
+ /**
65
+ * Set active response (internal use)
66
+ */
67
+ setActiveResponse(responseId) {
68
+ if (this.activeResponseId === responseId)
69
+ return;
70
+ this.activeResponseId = responseId;
71
+ const response = responseId ? this.getResponse(responseId) : null;
72
+ // Notify listeners
73
+ for (const listener of this.activeResponseListeners) {
74
+ listener(response);
75
+ }
76
+ }
77
+ /**
78
+ * Listen for active response changes
79
+ */
80
+ onActiveResponseChanged(listener) {
81
+ this.activeResponseListeners.push(listener);
82
+ }
83
+ /**
84
+ * Auto-detect responses from DOM (helper method)
85
+ * Scans for PIE response elements and registers them
86
+ */
87
+ autoDiscoverResponses(rootElement = document.body) {
88
+ // Look for common PIE response element patterns
89
+ const responseSelectors = [
90
+ "[data-pie-response]",
91
+ "[data-response-id]",
92
+ 'input[type="text"]',
93
+ "textarea",
94
+ '[contenteditable="true"]',
95
+ "pie-text-entry",
96
+ "pie-extended-text-entry",
97
+ "pie-math-inline",
98
+ "pie-numeric-entry",
99
+ ];
100
+ const elements = rootElement.querySelectorAll(responseSelectors.join(", "));
101
+ for (const element of Array.from(elements)) {
102
+ // Check if element implements PIEResponseComponent interface
103
+ if (this._implementsPIEResponse(element)) {
104
+ this.registerResponse(element);
105
+ }
106
+ }
107
+ }
108
+ /**
109
+ * Check if element implements PIEResponseComponent
110
+ */
111
+ _implementsPIEResponse(element) {
112
+ const component = element;
113
+ // Check for required methods
114
+ return (typeof component.getCapabilities === "function" &&
115
+ typeof component.insertContent === "function" &&
116
+ typeof component.getContent === "function" &&
117
+ component.responseId !== undefined &&
118
+ component.responseType !== undefined);
119
+ }
120
+ /**
121
+ * Setup focus tracking for active response detection
122
+ * Call this during initialization to automatically track active response
123
+ */
124
+ setupFocusTracking() {
125
+ // Track focus changes
126
+ document.addEventListener("focusin", (event) => {
127
+ const target = event.target;
128
+ // Check if focused element is a registered response
129
+ for (const [responseId, response] of this.responses.entries()) {
130
+ // Check if response element or child is focused
131
+ const responseElement = response.element || response;
132
+ if (responseElement === target ||
133
+ (responseElement instanceof HTMLElement &&
134
+ responseElement.contains(target))) {
135
+ this.setActiveResponse(responseId);
136
+ return;
137
+ }
138
+ }
139
+ }, true); // Use capture phase
140
+ // Track focus loss
141
+ document.addEventListener("focusout", (event) => {
142
+ const relatedTarget = event
143
+ .relatedTarget;
144
+ // If focus is not going to another response, clear active
145
+ if (!relatedTarget || !this._isResponseElement(relatedTarget)) {
146
+ // Delay to allow focus to move to another response
147
+ setTimeout(() => {
148
+ if (document.activeElement &&
149
+ !this._isResponseElement(document.activeElement)) {
150
+ this.setActiveResponse(null);
151
+ }
152
+ }, 10);
153
+ }
154
+ }, true);
155
+ }
156
+ /**
157
+ * Check if element belongs to a response
158
+ */
159
+ _isResponseElement(element) {
160
+ for (const response of this.responses.values()) {
161
+ const responseElement = response.element || response;
162
+ if (responseElement === element ||
163
+ (responseElement instanceof HTMLElement &&
164
+ responseElement.contains(element))) {
165
+ return true;
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * Clear all responses (for cleanup)
172
+ */
173
+ clear() {
174
+ this.responses.clear();
175
+ this.activeResponseId = null;
176
+ this.activeResponseListeners = [];
177
+ }
178
+ }
179
+ /**
180
+ * Singleton instance
181
+ */
182
+ export const responseDiscovery = new ResponseDiscoveryServiceImpl();
183
+ //# sourceMappingURL=response-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-discovery.js","sourceRoot":"","sources":["../../src/tools/response-discovery.ts"],"names":[],"mappings":"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"}