@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
@@ -13,27 +13,26 @@
13
13
  */
14
14
  import type { TtsServiceApi } from "./interfaces.js";
15
15
  /** Only what a handoff needs, so a host passing a partial service still works. */
16
- type TtsHandoffSubscriber = Pick<TtsServiceApi, "onStateChange" | "offStateChange">;
17
- type TtsHandoffPlayback = Pick<TtsServiceApi, "isPlaying" | "pause">;
16
+ type TtsHandoffSubscriber = Pick<TtsServiceApi, "onStateChange">;
17
+ type TtsHandoffPlayback = Pick<TtsServiceApi, "getState" | "pause">;
18
18
  /**
19
19
  * Silence a media surface whenever read-aloud starts speaking.
20
20
  *
21
- * `LOADING` as well as `PLAYING`, so the pause lands before the first word rather
22
- * than a provider round-trip after it. A `LOADING` that then fails leaves media
23
- * paused, which costs the learner one press of play.
21
+ * Silenced on loading, so the pause lands before the first word rather than a
22
+ * provider round-trip after it. A load that then fails leaves media paused,
23
+ * which costs the learner one press of play.
24
24
  *
25
25
  * Returns the teardown, including where there was nothing to bind.
26
26
  */
27
27
  export declare function bindTtsAudioHandoff(args: {
28
28
  ttsService: Partial<TtsHandoffSubscriber> | null | undefined;
29
- /** Unique per surface: the service keys its listener sets by this. */
30
- listenerId: string;
31
29
  silence: () => void;
32
30
  }): () => void;
33
31
  /**
34
32
  * The other half: media audio has started, so read-aloud yields.
35
33
  *
36
34
  * Paused rather than stopped, so the learner keeps their place in the passage.
35
+ * A read still loading pauses too, and holds until the learner resumes it.
37
36
  */
38
37
  export declare function pauseTtsForMediaAudio(ttsService: Partial<TtsHandoffPlayback> | null | undefined): void;
39
38
  export {};
@@ -13,29 +13,34 @@
13
13
  */
14
14
  import { PlaybackState } from "./TTSService.js";
15
15
  const NOOP = () => { };
16
+ /**
17
+ * Read-aloud counts as speaking from the moment a read starts loading. A
18
+ * loading read sounds as soon as its audio arrives, so both halves treat it as
19
+ * a playing one.
20
+ */
21
+ function isSpeaking(state) {
22
+ return state === PlaybackState.PLAYING || state === PlaybackState.LOADING;
23
+ }
16
24
  /**
17
25
  * Silence a media surface whenever read-aloud starts speaking.
18
26
  *
19
- * `LOADING` as well as `PLAYING`, so the pause lands before the first word rather
20
- * than a provider round-trip after it. A `LOADING` that then fails leaves media
21
- * paused, which costs the learner one press of play.
27
+ * Silenced on loading, so the pause lands before the first word rather than a
28
+ * provider round-trip after it. A load that then fails leaves media paused,
29
+ * which costs the learner one press of play.
22
30
  *
23
31
  * Returns the teardown, including where there was nothing to bind.
24
32
  */
