@vue-skuilder/common-ui 0.2.28 → 0.2.29

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.
@@ -1,19 +1,20 @@
1
- import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, nextTick as l, normalizeClass as u, onMounted as d, openBlock as f, ref as p, renderList as m, resolveComponent as h, shallowRef as g, toDisplayString as _, unref as v, watch as y, withCtx as b, withKeys as x } from "vue";
2
- import { SESSION_FLAGS as S, cardDossiers as C, dumpFileName as w, eloLedger as T, fetchLearnerDump as E, fmtAnswer as D, fmtDelta as O, fmtDuration as k, fromDump as A, isSkillTag as j, parseLearnerDump as M, recordPerformance as N, runText as P, scoredTagDeltas as F, servedTags as I, sessionDetail as L, sessionText as R, shortTag as z, summarizeSessions as B } from "@vue-skuilder/db/diagnostics";
1
+ import { Fragment as e, computed as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createTextVNode as o, createVNode as s, defineComponent as c, nextTick as l, normalizeClass as u, normalizeStyle as d, onMounted as f, openBlock as p, ref as m, renderList as h, resolveComponent as g, shallowRef as _, toDisplayString as v, unref as y, watch as b, withCtx as x, withKeys as S } from "vue";
2
+ import { SESSION_FLAGS as C, cardDossiers as w, dumpFileName as T, eloLedger as E, fetchLearnerDump as D, fmtAnswer as O, fmtDelta as k, fmtDuration as A, fromDump as j, isSkillTag as M, parseLearnerDump as N, pipelineRunStats as P, recordPerformance as F, regulatorText as I, runText as L, scoredTagDeltas as R, servedTags as z, sessionDetail as B, sessionText as V, shortTag as H, summarizeSessions as U } from "@vue-skuilder/db/diagnostics";
3
+ import { PIPELINE_STAGES as W, planPipeline as ee } from "@vue-skuilder/db";
3
4
  //#region \0rolldown/runtime.js
