@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,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Placement defaults this package can hold.
|
|
3
3
|
*
|
|
4
|
-
* Only the empty one. `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Only the empty one. `SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT` names
|
|
5
|
+
* capabilities, so it lives in the composition layer
|
|
6
|
+
* (`@pie-players/pie-default-tool-loaders`).
|
|
7
7
|
*/
|
|
8
8
|
export declare const DEFAULT_TOOL_PLACEMENT: {
|
|
9
9
|
readonly assessment: readonly [];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Placement defaults this package can hold.
|
|
3
3
|
*
|
|
4
|
-
* Only the empty one. `
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Only the empty one. `SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT` names
|
|
5
|
+
* capabilities, so it lives in the composition layer
|
|
6
|
+
* (`@pie-players/pie-default-tool-loaders`).
|
|
7
7
|
*/
|
|
8
8
|
export const DEFAULT_TOOL_PLACEMENT = {
|
|
9
9
|
assessment: [],
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { type CanonicalToolsConfig } from "./tools-config-normalizer.js";
|
|
1
|
+
import { type CanonicalToolsConfig, type ToolsConfigInput } from "./tools-config-normalizer.js";
|
|
2
2
|
import { type FrameworkErrorModel } from "./framework-error.js";
|
|
3
3
|
import type { ToolRegistry } from "./ToolRegistry.js";
|
|
4
4
|
export type ToolConfigStrictness = "off" | "warn" | "error";
|
|
5
5
|
export type ToolConfigDiagnosticSeverity = "warning" | "error";
|
|
6
6
|
export interface ToolConfigDiagnostic {
|
|
7
|
-
code: "tools.unknownToolId" | "tools.unsupportedLevel" | "tools.unplaceableActivation" | "tools.registryUnavailable" | "tools.unknownProviderKey" | "tools.
|
|
7
|
+
code: "tools.unknownToolId" | "tools.unsupportedLevel" | "tools.unplaceableActivation" | "tools.registryUnavailable" | "tools.unknownProviderKey" | "tools.providerSanitizeFailed" | "tools.providerValidateFailed" | "tools.invalidProviderValidation";
|
|
8
8
|
severity: ToolConfigDiagnosticSeverity;
|
|
9
9
|
path: string;
|
|
10
10
|
message: string;
|
|
11
11
|
toolId?: string;
|
|
12
|
-
providerId?: string;
|
|
13
12
|
}
|
|
14
13
|
export interface ToolConfigValidationOptions {
|
|
15
14
|
strictness?: ToolConfigStrictness;
|
|
@@ -27,4 +26,15 @@ export declare function frameworkErrorFromToolConfigValidation(args: {
|
|
|
27
26
|
recoverable?: boolean;
|
|
28
27
|
}): FrameworkErrorModel;
|
|
29
28
|
export declare function normalizeToolConfigStrictness(value: unknown): ToolConfigStrictness;
|
|
30
|
-
export declare function normalizeAndValidateToolsConfig(input?:
|
|
29
|
+
export declare function normalizeAndValidateToolsConfig(input?: ToolsConfigInput | null, options?: ToolConfigValidationOptions): ToolConfigValidationResult;
|
|
30
|
+
/**
|
|
31
|
+
* The normalization and diagnostics of {@link normalizeAndValidateToolsConfig},
|
|
32
|
+
* without reporting: nothing is printed or thrown.
|
|
33
|
+
*/
|
|
34
|
+
export declare function collectToolConfigDiagnostics(input: ToolsConfigInput | null | undefined, toolRegistry: ToolRegistry | null | undefined): ToolConfigValidationResult;
|
|
35
|
+
/**
|
|
36
|
+
* Report diagnostics as {@link normalizeAndValidateToolsConfig} does: `"warn"`
|
|
37
|
+
* prints every diagnostic, and `"error"` throws the blocking ones or, when there
|
|
38
|
+
* are none, prints the rest.
|
|
39
|
+
*/
|
|
40
|
+
export declare function reportToolConfigDiagnostics(diagnostics: ToolConfigDiagnostic[], options?: Pick<ToolConfigValidationOptions, "strictness" | "source">): void;
|
|
@@ -34,21 +34,20 @@ function getRegistryToolMap(toolRegistry) {
|
|
|
34
34
|
.sort((left, right) => left.toolId.localeCompare(right.toolId))
|
|
35
35
|
.map((tool) => [tool.toolId, tool]));
|
|
36
36
|
}
|
|
37
|
-
function
|
|
38
|
-
if (!providerConfig || !tool?.
|
|
37
|
+
function sanitizeToolConfig(toolId, providerConfig, tool, diagnostics) {
|
|
38
|
+
if (!providerConfig || !tool?.sanitizeConfig)
|
|
39
39
|
return providerConfig;
|
|
40
40
|
try {
|
|
41
|
-
const sanitized = tool.
|
|
41
|
+
const sanitized = tool.sanitizeConfig(providerConfig);
|
|
42
42
|
if (!sanitized ||
|
|
43
43
|
typeof sanitized !== "object" ||
|
|
44
44
|
Array.isArray(sanitized)) {
|
|
45
45
|
diagnostics.push(createDiagnostic({
|
|
46
46
|
code: "tools.providerSanitizeFailed",
|
|
47
47
|
severity: "error",
|
|
48
|
-
path: `providers.${
|
|
49
|
-
message: `
|
|
50
|
-
|
|
51
|
-
toolId: providerId,
|
|
48
|
+
path: `providers.${toolId}`,
|
|
49
|
+
message: `Config sanitizer of tool "${toolId}" must return an object.`,
|
|
50
|
+
toolId,
|
|
52
51
|
}));
|
|
53
52
|
return providerConfig;
|
|
54
53
|
}
|
|
@@ -58,36 +57,33 @@ function sanitizeProviderConfig(providerId, providerConfig, tool, diagnostics) {
|
|
|
58
57
|
diagnostics.push(createDiagnostic({
|
|
59
58
|
code: "tools.providerSanitizeFailed",
|
|
60
59
|
severity: "error",
|
|
61
|
-
path: `providers.${
|
|
62
|
-
message: `
|
|
63
|
-
|
|
64
|
-
toolId: providerId,
|
|
60
|
+
path: `providers.${toolId}`,
|
|
61
|
+
message: `Config sanitizer of tool "${toolId}" failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
62
|
+
toolId,
|
|
65
63
|
}));
|
|
66
64
|
return providerConfig;
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
|
-
function
|
|
70
|
-
if (!providerConfig || !tool?.
|
|
67
|
+
function validateToolConfig(toolId, providerConfig, tool, diagnostics) {
|
|
68
|
+
if (!providerConfig || !tool?.validateConfig)
|
|
71
69
|
return;
|
|
72
70
|
try {
|
|
73
|
-
const
|
|
74
|
-
if (!Array.isArray(
|
|
71
|
+
const toolDiagnostics = tool.validateConfig(providerConfig);
|
|
72
|
+
if (!Array.isArray(toolDiagnostics)) {
|
|
75
73
|
diagnostics.push(createDiagnostic({
|
|
76
74
|
code: "tools.invalidProviderValidation",
|
|
77
75
|
severity: "error",
|
|
78
|
-
path: `providers.${
|
|
79
|
-
message: `
|
|
80
|
-
|
|
81
|
-
toolId: providerId,
|
|
76
|
+
path: `providers.${toolId}`,
|
|
77
|
+
message: `Config validator of tool "${toolId}" must return an array.`,
|
|
78
|
+
toolId,
|
|
82
79
|
}));
|
|
83
80
|
return;
|
|
84
81
|
}
|
|
85
|
-
for (const diagnostic of
|
|
82
|
+
for (const diagnostic of toolDiagnostics) {
|
|
86
83
|
diagnostics.push({
|
|
87
84
|
...diagnostic,
|
|
88
|
-
path: diagnostic.path || `providers.${
|
|
89
|
-
|
|
90
|
-
toolId: diagnostic.toolId || providerId,
|
|
85
|
+
path: diagnostic.path || `providers.${toolId}`,
|
|
86
|
+
toolId: diagnostic.toolId || toolId,
|
|
91
87
|
});
|
|
92
88
|
}
|
|
93
89
|
}
|
|
@@ -95,10 +91,9 @@ function validateProviderConfig(providerId, providerConfig, tool, diagnostics) {
|
|
|
95
91
|
diagnostics.push(createDiagnostic({
|
|
96
92
|
code: "tools.providerValidateFailed",
|
|
97
93
|
severity: "error",
|
|
98
|
-
path: `providers.${
|
|
99
|
-
message: `
|
|
100
|
-
|
|
101
|
-
toolId: providerId,
|
|
94
|
+
path: `providers.${toolId}`,
|
|
95
|
+
message: `Config validator of tool "${toolId}" failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
96
|
+
toolId,
|
|
102
97
|
}));
|
|
103
98
|
}
|
|
104
99
|
}
|
|
@@ -176,27 +171,16 @@ function collectPolicyDiagnostics(config, toolMap, diagnostics) {
|
|
|
176
171
|
}));
|
|
177
172
|
}
|
|
178
173
|
}
|
|
179
|
-
function collectProviderKeyDiagnostics(config, toolMap,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
code: "tools.removedProviderKey",
|
|
183
|
-
severity: "error",
|
|
184
|
-
path: "providers.tts",
|
|
185
|
-
message: `Provider key "tts" is no longer supported. Use "providers.textToSpeech".`,
|
|
186
|
-
providerId: "tts",
|
|
187
|
-
toolId: "textToSpeech",
|
|
188
|
-
}));
|
|
189
|
-
}
|
|
190
|
-
for (const providerId of Object.keys(config.providers).sort()) {
|
|
191
|
-
if (toolMap.size === 0 || toolMap.has(providerId))
|
|
174
|
+
function collectProviderKeyDiagnostics(config, toolMap, diagnostics) {
|
|
175
|
+
for (const key of Object.keys(config.providers).sort()) {
|
|
176
|
+
if (toolMap.size === 0 || toolMap.has(key))
|
|
192
177
|
continue;
|
|
193
178
|
diagnostics.push(createDiagnostic({
|
|
194
179
|
code: "tools.unknownProviderKey",
|
|
195
180
|
severity: "error",
|
|
196
|
-
path: `providers.${
|
|
197
|
-
message: `Unknown provider key "${
|
|
198
|
-
|
|
199
|
-
toolId: providerId,
|
|
181
|
+
path: `providers.${key}`,
|
|
182
|
+
message: `Unknown provider key "${key}".`,
|
|
183
|
+
toolId: key,
|
|
200
184
|
}));
|
|
201
185
|
}
|
|
202
186
|
}
|
|
@@ -215,15 +199,22 @@ function throwValidationError(diagnostics, source) {
|
|
|
215
199
|
throw new Error(`[tool-config-validation:${source}] Invalid tools config:\n${formatted}`);
|
|
216
200
|
}
|
|
217
201
|
export function normalizeAndValidateToolsConfig(input, options = {}) {
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
202
|
+
const result = collectToolConfigDiagnostics(input, options.toolRegistry);
|
|
203
|
+
reportToolConfigDiagnostics(result.diagnostics, options);
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The normalization and diagnostics of {@link normalizeAndValidateToolsConfig},
|
|
208
|
+
* without reporting: nothing is printed or thrown.
|
|
209
|
+
*/
|
|
210
|
+
export function collectToolConfigDiagnostics(input, toolRegistry) {
|
|
211
|
+
const registryTools = getRegistryToolMap(toolRegistry);
|
|
221
212
|
const normalized = normalizeToolsConfig(input);
|
|
222
213
|
const diagnostics = [];
|
|
223
214
|
// Tool-id and provider checks need a registry to check against, and every
|
|
224
215
|
// collector below returns early without one. Say so: this package no longer
|
|
225
216
|
// falls back to a packaged registry, so a caller that used to get id
|
|
226
|
-
// validation for free now gets none, and a silent downgrade
|
|
217
|
+
// validation for free now gets none, and a silent downgrade of "your ids are
|
|
227
218
|
// valid" to "nobody looked" is the kind of change that surfaces as a typo
|
|
228
219
|
// reaching a learner.
|
|
229
220
|
const hasConfiguredTools = Object.values(normalized.placement).some((ids) => ids.length > 0) ||
|
|
@@ -235,21 +226,16 @@ export function normalizeAndValidateToolsConfig(input, options = {}) {
|
|
|
235
226
|
code: "tools.registryUnavailable",
|
|
236
227
|
severity: "warning",
|
|
237
228
|
path: "tools",
|
|
238
|
-
message: 'No tool registry was supplied, so tool ids, placement levels and provider config were not validated. Pass `toolRegistry` — for the packaged capability set, `createPackagedToolRegistry()` from "@pie-players/pie-default-tool-loaders".',
|
|
229
|
+
message: 'No tool registry was supplied, so tool ids, placement levels and provider config were not validated, and a coordinator without one registers no tool providers. Pass `toolRegistry` to the coordinator or the toolkit it is bound to — for the packaged capability set, `createPackagedToolRegistry()` from "@pie-players/pie-default-tool-loaders".',
|
|
239
230
|
}));
|
|
240
231
|
}
|
|
241
|
-
const hasRemovedTtsKey = Object.hasOwn(normalized.providers, "tts");
|
|
242
232
|
const nextProviders = {
|
|
243
233
|
...(normalized.providers || {}),
|
|
244
234
|
};
|
|
245
|
-
for (const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
const tool = registryTools.get(providerId);
|
|
251
|
-
nextProviders[providerId] = sanitizeProviderConfig(providerId, nextProviders[providerId], tool, diagnostics);
|
|
252
|
-
validateProviderConfig(providerId, nextProviders[providerId], tool, diagnostics);
|
|
235
|
+
for (const toolId of Object.keys(nextProviders).sort()) {
|
|
236
|
+
const tool = registryTools.get(toolId);
|
|
237
|
+
nextProviders[toolId] = sanitizeToolConfig(toolId, nextProviders[toolId], tool, diagnostics);
|
|
238
|
+
validateToolConfig(toolId, nextProviders[toolId], tool, diagnostics);
|
|
253
239
|
}
|
|
254
240
|
const nextConfig = {
|
|
255
241
|
...normalized,
|
|
@@ -257,18 +243,28 @@ export function normalizeAndValidateToolsConfig(input, options = {}) {
|
|
|
257
243
|
};
|
|
258
244
|
collectPlacementDiagnostics(nextConfig, registryTools, diagnostics);
|
|
259
245
|
collectPolicyDiagnostics(nextConfig, registryTools, diagnostics);
|
|
260
|
-
collectProviderKeyDiagnostics(nextConfig, registryTools,
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
246
|
+
collectProviderKeyDiagnostics(nextConfig, registryTools, diagnostics);
|
|
247
|
+
return {
|
|
248
|
+
config: nextConfig,
|
|
249
|
+
diagnostics,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Report diagnostics as {@link normalizeAndValidateToolsConfig} does: `"warn"`
|
|
254
|
+
* prints every diagnostic, and `"error"` throws the blocking ones or, when there
|
|
255
|
+
* are none, prints the rest.
|
|
256
|
+
*/
|
|
257
|
+
export function reportToolConfigDiagnostics(diagnostics, options = {}) {
|
|
258
|
+
const strictness = normalizeToolConfigStrictness(options.strictness);
|
|
259
|
+
const source = options.source ?? "tools";
|
|
264
260
|
if (strictness === "warn") {
|
|
265
261
|
emitWarnings(diagnostics, source);
|
|
266
262
|
}
|
|
267
|
-
// Severity decides what `strictness: "error"` rejects. Every diagnostic
|
|
268
|
-
//
|
|
269
|
-
//
|
|
270
|
-
//
|
|
271
|
-
//
|
|
263
|
+
// Severity decides what `strictness: "error"` rejects. Every diagnostic was
|
|
264
|
+
// `"error"` until `tools.registryUnavailable`, which reports that validation
|
|
265
|
+
// could not run rather than that the config is wrong — throwing on it would
|
|
266
|
+
// turn "no registry supplied" from a host's existing, working setup into a
|
|
267
|
+
// construction failure.
|
|
272
268
|
const blocking = diagnostics.filter((entry) => entry.severity === "error");
|
|
273
269
|
if (strictness === "error" && blocking.length > 0) {
|
|
274
270
|
throwValidationError(blocking, source);
|
|
@@ -276,8 +272,4 @@ export function normalizeAndValidateToolsConfig(input, options = {}) {
|
|
|
276
272
|
if (strictness === "error" && blocking.length === 0) {
|
|
277
273
|
emitWarnings(diagnostics, source);
|
|
278
274
|
}
|
|
279
|
-
return {
|
|
280
|
-
config: nextConfig,
|
|
281
|
-
diagnostics,
|
|
282
|
-
};
|
|
283
275
|
}
|
|
@@ -101,14 +101,6 @@ export interface ElementToolContext extends BaseToolContext {
|
|
|
101
101
|
* Union type of all tool contexts
|
|
102
102
|
*/
|
|
103
103
|
export type ToolContext = AssessmentToolContext | SectionToolContext | ItemToolContext | PassageToolContext | RubricToolContext | ElementToolContext;
|
|
104
|
-
/**
|
|
105
|
-
* Type guard to check if context is at assessment level
|
|
106
|
-
*/
|
|
107
|
-
export declare function isAssessmentContext(context: ToolContext): context is AssessmentToolContext;
|
|
108
|
-
/**
|
|
109
|
-
* Type guard to check if context is at section level
|
|
110
|
-
*/
|
|
111
|
-
export declare function isSectionContext(context: ToolContext): context is SectionToolContext;
|
|
112
104
|
/**
|
|
113
105
|
* Type guard to check if context is at item level
|
|
114
106
|
*/
|
|
@@ -4,18 +4,6 @@
|
|
|
4
4
|
* Defines the context types passed to tools for making visibility and behavior decisions.
|
|
5
5
|
* Each context level provides increasingly specific information about where the tool is being used.
|
|
6
6
|
*/
|
|
7
|
-
/**
|
|
8
|
-
* Type guard to check if context is at assessment level
|
|
9
|
-
*/
|
|
10
|
-
export function isAssessmentContext(context) {
|
|
11
|
-
return context.level === "assessment";
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Type guard to check if context is at section level
|
|
15
|
-
*/
|
|
16
|
-
export function isSectionContext(context) {
|
|
17
|
-
return context.level === "section";
|
|
18
|
-
}
|
|
19
7
|
/**
|
|
20
8
|
* Type guard to check if context is at item level
|
|
21
9
|
*/
|
|
@@ -261,20 +249,35 @@ export function hasMathContent(context) {
|
|
|
261
249
|
];
|
|
262
250
|
return textIndicators.some((pattern) => pattern.test(text));
|
|
263
251
|
}
|
|
252
|
+
const CHOICE_INTERACTION_ELEMENTS = new Set([
|
|
253
|
+
"multiple-choice",
|
|
254
|
+
"inline-choice",
|
|
255
|
+
"select-text",
|
|
256
|
+
"ebsr",
|
|
257
|
+
]);
|
|
258
|
+
// Content names one interaction several ways: `multiple-choice`, `pie-multiple-choice`,
|
|
259
|
+
// `pie-element-multiple-choice`, a runtime `--version-*` tag, or any tag the item's
|
|
260
|
+
// `elements` map binds to `@pie-element/multiple-choice`.
|
|
261
|
+
const baseElementName = (tag) => tag
|
|
262
|
+
.toLowerCase()
|
|
263
|
+
.replace(/--version-[0-9a-z-]+$/, "")
|
|
264
|
+
.replace(/^pie-(element-)?/, "");
|
|
265
|
+
function isChoiceElement(tag, elements) {
|
|
266
|
+
if (CHOICE_INTERACTION_ELEMENTS.has(baseElementName(tag)))
|
|
267
|
+
return true;
|
|
268
|
+
if (!elements || typeof elements !== "object")
|
|
269
|
+
return false;
|
|
270
|
+
const map = elements;
|
|
271
|
+
const spec = map[tag] ?? map[tag.replace(/--version-[0-9A-Za-z-]+$/, "")];
|
|
272
|
+
if (typeof spec !== "string")
|
|
273
|
+
return false;
|
|
274
|
+
const packageName = spec.match(/^@pie-element\/([^@]+)/)?.[1];
|
|
275
|
+
return !!packageName && CHOICE_INTERACTION_ELEMENTS.has(packageName);
|
|
276
|
+
}
|
|
264
277
|
/**
|
|
265
278
|
* Helper to check if context contains choice-based interactions
|
|
266
279
|
*/
|
|
267
280
|
export function hasChoiceInteraction(context) {
|
|
268
|
-
const interactionTypes = [
|
|
269
|
-
"pie-multiple-choice",
|
|
270
|
-
"pie-inline-choice",
|
|
271
|
-
"pie-select-text",
|
|
272
|
-
"pie-ebsr",
|
|
273
|
-
"multiple-choice",
|
|
274
|
-
"inline-choice",
|
|
275
|
-
"select-text",
|
|
276
|
-
"ebsr",
|
|
277
|
-
];
|
|
278
281
|
if (isElementContext(context)) {
|
|
279
282
|
const config = context.item.config;
|
|
280
283
|
if (!config?.models)
|
|
@@ -287,10 +290,11 @@ export function hasChoiceInteraction(context) {
|
|
|
287
290
|
if (!model)
|
|
288
291
|
return false;
|
|
289
292
|
const type = model.element || "";
|
|
290
|
-
return
|
|
293
|
+
return isChoiceElement(type, config.elements);
|
|
291
294
|
}
|
|
292
295
|
if (isItemContext(context)) {
|
|
293
|
-
const
|
|
296
|
+
const config = context.item.config;
|
|
297
|
+
const modelsRaw = config?.models;
|
|
294
298
|
const models = Array.isArray(modelsRaw)
|
|
295
299
|
? modelsRaw
|
|
296
300
|
: modelsRaw && typeof modelsRaw === "object"
|
|
@@ -307,7 +311,7 @@ export function hasChoiceInteraction(context) {
|
|
|
307
311
|
// a named model showed the answer eliminator on items where the tool does
|
|
308
312
|
// nothing. The heuristic remains for configs that name no element.
|
|
309
313
|
if (type)
|
|
310
|
-
return
|
|
314
|
+
return isChoiceElement(type, config?.elements);
|
|
311
315
|
return Array.isArray(m.choices) && m.choices.length > 0;
|
|
312
316
|
});
|
|
313
317
|
}
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
* Names are generic shapes ("book-open", "beaker"), never capability names. Core
|
|
10
10
|
* naming a capability is what the composition layer exists to prevent.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* gateway renders its own buttons and has to
|
|
14
|
-
* draws, or the learner sees two unrelated
|
|
12
|
+
* `resolveFallbackToolIcon` is exported through `tools/registration` as well: a
|
|
13
|
+
* registration composing a selection gateway renders its own buttons and has to
|
|
14
|
+
* draw the same icon the toolbar button draws, or the learner sees two unrelated
|
|
15
|
+
* affordances for one tool.
|
|
15
16
|
*/
|
|
16
17
|
export declare const TOOL_FALLBACK_ICONS: Readonly<Record<string, string>>;
|
|
17
18
|
/** Icon markup for `name`, or `null` when nothing built in matches. */
|
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
* Names are generic shapes ("book-open", "beaker"), never capability names. Core
|
|
10
10
|
* naming a capability is what the composition layer exists to prevent.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* gateway renders its own buttons and has to
|
|
14
|
-
* draws, or the learner sees two unrelated
|
|
12
|
+
* `resolveFallbackToolIcon` is exported through `tools/registration` as well: a
|
|
13
|
+
* registration composing a selection gateway renders its own buttons and has to
|
|
14
|
+
* draw the same icon the toolbar button draws, or the learner sees two unrelated
|
|
15
|
+
* affordances for one tool.
|
|
15
16
|
*/
|
|
16
17
|
export const TOOL_FALLBACK_ICONS = {
|
|
17
18
|
calculator: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2Zm0 2v4h10V4H7Zm0 6v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-8 4v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Zm-8 4v2h2v-2H7Zm4 0v2h2v-2h-2Zm4 0v2h2v-2h-2Z" fill="currentColor"/></svg>',
|
|
@@ -11,4 +11,3 @@ export declare function registerToolScopeLevel(scopeLevel: string): void;
|
|
|
11
11
|
export declare function isRegisteredToolScopeLevel(scopeLevel: string): scopeLevel is ToolScopeLevel;
|
|
12
12
|
export declare function createScopedToolId(baseToolId: string, scopeLevel: ToolScopeLevel, scopeId: string): string;
|
|
13
13
|
export declare function parseScopedToolId(id: string): ParsedToolInstanceId | null;
|
|
14
|
-
export declare function toOverlayToolId(id: string): string;
|
|
@@ -46,9 +46,3 @@ export function parseScopedToolId(id) {
|
|
|
46
46
|
scopeId,
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
|
-
export function toOverlayToolId(id) {
|
|
50
|
-
const parsed = parseScopedToolId(id);
|
|
51
|
-
if (!parsed)
|
|
52
|
-
return id;
|
|
53
|
-
return createScopedToolId(parsed.baseToolId, parsed.scopeLevel, parsed.scopeId);
|
|
54
|
-
}
|
|
@@ -1,126 +1,88 @@
|
|
|
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
|
*/
|
|
11
|
-
import type { ITTSProvider
|
|
13
|
+
import type { ITTSProvider } from "@pie-players/pie-tts";
|
|
14
|
+
import type { RuntimeTTSConfig, TTSRuntimeSettings } from "../tts-runtime-config.js";
|
|
12
15
|
import type { ToolProviderApi, ToolProviderCapabilities } from "./ToolProviderApi.js";
|
|
16
|
+
export type TTSBackend = NonNullable<TTSRuntimeSettings["backend"]>;
|
|
13
17
|
/**
|
|
14
|
-
*
|
|
18
|
+
* The runtime provider config plus the credentials and instrumentation this
|
|
19
|
+
* tool provider reads. The backend is fixed at construction.
|
|
15
20
|
*/
|
|
16
|
-
export type
|
|
17
|
-
/**
|
|
18
|
-
* TTS tool provider configuration
|
|
19
|
-
*/
|
|
20
|
-
export interface TTSToolProviderConfig extends Partial<TTSConfig> {
|
|
21
|
-
/**
|
|
22
|
-
* TTS backend to use
|
|
23
|
-
*/
|
|
24
|
-
backend: TTSBackend;
|
|
25
|
-
/**
|
|
26
|
-
* Server API endpoint (for server backends)
|
|
27
|
-
* @example '/api/tts/synthesize'
|
|
28
|
-
* @example 'https://api.example.com/tts/synthesize'
|
|
29
|
-
*/
|
|
30
|
-
apiEndpoint?: string;
|
|
31
|
-
/**
|
|
32
|
-
* Provider to use on server ('polly', 'google')
|
|
33
|
-
* Only used when backend is 'server', 'polly', or 'google'
|
|
34
|
-
*/
|
|
35
|
-
serverProvider?: "polly" | "google" | "custom";
|
|
36
|
-
/**
|
|
37
|
-
* Explicit transport mode for server provider payload translation.
|
|
38
|
-
*/
|
|
39
|
-
transportMode?: "pie" | "custom";
|
|
40
|
-
/**
|
|
41
|
-
* Endpoint style used by the server-backed provider.
|
|
42
|
-
*/
|
|
43
|
-
endpointMode?: "synthesizePath" | "rootPost";
|
|
44
|
-
/**
|
|
45
|
-
* Endpoint validation strategy when validateEndpoint=true.
|
|
46
|
-
*/
|
|
47
|
-
endpointValidationMode?: "voices" | "endpoint" | "none";
|
|
48
|
-
/**
|
|
49
|
-
* Include auth header when fetching remote audio/speech-mark assets.
|
|
50
|
-
*/
|
|
51
|
-
includeAuthOnAssetFetch?: boolean;
|
|
21
|
+
export type TTSToolProviderConfig = RuntimeTTSConfig & {
|
|
52
22
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
23
|
+
* Bearer token for a server backend, sent as `Authorization`. A host supplies
|
|
24
|
+
* it through `provider.runtime.authFetcher`.
|
|
55
25
|
*/
|
|
56
26
|
authToken?: string;
|
|
57
|
-
/**
|
|
58
|
-
* Organization ID for multi-tenant applications
|
|
59
|
-
*/
|
|
60
|
-
organizationId?: string;
|
|
61
|
-
/**
|
|
62
|
-
* Default voice to use
|
|
63
|
-
*/
|
|
64
|
-
voice?: string;
|
|
65
|
-
/**
|
|
66
|
-
* Speech rate (0.25 to 4.0, default 1.0)
|
|
67
|
-
*/
|
|
68
|
-
rate?: number;
|
|
69
|
-
/**
|
|
70
|
-
* Speech pitch (0 to 2, default 1.0)
|
|
71
|
-
* Note: Only browser backend supports pitch
|
|
72
|
-
*/
|
|
73
|
-
pitch?: number;
|
|
74
|
-
/**
|
|
75
|
-
* Optional telemetry callback for tool/backend instrumentation.
|
|
76
|
-
*/
|
|
77
27
|
onTelemetry?: (eventName: string, payload?: Record<string, unknown>) => void | Promise<void>;
|
|
78
|
-
}
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Construction options. `loadServerProvider` resolves the server adapter's
|
|
31
|
+
* provider class; a server backend fails to initialize without it. The toolkit
|
|
32
|
+
* leaves the adapter to its caller so that a bundler building the toolkit never
|
|
33
|
+
* has to resolve `@pie-players/tts-client-server`.
|
|
34
|
+
*/
|
|
35
|
+
export type TTSToolProviderOptions = {
|
|
36
|
+
loadServerProvider?: () => Promise<new () => ITTSProvider>;
|
|
37
|
+
};
|
|
79
38
|
/**
|
|
80
39
|
* TTS Tool Provider
|
|
81
40
|
*
|
|
82
|
-
* Wraps
|
|
41
|
+
* Wraps the browser or a server TTS provider with the ToolProviderApi interface
|
|
83
42
|
* for use in the ToolProviderRegistry.
|
|
84
43
|
*
|
|
85
44
|
* @example Browser TTS (no auth)
|
|
86
45
|
* ```typescript
|
|
87
46
|
* const provider = new TTSToolProvider();
|
|
88
|
-
* await provider.initialize({
|
|
47
|
+
* await provider.initialize({});
|
|
89
48
|
* const ttsProvider = await provider.createInstance();
|
|
90
49
|
* ```
|
|
91
50
|
*
|
|
92
|
-
* @example Server TTS
|
|
51
|
+
* @example Server TTS
|
|
93
52
|
* ```typescript
|
|
94
|
-
* const provider = new TTSToolProvider(
|
|
53
|
+
* const provider = new TTSToolProvider('server', {
|
|
54
|
+
* loadServerProvider: async () => ServerTTSProvider,
|
|
55
|
+
* });
|
|
95
56
|
* await provider.initialize({
|
|
96
|
-
*
|
|
97
|
-
* apiEndpoint: '/api/tts
|
|
98
|
-
* authToken: 'bearer-token', // Fetched via authFetcher
|
|
57
|
+
* provider: 'polly',
|
|
58
|
+
* apiEndpoint: '/api/tts',
|
|
99
59
|
* });
|
|
100
60
|
* const ttsProvider = await provider.createInstance();
|
|
101
61
|
* ```
|
|
102
62
|
*/
|
|
103
|
-
export declare class TTSToolProvider implements ToolProviderApi<
|
|
104
|
-
readonly providerId = "tts-service";
|
|
63
|
+
export declare class TTSToolProvider implements ToolProviderApi<ITTSProvider> {
|
|
105
64
|
readonly providerName = "Text-to-Speech";
|
|
106
65
|
readonly category: "tts";
|
|
107
66
|
readonly version = "1.0";
|
|
108
67
|
readonly requiresAuth: boolean;
|
|
68
|
+
private readonly backend;
|
|
109
69
|
private ttsProvider;
|
|
110
70
|
private config;
|
|
71
|
+
private readonly loadServerProvider;
|
|
111
72
|
private emitTelemetry;
|
|
112
73
|
/**
|
|
113
74
|
* Create TTS tool provider
|
|
114
75
|
*
|
|
115
76
|
* @param backend TTS backend to use (default: 'browser')
|
|
77
|
+
* @param options Loader for the server adapter, required by server backends
|
|
116
78
|
*/
|
|
117
|
-
constructor(backend?: TTSBackend);
|
|
79
|
+
constructor(backend?: TTSBackend, options?: TTSToolProviderOptions);
|
|
118
80
|
/**
|
|
119
81
|
* Initialize TTS provider
|
|
120
82
|
*
|
|
121
83
|
* Sets up the appropriate TTS backend.
|
|
122
84
|
*
|
|
123
|
-
* @param config
|
|
85
|
+
* @param config Runtime configuration and credentials
|
|
124
86
|
* @throws Error if initialization fails or required config missing
|
|
125
87
|
*/
|
|
126
88
|
initialize(config: TTSToolProviderConfig): Promise<void>;
|
|
@@ -129,7 +91,7 @@ export declare class TTSToolProvider implements ToolProviderApi<TTSToolProviderC
|
|
|
129
91
|
*/
|
|
130
92
|
private _initializeBrowserTTS;
|
|
131
93
|
/**
|
|
132
|
-
* Initialize server-based TTS
|
|
94
|
+
* Initialize server-based TTS
|
|
133
95
|
*/
|
|
134
96
|
private _initializeServerTTS;
|
|
135
97
|
/**
|
|
@@ -143,9 +105,8 @@ export declare class TTSToolProvider implements ToolProviderApi<TTSToolProviderC
|
|
|
143
105
|
*/
|
|
144
106
|
createInstance(config?: Partial<TTSToolProviderConfig>): Promise<ITTSProvider>;
|
|
145
107
|
/**
|
|
146
|
-
*
|
|
147
|
-
*
|
|
148
|
-
* @returns TTS capabilities based on backend
|
|
108
|
+
* The backend's capabilities. Its features are the speech provider's own,
|
|
109
|
+
* and all false before {@link initialize} creates it.
|
|
149
110
|
*/
|
|
150
111
|
getCapabilities(): ToolProviderCapabilities;
|
|
151
112
|
/**
|