@vue-skuilder/platform-ui 0.2.35 → 0.2.37

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 (189) hide show
  1. package/dist/assets/{About-BWM7KlDK.js → About-BkMENQtD.js} +2 -2
  2. package/dist/assets/{About-BWM7KlDK.js.map → About-BkMENQtD.js.map} +1 -1
  3. package/dist/assets/AdminDashboard-5R-xgY-M.js +2 -0
  4. package/dist/assets/{AdminDashboard-CO2rxkF5.js.map → AdminDashboard-5R-xgY-M.js.map} +1 -1
  5. package/dist/assets/AdminLearner-Br10DFSt.js +2 -0
  6. package/dist/assets/{AdminLearner-CZO2Hlk1.js.map → AdminLearner-Br10DFSt.js.map} +1 -1
  7. package/dist/assets/BaseUserDB-BRgNfdWx.js +1 -0
  8. package/dist/assets/ClassroomCtrlPanel-DQJQ0B7M.js +2 -0
  9. package/dist/assets/{ClassroomCtrlPanel-cj6bokz5.js.map → ClassroomCtrlPanel-DQJQ0B7M.js.map} +1 -1
  10. package/dist/assets/{Classrooms-BIC1PGz0.js → Classrooms-B5tQPFEE.js} +3 -3
  11. package/dist/assets/{Classrooms-BIC1PGz0.js.map → Classrooms-B5tQPFEE.js.map} +1 -1
  12. package/dist/assets/CouchDBSyncStrategy-0EgX8AAz.js +1 -0
  13. package/dist/assets/CourseRouter-W6S7DpZN.js +7 -0
  14. package/dist/assets/{CourseRouter-CMMxD9us.js.map → CourseRouter-W6S7DpZN.js.map} +1 -1
  15. package/dist/assets/CourseSyncService-CrHp0wsl.js +1 -0
  16. package/dist/assets/CourseWare-BTFRjgBR-lpqcYpAW.js +3 -0
  17. package/dist/assets/{CourseWare-BTFRjgBR-C3wi5YHa.js.map → CourseWare-BTFRjgBR-lpqcYpAW.js.map} +1 -1
  18. package/dist/assets/{Courses-Dw7mgMnI.js → Courses-TzwgFdwn.js} +3 -3
  19. package/dist/assets/{Courses-Dw7mgMnI.js.map → Courses-TzwgFdwn.js.map} +1 -1
  20. package/dist/assets/EloModeration-BCz7VKla.js +2 -0
  21. package/dist/assets/{EloModeration-COgCrvb8.js.map → EloModeration-BCz7VKla.js.map} +1 -1
  22. package/dist/assets/{JoinCode-Fu9Tks7r.js → JoinCode-CEeZkFOp.js} +2 -2
  23. package/dist/assets/{JoinCode-Fu9Tks7r.js.map → JoinCode-CEeZkFOp.js.map} +1 -1
  24. package/dist/assets/MarkdownRenderer-WG9YrHpe.js +1 -0
  25. package/dist/assets/MarkdownRenderer-borh39Lq.js +53 -0
  26. package/dist/assets/MarkdownRenderer-borh39Lq.js.map +1 -0
  27. package/dist/assets/NewCourseDialog-DNzvvz_H.js +2 -0
  28. package/dist/assets/{NewCourseDialog-C11dSwWM.js.map → NewCourseDialog-DNzvvz_H.js.map} +1 -1
  29. package/dist/assets/PipelineDebugger-DhnKlMgD.js +177 -0
  30. package/dist/assets/PipelineDebugger-DhnKlMgD.js.map +1 -0
  31. package/dist/assets/PouchDataLayerProvider-CAuhZYIc.js +2 -0
  32. package/dist/assets/PouchDataLayerProvider-CAuhZYIc.js.map +1 -0
  33. package/dist/assets/{ReleaseNotes-CeTkuF5d.js → ReleaseNotes-Bvw24QDI.js} +2 -2
  34. package/dist/assets/{ReleaseNotes-CeTkuF5d.js.map → ReleaseNotes-Bvw24QDI.js.map} +1 -1
  35. package/dist/assets/RequestPasswordReset-YOq1JJ_o.js +2 -0
  36. package/dist/assets/{RequestPasswordReset-vTzfGItp.js.map → RequestPasswordReset-YOq1JJ_o.js.map} +1 -1
  37. package/dist/assets/ResetPassword-CQCb3B_Z.js +2 -0
  38. package/dist/assets/{ResetPassword-CmGaVYsI.js.map → ResetPassword-CQCb3B_Z.js.map} +1 -1
  39. package/dist/assets/StaticDataLayerProvider-DbGLKpb1.js +2 -0
  40. package/dist/assets/StaticDataLayerProvider-DbGLKpb1.js.map +1 -0
  41. package/dist/assets/Study-D2mXR27s.js +2 -0
  42. package/dist/assets/{Study-CkJvraIv.js.map → Study-D2mXR27s.js.map} +1 -1
  43. package/dist/assets/TagInformation-DHw5jRNt.js +2 -0
  44. package/dist/assets/{TagInformation-xZcQ1C1t.js.map → TagInformation-DHw5jRNt.js.map} +1 -1
  45. package/dist/assets/User-C0xEcKaU.js +2 -0
  46. package/dist/assets/User-C0xEcKaU.js.map +1 -0
  47. package/dist/assets/UserDBDebugger-BXLoT28w.js +23 -0
  48. package/dist/assets/UserDBDebugger-BXLoT28w.js.map +1 -0
  49. package/dist/assets/UserDBDebugger-DHONc_-t.js +1 -0
  50. package/dist/assets/UserStats-Blm_daoT.js +2 -0
  51. package/dist/assets/{UserStats-CioNBbmL.js.map → UserStats-Blm_daoT.js.map} +1 -1
  52. package/dist/assets/VerifyEmail-DTwA6sFY.js +2 -0
  53. package/dist/assets/{VerifyEmail-Bh-T9191.js.map → VerifyEmail-DTwA6sFY.js.map} +1 -1
  54. package/dist/assets/admin-hzNSXp0o.js +21 -0
  55. package/dist/assets/admin-hzNSXp0o.js.map +1 -0
  56. package/dist/assets/chess-E2uOAyQS-DDTgqZMJ.js +7 -0
  57. package/dist/assets/{chess-E2uOAyQS-C8213VIQ.js.map → chess-E2uOAyQS-DDTgqZMJ.js.map} +1 -1
  58. package/dist/assets/chess-Lfm7Fsvs-RaFhFnIh.js +1 -0
  59. package/dist/assets/contentSource-FGhM_ge8.js +34 -0
  60. package/dist/assets/contentSource-FGhM_ge8.js.map +1 -0
  61. package/dist/assets/defineProperty-y9rbOPYz.js +1 -0
  62. package/dist/assets/dist-5Z6GjIpR.js +1 -0
  63. package/dist/assets/dist-BJLhyG8r.js +18 -0
  64. package/dist/assets/dist-BJLhyG8r.js.map +1 -0
  65. package/dist/assets/dist-C5-_1l75.js +1 -0
  66. package/dist/assets/dist-C8EQUxWW.js +38 -0
  67. package/dist/assets/dist-C8EQUxWW.js.map +1 -0
  68. package/dist/assets/dist-DGbpjpKB.js +64 -0
  69. package/dist/assets/dist-DGbpjpKB.js.map +1 -0
  70. package/dist/assets/dist-M4o-5YLq.js +1 -0
  71. package/dist/assets/edit-ui.es-BT7ftsox.js +1 -0
  72. package/dist/assets/edit-ui.es-DJgikaS7.js +41 -0
  73. package/dist/assets/edit-ui.es-DJgikaS7.js.map +1 -0
  74. package/dist/assets/elo-5Z2qkwtw.js +1 -0
  75. package/dist/assets/elo-B5qCwvSC.js +2 -0
  76. package/dist/assets/elo-B5qCwvSC.js.map +1 -0
  77. package/dist/assets/elo-C4ZdbMIJ.js +2 -0
  78. package/dist/assets/elo-C4ZdbMIJ.js.map +1 -0
  79. package/dist/assets/eloDistance-CRxxdYPJ.js +2 -0
  80. package/dist/assets/eloDistance-CRxxdYPJ.js.map +1 -0
  81. package/dist/assets/eloDistance-DF4pmPOI.js +1 -0
  82. package/dist/assets/french-Dk7YG8Td-C2awfrzV.js +2 -0
  83. package/dist/assets/{french-Dk7YG8Td-D9eV2DXL.js.map → french-Dk7YG8Td-C2awfrzV.js.map} +1 -1
  84. package/dist/assets/french-evUMlbbq-4izQyIk4.js +1 -0
  85. package/dist/assets/hierarchyDefinition-BbqnGEfR.js +2 -0
  86. package/dist/assets/hierarchyDefinition-BbqnGEfR.js.map +1 -0
  87. package/dist/assets/{index-NFrxkZjT.css → index-B7mmpKZd.css} +1 -1
  88. package/dist/assets/index-BRaeVAZb.js +4 -0
  89. package/dist/assets/{index-CDxzcoT1.js.map → index-BRaeVAZb.js.map} +1 -1
  90. package/dist/assets/interferenceMitigator-BtAQm-0d.js +2 -0
  91. package/dist/assets/interferenceMitigator-BtAQm-0d.js.map +1 -0
  92. package/dist/assets/logshim-YQI0WloD.js +2 -0
  93. package/dist/assets/logshim-YQI0WloD.js.map +1 -0
  94. package/dist/assets/math-DR3fXDcX-Bj6dcLDF.js +1 -0
  95. package/dist/assets/math-D_8HiEQR-CQynsoTm.js +34 -0
  96. package/dist/assets/{math-D_8HiEQR-DdtcYQLB.js.map → math-D_8HiEQR-CQynsoTm.js.map} +1 -1
  97. package/dist/assets/moment-DbT30ZpG.js +5 -0
  98. package/dist/assets/moment-DbT30ZpG.js.map +1 -0
  99. package/dist/assets/piano-BN5Btq91-onBUnVgA.js +1 -0
  100. package/dist/assets/piano-DF1g6yaX-vXbP1jX_.js +2 -0
  101. package/dist/assets/{piano-DF1g6yaX-B7f_kt1X.js.map → piano-DF1g6yaX-vXbP1jX_.js.map} +1 -1
  102. package/dist/assets/pitch-CgGJFkZ1-DVzOpIVa.js +2 -0
  103. package/dist/assets/{pitch-CgGJFkZ1-CuezrVTg.js.map → pitch-CgGJFkZ1-DVzOpIVa.js.map} +1 -1
  104. package/dist/assets/pitch-Dn0iNqiS-L2k4d66s.js +1 -0
  105. package/dist/assets/prescribed-Cjutx2ct.js +2 -0
  106. package/dist/assets/prescribed-Cjutx2ct.js.map +1 -0
  107. package/dist/assets/relativePriority-fx6BMJm9.js +2 -0
  108. package/dist/assets/relativePriority-fx6BMJm9.js.map +1 -0
  109. package/dist/assets/server-CUqWbXPL.js +2 -0
  110. package/dist/assets/server-CUqWbXPL.js.map +1 -0
  111. package/dist/assets/{sightsing-BFQ7HRig-CLh3Xcy7.js → sightsing-BFQ7HRig-CYuNcd8z.js} +23 -23
  112. package/dist/assets/{sightsing-BFQ7HRig-CLh3Xcy7.js.map → sightsing-BFQ7HRig-CYuNcd8z.js.map} +1 -1
  113. package/dist/assets/sightsing-CJX3k0Fd-C4-zGBSZ.js +1 -0
  114. package/dist/assets/srs-B3R2C3TU.js +2 -0
  115. package/dist/assets/srs-B3R2C3TU.js.map +1 -0
  116. package/dist/assets/srs-BD4FD2rw.js +1 -0
  117. package/dist/assets/tagRoles-jR-PJAgj.js +2 -0
  118. package/dist/assets/tagRoles-jR-PJAgj.js.map +1 -0
  119. package/dist/assets/typing-BevtfWlp-C0NbuTKI.js +2 -0
  120. package/dist/assets/{typing-BevtfWlp-B__x_Ia1.js.map → typing-BevtfWlp-C0NbuTKI.js.map} +1 -1
  121. package/dist/assets/typing-k-ojjO7G-gZjZ4YQx.js +1 -0
  122. package/dist/assets/userDBKeys-3SQjNVdK.js +4 -0
  123. package/dist/assets/userDBKeys-3SQjNVdK.js.map +1 -0
  124. package/dist/assets/userTagPreference-B23ZX5J4.js +2 -0
  125. package/dist/assets/userTagPreference-B23ZX5J4.js.map +1 -0
  126. package/dist/assets/validators-CnxSFY0I.js +2 -0
  127. package/dist/assets/validators-CnxSFY0I.js.map +1 -0
  128. package/dist/assets/word-work-BOnRlZgd-CsMkeNdI.js +2 -0
  129. package/dist/assets/{word-work-BOnRlZgd-CxcTzMPz.js.map → word-work-BOnRlZgd-CsMkeNdI.js.map} +1 -1
  130. package/dist/assets/word-work-Dd6tIKrt-WI45cKxO.js +1 -0
  131. package/dist/assets/{workbox-window.prod.es5-r2bRTooK.js → workbox-window.prod.es5-YsLcd14J.js} +1 -1
  132. package/dist/assets/{workbox-window.prod.es5-r2bRTooK.js.map → workbox-window.prod.es5-YsLcd14J.js.map} +1 -1
  133. package/dist/index.html +17 -7
  134. package/dist/sw.js +1 -1
  135. package/dist/sw.js.map +1 -1
  136. package/package.json +7 -7
  137. package/dist/assets/AdminDashboard-CO2rxkF5.js +0 -2
  138. package/dist/assets/AdminLearner-CZO2Hlk1.js +0 -2
  139. package/dist/assets/ClassroomCtrlPanel-cj6bokz5.js +0 -2
  140. package/dist/assets/CourseRouter-CMMxD9us.js +0 -7
  141. package/dist/assets/CourseWare-BTFRjgBR-C3wi5YHa.js +0 -3
  142. package/dist/assets/EloModeration-COgCrvb8.js +0 -2
  143. package/dist/assets/MarkdownRenderer-U_iPiA2x-DDruDu7E.js +0 -53
  144. package/dist/assets/MarkdownRenderer-U_iPiA2x-DDruDu7E.js.map +0 -1
  145. package/dist/assets/MarkdownRenderer-U_iPiA2x-VCa5mXh1.js +0 -1
  146. package/dist/assets/NewCourseDialog-C11dSwWM.js +0 -2
  147. package/dist/assets/RequestPasswordReset-vTzfGItp.js +0 -2
  148. package/dist/assets/ResetPassword-CmGaVYsI.js +0 -2
  149. package/dist/assets/Study-CkJvraIv.js +0 -2
  150. package/dist/assets/TagInformation-xZcQ1C1t.js +0 -2
  151. package/dist/assets/User-MzKFSneO.js +0 -3
  152. package/dist/assets/User-MzKFSneO.js.map +0 -1
  153. package/dist/assets/UserStats-CioNBbmL.js +0 -2
  154. package/dist/assets/VerifyEmail-Bh-T9191.js +0 -2
  155. package/dist/assets/admin-Dt07rW2C.js +0 -21
  156. package/dist/assets/admin-Dt07rW2C.js.map +0 -1
  157. package/dist/assets/chess-E2uOAyQS-C8213VIQ.js +0 -7
  158. package/dist/assets/chess-Lfm7Fsvs-6ElY3d5h.js +0 -1
  159. package/dist/assets/common-ui.es-B9r6QiWN.js +0 -38
  160. package/dist/assets/common-ui.es-B9r6QiWN.js.map +0 -1
  161. package/dist/assets/common-ui.es-j6sezLNk.js +0 -1
  162. package/dist/assets/dist-BeppzTWu.js +0 -380
  163. package/dist/assets/dist-BeppzTWu.js.map +0 -1
  164. package/dist/assets/dist-C1hpwy00.js +0 -1
  165. package/dist/assets/dist-CKO_fXB-.js +0 -18
  166. package/dist/assets/dist-CKO_fXB-.js.map +0 -1
  167. package/dist/assets/dist-CkRURFlm.js +0 -1
  168. package/dist/assets/dist-V9Xbab2f.js +0 -12
  169. package/dist/assets/dist-V9Xbab2f.js.map +0 -1
  170. package/dist/assets/edit-ui.es-B00e6OcT.js +0 -36
  171. package/dist/assets/edit-ui.es-B00e6OcT.js.map +0 -1
  172. package/dist/assets/edit-ui.es-BGTYLTZO.js +0 -1
  173. package/dist/assets/french-Dk7YG8Td-D9eV2DXL.js +0 -2
  174. package/dist/assets/french-evUMlbbq-DOmp0PEx.js +0 -1
  175. package/dist/assets/index-CDxzcoT1.js +0 -4
  176. package/dist/assets/math-DR3fXDcX-Clr1rrj8.js +0 -1
  177. package/dist/assets/math-D_8HiEQR-DdtcYQLB.js +0 -34
  178. package/dist/assets/piano-BN5Btq91-BO9b38qV.js +0 -1
  179. package/dist/assets/piano-DF1g6yaX-B7f_kt1X.js +0 -2
  180. package/dist/assets/pitch-CgGJFkZ1-CuezrVTg.js +0 -2
  181. package/dist/assets/pitch-Dn0iNqiS-L0LRhcjZ.js +0 -1
  182. package/dist/assets/server-BP-NvFg7.js +0 -2
  183. package/dist/assets/server-BP-NvFg7.js.map +0 -1
  184. package/dist/assets/sightsing-CJX3k0Fd-DiVzeNly.js +0 -1
  185. package/dist/assets/typing-BevtfWlp-B__x_Ia1.js +0 -2
  186. package/dist/assets/typing-k-ojjO7G-Dn4uH4pS.js +0 -1
  187. package/dist/assets/word-work-BOnRlZgd-CxcTzMPz.js +0 -2
  188. package/dist/assets/word-work-Dd6tIKrt-BOmhWlr6.js +0 -1
  189. /package/dist/assets/{common-ui-BY2Ut5jf.css → dist-BY2Ut5jf.css} +0 -0
