@pie-players/pie-assessment-toolkit 0.3.74 → 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/README.md +658 -714
  2. package/custom-elements.json +1315 -0
  3. package/dist/attempt/TestSession.d.ts +1 -21
  4. package/dist/attempt/TestSession.js +16 -102
  5. package/dist/components/ItemScope.custom-element.d.ts +1 -0
  6. package/dist/components/ItemScope.custom-element.js +1 -0
  7. package/dist/components/ItemToolBar.custom-element.js +1 -1
  8. package/dist/components/PieAssessmentToolkit.custom-element.js +14 -14
  9. package/dist/components/SectionToolBar.custom-element.js +1 -1
  10. package/dist/components/chunks/ItemToolBar-3zrc4p3d.js +4 -0
  11. package/dist/components/chunks/ItemToolBar-66hcwmfw.js +2 -0
  12. package/dist/components/chunks/ItemToolBar-9gqhfxtn.js +40 -0
  13. package/dist/components/chunks/ItemToolBar-hzc5wyjp.js +2 -0
  14. package/dist/components/chunks/{ItemToolBar-gmrryv2v.js → ItemToolBar-kkj69ptr.js} +1 -1
  15. package/dist/components/chunks/ItemToolBar-vdkyn9f3.js +2 -0
  16. package/dist/components/chunks/sre-engine-bj997w4b.js +1 -0
  17. package/dist/components/item-scope-element.d.ts +2 -0
  18. package/dist/components/item-scope-element.js +2 -0
  19. package/dist/context/assessment-toolkit-context.d.ts +33 -6
  20. package/dist/index.d.ts +25 -50
  21. package/dist/index.js +15 -45
  22. package/dist/policy/core/PolicySource.d.ts +2 -2
  23. package/dist/policy/core/ToolPolicyEngine.d.ts +118 -34
  24. package/dist/policy/core/ToolPolicyEngine.js +203 -56
  25. package/dist/policy/core/compose-decision.d.ts +28 -7
  26. package/dist/policy/core/compose-decision.js +95 -74
  27. package/dist/policy/core/decision-types.d.ts +98 -55
  28. package/dist/policy/core/feature-decision.d.ts +28 -19
  29. package/dist/policy/core/feature-decision.js +15 -11
  30. package/dist/policy/core/pnp-policy-inputs.d.ts +29 -35
  31. package/dist/policy/core/pnp-policy-inputs.js +40 -88
  32. package/dist/policy/core/provenance.d.ts +10 -5
  33. package/dist/policy/core/provenance.js +1 -1
  34. package/dist/policy/core/tool-parameters.d.ts +11 -0
  35. package/dist/policy/core/tool-parameters.js +15 -0
  36. package/dist/policy/engine.d.ts +7 -23
  37. package/dist/policy/engine.js +5 -20
  38. package/dist/policy/sources/PnpPolicySource.d.ts +43 -68
  39. package/dist/policy/sources/PnpPolicySource.js +133 -132
  40. package/dist/runtime/SectionControllerBinding.d.ts +283 -0
  41. package/dist/runtime/SectionControllerBinding.js +456 -0
  42. package/dist/runtime/SectionRuntimeEngine.d.ts +26 -289
  43. package/dist/runtime/SectionRuntimeEngine.js +30 -372
  44. package/dist/runtime/adapter/SectionEngineAdapter.d.ts +19 -80
  45. package/dist/runtime/adapter/SectionEngineAdapter.js +19 -92
  46. package/dist/runtime/adapter/dom-event-bridge.d.ts +15 -30
  47. package/dist/runtime/adapter/dom-event-bridge.js +17 -44
  48. package/dist/runtime/adapter/subscriber-fanout.d.ts +1 -3
  49. package/dist/runtime/adapter/subscriber-fanout.js +2 -6
  50. package/dist/runtime/catalog-context.d.ts +19 -0
  51. package/dist/runtime/catalog-context.js +28 -0
  52. package/dist/runtime/composition-emit-scheduler.d.ts +12 -18
  53. package/dist/runtime/composition-emit-scheduler.js +10 -16
  54. package/dist/runtime/content-language.d.ts +32 -0
  55. package/dist/runtime/content-language.js +46 -0
  56. package/dist/runtime/content-region.d.ts +13 -0
  57. package/dist/runtime/content-region.js +29 -0
  58. package/dist/runtime/content-registration.d.ts +13 -0
  59. package/dist/runtime/content-registration.js +25 -0
  60. package/dist/runtime/core/SectionEngineCore.d.ts +2 -4
  61. package/dist/runtime/core/SectionEngineCore.js +2 -6
  62. package/dist/runtime/core/cohort.d.ts +1 -6
  63. package/dist/runtime/core/cohort.js +1 -10
  64. package/dist/runtime/core/engine-input.d.ts +18 -30
  65. package/dist/runtime/core/engine-input.js +11 -12
  66. package/dist/runtime/core/engine-output.d.ts +17 -40
  67. package/dist/runtime/core/engine-output.js +9 -21
  68. package/dist/runtime/core/engine-readiness.d.ts +5 -37
  69. package/dist/runtime/core/engine-readiness.js +8 -41
  70. package/dist/runtime/core/engine-resolver.d.ts +46 -74
  71. package/dist/runtime/core/engine-resolver.js +18 -43
  72. package/dist/runtime/core/engine-state.d.ts +28 -36
  73. package/dist/runtime/core/engine-state.js +18 -21
  74. package/dist/runtime/core/engine-transition.d.ts +14 -19
  75. package/dist/runtime/core/engine-transition.js +74 -53
  76. package/dist/runtime/engine.d.ts +16 -19
  77. package/dist/runtime/engine.js +12 -19
  78. package/dist/runtime/page-warnings.d.ts +13 -0
  79. package/dist/runtime/page-warnings.js +22 -0
  80. package/dist/runtime/policy-input-forwarding.d.ts +25 -0
  81. package/dist/runtime/policy-input-forwarding.js +25 -0
  82. package/dist/runtime/registration-events.d.ts +22 -14
  83. package/dist/runtime/runtime-event-claim.d.ts +8 -0
  84. package/dist/runtime/runtime-event-claim.js +15 -0
  85. package/dist/runtime/runtime-id.d.ts +1 -1
  86. package/dist/runtime/runtime-id.js +1 -1
  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 +194 -0
  93. package/dist/runtime/tool-host-contract.d.ts +8 -14
  94. package/dist/runtime/tool-host-contract.js +12 -12
  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/AccessibilityCatalogResolver.d.ts +21 -31
  98. package/dist/services/AccessibilityCatalogResolver.js +29 -42
  99. package/dist/services/ElementToolStateStore.d.ts +42 -67
  100. package/dist/services/ElementToolStateStore.js +65 -71
  101. package/dist/services/HighlightCoordinator.d.ts +28 -40
  102. package/dist/services/HighlightCoordinator.js +459 -381
  103. package/dist/services/RangeSerializer.d.ts +11 -33
  104. package/dist/services/RangeSerializer.js +88 -59
  105. package/dist/services/SSMLExtractor.d.ts +8 -31
  106. package/dist/services/SSMLExtractor.js +18 -40
  107. package/dist/services/TTSService.d.ts +159 -119
  108. package/dist/services/TTSService.js +937 -822
  109. package/dist/services/ToolCoordinator.d.ts +42 -102
  110. package/dist/services/ToolCoordinator.js +178 -256
  111. package/dist/services/ToolRegistry.d.ts +152 -133
  112. package/dist/services/ToolRegistry.js +192 -178
  113. package/dist/services/ToolkitCoordinator.d.ts +233 -237
  114. package/dist/services/ToolkitCoordinator.js +615 -557
  115. package/dist/services/audio-handoff.d.ts +6 -7
  116. package/dist/services/audio-handoff.js +20 -14
  117. package/dist/services/catalog-owner.d.ts +0 -1
  118. package/dist/services/framework-error-bus.d.ts +3 -6
  119. package/dist/services/framework-error-bus.js +3 -6
  120. package/dist/services/framework-error.d.ts +51 -13
  121. package/dist/services/framework-error.js +19 -20
  122. package/dist/services/interfaces.d.ts +189 -184
  123. package/dist/services/section-controller-types.d.ts +7 -7
  124. package/dist/services/section-session-assignment.d.ts +21 -0
  125. package/dist/services/section-session-assignment.js +80 -0
  126. package/dist/services/spoken-audio-cards.d.ts +2 -6
  127. package/dist/services/spoken-audio-cards.js +2 -6
  128. package/dist/services/tool-config-defaults.d.ts +3 -3
  129. package/dist/services/tool-config-defaults.js +3 -3
  130. package/dist/services/tool-config-validation.d.ts +9 -12
  131. package/dist/services/tool-config-validation.js +47 -87
  132. package/dist/services/tool-context.d.ts +7 -31
  133. package/dist/services/tool-context.js +99 -65
  134. package/dist/services/tool-failure.d.ts +30 -0
  135. package/dist/services/tool-failure.js +11 -0
  136. package/dist/services/tool-icons.d.ts +5 -5
  137. package/dist/services/tool-icons.js +6 -5
  138. package/dist/services/tool-instance-id.d.ts +8 -7
  139. package/dist/services/tool-instance-id.js +12 -24
  140. package/dist/services/tool-providers/TTSToolProvider.d.ts +20 -58
  141. package/dist/services/tool-providers/TTSToolProvider.js +32 -85
  142. package/dist/services/tool-providers/ToolProviderApi.d.ts +10 -11
  143. package/dist/services/tool-providers/ToolProviderRegistry.d.ts +29 -60
  144. package/dist/services/tool-providers/ToolProviderRegistry.js +128 -144
  145. package/dist/services/tool-request.d.ts +31 -12
  146. package/dist/services/tool-request.js +31 -16
  147. package/dist/services/toolbar-decided-tools.d.ts +16 -0
  148. package/dist/services/toolbar-decided-tools.js +29 -0
  149. package/dist/services/toolbar-items.js +2 -5
  150. package/dist/services/tools-config-normalizer.d.ts +33 -29
  151. package/dist/services/tools-config-normalizer.js +26 -28
  152. package/dist/services/tts/browser-provider.d.ts +39 -6
  153. package/dist/services/tts/browser-provider.js +280 -160
  154. package/dist/services/tts/catalog-span-alignment.js +14 -7
  155. package/dist/services/tts/flat-tree.d.ts +64 -0
  156. package/dist/services/tts/flat-tree.js +269 -0
  157. package/dist/services/tts/generated-speech/assemble-plan.d.ts +3 -1
  158. package/dist/services/tts/generated-speech/assemble-plan.js +3 -1
  159. package/dist/services/tts/generated-speech/dom/build-dom-plan.d.ts +2 -0
  160. package/dist/services/tts/generated-speech/dom/build-dom-plan.js +1 -1
  161. package/dist/services/tts/generated-speech/dom/to-chunk-inputs.d.ts +2 -2
  162. package/dist/services/tts/generated-speech/index.d.ts +1 -1
  163. package/dist/services/tts/generated-speech/index.js +1 -1
  164. package/dist/services/tts/generated-speech/math-speech-cache.d.ts +3 -1
  165. package/dist/services/tts/generated-speech/math-speech-cache.js +5 -1
  166. package/dist/services/tts/generated-speech/types.d.ts +1 -1
  167. package/dist/services/tts/generated-speech/types.js +1 -1
  168. package/dist/services/tts/highlight-pipeline/create-highlight-plan.js +22 -16
  169. package/dist/services/tts/highlight-pipeline/prose-boundary-resolver.js +6 -4
  170. package/dist/services/tts/highlight-pipeline/readable-region.js +3 -2
  171. package/dist/services/tts/highlight-pipeline/types.d.ts +5 -0
  172. package/dist/services/tts/highlight-pipeline/visible-map-range.d.ts +12 -0
  173. package/dist/services/tts/highlight-pipeline/visible-map-range.js +73 -7
  174. package/dist/services/tts/highlight-target-resolver.d.ts +12 -0
  175. package/dist/services/tts/math-aware-text-processing.d.ts +5 -1
  176. package/dist/services/tts/math-aware-text-processing.js +42 -47
  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 +12 -1
  180. package/dist/services/tts/math-speech.js +54 -18
  181. package/dist/services/tts/mathml-sanitization.d.ts +7 -0
  182. package/dist/services/tts/mathml-sanitization.js +9 -1
  183. package/dist/services/tts/provider-options.d.ts +52 -0
  184. package/dist/services/tts/provider-options.js +1 -0
  185. package/dist/services/tts/ssml/spoken-text.d.ts +2 -26
  186. package/dist/services/tts/ssml/spoken-text.js +29 -0
  187. package/dist/services/tts/start-failure.d.ts +4 -0
  188. package/dist/services/tts/start-failure.js +19 -0
  189. package/dist/services/tts/text-processing.d.ts +9 -0
  190. package/dist/services/tts/text-processing.js +46 -33
  191. package/dist/services/tts/text-segmentation.d.ts +12 -0
  192. package/dist/services/tts/text-segmentation.js +60 -10
  193. package/dist/services/tts-runtime-config.d.ts +54 -26
  194. package/dist/services/tts-runtime-config.js +27 -112
  195. package/dist/tools/content-capability-resolution.d.ts +9 -11
  196. package/dist/tools/content-capability-resolution.js +8 -45
  197. package/dist/tools/registration.d.ts +59 -0
  198. package/dist/tools/registration.js +55 -0
  199. package/dist/tools/registrations/toolbar-registration-helpers.d.ts +6 -0
  200. package/dist/tools/registrations/toolbar-registration-helpers.js +8 -2
  201. package/dist/tools/tool-surface-host.d.ts +6 -10
  202. package/dist/tools/tool-surface-host.js +45 -50
  203. package/dist/tools/tool-tag-map.d.ts +5 -15
  204. package/dist/tools/tool-tag-map.js +6 -20
  205. package/dist/utils/structural-equality.d.ts +11 -0
  206. package/dist/utils/structural-equality.js +47 -0
  207. package/package.json +15 -29
  208. package/dist/attempt/adapters/activity-to-test-attempt-session.d.ts +0 -49
  209. package/dist/attempt/adapters/activity-to-test-attempt-session.js +0 -138
  210. package/dist/components/chunks/ItemToolBar-b9dz5jvd.js +0 -40
  211. package/dist/components/chunks/ItemToolBar-h4xap0t0.js +0 -4
  212. package/dist/components/chunks/ItemToolBar-wr2myaah.js +0 -2
  213. package/dist/components/chunks/sre-engine-wf9s43gg.js +0 -1
  214. package/dist/context/runtime-context-consumer.d.ts +0 -13
  215. package/dist/context/runtime-context-consumer.js +0 -18
  216. package/dist/item-loader.d.ts +0 -44
  217. package/dist/item-loader.js +0 -61
  218. package/dist/policy/core/engine-context.d.ts +0 -29
  219. package/dist/policy/core/engine-context.js +0 -27
  220. package/dist/policy/core/policy-source-tag.d.ts +0 -31
  221. package/dist/policy/core/policy-source-tag.js +0 -28
  222. package/dist/policy/internal.d.ts +0 -25
  223. package/dist/policy/internal.js +0 -25
  224. package/dist/runtime/adapter/coordinator-bridge.d.ts +0 -92
  225. package/dist/runtime/adapter/coordinator-bridge.js +0 -126
  226. package/dist/runtime/adapter/framework-error-bridge.d.ts +0 -36
  227. package/dist/runtime/adapter/framework-error-bridge.js +0 -46
  228. package/dist/runtime/adapter/instrumentation-bridge.d.ts +0 -31
  229. package/dist/runtime/adapter/instrumentation-bridge.js +0 -38
  230. package/dist/runtime/core/engine-stage-derivation.d.ts +0 -18
  231. package/dist/runtime/core/engine-stage-derivation.js +0 -29
  232. package/dist/runtime/engine-context.d.ts +0 -39
  233. package/dist/runtime/engine-context.js +0 -31
  234. package/dist/runtime/internal.d.ts +0 -43
  235. package/dist/runtime/internal.js +0 -45
  236. package/dist/runtime/section-runtime-engine-host-context.d.ts +0 -74
  237. package/dist/runtime/section-runtime-engine-host-context.js +0 -57
  238. package/dist/runtime/stage-emit-gate.d.ts +0 -92
  239. package/dist/runtime/stage-emit-gate.js +0 -82
  240. package/dist/services/ContextVariableStore.d.ts +0 -113
  241. package/dist/services/ContextVariableStore.js +0 -206
  242. package/dist/services/I18nService.d.ts +0 -47
  243. package/dist/services/I18nService.js +0 -84
  244. package/dist/services/ThemeProvider.d.ts +0 -95
  245. package/dist/services/ThemeProvider.js +0 -334
  246. package/dist/services/defaultPersonalNeedsProfile.d.ts +0 -21
  247. package/dist/services/defaultPersonalNeedsProfile.js +0 -26
  248. package/dist/services/pnp-standard-features.d.ts +0 -238
  249. package/dist/services/pnp-standard-features.js +0 -338
  250. package/dist/services/tts-control-events.d.ts +0 -13
  251. package/dist/services/tts-control-events.js +0 -7
  252. package/dist/tools/client.d.ts +0 -10
  253. package/dist/tools/client.js +0 -10
  254. package/dist/tools/internal.d.ts +0 -44
  255. package/dist/tools/internal.js +0 -39
  256. package/dist/utils/logger.d.ts +0 -6
  257. package/dist/utils/logger.js +0 -10
