@pie-players/pie-assessment-toolkit 0.3.73 → 0.3.75
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 +469 -318
- package/dist/attempt/AssessmentSession.d.ts +1 -5
- package/dist/attempt/AssessmentSession.js +0 -29
- package/dist/attempt/TestSession.d.ts +1 -20
- package/dist/attempt/TestSession.js +8 -99
- package/dist/components/ItemScope.custom-element.d.ts +1 -0
- package/dist/components/ItemScope.custom-element.js +1 -0
- package/dist/components/ItemToolBar.custom-element.d.ts +1 -0
- package/dist/components/ItemToolBar.custom-element.js +1 -1
- package/dist/components/PieAssessmentToolkit.custom-element.d.ts +1 -0
- package/dist/components/PieAssessmentToolkit.custom-element.js +13 -13
- package/dist/components/SectionToolBar.custom-element.d.ts +1 -0
- package/dist/components/SectionToolBar.custom-element.js +1 -1
- package/dist/components/chunks/ItemToolBar-7tt7v2xp.js +4 -0
- package/dist/components/chunks/ItemToolBar-97hx60z4.js +2 -0
- package/dist/components/chunks/ItemToolBar-bxwyhr5p.js +2 -0
- package/dist/components/chunks/ItemToolBar-jx38w99s.js +2 -0
- package/dist/components/chunks/ItemToolBar-rd2bb4p6.js +40 -0
- package/dist/components/chunks/ItemToolBar-vdkyn9f3.js +2 -0
- package/dist/components/chunks/sre-engine-jd8cc08x.js +1 -0
- package/dist/components/item-scope-element.d.ts +2 -0
- package/dist/components/item-scope-element.js +2 -0
- package/dist/context/assessment-toolkit-context.d.ts +32 -6
- package/dist/index.d.ts +23 -48
- package/dist/index.js +12 -37
- package/dist/policy/core/PolicySource.d.ts +1 -1
- package/dist/policy/core/ToolPolicyEngine.d.ts +85 -34
- package/dist/policy/core/ToolPolicyEngine.js +148 -46
- package/dist/policy/core/compose-decision.d.ts +28 -7
- package/dist/policy/core/compose-decision.js +75 -54
- package/dist/policy/core/decision-types.d.ts +65 -34
- package/dist/policy/core/feature-decision.d.ts +16 -9
- package/dist/policy/core/feature-decision.js +14 -8
- package/dist/policy/core/pnp-policy-inputs.d.ts +24 -33
- package/dist/policy/core/pnp-policy-inputs.js +28 -56
- package/dist/policy/core/provenance.d.ts +9 -4
- package/dist/policy/core/provenance.js +1 -1
- package/dist/policy/engine.d.ts +7 -23
- package/dist/policy/engine.js +5 -20
- package/dist/policy/sources/PnpPolicySource.d.ts +44 -61
- package/dist/policy/sources/PnpPolicySource.js +117 -118
- package/dist/runtime/SectionControllerBinding.d.ts +279 -0
- package/dist/runtime/SectionControllerBinding.js +450 -0
- package/dist/runtime/SectionRuntimeEngine.d.ts +26 -289
- package/dist/runtime/SectionRuntimeEngine.js +30 -372
- package/dist/runtime/adapter/SectionEngineAdapter.d.ts +19 -80
- package/dist/runtime/adapter/SectionEngineAdapter.js +19 -92
- package/dist/runtime/adapter/dom-event-bridge.d.ts +15 -30
- package/dist/runtime/adapter/dom-event-bridge.js +17 -44
- package/dist/runtime/adapter/subscriber-fanout.d.ts +1 -2
- package/dist/runtime/adapter/subscriber-fanout.js +1 -2
- package/dist/runtime/catalog-context.d.ts +19 -0
- package/dist/runtime/catalog-context.js +28 -0
- package/dist/runtime/composition-emit-scheduler.d.ts +9 -15
- package/dist/runtime/composition-emit-scheduler.js +9 -15
- package/dist/runtime/content-language.d.ts +32 -0
- package/dist/runtime/content-language.js +46 -0
- package/dist/runtime/content-region.d.ts +17 -0
- package/dist/runtime/content-region.js +29 -0
- package/dist/runtime/content-registration.d.ts +13 -0
- package/dist/runtime/content-registration.js +25 -0
- package/dist/runtime/core/SectionEngineCore.d.ts +2 -2
- package/dist/runtime/core/SectionEngineCore.js +2 -2
- package/dist/runtime/core/cohort.d.ts +1 -1
- package/dist/runtime/core/cohort.js +1 -1
- package/dist/runtime/core/engine-input.d.ts +18 -30
- package/dist/runtime/core/engine-input.js +11 -12
- package/dist/runtime/core/engine-output.d.ts +16 -40
- package/dist/runtime/core/engine-output.js +9 -21
- package/dist/runtime/core/engine-readiness.d.ts +5 -37
- package/dist/runtime/core/engine-readiness.js +8 -41
- package/dist/runtime/core/engine-resolver.d.ts +46 -74
- package/dist/runtime/core/engine-resolver.js +18 -43
- package/dist/runtime/core/engine-state.d.ts +28 -36
- package/dist/runtime/core/engine-state.js +18 -21
- package/dist/runtime/core/engine-transition.d.ts +14 -19
- package/dist/runtime/core/engine-transition.js +71 -51
- package/dist/runtime/engine.d.ts +16 -19
- package/dist/runtime/engine.js +12 -19
- package/dist/runtime/page-warnings.d.ts +13 -0
- package/dist/runtime/page-warnings.js +22 -0
- package/dist/runtime/policy-input-forwarding.d.ts +25 -0
- package/dist/runtime/policy-input-forwarding.js +25 -0
- package/dist/runtime/registration-events.d.ts +14 -0
- package/dist/runtime/runtime-event-claim.d.ts +8 -0
- package/dist/runtime/runtime-event-claim.js +15 -0
- package/dist/runtime/shell-event-bridge.d.ts +45 -0
- package/dist/runtime/shell-event-bridge.js +127 -0
- package/dist/runtime/shell-registration.d.ts +73 -0
- package/dist/runtime/shell-registration.js +95 -0
- package/dist/runtime/shell-scope.d.ts +68 -0
- package/dist/runtime/shell-scope.js +188 -0
- package/dist/runtime/tool-host-contract.d.ts +28 -10
- package/dist/runtime/tool-host-contract.js +31 -10
- package/dist/runtime/unclaimed-registration-watch.d.ts +7 -0
- package/dist/runtime/unclaimed-registration-watch.js +23 -0
- package/dist/services/ElementToolStateStore.d.ts +14 -10
- package/dist/services/ElementToolStateStore.js +37 -13
- package/dist/services/HighlightCoordinator.d.ts +22 -28
- package/dist/services/HighlightCoordinator.js +431 -327
- package/dist/services/RangeSerializer.d.ts +10 -1
- package/dist/services/RangeSerializer.js +87 -14
- package/dist/services/TTSService.d.ts +130 -69
- package/dist/services/TTSService.js +713 -570
- package/dist/services/ToolCoordinator.d.ts +43 -66
- package/dist/services/ToolCoordinator.js +164 -208
- package/dist/services/ToolRegistry.d.ts +78 -54
- package/dist/services/ToolRegistry.js +107 -105
- package/dist/services/ToolkitCoordinator.d.ts +261 -175
- package/dist/services/ToolkitCoordinator.js +667 -433
- package/dist/services/audio-handoff.d.ts +6 -7
- package/dist/services/audio-handoff.js +20 -14
- package/dist/services/catalog-owner.d.ts +11 -1
- package/dist/services/catalog-owner.js +25 -0
- package/dist/services/create-tools-config.d.ts +2 -2
- package/dist/services/framework-error-bus.d.ts +3 -6
- package/dist/services/framework-error-bus.js +3 -6
- package/dist/services/framework-error.d.ts +30 -8
- package/dist/services/framework-error.js +9 -7
- package/dist/services/interfaces.d.ts +158 -129
- package/dist/services/section-controller-types.d.ts +15 -0
- package/dist/services/section-session-assignment.d.ts +21 -0
- package/dist/services/section-session-assignment.js +82 -0
- package/dist/services/spoken-audio-cards.d.ts +0 -2
- package/dist/services/spoken-audio-cards.js +1 -3
- package/dist/services/tool-config-defaults.d.ts +3 -3
- package/dist/services/tool-config-defaults.js +3 -3
- package/dist/services/tool-config-validation.d.ts +14 -4
- package/dist/services/tool-config-validation.js +63 -71
- package/dist/services/tool-context.d.ts +0 -8
- package/dist/services/tool-context.js +29 -25
- package/dist/services/tool-icons.d.ts +4 -3
- package/dist/services/tool-icons.js +4 -3
- package/dist/services/tool-instance-id.d.ts +0 -1
- package/dist/services/tool-instance-id.js +0 -6
- package/dist/services/tool-providers/TTSToolProvider.d.ts +41 -80
- package/dist/services/tool-providers/TTSToolProvider.js +81 -40
- package/dist/services/tool-providers/ToolProviderApi.d.ts +10 -4
- package/dist/services/tool-providers/ToolProviderRegistry.d.ts +32 -28
- package/dist/services/tool-providers/ToolProviderRegistry.js +121 -107
- package/dist/services/tool-providers/index.d.ts +0 -9
- package/dist/services/tool-providers/index.js +2 -4
- package/dist/services/tool-request.d.ts +27 -12
- package/dist/services/tool-request.js +24 -14
- package/dist/services/toolbar-decided-tools.d.ts +15 -0
- package/dist/services/toolbar-decided-tools.js +28 -0
- package/dist/services/tools-config-normalizer.d.ts +37 -23
- package/dist/services/tools-config-normalizer.js +2 -10
- package/dist/services/tts/browser-provider.d.ts +38 -2
- package/dist/services/tts/browser-provider.js +276 -140
- package/dist/services/tts/catalog-span-alignment.d.ts +2 -17
- package/dist/services/tts/catalog-span-alignment.js +17 -142
- package/dist/services/tts/flat-tree.d.ts +71 -0
- package/dist/services/tts/flat-tree.js +269 -0
- package/dist/services/tts/generated-speech/assemble-plan.d.ts +3 -1
- package/dist/services/tts/generated-speech/assemble-plan.js +3 -1
- package/dist/services/tts/generated-speech/dom/build-dom-plan.d.ts +2 -0
- package/dist/services/tts/generated-speech/dom/build-dom-plan.js +1 -1
- package/dist/services/tts/generated-speech/math-speech-cache.d.ts +3 -1
- package/dist/services/tts/generated-speech/math-speech-cache.js +5 -1
- package/dist/services/tts/generated-speech/types.d.ts +0 -12
- package/dist/services/tts/highlight-pipeline/boundary-normalizer.js +12 -62
- package/dist/services/tts/highlight-pipeline/create-highlight-plan.js +38 -5
- package/dist/services/tts/highlight-pipeline/normalize-speech-chunks.js +3 -6
- package/dist/services/tts/highlight-pipeline/prose-boundary-resolver.js +6 -4
- package/dist/services/tts/highlight-pipeline/readable-region.js +3 -2
- package/dist/services/tts/highlight-pipeline/types.d.ts +5 -0
- package/dist/services/tts/highlight-pipeline/visible-map-range.d.ts +12 -0
- package/dist/services/tts/highlight-pipeline/visible-map-range.js +73 -7
- package/dist/services/tts/math-alignment/index.d.ts +0 -5
- package/dist/services/tts/math-alignment/index.js +5 -25
- package/dist/services/tts/math-alignment/speech-tokenizer.d.ts +9 -1
- package/dist/services/tts/math-alignment/speech-tokenizer.js +38 -36
- package/dist/services/tts/math-alignment/types.d.ts +4 -2
- package/dist/services/tts/math-aware-text-processing.d.ts +5 -1
- package/dist/services/tts/math-aware-text-processing.js +74 -18
- package/dist/services/tts/math-control-names.d.ts +21 -0
- package/dist/services/tts/math-control-names.js +142 -0
- package/dist/services/tts/math-speech.d.ts +16 -1
- package/dist/services/tts/math-speech.js +55 -19
- package/dist/services/tts/provider-options.d.ts +41 -0
- package/dist/services/tts/provider-options.js +1 -0
- package/dist/services/tts/sre-engine.d.ts +7 -0
- package/dist/services/tts/sre-engine.js +11 -0
- package/dist/services/tts/sre-locales.d.ts +14 -0
- package/dist/services/tts/sre-locales.js +57 -0
- package/dist/services/tts/ssml/spoken-text.d.ts +2 -26
- package/dist/services/tts/ssml/spoken-text.js +29 -0
- package/dist/services/tts/start-failure.d.ts +11 -0
- package/dist/services/tts/start-failure.js +19 -0
- package/dist/services/tts/text-processing.d.ts +9 -1
- package/dist/services/tts/text-processing.js +46 -34
- package/dist/services/tts/text-segmentation.d.ts +7 -0
- package/dist/services/tts/text-segmentation.js +47 -0
- package/dist/services/tts-runtime-config.d.ts +44 -18
- package/dist/services/tts-runtime-config.js +22 -93
- package/dist/tools/content-capability-resolution.d.ts +7 -9
- package/dist/tools/content-capability-resolution.js +8 -45
- package/dist/tools/registration.d.ts +58 -0
- package/dist/tools/registration.js +54 -0
- package/dist/tools/registrations/toolbar-registration-helpers.js +2 -2
- package/dist/tools/tool-surface-host.d.ts +6 -10
- package/dist/tools/tool-surface-host.js +44 -42
- package/dist/tools/tool-tag-map.d.ts +5 -15
- package/dist/tools/tool-tag-map.js +6 -20
- package/dist/utils/structural-equality.d.ts +11 -0
- package/dist/utils/structural-equality.js +47 -0
- package/package.json +24 -59
- package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts +0 -49
- package/dist/attempt/adapters/activity-to-test-attempt-session.js +0 -138
- package/dist/components/chunks/ItemToolBar-byq80z42.js +0 -40
- package/dist/components/chunks/ItemToolBar-d36g3aw4.js +0 -49
- package/dist/context/runtime-context-consumer.d.ts +0 -13
- package/dist/context/runtime-context-consumer.js +0 -51
- package/dist/item-loader.d.ts +0 -44
- package/dist/item-loader.js +0 -61
- package/dist/policy/core/engine-context.d.ts +0 -29
- package/dist/policy/core/engine-context.js +0 -27
- package/dist/policy/core/policy-source-tag.d.ts +0 -31
- package/dist/policy/core/policy-source-tag.js +0 -28
- package/dist/policy/internal.d.ts +0 -25
- package/dist/policy/internal.js +0 -25
- package/dist/runtime/adapter/coordinator-bridge.d.ts +0 -92
- package/dist/runtime/adapter/coordinator-bridge.js +0 -126
- package/dist/runtime/adapter/framework-error-bridge.d.ts +0 -36
- package/dist/runtime/adapter/framework-error-bridge.js +0 -46
- package/dist/runtime/adapter/instrumentation-bridge.d.ts +0 -31
- package/dist/runtime/adapter/instrumentation-bridge.js +0 -38
- package/dist/runtime/core/engine-stage-derivation.d.ts +0 -18
- package/dist/runtime/core/engine-stage-derivation.js +0 -29
- package/dist/runtime/engine-context.d.ts +0 -39
- package/dist/runtime/engine-context.js +0 -31
- package/dist/runtime/internal.d.ts +0 -43
- package/dist/runtime/internal.js +0 -45
- package/dist/runtime/section-runtime-engine-host-context.d.ts +0 -80
- package/dist/runtime/section-runtime-engine-host-context.js +0 -95
- package/dist/runtime/stage-emit-gate.d.ts +0 -92
- package/dist/runtime/stage-emit-gate.js +0 -82
- package/dist/services/I18nService.d.ts +0 -47
- package/dist/services/I18nService.js +0 -84
- package/dist/services/ThemeProvider.d.ts +0 -95
- package/dist/services/ThemeProvider.js +0 -334
- package/dist/services/ToolConfigResolver.d.ts +0 -161
- package/dist/services/ToolConfigResolver.js +0 -229
- package/dist/services/catalog-media.d.ts +0 -56
- package/dist/services/catalog-media.js +0 -190
- package/dist/services/createDefaultToolRegistry.d.ts +0 -53
- package/dist/services/createDefaultToolRegistry.js +0 -45
- package/dist/services/defaultPersonalNeedsProfile.d.ts +0 -21
- package/dist/services/defaultPersonalNeedsProfile.js +0 -26
- package/dist/services/pnp-standard-features.d.ts +0 -238
- package/dist/services/pnp-standard-features.js +0 -338
- package/dist/services/tool-providers/CortexToolProvider.d.ts +0 -13
- package/dist/services/tool-providers/CortexToolProvider.js +0 -32
- package/dist/services/tool-providers/DesmosToolProvider.d.ts +0 -14
- package/dist/services/tool-providers/DesmosToolProvider.js +0 -32
- package/dist/services/tool-providers/GeoGebraToolProvider.d.ts +0 -16
- package/dist/services/tool-providers/GeoGebraToolProvider.js +0 -32
- package/dist/services/tool-providers/LazyCalculatorToolProvider.d.ts +0 -35
- package/dist/services/tool-providers/LazyCalculatorToolProvider.js +0 -95
- package/dist/services/tts/visual-line-ranges.d.ts +0 -18
- package/dist/services/tts/visual-line-ranges.js +0 -226
- package/dist/tools/client.d.ts +0 -12
- package/dist/tools/client.js +0 -14
- package/dist/tools/index.d.ts +0 -8
- package/dist/tools/index.js +0 -10
- package/dist/tools/internal.d.ts +0 -43
- package/dist/tools/internal.js +0 -41
- package/dist/tools/response-discovery.d.ts +0 -61
- package/dist/tools/response-discovery.js +0 -113
- package/dist/tools/types.d.ts +0 -337
- package/dist/tools/types.js +0 -12
- package/dist/tools/variant-resolver.d.ts +0 -41
- package/dist/tools/variant-resolver.js +0 -207
|
@@ -1,46 +1,81 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TTS Tool Provider
|
|
3
3
|
*
|
|
4
|
-
* Unified provider for
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
4
|
+
* Unified provider for both TTS backends:
|
|
5
|
+
* - `browser`: the Web Speech API (no auth)
|
|
6
|
+
* - `server`: a TTS server, its service named by the config's `provider`.
|
|
7
|
+
* `polly` and `google` run on the `pie` transport; `custom` runs on the
|
|
8
|
+
* `custom` transport to a host's own service, which takes `lang_id`,
|
|
9
|
+
* `speedRate` and `cache`
|
|
8
10
|
*
|
|
9
11
|
* Part of PIE Assessment Toolkit.
|
|
10
12
|
*/
|
|
13
|
+
import { createPieLogger, isTtsDebugEnabled, } from "@pie-players/pie-players-shared/pie";
|
|
11
14
|
import { BrowserTTSProvider } from "../../services/tts/browser-provider.js";
|
|
15
|
+
const logger = createPieLogger("tts-tool-provider", isTtsDebugEnabled);
|
|
16
|
+
/**
|
|
17
|
+
* Binds a server backend's provider to the config the registry initialized this
|
|
18
|
+
* tool provider with, including what `provider.runtime.authFetcher` returned.
|
|
19
|
+
* The bound config wins over the runtime config the TTS service initializes the
|
|
20
|
+
* provider with; `headers` and `providerOptions` merge key by key, keeping the
|
|
21
|
+
* host's headers and the service's telemetry reporter.
|
|
22
|
+
*/
|
|
23
|
+
function bindServerBackendConfig(provider, bound) {
|
|
24
|
+
return {
|
|
25
|
+
providerId: provider.providerId,
|
|
26
|
+
providerName: provider.providerName,
|
|
27
|
+
version: provider.version,
|
|
28
|
+
initialize: (config) => {
|
|
29
|
+
const runtime = config;
|
|
30
|
+
const merged = {
|
|
31
|
+
...runtime,
|
|
32
|
+
...bound,
|
|
33
|
+
headers: { ...runtime.headers, ...bound.headers },
|
|
34
|
+
providerOptions: {
|
|
35
|
+
...runtime.providerOptions,
|
|
36
|
+
...bound.providerOptions,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
return provider.initialize(merged);
|
|
40
|
+
},
|
|
41
|
+
getCapabilities: () => provider.getCapabilities(),
|
|
42
|
+
destroy: () => provider.destroy(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
12
45
|
/**
|
|
13
46
|
* TTS Tool Provider
|
|
14
47
|
*
|
|
15
|
-
* Wraps
|
|
48
|
+
* Wraps the browser or a server TTS provider with the ToolProviderApi interface
|
|
16
49
|
* for use in the ToolProviderRegistry.
|
|
17
50
|
*
|
|
18
51
|
* @example Browser TTS (no auth)
|
|
19
52
|
* ```typescript
|
|
20
53
|
* const provider = new TTSToolProvider();
|
|
21
|
-
* await provider.initialize({
|
|
54
|
+
* await provider.initialize({});
|
|
22
55
|
* const ttsProvider = await provider.createInstance();
|
|
23
56
|
* ```
|
|
24
57
|
*
|
|
25
|
-
* @example Server TTS
|
|
58
|
+
* @example Server TTS
|
|
26
59
|
* ```typescript
|
|
27
|
-
* const provider = new TTSToolProvider(
|
|
60
|
+
* const provider = new TTSToolProvider('server', {
|
|
61
|
+
* loadServerProvider: async () => ServerTTSProvider,
|
|
62
|
+
* });
|
|
28
63
|
* await provider.initialize({
|
|
29
|
-
*
|
|
30
|
-
* apiEndpoint: '/api/tts
|
|
31
|
-
* authToken: 'bearer-token', // Fetched via authFetcher
|
|
64
|
+
* provider: 'polly',
|
|
65
|
+
* apiEndpoint: '/api/tts',
|
|
32
66
|
* });
|
|
33
67
|
* const ttsProvider = await provider.createInstance();
|
|
34
68
|
* ```
|
|
35
69
|
*/
|
|
36
70
|
export class TTSToolProvider {
|
|
37
|
-
providerId = "tts-service";
|
|
38
71
|
providerName = "Text-to-Speech";
|
|
39
72
|
category = "tts";
|
|
40
73
|
version = "1.0";
|
|
41
74
|
requiresAuth;
|
|
75
|
+
backend;
|
|
42
76
|
ttsProvider = null;
|
|
43
77
|
config = null;
|
|
78
|
+
loadServerProvider;
|
|
44
79
|
async emitTelemetry(eventName, payload) {
|
|
45
80
|
try {
|
|
46
81
|
await this.config?.onTelemetry?.(eventName, payload);
|
|
@@ -53,16 +88,19 @@ export class TTSToolProvider {
|
|
|
53
88
|
* Create TTS tool provider
|
|
54
89
|
*
|
|
55
90
|
* @param backend TTS backend to use (default: 'browser')
|
|
91
|
+
* @param options Loader for the server adapter, required by server backends
|
|
56
92
|
*/
|
|
57
|
-
constructor(backend = "browser") {
|
|
93
|
+
constructor(backend = "browser", options = {}) {
|
|
94
|
+
this.backend = backend;
|
|
58
95
|
this.requiresAuth = backend !== "browser";
|
|
96
|
+
this.loadServerProvider = options.loadServerProvider;
|
|
59
97
|
}
|
|
60
98
|
/**
|
|
61
99
|
* Initialize TTS provider
|
|
62
100
|
*
|
|
63
101
|
* Sets up the appropriate TTS backend.
|
|
64
102
|
*
|
|
65
|
-
* @param config
|
|
103
|
+
* @param config Runtime configuration and credentials
|
|
66
104
|
* @throws Error if initialization fails or required config missing
|
|
67
105
|
*/
|
|
68
106
|
async initialize(config) {
|
|
@@ -71,19 +109,17 @@ export class TTSToolProvider {
|
|
|
71
109
|
return;
|
|
72
110
|
}
|
|
73
111
|
this.config = config;
|
|
74
|
-
switch (
|
|
112
|
+
switch (this.backend) {
|
|
75
113
|
case "browser":
|
|
76
114
|
await this._initializeBrowserTTS(config);
|
|
77
115
|
break;
|
|
78
|
-
case "polly":
|
|
79
|
-
case "google":
|
|
80
116
|
case "server":
|
|
81
117
|
await this._initializeServerTTS(config);
|
|
82
118
|
break;
|
|
83
119
|
default:
|
|
84
|
-
throw new Error(`[TTSToolProvider] Unknown backend: ${
|
|
120
|
+
throw new Error(`[TTSToolProvider] Unknown backend: ${this.backend}`);
|
|
85
121
|
}
|
|
86
|
-
|
|
122
|
+
logger.debug(`initialized (backend: ${this.backend})`);
|
|
87
123
|
}
|
|
88
124
|
/**
|
|
89
125
|
* Initialize browser TTS (Web Speech API)
|
|
@@ -94,29 +130,33 @@ export class TTSToolProvider {
|
|
|
94
130
|
throw new Error("[TTSToolProvider] Browser TTS not supported (Web Speech API not available)");
|
|
95
131
|
}
|
|
96
132
|
this.ttsProvider = new BrowserTTSProvider();
|
|
97
|
-
|
|
133
|
+
logger.debug("browser TTS initialized (Web Speech API)");
|
|
98
134
|
}
|
|
99
135
|
/**
|
|
100
|
-
* Initialize server-based TTS
|
|
136
|
+
* Initialize server-based TTS
|
|
101
137
|
*/
|
|
102
138
|
async _initializeServerTTS(config) {
|
|
103
139
|
if (!config.apiEndpoint) {
|
|
104
140
|
throw new Error("[TTSToolProvider] apiEndpoint required for server-based TTS backends");
|
|
105
141
|
}
|
|
106
|
-
|
|
142
|
+
const loadServerProvider = this.loadServerProvider;
|
|
143
|
+
if (!loadServerProvider) {
|
|
144
|
+
throw new Error("[TTSToolProvider] server-based TTS backends need the loadServerProvider option");
|
|
145
|
+
}
|
|
146
|
+
const serverProvider = config.provider || this.backend;
|
|
107
147
|
const moduleLoadStartedAt = Date.now();
|
|
108
148
|
await this.emitTelemetry("pie-tool-library-load-start", {
|
|
109
149
|
toolId: "textToSpeech",
|
|
110
150
|
operation: "server-provider-module-import",
|
|
111
|
-
backend:
|
|
151
|
+
backend: serverProvider,
|
|
112
152
|
});
|
|
113
|
-
const
|
|
153
|
+
const ServerProvider = await (async () => {
|
|
114
154
|
try {
|
|
115
|
-
const loaded =
|
|
155
|
+
const loaded = await loadServerProvider();
|
|
116
156
|
await this.emitTelemetry("pie-tool-library-load-success", {
|
|
117
157
|
toolId: "textToSpeech",
|
|
118
158
|
operation: "server-provider-module-import",
|
|
119
|
-
backend:
|
|
159
|
+
backend: serverProvider,
|
|
120
160
|
duration: Date.now() - moduleLoadStartedAt,
|
|
121
161
|
});
|
|
122
162
|
return loaded;
|
|
@@ -125,7 +165,7 @@ export class TTSToolProvider {
|
|
|
125
165
|
await this.emitTelemetry("pie-tool-library-load-error", {
|
|
126
166
|
toolId: "textToSpeech",
|
|
127
167
|
operation: "server-provider-module-import",
|
|
128
|
-
backend:
|
|
168
|
+
backend: serverProvider,
|
|
129
169
|
duration: Date.now() - moduleLoadStartedAt,
|
|
130
170
|
errorType: "ToolLibraryLoadError",
|
|
131
171
|
message: error instanceof Error ? error.message : String(error),
|
|
@@ -133,8 +173,9 @@ export class TTSToolProvider {
|
|
|
133
173
|
throw error;
|
|
134
174
|
}
|
|
135
175
|
})();
|
|
136
|
-
|
|
137
|
-
|
|
176
|
+
const { onTelemetry: _onTelemetry, ...backendConfig } = config;
|
|
177
|
+
this.ttsProvider = bindServerBackendConfig(new ServerProvider(), backendConfig);
|
|
178
|
+
logger.debug(`server TTS initialized (provider: ${serverProvider})`);
|
|
138
179
|
}
|
|
139
180
|
/**
|
|
140
181
|
* Create a TTS provider instance
|
|
@@ -152,23 +193,23 @@ export class TTSToolProvider {
|
|
|
152
193
|
return this.ttsProvider;
|
|
153
194
|
}
|
|
154
195
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
* @returns TTS capabilities based on backend
|
|
196
|
+
* The backend's capabilities. Its features are the speech provider's own,
|
|
197
|
+
* and all false before {@link initialize} creates it.
|
|
158
198
|
*/
|
|
159
199
|
getCapabilities() {
|
|
160
|
-
const isBrowser = this.
|
|
200
|
+
const isBrowser = this.backend === "browser";
|
|
201
|
+
const speech = this.ttsProvider?.getCapabilities();
|
|
161
202
|
return {
|
|
162
203
|
supportsOffline: isBrowser,
|
|
163
204
|
requiresAuth: !isBrowser,
|
|
164
205
|
maxInstances: 1, // Single TTS instance (playback is sequential)
|
|
165
206
|
features: {
|
|
166
|
-
wordBoundary:
|
|
167
|
-
pause:
|
|
168
|
-
resume:
|
|
169
|
-
rateControl:
|
|
170
|
-
pitchControl:
|
|
171
|
-
voiceSelection:
|
|
207
|
+
wordBoundary: speech?.supportsWordBoundary ?? false,
|
|
208
|
+
pause: speech?.supportsPause ?? false,
|
|
209
|
+
resume: speech?.supportsResume ?? false,
|
|
210
|
+
rateControl: speech?.supportsRateControl ?? false,
|
|
211
|
+
pitchControl: speech?.supportsPitchControl ?? false,
|
|
212
|
+
voiceSelection: speech?.supportsVoiceSelection ?? false,
|
|
172
213
|
},
|
|
173
214
|
};
|
|
174
215
|
}
|
|
@@ -191,6 +232,6 @@ export class TTSToolProvider {
|
|
|
191
232
|
this.ttsProvider = null;
|
|
192
233
|
}
|
|
193
234
|
this.config = null;
|
|
194
|
-
|
|
235
|
+
logger.debug("destroyed");
|
|
195
236
|
}
|
|
196
237
|
}
|
|
@@ -11,14 +11,20 @@ export interface ToolProviderCapabilities {
|
|
|
11
11
|
maxInstances?: number | null;
|
|
12
12
|
features: Record<string, boolean>;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* A tool's provider. It registers under its tool's id, which is how the toolkit
|
|
16
|
+
* and the tool find it; it carries no id of its own.
|
|
17
|
+
*
|
|
18
|
+
* Config takes no type parameter (ADR 0002): an implementation narrows it in its
|
|
19
|
+
* own method signatures.
|
|
20
|
+
*/
|
|
21
|
+
export interface ToolProviderApi<TInstance = any> {
|
|
16
22
|
readonly providerName: string;
|
|
17
23
|
readonly category: ToolCategory;
|
|
18
24
|
readonly version: string;
|
|
19
25
|
readonly requiresAuth: boolean;
|
|
20
|
-
initialize(config:
|
|
21
|
-
createInstance(config?:
|
|
26
|
+
initialize(config: unknown): Promise<void>;
|
|
27
|
+
createInstance(config?: unknown): Promise<TInstance>;
|
|
22
28
|
getCapabilities(): ToolProviderCapabilities;
|
|
23
29
|
isReady(): boolean;
|
|
24
30
|
destroy(): void;
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { ToolProviderApi, ToolCategory } from "./ToolProviderApi.js";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* What `register` takes: the provider, its config, and how it starts.
|
|
12
12
|
*/
|
|
13
|
-
export interface
|
|
13
|
+
export interface ToolProviderRegistration<TConfig = any> {
|
|
14
14
|
/**
|
|
15
15
|
* Provider instance to register
|
|
16
16
|
*/
|
|
17
|
-
provider: ToolProviderApi
|
|
17
|
+
provider: ToolProviderApi;
|
|
18
18
|
/**
|
|
19
19
|
* Configuration for this provider
|
|
20
20
|
* (may include auth credentials, endpoints, etc.)
|
|
@@ -54,25 +54,27 @@ export interface ToolProviderConfig<TConfig = any> {
|
|
|
54
54
|
* - Registration
|
|
55
55
|
* - Lazy initialization
|
|
56
56
|
* - Auth credential fetching
|
|
57
|
-
* - Provider lookup by
|
|
57
|
+
* - Provider lookup by tool id or category
|
|
58
|
+
*
|
|
59
|
+
* The toolkit coordinator registers each provider under its tool's id.
|
|
58
60
|
*
|
|
59
61
|
* @example
|
|
60
62
|
* ```typescript
|
|
61
63
|
* const registry = new ToolProviderRegistry();
|
|
62
64
|
*
|
|
63
65
|
* // Register a provider with auth fetcher
|
|
64
|
-
* registry.register('
|
|
65
|
-
* provider: new
|
|
66
|
+
* registry.register('calculator', {
|
|
67
|
+
* provider: new ExampleToolProvider(),
|
|
66
68
|
* config: {},
|
|
67
69
|
* lazy: true,
|
|
68
70
|
* authFetcher: async () => {
|
|
69
|
-
* const response = await fetch('/api/
|
|
71
|
+
* const response = await fetch('/api/example/token');
|
|
70
72
|
* return response.json();
|
|
71
73
|
* },
|
|
72
74
|
* });
|
|
73
75
|
*
|
|
74
76
|
* // Get provider (auto-initializes if lazy)
|
|
75
|
-
* const
|
|
77
|
+
* const provider = await registry.getProvider('calculator');
|
|
76
78
|
* ```
|
|
77
79
|
*/
|
|
78
80
|
export declare class ToolProviderRegistry {
|
|
@@ -85,23 +87,28 @@ export declare class ToolProviderRegistry {
|
|
|
85
87
|
* Register a tool provider
|
|
86
88
|
*
|
|
87
89
|
* Adds a provider to the registry. If lazy is false, initializes immediately.
|
|
90
|
+
* A registration under an id already registered replaces it: the replaced
|
|
91
|
+
* provider is destroyed once a start in progress settles, and a caller
|
|
92
|
+
* waiting on that start gets the replacement.
|
|
88
93
|
*
|
|
89
|
-
* @param
|
|
94
|
+
* @param toolId Id of the tool the provider serves
|
|
90
95
|
* @param config Provider configuration
|
|
91
|
-
* @throws Error if provider with same ID already registered
|
|
92
96
|
*/
|
|
93
|
-
register(
|
|
97
|
+
register(toolId: string, config: ToolProviderRegistration): void;
|
|
94
98
|
/**
|
|
95
99
|
* Initialize a provider
|
|
96
100
|
*
|
|
97
101
|
* Fetches auth if needed and initializes the provider.
|
|
98
102
|
* Safe to call multiple times - subsequent calls wait for first initialization.
|
|
99
103
|
*
|
|
100
|
-
* @param
|
|
104
|
+
* @param toolId Tool whose provider to initialize
|
|
101
105
|
* @returns Promise that resolves when initialization complete
|
|
102
106
|
* @throws Error if provider not registered or initialization fails
|
|
103
107
|
*/
|
|
104
|
-
initialize(
|
|
108
|
+
initialize(toolId: string): Promise<void>;
|
|
109
|
+
/** Whether a registration replaced `provider` under `toolId`. */
|
|
110
|
+
private isReplaced;
|
|
111
|
+
private destroyProvider;
|
|
105
112
|
/**
|
|
106
113
|
* Internal initialization logic
|
|
107
114
|
*/
|
|
@@ -112,54 +119,51 @@ export declare class ToolProviderRegistry {
|
|
|
112
119
|
* Retrieves a registered provider. If autoInitialize is true and provider
|
|
113
120
|
* is not initialized, initializes it first.
|
|
114
121
|
*
|
|
115
|
-
* @param
|
|
122
|
+
* @param toolId Id of the tool the provider serves
|
|
116
123
|
* @param autoInitialize Auto-initialize if not ready (default: true)
|
|
117
124
|
* @returns Provider instance
|
|
118
125
|
* @throws Error if provider not registered
|
|
119
126
|
*/
|
|
120
|
-
getProvider<T extends ToolProviderApi = ToolProviderApi>(
|
|
127
|
+
getProvider<T extends ToolProviderApi = ToolProviderApi>(toolId: string, autoInitialize?: boolean): Promise<T>;
|
|
121
128
|
/**
|
|
122
|
-
*
|
|
129
|
+
* The ids of the tools whose provider is in `category`.
|
|
123
130
|
*
|
|
124
131
|
* @param category Tool category to filter by
|
|
125
|
-
* @returns Array of provider IDs in the category
|
|
126
132
|
*/
|
|
127
133
|
getProvidersByCategory(category: ToolCategory): string[];
|
|
128
134
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* @returns Array of all provider IDs
|
|
135
|
+
* The ids of the tools with a registered provider.
|
|
132
136
|
*/
|
|
133
137
|
getProviderIds(): string[];
|
|
134
138
|
/**
|
|
135
139
|
* Check if provider is registered
|
|
136
140
|
*
|
|
137
|
-
* @param
|
|
141
|
+
* @param toolId Id of the tool the provider serves
|
|
138
142
|
* @returns true if provider is registered
|
|
139
143
|
*/
|
|
140
|
-
has(
|
|
144
|
+
has(toolId: string): boolean;
|
|
141
145
|
/**
|
|
142
146
|
* Check if provider is initialized
|
|
143
147
|
*
|
|
144
|
-
* @param
|
|
148
|
+
* @param toolId Id of the tool the provider serves
|
|
145
149
|
* @returns true if provider is initialized
|
|
146
150
|
*/
|
|
147
|
-
isInitialized(
|
|
151
|
+
isInitialized(toolId: string): boolean;
|
|
148
152
|
/**
|
|
149
153
|
* Check if provider is currently initializing
|
|
150
154
|
*
|
|
151
|
-
* @param
|
|
155
|
+
* @param toolId Id of the tool the provider serves
|
|
152
156
|
* @returns true if initialization in progress
|
|
153
157
|
*/
|
|
154
|
-
isInitializing(
|
|
158
|
+
isInitializing(toolId: string): boolean;
|
|
155
159
|
/**
|
|
156
160
|
* Unregister and destroy a provider
|
|
157
161
|
*
|
|
158
162
|
* Removes the provider from the registry and calls its destroy method.
|
|
159
163
|
*
|
|
160
|
-
* @param
|
|
164
|
+
* @param toolId Tool whose provider to unregister
|
|
161
165
|
*/
|
|
162
|
-
unregister(
|
|
166
|
+
unregister(toolId: string): Promise<void>;
|
|
163
167
|
/**
|
|
164
168
|
* Clean up all providers
|
|
165
169
|
*
|