@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.
Files changed (274) hide show
  1. package/README.md +469 -318
  2. package/dist/attempt/AssessmentSession.d.ts +1 -5
  3. package/dist/attempt/AssessmentSession.js +0 -29
  4. package/dist/attempt/TestSession.d.ts +1 -20
  5. package/dist/attempt/TestSession.js +8 -99
  6. package/dist/components/ItemScope.custom-element.d.ts +1 -0
  7. package/dist/components/ItemScope.custom-element.js +1 -0
  8. package/dist/components/ItemToolBar.custom-element.d.ts +1 -0
  9. package/dist/components/ItemToolBar.custom-element.js +1 -1
  10. package/dist/components/PieAssessmentToolkit.custom-element.d.ts +1 -0
  11. package/dist/components/PieAssessmentToolkit.custom-element.js +13 -13
  12. package/dist/components/SectionToolBar.custom-element.d.ts +1 -0
  13. package/dist/components/SectionToolBar.custom-element.js +1 -1
  14. package/dist/components/chunks/ItemToolBar-7tt7v2xp.js +4 -0
  15. package/dist/components/chunks/ItemToolBar-97hx60z4.js +2 -0
  16. package/dist/components/chunks/ItemToolBar-bxwyhr5p.js +2 -0
  17. package/dist/components/chunks/ItemToolBar-jx38w99s.js +2 -0
  18. package/dist/components/chunks/ItemToolBar-rd2bb4p6.js +40 -0
  19. package/dist/components/chunks/ItemToolBar-vdkyn9f3.js +2 -0
  20. package/dist/components/chunks/sre-engine-jd8cc08x.js +1 -0
  21. package/dist/components/item-scope-element.d.ts +2 -0
  22. package/dist/components/item-scope-element.js +2 -0
  23. package/dist/context/assessment-toolkit-context.d.ts +32 -6
  24. package/dist/index.d.ts +23 -48
  25. package/dist/index.js +12 -37
  26. package/dist/policy/core/PolicySource.d.ts +1 -1
  27. package/dist/policy/core/ToolPolicyEngine.d.ts +85 -34
  28. package/dist/policy/core/ToolPolicyEngine.js +148 -46
  29. package/dist/policy/core/compose-decision.d.ts +28 -7
  30. package/dist/policy/core/compose-decision.js +75 -54
  31. package/dist/policy/core/decision-types.d.ts +65 -34
  32. package/dist/policy/core/feature-decision.d.ts +16 -9
  33. package/dist/policy/core/feature-decision.js +14 -8
  34. package/dist/policy/core/pnp-policy-inputs.d.ts +24 -33
  35. package/dist/policy/core/pnp-policy-inputs.js +28 -56
  36. package/dist/policy/core/provenance.d.ts +9 -4
  37. package/dist/policy/core/provenance.js +1 -1
  38. package/dist/policy/engine.d.ts +7 -23
  39. package/dist/policy/engine.js +5 -20
  40. package/dist/policy/sources/PnpPolicySource.d.ts +44 -61
  41. package/dist/policy/sources/PnpPolicySource.js +117 -118
  42. package/dist/runtime/SectionControllerBinding.d.ts +279 -0
  43. package/dist/runtime/SectionControllerBinding.js +450 -0
  44. package/dist/runtime/SectionRuntimeEngine.d.ts +26 -289
  45. package/dist/runtime/SectionRuntimeEngine.js +30 -372
  46. package/dist/runtime/adapter/SectionEngineAdapter.d.ts +19 -80
  47. package/dist/runtime/adapter/SectionEngineAdapter.js +19 -92
  48. package/dist/runtime/adapter/dom-event-bridge.d.ts +15 -30
  49. package/dist/runtime/adapter/dom-event-bridge.js +17 -44
  50. package/dist/runtime/adapter/subscriber-fanout.d.ts +1 -2
  51. package/dist/runtime/adapter/subscriber-fanout.js +1 -2
  52. package/dist/runtime/catalog-context.d.ts +19 -0
  53. package/dist/runtime/catalog-context.js +28 -0
  54. package/dist/runtime/composition-emit-scheduler.d.ts +9 -15
  55. package/dist/runtime/composition-emit-scheduler.js +9 -15
  56. package/dist/runtime/content-language.d.ts +32 -0
  57. package/dist/runtime/content-language.js +46 -0
  58. package/dist/runtime/content-region.d.ts +17 -0
  59. package/dist/runtime/content-region.js +29 -0
  60. package/dist/runtime/content-registration.d.ts +13 -0
  61. package/dist/runtime/content-registration.js +25 -0
  62. package/dist/runtime/core/SectionEngineCore.d.ts +2 -2
  63. package/dist/runtime/core/SectionEngineCore.js +2 -2
  64. package/dist/runtime/core/cohort.d.ts +1 -1
  65. package/dist/runtime/core/cohort.js +1 -1
  66. package/dist/runtime/core/engine-input.d.ts +18 -30
  67. package/dist/runtime/core/engine-input.js +11 -12
  68. package/dist/runtime/core/engine-output.d.ts +16 -40
  69. package/dist/runtime/core/engine-output.js +9 -21
  70. package/dist/runtime/core/engine-readiness.d.ts +5 -37
  71. package/dist/runtime/core/engine-readiness.js +8 -41
  72. package/dist/runtime/core/engine-resolver.d.ts +46 -74
  73. package/dist/runtime/core/engine-resolver.js +18 -43
  74. package/dist/runtime/core/engine-state.d.ts +28 -36
  75. package/dist/runtime/core/engine-state.js +18 -21
  76. package/dist/runtime/core/engine-transition.d.ts +14 -19
  77. package/dist/runtime/core/engine-transition.js +71 -51
  78. package/dist/runtime/engine.d.ts +16 -19
  79. package/dist/runtime/engine.js +12 -19
  80. package/dist/runtime/page-warnings.d.ts +13 -0
  81. package/dist/runtime/page-warnings.js +22 -0
  82. package/dist/runtime/policy-input-forwarding.d.ts +25 -0
  83. package/dist/runtime/policy-input-forwarding.js +25 -0
  84. package/dist/runtime/registration-events.d.ts +14 -0
  85. package/dist/runtime/runtime-event-claim.d.ts +8 -0
  86. package/dist/runtime/runtime-event-claim.js +15 -0
  87. package/dist/runtime/shell-event-bridge.d.ts +45 -0
  88. package/dist/runtime/shell-event-bridge.js +127 -0
  89. package/dist/runtime/shell-registration.d.ts +73 -0
  90. package/dist/runtime/shell-registration.js +95 -0
  91. package/dist/runtime/shell-scope.d.ts +68 -0
  92. package/dist/runtime/shell-scope.js +188 -0
  93. package/dist/runtime/tool-host-contract.d.ts +28 -10
  94. package/dist/runtime/tool-host-contract.js +31 -10
  95. package/dist/runtime/unclaimed-registration-watch.d.ts +7 -0
  96. package/dist/runtime/unclaimed-registration-watch.js +23 -0
  97. package/dist/services/ElementToolStateStore.d.ts +14 -10
  98. package/dist/services/ElementToolStateStore.js +37 -13
  99. package/dist/services/HighlightCoordinator.d.ts +22 -28
  100. package/dist/services/HighlightCoordinator.js +431 -327
  101. package/dist/services/RangeSerializer.d.ts +10 -1
  102. package/dist/services/RangeSerializer.js +87 -14
  103. package/dist/services/TTSService.d.ts +130 -69
  104. package/dist/services/TTSService.js +713 -570
  105. package/dist/services/ToolCoordinator.d.ts +43 -66
  106. package/dist/services/ToolCoordinator.js +164 -208
  107. package/dist/services/ToolRegistry.d.ts +78 -54
  108. package/dist/services/ToolRegistry.js +107 -105
  109. package/dist/services/ToolkitCoordinator.d.ts +261 -175
  110. package/dist/services/ToolkitCoordinator.js +667 -433
  111. package/dist/services/audio-handoff.d.ts +6 -7
  112. package/dist/services/audio-handoff.js +20 -14
  113. package/dist/services/catalog-owner.d.ts +11 -1
  114. package/dist/services/catalog-owner.js +25 -0
  115. package/dist/services/create-tools-config.d.ts +2 -2
  116. package/dist/services/framework-error-bus.d.ts +3 -6
  117. package/dist/services/framework-error-bus.js +3 -6
  118. package/dist/services/framework-error.d.ts +30 -8
  119. package/dist/services/framework-error.js +9 -7
  120. package/dist/services/interfaces.d.ts +158 -129
  121. package/dist/services/section-controller-types.d.ts +15 -0
  122. package/dist/services/section-session-assignment.d.ts +21 -0
  123. package/dist/services/section-session-assignment.js +82 -0
  124. package/dist/services/spoken-audio-cards.d.ts +0 -2
  125. package/dist/services/spoken-audio-cards.js +1 -3
  126. package/dist/services/tool-config-defaults.d.ts +3 -3
  127. package/dist/services/tool-config-defaults.js +3 -3
  128. package/dist/services/tool-config-validation.d.ts +14 -4
  129. package/dist/services/tool-config-validation.js +63 -71
  130. package/dist/services/tool-context.d.ts +0 -8
  131. package/dist/services/tool-context.js +29 -25
  132. package/dist/services/tool-icons.d.ts +4 -3
  133. package/dist/services/tool-icons.js +4 -3
  134. package/dist/services/tool-instance-id.d.ts +0 -1
  135. package/dist/services/tool-instance-id.js +0 -6
  136. package/dist/services/tool-providers/TTSToolProvider.d.ts +41 -80
  137. package/dist/services/tool-providers/TTSToolProvider.js +81 -40
  138. package/dist/services/tool-providers/ToolProviderApi.d.ts +10 -4
  139. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +32 -28
  140. package/dist/services/tool-providers/ToolProviderRegistry.js +121 -107
  141. package/dist/services/tool-providers/index.d.ts +0 -9
  142. package/dist/services/tool-providers/index.js +2 -4
  143. package/dist/services/tool-request.d.ts +27 -12
  144. package/dist/services/tool-request.js +24 -14
  145. package/dist/services/toolbar-decided-tools.d.ts +15 -0
  146. package/dist/services/toolbar-decided-tools.js +28 -0
  147. package/dist/services/tools-config-normalizer.d.ts +37 -23
  148. package/dist/services/tools-config-normalizer.js +2 -10
  149. package/dist/services/tts/browser-provider.d.ts +38 -2
  150. package/dist/services/tts/browser-provider.js +276 -140
  151. package/dist/services/tts/catalog-span-alignment.d.ts +2 -17
  152. package/dist/services/tts/catalog-span-alignment.js +17 -142
  153. package/dist/services/tts/flat-tree.d.ts +71 -0
  154. package/dist/services/tts/flat-tree.js +269 -0
  155. package/dist/services/tts/generated-speech/assemble-plan.d.ts +3 -1
  156. package/dist/services/tts/generated-speech/assemble-plan.js +3 -1
  157. package/dist/services/tts/generated-speech/dom/build-dom-plan.d.ts +2 -0
  158. package/dist/services/tts/generated-speech/dom/build-dom-plan.js +1 -1
  159. package/dist/services/tts/generated-speech/math-speech-cache.d.ts +3 -1
  160. package/dist/services/tts/generated-speech/math-speech-cache.js +5 -1
  161. package/dist/services/tts/generated-speech/types.d.ts +0 -12
  162. package/dist/services/tts/highlight-pipeline/boundary-normalizer.js +12 -62
  163. package/dist/services/tts/highlight-pipeline/create-highlight-plan.js +38 -5
  164. package/dist/services/tts/highlight-pipeline/normalize-speech-chunks.js +3 -6
  165. package/dist/services/tts/highlight-pipeline/prose-boundary-resolver.js +6 -4
  166. package/dist/services/tts/highlight-pipeline/readable-region.js +3 -2
  167. package/dist/services/tts/highlight-pipeline/types.d.ts +5 -0
  168. package/dist/services/tts/highlight-pipeline/visible-map-range.d.ts +12 -0
  169. package/dist/services/tts/highlight-pipeline/visible-map-range.js +73 -7
  170. package/dist/services/tts/math-alignment/index.d.ts +0 -5
  171. package/dist/services/tts/math-alignment/index.js +5 -25
  172. package/dist/services/tts/math-alignment/speech-tokenizer.d.ts +9 -1
  173. package/dist/services/tts/math-alignment/speech-tokenizer.js +38 -36
  174. package/dist/services/tts/math-alignment/types.d.ts +4 -2
  175. package/dist/services/tts/math-aware-text-processing.d.ts +5 -1
  176. package/dist/services/tts/math-aware-text-processing.js +74 -18
  177. package/dist/services/tts/math-control-names.d.ts +21 -0
  178. package/dist/services/tts/math-control-names.js +142 -0
  179. package/dist/services/tts/math-speech.d.ts +16 -1
  180. package/dist/services/tts/math-speech.js +55 -19
  181. package/dist/services/tts/provider-options.d.ts +41 -0
  182. package/dist/services/tts/provider-options.js +1 -0
  183. package/dist/services/tts/sre-engine.d.ts +7 -0
  184. package/dist/services/tts/sre-engine.js +11 -0
  185. package/dist/services/tts/sre-locales.d.ts +14 -0
  186. package/dist/services/tts/sre-locales.js +57 -0
  187. package/dist/services/tts/ssml/spoken-text.d.ts +2 -26
  188. package/dist/services/tts/ssml/spoken-text.js +29 -0
  189. package/dist/services/tts/start-failure.d.ts +11 -0
  190. package/dist/services/tts/start-failure.js +19 -0
  191. package/dist/services/tts/text-processing.d.ts +9 -1
  192. package/dist/services/tts/text-processing.js +46 -34
  193. package/dist/services/tts/text-segmentation.d.ts +7 -0
  194. package/dist/services/tts/text-segmentation.js +47 -0
  195. package/dist/services/tts-runtime-config.d.ts +44 -18
  196. package/dist/services/tts-runtime-config.js +22 -93
  197. package/dist/tools/content-capability-resolution.d.ts +7 -9
  198. package/dist/tools/content-capability-resolution.js +8 -45
  199. package/dist/tools/registration.d.ts +58 -0
  200. package/dist/tools/registration.js +54 -0
  201. package/dist/tools/registrations/toolbar-registration-helpers.js +2 -2
  202. package/dist/tools/tool-surface-host.d.ts +6 -10
  203. package/dist/tools/tool-surface-host.js +44 -42
  204. package/dist/tools/tool-tag-map.d.ts +5 -15
  205. package/dist/tools/tool-tag-map.js +6 -20
  206. package/dist/utils/structural-equality.d.ts +11 -0
  207. package/dist/utils/structural-equality.js +47 -0
  208. package/package.json +24 -59
  209. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts +0 -49
  210. package/dist/attempt/adapters/activity-to-test-attempt-session.js +0 -138
  211. package/dist/components/chunks/ItemToolBar-byq80z42.js +0 -40
  212. package/dist/components/chunks/ItemToolBar-d36g3aw4.js +0 -49
  213. package/dist/context/runtime-context-consumer.d.ts +0 -13
  214. package/dist/context/runtime-context-consumer.js +0 -51
  215. package/dist/item-loader.d.ts +0 -44
  216. package/dist/item-loader.js +0 -61
  217. package/dist/policy/core/engine-context.d.ts +0 -29
  218. package/dist/policy/core/engine-context.js +0 -27
  219. package/dist/policy/core/policy-source-tag.d.ts +0 -31
  220. package/dist/policy/core/policy-source-tag.js +0 -28
  221. package/dist/policy/internal.d.ts +0 -25
  222. package/dist/policy/internal.js +0 -25
  223. package/dist/runtime/adapter/coordinator-bridge.d.ts +0 -92
  224. package/dist/runtime/adapter/coordinator-bridge.js +0 -126
  225. package/dist/runtime/adapter/framework-error-bridge.d.ts +0 -36
  226. package/dist/runtime/adapter/framework-error-bridge.js +0 -46
  227. package/dist/runtime/adapter/instrumentation-bridge.d.ts +0 -31
  228. package/dist/runtime/adapter/instrumentation-bridge.js +0 -38
  229. package/dist/runtime/core/engine-stage-derivation.d.ts +0 -18
  230. package/dist/runtime/core/engine-stage-derivation.js +0 -29
  231. package/dist/runtime/engine-context.d.ts +0 -39
  232. package/dist/runtime/engine-context.js +0 -31
  233. package/dist/runtime/internal.d.ts +0 -43
  234. package/dist/runtime/internal.js +0 -45
  235. package/dist/runtime/section-runtime-engine-host-context.d.ts +0 -80
  236. package/dist/runtime/section-runtime-engine-host-context.js +0 -95
  237. package/dist/runtime/stage-emit-gate.d.ts +0 -92
  238. package/dist/runtime/stage-emit-gate.js +0 -82
  239. package/dist/services/I18nService.d.ts +0 -47
  240. package/dist/services/I18nService.js +0 -84
  241. package/dist/services/ThemeProvider.d.ts +0 -95
  242. package/dist/services/ThemeProvider.js +0 -334
  243. package/dist/services/ToolConfigResolver.d.ts +0 -161
  244. package/dist/services/ToolConfigResolver.js +0 -229
  245. package/dist/services/catalog-media.d.ts +0 -56
  246. package/dist/services/catalog-media.js +0 -190
  247. package/dist/services/createDefaultToolRegistry.d.ts +0 -53
  248. package/dist/services/createDefaultToolRegistry.js +0 -45
  249. package/dist/services/defaultPersonalNeedsProfile.d.ts +0 -21
  250. package/dist/services/defaultPersonalNeedsProfile.js +0 -26
  251. package/dist/services/pnp-standard-features.d.ts +0 -238
  252. package/dist/services/pnp-standard-features.js +0 -338
  253. package/dist/services/tool-providers/CortexToolProvider.d.ts +0 -13
  254. package/dist/services/tool-providers/CortexToolProvider.js +0 -32
  255. package/dist/services/tool-providers/DesmosToolProvider.d.ts +0 -14
  256. package/dist/services/tool-providers/DesmosToolProvider.js +0 -32
  257. package/dist/services/tool-providers/GeoGebraToolProvider.d.ts +0 -16
  258. package/dist/services/tool-providers/GeoGebraToolProvider.js +0 -32
  259. package/dist/services/tool-providers/LazyCalculatorToolProvider.d.ts +0 -35
  260. package/dist/services/tool-providers/LazyCalculatorToolProvider.js +0 -95
  261. package/dist/services/tts/visual-line-ranges.d.ts +0 -18
  262. package/dist/services/tts/visual-line-ranges.js +0 -226
  263. package/dist/tools/client.d.ts +0 -12
  264. package/dist/tools/client.js +0 -14
  265. package/dist/tools/index.d.ts +0 -8
  266. package/dist/tools/index.js +0 -10
  267. package/dist/tools/internal.d.ts +0 -43
  268. package/dist/tools/internal.js +0 -41
  269. package/dist/tools/response-discovery.d.ts +0 -61
  270. package/dist/tools/response-discovery.js +0 -113
  271. package/dist/tools/types.d.ts +0 -337
  272. package/dist/tools/types.js +0 -12
  273. package/dist/tools/variant-resolver.d.ts +0 -41
  274. 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. `PACKAGED_TOOL_PLACEMENT` and
