@bojackduy/opencode-learn 0.1.5 → 0.1.6

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.
package/dist/tui.js CHANGED
@@ -9,7 +9,7 @@ import { insert as _$insert } from "@opentui/solid";
9
9
  import { memo as _$memo } from "@opentui/solid";
10
10
  import { setProp as _$setProp } from "@opentui/solid";
11
11
  import { createElement as _$createElement } from "@opentui/solid";
12
- import { createSignal, For, Show, createEffect } from "solid-js";
12
+ import { createSignal, onCleanup, For, Show, createEffect } from "solid-js";
13
13
  import { useKeyboard, useTerminalDimensions } from "@opentui/solid";
14
14
  import * as fs from "fs";
15
15
  import * as path from "path";
@@ -40,6 +40,7 @@ function QuizDialog(props) {
40
40
  const theme = () => props.api.theme.current;
41
41
  const dims = useTerminalDimensions();
42
42
  const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 92));
43
+ const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
43
44
  const options = () => props.request.options;
44
45
  const correctSet = new Set(props.request.correctIndices);
45
46
  const isMulti = () => !!props.request.multiSelect;
@@ -90,10 +91,125 @@ function QuizDialog(props) {
90
91
  };
91
92
  const submitSelect = () => {
92
93
  const selMap = selected();
93
- if (!isMulti() && selMap.size === 0 && !dontKnow())
94
+ if (!isMulti() && selMap.size === 0 && !dontKnow() && !note().trim())
94
95
  return;
95
- if (isMulti() && selMap.size === 0 && !dontKnow())
96
+ if (isMulti() && selMap.size === 0 && !dontKnow() && !note().trim())
96
97
  return;
98
+ if (selMap.size === 0 && !dontKnow() && note().trim()) {
99
+ setPhase("classifying");
100
+ try {
101
+ const pDir = globalThis.__learnPendingDir || ".opencode/learn-pending";
102
+ const routeSessionID = props.api.route?.current?.params?.sessionID;
103
+ const pendingClassify = {
104
+ id: props.request.id,
105
+ type: "classify",
106
+ note: note().trim(),
107
+ question: props.request.question,
108
+ options: options().map((o, i) => ({
109
+ label: o.label,
110
+ value: o.value,
111
+ index: i + 1
112
+ })),
113
+ timestamp: Date.now(),
114
+ sessionID: props.request.sessionID || routeSessionID
115
+ };
116
+ fs.writeFileSync(path.join(pDir, `classify-${props.request.id}.json`), JSON.stringify(pendingClassify), "utf8");
117
+ tlog("QuizDialog classify request", props.request.id, note().trim().slice(0, 50));
118
+ const respPath = path.join(pDir, `classify-response-${props.request.id}.json`);
119
+ let attempts = 0;
120
+ const poll = setInterval(() => {
121
+ attempts++;
122
+ if (attempts > 60) {
123
+ clearInterval(poll);
124
+ setPhase("feedback");
125
+ setFeedback({
126
+ correct: false,
127
+ selectedIndices: []
128
+ });
129
+ return;
130
+ }
131
+ try {
132
+ if (fs.existsSync(respPath)) {
133
+ clearInterval(poll);
134
+ const raw = fs.readFileSync(respPath, "utf8");
135
+ const data = JSON.parse(raw);
136
+ try {
137
+ fs.unlinkSync(respPath);
138
+ fs.unlinkSync(path.join(pDir, `classify-${props.request.id}.json`));
139
+ } catch {}
140
+ const inferred = data?.inferredIndices;
141
+ const inferredValues = data?.inferredValues;
142
+ const semanticCorrect = data?.semanticCorrect;
143
+ const reason = data?.reason;
144
+ const computeCorrect = (idxs) => {
145
+ if (typeof semanticCorrect === "boolean")
146
+ return semanticCorrect;
147
+ return idxs.length === props.request.correctIndices.length && idxs.every((v) => correctSet.has(v)) && props.request.correctIndices.every((v) => idxs.includes(v));
148
+ };
149
+ if (inferred && inferred.length) {
150
+ const m = new Map;
151
+ for (let i = 0;i < inferred.length; i++) {
152
+ const idx = inferred[i];
153
+ const opt = options()[idx - 1];
154
+ if (opt)
155
+ m.set(`opt:${idx - 1}`, {
156
+ label: opt.label,
157
+ value: opt.value,
158
+ index: idx
159
+ });
160
+ }
161
+ setSelected(m);
162
+ const correct2 = computeCorrect(inferred);
163
+ setFeedback({
164
+ correct: correct2,
165
+ selectedIndices: inferred
166
+ });
167
+ if (reason)
168
+ setNote((prev) => prev ? `${prev} \u2014 ${reason}` : prev);
169
+ tlog("QuizDialog classify done", inferred.join(","), correct2, reason || "");
170
+ } else if (inferredValues && inferredValues.length) {
171
+ const byVal = new Map(options().map((o, i) => [o.value, i + 1]));
172
+ const idxs = inferredValues.map((v) => byVal.get(v)).filter(Boolean);
173
+ const m = new Map;
174
+ for (const idx of idxs) {
175
+ const opt = options()[idx - 1];
176
+ if (opt)
177
+ m.set(`opt:${idx - 1}`, {
178
+ label: opt.label,
179
+ value: opt.value,
180
+ index: idx
181
+ });
182
+ }
183
+ setSelected(m);
184
+ const correct2 = computeCorrect(idxs);
185
+ setFeedback({
186
+ correct: correct2,
187
+ selectedIndices: idxs
188
+ });
189
+ } else {
190
+ const correct2 = typeof semanticCorrect === "boolean" ? semanticCorrect : false;
191
+ setFeedback({
192
+ correct: correct2,
193
+ selectedIndices: []
194
+ });
195
+ if (reason)
196
+ setNote((prev) => prev ? `${prev} \u2014 ${reason}` : reason);
197
+ }
198
+ setPhase("feedback");
199
+ }
200
+ } catch {}
201
+ }, 500);
202
+ onCleanup(() => clearInterval(poll));
203
+ } catch (e) {
204
+ tlog("classify request failed", String(e));
205
+ setPhase("feedback");
206
+ setFeedback({
207
+ correct: false,
208
+ selectedIndices: []
209
+ });
210
+ }
211
+ return;
212
+ }
97
213
  if (dontKnow()) {
98
214
  setFeedback({
99
215
  correct: false,
@@ -121,6 +237,10 @@ function QuizDialog(props) {
121
237
  useKeyboard((evt) => {
122
238
  const key = evt.name || evt.sequence || evt.raw || "";
123
239
  const seq = evt.sequence || "";
240
+ if (phase() === "classifying") {
241
+ prevent(evt);
242
+ return;
243
+ }
124
244
  if (phase() === "feedback") {
125
245
  if (key === "enter" || seq === "\r" || key === "escape" || key === "esc") {
126
246
  prevent(evt);
@@ -146,6 +266,13 @@ function QuizDialog(props) {
146
266
  }
147
267
  return;
148
268
  }
269
+ const maxIdx = () => {
270
+ if (isMulti())
271
+ return submitIdx();
272
+ if (note().trim() && !selected().size && !dontKnow())
273
+ return dontKnowIdx() + 1;
274
+ return dontKnowIdx();
275
+ };
149
276
  if (key === "up" || key === "k" || seq === "\x1B[A") {
150
277
  prevent(evt);
151
278
  setOptionIndex((i) => Math.max(0, i - 1));
@@ -153,7 +280,7 @@ function QuizDialog(props) {
153
280
  }
154
281
  if (key === "down" || key === "j" || seq === "\x1B[B") {
155
282
  prevent(evt);
156
- setOptionIndex((i) => Math.min(isMulti() ? submitIdx() : dontKnowIdx(), i + 1));
283
+ setOptionIndex((i) => Math.min(maxIdx(), i + 1));
157
284
  return;
158
285
  }
159
286
  if (key === "tab" || seq === "\t") {
@@ -171,6 +298,8 @@ function QuizDialog(props) {
171
298
  const idx = optionIndex();
172
299
  if (idx === dontKnowIdx())
173
300
  handleDontKnow();
301
+ else if (!isMulti() && idx === dontKnowIdx() + 1 && note().trim() && !selected().size && !dontKnow())
302
+ submitSelect();
174
303
  else {
175
304
  if (isMulti())
176
305
  toggleOption(idx);
@@ -194,6 +323,8 @@ function QuizDialog(props) {
194
323
  const idx = optionIndex();
195
324
  if (idx === dontKnowIdx())
196
325
  handleDontKnow();
326
+ else if (!isMulti() && idx === dontKnowIdx() + 1 && note().trim() && !selected().size && !dontKnow())
327
+ submitSelect();
197
328
  else if (isMulti())
198
329
  submitSelect();
199
330
  else {
@@ -217,9 +348,10 @@ function QuizDialog(props) {
217
348
  }
218
349
  });
219
350
  return (() => {
220
- var _el$ = _$createElement("box"), _el$2 = _$createElement("box"), _el$3 = _$createElement("text"), _el$4 = _$createElement("text"), _el$6 = _$createElement("box"), _el$7 = _$createElement("text");
351
+ var _el$ = _$createElement("box"), _el$2 = _$createElement("box"), _el$3 = _$createElement("text"), _el$4 = _$createElement("text"), _el$6 = _$createElement("scrollbox"), _el$7 = _$createElement("box"), _el$8 = _$createElement("text"), _el$62 = _$createElement("box"), _el$63 = _$createElement("text");
221
352
  _$insertNode(_el$, _el$2);
222
353
  _$insertNode(_el$, _el$6);
354
+ _$insertNode(_el$, _el$62);
223
355
  _$setProp(_el$, "flexDirection", "column");
224
356
  _$setProp(_el$, "border", true);
225
357
  _$setProp(_el$, "padding", 1);
@@ -240,40 +372,42 @@ function QuizDialog(props) {
240
372
  _$insertNode(_el$4, _$createTextNode(`learn`));
241
373
  _$setProp(_el$4, "dim", true);
242
374
  _$insertNode(_el$6, _el$7);
243
- _$setProp(_el$6, "flexDirection", "column");
244
- _$setProp(_el$6, "gap", 1);
245
- _$setProp(_el$6, "paddingLeft", 1);
246
- _$setProp(_el$6, "paddingRight", 1);
247
- _$setProp(_el$6, "paddingTop", 1);
248
- _$setProp(_el$7, "bold", true);
249
- _$setProp(_el$7, "wrapMode", "wrap");
250
- _$insert(_el$7, () => props.request.question);
251
- _$insert(_el$6, _$createComponent(Show, {
375
+ _$setProp(_el$6, "flexGrow", 1);
376
+ _$insertNode(_el$7, _el$8);
377
+ _$setProp(_el$7, "flexDirection", "column");
378
+ _$setProp(_el$7, "gap", 1);
379
+ _$setProp(_el$7, "paddingLeft", 1);
380
+ _$setProp(_el$7, "paddingRight", 1);
381
+ _$setProp(_el$7, "paddingTop", 1);
382
+ _$setProp(_el$8, "bold", true);
383
+ _$setProp(_el$8, "wrapMode", "wrap");
384
+ _$insert(_el$8, () => props.request.question);
385
+ _$insert(_el$7, _$createComponent(Show, {
252
386
  get when() {
253
387
  return props.request.details;
254
388
  },
255
389
  get children() {
256
- var _el$8 = _$createElement("text");
257
- _$setProp(_el$8, "wrapMode", "wrap");
258
- _$insert(_el$8, () => props.request.details);
259
- _$effect((_$p) => _$setProp(_el$8, "fg", theme().textMuted, _$p));
260
- return _el$8;
390
+ var _el$9 = _$createElement("text");
391
+ _$setProp(_el$9, "wrapMode", "wrap");
392
+ _$insert(_el$9, () => props.request.details);
393
+ _$effect((_$p) => _$setProp(_el$9, "fg", theme().textMuted, _$p));
394
+ return _el$9;
261
395
  }
262
396
  }), null);
263
- _$insert(_el$, _$createComponent(Show, {
397
+ _$insert(_el$6, _$createComponent(Show, {
264
398
  get when() {
265
399
  return phase() === "select";
266
400
  },
267
401
  get children() {
268
- var _el$9 = _$createElement("box"), _el$10 = _$createElement("box"), _el$11 = _$createElement("box"), _el$12 = _$createElement("text"), _el$13 = _$createElement("box"), _el$14 = _$createElement("text"), _el$15 = _$createElement("box"), _el$16 = _$createElement("text"), _el$18 = _$createElement("box"), _el$19 = _$createElement("box"), _el$20 = _$createElement("text"), _el$24 = _$createElement("box"), _el$26 = _$createElement("box"), _el$27 = _$createElement("text");
269
- _$insertNode(_el$9, _el$10);
270
- _$insertNode(_el$9, _el$18);
271
- _$insertNode(_el$9, _el$26);
272
- _$setProp(_el$9, "flexDirection", "column");
273
- _$setProp(_el$9, "gap", 0);
274
- _$setProp(_el$9, "padding", 1);
275
- _$setProp(_el$9, "border", true);
276
- _$insert(_el$9, _$createComponent(For, {
402
+ var _el$0 = _$createElement("box"), _el$11 = _$createElement("box"), _el$12 = _$createElement("box"), _el$13 = _$createElement("text"), _el$14 = _$createElement("box"), _el$15 = _$createElement("text"), _el$16 = _$createElement("box"), _el$17 = _$createElement("text"), _el$19 = _$createElement("box"), _el$20 = _$createElement("box"), _el$21 = _$createElement("text"), _el$25 = _$createElement("box"), _el$27 = _$createElement("box"), _el$28 = _$createElement("text");
403
+ _$insertNode(_el$0, _el$11);
404
+ _$insertNode(_el$0, _el$19);
405
+ _$insertNode(_el$0, _el$27);
406
+ _$setProp(_el$0, "flexDirection", "column");
407
+ _$setProp(_el$0, "gap", 0);
408
+ _$setProp(_el$0, "padding", 1);
409
+ _$setProp(_el$0, "border", true);
410
+ _$insert(_el$0, _$createComponent(For, {
277
411
  get each() {
278
412
  return options();
279
413
  },
@@ -282,39 +416,39 @@ function QuizDialog(props) {
282
416
  const isFocused = () => focused() === "options" && optionIndex() === idx;
283
417
  const isSelected = () => selected().has(`opt:${idx}`);
284
418
  return (() => {
285
- var _el$51 = _$createElement("box"), _el$52 = _$createElement("box"), _el$53 = _$createElement("text"), _el$54 = _$createElement("box"), _el$55 = _$createElement("text"), _el$56 = _$createElement("box"), _el$57 = _$createElement("text"), _el$58 = _$createTextNode(`. `);
286
- _$insertNode(_el$51, _el$52);
287
- _$insertNode(_el$51, _el$54);
288
- _$insertNode(_el$51, _el$56);
289
- _$setProp(_el$51, "flexDirection", "row");
290
- _$setProp(_el$51, "alignItems", "flexStart");
291
- _$setProp(_el$51, "gap", 1);
292
- _$setProp(_el$51, "paddingLeft", 1);
293
- _$setProp(_el$51, "paddingRight", 1);
294
- _$insertNode(_el$52, _el$53);
295
- _$setProp(_el$52, "width", 2);
296
- _$setProp(_el$52, "alignItems", "center");
297
- _$insert(_el$53, () => isFocused() ? "\u25B8" : " ");
298
- _$insertNode(_el$54, _el$55);
299
- _$setProp(_el$54, "width", 2);
300
- _$setProp(_el$54, "alignItems", "center");
301
- _$insert(_el$55, (() => {
302
- var _c$2 = _$memo(() => !!isMulti());
303
- return () => _c$2() ? isSelected() ? "\u2611" : "\u2610" : isSelected() ? "\u2B22" : "\u25CB";
419
+ var _el$64 = _$createElement("box"), _el$65 = _$createElement("box"), _el$66 = _$createElement("text"), _el$67 = _$createElement("box"), _el$68 = _$createElement("text"), _el$69 = _$createElement("box"), _el$70 = _$createElement("text"), _el$71 = _$createTextNode(`. `);
420
+ _$insertNode(_el$64, _el$65);
421
+ _$insertNode(_el$64, _el$67);
422
+ _$insertNode(_el$64, _el$69);
423
+ _$setProp(_el$64, "flexDirection", "row");
424
+ _$setProp(_el$64, "alignItems", "flexStart");
425
+ _$setProp(_el$64, "gap", 1);
426
+ _$setProp(_el$64, "paddingLeft", 1);
427
+ _$setProp(_el$64, "paddingRight", 1);
428
+ _$insertNode(_el$65, _el$66);
429
+ _$setProp(_el$65, "width", 2);
430
+ _$setProp(_el$65, "alignItems", "center");
431
+ _$insert(_el$66, () => isFocused() ? "\u25B8" : " ");
432
+ _$insertNode(_el$67, _el$68);
433
+ _$setProp(_el$67, "width", 2);
434
+ _$setProp(_el$67, "alignItems", "center");
435
+ _$insert(_el$68, (() => {
436
+ var _c$4 = _$memo(() => !!isMulti());
437
+ return () => _c$4() ? isSelected() ? "\u2611" : "\u2610" : isSelected() ? "\u2B22" : "\u25CB";
304
438
  })());
305
- _$insertNode(_el$56, _el$57);
306
- _$setProp(_el$56, "flexGrow", 1);
307
- _$insertNode(_el$57, _el$58);
308
- _$setProp(_el$57, "wrapMode", "wrap");
309
- _$insert(_el$57, idx + 1, _el$58);
310
- _$insert(_el$57, () => opt.label, null);
439
+ _$insertNode(_el$69, _el$70);
440
+ _$setProp(_el$69, "flexGrow", 1);
441
+ _$insertNode(_el$70, _el$71);
442
+ _$setProp(_el$70, "wrapMode", "wrap");
443
+ _$insert(_el$70, idx + 1, _el$71);
444
+ _$insert(_el$70, () => opt.label, null);
311
445
  _$effect((_p$) => {
312
- var _v$29 = isFocused() ? theme().backgroundElement : undefined, _v$30 = isFocused() ? theme().accent : theme().textMuted, _v$31 = isMulti() ? isSelected() ? theme().success : theme().textMuted : isSelected() ? theme().accent : theme().textMuted, _v$32 = isSelected() ? theme().text : theme().textMuted, _v$33 = isFocused();
313
- _v$29 !== _p$.e && (_p$.e = _$setProp(_el$51, "backgroundColor", _v$29, _p$.e));
314
- _v$30 !== _p$.t && (_p$.t = _$setProp(_el$53, "fg", _v$30, _p$.t));
315
- _v$31 !== _p$.a && (_p$.a = _$setProp(_el$55, "fg", _v$31, _p$.a));
316
- _v$32 !== _p$.o && (_p$.o = _$setProp(_el$57, "fg", _v$32, _p$.o));
317
- _v$33 !== _p$.i && (_p$.i = _$setProp(_el$57, "bold", _v$33, _p$.i));
446
+ var _v$38 = isFocused() ? theme().backgroundElement : undefined, _v$39 = isFocused() ? theme().accent : theme().textMuted, _v$40 = isMulti() ? isSelected() ? theme().success : theme().textMuted : isSelected() ? theme().accent : theme().textMuted, _v$41 = isSelected() ? theme().text : theme().textMuted, _v$42 = isFocused();
447
+ _v$38 !== _p$.e && (_p$.e = _$setProp(_el$64, "backgroundColor", _v$38, _p$.e));
448
+ _v$39 !== _p$.t && (_p$.t = _$setProp(_el$66, "fg", _v$39, _p$.t));
449
+ _v$40 !== _p$.a && (_p$.a = _$setProp(_el$68, "fg", _v$40, _p$.a));
450
+ _v$41 !== _p$.o && (_p$.o = _$setProp(_el$70, "fg", _v$41, _p$.o));
451
+ _v$42 !== _p$.i && (_p$.i = _$setProp(_el$70, "bold", _v$42, _p$.i));
318
452
  return _p$;
319
453
  }, {
320
454
  e: undefined,
@@ -323,135 +457,155 @@ function QuizDialog(props) {
323
457
  o: undefined,
324
458
  i: undefined
325
459
  });
326
- return _el$51;
460
+ return _el$64;
327
461
  })();
328
462
  }
329
- }), _el$10);
330
- _$insert(_el$9, _$createComponent(Show, {
463
+ }), _el$11);
464
+ _$insert(_el$0, _$createComponent(Show, {
331
465
  get when() {
332
466
  return options().length > 0;
333
467
  },
334
468
  get children() {
335
- var _el$0 = _$createElement("box"), _el$1 = _$createElement("text");
336
- _$insertNode(_el$0, _el$1);
337
- _$setProp(_el$0, "height", 1);
338
- _$insert(_el$1, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
339
- _$effect((_$p) => _$setProp(_el$1, "fg", theme().borderSubtle, _$p));
340
- return _el$0;
469
+ var _el$1 = _$createElement("box"), _el$10 = _$createElement("text");
470
+ _$insertNode(_el$1, _el$10);
471
+ _$setProp(_el$1, "height", 1);
472
+ _$insert(_el$10, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
473
+ _$effect((_$p) => _$setProp(_el$10, "fg", theme().borderSubtle, _$p));
474
+ return _el$1;
341
475
  }
342
- }), _el$10);
343
- _$insertNode(_el$10, _el$11);
344
- _$insertNode(_el$10, _el$13);
345
- _$insertNode(_el$10, _el$15);
346
- _$setProp(_el$10, "flexDirection", "row");
347
- _$setProp(_el$10, "alignItems", "flexStart");
348
- _$setProp(_el$10, "gap", 1);
349
- _$setProp(_el$10, "paddingLeft", 1);
350
- _$setProp(_el$10, "paddingRight", 1);
476
+ }), _el$11);
351
477
  _$insertNode(_el$11, _el$12);
352
- _$setProp(_el$11, "width", 2);
353
- _$setProp(_el$11, "alignItems", "center");
354
- _$insert(_el$12, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
355
- _$insertNode(_el$13, _el$14);
356
- _$setProp(_el$13, "width", 2);
357
- _$setProp(_el$13, "alignItems", "center");
358
- _$insert(_el$14, () => dontKnow() ? "\u2611" : "\u2610");
359
- _$insertNode(_el$15, _el$16);
360
- _$setProp(_el$15, "flexGrow", 1);
361
- _$insertNode(_el$16, _$createTextNode(`I don't know \u2014 genuine gap, not a guess`));
362
- _$setProp(_el$16, "italic", true);
363
- _$setProp(_el$16, "wrapMode", "wrap");
364
- _$insertNode(_el$18, _el$19);
365
- _$insertNode(_el$18, _el$24);
366
- _$setProp(_el$18, "flexDirection", "column");
367
- _$setProp(_el$18, "gap", 0);
368
- _$setProp(_el$18, "paddingTop", 1);
478
+ _$insertNode(_el$11, _el$14);
479
+ _$insertNode(_el$11, _el$16);
480
+ _$setProp(_el$11, "flexDirection", "row");
481
+ _$setProp(_el$11, "alignItems", "flexStart");
482
+ _$setProp(_el$11, "gap", 1);
483
+ _$setProp(_el$11, "paddingLeft", 1);
484
+ _$setProp(_el$11, "paddingRight", 1);
485
+ _$insertNode(_el$12, _el$13);
486
+ _$setProp(_el$12, "width", 2);
487
+ _$setProp(_el$12, "alignItems", "center");
488
+ _$insert(_el$13, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
489
+ _$insertNode(_el$14, _el$15);
490
+ _$setProp(_el$14, "width", 2);
491
+ _$setProp(_el$14, "alignItems", "center");
492
+ _$insert(_el$15, () => dontKnow() ? "\u2611" : "\u2610");
493
+ _$insertNode(_el$16, _el$17);
494
+ _$setProp(_el$16, "flexGrow", 1);
495
+ _$insertNode(_el$17, _$createTextNode(`I don't know \u2014 genuine gap, not a guess`));
496
+ _$setProp(_el$17, "italic", true);
497
+ _$setProp(_el$17, "wrapMode", "wrap");
369
498
  _$insertNode(_el$19, _el$20);
370
- _$setProp(_el$19, "flexDirection", "row");
371
- _$setProp(_el$19, "alignItems", "center");
372
- _$setProp(_el$19, "gap", 1);
373
- _$insertNode(_el$20, _$createTextNode(`\u270E Note (optional)`));
374
- _$insert(_el$19, _$createComponent(Show, {
499
+ _$insertNode(_el$19, _el$25);
500
+ _$setProp(_el$19, "flexDirection", "column");
501
+ _$setProp(_el$19, "gap", 0);
502
+ _$setProp(_el$19, "paddingTop", 1);
503
+ _$insertNode(_el$20, _el$21);
504
+ _$setProp(_el$20, "flexDirection", "row");
505
+ _$setProp(_el$20, "alignItems", "center");
506
+ _$setProp(_el$20, "gap", 1);
507
+ _$insertNode(_el$21, _$createTextNode(`\u270E Note (optional)`));
508
+ _$insert(_el$20, _$createComponent(Show, {
375
509
  get when() {
376
510
  return focused() === "note";
377
511
  },
378
512
  get children() {
379
- var _el$22 = _$createElement("text");
380
- _$insertNode(_el$22, _$createTextNode(`\u25CF editing`));
381
- _$effect((_$p) => _$setProp(_el$22, "fg", theme().accent, _$p));
382
- return _el$22;
513
+ var _el$23 = _$createElement("text");
514
+ _$insertNode(_el$23, _$createTextNode(`\u25CF editing`));
515
+ _$effect((_$p) => _$setProp(_el$23, "fg", theme().accent, _$p));
516
+ return _el$23;
383
517
  }
384
518
  }), null);
385
- _$setProp(_el$24, "border", true);
386
- _$setProp(_el$24, "paddingLeft", 1);
387
- _$setProp(_el$24, "paddingRight", 1);
388
- _$insert(_el$24, _$createComponent(Show, {
519
+ _$setProp(_el$25, "border", true);
520
+ _$setProp(_el$25, "paddingLeft", 1);
521
+ _$setProp(_el$25, "paddingRight", 1);
522
+ _$insert(_el$25, _$createComponent(Show, {
389
523
  get when() {
390
524
  return focused() === "note";
391
525
  },
392
526
  get fallback() {
393
527
  return (() => {
394
- var _el$59 = _$createElement("text");
395
- _$setProp(_el$59, "wrapMode", "wrap");
396
- _$insert(_el$59, () => note() || "Tab to edit \xB7 share what you were thinking");
397
- _$effect((_$p) => _$setProp(_el$59, "fg", note() ? theme().text : theme().textMuted, _$p));
398
- return _el$59;
528
+ var _el$72 = _$createElement("text");
529
+ _$setProp(_el$72, "wrapMode", "wrap");
530
+ _$insert(_el$72, () => note() || "Tab to edit \xB7 share what you were thinking");
531
+ _$effect((_$p) => _$setProp(_el$72, "fg", note() ? theme().text : theme().textMuted, _$p));
532
+ return _el$72;
399
533
  })();
400
534
  },
401
535
  get children() {
402
- var _el$25 = _$createElement("input");
403
- _$use((el) => noteInputEl = el, _el$25);
404
- _$setProp(_el$25, "onInput", (value) => setNote(typeof value === "string" ? value : value?.target?.value ?? value?.value ?? String(value ?? "")));
405
- _$setProp(_el$25, "onSubmit", () => setFocused("options"));
406
- _$setProp(_el$25, "placeholder", "what was on your mind?");
407
- _$effect((_$p) => _$setProp(_el$25, "value", note(), _$p));
408
- return _el$25;
536
+ var _el$26 = _$createElement("input");
537
+ _$use((el) => noteInputEl = el, _el$26);
538
+ _$setProp(_el$26, "onInput", (value) => setNote(typeof value === "string" ? value : value?.target?.value ?? value?.value ?? String(value ?? "")));
539
+ _$setProp(_el$26, "onSubmit", () => {
540
+ if (!selected().size && !dontKnow() && note().trim())
541
+ submitSelect();
542
+ else
543
+ setFocused("options");
544
+ });
545
+ _$setProp(_el$26, "placeholder", "what was on your mind? (Enter to submit note \u2192 classify)");
546
+ _$effect((_$p) => _$setProp(_el$26, "value", note(), _$p));
547
+ return _el$26;
409
548
  }
410
549
  }));
411
- _$insertNode(_el$26, _el$27);
412
- _$setProp(_el$26, "flexDirection", "row");
413
- _$setProp(_el$26, "justifyContent", "space-between");
414
- _$setProp(_el$26, "paddingTop", 1);
415
- _$insertNode(_el$27, _$createTextNode(`\u2191\u2193/j k \xB7 Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Esc cancel`));
416
- _$insert(_el$26, _$createComponent(Show, {
550
+ _$insertNode(_el$27, _el$28);
551
+ _$setProp(_el$27, "flexDirection", "row");
552
+ _$setProp(_el$27, "justifyContent", "space-between");
553
+ _$setProp(_el$27, "paddingTop", 1);
554
+ _$insert(_el$28, () => focused() === "note" ? "Enter submit note \u2192 classify \xB7 Tab back \xB7 Esc back" : "\u2191\u2193/j k \xB7 Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Esc cancel");
555
+ _$insert(_el$27, _$createComponent(Show, {
417
556
  get when() {
418
557
  return isMulti();
419
558
  },
420
559
  get children() {
421
- var _el$29 = _$createElement("text"), _el$30 = _$createTextNode(` selected `);
560
+ var _el$29 = _$createElement("text"), _el$30 = _$createTextNode(` `);
422
561
  _$insertNode(_el$29, _el$30);
423
- _$insert(_el$29, () => selected().size, _el$30);
562
+ _$insert(_el$29, (() => {
563
+ var _c$2 = _$memo(() => selected().size > 0);
564
+ return () => _c$2() ? `${selected().size} selected` : note().trim() ? "note \u2192 classify" : "0 selected";
565
+ })(), _el$30);
424
566
  _$insert(_el$29, () => dontKnow() ? "\xB7 I don't know" : "", null);
425
- _$effect((_$p) => _$setProp(_el$29, "fg", selected().size > 0 || dontKnow() ? theme().success : theme().warning, _$p));
567
+ _$effect((_$p) => _$setProp(_el$29, "fg", selected().size > 0 || dontKnow() ? theme().success : note().trim() ? theme().warning : theme().warning, _$p));
426
568
  return _el$29;
427
569
  }
428
570
  }), null);
429
- _$insert(_el$9, _$createComponent(Show, {
571
+ _$insert(_el$27, _$createComponent(Show, {
572
+ get when() {
573
+ return _$memo(() => !!(!isMulti() && note().trim() && !selected().size))() && !dontKnow();
574
+ },
575
+ get children() {
576
+ var _el$31 = _$createElement("text");
577
+ _$insertNode(_el$31, _$createTextNode(`note \u2192 classify on Enter`));
578
+ _$effect((_$p) => _$setProp(_el$31, "fg", theme().warning, _$p));
579
+ return _el$31;
580
+ }
581
+ }), null);
582
+ _$insert(_el$0, _$createComponent(Show, {
430
583
  get when() {
431
584
  return isMulti();
432
585
  },
433
586
  get children() {
434
- var _el$31 = _$createElement("box"), _el$32 = _$createElement("box"), _el$33 = _$createElement("text"), _el$34 = _$createElement("text");
435
- _$insertNode(_el$31, _el$32);
436
- _$setProp(_el$31, "justifyContent", "center");
437
- _$setProp(_el$31, "paddingTop", 1);
438
- _$insertNode(_el$32, _el$33);
439
- _$insertNode(_el$32, _el$34);
440
- _$setProp(_el$32, "flexDirection", "row");
441
- _$setProp(_el$32, "alignItems", "center");
442
- _$setProp(_el$32, "gap", 1);
443
- _$setProp(_el$32, "border", true);
444
- _$setProp(_el$32, "paddingLeft", 2);
445
- _$setProp(_el$32, "paddingRight", 2);
446
- _$insert(_el$33, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
447
- _$insertNode(_el$34, _$createTextNode(`\u21B3 Submit`));
448
- _$setProp(_el$34, "bold", true);
587
+ var _el$33 = _$createElement("box"), _el$34 = _$createElement("box"), _el$35 = _$createElement("text"), _el$36 = _$createElement("text"), _el$37 = _$createTextNode(`\u21B3 Submit`);
588
+ _$insertNode(_el$33, _el$34);
589
+ _$setProp(_el$33, "justifyContent", "center");
590
+ _$setProp(_el$33, "paddingTop", 1);
591
+ _$insertNode(_el$34, _el$35);
592
+ _$insertNode(_el$34, _el$36);
593
+ _$setProp(_el$34, "flexDirection", "row");
594
+ _$setProp(_el$34, "alignItems", "center");
595
+ _$setProp(_el$34, "gap", 1);
596
+ _$setProp(_el$34, "border", true);
597
+ _$setProp(_el$34, "paddingLeft", 2);
598
+ _$setProp(_el$34, "paddingRight", 2);
599
+ _$insert(_el$35, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
600
+ _$insertNode(_el$36, _el$37);
601
+ _$setProp(_el$36, "bold", true);
602
+ _$insert(_el$36, () => note().trim() && !selected().size && !dontKnow() ? " note" : "", null);
449
603
  _$effect((_p$) => {
450
- var _v$ = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() ? theme().success : theme().borderSubtle, _v$2 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : selected().size > 0 || dontKnow() ? theme().success : theme().background, _v$3 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() ? theme().background : theme().textMuted, _v$4 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() ? theme().background : theme().textMuted;
451
- _v$ !== _p$.e && (_p$.e = _$setProp(_el$32, "borderColor", _v$, _p$.e));
452
- _v$2 !== _p$.t && (_p$.t = _$setProp(_el$32, "backgroundColor", _v$2, _p$.t));
453
- _v$3 !== _p$.a && (_p$.a = _$setProp(_el$33, "fg", _v$3, _p$.a));
454
- _v$4 !== _p$.o && (_p$.o = _$setProp(_el$34, "fg", _v$4, _p$.o));
604
+ var _v$ = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().borderSubtle, _v$2 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : selected().size > 0 || dontKnow() || note().trim() ? theme().success : theme().background, _v$3 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted, _v$4 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : selected().size > 0 || dontKnow() || note().trim() ? theme().background : theme().textMuted;
605
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$34, "borderColor", _v$, _p$.e));
606
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$34, "backgroundColor", _v$2, _p$.t));
607
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$35, "fg", _v$3, _p$.a));
608
+ _v$4 !== _p$.o && (_p$.o = _$setProp(_el$36, "fg", _v$4, _p$.o));
455
609
  return _p$;
456
610
  }, {
457
611
  e: undefined,
@@ -459,22 +613,54 @@ function QuizDialog(props) {
459
613
  a: undefined,
460
614
  o: undefined
461
615
  });
462
- return _el$31;
616
+ return _el$33;
617
+ }
618
+ }), null);
619
+ _$insert(_el$0, _$createComponent(Show, {
620
+ get when() {
621
+ return _$memo(() => !!(!isMulti() && note().trim() && !selected().size))() && !dontKnow();
622
+ },
623
+ get children() {
624
+ var _el$38 = _$createElement("box"), _el$39 = _$createElement("box"), _el$40 = _$createElement("text");
625
+ _$insertNode(_el$38, _el$39);
626
+ _$setProp(_el$38, "justifyContent", "center");
627
+ _$setProp(_el$38, "paddingTop", 1);
628
+ _$insertNode(_el$39, _el$40);
629
+ _$setProp(_el$39, "flexDirection", "row");
630
+ _$setProp(_el$39, "alignItems", "center");
631
+ _$setProp(_el$39, "gap", 1);
632
+ _$setProp(_el$39, "border", true);
633
+ _$setProp(_el$39, "paddingLeft", 2);
634
+ _$setProp(_el$39, "paddingRight", 2);
635
+ _$insertNode(_el$40, _$createTextNode(`\u21B3 Submit note \u2192 classify`));
636
+ _$setProp(_el$40, "bold", true);
637
+ _$effect((_p$) => {
638
+ var _v$5 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().success, _v$6 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().backgroundElement : theme().success, _v$7 = focused() === "options" && optionIndex() === dontKnowIdx() + 1 ? theme().accent : theme().background;
639
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$39, "borderColor", _v$5, _p$.e));
640
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$39, "backgroundColor", _v$6, _p$.t));
641
+ _v$7 !== _p$.a && (_p$.a = _$setProp(_el$40, "fg", _v$7, _p$.a));
642
+ return _p$;
643
+ }, {
644
+ e: undefined,
645
+ t: undefined,
646
+ a: undefined
647
+ });
648
+ return _el$38;
463
649
  }
464
650
  }), null);
465
651
  _$effect((_p$) => {
466
- var _v$5 = theme().borderSubtle, _v$6 = theme().background, _v$7 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$8 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$9 = dontKnow() ? theme().warning : theme().textMuted, _v$0 = dontKnow() ? theme().warning : theme().textMuted, _v$1 = focused() === "note" ? theme().accent : theme().textMuted, _v$10 = focused() === "note", _v$11 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$12 = theme().backgroundElement, _v$13 = theme().textMuted;
467
- _v$5 !== _p$.e && (_p$.e = _$setProp(_el$9, "borderColor", _v$5, _p$.e));
468
- _v$6 !== _p$.t && (_p$.t = _$setProp(_el$9, "backgroundColor", _v$6, _p$.t));
469
- _v$7 !== _p$.a && (_p$.a = _$setProp(_el$10, "backgroundColor", _v$7, _p$.a));
470
- _v$8 !== _p$.o && (_p$.o = _$setProp(_el$12, "fg", _v$8, _p$.o));
471
- _v$9 !== _p$.i && (_p$.i = _$setProp(_el$14, "fg", _v$9, _p$.i));
472
- _v$0 !== _p$.n && (_p$.n = _$setProp(_el$16, "fg", _v$0, _p$.n));
473
- _v$1 !== _p$.s && (_p$.s = _$setProp(_el$20, "fg", _v$1, _p$.s));
474
- _v$10 !== _p$.h && (_p$.h = _$setProp(_el$20, "bold", _v$10, _p$.h));
475
- _v$11 !== _p$.r && (_p$.r = _$setProp(_el$24, "borderColor", _v$11, _p$.r));
476
- _v$12 !== _p$.d && (_p$.d = _$setProp(_el$24, "backgroundColor", _v$12, _p$.d));
477
- _v$13 !== _p$.l && (_p$.l = _$setProp(_el$27, "fg", _v$13, _p$.l));
652
+ var _v$8 = theme().borderSubtle, _v$9 = theme().background, _v$0 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$1 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$10 = dontKnow() ? theme().warning : theme().textMuted, _v$11 = dontKnow() ? theme().warning : theme().textMuted, _v$12 = focused() === "note" ? theme().accent : theme().textMuted, _v$13 = focused() === "note", _v$14 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$15 = theme().backgroundElement, _v$16 = theme().textMuted;
653
+ _v$8 !== _p$.e && (_p$.e = _$setProp(_el$0, "borderColor", _v$8, _p$.e));
654
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$0, "backgroundColor", _v$9, _p$.t));
655
+ _v$0 !== _p$.a && (_p$.a = _$setProp(_el$11, "backgroundColor", _v$0, _p$.a));
656
+ _v$1 !== _p$.o && (_p$.o = _$setProp(_el$13, "fg", _v$1, _p$.o));
657
+ _v$10 !== _p$.i && (_p$.i = _$setProp(_el$15, "fg", _v$10, _p$.i));
658
+ _v$11 !== _p$.n && (_p$.n = _$setProp(_el$17, "fg", _v$11, _p$.n));
659
+ _v$12 !== _p$.s && (_p$.s = _$setProp(_el$21, "fg", _v$12, _p$.s));
660
+ _v$13 !== _p$.h && (_p$.h = _$setProp(_el$21, "bold", _v$13, _p$.h));
661
+ _v$14 !== _p$.r && (_p$.r = _$setProp(_el$25, "borderColor", _v$14, _p$.r));
662
+ _v$15 !== _p$.d && (_p$.d = _$setProp(_el$25, "backgroundColor", _v$15, _p$.d));
663
+ _v$16 !== _p$.l && (_p$.l = _$setProp(_el$28, "fg", _v$16, _p$.l));
478
664
  return _p$;
479
665
  }, {
480
666
  e: undefined,
@@ -489,24 +675,62 @@ function QuizDialog(props) {
489
675
  d: undefined,
490
676
  l: undefined
491
677
  });
492
- return _el$9;
678
+ return _el$0;
493
679
  }
494
680
  }), null);
495
- _$insert(_el$, _$createComponent(Show, {
681
+ _$insert(_el$6, _$createComponent(Show, {
682
+ get when() {
683
+ return phase() === "classifying";
684
+ },
685
+ get children() {
686
+ var _el$42 = _$createElement("box"), _el$43 = _$createElement("text"), _el$45 = _$createElement("text"), _el$46 = _$createTextNode(`"`), _el$47 = _$createTextNode(`"`), _el$48 = _$createElement("text");
687
+ _$insertNode(_el$42, _el$43);
688
+ _$insertNode(_el$42, _el$45);
689
+ _$insertNode(_el$42, _el$48);
690
+ _$setProp(_el$42, "flexDirection", "column");
691
+ _$setProp(_el$42, "gap", 1);
692
+ _$setProp(_el$42, "padding", 1);
693
+ _$setProp(_el$42, "border", true);
694
+ _$setProp(_el$42, "alignItems", "center");
695
+ _$insertNode(_el$43, _$createTextNode(`\u25D0 Classifying your note...`));
696
+ _$setProp(_el$43, "bold", true);
697
+ _$insertNode(_el$45, _el$46);
698
+ _$insertNode(_el$45, _el$47);
699
+ _$setProp(_el$45, "wrapMode", "wrap");
700
+ _$insert(_el$45, note, _el$47);
701
+ _$insertNode(_el$48, _$createTextNode(`Mapping to options \u2014 please wait`));
702
+ _$effect((_p$) => {
703
+ var _v$17 = theme().accent, _v$18 = theme().background, _v$19 = theme().accent, _v$20 = theme().textMuted, _v$21 = theme().textMuted;
704
+ _v$17 !== _p$.e && (_p$.e = _$setProp(_el$42, "borderColor", _v$17, _p$.e));
705
+ _v$18 !== _p$.t && (_p$.t = _$setProp(_el$42, "backgroundColor", _v$18, _p$.t));
706
+ _v$19 !== _p$.a && (_p$.a = _$setProp(_el$43, "fg", _v$19, _p$.a));
707
+ _v$20 !== _p$.o && (_p$.o = _$setProp(_el$45, "fg", _v$20, _p$.o));
708
+ _v$21 !== _p$.i && (_p$.i = _$setProp(_el$48, "fg", _v$21, _p$.i));
709
+ return _p$;
710
+ }, {
711
+ e: undefined,
712
+ t: undefined,
713
+ a: undefined,
714
+ o: undefined,
715
+ i: undefined
716
+ });
717
+ return _el$42;
718
+ }
719
+ }), null);
720
+ _$insert(_el$6, _$createComponent(Show, {
496
721
  get when() {
497
722
  return phase() === "feedback";
498
723
  },
499
724
  get children() {
500
- var _el$36 = _$createElement("box"), _el$37 = _$createElement("box"), _el$38 = _$createElement("text"), _el$42 = _$createElement("text"), _el$43 = _$createTextNode(`Correct: `), _el$46 = _$createElement("box"), _el$47 = _$createElement("text"), _el$48 = _$createElement("box"), _el$49 = _$createElement("text");
501
- _$insertNode(_el$36, _el$37);
502
- _$insertNode(_el$36, _el$42);
503
- _$insertNode(_el$36, _el$46);
504
- _$insertNode(_el$36, _el$48);
505
- _$setProp(_el$36, "flexDirection", "column");
506
- _$setProp(_el$36, "gap", 1);
507
- _$setProp(_el$36, "padding", 1);
508
- _$setProp(_el$36, "border", true);
509
- _$insert(_el$36, _$createComponent(For, {
725
+ var _el$50 = _$createElement("box"), _el$51 = _$createElement("box"), _el$52 = _$createElement("text"), _el$56 = _$createElement("text"), _el$57 = _$createTextNode(`Correct: `), _el$60 = _$createElement("box"), _el$61 = _$createElement("text");
726
+ _$insertNode(_el$50, _el$51);
727
+ _$insertNode(_el$50, _el$56);
728
+ _$insertNode(_el$50, _el$60);
729
+ _$setProp(_el$50, "flexDirection", "column");
730
+ _$setProp(_el$50, "gap", 1);
731
+ _$setProp(_el$50, "padding", 1);
732
+ _$setProp(_el$50, "border", true);
733
+ _$insert(_el$50, _$createComponent(For, {
510
734
  get each() {
511
735
  return options();
512
736
  },
@@ -535,90 +759,85 @@ function QuizDialog(props) {
535
759
  bg = theme().warning;
536
760
  }
537
761
  return (() => {
538
- var _el$60 = _$createElement("box"), _el$61 = _$createElement("box"), _el$62 = _$createElement("text"), _el$63 = _$createElement("box"), _el$64 = _$createElement("text"), _el$65 = _$createTextNode(`. `);
539
- _$insertNode(_el$60, _el$61);
540
- _$insertNode(_el$60, _el$63);
541
- _$setProp(_el$60, "flexDirection", "row");
542
- _$setProp(_el$60, "alignItems", "flexStart");
543
- _$setProp(_el$60, "gap", 1);
544
- _$setProp(_el$60, "paddingLeft", 1);
545
- _$setProp(_el$60, "backgroundColor", bg);
546
- _$insertNode(_el$61, _el$62);
547
- _$setProp(_el$61, "width", 2);
548
- _$setProp(_el$61, "alignItems", "center");
549
- _$setProp(_el$62, "fg", fg);
550
- _$setProp(_el$62, "bold", true);
551
- _$insert(_el$62, icon);
552
- _$insertNode(_el$63, _el$64);
553
- _$setProp(_el$63, "flexGrow", 1);
554
- _$insertNode(_el$64, _el$65);
555
- _$setProp(_el$64, "fg", fg);
556
- _$setProp(_el$64, "wrapMode", "wrap");
557
- _$insert(_el$64, idx, _el$65);
558
- _$insert(_el$64, () => opt.label, null);
559
- return _el$60;
762
+ var _el$73 = _$createElement("box"), _el$74 = _$createElement("box"), _el$75 = _$createElement("text"), _el$76 = _$createElement("box"), _el$77 = _$createElement("text"), _el$78 = _$createTextNode(`. `);
763
+ _$insertNode(_el$73, _el$74);
764
+ _$insertNode(_el$73, _el$76);
765
+ _$setProp(_el$73, "flexDirection", "row");
766
+ _$setProp(_el$73, "alignItems", "flexStart");
767
+ _$setProp(_el$73, "gap", 1);
768
+ _$setProp(_el$73, "paddingLeft", 1);
769
+ _$setProp(_el$73, "backgroundColor", bg);
770
+ _$insertNode(_el$74, _el$75);
771
+ _$setProp(_el$74, "width", 2);
772
+ _$setProp(_el$74, "alignItems", "center");
773
+ _$setProp(_el$75, "fg", fg);
774
+ _$setProp(_el$75, "bold", true);
775
+ _$insert(_el$75, icon);
776
+ _$insertNode(_el$76, _el$77);
777
+ _$setProp(_el$76, "flexGrow", 1);
778
+ _$insertNode(_el$77, _el$78);
779
+ _$setProp(_el$77, "fg", fg);
780
+ _$setProp(_el$77, "wrapMode", "wrap");
781
+ _$insert(_el$77, idx, _el$78);
782
+ _$insert(_el$77, () => opt.label, null);
783
+ return _el$73;
560
784
  })();
561
785
  }
562
- }), _el$37);
563
- _$insertNode(_el$37, _el$38);
564
- _$setProp(_el$37, "height", 1);
565
- _$insert(_el$38, () => "\u2500".repeat(Math.max(20, popupWidth() - 12)));
566
- _$insert(_el$36, _$createComponent(Show, {
786
+ }), _el$51);
787
+ _$insertNode(_el$51, _el$52);
788
+ _$setProp(_el$51, "height", 1);
789
+ _$insert(_el$52, () => "\u2500".repeat(Math.max(20, popupWidth() - 12)));
790
+ _$insert(_el$50, _$createComponent(Show, {
567
791
  get when() {
568
792
  return dontKnow();
569
793
  },
570
794
  get children() {
571
- var _el$39 = _$createElement("text");
572
- _$insertNode(_el$39, _$createTextNode(`\u25CF You said: I don't know \u2014 genuine gap`));
573
- _$effect((_$p) => _$setProp(_el$39, "fg", theme().warning, _$p));
574
- return _el$39;
795
+ var _el$53 = _$createElement("text");
796
+ _$insertNode(_el$53, _$createTextNode(`\u25CF You said: I don't know \u2014 genuine gap`));
797
+ _$effect((_$p) => _$setProp(_el$53, "fg", theme().warning, _$p));
798
+ return _el$53;
575
799
  }
576
- }), _el$42);
577
- _$insert(_el$36, _$createComponent(Show, {
800
+ }), _el$56);
801
+ _$insert(_el$50, _$createComponent(Show, {
578
802
  get when() {
579
803
  return !dontKnow();
580
804
  },
581
805
  get children() {
582
- var _el$41 = _$createElement("text");
583
- _$setProp(_el$41, "bold", true);
584
- _$insert(_el$41, () => feedback()?.correct ? "\u2713 Correct! Well located." : "\u2717 Incorrect \u2014 nice try, let's fix the edge.");
585
- _$effect((_$p) => _$setProp(_el$41, "fg", feedback()?.correct ? theme().success : theme().error, _$p));
586
- return _el$41;
806
+ var _el$55 = _$createElement("text");
807
+ _$setProp(_el$55, "bold", true);
808
+ _$insert(_el$55, () => feedback()?.correct ? "\u2713 Correct! Well located." : "\u2717 Incorrect \u2014 nice try, let's fix the edge.");
809
+ _$effect((_$p) => _$setProp(_el$55, "fg", feedback()?.correct ? theme().success : theme().error, _$p));
810
+ return _el$55;
587
811
  }
588
- }), _el$42);
589
- _$insertNode(_el$42, _el$43);
590
- _$insert(_el$42, () => props.request.correctIndices.map((i) => `${i}. ${options()[i - 1]?.label}`).join(", "), null);
591
- _$insert(_el$36, _$createComponent(Show, {
812
+ }), _el$56);
813
+ _$insertNode(_el$56, _el$57);
814
+ _$insert(_el$56, () => props.request.correctIndices.map((i) => `${i}. ${options()[i - 1]?.label}`).join(", "), null);
815
+ _$insert(_el$50, _$createComponent(Show, {
592
816
  get when() {
593
817
  return note();
594
818
  },
595
819
  get children() {
596
- var _el$44 = _$createElement("text"), _el$45 = _$createTextNode(`Your note: `);
597
- _$insertNode(_el$44, _el$45);
598
- _$insert(_el$44, note, null);
599
- _$effect((_$p) => _$setProp(_el$44, "fg", theme().textMuted, _$p));
600
- return _el$44;
820
+ var _el$58 = _$createElement("text"), _el$59 = _$createTextNode(`Your note: `);
821
+ _$insertNode(_el$58, _el$59);
822
+ _$insert(_el$58, note, null);
823
+ _$effect((_$p) => _$setProp(_el$58, "fg", theme().textMuted, _$p));
824
+ return _el$58;
601
825
  }
602
- }), _el$46);
603
- _$insertNode(_el$46, _el$47);
604
- _$setProp(_el$46, "border", true);
605
- _$setProp(_el$46, "padding", 1);
606
- _$setProp(_el$47, "wrapMode", "wrap");
607
- _$insert(_el$47, () => props.request.explanation);
608
- _$insertNode(_el$48, _el$49);
609
- _$setProp(_el$48, "justifyContent", "center");
610
- _$setProp(_el$48, "paddingTop", 1);
611
- _$insertNode(_el$49, _$createTextNode(`\u21B5 Enter / Esc to continue \u2192 next probe`));
826
+ }), _el$60);
827
+ _$insertNode(_el$60, _el$61);
828
+ _$setProp(_el$60, "border", true);
829
+ _$setProp(_el$60, "padding", 1);
830
+ _$setProp(_el$61, "wrapMode", "wrap");
831
+ _$insert(_el$61, () => props.request.explanation);
612
832
  _$effect((_p$) => {
613
- var _v$14 = feedback()?.correct ? theme().success : theme().error, _v$15 = theme().background, _v$16 = theme().borderSubtle, _v$17 = theme().textMuted, _v$18 = theme().borderSubtle, _v$19 = theme().backgroundPanel, _v$20 = theme().text, _v$21 = theme().textMuted;
614
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$36, "borderColor", _v$14, _p$.e));
615
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$36, "backgroundColor", _v$15, _p$.t));
616
- _v$16 !== _p$.a && (_p$.a = _$setProp(_el$38, "fg", _v$16, _p$.a));
617
- _v$17 !== _p$.o && (_p$.o = _$setProp(_el$42, "fg", _v$17, _p$.o));
618
- _v$18 !== _p$.i && (_p$.i = _$setProp(_el$46, "borderColor", _v$18, _p$.i));
619
- _v$19 !== _p$.n && (_p$.n = _$setProp(_el$46, "backgroundColor", _v$19, _p$.n));
620
- _v$20 !== _p$.s && (_p$.s = _$setProp(_el$47, "fg", _v$20, _p$.s));
621
- _v$21 !== _p$.h && (_p$.h = _$setProp(_el$49, "fg", _v$21, _p$.h));
833
+ var _v$22 = feedback()?.correct ? theme().success : theme().error, _v$23 = theme().background, _v$24 = theme().borderSubtle, _v$25 = theme().textMuted, _v$26 = theme().borderSubtle, _v$27 = theme().backgroundPanel, _v$28 = theme().text;
834
+ _v$22 !== _p$.e && (_p$.e = _$setProp(_el$50, "borderColor", _v$22, _p$.e));
835
+ _v$23 !== _p$.t && (_p$.t = _$setProp(_el$50, "backgroundColor", _v$23, _p$.t));
836
+ _v$24 !== _p$.a && (_p$.a = _$setProp(_el$52, "fg", _v$24, _p$.a));
837
+ _v$25 !== _p$.o && (_p$.o = _$setProp(_el$56, "fg", _v$25, _p$.o));
838
+ _v$26 !== _p$.i && (_p$.i = _$setProp(_el$60, "borderColor", _v$26, _p$.i));
839
+ _v$27 !== _p$.n && (_p$.n = _$setProp(_el$60, "backgroundColor", _v$27, _p$.n));
840
+ _v$28 !== _p$.s && (_p$.s = _$setProp(_el$61, "fg", _v$28, _p$.s));
622
841
  return _p$;
623
842
  }, {
624
843
  e: undefined,
@@ -627,21 +846,29 @@ function QuizDialog(props) {
627
846
  o: undefined,
628
847
  i: undefined,
629
848
  n: undefined,
630
- s: undefined,
631
- h: undefined
849
+ s: undefined
632
850
  });
633
- return _el$36;
851
+ return _el$50;
634
852
  }
635
853
  }), null);
854
+ _$insertNode(_el$62, _el$63);
855
+ _$setProp(_el$62, "height", 1);
856
+ _$setProp(_el$62, "justifyContent", "center");
857
+ _$insert(_el$63, (() => {
858
+ var _c$3 = _$memo(() => phase() === "feedback");
859
+ return () => _c$3() ? "\u21B5 Enter / Esc to continue \u2192 next probe" : phase() === "classifying" ? "Classifying your note..." : "Navigate options \xB7 Tab note \xB7 Esc cancel";
860
+ })());
636
861
  _$effect((_p$) => {
637
- var _v$22 = popupWidth(), _v$23 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$24 = theme().backgroundPanel, _v$25 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$26 = theme().background, _v$27 = theme().background, _v$28 = theme().text;
638
- _v$22 !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$22, _p$.e));
639
- _v$23 !== _p$.t && (_p$.t = _$setProp(_el$, "borderColor", _v$23, _p$.t));
640
- _v$24 !== _p$.a && (_p$.a = _$setProp(_el$, "backgroundColor", _v$24, _p$.a));
641
- _v$25 !== _p$.o && (_p$.o = _$setProp(_el$2, "backgroundColor", _v$25, _p$.o));
642
- _v$26 !== _p$.i && (_p$.i = _$setProp(_el$3, "fg", _v$26, _p$.i));
643
- _v$27 !== _p$.n && (_p$.n = _$setProp(_el$4, "fg", _v$27, _p$.n));
644
- _v$28 !== _p$.s && (_p$.s = _$setProp(_el$7, "fg", _v$28, _p$.s));
862
+ var _v$29 = popupWidth(), _v$30 = popupHeight(), _v$31 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$32 = theme().backgroundPanel, _v$33 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$34 = theme().background, _v$35 = theme().background, _v$36 = theme().text, _v$37 = theme().textMuted;
863
+ _v$29 !== _p$.e && (_p$.e = _$setProp(_el$, "width", _v$29, _p$.e));
864
+ _v$30 !== _p$.t && (_p$.t = _$setProp(_el$, "height", _v$30, _p$.t));
865
+ _v$31 !== _p$.a && (_p$.a = _$setProp(_el$, "borderColor", _v$31, _p$.a));
866
+ _v$32 !== _p$.o && (_p$.o = _$setProp(_el$, "backgroundColor", _v$32, _p$.o));
867
+ _v$33 !== _p$.i && (_p$.i = _$setProp(_el$2, "backgroundColor", _v$33, _p$.i));
868
+ _v$34 !== _p$.n && (_p$.n = _$setProp(_el$3, "fg", _v$34, _p$.n));
869
+ _v$35 !== _p$.s && (_p$.s = _$setProp(_el$4, "fg", _v$35, _p$.s));
870
+ _v$36 !== _p$.h && (_p$.h = _$setProp(_el$8, "fg", _v$36, _p$.h));
871
+ _v$37 !== _p$.r && (_p$.r = _$setProp(_el$63, "fg", _v$37, _p$.r));
645
872
  return _p$;
646
873
  }, {
647
874
  e: undefined,
@@ -650,7 +877,9 @@ function QuizDialog(props) {
650
877
  o: undefined,
651
878
  i: undefined,
652
879
  n: undefined,
653
- s: undefined
880
+ s: undefined,
881
+ h: undefined,
882
+ r: undefined
654
883
  });
655
884
  return _el$;
656
885
  })();
@@ -659,6 +888,7 @@ function QuizBatchDialog(props) {
659
888
  const theme = () => props.api.theme.current;
660
889
  const dims = useTerminalDimensions();
661
890
  const popupWidth = () => Math.max(68, Math.min(dims().width - 4, 96));
891
+ const popupHeight = () => Math.max(4, Math.min(24, dims().height - 2));
662
892
  const [idx, setIdx] = createSignal(0);
663
893
  if (!props.request.quizzes || props.request.quizzes.length === 0) {
664
894
  tlog("QuizBatchDialog empty quizzes, cancelling", props.request.id);
@@ -747,10 +977,106 @@ function QuizBatchDialog(props) {
747
977
  const submitSelect = () => {
748
978
  try {
749
979
  const m = selected();
750
- if (!isMulti() && m.size === 0 && !dontKnow())
980
+ if (!isMulti() && m.size === 0 && !dontKnow() && !note().trim())
751
981
  return;
752
- if (isMulti() && m.size === 0 && !dontKnow())
982
+ if (isMulti() && m.size === 0 && !dontKnow() && !note().trim())
753
983
  return;
984
+ if (m.size === 0 && !dontKnow() && note().trim()) {
985
+ setPhase("classifying");
986
+ try {
987
+ const pDir = globalThis.__learnPendingDir || ".opencode/learn-pending";
988
+ const cid = `${props.request.id}-${idx()}`;
989
+ const routeSessionID = props.api.route?.current?.params?.sessionID;
990
+ const pendingClassify = {
991
+ id: cid,
992
+ type: "classify",
993
+ note: note().trim(),
994
+ question: cur().question,
995
+ options: cur().options.map((o, i) => ({
996
+ label: o.label,
997
+ value: o.value,
998
+ index: i + 1
999
+ })),
1000
+ timestamp: Date.now(),
1001
+ sessionID: props.request.sessionID || routeSessionID
1002
+ };
1003
+ fs.writeFileSync(path.join(pDir, `classify-${cid}.json`), JSON.stringify(pendingClassify), "utf8");
1004
+ tlog("QuizBatchDialog classify request", cid, note().trim().slice(0, 50));
1005
+ const respPath = path.join(pDir, `classify-response-${cid}.json`);
1006
+ let attempts = 0;
1007
+ const poll = setInterval(() => {
1008
+ attempts++;
1009
+ if (attempts > 60) {
1010
+ clearInterval(poll);
1011
+ setFeedback({
1012
+ correct: false,
1013
+ selectedIndices: []
1014
+ });
1015
+ setPhase("feedback");
1016
+ return;
1017
+ }
1018
+ try {
1019
+ if (fs.existsSync(respPath)) {
1020
+ clearInterval(poll);
1021
+ const raw = fs.readFileSync(respPath, "utf8");
1022
+ const data = JSON.parse(raw);
1023
+ try {
1024
+ fs.unlinkSync(respPath);
1025
+ fs.unlinkSync(path.join(pDir, `classify-${cid}.json`));
1026
+ } catch {}
1027
+ const inferred = data?.inferredIndices;
1028
+ const semanticCorrect = data?.semanticCorrect;
1029
+ const reason = data?.reason;
1030
+ const computeOk2 = (idxs) => {
1031
+ if (typeof semanticCorrect === "boolean")
1032
+ return semanticCorrect;
1033
+ const correctSet2 = new Set(cur().correctIndices);
1034
+ return idxs.length === cur().correctIndices.length && idxs.every((v) => correctSet2.has(v)) && cur().correctIndices.every((v) => idxs.includes(v));
1035
+ };
1036
+ if (inferred && inferred.length) {
1037
+ const mm = new Map;
1038
+ for (const idx2 of inferred) {
1039
+ const opt = cur().options[idx2 - 1];
1040
+ if (opt)
1041
+ mm.set(`opt:${idx2 - 1}`, {
1042
+ label: opt.label,
1043
+ value: opt.value,
1044
+ index: idx2
1045
+ });
1046
+ }
1047
+ setSelected(mm);
1048
+ const ok2 = computeOk2(inferred);
1049
+ setFeedback({
1050
+ correct: ok2,
1051
+ selectedIndices: inferred
1052
+ });
1053
+ if (reason)
1054
+ setNote((prev) => prev ? `${prev} \u2014 ${reason}` : prev);
1055
+ tlog("QuizBatchDialog classify done", inferred.join(","), ok2, reason || "");
1056
+ } else {
1057
+ const ok2 = typeof semanticCorrect === "boolean" ? semanticCorrect : false;
1058
+ setFeedback({
1059
+ correct: ok2,
1060
+ selectedIndices: []
1061
+ });
1062
+ if (reason)
1063
+ setNote((prev) => prev ? `${prev} \u2014 ${reason}` : reason);
1064
+ }
1065
+ setPhase("feedback");
1066
+ }
1067
+ } catch {}
1068
+ }, 500);
1069
+ onCleanup(() => clearInterval(poll));
1070
+ } catch (e) {
1071
+ tlog("classify batch failed", String(e));
1072
+ setFeedback({
1073
+ correct: false,
1074
+ selectedIndices: []
1075
+ });
1076
+ setPhase("feedback");
1077
+ }
1078
+ return;
1079
+ }
754
1080
  const sel = Array.from(m.values());
755
1081
  const dk = dontKnow();
756
1082
  const correctSet = new Set(cur().correctIndices);
@@ -770,6 +1096,10 @@ function QuizBatchDialog(props) {
770
1096
  try {
771
1097
  const k = evt.name || evt.sequence || evt.raw || "";
772
1098
  const seq = evt.sequence || "";
1099
+ if (phase() === "classifying") {
1100
+ prevent(evt);
1101
+ return;
1102
+ }
773
1103
  if (phase() === "feedback") {
774
1104
  if (k === "enter" || seq === "\r" || k === "escape" || k === "esc") {
775
1105
  prevent(evt);
@@ -870,62 +1200,65 @@ function QuizBatchDialog(props) {
870
1200
  }
871
1201
  });
872
1202
  return (() => {
873
- var _el$66 = _$createElement("box"), _el$67 = _$createElement("box"), _el$68 = _$createElement("text"), _el$69 = _$createTextNode(` decks.quiz batch `), _el$70 = _$createTextNode(`/`), _el$71 = _$createTextNode(` `), _el$72 = _$createElement("text"), _el$74 = _$createElement("text");
874
- _$insertNode(_el$66, _el$67);
875
- _$insertNode(_el$66, _el$74);
876
- _$setProp(_el$66, "flexDirection", "column");
877
- _$setProp(_el$66, "border", true);
878
- _$setProp(_el$66, "padding", 1);
879
- _$setProp(_el$66, "gap", 1);
880
- _$insertNode(_el$67, _el$68);
881
- _$insertNode(_el$67, _el$72);
882
- _$setProp(_el$67, "flexDirection", "row");
883
- _$setProp(_el$67, "justifyContent", "space-between");
884
- _$setProp(_el$67, "paddingLeft", 1);
885
- _$setProp(_el$67, "paddingRight", 1);
886
- _$setProp(_el$67, "height", 1);
887
- _$insertNode(_el$68, _el$69);
888
- _$insertNode(_el$68, _el$70);
889
- _$insertNode(_el$68, _el$71);
890
- _$setProp(_el$68, "bold", true);
891
- _$insert(_el$68, () => idx() + 1, _el$70);
892
- _$insert(_el$68, () => props.request.quizzes.length, _el$71);
893
- _$insert(_el$68, (() => {
894
- var _c$3 = _$memo(() => phase() === "feedback");
895
- return () => _c$3() ? feedback()?.correct ? "\u2713" : "\u2717" : "";
1203
+ var _el$79 = _$createElement("box"), _el$80 = _$createElement("box"), _el$81 = _$createElement("text"), _el$82 = _$createTextNode(` decks.quiz batch `), _el$83 = _$createTextNode(`/`), _el$84 = _$createTextNode(` `), _el$85 = _$createElement("text"), _el$87 = _$createElement("scrollbox"), _el$88 = _$createElement("text"), _el$129 = _$createElement("box"), _el$130 = _$createElement("text");
1204
+ _$insertNode(_el$79, _el$80);
1205
+ _$insertNode(_el$79, _el$87);
1206
+ _$insertNode(_el$79, _el$129);
1207
+ _$setProp(_el$79, "flexDirection", "column");
1208
+ _$setProp(_el$79, "border", true);
1209
+ _$setProp(_el$79, "padding", 1);
1210
+ _$setProp(_el$79, "gap", 1);
1211
+ _$insertNode(_el$80, _el$81);
1212
+ _$insertNode(_el$80, _el$85);
1213
+ _$setProp(_el$80, "flexDirection", "row");
1214
+ _$setProp(_el$80, "justifyContent", "space-between");
1215
+ _$setProp(_el$80, "paddingLeft", 1);
1216
+ _$setProp(_el$80, "paddingRight", 1);
1217
+ _$setProp(_el$80, "height", 1);
1218
+ _$insertNode(_el$81, _el$82);
1219
+ _$insertNode(_el$81, _el$83);
1220
+ _$insertNode(_el$81, _el$84);
1221
+ _$setProp(_el$81, "bold", true);
1222
+ _$insert(_el$81, () => idx() + 1, _el$83);
1223
+ _$insert(_el$81, () => props.request.quizzes.length, _el$84);
1224
+ _$insert(_el$81, (() => {
1225
+ var _c$5 = _$memo(() => phase() === "feedback");
1226
+ return () => _c$5() ? feedback()?.correct ? "\u2713" : "\u2717" : "";
896
1227
  })(), null);
897
- _$insertNode(_el$72, _$createTextNode(`learn`));
898
- _$setProp(_el$72, "dim", true);
899
- _$setProp(_el$74, "bold", true);
900
- _$setProp(_el$74, "wrapMode", "wrap");
901
- _$insert(_el$74, () => cur().question);
902
- _$insert(_el$66, _$createComponent(Show, {
1228
+ _$insertNode(_el$85, _$createTextNode(`learn`));
1229
+ _$setProp(_el$85, "dim", true);
1230
+ _$insertNode(_el$87, _el$88);
1231
+ _$setProp(_el$87, "flexGrow", 1);
1232
+ _$setProp(_el$88, "bold", true);
1233
+ _$setProp(_el$88, "wrapMode", "wrap");
1234
+ _$insert(_el$88, () => cur().question);
1235
+ _$insert(_el$87, _$createComponent(Show, {
903
1236
  get when() {
904
1237
  return cur().details;
905
1238
  },
906
1239
  get children() {
907
- var _el$75 = _$createElement("text");
908
- _$setProp(_el$75, "wrapMode", "wrap");
909
- _$insert(_el$75, () => cur().details);
910
- _$effect((_$p) => _$setProp(_el$75, "fg", theme().textMuted, _$p));
911
- return _el$75;
1240
+ var _el$89 = _$createElement("text");
1241
+ _$setProp(_el$89, "wrapMode", "wrap");
1242
+ _$insert(_el$89, () => cur().details);
1243
+ _$effect((_$p) => _$setProp(_el$89, "fg", theme().textMuted, _$p));
1244
+ return _el$89;
912
1245
  }
913
1246
  }), null);
914
- _$insert(_el$66, _$createComponent(Show, {
1247
+ _$insert(_el$87, _$createComponent(Show, {
915
1248
  get when() {
916
1249
  return phase() === "select";
917
1250
  },
918
1251
  get children() {
919
- var _el$76 = _$createElement("box"), _el$77 = _$createElement("box"), _el$78 = _$createElement("text"), _el$79 = _$createElement("box"), _el$80 = _$createElement("box"), _el$81 = _$createElement("text"), _el$82 = _$createElement("box"), _el$83 = _$createElement("text"), _el$84 = _$createElement("box"), _el$85 = _$createElement("text"), _el$87 = _$createElement("box"), _el$88 = _$createElement("text"), _el$90 = _$createElement("box"), _el$92 = _$createElement("box"), _el$93 = _$createElement("text"), _el$95 = _$createElement("text"), _el$96 = _$createTextNode(`/`);
920
- _$insertNode(_el$76, _el$77);
921
- _$insertNode(_el$76, _el$79);
922
- _$insertNode(_el$76, _el$87);
923
- _$insertNode(_el$76, _el$92);
924
- _$setProp(_el$76, "flexDirection", "column");
925
- _$setProp(_el$76, "gap", 0);
926
- _$setProp(_el$76, "padding", 1);
927
- _$setProp(_el$76, "border", true);
928
- _$insert(_el$76, _$createComponent(For, {
1252
+ var _el$90 = _$createElement("box"), _el$91 = _$createElement("box"), _el$92 = _$createElement("text"), _el$93 = _$createElement("box"), _el$94 = _$createElement("box"), _el$95 = _$createElement("text"), _el$96 = _$createElement("box"), _el$97 = _$createElement("text"), _el$98 = _$createElement("box"), _el$99 = _$createElement("text"), _el$101 = _$createElement("box"), _el$102 = _$createElement("text"), _el$104 = _$createElement("box"), _el$106 = _$createElement("box"), _el$107 = _$createElement("text"), _el$108 = _$createElement("text"), _el$109 = _$createTextNode(`/`);
1253
+ _$insertNode(_el$90, _el$91);
1254
+ _$insertNode(_el$90, _el$93);
1255
+ _$insertNode(_el$90, _el$101);
1256
+ _$insertNode(_el$90, _el$106);
1257
+ _$setProp(_el$90, "flexDirection", "column");
1258
+ _$setProp(_el$90, "gap", 0);
1259
+ _$setProp(_el$90, "padding", 1);
1260
+ _$setProp(_el$90, "border", true);
1261
+ _$insert(_el$90, _$createComponent(For, {
929
1262
  get each() {
930
1263
  return cur().options;
931
1264
  },
@@ -934,36 +1267,36 @@ function QuizBatchDialog(props) {
934
1267
  const foc = () => focused() === "options" && optionIndex() === id;
935
1268
  const sel = () => selected().has(`opt:${id}`);
936
1269
  return (() => {
937
- var _el$113 = _$createElement("box"), _el$114 = _$createElement("box"), _el$115 = _$createElement("text"), _el$116 = _$createElement("box"), _el$117 = _$createElement("text"), _el$118 = _$createElement("box"), _el$119 = _$createElement("text"), _el$120 = _$createTextNode(`. `);
938
- _$insertNode(_el$113, _el$114);
939
- _$insertNode(_el$113, _el$116);
940
- _$insertNode(_el$113, _el$118);
941
- _$setProp(_el$113, "flexDirection", "row");
942
- _$setProp(_el$113, "alignItems", "flexStart");
943
- _$setProp(_el$113, "gap", 1);
944
- _$setProp(_el$113, "paddingLeft", 1);
945
- _$insertNode(_el$114, _el$115);
946
- _$setProp(_el$114, "width", 2);
947
- _$insert(_el$115, () => foc() ? "\u25B8" : " ");
948
- _$insertNode(_el$116, _el$117);
949
- _$setProp(_el$116, "width", 2);
950
- _$insert(_el$117, (() => {
951
- var _c$4 = _$memo(() => !!isMulti());
952
- return () => _c$4() ? sel() ? "\u2611" : "\u2610" : sel() ? "\u2B22" : "\u25CB";
1270
+ var _el$131 = _$createElement("box"), _el$132 = _$createElement("box"), _el$133 = _$createElement("text"), _el$134 = _$createElement("box"), _el$135 = _$createElement("text"), _el$136 = _$createElement("box"), _el$137 = _$createElement("text"), _el$138 = _$createTextNode(`. `);
1271
+ _$insertNode(_el$131, _el$132);
1272
+ _$insertNode(_el$131, _el$134);
1273
+ _$insertNode(_el$131, _el$136);
1274
+ _$setProp(_el$131, "flexDirection", "row");
1275
+ _$setProp(_el$131, "alignItems", "flexStart");
1276
+ _$setProp(_el$131, "gap", 1);
1277
+ _$setProp(_el$131, "paddingLeft", 1);
1278
+ _$insertNode(_el$132, _el$133);
1279
+ _$setProp(_el$132, "width", 2);
1280
+ _$insert(_el$133, () => foc() ? "\u25B8" : " ");
1281
+ _$insertNode(_el$134, _el$135);
1282
+ _$setProp(_el$134, "width", 2);
1283
+ _$insert(_el$135, (() => {
1284
+ var _c$7 = _$memo(() => !!isMulti());
1285
+ return () => _c$7() ? sel() ? "\u2611" : "\u2610" : sel() ? "\u2B22" : "\u25CB";
953
1286
  })());
954
- _$insertNode(_el$118, _el$119);
955
- _$setProp(_el$118, "flexGrow", 1);
956
- _$insertNode(_el$119, _el$120);
957
- _$setProp(_el$119, "wrapMode", "wrap");
958
- _$insert(_el$119, id + 1, _el$120);
959
- _$insert(_el$119, () => opt.label, null);
1287
+ _$insertNode(_el$136, _el$137);
1288
+ _$setProp(_el$136, "flexGrow", 1);
1289
+ _$insertNode(_el$137, _el$138);
1290
+ _$setProp(_el$137, "wrapMode", "wrap");
1291
+ _$insert(_el$137, id + 1, _el$138);
1292
+ _$insert(_el$137, () => opt.label, null);
960
1293
  _$effect((_p$) => {
961
- var _v$64 = foc() ? theme().backgroundElement : undefined, _v$65 = foc() ? theme().accent : theme().textMuted, _v$66 = isMulti() ? sel() ? theme().success : theme().textMuted : sel() ? theme().accent : theme().textMuted, _v$67 = sel() ? theme().text : theme().textMuted, _v$68 = foc();
962
- _v$64 !== _p$.e && (_p$.e = _$setProp(_el$113, "backgroundColor", _v$64, _p$.e));
963
- _v$65 !== _p$.t && (_p$.t = _$setProp(_el$115, "fg", _v$65, _p$.t));
964
- _v$66 !== _p$.a && (_p$.a = _$setProp(_el$117, "fg", _v$66, _p$.a));
965
- _v$67 !== _p$.o && (_p$.o = _$setProp(_el$119, "fg", _v$67, _p$.o));
966
- _v$68 !== _p$.i && (_p$.i = _$setProp(_el$119, "bold", _v$68, _p$.i));
1294
+ var _v$79 = foc() ? theme().backgroundElement : undefined, _v$80 = foc() ? theme().accent : theme().textMuted, _v$81 = isMulti() ? sel() ? theme().success : theme().textMuted : sel() ? theme().accent : theme().textMuted, _v$82 = sel() ? theme().text : theme().textMuted, _v$83 = foc();
1295
+ _v$79 !== _p$.e && (_p$.e = _$setProp(_el$131, "backgroundColor", _v$79, _p$.e));
1296
+ _v$80 !== _p$.t && (_p$.t = _$setProp(_el$133, "fg", _v$80, _p$.t));
1297
+ _v$81 !== _p$.a && (_p$.a = _$setProp(_el$135, "fg", _v$81, _p$.a));
1298
+ _v$82 !== _p$.o && (_p$.o = _$setProp(_el$137, "fg", _v$82, _p$.o));
1299
+ _v$83 !== _p$.i && (_p$.i = _$setProp(_el$137, "bold", _v$83, _p$.i));
967
1300
  return _p$;
968
1301
  }, {
969
1302
  e: undefined,
@@ -972,115 +1305,120 @@ function QuizBatchDialog(props) {
972
1305
  o: undefined,
973
1306
  i: undefined
974
1307
  });
975
- return _el$113;
1308
+ return _el$131;
976
1309
  })();
977
1310
  }
978
- }), _el$77);
979
- _$insertNode(_el$77, _el$78);
980
- _$setProp(_el$77, "height", 1);
981
- _$insert(_el$78, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
982
- _$insertNode(_el$79, _el$80);
983
- _$insertNode(_el$79, _el$82);
984
- _$insertNode(_el$79, _el$84);
985
- _$setProp(_el$79, "flexDirection", "row");
986
- _$setProp(_el$79, "gap", 1);
987
- _$setProp(_el$79, "paddingLeft", 1);
988
- _$insertNode(_el$80, _el$81);
989
- _$setProp(_el$80, "width", 2);
990
- _$insert(_el$81, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
991
- _$insertNode(_el$82, _el$83);
992
- _$setProp(_el$82, "width", 2);
993
- _$insert(_el$83, () => dontKnow() ? "\u2611" : "\u2610");
994
- _$insertNode(_el$84, _el$85);
995
- _$setProp(_el$84, "flexGrow", 1);
996
- _$insertNode(_el$85, _$createTextNode(`I don't know`));
997
- _$setProp(_el$85, "italic", true);
998
- _$insertNode(_el$87, _el$88);
999
- _$insertNode(_el$87, _el$90);
1000
- _$setProp(_el$87, "flexDirection", "column");
1001
- _$setProp(_el$87, "paddingTop", 1);
1002
- _$insertNode(_el$88, _$createTextNode(`\u270E Note`));
1003
- _$setProp(_el$90, "border", true);
1004
- _$setProp(_el$90, "paddingLeft", 1);
1005
- _$setProp(_el$90, "paddingRight", 1);
1006
- _$insert(_el$90, _$createComponent(Show, {
1311
+ }), _el$91);
1312
+ _$insertNode(_el$91, _el$92);
1313
+ _$setProp(_el$91, "height", 1);
1314
+ _$insert(_el$92, () => "\u2500".repeat(Math.max(20, popupWidth() - 8)));
1315
+ _$insertNode(_el$93, _el$94);
1316
+ _$insertNode(_el$93, _el$96);
1317
+ _$insertNode(_el$93, _el$98);
1318
+ _$setProp(_el$93, "flexDirection", "row");
1319
+ _$setProp(_el$93, "gap", 1);
1320
+ _$setProp(_el$93, "paddingLeft", 1);
1321
+ _$insertNode(_el$94, _el$95);
1322
+ _$setProp(_el$94, "width", 2);
1323
+ _$insert(_el$95, () => focused() === "options" && optionIndex() === dontKnowIdx() ? "\u25B8" : " ");
1324
+ _$insertNode(_el$96, _el$97);
1325
+ _$setProp(_el$96, "width", 2);
1326
+ _$insert(_el$97, () => dontKnow() ? "\u2611" : "\u2610");
1327
+ _$insertNode(_el$98, _el$99);
1328
+ _$setProp(_el$98, "flexGrow", 1);
1329
+ _$insertNode(_el$99, _$createTextNode(`I don't know`));
1330
+ _$setProp(_el$99, "italic", true);
1331
+ _$insertNode(_el$101, _el$102);
1332
+ _$insertNode(_el$101, _el$104);
1333
+ _$setProp(_el$101, "flexDirection", "column");
1334
+ _$setProp(_el$101, "paddingTop", 1);
1335
+ _$insertNode(_el$102, _$createTextNode(`\u270E Note`));
1336
+ _$setProp(_el$104, "border", true);
1337
+ _$setProp(_el$104, "paddingLeft", 1);
1338
+ _$setProp(_el$104, "paddingRight", 1);
1339
+ _$insert(_el$104, _$createComponent(Show, {
1007
1340
  get when() {
1008
1341
  return focused() === "note";
1009
1342
  },
1010
1343
  get fallback() {
1011
1344
  return (() => {
1012
- var _el$121 = _$createElement("text");
1013
- _$insert(_el$121, () => note() || "Tab to edit");
1014
- _$effect((_$p) => _$setProp(_el$121, "fg", theme().textMuted, _$p));
1015
- return _el$121;
1345
+ var _el$139 = _$createElement("text");
1346
+ _$insert(_el$139, () => note() || "Tab to edit \xB7 share what you were thinking");
1347
+ _$effect((_$p) => _$setProp(_el$139, "fg", theme().textMuted, _$p));
1348
+ return _el$139;
1016
1349
  })();
1017
1350
  },
1018
1351
  get children() {
1019
- var _el$91 = _$createElement("input");
1020
- _$use((el) => noteEl = el, _el$91);
1021
- _$setProp(_el$91, "onInput", (v) => setNote(typeof v === "string" ? v : v?.target?.value ?? ""));
1022
- _$setProp(_el$91, "onSubmit", () => setFocused("options"));
1023
- _$setProp(_el$91, "placeholder", "note");
1024
- _$effect((_$p) => _$setProp(_el$91, "value", note(), _$p));
1025
- return _el$91;
1352
+ var _el$105 = _$createElement("input");
1353
+ _$use((el) => noteEl = el, _el$105);
1354
+ _$setProp(_el$105, "onInput", (v) => setNote(typeof v === "string" ? v : v?.target?.value ?? ""));
1355
+ _$setProp(_el$105, "onSubmit", () => {
1356
+ if (!selected().size && !dontKnow() && note().trim())
1357
+ submitSelect();
1358
+ else
1359
+ setFocused("options");
1360
+ });
1361
+ _$setProp(_el$105, "placeholder", "note (Enter to submit note \u2192 classify)");
1362
+ _$effect((_$p) => _$setProp(_el$105, "value", note(), _$p));
1363
+ return _el$105;
1026
1364
  }
1027
1365
  }));
1028
- _$insertNode(_el$92, _el$93);
1029
- _$insertNode(_el$92, _el$95);
1030
- _$setProp(_el$92, "flexDirection", "row");
1031
- _$setProp(_el$92, "justifyContent", "space-between");
1032
- _$setProp(_el$92, "paddingTop", 1);
1033
- _$insertNode(_el$93, _$createTextNode(`Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Ctrl+Enter submit`));
1034
- _$insertNode(_el$95, _el$96);
1035
- _$insert(_el$95, () => idx() + 1, _el$96);
1036
- _$insert(_el$95, () => props.request.quizzes.length, null);
1037
- _$insert(_el$76, _$createComponent(Show, {
1366
+ _$insertNode(_el$106, _el$107);
1367
+ _$insertNode(_el$106, _el$108);
1368
+ _$setProp(_el$106, "flexDirection", "row");
1369
+ _$setProp(_el$106, "justifyContent", "space-between");
1370
+ _$setProp(_el$106, "paddingTop", 1);
1371
+ _$insert(_el$107, () => focused() === "note" ? "Enter submit note \u2192 classify \xB7 Tab back \xB7 Esc back" : "Space toggle \xB7 \u2193 to Submit \u2192 Enter \xB7 Tab note \xB7 Ctrl+Enter submit");
1372
+ _$insertNode(_el$108, _el$109);
1373
+ _$insert(_el$108, () => idx() + 1, _el$109);
1374
+ _$insert(_el$108, () => props.request.quizzes.length, null);
1375
+ _$insert(_el$90, _$createComponent(Show, {
1038
1376
  get when() {
1039
1377
  return isMulti();
1040
1378
  },
1041
1379
  get children() {
1042
- var _el$97 = _$createElement("box"), _el$98 = _$createElement("box"), _el$99 = _$createElement("text"), _el$100 = _$createElement("text");
1043
- _$insertNode(_el$97, _el$98);
1044
- _$setProp(_el$97, "justifyContent", "center");
1045
- _$setProp(_el$97, "paddingTop", 1);
1046
- _$insertNode(_el$98, _el$99);
1047
- _$insertNode(_el$98, _el$100);
1048
- _$setProp(_el$98, "flexDirection", "row");
1049
- _$setProp(_el$98, "gap", 1);
1050
- _$setProp(_el$98, "border", true);
1051
- _$setProp(_el$98, "paddingLeft", 2);
1052
- _$setProp(_el$98, "paddingRight", 2);
1053
- _$insert(_el$99, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
1054
- _$insertNode(_el$100, _$createTextNode(`\u21B3 Submit`));
1055
- _$setProp(_el$100, "bold", true);
1380
+ var _el$110 = _$createElement("box"), _el$111 = _$createElement("box"), _el$112 = _$createElement("text"), _el$113 = _$createElement("text");
1381
+ _$insertNode(_el$110, _el$111);
1382
+ _$setProp(_el$110, "justifyContent", "center");
1383
+ _$setProp(_el$110, "paddingTop", 1);
1384
+ _$insertNode(_el$111, _el$112);
1385
+ _$insertNode(_el$111, _el$113);
1386
+ _$setProp(_el$111, "flexDirection", "row");
1387
+ _$setProp(_el$111, "gap", 1);
1388
+ _$setProp(_el$111, "border", true);
1389
+ _$setProp(_el$111, "paddingLeft", 2);
1390
+ _$setProp(_el$111, "paddingRight", 2);
1391
+ _$insert(_el$112, () => focused() === "options" && optionIndex() === submitIdx() ? "\u25B8" : " ");
1392
+ _$insertNode(_el$113, _$createTextNode(`\u21B3 Submit`));
1393
+ _$setProp(_el$113, "bold", true);
1056
1394
  _$effect((_p$) => {
1057
- var _v$34 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().borderSubtle, _v$35 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : theme().background, _v$36 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().textMuted;
1058
- _v$34 !== _p$.e && (_p$.e = _$setProp(_el$98, "borderColor", _v$34, _p$.e));
1059
- _v$35 !== _p$.t && (_p$.t = _$setProp(_el$98, "backgroundColor", _v$35, _p$.t));
1060
- _v$36 !== _p$.a && (_p$.a = _$setProp(_el$99, "fg", _v$36, _p$.a));
1395
+ var _v$43 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().borderSubtle, _v$44 = focused() === "options" && optionIndex() === submitIdx() ? theme().backgroundElement : theme().background, _v$45 = focused() === "options" && optionIndex() === submitIdx() ? theme().accent : theme().textMuted;
1396
+ _v$43 !== _p$.e && (_p$.e = _$setProp(_el$111, "borderColor", _v$43, _p$.e));
1397
+ _v$44 !== _p$.t && (_p$.t = _$setProp(_el$111, "backgroundColor", _v$44, _p$.t));
1398
+ _v$45 !== _p$.a && (_p$.a = _$setProp(_el$112, "fg", _v$45, _p$.a));
1061
1399
  return _p$;
1062
1400
  }, {
1063
1401
  e: undefined,
1064
1402
  t: undefined,
1065
1403
  a: undefined
1066
1404
  });
1067
- return _el$97;
1405
+ return _el$110;
1068
1406
  }
1069
1407
  }), null);
1070
1408
  _$effect((_p$) => {
1071
- var _v$37 = theme().borderSubtle, _v$38 = theme().background, _v$39 = theme().borderSubtle, _v$40 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$41 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$42 = dontKnow() ? theme().warning : theme().textMuted, _v$43 = dontKnow() ? theme().warning : theme().textMuted, _v$44 = focused() === "note" ? theme().accent : theme().textMuted, _v$45 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$46 = theme().backgroundElement, _v$47 = theme().textMuted, _v$48 = theme().textMuted;
1072
- _v$37 !== _p$.e && (_p$.e = _$setProp(_el$76, "borderColor", _v$37, _p$.e));
1073
- _v$38 !== _p$.t && (_p$.t = _$setProp(_el$76, "backgroundColor", _v$38, _p$.t));
1074
- _v$39 !== _p$.a && (_p$.a = _$setProp(_el$78, "fg", _v$39, _p$.a));
1075
- _v$40 !== _p$.o && (_p$.o = _$setProp(_el$79, "backgroundColor", _v$40, _p$.o));
1076
- _v$41 !== _p$.i && (_p$.i = _$setProp(_el$81, "fg", _v$41, _p$.i));
1077
- _v$42 !== _p$.n && (_p$.n = _$setProp(_el$83, "fg", _v$42, _p$.n));
1078
- _v$43 !== _p$.s && (_p$.s = _$setProp(_el$85, "fg", _v$43, _p$.s));
1079
- _v$44 !== _p$.h && (_p$.h = _$setProp(_el$88, "fg", _v$44, _p$.h));
1080
- _v$45 !== _p$.r && (_p$.r = _$setProp(_el$90, "borderColor", _v$45, _p$.r));
1081
- _v$46 !== _p$.d && (_p$.d = _$setProp(_el$90, "backgroundColor", _v$46, _p$.d));
1082
- _v$47 !== _p$.l && (_p$.l = _$setProp(_el$93, "fg", _v$47, _p$.l));
1083
- _v$48 !== _p$.u && (_p$.u = _$setProp(_el$95, "fg", _v$48, _p$.u));
1409
+ var _v$46 = theme().borderSubtle, _v$47 = theme().background, _v$48 = theme().borderSubtle, _v$49 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().backgroundElement : undefined, _v$50 = focused() === "options" && optionIndex() === dontKnowIdx() ? theme().accent : theme().textMuted, _v$51 = dontKnow() ? theme().warning : theme().textMuted, _v$52 = dontKnow() ? theme().warning : theme().textMuted, _v$53 = focused() === "note" ? theme().accent : theme().textMuted, _v$54 = focused() === "note" ? theme().accent : theme().borderSubtle, _v$55 = theme().backgroundElement, _v$56 = theme().textMuted, _v$57 = theme().textMuted;
1410
+ _v$46 !== _p$.e && (_p$.e = _$setProp(_el$90, "borderColor", _v$46, _p$.e));
1411
+ _v$47 !== _p$.t && (_p$.t = _$setProp(_el$90, "backgroundColor", _v$47, _p$.t));
1412
+ _v$48 !== _p$.a && (_p$.a = _$setProp(_el$92, "fg", _v$48, _p$.a));
1413
+ _v$49 !== _p$.o && (_p$.o = _$setProp(_el$93, "backgroundColor", _v$49, _p$.o));
1414
+ _v$50 !== _p$.i && (_p$.i = _$setProp(_el$95, "fg", _v$50, _p$.i));
1415
+ _v$51 !== _p$.n && (_p$.n = _$setProp(_el$97, "fg", _v$51, _p$.n));
1416
+ _v$52 !== _p$.s && (_p$.s = _$setProp(_el$99, "fg", _v$52, _p$.s));
1417
+ _v$53 !== _p$.h && (_p$.h = _$setProp(_el$102, "fg", _v$53, _p$.h));
1418
+ _v$54 !== _p$.r && (_p$.r = _$setProp(_el$104, "borderColor", _v$54, _p$.r));
1419
+ _v$55 !== _p$.d && (_p$.d = _$setProp(_el$104, "backgroundColor", _v$55, _p$.d));
1420
+ _v$56 !== _p$.l && (_p$.l = _$setProp(_el$107, "fg", _v$56, _p$.l));
1421
+ _v$57 !== _p$.u && (_p$.u = _$setProp(_el$108, "fg", _v$57, _p$.u));
1084
1422
  return _p$;
1085
1423
  }, {
1086
1424
  e: undefined,
@@ -1096,24 +1434,62 @@ function QuizBatchDialog(props) {
1096
1434
  l: undefined,
1097
1435
  u: undefined
1098
1436
  });
1099
- return _el$76;
1437
+ return _el$90;
1100
1438
  }
1101
1439
  }), null);
1102
- _$insert(_el$66, _$createComponent(Show, {
1440
+ _$insert(_el$87, _$createComponent(Show, {
1441
+ get when() {
1442
+ return phase() === "classifying";
1443
+ },
1444
+ get children() {
1445
+ var _el$115 = _$createElement("box"), _el$116 = _$createElement("text"), _el$118 = _$createElement("text"), _el$119 = _$createTextNode(`"`), _el$120 = _$createTextNode(`"`), _el$121 = _$createElement("text");
1446
+ _$insertNode(_el$115, _el$116);
1447
+ _$insertNode(_el$115, _el$118);
1448
+ _$insertNode(_el$115, _el$121);
1449
+ _$setProp(_el$115, "flexDirection", "column");
1450
+ _$setProp(_el$115, "gap", 1);
1451
+ _$setProp(_el$115, "padding", 1);
1452
+ _$setProp(_el$115, "border", true);
1453
+ _$setProp(_el$115, "alignItems", "center");
1454
+ _$insertNode(_el$116, _$createTextNode(`\u25D0 Classifying your note...`));
1455
+ _$setProp(_el$116, "bold", true);
1456
+ _$insertNode(_el$118, _el$119);
1457
+ _$insertNode(_el$118, _el$120);
1458
+ _$setProp(_el$118, "wrapMode", "wrap");
1459
+ _$insert(_el$118, note, _el$120);
1460
+ _$insertNode(_el$121, _$createTextNode(`Mapping to options \u2014 please wait`));
1461
+ _$effect((_p$) => {
1462
+ var _v$58 = theme().accent, _v$59 = theme().background, _v$60 = theme().accent, _v$61 = theme().textMuted, _v$62 = theme().textMuted;
1463
+ _v$58 !== _p$.e && (_p$.e = _$setProp(_el$115, "borderColor", _v$58, _p$.e));
1464
+ _v$59 !== _p$.t && (_p$.t = _$setProp(_el$115, "backgroundColor", _v$59, _p$.t));
1465
+ _v$60 !== _p$.a && (_p$.a = _$setProp(_el$116, "fg", _v$60, _p$.a));
1466
+ _v$61 !== _p$.o && (_p$.o = _$setProp(_el$118, "fg", _v$61, _p$.o));
1467
+ _v$62 !== _p$.i && (_p$.i = _$setProp(_el$121, "fg", _v$62, _p$.i));
1468
+ return _p$;
1469
+ }, {
1470
+ e: undefined,
1471
+ t: undefined,
1472
+ a: undefined,
1473
+ o: undefined,
1474
+ i: undefined
1475
+ });
1476
+ return _el$115;
1477
+ }
1478
+ }), null);
1479
+ _$insert(_el$87, _$createComponent(Show, {
1103
1480
  get when() {
1104
1481
  return phase() === "feedback";
1105
1482
  },
1106
1483
  get children() {
1107
- var _el$102 = _$createElement("box"), _el$103 = _$createElement("text"), _el$104 = _$createElement("text"), _el$105 = _$createTextNode(`Correct: `), _el$106 = _$createElement("box"), _el$107 = _$createElement("text"), _el$108 = _$createElement("box"), _el$109 = _$createElement("text"), _el$110 = _$createTextNode(`Enter \u2192 next (`), _el$111 = _$createTextNode(`/`), _el$112 = _$createTextNode(`)`);
1108
- _$insertNode(_el$102, _el$103);
1109
- _$insertNode(_el$102, _el$104);
1110
- _$insertNode(_el$102, _el$106);
1111
- _$insertNode(_el$102, _el$108);
1112
- _$setProp(_el$102, "flexDirection", "column");
1113
- _$setProp(_el$102, "gap", 1);
1114
- _$setProp(_el$102, "padding", 1);
1115
- _$setProp(_el$102, "border", true);
1116
- _$insert(_el$102, _$createComponent(For, {
1484
+ var _el$123 = _$createElement("box"), _el$124 = _$createElement("text"), _el$125 = _$createElement("text"), _el$126 = _$createTextNode(`Correct: `), _el$127 = _$createElement("box"), _el$128 = _$createElement("text");
1485
+ _$insertNode(_el$123, _el$124);
1486
+ _$insertNode(_el$123, _el$125);
1487
+ _$insertNode(_el$123, _el$127);
1488
+ _$setProp(_el$123, "flexDirection", "column");
1489
+ _$setProp(_el$123, "gap", 1);
1490
+ _$setProp(_el$123, "padding", 1);
1491
+ _$setProp(_el$123, "border", true);
1492
+ _$insert(_el$123, _$createComponent(For, {
1117
1493
  get each() {
1118
1494
  return cur().options;
1119
1495
  },
@@ -1142,55 +1518,47 @@ function QuizBatchDialog(props) {
1142
1518
  bg = theme().warning;
1143
1519
  }
1144
1520
  return (() => {
1145
- var _el$122 = _$createElement("box"), _el$123 = _$createElement("box"), _el$124 = _$createElement("text"), _el$125 = _$createElement("box"), _el$126 = _$createElement("text"), _el$127 = _$createTextNode(`. `);
1146
- _$insertNode(_el$122, _el$123);
1147
- _$insertNode(_el$122, _el$125);
1148
- _$setProp(_el$122, "flexDirection", "row");
1149
- _$setProp(_el$122, "gap", 1);
1150
- _$setProp(_el$122, "paddingLeft", 1);
1151
- _$setProp(_el$122, "backgroundColor", bg);
1152
- _$insertNode(_el$123, _el$124);
1153
- _$setProp(_el$123, "width", 2);
1154
- _$setProp(_el$124, "fg", fg);
1155
- _$setProp(_el$124, "bold", true);
1156
- _$insert(_el$124, ic);
1157
- _$insertNode(_el$125, _el$126);
1158
- _$setProp(_el$125, "flexGrow", 1);
1159
- _$insertNode(_el$126, _el$127);
1160
- _$setProp(_el$126, "fg", fg);
1161
- _$setProp(_el$126, "wrapMode", "wrap");
1162
- _$insert(_el$126, id, _el$127);
1163
- _$insert(_el$126, () => opt.label, null);
1164
- return _el$122;
1521
+ var _el$140 = _$createElement("box"), _el$141 = _$createElement("box"), _el$142 = _$createElement("text"), _el$143 = _$createElement("box"), _el$144 = _$createElement("text"), _el$145 = _$createTextNode(`. `);
1522
+ _$insertNode(_el$140, _el$141);
1523
+ _$insertNode(_el$140, _el$143);
1524
+ _$setProp(_el$140, "flexDirection", "row");
1525
+ _$setProp(_el$140, "gap", 1);
1526
+ _$setProp(_el$140, "paddingLeft", 1);
1527
+ _$setProp(_el$140, "backgroundColor", bg);
1528
+ _$insertNode(_el$141, _el$142);
1529
+ _$setProp(_el$141, "width", 2);
1530
+ _$setProp(_el$142, "fg", fg);
1531
+ _$setProp(_el$142, "bold", true);
1532
+ _$insert(_el$142, ic);
1533
+ _$insertNode(_el$143, _el$144);
1534
+ _$setProp(_el$143, "flexGrow", 1);
1535
+ _$insertNode(_el$144, _el$145);
1536
+ _$setProp(_el$144, "fg", fg);
1537
+ _$setProp(_el$144, "wrapMode", "wrap");
1538
+ _$insert(_el$144, id, _el$145);
1539
+ _$insert(_el$144, () => opt.label, null);
1540
+ return _el$140;
1165
1541
  })();
1166
1542
  }
1167
- }), _el$103);
1168
- _$setProp(_el$103, "bold", true);
1169
- _$insert(_el$103, () => feedback()?.correct ? "\u2713 Correct" : "\u2717 Incorrect");
1170
- _$insertNode(_el$104, _el$105);
1171
- _$insert(_el$104, () => cur().correctIndices.map((i) => `${i}. ${cur().options[i - 1]?.label}`).join(", "), null);
1172
- _$insertNode(_el$106, _el$107);
1173
- _$setProp(_el$106, "border", true);
1174
- _$setProp(_el$106, "padding", 1);
1175
- _$setProp(_el$107, "wrapMode", "wrap");
1176
- _$insert(_el$107, () => cur().explanation);
1177
- _$insertNode(_el$108, _el$109);
1178
- _$setProp(_el$108, "justifyContent", "center");
1179
- _$insertNode(_el$109, _el$110);
1180
- _$insertNode(_el$109, _el$111);
1181
- _$insertNode(_el$109, _el$112);
1182
- _$insert(_el$109, () => idx() + 1, _el$111);
1183
- _$insert(_el$109, () => props.request.quizzes.length, _el$112);
1543
+ }), _el$124);
1544
+ _$setProp(_el$124, "bold", true);
1545
+ _$insert(_el$124, () => feedback()?.correct ? "\u2713 Correct" : "\u2717 Incorrect");
1546
+ _$insertNode(_el$125, _el$126);
1547
+ _$insert(_el$125, () => cur().correctIndices.map((i) => `${i}. ${cur().options[i - 1]?.label}`).join(", "), null);
1548
+ _$insertNode(_el$127, _el$128);
1549
+ _$setProp(_el$127, "border", true);
1550
+ _$setProp(_el$127, "padding", 1);
1551
+ _$setProp(_el$128, "wrapMode", "wrap");
1552
+ _$insert(_el$128, () => cur().explanation);
1184
1553
  _$effect((_p$) => {
1185
- var _v$49 = feedback()?.correct ? theme().success : theme().error, _v$50 = theme().background, _v$51 = feedback()?.correct ? theme().success : theme().error, _v$52 = theme().textMuted, _v$53 = theme().borderSubtle, _v$54 = theme().backgroundPanel, _v$55 = theme().text, _v$56 = theme().textMuted;
1186
- _v$49 !== _p$.e && (_p$.e = _$setProp(_el$102, "borderColor", _v$49, _p$.e));
1187
- _v$50 !== _p$.t && (_p$.t = _$setProp(_el$102, "backgroundColor", _v$50, _p$.t));
1188
- _v$51 !== _p$.a && (_p$.a = _$setProp(_el$103, "fg", _v$51, _p$.a));
1189
- _v$52 !== _p$.o && (_p$.o = _$setProp(_el$104, "fg", _v$52, _p$.o));
1190
- _v$53 !== _p$.i && (_p$.i = _$setProp(_el$106, "borderColor", _v$53, _p$.i));
1191
- _v$54 !== _p$.n && (_p$.n = _$setProp(_el$106, "backgroundColor", _v$54, _p$.n));
1192
- _v$55 !== _p$.s && (_p$.s = _$setProp(_el$107, "fg", _v$55, _p$.s));
1193
- _v$56 !== _p$.h && (_p$.h = _$setProp(_el$109, "fg", _v$56, _p$.h));
1554
+ var _v$63 = feedback()?.correct ? theme().success : theme().error, _v$64 = theme().background, _v$65 = feedback()?.correct ? theme().success : theme().error, _v$66 = theme().textMuted, _v$67 = theme().borderSubtle, _v$68 = theme().backgroundPanel, _v$69 = theme().text;
1555
+ _v$63 !== _p$.e && (_p$.e = _$setProp(_el$123, "borderColor", _v$63, _p$.e));
1556
+ _v$64 !== _p$.t && (_p$.t = _$setProp(_el$123, "backgroundColor", _v$64, _p$.t));
1557
+ _v$65 !== _p$.a && (_p$.a = _$setProp(_el$124, "fg", _v$65, _p$.a));
1558
+ _v$66 !== _p$.o && (_p$.o = _$setProp(_el$125, "fg", _v$66, _p$.o));
1559
+ _v$67 !== _p$.i && (_p$.i = _$setProp(_el$127, "borderColor", _v$67, _p$.i));
1560
+ _v$68 !== _p$.n && (_p$.n = _$setProp(_el$127, "backgroundColor", _v$68, _p$.n));
1561
+ _v$69 !== _p$.s && (_p$.s = _$setProp(_el$128, "fg", _v$69, _p$.s));
1194
1562
  return _p$;
1195
1563
  }, {
1196
1564
  e: undefined,
@@ -1199,21 +1567,29 @@ function QuizBatchDialog(props) {
1199
1567
  o: undefined,
1200
1568
  i: undefined,
1201
1569
  n: undefined,
1202
- s: undefined,
1203
- h: undefined
1570
+ s: undefined
1204
1571
  });
1205
- return _el$102;
1572
+ return _el$123;
1206
1573
  }
1207
1574
  }), null);
1575
+ _$insertNode(_el$129, _el$130);
1576
+ _$setProp(_el$129, "height", 1);
1577
+ _$setProp(_el$129, "justifyContent", "center");
1578
+ _$insert(_el$130, (() => {
1579
+ var _c$6 = _$memo(() => phase() === "feedback");
1580
+ return () => _c$6() ? `Enter \u2192 next (${idx() + 1}/${props.request.quizzes.length})` : phase() === "classifying" ? "Classifying your note..." : "Navigate options \xB7 Tab note \xB7 Esc cancel";
1581
+ })());
1208
1582
  _$effect((_p$) => {
1209
- var _v$57 = popupWidth(), _v$58 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$59 = theme().backgroundPanel, _v$60 = theme().accent, _v$61 = theme().background, _v$62 = theme().background, _v$63 = theme().text;
1210
- _v$57 !== _p$.e && (_p$.e = _$setProp(_el$66, "width", _v$57, _p$.e));
1211
- _v$58 !== _p$.t && (_p$.t = _$setProp(_el$66, "borderColor", _v$58, _p$.t));
1212
- _v$59 !== _p$.a && (_p$.a = _$setProp(_el$66, "backgroundColor", _v$59, _p$.a));
1213
- _v$60 !== _p$.o && (_p$.o = _$setProp(_el$67, "backgroundColor", _v$60, _p$.o));
1214
- _v$61 !== _p$.i && (_p$.i = _$setProp(_el$68, "fg", _v$61, _p$.i));
1215
- _v$62 !== _p$.n && (_p$.n = _$setProp(_el$72, "fg", _v$62, _p$.n));
1216
- _v$63 !== _p$.s && (_p$.s = _$setProp(_el$74, "fg", _v$63, _p$.s));
1583
+ var _v$70 = popupWidth(), _v$71 = popupHeight(), _v$72 = phase() === "feedback" ? feedback()?.correct ? theme().success : theme().error : theme().accent, _v$73 = theme().backgroundPanel, _v$74 = theme().accent, _v$75 = theme().background, _v$76 = theme().background, _v$77 = theme().text, _v$78 = theme().textMuted;
1584
+ _v$70 !== _p$.e && (_p$.e = _$setProp(_el$79, "width", _v$70, _p$.e));
1585
+ _v$71 !== _p$.t && (_p$.t = _$setProp(_el$79, "height", _v$71, _p$.t));
1586
+ _v$72 !== _p$.a && (_p$.a = _$setProp(_el$79, "borderColor", _v$72, _p$.a));
1587
+ _v$73 !== _p$.o && (_p$.o = _$setProp(_el$79, "backgroundColor", _v$73, _p$.o));
1588
+ _v$74 !== _p$.i && (_p$.i = _$setProp(_el$80, "backgroundColor", _v$74, _p$.i));
1589
+ _v$75 !== _p$.n && (_p$.n = _$setProp(_el$81, "fg", _v$75, _p$.n));
1590
+ _v$76 !== _p$.s && (_p$.s = _$setProp(_el$85, "fg", _v$76, _p$.s));
1591
+ _v$77 !== _p$.h && (_p$.h = _$setProp(_el$88, "fg", _v$77, _p$.h));
1592
+ _v$78 !== _p$.r && (_p$.r = _$setProp(_el$130, "fg", _v$78, _p$.r));
1217
1593
  return _p$;
1218
1594
  }, {
1219
1595
  e: undefined,
@@ -1222,14 +1598,17 @@ function QuizBatchDialog(props) {
1222
1598
  o: undefined,
1223
1599
  i: undefined,
1224
1600
  n: undefined,
1225
- s: undefined
1601
+ s: undefined,
1602
+ h: undefined,
1603
+ r: undefined
1226
1604
  });
1227
- return _el$66;
1605
+ return _el$79;
1228
1606
  })();
1229
1607
  }
1230
1608
  var tui = async (api) => {
1231
1609
  const dir = api.state.path.directory || api.state.path.worktree || process.cwd();
1232
1610
  const pendingDir = path.join(dir, PENDING_DIR);
1611
+ globalThis.__learnPendingDir = pendingDir;
1233
1612
  ensureDir(pendingDir);
1234
1613
  const heartbeatPath = path.join(pendingDir, ".tui-alive");
1235
1614
  try {
@@ -1265,7 +1644,7 @@ var tui = async (api) => {
1265
1644
  return;
1266
1645
  let files = [];
1267
1646
  try {
1268
- files = fs.readdirSync(pendingDir).filter((f) => f.endsWith(".json") && !f.startsWith("response-") && !f.startsWith(".")).sort();
1647
+ files = fs.readdirSync(pendingDir).filter((f) => f.endsWith(".json") && !f.startsWith("response-") && !f.startsWith(".") && !f.startsWith("classify")).sort();
1269
1648
  } catch {
1270
1649
  return;
1271
1650
  }
@@ -1300,6 +1679,8 @@ var tui = async (api) => {
1300
1679
  } catch {}
1301
1680
  return;
1302
1681
  }
1682
+ if (!data.sessionID)
1683
+ data.sessionID = curSid;
1303
1684
  try {
1304
1685
  const cur = api.route?.current;
1305
1686
  const curSid2 = cur?.params?.sessionID || cur?.sessionID;