@@ -0,0 +1,2 @@
1
+ import"./chunk-D6hFPZc3.js";import{t as e}from"./defineProperty-y9rbOPYz.js";import{s as t}from"./elo-B5qCwvSC.js";import{l as n}from"./PipelineDebugger-DhnKlMgD.js";var r,i=10,a=3,o=.8,s=(r=class InterferenceMitigatorNavigator extends n{constructor(t,n,r){super(t,n,r),e(this,`config`,void 0),e(this,`name`,void 0),e(this,`kind`,InterferenceMitigatorNavigator.kind),e(this,`interferenceMap`,void 0),this.config=this.parseConfig(r.serializedData),this.interferenceMap=this.buildInterferenceMap(),this.name=r.name||`Interference Mitigator`}parseConfig(e){try{let t=JSON.parse(e),n=t.interferenceSets||[];return n.length>0&&Array.isArray(n[0])&&(n=n.map(e=>({tags:e}))),{interferenceSets:n,maturityThreshold:{minCount:t.maturityThreshold?.minCount??i,minElo:t.maturityThreshold?.minElo,minElapsedDays:t.maturityThreshold?.minElapsedDays??a},defaultDecay:t.defaultDecay??o}}catch{return{interferenceSets:[],maturityThreshold:{minCount:i,minElapsedDays:a},defaultDecay:o}}}buildInterferenceMap(){let e=new Map;for(let t of this.config.interferenceSets){let n=t.decay??this.config.defaultDecay??o;for(let r of t.tags){e.has(r)||e.set(r,[]);let i=e.get(r);for(let e of t.tags)if(e!==r){let t=i.find(t=>t.partner===e);t?t.decay=Math.max(t.decay,n):i.push({partner:e,decay:n})}}}return e}async getImmatureTags(e){let n=new Set;try{let r=t((await e.user.getCourseRegDoc(e.course.getCourseID())).elo),o=this.config.maturityThreshold?.minCount??i,s=this.config.maturityThreshold?.minElo,c=(this.config.maturityThreshold?.minElapsedDays??a)*2;for(let[e,t]of Object.entries(r.tags)){if(t.count===0)continue;let r=t.count<o,i=s!==void 0&&t.score<s,a=t.count<c;(r||i||a)&&n.add(e)}}catch{}return n}getTagsToAvoid(e){let t=new Map;for(let n of e){let r=this.interferenceMap.get(n);if(r){for(let{partner:n,decay:i}of r)if(!e.has(n)){let e=t.get(n)??0;t.set(n,Math.max(e,i))}}}return t}computeInterferenceEffect(e,t,n){if(t.size===0)return{multiplier:1,interferingTags:[],reason:`No interference detected`};let r=1,i=[];for(let n of e){let e=t.get(n);e!==void 0&&(i.push(n),r*=1-e)}if(i.length===0)return{multiplier:1,interferingTags:[],reason:`No interference detected`};let a=new Set;for(let e of i)for(let t of n)this.interferenceMap.get(t)?.some(t=>t.partner===e)&&a.add(t);let o=`Interferes with immature tags ${Array.from(a).join(`, `)} (tags: ${i.join(`, `)}, multiplier: ${r.toFixed(2)})`;return{multiplier:r,interferingTags:i,reason:o}}async transform(e,t){let n=await this.getImmatureTags(t),r=this.getTagsToAvoid(n),i=[];for(let t of e){let e=t.tags??[],{multiplier:a,reason:o}=this.computeInterferenceEffect(e,r,n),s=t.score*a,c=a<1?`penalized`:a>1?`boosted`:`passed`;i.push({...t,score:s,provenance:[...t.provenance,{strategy:`interferenceMitigator`,strategyName:this.strategyName||this.name,strategyId:this.strategyId||`NAVIGATION_STRATEGY-interference`,action:c,score:s,reason:o}]})}return i}async getWeightedCards(e){throw Error(`InterferenceMitigatorNavigator is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().`)}},e(r,`kind`,`signal`),r);export{s as default};
2
+ //# sourceMappingURL=interferenceMitigator-BtAQm-0d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interferenceMitigator-BtAQm-0d.js","names":[],"sources":["../../../db/dist/core/navigators/filters/interferenceMitigator.mjs"],"sourcesContent":["import \"../../../_virtual/_rolldown/runtime.mjs\";\nimport { ContentNavigator } from \"../index.mjs\";\nimport { toCourseElo } from \"@vue-skuilder/common\";\n//#region src/core/navigators/filters/interferenceMitigator.ts\nconst DEFAULT_MIN_COUNT = 10;\nconst DEFAULT_MIN_ELAPSED_DAYS = 3;\nconst DEFAULT_INTERFERENCE_DECAY = .8;\n/**\n* A filter strategy that avoids introducing confusable concepts simultaneously.\n*\n* When a user is learning a concept (tag is \"immature\"), this strategy reduces\n* scores for cards tagged with interfering concepts. This encourages the system\n* to introduce new content that is maximally distant from current learning focus.\n*\n* Example: While learning 'd', prefer introducing 'x' over 'b' (visual interference)\n* or 't' (phonetic interference).\n*\n* Implements CardFilter for use in Pipeline architecture.\n* Also extends ContentNavigator for backward compatibility.\n*/\nvar InterferenceMitigatorNavigator = class InterferenceMitigatorNavigator extends ContentNavigator {\n\tconfig;\n\t/** Human-readable name for CardFilter interface */\n\tname;\n\t/** See CardFilter.kind. Static, so the pipeline plan can read it without an instance. */\n\tstatic kind = \"signal\";\n\tkind = InterferenceMitigatorNavigator.kind;\n\t/** Precomputed map: tag -> set of { partner, decay } it interferes with */\n\tinterferenceMap;\n\tconstructor(user, course, strategyData) {\n\t\tsuper(user, course, strategyData);\n\t\tthis.config = this.parseConfig(strategyData.serializedData);\n\t\tthis.interferenceMap = this.buildInterferenceMap();\n\t\tthis.name = strategyData.name || \"Interference Mitigator\";\n\t}\n\tparseConfig(serializedData) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(serializedData);\n\t\t\tlet sets = parsed.interferenceSets || [];\n\t\t\tif (sets.length > 0 && Array.isArray(sets[0])) sets = sets.map((tags) => ({ tags }));\n\t\t\treturn {\n\t\t\t\tinterferenceSets: sets,\n\t\t\t\tmaturityThreshold: {\n\t\t\t\t\tminCount: parsed.maturityThreshold?.minCount ?? DEFAULT_MIN_COUNT,\n\t\t\t\t\tminElo: parsed.maturityThreshold?.minElo,\n\t\t\t\t\tminElapsedDays: parsed.maturityThreshold?.minElapsedDays ?? DEFAULT_MIN_ELAPSED_DAYS\n\t\t\t\t},\n\t\t\t\tdefaultDecay: parsed.defaultDecay ?? DEFAULT_INTERFERENCE_DECAY\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tinterferenceSets: [],\n\t\t\t\tmaturityThreshold: {\n\t\t\t\t\tminCount: DEFAULT_MIN_COUNT,\n\t\t\t\t\tminElapsedDays: DEFAULT_MIN_ELAPSED_DAYS\n\t\t\t\t},\n\t\t\t\tdefaultDecay: DEFAULT_INTERFERENCE_DECAY\n\t\t\t};\n\t\t}\n\t}\n\t/**\n\t* Build a map from each tag to its interference partners with decay coefficients.\n\t* If tags A, B, C are in an interference group with decay 0.8, then:\n\t* - A interferes with B (decay 0.8) and C (decay 0.8)\n\t* - B interferes with A (decay 0.8) and C (decay 0.8)\n\t* - etc.\n\t*/\n\tbuildInterferenceMap() {\n\t\tconst map = /* @__PURE__ */ new Map();\n\t\tfor (const group of this.config.interferenceSets) {\n\t\t\tconst decay = group.decay ?? this.config.defaultDecay ?? DEFAULT_INTERFERENCE_DECAY;\n\t\t\tfor (const tag of group.tags) {\n\t\t\t\tif (!map.has(tag)) map.set(tag, []);\n\t\t\t\tconst partners = map.get(tag);\n\t\t\t\tfor (const other of group.tags) if (other !== tag) {\n\t\t\t\t\tconst existing = partners.find((p) => p.partner === other);\n\t\t\t\t\tif (existing) existing.decay = Math.max(existing.decay, decay);\n\t\t\t\t\telse partners.push({\n\t\t\t\t\t\tpartner: other,\n\t\t\t\t\t\tdecay\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn map;\n\t}\n\t/**\n\t* Get the set of tags that are currently immature for this user.\n\t* A tag is immature if the user has interacted with it but hasn't\n\t* reached the maturity threshold.\n\t*/\n\tasync getImmatureTags(context) {\n\t\tconst immature = /* @__PURE__ */ new Set();\n\t\ttry {\n\t\t\tconst userElo = toCourseElo((await context.user.getCourseRegDoc(context.course.getCourseID())).elo);\n\t\t\tconst minCount = this.config.maturityThreshold?.minCount ?? DEFAULT_MIN_COUNT;\n\t\t\tconst minElo = this.config.maturityThreshold?.minElo;\n\t\t\tconst minCountForElapsed = (this.config.maturityThreshold?.minElapsedDays ?? DEFAULT_MIN_ELAPSED_DAYS) * 2;\n\t\t\tfor (const [tagId, tagElo] of Object.entries(userElo.tags)) {\n\t\t\t\tif (tagElo.count === 0) continue;\n\t\t\t\tconst belowCount = tagElo.count < minCount;\n\t\t\t\tconst belowElo = minElo !== void 0 && tagElo.score < minElo;\n\t\t\t\tconst belowElapsed = tagElo.count < minCountForElapsed;\n\t\t\t\tif (belowCount || belowElo || belowElapsed) immature.add(tagId);\n\t\t\t}\n\t\t} catch {}\n\t\treturn immature;\n\t}\n\t/**\n\t* Get all tags that interfere with any immature tag, along with their decay coefficients.\n\t* These are the tags we want to avoid introducing.\n\t*/\n\tgetTagsToAvoid(immatureTags) {\n\t\tconst avoid = /* @__PURE__ */ new Map();\n\t\tfor (const immatureTag of immatureTags) {\n\t\t\tconst partners = this.interferenceMap.get(immatureTag);\n\t\t\tif (partners) {\n\t\t\t\tfor (const { partner, decay } of partners) if (!immatureTags.has(partner)) {\n\t\t\t\t\tconst existing = avoid.get(partner) ?? 0;\n\t\t\t\t\tavoid.set(partner, Math.max(existing, decay));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn avoid;\n\t}\n\t/**\n\t* Compute interference score reduction for a card.\n\t* Returns: { multiplier, interfering tags, reason }\n\t*/\n\tcomputeInterferenceEffect(cardTags, tagsToAvoid, immatureTags) {\n\t\tif (tagsToAvoid.size === 0) return {\n\t\t\tmultiplier: 1,\n\t\t\tinterferingTags: [],\n\t\t\treason: \"No interference detected\"\n\t\t};\n\t\tlet multiplier = 1;\n\t\tconst interferingTags = [];\n\t\tfor (const tag of cardTags) {\n\t\t\tconst decay = tagsToAvoid.get(tag);\n\t\t\tif (decay !== void 0) {\n\t\t\t\tinterferingTags.push(tag);\n\t\t\t\tmultiplier *= 1 - decay;\n\t\t\t}\n\t\t}\n\t\tif (interferingTags.length === 0) return {\n\t\t\tmultiplier: 1,\n\t\t\tinterferingTags: [],\n\t\t\treason: \"No interference detected\"\n\t\t};\n\t\tconst causingTags = /* @__PURE__ */ new Set();\n\t\tfor (const tag of interferingTags) for (const immatureTag of immatureTags) if (this.interferenceMap.get(immatureTag)?.some((p) => p.partner === tag)) causingTags.add(immatureTag);\n\t\tconst reason = `Interferes with immature tags ${Array.from(causingTags).join(\", \")} (tags: ${interferingTags.join(\", \")}, multiplier: ${multiplier.toFixed(2)})`;\n\t\treturn {\n\t\t\tmultiplier,\n\t\t\tinterferingTags,\n\t\t\treason\n\t\t};\n\t}\n\t/**\n\t* CardFilter.transform implementation.\n\t*\n\t* Apply interference-aware scoring. Cards with tags that interfere with\n\t* immature learnings get reduced scores.\n\t*/\n\tasync transform(cards, context) {\n\t\tconst immatureTags = await this.getImmatureTags(context);\n\t\tconst tagsToAvoid = this.getTagsToAvoid(immatureTags);\n\t\tconst adjusted = [];\n\t\tfor (const card of cards) {\n\t\t\tconst cardTags = card.tags ?? [];\n\t\t\tconst { multiplier, reason } = this.computeInterferenceEffect(cardTags, tagsToAvoid, immatureTags);\n\t\t\tconst finalScore = card.score * multiplier;\n\t\t\tconst action = multiplier < 1 ? \"penalized\" : multiplier > 1 ? \"boosted\" : \"passed\";\n\t\t\tadjusted.push({\n\t\t\t\t...card,\n\t\t\t\tscore: finalScore,\n\t\t\t\tprovenance: [...card.provenance, {\n\t\t\t\t\tstrategy: \"interferenceMitigator\",\n\t\t\t\t\tstrategyName: this.strategyName || this.name,\n\t\t\t\t\tstrategyId: this.strategyId || \"NAVIGATION_STRATEGY-interference\",\n\t\t\t\t\taction,\n\t\t\t\t\tscore: finalScore,\n\t\t\t\t\treason\n\t\t\t\t}]\n\t\t\t});\n\t\t}\n\t\treturn adjusted;\n\t}\n\t/**\n\t* Legacy getWeightedCards - now throws as filters should not be used as generators.\n\t*\n\t* Use transform() via Pipeline instead.\n\t*/\n\tasync getWeightedCards(_limit) {\n\t\tthrow new Error(\"InterferenceMitigatorNavigator is a filter and should not be used as a generator. Use Pipeline with a generator and this filter via transform().\");\n\t}\n};\n//#endregion\nexport { InterferenceMitigatorNavigator as default };\n\n//# sourceMappingURL=interferenceMitigator.mjs.map"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import"./chunk-D6hFPZc3.js";var log=(...e)=>{console.log(...e)};export{log as t};
2
+ //# sourceMappingURL=logshim-YQI0WloD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logshim-YQI0WloD.js","names":[],"sources":["../../../common/dist/logshim.mjs"],"sourcesContent":["export const log = (...args) => {\n // eslint-disable-next-line no-console\n console.log(...args);\n};\n//# sourceMappingURL=logshim.mjs.map\n"],"mappings":"4BAAA,IAAa,KAAO,GAAG,IAAS,CAE5B,QAAQ,IAAI,GAAG,EAAK"}
@@ -0,0 +1 @@
1
+ import"./vue.runtime.esm-bundler--Fxmd6l9.js";import"./MarkdownRenderer-borh39Lq.js";import"./moment-DbT30ZpG.js";import"./dist-C8EQUxWW.js";import"./contentSource-FGhM_ge8.js";import"./dist-DGbpjpKB.js";import"./CourseWare-BTFRjgBR-lpqcYpAW.js";import"./PipelineDebugger-DhnKlMgD.js";import"./eloDistance-CRxxdYPJ.js";import{t as e}from"./math-D_8HiEQR-CQynsoTm.js";export{e as default};