5
- * `SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT` name capabilities, so they moved to
6
- * the composition layer (`@pie-players/pie-default-tool-loaders`).
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. `PACKAGED_TOOL_PLACEMENT` and
5
- * `SECTION_PLAYER_PREFERRED_TOOL_PLACEMENT` name capabilities, so they moved to
6
- * the composition layer (`@pie-players/pie-default-tool-loaders`).
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.removedProviderKey" | "tools.providerSanitizeFailed" | "tools.providerValidateFailed" | "tools.invalidProviderValidation";
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?: Partial<CanonicalToolsConfig> | null, options?: ToolConfigValidationOptions): ToolConfigValidationResult;
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 sanitizeProviderConfig(providerId, providerConfig, tool, diagnostics) {
38
- if (!providerConfig || !tool?.provider?.sanitizeConfig)
37
+ function sanitizeToolConfig(toolId, providerConfig, tool, diagnostics) {
38
+ if (!providerConfig || !tool?.sanitizeConfig)
39
39
  return providerConfig;
40
40
  try {
41
- const sanitized = tool.provider.sanitizeConfig(providerConfig);
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.${providerId}`,
49
- message: `Provider sanitizer for "${providerId}" must return an object.`,
50
- providerId,
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.${providerId}`,
62
- message: `Provider sanitizer failed for "${providerId}": ${error instanceof Error ? error.message : String(error)}`,
63
- providerId,
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 validateProviderConfig(providerId, providerConfig, tool, diagnostics) {
70
- if (!providerConfig || !tool?.provider?.validateConfig)
67
+ function validateToolConfig(toolId, providerConfig, tool, diagnostics) {
68
+ if (!providerConfig || !tool?.validateConfig)
71
69
  return;
72
70
  try {
73
- const providerDiagnostics = tool.provider.validateConfig(providerConfig);
74
- if (!Array.isArray(providerDiagnostics)) {
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.${providerId}`,
79
- message: `Provider validator for "${providerId}" must return an array.`,
80
- providerId,
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 providerDiagnostics) {
82
+ for (const diagnostic of toolDiagnostics) {
86
83
  diagnostics.push({
87
84
  ...diagnostic,
88
- path: diagnostic.path || `providers.${providerId}`,
89
- providerId: diagnostic.providerId || providerId,
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.${providerId}`,
99
- message: `Provider validator failed for "${providerId}": ${error instanceof Error ? error.message : String(error)}`,
100
- providerId,
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, hasRemovedTtsKey, diagnostics) {
180
- if (hasRemovedTtsKey) {
181
- diagnostics.push(createDiagnostic({
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.${providerId}`,
197
- message: `Unknown provider key "${providerId}".`,
198
- providerId,
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 strictness = normalizeToolConfigStrictness(options.strictness);
219
- const source = options.source ?? "tools";
220
- const registryTools = getRegistryToolMap(options.toolRegistry);
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 from "your ids are
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 providerId of Object.keys(nextProviders).sort()) {
246
- if (providerId === "tts") {
247
- delete nextProviders.tts;
248
- continue;
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, hasRemovedTtsKey, diagnostics);
261
- if (hasRemovedTtsKey) {
262
- throwValidationError(diagnostics.filter((entry) => entry.code === "tools.removedProviderKey"), source);
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 this
268
- // function raised was `"error"` until `tools.registryUnavailable`, which
269
- // reports that validation could not run rather than that the config is wrong —
270
- // throwing on it would turn "no registry supplied" from a host's existing,
271
- // working setup into a construction failure.
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 interactionTypes.includes(type);
293
+ return isChoiceElement(type, config.elements);
291
294
  }
292
295
  if (isItemContext(context)) {
293
- const modelsRaw = context.item.config?.models;
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 interactionTypes.includes(type);
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
- * Exported through `tools/internal` as well: a registration composing a selection
13
- * gateway renders its own buttons and has to draw the same icon the toolbar button
14
- * draws, or the learner sees two unrelated affordances for one tool.
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
- * Exported through `tools/internal` as well: a registration composing a selection
13
- * gateway renders its own buttons and has to draw the same icon the toolbar button
14
- * draws, or the learner sees two unrelated affordances for one tool.
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 all TTS backends:
5
- * - Browser Web Speech API (no auth)
6
- * - AWS Polly (requires auth via server proxy)
7
- * - Google Cloud TTS (requires auth via server proxy)
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, TTSConfig } from "@pie-players/pie-tts";
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
- * TTS backend type
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 TTSBackend = "browser" | "polly" | "google" | "server";
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
- * Auth token (if required)
54
- * Typically fetched via authFetcher in ToolProviderRegistry
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 TTS providers (Browser, Polly, Google) with the ToolProviderApi interface
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({ backend: 'browser' });
47
+ * await provider.initialize({});
89
48
  * const ttsProvider = await provider.createInstance();
90
49
  * ```
91
50
  *
92
- * @example Server TTS (with auth)
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
- * backend: 'polly',
97
- * apiEndpoint: '/api/tts/synthesize',
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<TTSToolProviderConfig, ITTSProvider> {
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 Configuration with backend type and credentials
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 (Polly, Google)
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
- * Get provider capabilities
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
  /**