@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,46 +1,81 @@
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
  */
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 TTS providers (Browser, Polly, Google) with the ToolProviderApi interface
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({ backend: 'browser' });
54
+ * await provider.initialize({});
22
55
  * const ttsProvider = await provider.createInstance();
23
56
  * ```
24
57
  *
25
- * @example Server TTS (with auth)
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
- * backend: 'polly',
30
- * apiEndpoint: '/api/tts/synthesize',
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 Configuration with backend type and credentials
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 (config.backend) {
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: ${config.backend}`);
120
+ throw new Error(`[TTSToolProvider] Unknown backend: ${this.backend}`);
85
121
  }
86
- console.log(`[TTSToolProvider] Initialized successfully (backend: ${config.backend})`);
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
- console.log("[TTSToolProvider] Browser TTS initialized (Web Speech API)");
133
+ logger.debug("browser TTS initialized (Web Speech API)");
98
134
  }
99
135
  /**
100
- * Initialize server-based TTS (Polly, Google)
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
- // Server backends are optional; load implementation only when requested.
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: config.serverProvider || config.backend,
151
+ backend: serverProvider,
112
152
  });
113
- const serverModule = await (async () => {
153
+ const ServerProvider = await (async () => {
114
154
  try {
115
- const loaded = (await import("@pie-players/tts-client-server"));
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: config.serverProvider || config.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: config.serverProvider || config.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
- this.ttsProvider = new serverModule.ServerTTSProvider();
137
- console.log(`[TTSToolProvider] Server TTS initialized (provider: ${config.serverProvider || config.backend})`);
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
- * Get provider capabilities
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.config?.backend === "browser";
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: true, // All backends support word highlighting
167
- pause: true,
168
- resume: true,
169
- rateControl: true,
170
- pitchControl: isBrowser, // Only browser supports pitch
171
- voiceSelection: true,
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
- console.log("[TTSToolProvider] Destroyed");
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
- export interface ToolProviderApi<TConfig = any, TInstance = any> {
15
- readonly providerId: string;
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: TConfig): Promise<void>;
21
- createInstance(config?: Partial<TConfig>): Promise<TInstance>;
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
- * Configuration for registering a tool provider
11
+ * What `register` takes: the provider, its config, and how it starts.
12
12
  */
13
- export interface ToolProviderConfig<TConfig = any> {
13
+ export interface ToolProviderRegistration<TConfig = any> {
14
14
  /**
15
15
  * Provider instance to register
16
16
  */
17
- provider: ToolProviderApi<TConfig>;
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 ID or category
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('desmos-calculator', {
65
- * provider: new DesmosToolProvider(),
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/desmos/token');
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 desmosProvider = await registry.getProvider('desmos-calculator');
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 providerId Unique provider identifier
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(providerId: string, config: ToolProviderConfig): void;
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 providerId Provider to initialize
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(providerId: string): Promise<void>;
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 providerId Provider identifier
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>(providerId: string, autoInitialize?: boolean): Promise<T>;
127
+ getProvider<T extends ToolProviderApi = ToolProviderApi>(toolId: string, autoInitialize?: boolean): Promise<T>;
121
128
  /**
122
- * Get all providers in a category
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
- * Get all registered provider IDs
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 providerId Provider identifier
141
+ * @param toolId Id of the tool the provider serves
138
142
  * @returns true if provider is registered
139
143
  */
140
- has(providerId: string): boolean;
144
+ has(toolId: string): boolean;
141
145
  /**
142
146
  * Check if provider is initialized
143
147
  *
144
- * @param providerId Provider identifier
148
+ * @param toolId Id of the tool the provider serves
145
149
  * @returns true if provider is initialized
146
150
  */
147
- isInitialized(providerId: string): boolean;
151
+ isInitialized(toolId: string): boolean;
148
152
  /**
149
153
  * Check if provider is currently initializing
150
154
  *
151
- * @param providerId Provider identifier
155
+ * @param toolId Id of the tool the provider serves
152
156
  * @returns true if initialization in progress
153
157
  */
154
- isInitializing(providerId: string): boolean;
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 providerId Provider to unregister
164
+ * @param toolId Tool whose provider to unregister
161
165
  */
162
- unregister(providerId: string): Promise<void>;
166
+ unregister(toolId: string): Promise<void>;
163
167
  /**
164
168
  * Clean up all providers
165
169
  *