@@ -1,14 +1,16 @@
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)
8
- *
9
- * Part of PIE Assessment Toolkit.
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`
10
10
  */
11
+ import { createPieLogger, isTtsDebugEnabled, } from "@pie-players/pie-players-shared/pie";
11
12
  import { BrowserTTSProvider } from "../../services/tts/browser-provider.js";
13
+ const logger = createPieLogger("tts-tool-provider", isTtsDebugEnabled);
12
14
  /**
13
15
  * Binds a server backend's provider to the config the registry initialized this
14
16
  * tool provider with, including what `provider.runtime.authFetcher` returned.
@@ -19,8 +21,6 @@ import { BrowserTTSProvider } from "../../services/tts/browser-provider.js";
19
21
  function bindServerBackendConfig(provider, bound) {
20
22
  return {
21
23
  providerId: provider.providerId,
22
- providerName: provider.providerName,
23
- version: provider.version,
24
24
  initialize: (config) => {
25
25
  const runtime = config;
26
26
  const merged = {
@@ -34,7 +34,6 @@ function bindServerBackendConfig(provider, bound) {
34
34
  };
35
35
  return provider.initialize(merged);
36
36
  },
37
- supportsFeature: (feature) => provider.supportsFeature(feature),
38
37
  getCapabilities: () => provider.getCapabilities(),
39
38
  destroy: () => provider.destroy(),
40
39
  };
@@ -42,34 +41,34 @@ function bindServerBackendConfig(provider, bound) {
42
41
  /**
43
42
  * TTS Tool Provider
44
43
  *
45
- * Wraps TTS providers (Browser, Polly, Google) with the ToolProviderApi interface
44
+ * Wraps the browser or a server TTS provider with the ToolProviderApi interface
46
45
  * for use in the ToolProviderRegistry.
47
46
  *
48
47
  * @example Browser TTS (no auth)
49
48
  * ```typescript