4
- var V = Object.defineProperty, __name = (e, t) => V(e, "name", {
5
+ var te = Object.defineProperty, __name = (e, t) => te(e, "name", {
5
6
  value: t,
6
7
  configurable: !0
7
8
  });
8
9
  //#endregion
9
10
  //#region src/admin/composables/useLearnerDataset.ts
10
11
  function useLearnerDataset() {
11
- let e = g(null), t = g(null), n = p(!1), r = p(null);
12
+ let e = _(null), t = _(null), n = m(!1), r = m(null);
12
13
  async function load(i, a) {
13
14
  n.value = !0, r.value = null;
14
15
  try {
15
16
  let n = await i();
16
- t.value = A(n, a), e.value = n;
17
+ t.value = j(n, a), e.value = n;
17
18
  } catch (e) {
18
19
  r.value = e instanceof Error ? e.message : String(e);
19
20
  } finally {
@@ -21,13 +22,13 @@ function useLearnerDataset() {
21
22
  }
22
23
  }
23
24
  function loadFromCouch(e) {
24
- return load(() => E({
25
+ return load(() => D({
25
26
  ...e,
26
27
  auth: { kind: "cookie" }
27
28
  }), e.courseId);
28
29
  }
29
30
  function loadFromFile(e, t) {
30
- return load(async () => M(await e.text()), t);
31
+ return load(async () => N(await e.text()), t);
31
32
  }
32
33
  return {
33
34
  dump: e,
@@ -40,14 +41,14 @@ function useLearnerDataset() {
40
41
  }
41
42
  function downloadLearnerDump(e) {
42
43
  let t = new Blob([JSON.stringify(e, null, 2)], { type: "application/json" }), n = URL.createObjectURL(t), r = document.createElement("a");
43
- r.href = n, r.download = w(e), r.click(), URL.revokeObjectURL(n);
44
+ r.href = n, r.download = T(e), r.click(), URL.revokeObjectURL(n);
44
45
  }
45
46
  //#endregion
46
47
  //#region src/admin/components/LearnerDatasetSource.vue?vue&type=script&setup=true&lang.ts
47
- var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
48
+ var ne = { class: "d-flex flex-wrap align-center ga-2" }, re = {
48
49
  key: 1,
49
50
  class: "d-flex flex-wrap align-center ga-2 mt-3"
50
- }, W = /* @__PURE__ */ c({
51
+ }, ie = /* @__PURE__ */ c({
51
52
  __name: "LearnerDatasetSource",
52
53
  props: {
53
54
  couchUrl: {},
@@ -57,8 +58,8 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
57
58
  },
58
59
  emits: ["loaded"],
59
60
  setup(c, { emit: l }) {
60
- let u = c, m = l, { dump: g, dataset: S, loading: C, error: w, loadFromCouch: T, loadFromFile: E } = useLearnerDataset(), D = p(u.initialUsername ?? ""), O = p(null), k = t(() => {
61
- let e = S.value?.sessions ?? [];
61
+ let u = c, d = l, { dump: h, dataset: _, loading: C, error: w, loadFromCouch: T, loadFromFile: E } = useLearnerDataset(), D = m(u.initialUsername ?? ""), O = m(null), k = t(() => {
62
+ let e = _.value?.sessions ?? [];
62
63
  return e.length ? `${e[0].startTime.slice(0, 10)} .. ${e[e.length - 1].startTime.slice(0, 10)}` : "";
63
64
  });
64
65
  function loadLive() {
@@ -72,16 +73,16 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
72
73
  let t = e.target, n = t.files?.[0];
73
74
  n && E(n, u.courseId), t.value = "";
74
75
  }
75
- return y(S, (e) => {
76
- e && g.value && m("loaded", e, g.value);
77
- }), d(() => {
76
+ return b(_, (e) => {
77
+ e && h.value && d("loaded", e, h.value);
78
+ }), f(() => {
78
79
  u.autoload && loadLive();
79
80
  }), (t, c) => {
80
- let l = h("v-text-field"), u = h("v-btn"), d = h("v-alert"), p = h("v-spacer"), m = h("v-card-text"), y = h("v-card");
81
- return f(), n(y, { variant: "outlined" }, {
82
- default: b(() => [s(m, null, {
83
- default: b(() => [
84
- a("div", H, [
81
+ let l = g("v-text-field"), u = g("v-btn"), d = g("v-alert"), f = g("v-spacer"), m = g("v-card-text"), b = g("v-card");
82
+ return p(), n(b, { variant: "outlined" }, {
83
+ default: x(() => [s(m, null, {
84
+ default: x(() => [
85
+ a("div", ne, [
85
86
  s(l, {
86
87
  modelValue: D.value,
87
88
  "onUpdate:modelValue": c[0] || (c[0] = (e) => D.value = e),
@@ -90,15 +91,15 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
90
91
  "hide-details": "",
91
92
  style: { "max-width": "16rem" },
92
93
  disabled: !t.couchUrl || !t.courseId,
93
- onKeydown: x(loadLive, ["enter"])
94
+ onKeydown: S(loadLive, ["enter"])
94
95
  }, null, 8, ["modelValue", "disabled"]),
95
96
  s(u, {
96
97
  color: "primary",
97
- loading: v(C),
98
+ loading: y(C),
98
99
  disabled: !t.couchUrl || !t.courseId || !D.value,
99
100
  onClick: loadLive
100
101
  }, {
101
- default: b(() => c[3] || (c[3] = [o(" Load ")])),
102
+ default: x(() => c[3] || (c[3] = [o(" Load ")])),
102
103
  _: 1
103
104
  }, 8, ["loading", "disabled"]),
104
105
  c[5] || (c[5] = a("span", { class: "text-medium-emphasis mx-2" }, "or", -1)),
@@ -107,7 +108,7 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
107
108
  "prepend-icon": "mdi-file-upload-outline",
108
109
  onClick: c[1] || (c[1] = (e) => O.value?.click())
109
110
  }, {
110
- default: b(() => c[4] || (c[4] = [o(" Open dump file ")])),
111
+ default: x(() => c[4] || (c[4] = [o(" Open dump file ")])),
111
112
  _: 1
112
113
  }),
113
114
  a("input", {
@@ -119,32 +120,32 @@ var H = { class: "d-flex flex-wrap align-center ga-2" }, U = {
119
120
  onChange: onFile
120
121
  }, null, 544)
121
122
  ]),
122
- v(w) ? (f(), n(d, {
123
+ y(w) ? (p(), n(d, {
123
124
  key: 0,
124
125
  type: "error",
125
126
  variant: "tonal",
126
127
  density: "compact",
127
128
  class: "mt-3"
128
129
  }, {
129
- default: b(() => [o(_(v(w)), 1)]),
130
+ default: x(() => [o(v(y(w)), 1)]),
130
131
  _: 1
131
132
  })) : r("", !0),
132
- v(S) && v(g) ? (f(), i("div", U, [
133
+ y(_) && y(h) ? (p(), i("div", re, [
133
134
  a("span", null, [
134
- a("strong", null, _(v(S).username), 1),
135
- o(" · " + _(v(S).sessions.length) + " sessions ", 1),
136
- k.value ? (f(), i(e, { key: 0 }, [o("(" + _(k.value) + ")", 1)], 64)) : r("", !0),
137
- o(" · " + _(v(S).cardHistories.length) + " cards seen · as of " + _(v(S).asOf.slice(0, 16)) + "Z ", 1),
138
- v(S).cards ? r("", !0) : (f(), i(e, { key: 1 }, [o("· no course slice")], 64))
135
+ a("strong", null, v(y(_).username), 1),
136
+ o(" · " + v(y(_).sessions.length) + " sessions ", 1),
137
+ k.value ? (p(), i(e, { key: 0 }, [o("(" + v(k.value) + ")", 1)], 64)) : r("", !0),
138
+ o(" · " + v(y(_).cardHistories.length) + " cards seen · as of " + v(y(_).asOf.slice(0, 16)) + "Z ", 1),
139
+ y(_).cards ? r("", !0) : (p(), i(e, { key: 1 }, [o("· no course slice")], 64))
139
140
  ]),
140
- s(p),
141
+ s(f),
141
142
  s(u, {
142
143
  variant: "text",
143
144
  size: "small",
144
145
  "prepend-icon": "mdi-download",
145
- onClick: c[2] || (c[2] = (e) => v(downloadLearnerDump)(v(g)))
146
+ onClick: c[2] || (c[2] = (e) => y(downloadLearnerDump)(y(h)))
146
147
  }, {
147
- default: b(() => c[6] || (c[6] = [o(" Save dump ")])),
148
+ default: x(() => c[6] || (c[6] = [o(" Save dump ")])),
148
149
  _: 1
149
150
  })
150
151
  ])) : r("", !0)
@@ -202,7 +203,7 @@ function shortId(e, t = 28) {
202
203
  return e.length > t ? `…${e.slice(-(t - 2))}` : e;
203
204
  }
204
205
  function useCopy() {
205
- let e = p(null), t = null;
206
+ let e = m(null), t = null;
206
207
  async function copy(n, r) {
207
208
  try {
208
209
  await navigator.clipboard.writeText(n), e.value = r, t && clearTimeout(t), t = setTimeout(() => e.value = null, 1400);
@@ -217,22 +218,22 @@ function useCopy() {
217
218
  }
218
219
  //#endregion
219
220
  //#region src/admin/components/CardDossierDetail.vue?vue&type=script&setup=true&lang.ts
220
- var ee = {
221
+ var ae = {
221
222
  key: 0,
222
223
  class: "text-caption mb-2"
223
- }, te = { class: "text-medium-emphasis" }, ne = { class: "d-flex flex-wrap mb-2 ga-1" }, re = {
224
+ }, oe = { class: "text-medium-emphasis" }, se = { class: "d-flex flex-wrap mb-2 ga-1" }, ce = {
224
225
  key: 0,
225
226
  class: "text-caption text-disabled"
226
- }, ie = { class: "text-caption text-medium-emphasis mb-2" }, ae = {
227
+ }, le = { class: "text-caption text-medium-emphasis mb-2" }, ue = {
227
228
  key: 0,
228
229
  class: "text-error"
229
- }, oe = { class: "text-no-wrap" }, se = {
230
+ }, de = { class: "text-no-wrap" }, fe = {
230
231
  key: 2,
231
232
  class: "text-disabled"
232
- }, K = {
233
+ }, pe = {
233
234
  class: "text-truncate",
234
235
  style: { "max-width": "200px" }
235
- }, ce = /* @__PURE__ */ c({
236
+ }, me = /* @__PURE__ */ c({
236
237
  __name: "CardDossierDetail",
237
238
  props: {
238
239
  dossier: {},
@@ -240,34 +241,34 @@ var ee = {
240
241
  },
241
242
  setup(t) {
242
243
  function perf(e) {
243
- let t = N(e);
244
+ let t = F(e);
244
245
  return t === null ? "—" : t.toFixed(2);
245
246
  }
246
247
  function fmtInterval(e) {
247
248
  return e ? e < 3600 ? `${Math.round(e / 60)}m` : e < 86400 ? `${Math.round(e / 3600)}h` : `${Math.round(e / 86400)}d` : "none";
248
249
  }
249
250
  return (t, c) => {
250
- let l = h("v-chip"), d = h("v-icon"), p = h("v-table");
251
- return f(), i("div", null, [
252
- t.dossier.card && Object.keys(t.dossier.card.data).length ? (f(), i("div", ee, [(f(!0), i(e, null, m(t.dossier.card.data, (e, t) => (f(), i("span", {
251
+ let l = g("v-chip"), d = g("v-icon"), f = g("v-table");
252
+ return p(), i("div", null, [
253
+ t.dossier.card && Object.keys(t.dossier.card.data).length ? (p(), i("div", ae, [(p(!0), i(e, null, h(t.dossier.card.data, (e, t) => (p(), i("span", {
253
254
  key: t,
254
255
  class: "mr-3"
255
- }, [a("span", te, _(t) + ":", 1), o(" " + _(v(D)(e, 60)), 1)]))), 128))])) : r("", !0),
256
- a("div", ne, [(f(!0), i(e, null, m(t.dossier.card?.tags ?? [], (e) => (f(), n(l, {
256
+ }, [a("span", oe, v(t) + ":", 1), o(" " + v(y(O)(e, 60)), 1)]))), 128))])) : r("", !0),
257
+ a("div", se, [(p(!0), i(e, null, h(t.dossier.card?.tags ?? [], (e) => (p(), n(l, {
257
258
  key: e,
258
259
  size: "x-small",
259
260
  variant: "outlined",
260
- color: v(j)(t.interpreters, e) ? "primary" : void 0
261
+ color: y(M)(t.interpreters, e) ? "primary" : void 0
261
262
  }, {
262
- default: b(() => [o(_(e), 1)]),
263
+ default: x(() => [o(v(e), 1)]),
263
264
  _: 2
264
- }, 1032, ["color"]))), 128)), t.dossier.card ? r("", !0) : (f(), i("span", re, "no course data in this dataset"))]),
265
- a("div", ie, [o(" lapses " + _(t.dossier.lapses) + " · streak " + _(t.dossier.streak) + " · best interval " + _(fmtInterval(t.dossier.bestIntervalSeconds)) + " · ", 1), t.dossier.pendingReview ? (f(), i(e, { key: 0 }, [o(" next review " + _(v(fmtTime)(t.dossier.pendingReview.reviewTime)) + " ", 1), t.dossier.pendingReview.overdue ? (f(), i("span", ae, "(overdue)")) : r("", !0)], 64)) : (f(), i(e, { key: 1 }, [o("no review scheduled")], 64))]),
266
- s(p, {
265
+ }, 1032, ["color"]))), 128)), t.dossier.card ? r("", !0) : (p(), i("span", ce, "no course data in this dataset"))]),
266
+ a("div", le, [o(" lapses " + v(t.dossier.lapses) + " · streak " + v(t.dossier.streak) + " · best interval " + v(fmtInterval(t.dossier.bestIntervalSeconds)) + " · ", 1), t.dossier.pendingReview ? (p(), i(e, { key: 0 }, [o(" next review " + v(y(fmtTime)(t.dossier.pendingReview.reviewTime)) + " ", 1), t.dossier.pendingReview.overdue ? (p(), i("span", ue, "(overdue)")) : r("", !0)], 64)) : (p(), i(e, { key: 1 }, [o("no review scheduled")], 64))]),
267
+ s(f, {
267
268
  density: "compact",
268
269
  class: "sk-record-table"
269
270
  }, {
270
- default: b(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
271
+ default: x(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
271
272
  a("th", null, "#"),
272
273
  a("th", null, "When"),
273
274
  a("th", null, "Result"),
@@ -275,51 +276,51 @@ var ee = {
275
276
  a("th", null, "Prior att."),
276
277
  a("th", null, "Time"),
277
278
  a("th", null, "Answer")
278
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(t.dossier.records, (e, t) => (f(), i("tr", {
279
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.dossier.records, (e, t) => (p(), i("tr", {
279
280
  key: t,
280
281
  class: u(e.isCorrect === !1 ? "sk-fail-row" : "")
281
282
  }, [
282
- a("td", null, _(t + 1), 1),
283
- a("td", oe, _(v(fmtTime)(e.timeStamp)), 1),
284
- a("td", null, [e.isCorrect === !0 ? (f(), n(d, {
283
+ a("td", null, v(t + 1), 1),
284
+ a("td", de, v(y(fmtTime)(e.timeStamp)), 1),
285
+ a("td", null, [e.isCorrect === !0 ? (p(), n(d, {
285
286
  key: 0,
286
287
  size: "small",
287
288
  color: "success"
288
289
  }, {
289
- default: b(() => c[0] || (c[0] = [o("mdi-check")])),
290
+ default: x(() => c[0] || (c[0] = [o("mdi-check")])),
290
291
  _: 1
291
- })) : e.isCorrect === !1 ? (f(), n(d, {
292
+ })) : e.isCorrect === !1 ? (p(), n(d, {
292
293
  key: 1,
293
294
  size: "small",
294
295
  color: "error"
295
296
  }, {
296
- default: b(() => c[1] || (c[1] = [o("mdi-close")])),
297
+ default: x(() => c[1] || (c[1] = [o("mdi-close")])),
297
298
  _: 1
298
- })) : (f(), i("span", se, "—"))]),
299
- a("td", null, _(perf(e)), 1),
300
- a("td", null, _(e.priorAttemps ?? "—"), 1),
301
- a("td", null, _(((e.timeSpent ?? 0) / 1e3).toFixed(1)) + "s", 1),
302
- a("td", K, _(v(D)(e.userAnswer)), 1)
299
+ })) : (p(), i("span", fe, "—"))]),
300
+ a("td", null, v(perf(e)), 1),
301
+ a("td", null, v(e.priorAttemps ?? "—"), 1),
302
+ a("td", null, v(((e.timeSpent ?? 0) / 1e3).toFixed(1)) + "s", 1),
303
+ a("td", pe, v(y(O)(e.userAnswer)), 1)
303
304
  ], 2))), 128))])]),
304
305
  _: 1
305
306
  })
306
307
  ]);
307
308
  };
308
309
  }
309
- }), q = /* @__PURE__ */ __name((e, t) => {
310
+ }), K = /* @__PURE__ */ __name((e, t) => {
310
311
  let n = e.__vccOpts || e;
311
312
  for (let [e, r] of t) n[e] = r;
312
313
  return n;
313
- }, "default"), J = /* @__PURE__ */ q(ce, [["__scopeId", "data-v-76b0a622"]]), le = { class: "text-caption text-medium-emphasis mb-4" }, ue = { class: "text-h6" }, de = { class: "text-caption" }, fe = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, pe = {
314
+ }, "default"), q = /* @__PURE__ */ K(me, [["__scopeId", "data-v-76b0a622"]]), he = { class: "text-caption text-medium-emphasis mb-4" }, ge = { class: "text-h6" }, _e = { class: "text-caption" }, ve = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, ye = {
314
315
  class: "d-flex align-center flex-wrap ga-2",
315
316
  style: { width: "100%" }
316
- }, me = { class: "text-body-2 font-weight-medium" }, he = { class: "text-caption text-medium-emphasis" }, ge = {
317
+ }, be = { class: "text-body-2 font-weight-medium" }, xe = { class: "text-caption text-medium-emphasis" }, Se = {
317
318
  key: 2,
318
319
  class: "text-caption"
319
- }, _e = {
320
+ }, Ce = {
320
321
  key: 0,
321
322
  class: "ml-1 text-disabled"
322
- }, Y = /* @__PURE__ */ q(/* @__PURE__ */ c({
323
+ }, J = /* @__PURE__ */ K(/* @__PURE__ */ c({
323
324
  __name: "LearnerCardHistory",
324
325
  props: {
325
326
  dataset: {},
@@ -327,29 +328,29 @@ var ee = {
327
328
  focus: {}
328
329
  },
329
330
  setup(c) {
330
- let d = c, g = t(() => C(d.dataset)), x = p("all"), S = p(""), w = p([]), T = p(null), E = t(() => ({
331
- stuck: g.value.filter((e) => e.stuck).length,
332
- failed: g.value.filter((e) => e.fails > 0).length,
333
- frozen: g.value.filter((e) => e.frozenElo).length
331
+ let d = c, f = t(() => w(d.dataset)), _ = m("all"), S = m(""), C = m([]), T = m(null), E = t(() => ({
332
+ stuck: f.value.filter((e) => e.stuck).length,
333
+ failed: f.value.filter((e) => e.fails > 0).length,
334
+ frozen: f.value.filter((e) => e.frozenElo).length
334
335
  })), D = t(() => [
335
336
  {
336
337
  label: "cards seen",
337
- value: g.value.length,
338
+ value: f.value.length,
338
339
  color: "primary"
339
340
  },
340
341
  {
341
342
  label: "total attempts",
342
- value: g.value.reduce((e, t) => e + t.attempts, 0),
343
+ value: f.value.reduce((e, t) => e + t.attempts, 0),
343
344
  color: "primary"
344
345
  },
345
346
  {
346
347
  label: "total fails",
347
- value: g.value.reduce((e, t) => e + t.fails, 0),
348
+ value: f.value.reduce((e, t) => e + t.fails, 0),
348
349
  color: "error"
349
350
  },
350
351
  {
351
352
  label: "time on cards",
352
- value: k(g.value.reduce((e, t) => e + t.totalTimeMs, 0) / 1e3),
353
+ value: A(f.value.reduce((e, t) => e + t.totalTimeMs, 0) / 1e3),
353
354
  color: "grey"
354
355
  },
355
356
  {
@@ -363,8 +364,8 @@ var ee = {
363
364
  color: "warning"
364
365
  }
365
366
  ]), O = t(() => {
366
- let e = g.value;
367
- x.value === "stuck" ? e = e.filter((e) => e.stuck) : x.value === "failed" ? e = e.filter((e) => e.fails > 0) : x.value === "frozen" && (e = e.filter((e) => e.frozenElo));
367
+ let e = f.value;
368
+ _.value === "stuck" ? e = e.filter((e) => e.stuck) : _.value === "failed" ? e = e.filter((e) => e.fails > 0) : _.value === "frozen" && (e = e.filter((e) => e.frozenElo));
368
369
  let t = S.value?.trim().toLowerCase();
369
370
  return t && (e = e.filter((e) => e.cardId.toLowerCase().includes(t) || (e.card?.questionType ?? "").toLowerCase().includes(t) || (e.card?.tags ?? []).some((e) => e.toLowerCase().includes(t)) || Object.values(e.card?.data ?? {}).some((e) => typeof e == "string" && e.toLowerCase().includes(t)))), e;
370
371
  });
@@ -373,23 +374,23 @@ var ee = {
373
374
  return typeof t == "string" ? t : "";
374
375
  }
375
376
  async function applyFocus(e) {
376
- !e || !g.value.some((t) => t.cardId === e) || (x.value = "all", S.value = e, w.value = [e], await l(), document.querySelector(`[data-card="${CSS.escape(e)}"]`)?.scrollIntoView({
377
+ !e || !f.value.some((t) => t.cardId === e) || (_.value = "all", S.value = e, C.value = [e], await l(), document.querySelector(`[data-card="${CSS.escape(e)}"]`)?.scrollIntoView({
377
378
  behavior: "smooth",
378
379
  block: "center"
379
380
  }), T.value = e, setTimeout(() => {
380
381
  T.value === e && (T.value = null);
381
382
  }, 2200));
382
383
  }
383
- return y(() => d.focus, (e) => void applyFocus(e), { immediate: !0 }), (t, c) => {
384
- let l = h("v-icon"), d = h("v-card"), p = h("v-col"), y = h("v-row"), C = h("v-btn"), A = h("v-btn-toggle"), j = h("v-text-field"), M = h("v-alert"), N = h("v-spacer"), P = h("v-chip"), F = h("v-expansion-panel-title"), I = h("v-expansion-panel-text"), L = h("v-expansion-panel"), R = h("v-expansion-panels");
385
- return f(), i("div", null, [
386
- a("p", le, [
384
+ return b(() => d.focus, (e) => void applyFocus(e), { immediate: !0 }), (t, c) => {
385
+ let l = g("v-icon"), d = g("v-card"), m = g("v-col"), b = g("v-row"), w = g("v-btn"), k = g("v-btn-toggle"), j = g("v-text-field"), M = g("v-alert"), N = g("v-spacer"), P = g("v-chip"), F = g("v-expansion-panel-title"), I = g("v-expansion-panel-text"), L = g("v-expansion-panel"), R = g("v-expansion-panels");
386
+ return p(), i("div", null, [
387
+ a("p", he, [
387
388
  c[5] || (c[5] = o(" Every card the learner has met, most painful first (time sunk × failures), with its pending review and current card ELO. ")),
388
389
  s(l, {
389
390
  size: "x-small",
390
391
  color: "error"
391
392
  }, {
392
- default: b(() => c[3] || (c[3] = [o("mdi-sync-alert")])),
393
+ default: x(() => c[3] || (c[3] = [o("mdi-sync-alert")])),
393
394
  _: 1
394
395
  }),
395
396
  c[6] || (c[6] = o(" is a failed card holding an overdue review; ")),
@@ -397,81 +398,81 @@ var ee = {
397
398
  size: "x-small",
398
399
  color: "warning"
399
400
  }, {
400
- default: b(() => c[4] || (c[4] = [o("mdi-snowflake")])),
401
+ default: x(() => c[4] || (c[4] = [o("mdi-snowflake")])),
401
402
  _: 1
402
403
  }),
403
404
  c[7] || (c[7] = o(" is a repeatedly failed card whose ELO has fewer updates than failures. "))
404
405
  ]),
405
- s(y, {
406
+ s(b, {
406
407
  dense: "",
407
408
  class: "mb-2"
408
409
  }, {
409
- default: b(() => [(f(!0), i(e, null, m(D.value, (e) => (f(), n(p, {
410
+ default: x(() => [(p(!0), i(e, null, h(D.value, (e) => (p(), n(m, {
410
411
  key: e.label,
411
412
  cols: "6",
412
413
  sm: "4",
413
414
  md: "2"
414
415
  }, {
415
- default: b(() => [s(d, {
416
+ default: x(() => [s(d, {
416
417
  variant: "tonal",
417
418
  color: e.color,
418
419
  class: "pa-2 text-center"
419
420
  }, {
420
- default: b(() => [a("div", ue, _(e.value), 1), a("div", de, _(e.label), 1)]),
421
+ default: x(() => [a("div", ge, v(e.value), 1), a("div", _e, v(e.label), 1)]),
421
422
  _: 2
422
423
  }, 1032, ["color"])]),
423
424
  _: 2
424
425
  }, 1024))), 128))]),
425
426
  _: 1
426
427
  }),
427
- a("div", fe, [s(A, {
428
- modelValue: x.value,
429
- "onUpdate:modelValue": c[0] || (c[0] = (e) => x.value = e),
428
+ a("div", ve, [s(k, {
429
+ modelValue: _.value,
430
+ "onUpdate:modelValue": c[0] || (c[0] = (e) => _.value = e),
430
431
  density: "compact",
431
432
  color: "primary",
432
433
  variant: "outlined"
433
434
  }, {
434
- default: b(() => [
435
- s(C, {
435
+ default: x(() => [
436
+ s(w, {
436
437
  value: "all",
437
438
  size: "small"
438
439
  }, {
439
- default: b(() => [o("All (" + _(g.value.length) + ")", 1)]),
440
+ default: x(() => [o("All (" + v(f.value.length) + ")", 1)]),
440
441
  _: 1
441
442
  }),
442
- s(C, {
443
+ s(w, {
443
444
  value: "stuck",
444
445
  size: "small"
445
446
  }, {
446
- default: b(() => [s(l, {
447
+ default: x(() => [s(l, {
447
448
  start: "",
448
449
  size: "small",
449
450
  color: "error"
450
451
  }, {
451
- default: b(() => c[8] || (c[8] = [o("mdi-sync-alert")])),
452
+ default: x(() => c[8] || (c[8] = [o("mdi-sync-alert")])),
452
453
  _: 1
453
- }), o(" Stuck (" + _(E.value.stuck) + ") ", 1)]),
454
+ }), o(" Stuck (" + v(E.value.stuck) + ") ", 1)]),
454
455
  _: 1
455
456
  }),
456
- s(C, {
457
+ s(w, {
457
458
  value: "failed",
458
459
  size: "small"
459
460
  }, {
460
- default: b(() => [o("Ever failed (" + _(E.value.failed) + ")", 1)]),
461
+ default: x(() => [o("Ever failed (" + v(E.value.failed) + ")", 1)]),
461
462
  _: 1
462
463
  }),
463
- s(C, {
464
+ s(w, {
464
465
  value: "frozen",
465
466
  size: "small"
466
467
  }, {
467
- default: b(() => [s(l, {
468
+ default: x(() => [s(l, {
468
469
  start: "",
469
470
  size: "small",
470
471
  color: "warning"
471
472
  }, {
472
- default: b(() => c[9] || (c[9] = [o("mdi-snowflake")])),
473
+ default: x(() => c[9] || (c[9] = [o("mdi-snowflake")])),
473
474
  _: 1
474
- }), o(" Frozen ELO (" + _(E.value.frozen) + ") ", 1)]),
475
+ }), o(" Frozen ELO (" + v(E.value.frozen) + ") ", 1)]),
475
476
  _: 1
476
477
  })
477
478
  ]),
@@ -487,64 +488,64 @@ var ee = {
487
488
  "prepend-inner-icon": "mdi-magnify",
488
489
  style: { "max-width": "320px" }
489
490
  }, null, 8, ["modelValue"])]),
490
- g.value.length === 0 ? (f(), n(M, {
491
+ f.value.length === 0 ? (p(), n(M, {
491
492
  key: 0,
492
493
  type: "info",
493
494
  variant: "tonal"
494
495
  }, {
495
- default: b(() => c[10] || (c[10] = [o("No card history for this learner.")])),
496
+ default: x(() => c[10] || (c[10] = [o("No card history for this learner.")])),
496
497
  _: 1
497
- })) : (f(), n(R, {
498
+ })) : (p(), n(R, {
498
499
  key: 1,
499
- modelValue: w.value,
500
- "onUpdate:modelValue": c[2] || (c[2] = (e) => w.value = e),
500
+ modelValue: C.value,
501
+ "onUpdate:modelValue": c[2] || (c[2] = (e) => C.value = e),
501
502
  multiple: "",
502
503
  variant: "accordion"
503
504
  }, {
504
- default: b(() => [(f(!0), i(e, null, m(O.value, (e) => (f(), n(L, {
505
+ default: x(() => [(p(!0), i(e, null, h(O.value, (e) => (p(), n(L, {
505
506
  key: e.cardId,
506
507
  value: e.cardId,
507
508
  "data-card": e.cardId,
508
509
  class: u(e.cardId === T.value ? "sk-card-flash" : "")
509
510
  }, {
510
- default: b(() => [s(F, null, {
511
- default: b(() => [a("div", pe, [
512
- e.stuck ? (f(), n(l, {
511
+ default: x(() => [s(F, null, {
512
+ default: x(() => [a("div", ye, [
513
+ e.stuck ? (p(), n(l, {
513
514
  key: 0,
514
515
  color: "error",
515
516
  size: "small",
516
517
  title: "failed + overdue review"
517
518
  }, {
518
- default: b(() => c[11] || (c[11] = [o("mdi-sync-alert")])),
519
+ default: x(() => c[11] || (c[11] = [o("mdi-sync-alert")])),
519
520
  _: 1
520
521
  })) : r("", !0),
521
- e.frozenElo ? (f(), n(l, {
522
+ e.frozenElo ? (p(), n(l, {
522
523
  key: 1,
523
524
  color: "warning",
524
525
  size: "small",
525
526
  title: "repeatedly failed, ELO barely updated"
526
527
  }, {
527
- default: b(() => c[12] || (c[12] = [o(" mdi-snowflake ")])),
528
+ default: x(() => c[12] || (c[12] = [o(" mdi-snowflake ")])),
528
529
  _: 1
529
530
  })) : r("", !0),
530
- a("span", me, _(e.card?.questionType ?? "card"), 1),
531
- a("code", he, _(v(shortId)(e.cardId, 24)), 1),
532
- headline(e) ? (f(), i("span", ge, _(headline(e)), 1)) : r("", !0),
531
+ a("span", be, v(e.card?.questionType ?? "card"), 1),
532
+ a("code", xe, v(y(shortId)(e.cardId, 24)), 1),
533
+ headline(e) ? (p(), i("span", Se, v(headline(e)), 1)) : r("", !0),
533
534
  s(N),
534
- e.fails > 0 ? (f(), n(P, {
535
+ e.fails > 0 ? (p(), n(P, {
535
536
  key: 3,
536
537
  size: "x-small",
537
538
  color: "error",
538
539
  variant: "tonal"
539
540
  }, {
540
- default: b(() => [o(_(e.fails) + " fail" + _(e.fails === 1 ? "" : "s"), 1)]),
541
+ default: x(() => [o(v(e.fails) + " fail" + v(e.fails === 1 ? "" : "s"), 1)]),
541
542
  _: 2
542
543
  }, 1024)) : r("", !0),
543
544
  s(P, {
544
545
  size: "x-small",
545
546
  variant: "tonal"
546
547
  }, {
547
- default: b(() => [o(_(e.attempts) + " view" + _(e.attempts === 1 ? "" : "s"), 1)]),
548
+ default: x(() => [o(v(e.attempts) + " view" + v(e.attempts === 1 ? "" : "s"), 1)]),
548
549
  _: 2
549
550
  }, 1024),
550
551
  s(P, {
@@ -552,16 +553,16 @@ var ee = {
552
553
  variant: "tonal",
553
554
  color: "grey"
554
555
  }, {
555
- default: b(() => [o(_(v(k)(e.totalTimeMs / 1e3)), 1)]),
556
+ default: x(() => [o(v(y(A)(e.totalTimeMs / 1e3)), 1)]),
556
557
  _: 2
557
558
  }, 1024),
558
- e.pendingReview ? (f(), n(P, {
559
+ e.pendingReview ? (p(), n(P, {
559
560
  key: 4,
560
561
  size: "x-small",
561
562
  color: e.pendingReview.overdue ? "error" : "success",
562
563
  variant: "flat"
563
564
  }, {
564
- default: b(() => [o(" review " + _(e.pendingReview.overdue ? "overdue" : "scheduled"), 1)]),
565
+ default: x(() => [o(" review " + v(e.pendingReview.overdue ? "overdue" : "scheduled"), 1)]),
565
566
  _: 2
566
567
  }, 1032, ["color"])) : r("", !0),
567
568
  s(P, {
@@ -569,13 +570,13 @@ var ee = {
569
570
  variant: "tonal",
570
571
  color: e.frozenElo ? "warning" : void 0
571
572
  }, {
572
- default: b(() => [o(" ELO " + _(e.cardElo === null ? "?" : Math.round(e.cardElo)) + " ", 1), e.cardEloCount === null ? r("", !0) : (f(), i("span", _e, "/" + _(e.cardEloCount), 1))]),
573
+ default: x(() => [o(" ELO " + v(e.cardElo === null ? "?" : Math.round(e.cardElo)) + " ", 1), e.cardEloCount === null ? r("", !0) : (p(), i("span", Ce, "/" + v(e.cardEloCount), 1))]),
573
574
  _: 2
574
575
  }, 1032, ["color"])
575
576
  ])]),
576
577
  _: 2
577
578
  }, 1024), s(I, null, {
578
- default: b(() => [s(J, {
579
+ default: x(() => [s(q, {
579
580
  dossier: e,
580
581
  interpreters: t.interpreters
581
582
  }, null, 8, ["dossier", "interpreters"])]),
@@ -592,30 +593,33 @@ var ee = {
592
593
  ]);
593
594
  };
594
595
  }
595
- }), [["__scopeId", "data-v-bb6b302b"]]), ve = { class: "sk-run-detail" }, ye = {
596
+ }), [["__scopeId", "data-v-bb6b302b"]]), we = { class: "sk-run-detail" }, Te = {
596
597
  key: 0,
597
598
  class: "mb-2"
598
- }, be = { class: "text-right" }, xe = { class: "text-right" }, Se = { class: "text-right" }, Ce = { class: "text-right" }, we = {
599
+ }, Ee = { class: "text-right" }, De = { class: "text-right" }, Oe = { class: "text-right" }, ke = { class: "text-right" }, Ae = {
599
600
  key: 1,
600
601
  class: "mb-2"
601
- }, Te = { class: "text-right" }, Ee = { class: "text-right" }, De = { class: "text-right" }, Oe = {
602
+ }, je = { class: "text-right" }, Me = { class: "text-right" }, Ne = { class: "text-right" }, Pe = {
602
603
  key: 2,
603
604
  class: "mb-2"
604
- }, ke = {
605
- key: 1,
606
- title: "runner-up"
607
- }, Ae = ["onClick"], je = { class: "text-right" }, Me = { class: "text-caption font-weight-medium" }, Ne = ["onClick"], Pe = { class: "text-medium-emphasis" }, Fe = { class: "text-no-wrap" }, Ie = { class: "text-no-wrap" }, Le = { class: "text-right text-no-wrap" }, Re = { class: "text-caption" }, ze = {
605
+ }, Fe = {
608
606
  key: 3,
609
607
  class: "mb-2"
610
- }, Be = { class: "sk-hint-block" }, Ve = {
608
+ }, Ie = {
609
+ key: 1,
610
+ title: "runner-up"
611
+ }, Le = ["onClick"], Re = { class: "text-right" }, ze = { class: "text-caption font-weight-medium" }, Be = ["onClick"], Ve = { class: "text-medium-emphasis" }, He = { class: "text-no-wrap" }, Ue = { class: "text-no-wrap" }, We = { class: "text-right text-no-wrap" }, Ge = { class: "text-caption" }, Ke = {
611
612
  key: 4,
613
+ class: "mb-2"
614
+ }, qe = { class: "sk-hint-block" }, Je = {
615
+ key: 5,
612
616
  class: "text-caption text-medium-emphasis"
613
- }, He = { key: 2 }, X = /* @__PURE__ */ q(/* @__PURE__ */ c({
617
+ }, Ye = { key: 2 }, Y = /* @__PURE__ */ K(/* @__PURE__ */ c({
614
618
  __name: "RunDetail",
615
619
  props: { run: {} },
616
620
  emits: ["open-card"],
617
621
  setup(c, { emit: l }) {
618
- let d = c, p = l, g = t(() => {
622
+ let d = c, f = l, m = t(() => {
619
623
  let e = d.run.unselectedNew, t = [];
620
624
  return e?.nextInLine && t.push({
621
625
  label: "next new card in line",
@@ -629,129 +633,135 @@ var ee = {
629
633
  return Math.abs(e) >= .01 || e === 0 ? e.toFixed(2) : e.toExponential(1);
630
634
  }
631
635
  return (t, c) => {
632
- let l = h("v-table"), d = h("v-icon");
633
- return f(), i("div", ve, [
634
- t.run.generators?.length ? (f(), i("div", ye, [c[1] || (c[1] = a("div", { class: "text-caption font-weight-medium" }, "generators", -1)), s(l, {
636
+ let l = g("v-table"), d = g("v-icon");
637
+ return p(), i("div", we, [
638
+ t.run.generators?.length ? (p(), i("div", Te, [c[1] || (c[1] = a("div", { class: "text-caption font-weight-medium" }, "generators", -1)), s(l, {
635
639
  density: "compact",
636
640
  class: "sk-mini-table"
637
641
  }, {
638
- default: b(() => [c[0] || (c[0] = a("thead", null, [a("tr", null, [
642
+ default: x(() => [c[0] || (c[0] = a("thead", null, [a("tr", null, [
639
643
  a("th"),
640
644
  a("th", { class: "text-right" }, "cards"),
641
645
  a("th", { class: "text-right" }, "new"),
642
646
  a("th", { class: "text-right" }, "review"),
643
647
  a("th", { class: "text-right" }, "top")
644
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(t.run.generators, (e) => (f(), i("tr", { key: e.name }, [
645
- a("td", null, _(e.name), 1),
646
- a("td", be, _(e.cardCount), 1),
647
- a("td", xe, _(e.newCount), 1),
648
- a("td", Se, _(e.reviewCount), 1),
649
- a("td", Ce, _(e.topScore.toFixed(2)), 1)
648
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.generators, (e) => (p(), i("tr", { key: e.name }, [
649
+ a("td", null, v(e.name), 1),
650
+ a("td", Ee, v(e.cardCount), 1),
651
+ a("td", De, v(e.newCount), 1),
652
+ a("td", Oe, v(e.reviewCount), 1),
653
+ a("td", ke, v(e.topScore.toFixed(2)), 1)
650
654
  ]))), 128))])]),
651
655
  _: 1
652
656
  })])) : r("", !0),
653
- t.run.filters?.length ? (f(), i("div", we, [c[3] || (c[3] = a("div", { class: "text-caption font-weight-medium" }, "filters", -1)), s(l, {
657
+ t.run.filters?.length ? (p(), i("div", Ae, [c[3] || (c[3] = a("div", { class: "text-caption font-weight-medium" }, "filters", -1)), s(l, {
654
658
  density: "compact",
655
659
  class: "sk-mini-table"
656
660
  }, {
657
- default: b(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
661
+ default: x(() => [c[2] || (c[2] = a("thead", null, [a("tr", null, [
658
662
  a("th"),
663
+ a("th", null, "kind"),
659
664
  a("th", { class: "text-right" }, "boosted"),
660
665
  a("th", { class: "text-right" }, "penalized"),
661
666
  a("th", { class: "text-right" }, "passed"),
662
667
  a("th", { class: "text-right" }, "removed")
663
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(t.run.filters, (e) => (f(), i("tr", { key: e.name }, [
664
- a("td", null, _(e.name), 1),
665
- a("td", Te, _(e.boosted), 1),
666
- a("td", Ee, _(e.penalized), 1),
667
- a("td", De, _(e.passed), 1),
668
- a("td", { class: u(["text-right", e.removed > 0 ? "text-error" : ""]) }, _(e.removed), 3)
668
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.filters, (e) => (p(), i("tr", { key: e.name }, [
669
+ a("td", null, v(e.name), 1),
670
+ a("td", null, v(e.kind ?? "—"), 1),
671
+ a("td", je, v(e.boosted), 1),
672
+ a("td", Me, v(e.penalized), 1),
673
+ a("td", Ne, v(e.passed), 1),
674
+ a("td", { class: u(["text-right", e.removed > 0 ? "text-error" : ""]) }, v(e.removed), 3)
669
675
  ]))), 128))])]),
670
676
  _: 1
671
677
  })])) : r("", !0),
672
- t.run.cards?.length ? (f(), i("div", Oe, [c[6] || (c[6] = a("div", { class: "text-caption font-weight-medium" }, "selection", -1)), s(l, {
678
+ t.run.regulators?.length ? (p(), i("div", Pe, [c[4] || (c[4] = a("div", { class: "text-caption font-weight-medium" }, "regulators", -1)), (p(!0), i(e, null, h(t.run.regulators, (e) => (p(), i("div", {
679
+ key: e.name,
680
+ class: "sk-mini-line"
681
+ }, [a("span", { class: u(e.multiplier > 1 ? "text-warning" : "text-medium-emphasis") }, " ×" + v(e.multiplier.toFixed(2)), 3), o(" " + v(y(I)(e)), 1)]))), 128))])) : r("", !0),
682
+ t.run.cards?.length ? (p(), i("div", Fe, [c[7] || (c[7] = a("div", { class: "text-caption font-weight-medium" }, "selection", -1)), s(l, {
673
683
  density: "compact",
674
684
  class: "sk-mini-table"
675
685
  }, {
676
- default: b(() => [c[5] || (c[5] = a("thead", null, [a("tr", null, [
686
+ default: x(() => [c[6] || (c[6] = a("thead", null, [a("tr", null, [
677
687
  a("th"),
678
688
  a("th", null, "card"),
679
689
  a("th", null, "origin"),
680
690
  a("th", null, "generator"),
681
691
  a("th", { class: "text-right" }, "score")
682
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(t.run.cards, (e) => (f(), i("tr", {
692
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(t.run.cards, (e) => (p(), i("tr", {
683
693
  key: e.cardId,
684
694
  class: u(e.selected ? "" : "text-medium-emphasis")
685
695
  }, [
686
- a("td", null, [e.selected ? (f(), n(d, {
696
+ a("td", null, [e.selected ? (p(), n(d, {
687
697
  key: 0,
688
698
  size: "x-small",
689
699
  color: "success"
690
700
  }, {
691
- default: b(() => c[4] || (c[4] = [o("mdi-check")])),
701
+ default: x(() => c[5] || (c[5] = [o("mdi-check")])),
692
702
  _: 1
693
- })) : (f(), i("span", ke, "·"))]),
703
+ })) : (p(), i("span", Ie, "·"))]),
694
704
  a("td", null, [a("a", {
695
705
  class: "sk-card-link",
696
- onClick: (t) => p("open-card", e.cardId)
697
- }, _(e.cardId), 9, Ae)]),
698
- a("td", null, _(e.origin), 1),
699
- a("td", null, _(e.generator ?? "—"), 1),
700
- a("td", je, _(fmtScore(e.score)), 1)
706
+ onClick: (t) => f("open-card", e.cardId)
707
+ }, v(e.cardId), 9, Le)]),
708
+ a("td", null, v(e.origin), 1),
709
+ a("td", null, v(e.generator ?? "—"), 1),
710
+ a("td", Re, v(fmtScore(e.score)), 1)
701
711
  ], 2))), 128))])]),
702
712
  _: 1
703
713
  })])) : r("", !0),
704
- (f(!0), i(e, null, m(g.value, (t) => (f(), i("div", {
714
+ (p(!0), i(e, null, h(m.value, (t) => (p(), i("div", {
705
715
  key: t.label,
706
716
  class: "mb-2"
707
- }, [a("div", Me, [
708
- o(_(t.label) + ": ", 1),
717
+ }, [a("div", ze, [
718
+ o(v(t.label) + ": ", 1),
709
719
  a("a", {
710
720
  class: "sk-card-link",
711
- onClick: (e) => p("open-card", t.card.cardId)
712
- }, _(t.card.cardId), 9, Ne),
713
- a("span", Pe, " (" + _(t.card.origin) + ", " + _(t.card.generator ?? "?") + ") final " + _(fmtScore(t.card.score)), 1)
721
+ onClick: (e) => f("open-card", t.card.cardId)
722
+ }, v(t.card.cardId), 9, Be),
723
+ a("span", Ve, " (" + v(t.card.origin) + ", " + v(t.card.generator ?? "?") + ") final " + v(fmtScore(t.card.score)), 1)
714
724
  ]), s(l, {
715
725
  density: "compact",
716
726
  class: "sk-mini-table"
717
727
  }, {
718
- default: b(() => [a("tbody", null, [(f(!0), i(e, null, m(t.card.trail, (e, t) => (f(), i("tr", { key: t }, [
719
- a("td", Fe, _(e.action), 1),
720
- a("td", Ie, _(e.strategyName), 1),
721
- a("td", Le, _(fmtScore(e.score)), 1),
722
- a("td", Re, _(e.reason), 1)
728
+ default: x(() => [a("tbody", null, [(p(!0), i(e, null, h(t.card.trail, (e, t) => (p(), i("tr", { key: t }, [
729
+ a("td", He, v(e.action), 1),
730
+ a("td", Ue, v(e.strategyName), 1),
731
+ a("td", We, v(fmtScore(e.score)), 1),
732
+ a("td", Ge, v(e.reason), 1)
723
733
  ]))), 128))])]),
724
734
  _: 2
725
735
  }, 1024)]))), 128)),
726
- t.run.hints ? (f(), i("div", ze, [c[7] || (c[7] = a("div", { class: "text-caption font-weight-medium" }, "hints", -1)), a("pre", Be, _(JSON.stringify(t.run.hints, null, 2)), 1)])) : r("", !0),
727
- t.run.discardedTail ? (f(), i("div", Ve, [
728
- o(" discarded tail: " + _(t.run.discardedTail.count) + " cards ", 1),
729
- t.run.discardedTail.scoreRange ? (f(), i(e, { key: 0 }, [o(" · score [" + _(t.run.discardedTail.scoreRange[0].toFixed(2)) + ", " + _(t.run.discardedTail.scoreRange[1].toFixed(2)) + "] ", 1)], 64)) : r("", !0),
730
- t.run.discardedTail.eloRange ? (f(), i(e, { key: 1 }, [o(" · ELO [" + _(Math.round(t.run.discardedTail.eloRange[0])) + ", " + _(Math.round(t.run.discardedTail.eloRange[1])) + "] ", 1)], 64)) : r("", !0),
731
- t.run.discardedTail.note ? (f(), i("div", He, _(t.run.discardedTail.note), 1)) : r("", !0)
736
+ t.run.hints ? (p(), i("div", Ke, [c[8] || (c[8] = a("div", { class: "text-caption font-weight-medium" }, "hints", -1)), a("pre", qe, v(JSON.stringify(t.run.hints, null, 2)), 1)])) : r("", !0),
737
+ t.run.discardedTail ? (p(), i("div", Je, [
738
+ o(" discarded tail: " + v(t.run.discardedTail.count) + " cards ", 1),
739
+ t.run.discardedTail.scoreRange ? (p(), i(e, { key: 0 }, [o(" · score [" + v(t.run.discardedTail.scoreRange[0].toFixed(2)) + ", " + v(t.run.discardedTail.scoreRange[1].toFixed(2)) + "] ", 1)], 64)) : r("", !0),
740
+ t.run.discardedTail.eloRange ? (p(), i(e, { key: 1 }, [o(" · ELO [" + v(Math.round(t.run.discardedTail.eloRange[0])) + ", " + v(Math.round(t.run.discardedTail.eloRange[1])) + "] ", 1)], 64)) : r("", !0),
741
+ t.run.discardedTail.note ? (p(), i("div", Ye, v(t.run.discardedTail.note), 1)) : r("", !0)
732
742
  ])) : r("", !0)
733
743
  ]);
734
744
  };
735
745
  }
736
- }), [["__scopeId", "data-v-ffc34f95"]]), Ue = { class: "d-flex align-center flex-wrap mb-4 ga-2" }, We = { class: "text-caption text-medium-emphasis" }, Ge = { class: "text-right" }, Ke = { class: "text-right" }, qe = {
746
+ }), [["__scopeId", "data-v-70675763"]]), Xe = { class: "d-flex align-center flex-wrap mb-4 ga-2" }, Ze = { class: "text-caption text-medium-emphasis" }, Qe = { class: "text-right" }, $e = { class: "text-right" }, et = {
737
747
  key: 1,
738
748
  class: "text-caption text-disabled"
739
- }, Je = { class: "sk-hint-block" }, Ye = { class: "sk-hint-block" }, Xe = { class: "text-caption text-medium-emphasis mb-4" }, Ze = { class: "text-right" }, Qe = { class: "text-right" }, $e = { class: "text-disabled" }, et = { class: "text-right" }, tt = { class: "d-flex flex-wrap ga-5" }, nt = { class: "text-caption text-medium-emphasis" }, rt = { class: "text-h6 text-success" }, it = { class: "text-caption text-medium-emphasis" }, at = { class: "text-h6 text-error" }, ot = { class: "text-h6" }, st = { class: "text-caption text-disabled" }, ct = { class: "d-flex align-center flex-wrap mb-2 ga-3" }, lt = {
749
+ }, tt = { class: "sk-hint-block" }, nt = { class: "sk-hint-block" }, rt = { class: "text-caption text-medium-emphasis mb-4" }, it = { class: "text-right" }, at = { class: "text-right" }, ot = { class: "text-disabled" }, st = { class: "text-right" }, ct = { class: "d-flex flex-wrap ga-5" }, lt = { class: "text-caption text-medium-emphasis" }, ut = { class: "text-h6 text-success" }, dt = { class: "text-caption text-medium-emphasis" }, ft = { class: "text-h6 text-error" }, pt = { class: "text-h6" }, mt = { class: "text-caption text-disabled" }, ht = { class: "d-flex align-center flex-wrap mb-2 ga-3" }, gt = {
740
750
  key: 4,
741
751
  class: "sk-timeline"
742
- }, ut = { class: "sk-tl-time text-caption text-disabled" }, dt = { class: "sk-tl-gutter" }, ft = {
752
+ }, _t = { class: "sk-tl-time text-caption text-disabled" }, vt = { class: "sk-tl-gutter" }, yt = {
743
753
  key: 0,
744
754
  class: "sk-tl-body"
745
- }, pt = { class: "d-flex align-center flex-wrap ga-1" }, mt = { class: "font-weight-medium" }, ht = { class: "text-caption text-medium-emphasis ml-2" }, gt = {
755
+ }, bt = { class: "d-flex align-center flex-wrap ga-1" }, xt = { class: "font-weight-medium" }, St = { class: "text-caption text-medium-emphasis ml-2" }, Ct = {
746
756
  key: 1,
747
757
  class: "text-caption text-error ml-2"
748
- }, _t = {
758
+ }, wt = {
749
759
  key: 1,
750
760
  class: "sk-tl-body"
751
- }, vt = ["title", "onClick"], yt = { class: "text-caption" }, bt = { class: "text-caption text-medium-emphasis ml-2" }, xt = {
761
+ }, Tt = ["title", "onClick"], Et = { class: "text-caption" }, Dt = { class: "text-caption text-medium-emphasis ml-2" }, Ot = {
752
762
  key: 0,
753
763
  class: "text-caption text-disabled ml-2"
754
- }, Z = /* @__PURE__ */ q(/* @__PURE__ */ c({
764
+ }, X = /* @__PURE__ */ K(/* @__PURE__ */ c({
755
765
  __name: "LearnerSessionDetail",
756
766
  props: {
757
767
  dataset: {},
@@ -760,29 +770,29 @@ var ee = {
760
770
  },
761
771
  emits: ["open-card"],
762
772
  setup(c, { emit: l }) {
763
- let d = c, g = l, y = t(() => L(d.dataset, d.sessionId, d.interpreters)), x = t(() => y.value.summary.doc), C = t(() => I(y.value?.timeline ?? [], d.interpreters)), w = t(() => T(y.value?.timeline ?? [])), E = t(() => y.value?.timeline.filter((e) => e.kind === "response").length ?? 0), A = p("all"), M = t(() => {
764
- let e = y.value?.timeline ?? [];
765
- return !A.value || A.value === "all" ? e : e.filter((e) => e.kind === A.value);
766
- }), N = p(/* @__PURE__ */ new Set());
773
+ let d = c, f = l, _ = t(() => B(d.dataset, d.sessionId, d.interpreters)), b = t(() => _.value.summary.doc), S = t(() => z(_.value?.timeline ?? [], d.interpreters)), w = t(() => E(_.value?.timeline ?? [])), T = t(() => _.value?.timeline.filter((e) => e.kind === "response").length ?? 0), D = m("all"), j = t(() => {
774
+ let e = _.value?.timeline ?? [];
775
+ return !D.value || D.value === "all" ? e : e.filter((e) => e.kind === D.value);
776
+ }), N = m(/* @__PURE__ */ new Set());
767
777
  function toggle(e) {
768
778
  let t = new Set(N.value);
769
779
  t.has(e) ? t.delete(e) : t.add(e), N.value = t;
770
780
  }
771
- let { copied: B, copy: V } = useCopy();
781
+ let { copied: P, copy: F } = useCopy();
772
782
  function asText() {
773
- return y.value ? R(d.dataset.username, y.value, {
774
- servedTags: C.value,
783
+ return _.value ? V(d.dataset.username, _.value, {
784
+ servedTags: S.value,
775
785
  eloLedger: w.value
776
786
  }, d.interpreters) : "";
777
787
  }
778
- let H = t(() => {
779
- let e = y.value?.summary;
788
+ let I = t(() => {
789
+ let e = _.value?.summary;
780
790
  if (!e) return "";
781
- let t = k(e.doc.plannedSeconds);
782
- return e.durationSeconds === null ? `— of ${t}` : `${k(e.durationSeconds)} of ${t}`;
791
+ let t = A(e.doc.plannedSeconds);
792
+ return e.durationSeconds === null ? `— of ${t}` : `${A(e.durationSeconds)} of ${t}`;
783
793
  });
784
794
  function skillTags(e) {
785
- return e.filter((e) => j(d.interpreters, e)).slice(0, 3);
795
+ return e.filter((e) => M(d.interpreters, e)).slice(0, 3);
786
796
  }
787
797
  function fmtNum(e) {
788
798
  return e === null ? "—" : Number.isInteger(e) ? String(e) : e.toFixed(1);
@@ -800,22 +810,22 @@ var ee = {
800
810
  return e.kind === "run" ? "sk-tl-run" : e.isCorrect === !1 ? "sk-tl-fail" : "";
801
811
  }
802
812
  return (t, c) => {
803
- let l = h("v-alert"), d = h("v-chip"), p = h("v-icon"), T = h("v-spacer"), k = h("v-btn"), I = h("v-table"), L = h("v-card"), R = h("v-col"), U = h("v-row"), W = h("v-btn-toggle");
804
- return f(), i("div", null, [y.value ? (f(), i(e, { key: 1 }, [
805
- a("div", Ue, [
813
+ let l = g("v-alert"), d = g("v-chip"), m = g("v-icon"), E = g("v-spacer"), A = g("v-btn"), z = g("v-table"), B = g("v-card"), V = g("v-col"), U = g("v-row"), W = g("v-btn-toggle");
814
+ return p(), i("div", null, [_.value ? (p(), i(e, { key: 1 }, [
815
+ a("div", Xe, [
806
816
  s(d, {
807
817
  size: "small",
808
818
  variant: "flat",
809
- color: v(statusColor)(x.value.status)
819
+ color: y(statusColor)(b.value.status)
810
820
  }, {
811
- default: b(() => [o(_(x.value.status), 1)]),
821
+ default: x(() => [o(v(b.value.status), 1)]),
812
822
  _: 1
813
823
  }, 8, ["color"]),
814
824
  s(d, {
815
825
  size: "small",
816
826
  variant: "tonal"
817
827
  }, {
818
- default: b(() => [o(_(v(fmtTime)(x.value.startTime)), 1)]),
828
+ default: x(() => [o(v(y(fmtTime)(b.value.startTime)), 1)]),
819
829
  _: 1
820
830
  }),
821
831
  s(d, {
@@ -823,97 +833,97 @@ var ee = {
823
833
  variant: "tonal",
824
834
  color: "grey"
825
835
  }, {
826
- default: b(() => [o(_(H.value), 1)]),
836
+ default: x(() => [o(v(I.value), 1)]),
827
837
  _: 1
828
838
  }),
829
- (f(!0), i(e, null, m(y.value.summary.flags, (e) => (f(), n(d, {
839
+ (p(!0), i(e, null, h(_.value.summary.flags, (e) => (p(), n(d, {
830
840
  key: e,
831
841
  size: "small",
832
842
  variant: "tonal",
833
- color: v(G)[e].color,
834
- title: v(S)[e].help
843
+ color: y(G)[e].color,
844
+ title: y(C)[e].help
835
845
  }, {
836
- default: b(() => [s(p, {
846
+ default: x(() => [s(m, {
837
847
  start: "",
838
848
  size: "small"
839
849
  }, {
840
- default: b(() => [o(_(v(G)[e].icon), 1)]),
850
+ default: x(() => [o(v(y(G)[e].icon), 1)]),
841
851
  _: 2
842
- }, 1024), o(" " + _(v(S)[e].label), 1)]),
852
+ }, 1024), o(" " + v(y(C)[e].label), 1)]),
843
853
  _: 2
844
854
  }, 1032, ["color", "title"]))), 128)),
845
- s(T),
846
- a("code", We, _(t.sessionId), 1),
847
- s(k, {
855
+ s(E),
856
+ a("code", Ze, v(t.sessionId), 1),
857
+ s(A, {
848
858
  variant: "text",
849
859
  size: "small",
850
- "prepend-icon": v(B) === "session" ? "mdi-check" : "mdi-clipboard-text-outline",
851
- color: v(B) === "session" ? "success" : void 0,
852
- onClick: c[0] || (c[0] = (e) => v(V)(asText(), "session"))
860
+ "prepend-icon": y(P) === "session" ? "mdi-check" : "mdi-clipboard-text-outline",
861
+ color: y(P) === "session" ? "success" : void 0,
862
+ onClick: c[0] || (c[0] = (e) => y(F)(asText(), "session"))
853
863
  }, {
854
- default: b(() => [o(_(v(B) === "session" ? "Copied" : "Copy as text"), 1)]),
864
+ default: x(() => [o(v(y(P) === "session" ? "Copied" : "Copy as text"), 1)]),
855
865
  _: 1
856
866
  }, 8, ["prepend-icon", "color"])
857
867
  ]),
858
- y.value.responsesMissing ? (f(), n(l, {
868
+ _.value.responsesMissing ? (p(), n(l, {
859
869
  key: 0,
860
870
  type: "warning",
861
871
  variant: "tonal",
862
872
  density: "compact",
863
873
  class: "mb-4"
864
874
  }, {
865
- default: b(() => [o(" The session records " + _(x.value.tally?.responses) + " responses but only " + _(E.value) + " card records carry its id. The timeline is incomplete. ", 1)]),
875
+ default: x(() => [o(" The session records " + v(b.value.tally?.responses) + " responses but only " + v(T.value) + " card records carry its id. The timeline is incomplete. ", 1)]),
866
876
  _: 1
867
877
  })) : r("", !0),
868
878
  s(U, { class: "mb-2" }, {
869
- default: b(() => [s(R, {
879
+ default: x(() => [s(V, {
870
880
  cols: "12",
871
881
  md: "6"
872
882
  }, {
873
- default: b(() => [s(L, {
883
+ default: x(() => [s(B, {
874
884
  variant: "outlined",
875
885
  class: "pa-3 h-100"
876
886
  }, {
877
- default: b(() => [
887
+ default: x(() => [
878
888
  c[4] || (c[4] = a("div", { class: "text-subtitle-2 mb-1" }, "Learner state", -1)),
879
889
  c[5] || (c[5] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " What the navigator was choosing against, and what moved. ", -1)),
880
- y.value.summary.state.length ? (f(), n(I, {
890
+ _.value.summary.state.length ? (p(), n(z, {
881
891
  key: 0,
882
892
  density: "compact",
883
893
  class: "sk-mini-table"
884
894
  }, {
885
- default: b(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
895
+ default: x(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
886
896
  a("th"),
887
897
  a("th", { class: "text-right" }, "Start"),
888
898
  a("th", { class: "text-right" }, "End"),
889
899
  a("th", { class: "text-right" }, "Δ")
890
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(y.value.summary.state, (e) => (f(), i("tr", { key: e.label }, [
891
- a("td", null, _(e.label), 1),
892
- a("td", Ge, _(fmtNum(e.from)), 1),
893
- a("td", Ke, _(fmtNum(e.to)), 1),
894
- a("td", { class: u(["text-right", v(deltaClass)(e.delta)]) }, _(v(O)(e.delta)), 3)
900
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(_.value.summary.state, (e) => (p(), i("tr", { key: e.label }, [
901
+ a("td", null, v(e.label), 1),
902
+ a("td", Qe, v(fmtNum(e.from)), 1),
903
+ a("td", $e, v(fmtNum(e.to)), 1),
904
+ a("td", { class: u(["text-right", y(deltaClass)(e.delta)]) }, v(y(k)(e.delta)), 3)
895
905
  ]))), 128))])]),
896
906
  _: 1
897
- })) : (f(), i("div", qe, "No state snapshot recorded."))
907
+ })) : (p(), i("div", et, "No state snapshot recorded."))
898
908
  ]),
899
909
  _: 1
900
910
  })]),
901
911
  _: 1
902
- }), s(R, {
912
+ }), s(V, {
903
913
  cols: "12",
904
914
  md: "6"
905
915
  }, {
906
- default: b(() => [s(L, {
916
+ default: x(() => [s(B, {
907
917
  variant: "outlined",
908
918
  class: "pa-3 h-100"
909
919
  }, {
910
- default: b(() => [
920
+ default: x(() => [
911
921
  c[6] || (c[6] = a("div", { class: "text-subtitle-2 mb-1" }, "Session hints", -1)),
912
922
  c[7] || (c[7] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " What outcome observers told the navigator. They act only through these. ", -1)),
913
923
  c[8] || (c[8] = a("span", { class: "text-caption font-weight-medium" }, "at open", -1)),
914
- a("pre", Je, _(fmtHints(x.value.config?.initHints)), 1),
924
+ a("pre", tt, v(fmtHints(b.value.config?.initHints)), 1),
915
925
  c[9] || (c[9] = a("span", { class: "text-caption font-weight-medium" }, "at close", -1)),
916
- a("pre", Ye, _(fmtHints(x.value.finalHints)), 1)
926
+ a("pre", nt, v(fmtHints(b.value.finalHints)), 1)
917
927
  ]),
918
928
  _: 1
919
929
  })]),
@@ -921,212 +931,212 @@ var ee = {
921
931
  })]),
922
932
  _: 1
923
933
  }),
924
- a("div", Xe, [o(" batch limit " + _(x.value.config?.defaultBatchLimit ?? "?") + " · " + _(x.value.config?.sourceCount ?? "?") + " source(s) · opening queues supply " + _(x.value.initialQueues?.supplyQ ?? "?") + " / failed " + _(x.value.initialQueues?.failedQ ?? "?") + " ", 1), x.value.tally ? (f(), i(e, { key: 0 }, [o(" · ended with " + _(x.value.tally.failedQRemaining) + " still in the failed queue", 1)], 64)) : r("", !0)]),
925
- C.value.length ? (f(), n(L, {
934
+ a("div", rt, [o(" batch limit " + v(b.value.config?.defaultBatchLimit ?? "?") + " · " + v(b.value.config?.sourceCount ?? "?") + " source(s) · opening queues supply " + v(b.value.initialQueues?.supplyQ ?? "?") + " / failed " + v(b.value.initialQueues?.failedQ ?? "?") + " ", 1), b.value.tally ? (p(), i(e, { key: 0 }, [o(" · ended with " + v(b.value.tally.failedQRemaining) + " still in the failed queue", 1)], 64)) : r("", !0)]),
935
+ S.value.length ? (p(), n(B, {
926
936
  key: 1,
927
937
  variant: "outlined",
928
938
  class: "pa-3 mb-4"
929
939
  }, {
930
- default: b(() => [
940
+ default: x(() => [
931
941
  c[11] || (c[11] = a("div", { class: "text-subtitle-2 mb-1" }, "Served tags", -1)),
932
942
  c[12] || (c[12] = a("div", { class: "text-caption text-medium-emphasis mb-2" }, " What this sitting put in front of the learner, by content tag. A response with several tags counts toward each. ", -1)),
933
- s(I, {
943
+ s(z, {
934
944
  density: "compact",
935
945
  class: "sk-mini-table"
936
946
  }, {
937
- default: b(() => [c[10] || (c[10] = a("thead", null, [a("tr", null, [
947
+ default: x(() => [c[10] || (c[10] = a("thead", null, [a("tr", null, [
938
948
  a("th", null, "Tag"),
939
949
  a("th", { class: "text-right" }, "Resp."),
940
950
  a("th", { class: "text-right" }, "Cards"),
941
951
  a("th", { class: "text-right" }, "Accuracy"),
942
952
  a("th", { class: "text-right" }, "Time")
943
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(C.value, (n) => (f(), i("tr", { key: n.tag }, [
944
- a("td", null, [a("code", { class: u(v(j)(t.interpreters, n.tag) ? "text-primary" : "") }, _(n.tag), 3)]),
945
- a("td", Ze, _(n.responses), 1),
946
- a("td", Qe, _(n.cards), 1),
947
- a("td", { class: u(["text-right", v(accuracyClass)(n.accuracy)]) }, [n.accuracy === null ? (f(), i(e, { key: 0 }, [o("—")], 64)) : (f(), i(e, { key: 1 }, [o(_(Math.round(n.accuracy * 100)) + "% ", 1), a("span", $e, "(" + _(n.correct) + "/" + _(n.correct + n.incorrect) + ")", 1)], 64))], 2),
948
- a("td", et, _((n.totalTimeMs / 1e3).toFixed(1)) + "s", 1)
953
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(S.value, (n) => (p(), i("tr", { key: n.tag }, [
954
+ a("td", null, [a("code", { class: u(y(M)(t.interpreters, n.tag) ? "text-primary" : "") }, v(n.tag), 3)]),
955
+ a("td", it, v(n.responses), 1),
956
+ a("td", at, v(n.cards), 1),
957
+ a("td", { class: u(["text-right", y(accuracyClass)(n.accuracy)]) }, [n.accuracy === null ? (p(), i(e, { key: 0 }, [o("—")], 64)) : (p(), i(e, { key: 1 }, [o(v(Math.round(n.accuracy * 100)) + "% ", 1), a("span", ot, "(" + v(n.correct) + "/" + v(n.correct + n.incorrect) + ")", 1)], 64))], 2),
958
+ a("td", st, v((n.totalTimeMs / 1e3).toFixed(1)) + "s", 1)
949
959
  ]))), 128))])]),
950
960
  _: 1
951
961
  })
952
962
  ]),
953
963
  _: 1
954
964
  })) : r("", !0),
955
- w.value ? (f(), n(L, {
965
+ w.value ? (p(), n(B, {
956
966
  key: 2,
957
967
  variant: "outlined",
958
968
  class: "pa-3 mb-4"
959
969
  }, {
960
- default: b(() => [
970
+ default: x(() => [
961
971
  c[15] || (c[15] = a("div", { class: "text-subtitle-2 mb-1" }, "ELO ledger", -1)),
962
972
  c[16] || (c[16] = a("div", { class: "text-caption text-medium-emphasis mb-3" }, " The per-response learner global-ELO exchanges that net to the session's ELO move. Wins above the learner's level pay little; losses below it cost a lot, so a high hit rate can still net negative. ", -1)),
963
- a("div", tt, [
964
- a("div", null, [c[13] || (c[13] = a("div", { class: "text-caption text-medium-emphasis" }, "net", -1)), a("div", { class: u(["text-h6", v(deltaClass)(w.value.net)]) }, _(v(O)(w.value.net)), 3)]),
965
- a("div", null, [a("div", nt, "gained · " + _(w.value.wins) + " win(s)", 1), a("div", rt, _(v(O)(w.value.gained)), 1)]),
966
- a("div", null, [a("div", it, "lost · " + _(w.value.losses) + " loss(es)", 1), a("div", at, _(v(O)(w.value.lost)), 1)]),
973
+ a("div", ct, [
974
+ a("div", null, [c[13] || (c[13] = a("div", { class: "text-caption text-medium-emphasis" }, "net", -1)), a("div", { class: u(["text-h6", y(deltaClass)(w.value.net)]) }, v(y(k)(w.value.net)), 3)]),
975
+ a("div", null, [a("div", lt, "gained · " + v(w.value.wins) + " win(s)", 1), a("div", ut, v(y(k)(w.value.gained)), 1)]),
976
+ a("div", null, [a("div", dt, "lost · " + v(w.value.losses) + " loss(es)", 1), a("div", ft, v(y(k)(w.value.lost)), 1)]),
967
977
  a("div", null, [
968
978
  c[14] || (c[14] = a("div", { class: "text-caption text-medium-emphasis" }, "exchanges", -1)),
969
- a("div", ot, _(w.value.count), 1),
970
- a("div", st, "of " + _(E.value) + " response(s)", 1)
979
+ a("div", pt, v(w.value.count), 1),
980
+ a("div", mt, "of " + v(T.value) + " response(s)", 1)
971
981
  ])
972
982
  ])
973
983
  ]),
974
984
  _: 1
975
985
  })) : r("", !0),
976
- a("div", ct, [c[17] || (c[17] = a("h2", { class: "text-h6" }, "Timeline", -1)), s(W, {
977
- modelValue: A.value,
978
- "onUpdate:modelValue": c[1] || (c[1] = (e) => A.value = e),
986
+ a("div", ht, [c[17] || (c[17] = a("h2", { class: "text-h6" }, "Timeline", -1)), s(W, {
987
+ modelValue: D.value,
988
+ "onUpdate:modelValue": c[1] || (c[1] = (e) => D.value = e),
979
989
  density: "compact",
980
990
  color: "primary",
981
991
  variant: "outlined"
982
992
  }, {
983
- default: b(() => [
984
- s(k, {
993
+ default: x(() => [
994
+ s(A, {
985
995
  value: "all",
986
996
  size: "small"
987
997
  }, {
988
- default: b(() => [o("All (" + _(y.value.timeline.length) + ")", 1)]),
998
+ default: x(() => [o("All (" + v(_.value.timeline.length) + ")", 1)]),
989
999
  _: 1
990
1000
  }),
991
- s(k, {
1001
+ s(A, {
992
1002
  value: "response",
993
1003
  size: "small"
994
1004
  }, {
995
- default: b(() => [o("Responses (" + _(E.value) + ")", 1)]),
1005
+ default: x(() => [o("Responses (" + v(T.value) + ")", 1)]),
996
1006
  _: 1
997
1007
  }),
998
- s(k, {
1008
+ s(A, {
999
1009
  value: "run",
1000
1010
  size: "small"
1001
1011
  }, {
1002
- default: b(() => [o("Runs (" + _(y.value.timeline.length - E.value) + ")", 1)]),
1012
+ default: x(() => [o("Runs (" + v(_.value.timeline.length - T.value) + ")", 1)]),
1003
1013
  _: 1
1004
1014
  })
1005
1015
  ]),
1006
1016
  _: 1
1007
1017
  }, 8, ["modelValue"])]),
1008
- y.value.timeline.length === 0 ? (f(), n(l, {
1018
+ _.value.timeline.length === 0 ? (p(), n(l, {
1009
1019
  key: 3,
1010
1020
  type: "info",
1011
1021
  variant: "tonal"
1012
1022
  }, {
1013
- default: b(() => c[18] || (c[18] = [o("Nothing recorded for this session.")])),
1023
+ default: x(() => c[18] || (c[18] = [o("Nothing recorded for this session.")])),
1014
1024
  _: 1
1015
- })) : (f(), i("div", lt, [(f(!0), i(e, null, m(M.value, (l, h) => (f(), i("div", {
1016
- key: h,
1025
+ })) : (p(), i("div", gt, [(p(!0), i(e, null, h(j.value, (l, g) => (p(), i("div", {
1026
+ key: g,
1017
1027
  class: u(["sk-tl-row", rowClass(l)])
1018
1028
  }, [
1019
- a("div", ut, _(v(fmtClock)(l.at)), 1),
1020
- a("div", dt, [s(p, {
1029
+ a("div", _t, v(y(fmtClock)(l.at)), 1),
1030
+ a("div", vt, [s(m, {
1021
1031
  size: "small",
1022
1032
  color: entryColor(l)
1023
1033
  }, {
1024
- default: b(() => [o(_(entryIcon(l)), 1)]),
1034
+ default: x(() => [o(v(entryIcon(l)), 1)]),
1025
1035
  _: 2
1026
1036
  }, 1032, ["color"])]),
1027
- l.kind === "run" ? (f(), i("div", ft, [a("div", pt, [
1028
- a("span", mt, _(l.run.label), 1),
1029
- l.run.mode ? (f(), n(d, {
1037
+ l.kind === "run" ? (p(), i("div", yt, [a("div", bt, [
1038
+ a("span", xt, v(l.run.label), 1),
1039
+ l.run.mode ? (p(), n(d, {
1030
1040
  key: 0,
1031
1041
  size: "x-small",
1032
1042
  variant: "tonal"
1033
1043
  }, {
1034
- default: b(() => [o(_(l.run.mode), 1)]),
1044
+ default: x(() => [o(v(l.run.mode), 1)]),
1035
1045
  _: 2
1036
1046
  }, 1024)) : r("", !0),
1037
- a("span", ht, " generated " + _(l.run.generatedCount) + " → selected " + _(l.run.finalCount) + " (" + _(l.run.newSelected) + " new, " + _(l.run.reviewsSelected) + " review) ", 1),
1038
- l.run.generatedCount > 0 && l.run.finalCount === 0 ? (f(), i("span", gt, " nothing survived ")) : r("", !0),
1039
- typeof l.run.userElo == "number" ? (f(), n(d, {
1047
+ a("span", St, " generated " + v(l.run.generatedCount) + " → selected " + v(l.run.finalCount) + " (" + v(l.run.newSelected) + " new, " + v(l.run.reviewsSelected) + " review) ", 1),
1048
+ l.run.generatedCount > 0 && l.run.finalCount === 0 ? (p(), i("span", Ct, " nothing survived ")) : r("", !0),
1049
+ typeof l.run.userElo == "number" ? (p(), n(d, {
1040
1050
  key: 2,
1041
1051
  size: "x-small",
1042
1052
  variant: "tonal",
1043
1053
  color: "grey",
1044
1054
  class: "ml-2"
1045
1055
  }, {
1046
- default: b(() => [o(" ELO " + _(Math.round(l.run.userElo)), 1)]),
1056
+ default: x(() => [o(" ELO " + v(Math.round(l.run.userElo)), 1)]),
1047
1057
  _: 2
1048
1058
  }, 1024)) : r("", !0),
1049
- s(T),
1050
- s(k, {
1059
+ s(E),
1060
+ s(A, {
1051
1061
  icon: N.value.has(l.run.runId) ? "mdi-chevron-up" : "mdi-chevron-down",
1052
1062
  size: "x-small",
1053
1063
  variant: "text",
1054
1064
  onClick: (e) => toggle(l.run.runId)
1055
1065
  }, null, 8, ["icon", "onClick"]),
1056
- s(k, {
1057
- icon: v(B) === l.run.runId ? "mdi-check" : "mdi-content-copy",
1066
+ s(A, {
1067
+ icon: y(P) === l.run.runId ? "mdi-check" : "mdi-content-copy",
1058
1068
  size: "x-small",
1059
1069
  variant: "text",
1060
- color: v(B) === l.run.runId ? "success" : void 0,
1070
+ color: y(P) === l.run.runId ? "success" : void 0,
1061
1071
  title: "Copy run as text",
1062
- onClick: (e) => v(V)(v(P)(l.run), l.run.runId)
1072
+ onClick: (e) => y(F)(y(L)(l.run), l.run.runId)
1063
1073
  }, null, 8, [
1064
1074
  "icon",
1065
1075
  "color",
1066
1076
  "onClick"
1067
1077
  ])
1068
- ]), N.value.has(l.run.runId) ? (f(), n(X, {
1078
+ ]), N.value.has(l.run.runId) ? (p(), n(Y, {
1069
1079
  key: 0,
1070
1080
  run: l.run,
1071
1081
  class: "mt-1",
1072
- onOpenCard: c[2] || (c[2] = (e) => g("open-card", e))
1073
- }, null, 8, ["run"])) : r("", !0)])) : (f(), i("div", _t, [
1082
+ onOpenCard: c[2] || (c[2] = (e) => f("open-card", e))
1083
+ }, null, 8, ["run"])) : r("", !0)])) : (p(), i("div", wt, [
1074
1084
  a("a", {
1075
1085
  class: "sk-card-link",
1076
1086
  title: `Open ${l.cardId} in card history`,
1077
- onClick: (e) => g("open-card", l.cardId)
1078
- }, [o(_(l.questionType ?? "card") + " ", 1), a("code", yt, _(v(shortId)(l.cardId)), 1)], 8, vt),
1079
- (f(!0), i(e, null, m(skillTags(l.tags), (e) => (f(), n(d, {
1087
+ onClick: (e) => f("open-card", l.cardId)
1088
+ }, [o(v(l.questionType ?? "card") + " ", 1), a("code", Et, v(y(shortId)(l.cardId)), 1)], 8, Tt),
1089
+ (p(!0), i(e, null, h(skillTags(l.tags), (e) => (p(), n(d, {
1080
1090
  key: e,
1081
1091
  size: "x-small",
1082
1092
  variant: "outlined",
1083
1093
  color: "primary",
1084
1094
  class: "ml-1"
1085
1095
  }, {
1086
- default: b(() => [o(_(v(z)(t.interpreters, e)), 1)]),
1096
+ default: x(() => [o(v(y(H)(t.interpreters, e)), 1)]),
1087
1097
  _: 2
1088
1098
  }, 1024))), 128)),
1089
- a("span", bt, [o(_((l.timeSpentMs / 1e3).toFixed(1)) + "s ", 1), l.priorAttempts ? (f(), i(e, { key: 0 }, [o(" · attempt " + _(l.priorAttempts + 1), 1)], 64)) : r("", !0)]),
1090
- l.userAnswer == null ? r("", !0) : (f(), i("span", xt, "“" + _(v(D)(l.userAnswer)) + "”", 1)),
1091
- l.elo ? (f(), i(e, { key: 1 }, [s(d, {
1099
+ a("span", Dt, [o(v((l.timeSpentMs / 1e3).toFixed(1)) + "s ", 1), l.priorAttempts ? (p(), i(e, { key: 0 }, [o(" · attempt " + v(l.priorAttempts + 1), 1)], 64)) : r("", !0)]),
1100
+ l.userAnswer == null ? r("", !0) : (p(), i("span", Ot, "“" + v(y(O)(l.userAnswer)) + "”", 1)),
1101
+ l.elo ? (p(), i(e, { key: 1 }, [s(d, {
1092
1102
  size: "x-small",
1093
1103
  variant: "tonal",
1094
- color: v(deltaColor)(l.elo.global.delta),
1104
+ color: y(deltaColor)(l.elo.global.delta),
1095
1105
  class: "ml-2",
1096
1106
  title: `learner global ELO ${l.elo.global.before} → ${l.elo.global.after} · userScore ${l.elo.userScore.toFixed(2)}`
1097
1107
  }, {
1098
- default: b(() => [o(" ELO " + _(v(O)(l.elo.global.delta)), 1)]),
1108
+ default: x(() => [o(" ELO " + v(y(k)(l.elo.global.delta)), 1)]),
1099
1109
  _: 2
1100
- }, 1032, ["color", "title"]), (f(!0), i(e, null, m(v(F)(l.elo), (e) => (f(), n(d, {
1110
+ }, 1032, ["color", "title"]), (p(!0), i(e, null, h(y(R)(l.elo), (e) => (p(), n(d, {
1101
1111
  key: e.tag,
1102
1112
  size: "x-small",
1103
1113
  variant: "text",
1104
- color: v(deltaColor)(e.delta),
1114
+ color: y(deltaColor)(e.delta),
1105
1115
  class: "sk-elo-tag",
1106
1116
  title: `${e.tag}: ${e.before} → ${e.after} (score ${e.score?.toFixed(2)})`
1107
1117
  }, {
1108
- default: b(() => [o(_(v(z)(t.interpreters, e.tag)) + " " + _(v(O)(e.delta)), 1)]),
1118
+ default: x(() => [o(v(y(H)(t.interpreters, e.tag)) + " " + v(y(k)(e.delta)), 1)]),
1109
1119
  _: 2
1110
1120
  }, 1032, ["color", "title"]))), 128))], 64)) : r("", !0)
1111
1121
  ]))
1112
1122
  ], 2))), 128))]))
1113
- ], 64)) : (f(), n(l, {
1123
+ ], 64)) : (p(), n(l, {
1114
1124
  key: 0,
1115
1125
  type: "info",
1116
1126
  variant: "tonal"
1117
1127
  }, {
1118
- default: b(() => [o("No session with id " + _(t.sessionId) + ".", 1)]),
1128
+ default: x(() => [o("No session with id " + v(t.sessionId) + ".", 1)]),
1119
1129
  _: 1
1120
1130
  }))]);
1121
1131
  };
1122
1132
  }
1123
- }), [["__scopeId", "data-v-36c9215c"]]), St = { class: "text-h6" }, Ct = { class: "text-caption" }, wt = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, Tt = ["onClick"], Et = { class: "text-no-wrap" }, Dt = { class: "text-right" }, Q = { class: "text-right" }, Ot = {
1133
+ }), [["__scopeId", "data-v-36c9215c"]]), kt = { class: "text-h6" }, At = { class: "text-caption" }, jt = { class: "d-flex align-center flex-wrap mb-3 ga-3" }, Mt = ["onClick"], Nt = { class: "text-no-wrap" }, Pt = { class: "text-right" }, Ft = { class: "text-right" }, It = {
1124
1134
  key: 1,
1125
1135
  class: "text-disabled"
1126
- }, kt = { class: "text-right" }, At = { class: "text-no-wrap text-caption" }, jt = { class: "text-no-wrap text-caption" }, Mt = { key: 0 }, Nt = {
1136
+ }, Lt = { class: "text-right" }, Rt = { class: "text-no-wrap text-caption" }, zt = { class: "text-no-wrap text-caption" }, Bt = { key: 0 }, Vt = {
1127
1137
  key: 0,
1128
1138
  class: "text-disabled"
1129
- }, Pt = { class: "text-right" }, $ = /* @__PURE__ */ q(/* @__PURE__ */ c({
1139
+ }, Ht = { class: "text-right" }, Z = /* @__PURE__ */ K(/* @__PURE__ */ c({
1130
1140
  __name: "LearnerSessionList",
1131
1141
  props: {
1132
1142
  dataset: {},
@@ -1134,15 +1144,15 @@ var ee = {
1134
1144
  },
1135
1145
  emits: ["open"],
1136
1146
  setup(c, { emit: l }) {
1137
- let d = c, g = l, y = t(() => B(d.dataset, d.interpreters)), x = p("all"), C = t(() => {
1147
+ let d = c, f = l, _ = t(() => U(d.dataset, d.interpreters)), b = m("all"), S = t(() => {
1138
1148
  let e = /* @__PURE__ */ new Map();
1139
- for (let t of y.value) for (let n of t.flags) e.set(n, (e.get(n) ?? 0) + 1);
1149
+ for (let t of _.value) for (let n of t.flags) e.set(n, (e.get(n) ?? 0) + 1);
1140
1150
  return [...e.entries()].map(([e, t]) => ({
1141
1151
  flag: e,
1142
1152
  count: t
1143
1153
  })).sort((e, t) => t.count - e.count);
1144
- }), w = t(() => !x.value || x.value === "all" ? y.value : y.value.filter((e) => e.flags.includes(x.value))), T = t(() => {
1145
- let e = y.value, t = e.filter((e) => e.doc.status === "closed").length, n = e.reduce((e, t) => e + (t.doc.tally?.responses ?? 0), 0), r = e.reduce((e, t) => e + (t.doc.tally?.correct ?? 0), 0), i = e.reduce((e, t) => e + (t.durationSeconds ?? 0), 0);
1154
+ }), w = t(() => !b.value || b.value === "all" ? _.value : _.value.filter((e) => e.flags.includes(b.value))), T = t(() => {
1155
+ let e = _.value, t = e.filter((e) => e.doc.status === "closed").length, n = e.reduce((e, t) => e + (t.doc.tally?.responses ?? 0), 0), r = e.reduce((e, t) => e + (t.doc.tally?.correct ?? 0), 0), i = e.reduce((e, t) => e + (t.durationSeconds ?? 0), 0);
1146
1156
  return [
1147
1157
  {
1148
1158
  label: "sessions",
@@ -1171,7 +1181,7 @@ var ee = {
1171
1181
  },
1172
1182
  {
1173
1183
  label: "time studied",
1174
- value: k(i),
1184
+ value: A(i),
1175
1185
  color: "grey"
1176
1186
  }
1177
1187
  ];
@@ -1192,83 +1202,83 @@ var ee = {
1192
1202
  return t;
1193
1203
  }
1194
1204
  function clockText(e) {
1195
- let t = k(e.doc.plannedSeconds);
1196
- return e.durationSeconds === null ? `— of ${t}` : `${k(e.durationSeconds)} of ${t}`;
1205
+ let t = A(e.doc.plannedSeconds);
1206
+ return e.durationSeconds === null ? `— of ${t}` : `${A(e.durationSeconds)} of ${t}`;
1197
1207
  }
1198
1208
  return (t, c) => {
1199
- let l = h("v-card"), d = h("v-col"), p = h("v-row"), E = h("v-btn"), D = h("v-icon"), k = h("v-btn-toggle"), A = h("v-alert"), j = h("v-chip"), M = h("v-table");
1200
- return f(), i("div", null, [
1209
+ let l = g("v-card"), d = g("v-col"), m = g("v-row"), E = g("v-btn"), D = g("v-icon"), O = g("v-btn-toggle"), A = g("v-alert"), j = g("v-chip"), M = g("v-table");
1210
+ return p(), i("div", null, [
1201
1211
  c[4] || (c[4] = a("p", { class: "text-caption text-medium-emphasis mb-4" }, [
1202
1212
  o(" One row per sitting. Flags name a specific way the session failed to do its job; open one to read its interleaved timeline of responses and pipeline runs. "),
1203
1213
  a("strong", null, "Δ"),
1204
1214
  o(" is movement across the session: ELO, then any progress metrics the course declares. ")
1205
1215
  ], -1)),
1206
- s(p, {
1216
+ s(m, {
1207
1217
  dense: "",
1208
1218
  class: "mb-2"
1209
1219
  }, {
1210
- default: b(() => [(f(!0), i(e, null, m(T.value, (e) => (f(), n(d, {
1220
+ default: x(() => [(p(!0), i(e, null, h(T.value, (e) => (p(), n(d, {
1211
1221
  key: e.label,
1212
1222
  cols: "6",
1213
1223
  sm: "4",
1214
1224
  md: "2"
1215
1225
  }, {
1216
- default: b(() => [s(l, {
1226
+ default: x(() => [s(l, {
1217
1227
  variant: "tonal",
1218
1228
  color: e.color,
1219
1229
  class: "pa-2 text-center"
1220
1230
  }, {
1221
- default: b(() => [a("div", St, _(e.value), 1), a("div", Ct, _(e.label), 1)]),
1231
+ default: x(() => [a("div", kt, v(e.value), 1), a("div", At, v(e.label), 1)]),
1222
1232
  _: 2
1223
1233
  }, 1032, ["color"])]),
1224
1234
  _: 2
1225
1235
  }, 1024))), 128))]),
1226
1236
  _: 1
1227
1237
  }),
1228
- a("div", wt, [s(k, {
1229
- modelValue: x.value,
1230
- "onUpdate:modelValue": c[0] || (c[0] = (e) => x.value = e),
1238
+ a("div", jt, [s(O, {
1239
+ modelValue: b.value,
1240
+ "onUpdate:modelValue": c[0] || (c[0] = (e) => b.value = e),
1231
1241
  density: "compact",
1232
1242
  color: "primary",
1233
1243
  variant: "outlined"
1234
1244
  }, {
1235
- default: b(() => [s(E, {
1245
+ default: x(() => [s(E, {
1236
1246
  value: "all",
1237
1247
  size: "small"
1238
1248
  }, {
1239
- default: b(() => [o("All (" + _(y.value.length) + ")", 1)]),
1249
+ default: x(() => [o("All (" + v(_.value.length) + ")", 1)]),
1240
1250
  _: 1
1241
- }), (f(!0), i(e, null, m(C.value, (e) => (f(), n(E, {
1251
+ }), (p(!0), i(e, null, h(S.value, (e) => (p(), n(E, {
1242
1252
  key: e.flag,
1243
1253
  value: e.flag,
1244
1254
  size: "small",
1245
- title: v(S)[e.flag].help
1255
+ title: y(C)[e.flag].help
1246
1256
  }, {
1247
- default: b(() => [s(D, {
1257
+ default: x(() => [s(D, {
1248
1258
  start: "",
1249
1259
  size: "small",
1250
- color: v(G)[e.flag].color
1260
+ color: y(G)[e.flag].color
1251
1261
  }, {
1252
- default: b(() => [o(_(v(G)[e.flag].icon), 1)]),
1262
+ default: x(() => [o(v(y(G)[e.flag].icon), 1)]),
1253
1263
  _: 2
1254
- }, 1032, ["color"]), o(" " + _(v(S)[e.flag].label) + " (" + _(e.count) + ") ", 1)]),
1264
+ }, 1032, ["color"]), o(" " + v(y(C)[e.flag].label) + " (" + v(e.count) + ") ", 1)]),
1255
1265
  _: 2
1256
1266
  }, 1032, ["value", "title"]))), 128))]),
1257
1267
  _: 1
1258
1268
  }, 8, ["modelValue"])]),
1259
- y.value.length === 0 ? (f(), n(A, {
1269
+ _.value.length === 0 ? (p(), n(A, {
1260
1270
  key: 0,
1261
1271
  type: "info",
1262
1272
  variant: "tonal"
1263
1273
  }, {
1264
- default: b(() => c[1] || (c[1] = [o(" No study sessions recorded. Session records began with a framework release; there is no backfill, so earlier activity shows only in card history. ")])),
1274
+ default: x(() => c[1] || (c[1] = [o(" No study sessions recorded. Session records began with a framework release; there is no backfill, so earlier activity shows only in card history. ")])),
1265
1275
  _: 1
1266
- })) : (f(), n(M, {
1276
+ })) : (p(), n(M, {
1267
1277
  key: 1,
1268
1278
  density: "compact",
1269
1279
  class: "sk-admin-table"
1270
1280
  }, {
1271
- default: b(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
1281
+ default: x(() => [c[3] || (c[3] = a("thead", null, [a("tr", null, [
1272
1282
  a("th", null, "Started"),
1273
1283
  a("th", null, "Status"),
1274
1284
  a("th", { class: "text-right" }, "Cards"),
@@ -1278,117 +1288,465 @@ var ee = {
1278
1288
  a("th", null, "Δ"),
1279
1289
  a("th", null, "Flags"),
1280
1290
  a("th")
1281
- ])], -1)), a("tbody", null, [(f(!0), i(e, null, m(w.value, (t) => (f(), i("tr", {
1291
+ ])], -1)), a("tbody", null, [(p(!0), i(e, null, h(w.value, (t) => (p(), i("tr", {
1282
1292
  key: t.doc.sessionId,
1283
1293
  class: "sk-admin-row",
1284
- onClick: (e) => g("open", t.doc.sessionId)
1294
+ onClick: (e) => f("open", t.doc.sessionId)
1285
1295
  }, [
1286
- a("td", Et, _(v(fmtTime)(t.doc.startTime)), 1),
1296
+ a("td", Nt, v(y(fmtTime)(t.doc.startTime)), 1),
1287
1297
  a("td", null, [s(j, {
1288
1298
  size: "x-small",
1289
1299
  variant: "flat",
1290
- color: v(statusColor)(t.doc.status)
1300
+ color: y(statusColor)(t.doc.status)
1291
1301
  }, {
1292
- default: b(() => [o(_(t.doc.status), 1)]),
1302
+ default: x(() => [o(v(t.doc.status), 1)]),
1293
1303
  _: 2
1294
1304
  }, 1032, ["color"])]),
1295
- a("td", Dt, _(t.doc.tally?.cardsPresented ?? "—"), 1),
1296
- a("td", Q, [t.accuracy === null ? (f(), i("span", Ot, "—")) : (f(), i("span", {
1305
+ a("td", Pt, v(t.doc.tally?.cardsPresented ?? "—"), 1),
1306
+ a("td", Ft, [t.accuracy === null ? (p(), i("span", It, "—")) : (p(), i("span", {
1297
1307
  key: 0,
1298
- class: u(v(accuracyClass)(t.accuracy))
1299
- }, _(Math.round(t.accuracy * 100)) + "% ", 3))]),
1300
- a("td", kt, _(t.doc.runs?.length ?? 0), 1),
1301
- a("td", At, _(clockText(t)), 1),
1302
- a("td", jt, [(f(!0), i(e, null, m(deltas(t), (t, n) => (f(), i(e, { key: t.label }, [n > 0 ? (f(), i("span", Mt, " · ")) : r("", !0), a("span", { class: u(v(deltaClass)(t.delta)) }, _(v(O)(t.delta)) + "\xA0" + _(t.label), 3)], 64))), 128)), deltas(t).length === 0 ? (f(), i("span", Nt, "—")) : r("", !0)]),
1303
- a("td", null, [(f(!0), i(e, null, m(t.flags, (e) => (f(), n(D, {
1308
+ class: u(y(accuracyClass)(t.accuracy))
1309
+ }, v(Math.round(t.accuracy * 100)) + "% ", 3))]),
1310
+ a("td", Lt, v(t.doc.runs?.length ?? 0), 1),
1311
+ a("td", Rt, v(clockText(t)), 1),
1312
+ a("td", zt, [(p(!0), i(e, null, h(deltas(t), (t, n) => (p(), i(e, { key: t.label }, [n > 0 ? (p(), i("span", Bt, " · ")) : r("", !0), a("span", { class: u(y(deltaClass)(t.delta)) }, v(y(k)(t.delta)) + "\xA0" + v(t.label), 3)], 64))), 128)), deltas(t).length === 0 ? (p(), i("span", Vt, "—")) : r("", !0)]),
1313
+ a("td", null, [(p(!0), i(e, null, h(t.flags, (e) => (p(), n(D, {
1304
1314
  key: e,
1305
1315
  size: "small",
1306
1316
  class: "mr-1",
1307
- color: v(G)[e].color,
1308
- title: `${v(S)[e].label}: ${v(S)[e].help}`
1317
+ color: y(G)[e].color,
1318
+ title: `${y(C)[e].label}: ${y(C)[e].help}`
1309
1319
  }, {
1310
- default: b(() => [o(_(v(G)[e].icon), 1)]),
1320
+ default: x(() => [o(v(y(G)[e].icon), 1)]),
1311
1321
  _: 2
1312
1322
  }, 1032, ["color", "title"]))), 128))]),
1313
- a("td", Pt, [s(D, {
1323
+ a("td", Ht, [s(D, {
1314
1324
  size: "small",
1315
1325
  class: "text-disabled"
1316
1326
  }, {
1317
- default: b(() => c[2] || (c[2] = [o("mdi-chevron-right")])),
1327
+ default: x(() => c[2] || (c[2] = [o("mdi-chevron-right")])),
1318
1328
  _: 1
1319
1329
  })])
1320
- ], 8, Tt))), 128))])]),
1330
+ ], 8, Mt))), 128))])]),
1321
1331
  _: 1
1322
1332
  }))
1323
1333
  ]);
1324
1334
  };
1325
1335
  }
1326
- }), [["__scopeId", "data-v-5c46cc58"]]), Ft = /* @__PURE__ */ c({
1336
+ }), [["__scopeId", "data-v-5c46cc58"]]), Ut = { class: "sk-pipeline" }, Wt = { class: "d-flex flex-wrap align-center ga-2 mb-3" }, Gt = { class: "text-caption" }, Kt = {
1337
+ key: 0,
1338
+ class: "text-caption text-medium-emphasis"
1339
+ }, qt = { class: "sk-stage" }, Jt = { class: "d-flex align-center mb-1" }, Yt = { class: "sk-stage-num" }, Xt = { class: "font-weight-medium" }, Zt = { class: "text-caption text-medium-emphasis mb-2" }, Qt = { class: "d-flex flex-wrap align-center ga-2" }, $t = { class: "font-weight-medium" }, en = { class: "text-caption" }, tn = {
1340
+ key: 0,
1341
+ class: "text-caption mt-1"
1342
+ }, nn = {
1343
+ key: 1,
1344
+ class: "text-caption mt-1"
1345
+ }, rn = {
1346
+ key: 1,
1347
+ class: "text-medium-emphasis"
1348
+ }, an = {
1349
+ key: 2,
1350
+ class: "mt-1"
1351
+ }, on = ["onClick"], sn = {
1352
+ key: 0,
1353
+ class: "sk-config"
1354
+ }, cn = {
1355
+ key: 0,
1356
+ class: "text-caption text-medium-emphasis"
1357
+ }, ln = { class: "d-flex flex-wrap align-center ga-2" }, un = { class: "font-weight-medium" }, dn = { class: "text-caption" }, fn = {
1358
+ key: 0,
1359
+ class: "text-caption mt-1"
1360
+ }, pn = {
1361
+ key: 1,
1362
+ class: "text-caption mt-1 text-medium-emphasis"
1363
+ }, mn = {
1364
+ key: 2,
1365
+ class: "mt-1"
1366
+ }, hn = { class: "sk-impact-bar" }, gn = ["title"], _n = { class: "text-caption" }, vn = {
1367
+ key: 1,
1368
+ class: "text-caption text-medium-emphasis"
1369
+ }, yn = {
1370
+ key: 3,
1371
+ class: "mt-1"
1372
+ }, bn = ["onClick"], Q = {
1373
+ key: 0,
1374
+ class: "sk-config"
1375
+ }, xn = { class: "sk-nav" }, Sn = { class: "d-flex flex-wrap align-center ga-2" }, Cn = { class: "text-caption mt-1" }, wn = {
1376
+ key: 0,
1377
+ class: "text-caption mt-1"
1378
+ }, Tn = { class: "sk-nav" }, En = { class: "d-flex flex-wrap align-center ga-2" }, Dn = { class: "text-caption mt-1" }, On = {
1379
+ key: 0,
1380
+ class: "text-caption mt-1"
1381
+ }, kn = {
1382
+ key: 0,
1383
+ class: "text-caption text-medium-emphasis"
1384
+ }, An = {
1385
+ key: 3,
1386
+ class: "text-caption"
1387
+ }, jn = {
1388
+ key: 0,
1389
+ class: "sk-stage-arrow"
1390
+ }, Mn = {
1391
+ key: 0,
1392
+ class: "text-caption text-medium-emphasis mt-3"
1393
+ }, $ = /* @__PURE__ */ K(/* @__PURE__ */ c({
1394
+ __name: "PipelineOverview",
1395
+ props: {
1396
+ strategies: {},
1397
+ courseId: {},
1398
+ stats: {},
1399
+ statsLabel: {}
1400
+ },
1401
+ setup(c) {
1402
+ let l = c, f = {
1403
+ "strategy-doc": {
1404
+ label: "strategy doc",
1405
+ color: "primary"
1406
+ },
1407
+ "assembler-default": {
1408
+ label: "added by the assembler",
1409
+ color: "secondary"
1410
+ },
1411
+ "default-pipeline": {
1412
+ label: "default pipeline",
1413
+ color: "warning"
1414
+ }
1415
+ }, regStat = (e) => l.stats?.regulators.find((t) => t.name === e);
1416
+ function regStatText(e) {
1417
+ return `In these runs: active (×>1) in ${e.runsActive}/${e.runs}, mean ×${e.meanMultiplier.toFixed(2)}, max ×${e.maxMultiplier.toFixed(2)}. Last: ${I(e.last)}.`;
1418
+ }
1419
+ let _ = {
1420
+ gate: "Gate: its penalties mean not ready yet; regulators will not lift what it penalized.",
1421
+ signal: "Signal: its penalties express preference."
1422
+ };
1423
+ function filterKind(e) {
1424
+ let t = e.kind ?? filterStat(e.name)?.kind;
1425
+ return t ? {
1426
+ kind: t,
1427
+ label: t,
1428
+ help: _[t]
1429
+ } : {
1430
+ kind: "gate",
1431
+ label: "gate (undeclared)",
1432
+ help: `${_.gate} Its class declares no kind, so it counts as a gate.`
1433
+ };
1434
+ }
1435
+ let b = t(() => ee(l.strategies, l.courseId)), S = t(() => new Map((l.stats?.generators ?? []).map((e) => [e.name, e]))), C = t(() => new Map((l.stats?.filters ?? []).map((e) => [e.name, e]))), genStat = (e) => S.value.get(e), filterStat = (e) => C.value.get(e), w = t(() => {
1436
+ let e = [...b.value.notes], t = l.stats;
1437
+ if (!t) return e;
1438
+ for (let t of b.value.filters) {
1439
+ let n = filterStat(t.name);
1440
+ n && n.boosted + n.penalized + n.removed === 0 && e.push(`${t.name} changed no candidate's score in ${n.runs} runs.`);
1441
+ }
1442
+ if (t.runsWithSelection > 0) for (let t of b.value.generators) {
1443
+ let n = genStat(t.name);
1444
+ n && n.runs > 0 && n.selected === 0 && e.push(`${t.name} proposed candidates in ${n.runs} runs, and none was selected.`);
1445
+ }
1446
+ return e;
1447
+ });
1448
+ function accuracyOf(e) {
1449
+ return e.firstAttempts > 0 ? e.firstAttemptsCorrect / e.firstAttempts : null;
1450
+ }
1451
+ function impactParts(e) {
1452
+ let t = e.boosted + e.penalized + e.passed + e.removed || 1;
1453
+ return [
1454
+ {
1455
+ key: "boosted",
1456
+ count: e.boosted,
1457
+ color: "success"
1458
+ },
1459
+ {
1460
+ key: "penalized",
1461
+ count: e.penalized,
1462
+ color: "warning"
1463
+ },
1464
+ {
1465
+ key: "passed",
1466
+ count: e.passed,
1467
+ color: "grey"
1468
+ },
1469
+ {
1470
+ key: "removed",
1471
+ count: e.removed,
1472
+ color: "error"
1473
+ }
1474
+ ].map((e) => ({
1475
+ ...e,
1476
+ share: e.count / t
1477
+ }));
1478
+ }
1479
+ function fmtNum(e) {
1480
+ return e >= 10 ? Math.round(e).toString() : e.toFixed(1);
1481
+ }
1482
+ function fmtPct(e) {
1483
+ return e === 0 ? "0%" : e < .01 ? "<1%" : `${Math.round(e * 100)}%`;
1484
+ }
1485
+ let T = m(/* @__PURE__ */ new Set());
1486
+ function toggleConfig(e) {
1487
+ let t = new Set(T.value);
1488
+ t.has(e) ? t.delete(e) : t.add(e), T.value = t;
1489
+ }
1490
+ function prettyConfig(e) {
1491
+ if (!e) return "";
1492
+ try {
1493
+ let t = JSON.parse(e), n = JSON.stringify(t, null, 2);
1494
+ return n === "{}" ? "" : n;
1495
+ } catch {
1496
+ return e;
1497
+ }
1498
+ }
1499
+ return (t, c) => {
1500
+ let l = g("v-chip"), m = g("v-alert"), _ = g("v-icon");
1501
+ return p(), i("div", Ut, [
1502
+ a("div", Wt, [
1503
+ s(l, {
1504
+ size: "small",
1505
+ variant: "tonal",
1506
+ color: b.value.kind === "default" ? "warning" : "primary"
1507
+ }, {
1508
+ default: x(() => [o(v(b.value.kind === "default" ? "default pipeline: the course has no strategy docs" : "assembled from strategy docs"), 1)]),
1509
+ _: 1
1510
+ }, 8, ["color"]),
1511
+ a("span", Gt, v(b.value.generators.length) + " generator(s) · " + v(b.value.filters.length) + " filter(s) ", 1),
1512
+ t.stats ? (p(), i("span", Kt, " · run stats" + v(t.statsLabel ? ` for ${t.statsLabel}` : "") + ": " + v(t.stats.runs) + " runs over " + v(t.stats.sessions) + " sessions, " + v(y(fmtTime)(t.stats.firstRunAt)) + " – " + v(y(fmtTime)(t.stats.lastRunAt)), 1)) : r("", !0)
1513
+ ]),
1514
+ (p(!0), i(e, null, h(b.value.skipped, (e) => (p(), n(m, {
1515
+ key: e.strategy._id,
1516
+ type: "warning",
1517
+ variant: "tonal",
1518
+ density: "compact",
1519
+ class: "mb-2"
1520
+ }, {
1521
+ default: x(() => [
1522
+ a("strong", null, v(e.strategy.name), 1),
1523
+ c[0] || (c[0] = o(" (")),
1524
+ a("code", null, v(e.strategy.implementingClass), 1),
1525
+ o(") is " + v(e.reason) + " in this app, so it would not run here. A course's own navigators only plan correctly in the app that registers them. ", 1)
1526
+ ]),
1527
+ _: 2
1528
+ }, 1024))), 128)),
1529
+ (p(!0), i(e, null, h(b.value.warnings, (e) => (p(), n(m, {
1530
+ key: e,
1531
+ type: "warning",
1532
+ variant: "tonal",
1533
+ density: "compact",
1534
+ class: "mb-2"
1535
+ }, {
1536
+ default: x(() => [o(v(e), 1)]),
1537
+ _: 2
1538
+ }, 1024))), 128)),
1539
+ (p(!0), i(e, null, h(w.value, (e) => (p(), n(m, {
1540
+ key: e,
1541
+ type: "info",
1542
+ variant: "tonal",
1543
+ density: "compact",
1544
+ class: "mb-2"
1545
+ }, {
1546
+ default: x(() => [o(v(e), 1)]),
1547
+ _: 2
1548
+ }, 1024))), 128)),
1549
+ (p(!0), i(e, null, h(y(W), (m, g) => (p(), i("div", { key: m.key }, [a("div", qt, [
1550
+ a("div", Jt, [a("span", Yt, v(g + 1), 1), a("span", Xt, v(m.title), 1)]),
1551
+ a("div", Zt, v(m.summary), 1),
1552
+ m.key === "generate" ? (p(!0), i(e, { key: 0 }, h(b.value.generators, (n) => (p(), i("div", {
1553
+ key: n.name,
1554
+ class: "sk-nav"
1555
+ }, [
1556
+ a("div", Qt, [
1557
+ a("span", $t, v(n.name), 1),
1558
+ a("code", en, v(n.implementingClass), 1),
1559
+ s(l, {
1560
+ size: "x-small",
1561
+ variant: "outlined",
1562
+ color: f[n.origin].color
1563
+ }, {
1564
+ default: x(() => [o(v(f[n.origin].label), 1)]),
1565
+ _: 2
1566
+ }, 1032, ["color"])
1567
+ ]),
1568
+ n.strategy?.description ? (p(), i("div", tn, v(n.strategy.description), 1)) : r("", !0),
1569
+ t.stats ? (p(), i("div", nn, [genStat(n.name) ? (p(), i(e, { key: 0 }, [o(v(fmtNum(genStat(n.name).meanCards)) + " candidates/run (" + v(fmtNum(genStat(n.name).meanNew)) + " new, " + v(fmtNum(genStat(n.name).meanReview)) + " review) · top score " + v(genStat(n.name).topScoreLast.toFixed(2)) + " last, " + v(genStat(n.name).topScoreMax.toFixed(2)) + " max ", 1), t.stats.runsWithSelection > 0 ? (p(), i(e, { key: 0 }, [
1570
+ c[1] || (c[1] = o(" · ")),
1571
+ a("strong", null, v(genStat(n.name).selected), 1),
1572
+ c[2] || (c[2] = o(" selected ")),
1573
+ genStat(n.name).firstAttempts > 0 ? (p(), i(e, { key: 0 }, [o(" · first attempts " + v(genStat(n.name).firstAttemptsCorrect) + "/" + v(genStat(n.name).firstAttempts) + " correct ", 1), a("span", { class: u(y(accuracyClass)(accuracyOf(genStat(n.name)))) }, " (" + v(Math.round(100 * accuracyOf(genStat(n.name)))) + "%) ", 3)], 64)) : r("", !0)
1574
+ ], 64)) : r("", !0)], 64)) : (p(), i("span", rn, "absent from these runs"))])) : r("", !0),
1575
+ prettyConfig(n.strategy?.serializedData) ? (p(), i("div", an, [a("a", {
1576
+ class: "sk-config-link text-caption",
1577
+ onClick: (e) => toggleConfig(`g:${n.name}`)
1578
+ }, v(T.value.has(`g:${n.name}`) ? "Hide" : "Show") + " config ", 9, on), T.value.has(`g:${n.name}`) ? (p(), i("pre", sn, v(prettyConfig(n.strategy?.serializedData)), 1)) : r("", !0)])) : r("", !0)
1579
+ ]))), 128)) : m.key === "filter" ? (p(), i(e, { key: 1 }, [b.value.filters.length === 0 ? (p(), i("div", cn, "No filters.")) : r("", !0), (p(!0), i(e, null, h(b.value.filters, (m) => (p(), i("div", {
1580
+ key: m.name,
1581
+ class: "sk-nav"
1582
+ }, [
1583
+ a("div", ln, [
1584
+ a("span", un, v(m.name), 1),
1585
+ a("code", dn, v(m.implementingClass), 1),
1586
+ s(l, {
1587
+ size: "x-small",
1588
+ variant: "outlined",
1589
+ color: f[m.origin].color
1590
+ }, {
1591
+ default: x(() => [o(v(f[m.origin].label), 1)]),
1592
+ _: 2
1593
+ }, 1032, ["color"]),
1594
+ m.strategy?.learnable ? (p(), n(l, {
1595
+ key: 0,
1596
+ size: "x-small",
1597
+ variant: "outlined"
1598
+ }, {
1599
+ default: x(() => c[3] || (c[3] = [o("learnable weight")])),
1600
+ _: 1
1601
+ })) : r("", !0),
1602
+ s(l, {
1603
+ size: "x-small",
1604
+ variant: "tonal",
1605
+ color: filterKind(m).kind === "gate" ? "deep-orange" : "blue-grey",
1606
+ title: filterKind(m).help
1607
+ }, {
1608
+ default: x(() => [o(v(filterKind(m).label), 1)]),
1609
+ _: 2
1610
+ }, 1032, ["color", "title"])
1611
+ ]),
1612
+ m.strategy?.description ? (p(), i("div", fn, v(m.strategy.description), 1)) : m.strategy ? r("", !0) : (p(), i("div", pn, " Built in code; no strategy document. ")),
1613
+ t.stats ? (p(), i("div", mn, [filterStat(m.name) ? (p(), i(e, { key: 0 }, [a("div", hn, [(p(!0), i(e, null, h(impactParts(filterStat(m.name)), (e) => (p(), i("div", {
1614
+ key: e.key,
1615
+ class: u(`bg-${e.color}`),
1616
+ style: d({ width: `${e.share * 100}%` }),
1617
+ title: `${e.key}: ${e.count}`
1618
+ }, null, 14, gn))), 128))]), a("div", _n, [o(" over " + v(filterStat(m.name).runs) + " runs: ", 1), (p(!0), i(e, null, h(impactParts(filterStat(m.name)), (e) => (p(), i("span", {
1619
+ key: e.key,
1620
+ class: "mr-2"
1621
+ }, [a("span", { class: u(`text-${e.color}`) }, "●", 2), o(" " + v(e.key) + " " + v(fmtPct(e.share)), 1)]))), 128))])], 64)) : (p(), i("span", vn, "absent from these runs"))])) : r("", !0),
1622
+ prettyConfig(m.strategy?.serializedData) ? (p(), i("div", yn, [a("a", {
1623
+ class: "sk-config-link text-caption",
1624
+ onClick: (e) => toggleConfig(`f:${m.name}`)
1625
+ }, v(T.value.has(`f:${m.name}`) ? "Hide" : "Show") + " config ", 9, bn), T.value.has(`f:${m.name}`) ? (p(), i("pre", Q, v(prettyConfig(m.strategy?.serializedData)), 1)) : r("", !0)])) : r("", !0)
1626
+ ]))), 128))], 64)) : m.key === "regulate" ? (p(), i(e, { key: 2 }, [
1627
+ a("div", xn, [
1628
+ a("div", Sn, [c[5] || (c[5] = a("span", { class: "font-weight-medium" }, "Review mass", -1)), s(l, {
1629
+ size: "x-small",
1630
+ variant: "outlined"
1631
+ }, {
1632
+ default: x(() => c[4] || (c[4] = [o("on review cards")])),
1633
+ _: 1
1634
+ })]),
1635
+ a("div", Cn, " Each due review weighs its SRS urgency (0–1) times the filters' net effect on it. Above " + v(b.value.regulators.reviewMass.healthyMass) + " card-equivalents, every review is multiplied by ×" + v(b.value.regulators.reviewMass.rate) + " per " + v(b.value.regulators.reviewMass.healthyMass) + " in excess (uncapped). Reviews without an urgency weigh their score against " + v(b.value.regulators.reviewMass.referenceScore) + ". ", 1),
1636
+ regStat("review-mass") ? (p(), i("div", wn, v(regStatText(regStat("review-mass"))), 1)) : r("", !0)
1637
+ ]),
1638
+ a("div", Tn, [
1639
+ a("div", En, [c[7] || (c[7] = a("span", { class: "font-weight-medium" }, "Intake", -1)), s(l, {
1640
+ size: "x-small",
1641
+ variant: "outlined"
1642
+ }, {
1643
+ default: x(() => c[6] || (c[6] = [o("on new cards no gate penalized")])),
1644
+ _: 1
1645
+ })]),
1646
+ a("div", Dn, " ×" + v(b.value.regulators.intake.rate) + " per " + v(b.value.regulators.intake.scaleHours) + " hours since a new card was last presented (uncapped). The clock stops while no eligible new card exists. ", 1),
1647
+ regStat("intake") ? (p(), i("div", On, v(regStatText(regStat("intake"))), 1)) : r("", !0)
1648
+ ]),
1649
+ t.stats && t.stats.regulators.length === 0 ? (p(), i("div", kn, " None of these runs recorded regulator readings (recorded from 0.2.29). ")) : r("", !0)
1650
+ ], 64)) : m.key === "select" && t.stats && t.stats.runsWithSelection > 0 ? (p(), i("div", An, [
1651
+ o(v(t.stats.selectedUnattributed) + " selected card(s) had no generator: forced in by a hint's ", 1),
1652
+ c[8] || (c[8] = a("code", null, "requireCards", -1)),
1653
+ c[9] || (c[9] = o(". "))
1654
+ ])) : r("", !0)
1655
+ ]), g < y(W).length - 1 ? (p(), i("div", jn, [s(_, { size: "small" }, {
1656
+ default: x(() => c[10] || (c[10] = [o("mdi-arrow-down")])),
1657
+ _: 1
1658
+ })])) : r("", !0)]))), 128)),
1659
+ t.stats && t.stats.runsWithSelection === 0 ? (p(), i("div", Mn, " None of these runs recorded which cards they selected (recorded from 0.2.28), so selection and first-attempt counts are not shown. ")) : r("", !0)
1660
+ ]);
1661
+ };
1662
+ }
1663
+ }), [["__scopeId", "data-v-24b6038f"]]), Nn = /* @__PURE__ */ c({
1327
1664
  __name: "LearnerDiagnostics",
1328
1665
  props: {
1329
1666
  dataset: {},
1330
1667
  interpreters: {}
1331
1668
  },
1332
- setup(t) {
1333
- let r = t, a = p("sessions"), c = p(null), l = p(void 0);
1669
+ setup(a) {
1670
+ let c = a, l = m("sessions"), u = m(null), d = m(void 0), f = t(() => P(c.dataset));
1334
1671
  function openCard(e) {
1335
- l.value = void 0, a.value = "cards", setTimeout(() => l.value = e);
1672
+ d.value = void 0, l.value = "cards", setTimeout(() => d.value = e);
1336
1673
  }
1337
- return y(() => r.dataset, () => {
1338
- a.value = "sessions", c.value = null, l.value = void 0;
1339
- }), (t, r) => {
1340
- let u = h("v-tab"), d = h("v-tabs"), p = h("v-btn");
1341
- return f(), i("div", null, [s(d, {
1342
- modelValue: a.value,
1343
- "onUpdate:modelValue": r[0] || (r[0] = (e) => a.value = e),
1674
+ return b(() => c.dataset, () => {
1675
+ l.value = "sessions", u.value = null, d.value = void 0;
1676
+ }), (t, a) => {
1677
+ let c = g("v-tab"), m = g("v-tabs"), h = g("v-btn");
1678
+ return p(), i("div", null, [s(m, {
1679
+ modelValue: l.value,
1680
+ "onUpdate:modelValue": a[0] || (a[0] = (e) => l.value = e),
1344
1681
  density: "compact",
1345
1682
  class: "mb-4"
1346
1683
  }, {
1347
- default: b(() => [s(u, { value: "sessions" }, {
1348
- default: b(() => [o("Sessions (" + _(t.dataset.sessions.length) + ")", 1)]),
1349
- _: 1
1350
- }), s(u, { value: "cards" }, {
1351
- default: b(() => [o("Cards (" + _(t.dataset.cardHistories.length) + ")", 1)]),
1352
- _: 1
1353
- })]),
1684
+ default: x(() => [
1685
+ s(c, { value: "sessions" }, {
1686
+ default: x(() => [o("Sessions (" + v(t.dataset.sessions.length) + ")", 1)]),
1687
+ _: 1
1688
+ }),
1689
+ s(c, { value: "cards" }, {
1690
+ default: x(() => [o("Cards (" + v(t.dataset.cardHistories.length) + ")", 1)]),
1691
+ _: 1
1692
+ }),
1693
+ t.dataset.strategies ? (p(), n(c, {
1694
+ key: 0,
1695
+ value: "pipeline"
1696
+ }, {
1697
+ default: x(() => a[3] || (a[3] = [o("Pipeline")])),
1698
+ _: 1
1699
+ })) : r("", !0)
1700
+ ]),
1354
1701
  _: 1
1355
- }, 8, ["modelValue"]), a.value === "sessions" ? (f(), i(e, { key: 0 }, [c.value ? (f(), i(e, { key: 0 }, [s(p, {
1702
+ }, 8, ["modelValue"]), l.value === "sessions" ? (p(), i(e, { key: 0 }, [u.value ? (p(), i(e, { key: 0 }, [s(h, {
1356
1703
  variant: "text",
1357
1704
  size: "small",
1358
1705
  "prepend-icon": "mdi-arrow-left",
1359
1706
  class: "mb-2",
1360
- onClick: r[1] || (r[1] = (e) => c.value = null)
1707
+ onClick: a[1] || (a[1] = (e) => u.value = null)
1361
1708
  }, {
1362
- default: b(() => r[3] || (r[3] = [o(" All sessions ")])),
1709
+ default: x(() => a[4] || (a[4] = [o(" All sessions ")])),
1363
1710
  _: 1
1364
- }), s(Z, {
1711
+ }), s(X, {
1365
1712
  dataset: t.dataset,
1366
- "session-id": c.value,
1713
+ "session-id": u.value,
1367
1714
  interpreters: t.interpreters,
1368
1715
  onOpenCard: openCard
1369
1716
  }, null, 8, [
1370
1717
  "dataset",
1371
1718
  "session-id",
1372
1719
  "interpreters"
1373
- ])], 64)) : (f(), n($, {
1720
+ ])], 64)) : (p(), n(Z, {
1374
1721
  key: 1,
1375
1722
  dataset: t.dataset,
1376
1723
  interpreters: t.interpreters,
1377
- onOpen: r[2] || (r[2] = (e) => c.value = e)
1378
- }, null, 8, ["dataset", "interpreters"]))], 64)) : (f(), n(Y, {
1724
+ onOpen: a[2] || (a[2] = (e) => u.value = e)
1725
+ }, null, 8, ["dataset", "interpreters"]))], 64)) : l.value === "cards" ? (p(), n(J, {
1379
1726
  key: 1,
1380
1727
  dataset: t.dataset,
1381
1728
  interpreters: t.interpreters,
1382
- focus: l.value
1729
+ focus: d.value
1383
1730
  }, null, 8, [
1384
1731
  "dataset",
1385
1732
  "interpreters",
1386
1733
  "focus"
1387
- ]))]);
1734
+ ])) : l.value === "pipeline" && t.dataset.strategies ? (p(), n($, {
1735
+ key: 2,
1736
+ strategies: t.dataset.strategies,
1737
+ "course-id": t.dataset.courseId,
1738
+ stats: f.value,
1739
+ "stats-label": t.dataset.username
1740
+ }, null, 8, [
1741
+ "strategies",
1742
+ "course-id",
1743
+ "stats",
1744
+ "stats-label"
1745
+ ])) : r("", !0)]);
1388
1746
  };
1389
1747
  }
1390
1748
  });
1391
1749
  //#endregion
1392
- export { J as CardDossierDetail, Y as LearnerCardHistory, W as LearnerDatasetSource, Ft as LearnerDiagnostics, Z as LearnerSessionDetail, $ as LearnerSessionList, X as RunDetail, downloadLearnerDump, useLearnerDataset };
1750
+ export { q as CardDossierDetail, J as LearnerCardHistory, ie as LearnerDatasetSource, Nn as LearnerDiagnostics, X as LearnerSessionDetail, Z as LearnerSessionList, $ as PipelineOverview, Y as RunDetail, downloadLearnerDump, useLearnerDataset };
1393
1751
 
1394
1752
  //# sourceMappingURL=common-ui-admin.es.js.map