@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.
- package/README.md +520 -0
- package/dist/attempt/TestSession.d.ts +90 -0
- package/dist/attempt/TestSession.d.ts.map +1 -0
- package/dist/attempt/TestSession.js +174 -0
- package/dist/attempt/TestSession.js.map +1 -0
- package/dist/core/TypedEventBus.d.ts +48 -0
- package/dist/core/TypedEventBus.d.ts.map +1 -0
- package/dist/core/TypedEventBus.js +63 -0
- package/dist/core/TypedEventBus.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/item-loader.d.ts +45 -0
- package/dist/item-loader.d.ts.map +1 -0
- package/dist/item-loader.js +62 -0
- package/dist/item-loader.js.map +1 -0
- package/dist/player/AssessmentPlayer.d.ts +388 -0
- package/dist/player/AssessmentPlayer.d.ts.map +1 -0
- package/dist/player/AssessmentPlayer.js +965 -0
- package/dist/player/AssessmentPlayer.js.map +1 -0
- package/dist/player/index.d.ts +17 -0
- package/dist/player/index.d.ts.map +1 -0
- package/dist/player/index.js +15 -0
- package/dist/player/index.js.map +1 -0
- package/dist/player/navigation-types.d.ts +63 -0
- package/dist/player/navigation-types.d.ts.map +1 -0
- package/dist/player/navigation-types.js +7 -0
- package/dist/player/navigation-types.js.map +1 -0
- package/dist/player/qti-navigation.d.ts +29 -0
- package/dist/player/qti-navigation.d.ts.map +1 -0
- package/dist/player/qti-navigation.js +160 -0
- package/dist/player/qti-navigation.js.map +1 -0
- package/dist/reference-layout/index.d.ts +19 -0
- package/dist/reference-layout/index.d.ts.map +1 -0
- package/dist/reference-layout/index.js +20 -0
- package/dist/reference-layout/index.js.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts +141 -0
- package/dist/services/AccessibilityCatalogResolver.d.ts.map +1 -0
- package/dist/services/AccessibilityCatalogResolver.js +249 -0
- package/dist/services/AccessibilityCatalogResolver.js.map +1 -0
- package/dist/services/AssessmentAuthoringService.d.ts +60 -0
- package/dist/services/AssessmentAuthoringService.d.ts.map +1 -0
- package/dist/services/AssessmentAuthoringService.js +183 -0
- package/dist/services/AssessmentAuthoringService.js.map +1 -0
- package/dist/services/ContextVariableStore.d.ts +114 -0
- package/dist/services/ContextVariableStore.d.ts.map +1 -0
- package/dist/services/ContextVariableStore.js +207 -0
- package/dist/services/ContextVariableStore.js.map +1 -0
- package/dist/services/ElementToolStateStore.d.ts +125 -0
- package/dist/services/ElementToolStateStore.d.ts.map +1 -0
- package/dist/services/ElementToolStateStore.js +200 -0
- package/dist/services/ElementToolStateStore.js.map +1 -0
- package/dist/services/HighlightCoordinator.d.ts +179 -0
- package/dist/services/HighlightCoordinator.d.ts.map +1 -0
- package/dist/services/HighlightCoordinator.js +446 -0
- package/dist/services/HighlightCoordinator.js.map +1 -0
- package/dist/services/I18nService.d.ts +121 -0
- package/dist/services/I18nService.d.ts.map +1 -0
- package/dist/services/I18nService.js +276 -0
- package/dist/services/I18nService.js.map +1 -0
- package/dist/services/PNPMapper.d.ts +71 -0
- package/dist/services/PNPMapper.d.ts.map +1 -0
- package/dist/services/PNPMapper.js +98 -0
- package/dist/services/PNPMapper.js.map +1 -0
- package/dist/services/PNPToolResolver.d.ts +127 -0
- package/dist/services/PNPToolResolver.d.ts.map +1 -0
- package/dist/services/PNPToolResolver.js +222 -0
- package/dist/services/PNPToolResolver.js.map +1 -0
- package/dist/services/SSMLExtractor.d.ts +61 -0
- package/dist/services/SSMLExtractor.d.ts.map +1 -0
- package/dist/services/SSMLExtractor.js +181 -0
- package/dist/services/SSMLExtractor.js.map +1 -0
- package/dist/services/TTSService.d.ts +162 -0
- package/dist/services/TTSService.d.ts.map +1 -0
- package/dist/services/TTSService.js +465 -0
- package/dist/services/TTSService.js.map +1 -0
- package/dist/services/ThemeProvider.d.ts +95 -0
- package/dist/services/ThemeProvider.d.ts.map +1 -0
- package/dist/services/ThemeProvider.js +299 -0
- package/dist/services/ThemeProvider.js.map +1 -0
- package/dist/services/ToolConfigResolver.d.ts +162 -0
- package/dist/services/ToolConfigResolver.d.ts.map +1 -0
- package/dist/services/ToolConfigResolver.js +230 -0
- package/dist/services/ToolConfigResolver.js.map +1 -0
- package/dist/services/ToolCoordinator.d.ts +137 -0
- package/dist/services/ToolCoordinator.d.ts.map +1 -0
- package/dist/services/ToolCoordinator.js +318 -0
- package/dist/services/ToolCoordinator.js.map +1 -0
- package/dist/services/ToolkitCoordinator.d.ts +188 -0
- package/dist/services/ToolkitCoordinator.d.ts.map +1 -0
- package/dist/services/ToolkitCoordinator.js +252 -0
- package/dist/services/ToolkitCoordinator.js.map +1 -0
- package/dist/services/interfaces.d.ts +391 -0
- package/dist/services/interfaces.d.ts.map +1 -0
- package/dist/services/interfaces.js +12 -0
- package/dist/services/interfaces.js.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts +103 -0
- package/dist/services/tool-providers/DesmosToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/DesmosToolProvider.js +127 -0
- package/dist/services/tool-providers/DesmosToolProvider.js.map +1 -0
- package/dist/services/tool-providers/IToolProvider.d.ts +137 -0
- package/dist/services/tool-providers/IToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/IToolProvider.js +13 -0
- package/dist/services/tool-providers/IToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts +107 -0
- package/dist/services/tool-providers/TIToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TIToolProvider.js +123 -0
- package/dist/services/tool-providers/TIToolProvider.js.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts +143 -0
- package/dist/services/tool-providers/TTSToolProvider.d.ts.map +1 -0
- package/dist/services/tool-providers/TTSToolProvider.js +168 -0
- package/dist/services/tool-providers/TTSToolProvider.js.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts +165 -0
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts.map +1 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js +240 -0
- package/dist/services/tool-providers/ToolProviderRegistry.js.map +1 -0
- package/dist/services/tool-providers/index.d.ts +18 -0
- package/dist/services/tool-providers/index.d.ts.map +1 -0
- package/dist/services/tool-providers/index.js +15 -0
- package/dist/services/tool-providers/index.js.map +1 -0
- package/dist/services/tts/browser-provider.d.ts +24 -0
- package/dist/services/tts/browser-provider.d.ts.map +1 -0
- package/dist/services/tts/browser-provider.js +177 -0
- package/dist/services/tts/browser-provider.js.map +1 -0
- package/dist/services/tts/provider-interface.d.ts +131 -0
- package/dist/services/tts/provider-interface.d.ts.map +1 -0
- package/dist/services/tts/provider-interface.js +10 -0
- package/dist/services/tts/provider-interface.js.map +1 -0
- package/dist/tools/calculators/desmos-provider.d.ts +54 -0
- package/dist/tools/calculators/desmos-provider.d.ts.map +1 -0
- package/dist/tools/calculators/desmos-provider.js +384 -0
- package/dist/tools/calculators/desmos-provider.js.map +1 -0
- package/dist/tools/calculators/mathjs-provider.d.ts +50 -0
- package/dist/tools/calculators/mathjs-provider.d.ts.map +1 -0
- package/dist/tools/calculators/mathjs-provider.js +660 -0
- package/dist/tools/calculators/mathjs-provider.js.map +1 -0
- package/dist/tools/calculators/ti-provider.d.ts +122 -0
- package/dist/tools/calculators/ti-provider.d.ts.map +1 -0
- package/dist/tools/calculators/ti-provider.js +587 -0
- package/dist/tools/calculators/ti-provider.js.map +1 -0
- package/dist/tools/client.d.ts +17 -0
- package/dist/tools/client.d.ts.map +1 -0
- package/dist/tools/client.js +26 -0
- package/dist/tools/client.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/library-loader.d.ts +63 -0
- package/dist/tools/library-loader.d.ts.map +1 -0
- package/dist/tools/library-loader.js +292 -0
- package/dist/tools/library-loader.js.map +1 -0
- package/dist/tools/response-discovery.d.ts +72 -0
- package/dist/tools/response-discovery.d.ts.map +1 -0
- package/dist/tools/response-discovery.js +183 -0
- package/dist/tools/response-discovery.js.map +1 -0
- package/dist/tools/tool-coordinator.d.ts +76 -0
- package/dist/tools/tool-coordinator.d.ts.map +1 -0
- package/dist/tools/tool-coordinator.js +197 -0
- package/dist/tools/tool-coordinator.js.map +1 -0
- package/dist/tools/types.d.ts +427 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +13 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/variant-resolver.d.ts +48 -0
- package/dist/tools/variant-resolver.d.ts.map +1 -0
- package/dist/tools/variant-resolver.js +214 -0
- package/dist/tools/variant-resolver.js.map +1 -0
- package/dist/types/events.d.ts +157 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +11 -0
- package/dist/types/events.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +11 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/src/README.md +626 -0
- package/src/components/QuestionToolBar.svelte +406 -0
- package/src/player/AssessmentLayout.svelte +68 -0
- package/src/player/README.md +154 -0
- package/src/reference-layout/README.md +135 -0
- package/src/reference-layout/ReferenceLayout.svelte +209 -0
- package/src/reference-layout/components/AssessmentContent.svelte +259 -0
- package/src/reference-layout/components/AssessmentFooter.svelte +89 -0
- package/src/reference-layout/components/AssessmentHeader.svelte +250 -0
- package/src/reference-layout/components/AssessmentNavigation.svelte +134 -0
- package/src/reference-layout/components/AssessmentToolsBar.svelte +176 -0
- package/src/reference-layout/components/ItemPanel.svelte +200 -0
- package/src/reference-layout/components/NotesPanel.svelte +179 -0
- package/src/reference-layout/components/PassagePanel.svelte +76 -0
- package/src/tools/README.md +616 -0
- 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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"}
|