50
49
  * const provider = new TTSToolProvider();
51
- * await provider.initialize({ backend: 'browser' });
50
+ * await provider.initialize({});
52
51
  * const ttsProvider = await provider.createInstance();
53
52
  * ```
54
53
  *
55
54
  * @example Server TTS
56
55
  * ```typescript
57
- * const provider = new TTSToolProvider('polly', {
56
+ * const provider = new TTSToolProvider('server', {
58
57
  * loadServerProvider: async () => ServerTTSProvider,
59
58
  * });
60
59
  * await provider.initialize({
61
- * backend: 'polly',
60
+ * provider: 'polly',
62
61
  * apiEndpoint: '/api/tts',
63
62
  * });
64
63
  * const ttsProvider = await provider.createInstance();
65
64
  * ```
66
65
  */
67
66
  export class TTSToolProvider {
68
- providerId = "tts-service";
69
67
  providerName = "Text-to-Speech";
70
68
  category = "tts";
71
69
  version = "1.0";
72
70
  requiresAuth;
71
+ backend;
73
72
  ttsProvider = null;
74
73
  config = null;
75
74
  loadServerProvider;
@@ -81,23 +80,15 @@ export class TTSToolProvider {
81
80
  console.warn("[TTSToolProvider] telemetry callback failed:", error);
82
81
  }
83
82
  }
84
- /**
85
- * Create TTS tool provider
86
- *
87
- * @param backend TTS backend to use (default: 'browser')
88
- * @param options Loader for the server adapter, required by server backends
89
- */
83
+ /** A server backend needs `options.loadServerProvider`. */
90
84
  constructor(backend = "browser", options = {}) {
85
+ this.backend = backend;
91
86
  this.requiresAuth = backend !== "browser";
92
87
  this.loadServerProvider = options.loadServerProvider;
93
88
  }
94
89
  /**
95
- * Initialize TTS provider
96
- *
97
- * Sets up the appropriate TTS backend.
98
- *
99
- * @param config Configuration with backend type and credentials
100
- * @throws Error if initialization fails or required config missing
90
+ * Set up the backend's TTS provider. Throws when the backend is unavailable
91
+ * or its required config is missing. Once initialized, a call only warns.
101
92
  */
102
93
  async initialize(config) {
103
94
  if (this.ttsProvider) {
@@ -105,34 +96,25 @@ export class TTSToolProvider {
105
96
  return;
106
97
  }
107
98
  this.config = config;
108
- switch (config.backend) {
99
+ switch (this.backend) {
109
100
  case "browser":
110
- await this._initializeBrowserTTS(config);
101
+ await this._initializeBrowserTTS();
111
102
  break;
112
- case "polly":
113
- case "google":
114
103
  case "server":
115
104
  await this._initializeServerTTS(config);
116
105
  break;
117
106
  default:
118
- throw new Error(`[TTSToolProvider] Unknown backend: ${config.backend}`);
107
+ throw new Error(`[TTSToolProvider] Unknown backend: ${this.backend}`);
119
108
  }
120
- console.log(`[TTSToolProvider] Initialized successfully (backend: ${config.backend})`);
109
+ logger.debug(`initialized (backend: ${this.backend})`);
121
110
  }
122
- /**
123
- * Initialize browser TTS (Web Speech API)
124
- */
125
- async _initializeBrowserTTS(config) {
126
- // Check if Web Speech API is available
111
+ async _initializeBrowserTTS() {
127
112
  if (typeof window === "undefined" || !("speechSynthesis" in window)) {
128
113
  throw new Error("[TTSToolProvider] Browser TTS not supported (Web Speech API not available)");
129
114
  }
130
115
  this.ttsProvider = new BrowserTTSProvider();
131
- console.log("[TTSToolProvider] Browser TTS initialized (Web Speech API)");
116
+ logger.debug("browser TTS initialized (Web Speech API)");
132
117
  }
133
- /**
134
- * Initialize server-based TTS (Polly, Google)
135
- */
136
118
  async _initializeServerTTS(config) {
137
119
  if (!config.apiEndpoint) {
138
120
  throw new Error("[TTSToolProvider] apiEndpoint required for server-based TTS backends");
@@ -141,11 +123,12 @@ export class TTSToolProvider {
141
123
  if (!loadServerProvider) {
142
124
  throw new Error("[TTSToolProvider] server-based TTS backends need the loadServerProvider option");
143
125
  }
126
+ const serverProvider = config.provider || this.backend;
144
127
  const moduleLoadStartedAt = Date.now();
145
128
  await this.emitTelemetry("pie-tool-library-load-start", {
146
129
  toolId: "textToSpeech",
147
130
  operation: "server-provider-module-import",
148
- backend: config.serverProvider || config.backend,
131
+ backend: serverProvider,
149
132
  });
150
133
  const ServerProvider = await (async () => {
151
134
  try {
@@ -153,7 +136,7 @@ export class TTSToolProvider {
153
136
  await this.emitTelemetry("pie-tool-library-load-success", {
154
137
  toolId: "textToSpeech",
155
138
  operation: "server-provider-module-import",
156
- backend: config.serverProvider || config.backend,
139
+ backend: serverProvider,
157
140
  duration: Date.now() - moduleLoadStartedAt,
158
141
  });
159
142
  return loaded;
@@ -162,7 +145,7 @@ export class TTSToolProvider {
162
145
  await this.emitTelemetry("pie-tool-library-load-error", {
163
146
  toolId: "textToSpeech",
164
147
  operation: "server-provider-module-import",
165
- backend: config.serverProvider || config.backend,
148
+ backend: serverProvider,
166
149
  duration: Date.now() - moduleLoadStartedAt,
167
150
  errorType: "ToolLibraryLoadError",
168
151
  message: error instanceof Error ? error.message : String(error),
@@ -170,18 +153,13 @@ export class TTSToolProvider {
170
153
  throw error;
171
154
  }
172
155
  })();
173
- const { backend, serverProvider, onTelemetry, ...backendConfig } = config;
156
+ const { onTelemetry: _onTelemetry, ...backendConfig } = config;
174
157
  this.ttsProvider = bindServerBackendConfig(new ServerProvider(), backendConfig);
175
- console.log(`[TTSToolProvider] Server TTS initialized (provider: ${config.serverProvider || config.backend})`);
158
+ logger.debug(`server TTS initialized (provider: ${serverProvider})`);
176
159
  }
177
160
  /**
178
- * Create a TTS provider instance
179
- *
180
- * Returns the initialized TTS provider.
181
- *
182
- * @param config Optional instance-specific configuration (currently unused)
183
- * @returns TTS provider
184
- * @throws Error if provider not initialized
161
+ * The initialized TTS provider; every call returns the same one and ignores
162
+ * `config`. Throws before `initialize`.
185
163
  */
186
164
  async createInstance(config) {
187
165
  if (!this.ttsProvider) {
@@ -189,46 +167,15 @@ export class TTSToolProvider {
189
167
  }
190
168
  return this.ttsProvider;
191
169
  }
192
- /**
193
- * Get provider capabilities
194
- *
195
- * @returns TTS capabilities based on backend
196
- */
197
- getCapabilities() {
198
- const isBrowser = this.config?.backend === "browser";
199
- return {
200
- supportsOffline: isBrowser,
201
- requiresAuth: !isBrowser,
202
- maxInstances: 1, // Single TTS instance (playback is sequential)
203
- features: {
204
- wordBoundary: true, // All backends support word highlighting
205
- pause: true,
206
- resume: true,
207
- rateControl: true,
208
- pitchControl: isBrowser, // Only browser supports pitch
209
- voiceSelection: true,
210
- },
211
- };
212
- }
213
- /**
214
- * Check if provider is ready
215
- *
216
- * @returns true if provider is initialized
217
- */
218
170
  isReady() {
219
171
  return this.ttsProvider !== null;
220
172
  }
221
- /**
222
- * Clean up provider resources
223
- *
224
- * Destroys the TTS provider and releases resources.
225
- */
226
173
  destroy() {
227
174
  if (this.ttsProvider) {
228
175
  this.ttsProvider.destroy();
229
176
  this.ttsProvider = null;
230
177
  }
231
178
  this.config = null;
232
- console.log("[TTSToolProvider] Destroyed");
179
+ logger.debug("destroyed");
233
180
  }
234
181
  }
@@ -5,21 +5,20 @@
5
5
  * configuration, authentication, or external services.
6
6
  */
7
7
  export type ToolCategory = "calculator" | "tts" | "translation" | "annotation" | "accessibility" | "other";
8
- export interface ToolProviderCapabilities {
9
- supportsOffline: boolean;
10
- requiresAuth: boolean;
11
- maxInstances?: number | null;
12
- features: Record<string, boolean>;
13
- }
14
- export interface ToolProviderApi<TConfig = any, TInstance = any> {
15
- readonly providerId: string;
8
+ /**
9
+ * A tool's provider. It registers under its tool's id, which is how the toolkit
10
+ * and the tool find it; it carries no id of its own.
11
+ *
12
+ * Config takes no type parameter (ADR 0002): an implementation narrows it in its
13
+ * own method signatures.
14
+ */
15
+ export interface ToolProviderApi<TInstance = any> {
16
16
  readonly providerName: string;
17
17
  readonly category: ToolCategory;
18
18
  readonly version: string;
19
19
  readonly requiresAuth: boolean;
20
- initialize(config: TConfig): Promise<void>;
21
- createInstance(config?: Partial<TConfig>): Promise<TInstance>;
22
- getCapabilities(): ToolProviderCapabilities;
20
+ initialize(config: unknown): Promise<void>;
21
+ createInstance(config?: unknown): Promise<TInstance>;
23
22
  isReady(): boolean;
24
23
  destroy(): void;
25
24
  }
@@ -3,18 +3,16 @@
3
3
  *
4
4
  * Centralized registry for managing tool providers.
5
5
  * Handles initialization, authentication, and lazy loading.
6
- *
7
- * Part of PIE Assessment Toolkit.
8
6
  */
9
7
  import type { ToolProviderApi, ToolCategory } from "./ToolProviderApi.js";
10
8
  /**
11
- * Configuration for registering a tool provider
9
+ * What `register` takes: the provider, its config, and how it starts.
12
10
  */
13
- export interface ToolProviderConfig<TConfig = any> {
11
+ export interface ToolProviderRegistration<TConfig = any> {
14
12
  /**
15
13
  * Provider instance to register
16
14
  */
17
- provider: ToolProviderApi<TConfig>;
15
+ provider: ToolProviderApi;
18
16
  /**
19
17
  * Configuration for this provider
20
18
  * (may include auth credentials, endpoints, etc.)
@@ -36,7 +34,7 @@ export interface ToolProviderConfig<TConfig = any> {
36
34
  * @example
37
35
  * ```typescript
38
36
  * authFetcher: async () => {
39
- * const response = await fetch('/api/desmos/token');
37
+ * const response = await fetch('/api/tools/desmos/auth');
40
38
  * return response.json(); // { apiKey: '...' }
41
39
  * }
42
40
  * ```
@@ -54,14 +52,16 @@ export interface ToolProviderConfig<TConfig = any> {
54
52
  * - Registration
55
53
  * - Lazy initialization
56
54
  * - Auth credential fetching
57
- * - Provider lookup by ID or category
55
+ * - Provider lookup by tool id or category
56
+ *
57
+ * The toolkit coordinator registers each provider under its tool's id.
58
58
  *
59
59
  * @example
60
60
  * ```typescript
61
61
  * const registry = new ToolProviderRegistry();
62
62
  *
63
63
  * // Register a provider with auth fetcher
64
- * registry.register('example-provider', {
64
+ * registry.register('calculator', {
65
65
  * provider: new ExampleToolProvider(),
66
66
  * config: {},
67
67
  * lazy: true,
@@ -72,7 +72,7 @@ export interface ToolProviderConfig<TConfig = any> {
72
72
  * });
73
73
  *
74
74
  * // Get provider (auto-initializes if lazy)
75
- * const provider = await registry.getProvider('example-provider');
75
+ * const provider = await registry.getProvider('calculator');
76
76
  * ```
77
77
  */
78
78
  export declare class ToolProviderRegistry {
@@ -85,23 +85,22 @@ export declare class ToolProviderRegistry {
85
85
  * Register a tool provider
86
86
  *
87
87
  * Adds a provider to the registry. If lazy is false, initializes immediately.
88
- *
89
- * @param providerId Unique provider identifier
90
- * @param config Provider configuration
91
- * @throws Error if provider with same ID already registered
88
+ * A registration under an id already registered replaces it: the replaced
89
+ * provider is destroyed once a start in progress settles, and a caller
90
+ * waiting on that start gets the replacement.
92
91
  */
93
- register(providerId: string, config: ToolProviderConfig): void;
92
+ register(toolId: string, config: ToolProviderRegistration): void;
94
93
  /**
95
94
  * Initialize a provider
96
95
  *
97
96
  * Fetches auth if needed and initializes the provider.
98
97
  * Safe to call multiple times - subsequent calls wait for first initialization.
99
- *
100
- * @param providerId Provider to initialize
101
- * @returns Promise that resolves when initialization complete
102
- * @throws Error if provider not registered or initialization fails
98
+ * Throws when the provider is not registered or its initialization fails.
103
99
  */
104
- initialize(providerId: string): Promise<void>;
100
+ initialize(toolId: string): Promise<void>;
101
+ /** Whether a registration replaced `provider` under `toolId`. */
102
+ private isReplaced;
103
+ private destroyProvider;
105
104
  /**
106
105
  * Internal initialization logic
107
106
  */
@@ -110,56 +109,26 @@ export declare class ToolProviderRegistry {
110
109
  * Get a provider instance
111
110
  *
112
111
  * Retrieves a registered provider. If autoInitialize is true and provider
113
- * is not initialized, initializes it first.
114
- *
115
- * @param providerId Provider identifier
116
- * @param autoInitialize Auto-initialize if not ready (default: true)
117
- * @returns Provider instance
118
- * @throws Error if provider not registered
119
- */
120
- getProvider<T extends ToolProviderApi = ToolProviderApi>(providerId: string, autoInitialize?: boolean): Promise<T>;
121
- /**
122
- * Get all providers in a category
123
- *
124
- * @param category Tool category to filter by
125
- * @returns Array of provider IDs in the category
112
+ * is not initialized, initializes it first. Throws when the provider is not
113
+ * registered.
126
114
  */
115
+ getProvider<T extends ToolProviderApi = ToolProviderApi>(toolId: string, autoInitialize?: boolean): Promise<T>;
116
+ /** The ids of the tools whose provider is in `category`. */
127
117
  getProvidersByCategory(category: ToolCategory): string[];
128
118
  /**
129
- * Get all registered provider IDs
130
- *
131
- * @returns Array of all provider IDs
119
+ * The ids of the tools with a registered provider.
132
120
  */
133
121
  getProviderIds(): string[];
134
- /**
135
- * Check if provider is registered
136
- *
137
- * @param providerId Provider identifier
138
- * @returns true if provider is registered
139
- */
140
- has(providerId: string): boolean;
141
- /**
142
- * Check if provider is initialized
143
- *
144
- * @param providerId Provider identifier
145
- * @returns true if provider is initialized
146
- */
147
- isInitialized(providerId: string): boolean;
148
- /**
149
- * Check if provider is currently initializing
150
- *
151
- * @param providerId Provider identifier
152
- * @returns true if initialization in progress
153
- */
154
- isInitializing(providerId: string): boolean;
122
+ has(toolId: string): boolean;
123
+ isInitialized(toolId: string): boolean;
124
+ isInitializing(toolId: string): boolean;
155
125
  /**
156
126
  * Unregister and destroy a provider
157
127
  *
158
- * Removes the provider from the registry and calls its destroy method.
159
- *
160
- * @param providerId Provider to unregister
128
+ * Removes the provider from the registry and calls its destroy method,
129
+ * after any start in progress settles.
161
130
  */
162
- unregister(providerId: string): Promise<void>;
131
+ unregister(toolId: string): Promise<void>;
163
132
  /**
164
133
  * Clean up all providers
165
134
  *