25
33
  export function bindTtsAudioHandoff(args) {
26
- const { ttsService, listenerId, silence } = args;
34
+ const { ttsService, silence } = args;
27
35
  if (typeof ttsService?.onStateChange !== "function")
28
36
  return NOOP;
29
- const onTtsState = (state) => {
30
- if (state !== PlaybackState.PLAYING && state !== PlaybackState.LOADING) {
31
- return;
32
- }
33
- silence();
34
- };
35
- ttsService.onStateChange(listenerId, onTtsState);
37
+ const unsubscribe = ttsService.onStateChange((state) => {
38
+ if (isSpeaking(state))
39
+ silence();
40
+ });
36
41
  return () => {
37
42
  try {
38
- ttsService.offStateChange?.(listenerId, onTtsState);
43
+ unsubscribe();
39
44
  }
40
45
  catch {
41
46
  // A torn-down service is not a failure to detach from.
@@ -46,11 +51,12 @@ export function bindTtsAudioHandoff(args) {
46
51
  * The other half: media audio has started, so read-aloud yields.
47
52
  *
48
53
  * Paused rather than stopped, so the learner keeps their place in the passage.
54
+ * A read still loading pauses too, and holds until the learner resumes it.
49
55
  */
50
56
  export function pauseTtsForMediaAudio(ttsService) {
51
57
  try {
52
- if (ttsService?.isPlaying?.())
53
- ttsService.pause?.();
58
+ if (isSpeaking(ttsService?.getState?.()))
59
+ ttsService?.pause?.();
54
60
  }
55
61
  catch {
56
62
  // A torn-down or uninitialized TTS service must not break playback.
@@ -6,7 +6,6 @@
6
6
  * adapter, while keeping the entity walk private to the resolver package.
7
7
  */
8
8
  import type { AccessibilityCatalog } from "@pie-players/pie-players-shared/types";
9
- export type CatalogOwnerKind = "global" | "passage" | "itemModel";
10
9
  interface CatalogOwnerScopeContext {
11
10
  assessmentId?: string;
12
11
  sectionId?: string;
@@ -68,4 +67,15 @@ export declare function catalogOwnerContextFor(owner: CatalogOwnerIdentity): Cat
68
67
  * register the owner once through `AccessibilityCatalogResolver.registerOwner`.
69
68
  */
70
69
  export declare function collectOwnerCatalogRegistrations(entity: CatalogSourceEntity | null | undefined, owner: CatalogOwnerIdentity): CatalogOwnerRegistrationEntry[];
70
+ /**
71
+ * The catalogs an owner registration of `entity` would file, as a string equal
72
+ * for any two entities that register the same catalogs. A shell holding new
73
+ * content under an unchanged identity compares it to decide whether the runtime
74
+ * has anything new to register. It is derived from the registration walk, so it
75
+ * cannot disagree with the registration about what counts as a catalog.
76
+ *
77
+ * `null` when the catalogs do not serialize: nothing can be concluded, and the
78
+ * caller registers again.
79
+ */
80
+ export declare function catalogSourceSignature(entity: CatalogSourceEntity | null | undefined, kind: CatalogOwnerIdentity["kind"]): string | null;
71
81
  export {};
@@ -62,3 +62,28 @@ export function collectOwnerCatalogRegistrations(entity, owner) {
62
62
  }
63
63
  return registrations;
64
64
  }
65
+ /**
66
+ * The catalogs an owner registration of `entity` would file, as a string equal
67
+ * for any two entities that register the same catalogs. A shell holding new
68
+ * content under an unchanged identity compares it to decide whether the runtime
69
+ * has anything new to register. It is derived from the registration walk, so it
70
+ * cannot disagree with the registration about what counts as a catalog.
71
+ *
72
+ * `null` when the catalogs do not serialize: nothing can be concluded, and the
73
+ * caller registers again.
74
+ */
75
+ export function catalogSourceSignature(entity, kind) {
76
+ const registrations = collectOwnerCatalogRegistrations(entity, {
77
+ kind,
78
+ itemId: "",
79
+ });
80
+ try {
81
+ return JSON.stringify(registrations.map((registration) => [
82
+ registration.context.modelId ?? null,
83
+ registration.catalogs,
84
+ ]));
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
@@ -1,8 +1,8 @@
1
- import type { CanonicalToolsConfig } from "./tools-config-normalizer.js";
1
+ import type { ToolsConfigInput } from "./tools-config-normalizer.js";
2
2
  import type { ToolRegistry } from "./ToolRegistry.js";
3
3
  import { type ToolConfigStrictness, type ToolConfigValidationResult } from "./tool-config-validation.js";
4
4
  export interface CreateToolsConfigArgs {
5
- tools?: Partial<CanonicalToolsConfig> | null;
5
+ tools?: ToolsConfigInput | null;
6
6
  toolRegistry?: ToolRegistry | null;
7
7
  strictness?: ToolConfigStrictness;
8
8
  source?: string;
@@ -48,12 +48,9 @@ export interface FrameworkErrorReporter {
48
48
  * before constructing the coordinator so the `coordinator-init`
49
49
  * failure path emits through the same bus.
50
50
  *
51
- * **Why not a public class.** This bus is constructed inside the toolkit
52
- * CE (`PieAssessmentToolkit.svelte`) and passed into
53
- * `ToolkitCoordinator`. Hosts subscribe via
54
- * `ToolkitCoordinatorApi.subscribeFrameworkErrors`, never via the bus
55
- * class itself. Keeping the class package-internal lets us iterate on
56
- * its shape without a public-API change.
51
+ * **Where it is constructed.** The toolkit CE (`PieAssessmentToolkit.svelte`)
52
+ * builds one and passes it into `ToolkitCoordinator`; hosts subscribe via
53
+ * `ToolkitCoordinatorApi.subscribeFrameworkErrors`.
57
54
  */
58
55
  export declare class FrameworkErrorBus implements FrameworkErrorPort, FrameworkErrorReporter {
59
56
  private readonly listeners;
@@ -20,12 +20,9 @@
20
20
  * before constructing the coordinator so the `coordinator-init`
21
21
  * failure path emits through the same bus.
22
22
  *
23
- * **Why not a public class.** This bus is constructed inside the toolkit
24
- * CE (`PieAssessmentToolkit.svelte`) and passed into
25
- * `ToolkitCoordinator`. Hosts subscribe via
26
- * `ToolkitCoordinatorApi.subscribeFrameworkErrors`, never via the bus
27
- * class itself. Keeping the class package-internal lets us iterate on
28
- * its shape without a public-API change.
23
+ * **Where it is constructed.** The toolkit CE (`PieAssessmentToolkit.svelte`)
24
+ * builds one and passes it into `ToolkitCoordinator`; hosts subscribe via
25
+ * `ToolkitCoordinatorApi.subscribeFrameworkErrors`.
29
26
  */
30
27
  export class FrameworkErrorBus {
31
28
  listeners = new Set();
@@ -1,5 +1,10 @@
1
1
  import type { ToolConfigDiagnostic } from "./tool-config-validation.js";
2
2
  export type FrameworkErrorKind = "tool-config" | "runtime-init" | "runtime-dispose" | "coordinator-init" | "provider-init" | "provider-register" | "tts-init" | "tool-state-load" | "tool-state-save" | "section-controller-init" | "section-controller-dispose" | "tool-surface"
3
+ /**
4
+ * A toolbar could not load a tool's module. Recoverable unless policy grants
5
+ * the tool: the toolbar withholds the tool and the assessment goes on.
6
+ */
7
+ | "tool-module-load"
3
8
  /**
4
9
  * A timed-media section could not deliver a policy as authored: a media time
5
10
  * source missing `canPause` / `canRestrictSeeking` (recoverable — cues still
@@ -13,8 +18,22 @@ export type FrameworkErrorKind = "tool-config" | "runtime-init" | "runtime-dispo
13
18
  * key still resolves through the English fallback chain, so the player renders
14
19
  * — in the wrong language, which a host wants to know about.
15
20
  */
16
- | "i18n-locale-load" | "unknown";
21
+ | "i18n-locale-load"
22
+ /**
23
+ * A section player could not register the elements its items need before
24
+ * mounting them: a renderable failed the config contract, an element bundle
25
+ * or module failed to load, or a `preloaded` page lacks a registration the
26
+ * content names. Not recoverable — the section's items stay unmounted.
27
+ */
28
+ | "element-preload" | "unknown";
17
29
  export type FrameworkErrorSeverity = "warning" | "error";
30
+ /**
31
+ * What a non-recoverable error takes down. `cohort`: the section it was reported
32
+ * for, so the section player's readiness recovers when the learner moves to
33
+ * another section. `runtime`: the coordinator or one of its tools, which every
34
+ * later section runs on, so readiness stays failed. Set by the report site.
35
+ */
36
+ export type FrameworkErrorScope = "cohort" | "runtime";
18
37
  export interface FrameworkErrorModel {
19
38
  kind: FrameworkErrorKind;
20
39
  severity: FrameworkErrorSeverity;
@@ -22,6 +41,7 @@ export interface FrameworkErrorModel {
22
41
  message: string;
23
42
  details: string[];
24
43
  recoverable: boolean;
44
+ scope: FrameworkErrorScope;
25
45
  cause?: unknown;
26
46
  }
27
47
  export declare function toFrameworkErrorModel(args: {
@@ -31,6 +51,8 @@ export declare function toFrameworkErrorModel(args: {
31
51
  message: string;
32
52
  details?: string[];
33
53
  recoverable?: boolean;
54
+ /** Defaults to `runtime`. */
55
+ scope?: FrameworkErrorScope;
34
56
  cause?: unknown;
35
57
  }): FrameworkErrorModel;
36
58
  export declare function frameworkErrorFromUnknown(args: {
@@ -38,6 +60,7 @@ export declare function frameworkErrorFromUnknown(args: {
38
60
  source: string;
39
61
  error: unknown;
40
62
  recoverable?: boolean;
63
+ scope?: FrameworkErrorScope;
41
64
  }): FrameworkErrorModel;
42
65
  /**
43
66
  * Coordinator-side error context shape consumed by
@@ -50,8 +73,8 @@ export declare function frameworkErrorFromUnknown(args: {
50
73
  * truth for coordinator code; values of that type satisfy this shape.
51
74
  */
52
75
  export interface FrameworkErrorCoordinatorContext {
53
- phase: "coordinator-ready" | "state-load" | "state-save" | "provider-register" | "provider-init" | "tts-init" | "section-controller-init" | "section-controller-dispose";
54
- providerId?: string;
76
+ phase: "coordinator-ready" | "state-load" | "state-save" | "provider-register" | "provider-init" | "tts-init" | "section-controller-init" | "section-controller-dispose" | "tool-module-load";
77
+ toolId?: string;
55
78
  details?: Record<string, unknown>;
56
79
  }
57
80
  /**
@@ -59,20 +82,19 @@ export interface FrameworkErrorCoordinatorContext {
59
82
  * context pair.
60
83
  *
61
84
  * Maps `context.phase` to the canonical {@link FrameworkErrorKind} and
62
- * synthesizes a `source` from `context.providerId` when present
63
- * (`pie-toolkit-coordinator/<providerId>`); falls back to a phase-tagged
85
+ * synthesizes a `source` from `context.toolId` when present
86
+ * (`pie-toolkit-coordinator/<toolId>`); falls back to a phase-tagged
64
87
  * source (`pie-toolkit-coordinator:<phase>`) otherwise. Forwards the
65
88
  * original `error` as `cause` so hosts that care about the underlying
66
89
  * `Error` keep getting it.
67
90
  *
68
- * Recoverable defaults to `false` (most coordinator-phase failures are
69
- * not auto-recovered today). Override with `recoverable: true` for the
70
- * phases where the coordinator continues operating after the failure.
91
+ * `recoverable` defaults to `false` and `scope` to `runtime`.
71
92
  */
72
93
  export declare function frameworkErrorFromCoordinatorContext(args: {
73
94
  error: unknown;
74
95
  context: FrameworkErrorCoordinatorContext;
75
96
  recoverable?: boolean;
97
+ scope?: FrameworkErrorScope;
76
98
  }): FrameworkErrorModel;
77
99
  export declare function frameworkErrorFromToolConfigDiagnostics(args: {
78
100
  source: string;
@@ -6,6 +6,7 @@ export function toFrameworkErrorModel(args) {
6
6
  message: args.message,
7
7
  details: [...(args.details || [])],
8
8
  recoverable: args.recoverable === true,
9
+ scope: args.scope ?? "runtime",
9
10
  cause: args.cause,
10
11
  };
11
12
  }
@@ -18,6 +19,7 @@ export function frameworkErrorFromUnknown(args) {
18
19
  source: args.source,
19
20
  message,
20
21
  recoverable: args.recoverable,
22
+ scope: args.scope,
21
23
  cause: args.error,
22
24
  });
23
25
  }
@@ -30,32 +32,32 @@ const COORDINATOR_PHASE_TO_KIND = {
30
32
  "tts-init": "tts-init",
31
33
  "section-controller-init": "section-controller-init",
32
34
  "section-controller-dispose": "section-controller-dispose",
35
+ "tool-module-load": "tool-module-load",
33
36
  };
34
37
  /**
35
38
  * Build a {@link FrameworkErrorModel} from a coordinator-side error +
36
39
  * context pair.
37
40
  *
38
41
  * Maps `context.phase` to the canonical {@link FrameworkErrorKind} and
39
- * synthesizes a `source` from `context.providerId` when present
40
- * (`pie-toolkit-coordinator/<providerId>`); falls back to a phase-tagged
42
+ * synthesizes a `source` from `context.toolId` when present
43
+ * (`pie-toolkit-coordinator/<toolId>`); falls back to a phase-tagged
41
44
  * source (`pie-toolkit-coordinator:<phase>`) otherwise. Forwards the
42
45
  * original `error` as `cause` so hosts that care about the underlying
43
46
  * `Error` keep getting it.
44
47
  *
45
- * Recoverable defaults to `false` (most coordinator-phase failures are
46
- * not auto-recovered today). Override with `recoverable: true` for the
47
- * phases where the coordinator continues operating after the failure.
48
+ * `recoverable` defaults to `false` and `scope` to `runtime`.
48
49
  */
49
50
  export function frameworkErrorFromCoordinatorContext(args) {
50
51
  const kind = COORDINATOR_PHASE_TO_KIND[args.context.phase];
51
- const source = args.context.providerId
52
- ? `pie-toolkit-coordinator/${args.context.providerId}`
52
+ const source = args.context.toolId
53
+ ? `pie-toolkit-coordinator/${args.context.toolId}`
53
54
  : `pie-toolkit-coordinator:${args.context.phase}`;
54
55
  return frameworkErrorFromUnknown({
55
56
  kind,
56
57
  source,
57
58
  error: args.error,
58
59
  recoverable: args.recoverable,
60
+ scope: args.scope,
59
61
  });
60
62
  }
61
63
  export function frameworkErrorFromToolConfigDiagnostics(args) {