SLOPSHOPPER

you-should-know

You should know: a side agent watches your back while Claude works on longer tasks. It looks for things worth knowing that you might miss, and surfaces them…

newbandtoastpromptmodeltimer
v2.1.292UNLICENSEDupdated 2026-10-24yafyx/you-should-know/plugins/you-should-know
A shopper browsing a rack in a slop shop
README

you-should-know

Official demo (silent animated preview; click for the full video)

Original post on X

you-should-know: a clone of Claude Code's built-in "You should know" observer mod (cc-plugin-you-should-know, v2.1.292) as an installable mod. It works through any gateway or provider, including non-first-party gateways.

Every 6th main-agent step, a side request ($.model.fork: the session's own model, conversation, and credentials, with no tools) runs the official observer prompt verbatim. It usually answers learn: none. When it finds one consequential thing you might miss, it shows a short note above the prompt:

  • Offer: 1 Learn more · 2 Knew this already · 3 What is this / Return to topic · 4 Disable (press again to disable) · 0 Dismiss
  • Explanation: 1 Understood · 2 Chat in main session · 0 Dismiss
  • Asked after dismissing an offer (clears after 20 s): 1 That was helpful · 2 Not relevant · 3 Couldn't understand · 4 Turn off suggestions · 0 Dismiss
  • Asked after dismissing an explanation: 1 That was helpful · 2 Didn't understand · 0 Dismiss

Topics you have seen or understood are remembered so they don't repeat. Checks back off when notes are ignored. CLAUDE_CODE_YOU_SHOULD_KNOW_DEBUG=1 shows check rows.

Install

claude --plugin-dir ./plugins/you-should-know
# or
/plugin marketplace add yafyx/you-should-know
/plugin install you-should-know@you-should-know

Turn off the built-in version if it’s enabled:

/plugin disable cc-plugin-you-should-know@builtin

Acknowledgments

  • Original mod by Anthropic (Claude Code). Demo: @ClaudeDevs.
  • Observer prompt and logic are from the v2.1.292 dump by wassname.
  • hooks/register.js is generated from the official dump by tools/build.mjs, which strips telemetry, removes the first-party availability gate, and tree-shakes the bundle.
Source 2 files
hooks/register.js 2718 lines
1// stage.js
2var bue = "you-should-know";
3var MARKETPLACE = "ysk-clone";
4var h = (c, p, ...k) =>
5  c({
6    ...p,
7    children: k.flat().filter((x) => x !== void 0 && x !== null && x !== false),
8  });
9var xt = {
10  bold: {
11    bold: true,
12  },
13  code: {
14    color: "permission",
15  },
16};
17function Ue(e, t, o) {
18  let { Text: r } = e;
19  return t
20    .flatMap((n, i) =>
21      i === 0
22        ? n
23        : [
24            {
25              text: " ",
26            },
27            ...n,
28          ],
29    )
30    .map(({ text: n, look: i }) =>
31      h(
32        r,
33        {
34          ...(i === void 0 ? o : xt[i]),
35        },
36        n,
37      ),
38    );
39}
40var Io = 60;
41function yt(e, t) {
42  let { Box: o, Text: r } = e;
43  return h(
44    o,
45    {
46      position: "absolute",
47      bottom: 1,
48      left: 0,
49      display: "none",
50      hover: {
51        display: "flex",
52      },
53      flexDirection: "column",
54      borderStyle: "round",
55      borderDimColor: true,
56      paddingX: 1,
57      width: Io,
58    },
59    h(
60      r,
61      {
62        wrap: "wrap",
63      },
64      Ue(e, t, {}),
65    ),
66  );
67}
68var je = (e) => ({
69  hotkey: "3",
70  label: e.isOpen ? "Return to topic" : "What is this",
71  onPress: e.onPress,
72  isDim: true,
73});
74var ye = (e) => e.map((t) => t.map((o) => o.text).join("")).join(" ");
75var wt = [
76  {
77    text: "Learn more",
78    look: "bold",
79  },
80  {
81    text: " to get a deeper explanation and chat about it.",
82  },
83];
84var ne = `/plugin disable ${bue}@${MARKETPLACE}`;
85var Lo = [
86  {
87    text: "Disable on this machine with ",
88  },
89  {
90    text: ne,
91    look: "code",
92  },
93  {
94    text: ".",
95  },
96];
97var kt = [
98  {
99    text: "A side agent is watching your back while Claude works.",
100  },
101];
102var Tt = [
103  {
104    text: "When something comes up that you should know but might miss, this plugin flags it for you.",
105  },
106];
107var Mo = [kt, Tt, wt];
108var We = [kt, Tt, wt, Lo];
109var _n = ye(We);
110function Bo(e, { lead: t, body: o, surface: r, copy: n }) {
111  let { Box: i, Text: a } = e,
112    l = r === "desktop",
113    u = n.length > 0;
114  return l
115    ? h(
116        i,
117        {
118          flexDirection: "row",
119          alignItems: "flex-start",
120        },
121        h(
122          i,
123          {
124            key: "about",
125            flexShrink: 0,
126          },
127          t,
128          u ? yt(e, n) : void 0,
129        ),
130        h(
131          a,
132          {
133            wrap: "wrap",
134          },
135          o,
136        ),
137      )
138    : h(
139        a,
140        {
141          wrap: "wrap",
142        },
143        t,
144        o,
145      );
146}
147var Fo = {
148  isOpen: false,
149  surface: "terminal",
150  onPress: () => {
151    return;
152  },
153  copy: We,
154  budget: "scrolls",
155};
156var se = 3;
157var Ho = "0: ";
158var Uo = 4352;
159var St = (e) =>
160  [...e].reduce((t, o) => t + ((o.codePointAt(0) ?? 0) >= Uo ? 2 : 1), 0);
161var jo = 1;
162function vt(e, t) {
163  let o = Math.max(t - jo, 1),
164    r = 0,
165    n = 0;
166  for (let i of e.split(" ").filter((a) => a !== "")) {
167    let a = St(i);
168    if (r === 0 || n + 1 + a > o)
169      ((r += Math.ceil(Math.max(a, 1) / o)), (n = a % o === 0 ? o : a % o));
170    else n += 1 + a;
171  }
172  return r;
173}
174function Wo({ columns: e, labels: t }) {
175  let o = Math.max(e, 1),
176    r = 1,
177    n = 0;
178  for (let i of t) {
179    let a = Ho + i,
180      l = St(a) + se,
181      u = n > 0 && n + l > o,
182      w = l > o,
183      s = w ? vt(a, o - se) : 1,
184      f = u ? 0 : n;
185    ((r += (u ? 1 : 0) + s - 1), (n = w ? o : f + l));
186  }
187  return r;
188}
189var Ko = 1;
190var Et = 2;
191var Go = (e) => `${e} \xB7 `;
192var we = (e, t) =>
193  Ko +
194  vt(e, t.columns - Et) +
195  Wo({
196    ...t,
197    columns: t.columns - 2,
198  });
199var qo = (e) => we(Go(e.tag) + e.line, e);
200var Vo = (e) => we(e.note, e);
201function Xo(e) {
202  let t = (o) =>
203    Vo({
204      ...e,
205      columns: e.bodyColumns,
206      note: ye(e.copy.slice(0, o)),
207    }) <= e.maxRows;
208  return e.copy.slice(0, e.copy.map((o, r) => e.copy.length - r).find(t) ?? 0);
209}
210function Jo(e, t) {
211  let o = je(e),
212    r = je({
213      ...e,
214      isOpen: true,
215    }),
216    { budget: n } = e,
217    i = n === "scrolls",
218    a = i
219      ? e.copy
220      : Xo({
221          ...n,
222          ...t,
223          copy: e.copy,
224          labels: [...t.before, r, ...t.after].map((s) => s.label),
225        }),
226    l = je({
227      ...e,
228      isOpen: false,
229    }),
230    u =
231      i ||
232      qo({
233        columns: n.bodyColumns,
234        tag: t.tag,
235        line: t.line,
236        labels: [...t.before, l, ...t.after].map((s) => s.label),
237      }) <= n.maxRows,
238    w = a.length > 0 && u;
239  return {
240    note: e.isOpen && w ? a : [],
241    choices: w ? [o] : [],
242  };
243}
244var zo = (e, { maxRows: t, bodyColumns: o }, r) => {
245  let n = e ? Mo : We;
246  return {
247    copy: r ? [] : n,
248    budget: e
249      ? "scrolls"
250      : {
251          maxRows: t,
252          bodyColumns: o,
253        },
254  };
255};
256var _t = ({ line: e, shownAt: t }) => `${t ?? "unstamped"} ${e}`;
257async function Rt(e, t) {
258  try {
259    return (
260      await e.state.get({
261        plugin: "you-should-know",
262        key: "aboutOpen",
263        id: t,
264      })
265    ).value;
266  } catch {
267    return;
268  }
269}
270async function Pt(e, { sid: t, key: o }) {
271  try {
272    let n = await e.state.get({
273        plugin: "you-should-know",
274        key: "aboutOpen",
275        id: t,
276      }),
277      i = n.value === o ? "" : o;
278    await e.state.set(
279      {
280        plugin: "you-should-know",
281        key: "aboutOpen",
282        id: t,
283      },
284      i,
285      {
286        ifVersion: n.version,
287      },
288    );
289  } catch {
290    return;
291  }
292}
293var Lt = [
294  "shown",
295  "none",
296  "parse_failed",
297  "deduped",
298  "stale",
299  "aborted",
300  "api_error",
301  "error",
302];
303var pr = {
304  "nothing-to-fork": "none",
305  "api-error": "api_error",
306  "empty-reply": "none",
307  aborted: "aborted",
308};
309var Ve = 1e3;
310var Bt = /^(\d+)\.(\d+)\.(\d+)(-dev)?$/;
311function Ft(e) {
312  let t = Bt.exec(e?.base ?? "");
313  if (!t) return;
314  let o = Number(t[1]),
315    r = Number(t[2]),
316    n = Number(t[3]);
317  if (![o, r, n].every(Number.isSafeInteger)) return;
318  let i = Date.parse(e?.builtAt ?? "");
319  return {
320    major: o,
321    minor: r,
322    patch: n,
323    isDev: t[4] !== void 0,
324    ...(Number.isFinite(i) && {
325      builtAtS: Math.floor(i / Ve),
326    }),
327  };
328}
329var Ht = 8;
330function ur(e) {
331  let t = (e.latencyMs / Ve).toFixed(1),
332    o = new Date(e.at).toTimeString().slice(0, Ht);
333  return `debug \xB7 check ${e.number} \xB7 step ${e.step} \xB7 ${e.outcome} \xB7 ${t}s \xB7 ${o}`;
334}
335var Te = 3;
336function Ut(e) {
337  if (typeof e !== "object" || !e) return false;
338  let t = e;
339  return (
340    Number.isFinite(t.number) &&
341    Number.isFinite(t.step) &&
342    Number.isFinite(t.latencyMs) &&
343    Number.isFinite(t.at) &&
344    Lt.some((o) => o === t.outcome)
345  );
346}
347var jt = (e) => (Array.isArray(e) ? e.filter(Ut).slice(-Te) : []);
348var cr = (e, t) => [...e, t].slice(-Te);
349var Wt = ["1", "true", "yes", "on"];
350var Kt = (e) => e !== void 0 && Wt.includes(e.trim().toLowerCase());
351var Gt = (e) => e.then(Kt).catch(() => false);
352async function gr(e, t) {
353  try {
354    await e();
355  } finally {
356    await t();
357  }
358}
359var Yt = () => ({
360  title: "",
361  lead: "",
362  sketch: [],
363  caption: "",
364});
365var xr = /^```/;
366var qt = () =>
367  new RegExp(
368    String.raw`[\u001B\u009B][[\]()#;?]*` +
369      String.raw`(?:(?:(?:(?:;[-a-zA-Z\d/#&.:=?%@~_]+)*` +
370      String.raw`|[a-zA-Z\d]+(?:;[-a-zA-Z\d/#&.:=?%@~_]*)*)?` +
371      String.raw`(?:\u0007|\u001B\u005C|\u009C))` +
372      String.raw`|(?:(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]))`,
373    "g",
374  );
375var be = (e) =>
376  e
377    .replace(/[\x00-\x08\x0E-\x1F\x7F-\x9F]/g, "")
378    .replace(/\s+/g, " ")
379    .trim();
380function fe(e, t) {
381  if (t <= 0) return "";
382  return e.length <= t ? e : e.slice(0, t).replace(/[\uD800-\uDBFF]$/, "");
383}
384var Oe = (e) =>
385  e
386    .replace(/\p{Cs}/gu, "")
387    .replace(qt(), "")
388    .replace(/[\p{Cc}\p{Cf}\u2028\u2029]/gu, "");
389function Vt(e, t) {
390  if (e.length <= t) return e;
391  let o = fe(e, t - 1),
392    r = o.search(/\s\S*$/),
393    i = r !== -1 ? o.slice(0, r).trimEnd() : "";
394  return `${i.length > t / 2 ? i : o.trimEnd()}\u2026`;
395}
396var Xt = (e) =>
397  e
398    .split(
399      `
400`,
401    )
402    .map((t) => be(t))
403    .filter((t) => t !== "").join(`
404`);
405var yr = /^(?:\*\*([^*]+)\*\*|#+\s*(.+))$/;
406var wr = 6;
407var kr = 2;
408var Jt = 4e3;
409var Tr = 4;
410var br = 12;
411var Or = 120;
412var Sr = 120;
413var me = /^learn\s*:\s*/i;
414var vr = (e) => e === "" || /^none\s*(?:[.!?()[\]:;,-]|$)/i.test(e);
415var ze = (e) => e.replace(/\.+$/, "");
416var Qe = [
417  ['"', '"'],
418  ["'", "'"],
419  ["\u201C", "\u201D"],
420  ["\u2018", "\u2019"],
421  ["`", "`"],
422];
423function z(e) {
424  let t = ze(e.trim());
425  return t.length >= 2 &&
426    Qe.some(
427      ([r, n]) =>
428        t.startsWith(r) && t.endsWith(n) && !t.slice(1, -1).includes(n),
429    )
430    ? ze(t.slice(1, -1).trim())
431    : t;
432}
433var Se = Qe.map(([, e]) => e).join("");
434var Er = new RegExp(`[.!?\u2026][${Se})\\]]*$`);
435var _r = new RegExp(`\\?[${Se}]?$`);
436var zt = /^explain:\s*/i;
437var Qt =
438  /[.\s\u2014\u2013-]*\s\**tag\**\s*:\s*\**\s*(heads[\s-]*up|you should know)\W*$/i;
439var Rr = (e) => z(z(e).replace(Qt, ""));
440var Ze = 240;
441function $e(e) {
442  let t = [],
443    o = Yt(),
444    r = false,
445    n = false;
446  function i() {
447    if (
448      ((o.lead = Vt(Xt(o.lead), Jt)),
449      (o.caption = Vt(Xt(o.caption), Jt)),
450      o.title || o.lead || o.sketch.length > 0 || o.caption)
451    )
452      t.push(o);
453    o = Yt();
454  }
455  for (let a of e.split(`
456`)) {
457    let l = Oe(a).replace(/\s+$/, "");
458    if (xr.test(l.trim())) {
459      if (!r && n) i();
460      ((r = !r), (n = true));
461      continue;
462    }
463    if (r) {
464      if (o.sketch.length < br) o.sketch = [...o.sketch, fe(l, Or)];
465      continue;
466    }
467    let u = yr.exec(l.trim());
468    if (u) {
469      (i(), (n = false), (o.title = fe(be(u[1] ?? u[2] ?? ""), Sr)));
470      continue;
471    }
472    let s = o.sketch.length === 0 && !n ? "lead" : "caption";
473    o[s] += `
474${l}`;
475  }
476  return (i(), t.slice(0, Tr));
477}
478var ve = "You should know";
479var Zt = /^\W*heads[\s-]*up\W*$/i;
480var et = new RegExp(
481  String.raw`^[\s>*_"'\u201C\u201D\u2018\u2019` +
482    "`" +
483    String.raw`]*tag[\s*_"'\u201C\u201D\u2018\u2019` +
484    "`" +
485    String.raw`]*(?::\s*|[-\u2013\u2014](?:\s+|$))`,
486  "i",
487);
488var G = (e) => (Zt.test(e) ? "Heads up" : ve);
489function Pr(e) {
490  let t = e.split(`
491`),
492    o = t.map((g) => Oe(g).trimStart()),
493    r = o.findIndex((g) => me.test(g.replace(/^[-*\u2022]\s+/, ""))),
494    n = o.slice(r + 1).findIndex((g) => zt.test(g)),
495    i = r !== -1 && n !== -1,
496    a = i ? r + 1 + n : -1,
497    l = [(o[a] ?? "").replace(zt, ""), ...t.slice(a + 1)]
498      .join(
499        `
500`,
501      )
502      .trim(),
503    u = i ? l || void 0 : void 0,
504    w = (i ? t.slice(0, a) : t).map((g) =>
505      be(Oe(g)).replace(/^[-*\u2022]\s+/, ""),
506    ),
507    s = w.find((g) => et.test(g)) ?? "",
508    f = G(s.replace(et, ""));
509  for (let [g, S] of w.entries()) {
510    if (!me.test(S)) continue;
511    let x = S.replace(me, "").trim();
512    if (vr(Rr(x)))
513      return {
514        kind: "none",
515      };
516    for (let R of w.slice(g + 1)) {
517      if (R === "" || me.test(R) || et.test(R) || _r.test(x)) break;
518      x += ` ${R}`;
519    }
520    let d = z(x),
521      D = Qt.exec(d),
522      p = D === null ? d : z(d.slice(0, D.index)),
523      N = Er.test(p) ? p : `${p}.`,
524      te = s === "" && D !== null ? G(D?.[1] ?? "") : f;
525    if (N.length <= Ze)
526      return {
527        kind: "line",
528        line: N,
529        tag: te,
530        explanation: u,
531      };
532  }
533  return {
534    kind: "unparsable",
535  };
536}
537var $t = 50;
538var tt = (e, t) => e.some((o) => o === "terminal" || t.has(o));
539var Q = (e) => e?.kind === "offer" || e?.kind === "explained";
540var eo = (e, t) => Q(e) && e.kind === t.kind && e.shownAt === t.shownAt;
541function Y(e) {
542  return typeof e === "number" && Number.isSafeInteger(e) && e >= 0 ? e : 0;
543}
544var H = (e) => (Array.isArray(e) ? e.filter((t) => typeof t === "string") : []);
545function de(e) {
546  switch (e.kind) {
547    case "explained":
548      return Y(e.iteration);
549    case "asked":
550      return e.iteration === void 0 ? void 0 : Y(e.iteration);
551    case "offer":
552      return;
553  }
554}
555function Cr(e, t) {
556  return e.kind === "offer"
557    ? {
558        ...e,
559        promptsSurvived: t,
560        isOffArmed: false,
561      }
562    : {
563        ...e,
564        promptsSurvived: t,
565      };
566}
567var _e = {
568  star: {
569    color: "suggestion",
570  },
571  tag: {
572    dimColor: true,
573  },
574};
575var Dr = {
576  star: {
577    color: "subtle",
578  },
579  tag: {
580    color: "subtle",
581  },
582};
583var Nr = {
584  terminal: _e,
585  desktop: Dr,
586  mobile: _e,
587  vscode: _e,
588};
589var ue = (e) => e.leadInk ?? _e;
590var he = {
591  terminal: false,
592  desktop: true,
593  mobile: true,
594  vscode: true,
595};
596var Mr = 2e4;
597function Z(e, { hotkey: t, label: o, onPress: r, isDim: n, role: i }) {
598  let { Box: a, Button: l } = e;
599  return h(
600    a,
601    {
602      marginRight: se,
603    },
604    h(l, {
605      key: `choice-${t}`,
606      label: o,
607      hotkey: t,
608      plain: true,
609      dimColor: n,
610      role: i,
611      onPress: r,
612    }),
613  );
614}
615function U(e, t) {
616  let { Text: o } = e,
617    r = ue(e);
618  return h(
619    o,
620    null,
621    h(
622      o,
623      {
624        ...r.star,
625      },
626      "\u2726",
627    ),
628    t === void 0
629      ? " "
630      : h(
631          o,
632          {
633            ...r.tag,
634          },
635          " ",
636          t,
637          " \xB7 ",
638        ),
639  );
640}
641function Ae(e, t) {
642  let { Box: o, Text: r } = e,
643    n = ue(e);
644  return h(
645    o,
646    {
647      flexDirection: "row",
648      alignItems: "flex-start",
649    },
650    h(
651      o,
652      {
653        flexShrink: 0,
654        width: Et,
655      },
656      h(
657        r,
658        {
659          ...n.star,
660        },
661        "\u2726",
662      ),
663    ),
664    t,
665  );
666}
667function Re(e, t, o) {
668  let { Text: r } = e,
669    n = ue(e);
670  return (e.hasStarColumn ?? true)
671    ? Ae(
672        e,
673        h(
674          r,
675          {
676            wrap: "wrap",
677          },
678          t === void 0
679            ? ""
680            : h(
681                r,
682                {
683                  ...n.tag,
684                },
685                t,
686                " \xB7 ",
687              ),
688          o,
689        ),
690      )
691    : h(
692        r,
693        {
694          wrap: "wrap",
695        },
696        U(e, t),
697        o,
698      );
699}
700function Pe(e, t, o) {
701  let { Box: r, Text: n } = e,
702    i = e.hasStarColumn ?? true,
703    l = [
704      ...t,
705      {
706        hotkey: "0",
707        label: "Dismiss",
708        onPress: o,
709        role: "dismiss",
710      },
711    ].map((u) => Z(e, u));
712  return i
713    ? h(
714        r,
715        {
716          flexDirection: "column",
717          marginTop: 1,
718        },
719        Ae(
720          e,
721          h(
722            r,
723            {
724              flexWrap: "wrap",
725            },
726            h(
727              r,
728              {
729                marginRight: se,
730              },
731              h(
732                n,
733                {
734                  dimColor: true,
735                  wrap: "truncate-end",
736                },
737                "Dismissed.",
738              ),
739            ),
740            l,
741          ),
742        ),
743      )
744    : h(
745        r,
746        {
747          marginTop: 1,
748          flexWrap: "wrap",
749        },
750        h(
751          r,
752          {
753            marginRight: se,
754          },
755          h(
756            n,
757            {
758              wrap: "truncate-end",
759            },
760            U(e),
761            h(
762              n,
763              {
764                dimColor: true,
765              },
766              "Dismissed.",
767            ),
768          ),
769        ),
770        l,
771      );
772}
773function Br(e, t) {
774  let o = t.off,
775    n =
776      o !== void 0
777        ? [
778            {
779              hotkey: "4",
780              label: "Turn off suggestions",
781              onPress: o,
782            },
783          ]
784        : [];
785  return Pe(
786    e,
787    [
788      {
789        hotkey: "1",
790        label: "That was helpful",
791        onPress: t.helpful,
792      },
793      {
794        hotkey: "2",
795        label: "Not relevant",
796        onPress: t.notRelevant,
797      },
798      {
799        hotkey: "3",
800        label: "Couldn\u2019t understand",
801        onPress: t.notUnderstood,
802      },
803      ...n,
804    ],
805    t.dismiss,
806  );
807}
808var Fr = (e, t) =>
809  Pe(
810    e,
811    [
812      {
813        hotkey: "1",
814        label: "That was helpful",
815        onPress: t.helpful,
816      },
817      {
818        hotkey: "2",
819        label: "Didn\u2019t understand",
820        onPress: t.notUnderstood,
821      },
822    ],
823    t.dismiss,
824  );
825function ee(e, t) {
826  let { Box: o } = e;
827  return h(
828    o,
829    {
830      marginLeft: 2,
831      flexWrap: "wrap",
832    },
833    t.map((r) => Z(e, r)),
834  );
835}
836function Hr(e, t, o) {
837  let { Box: r, Text: n } = e;
838  return h(
839    r,
840    {
841      flexDirection: "column",
842    },
843    h(
844      r,
845      {
846        flexDirection: "column",
847        marginTop: 1,
848      },
849      t.map((i) =>
850        h(
851          r,
852          null,
853          h(
854            n,
855            {
856              ...ue(e).star,
857            },
858            "\u2726",
859          ),
860          h(
861            n,
862            {
863              wrap: "truncate-end",
864              dimColor: true,
865            },
866            " ",
867            ur(i),
868          ),
869        ),
870      ),
871    ),
872    o ?? "",
873  );
874}
875var to = `  
876`;
877var oo = /^(?:[-*+\u2022]|(\d+)([.)]))\s+/;
878var ro = /^(\d+)([.)])(?=\s|$)/;
879var no =
880  /\*\*([^*\n]+?)\*\*|`([^`\n]+)`|[\\`*_{}[<>#+\-=|~^$&:@]|(?<=[wW]{3})\./g;
881var ot = /[\\`*_{}[<>#+\-=|~^$&:@]|(?<=[wW]{3})\./g;
882var so = (e) =>
883  e
884    .trimStart()
885    .replace(no, (t, o, r) => {
886      let n = r !== void 0,
887        i = o !== void 0,
888        a = `**${(o ?? "").replace(ot, "\\$&")}**`;
889      return n ? t : i ? a : `\\${t}`;
890    })
891    .replace(ro, "$1\\$2");
892function io(e, t) {
893  let o = e.trimStart(),
894    r = oo.exec(o),
895    n = so(o.slice(r?.[0].length ?? 0)),
896    i = r?.[1],
897    a = Number(i),
898    l = `${(t ?? a - 1) + 1}.` === `${i}${r?.[2]}`;
899  if (r === null)
900    return {
901      kind: "plain",
902      text: n,
903      canOpenInPlace: false,
904    };
905  if (i === void 0)
906    return {
907      kind: "bullet",
908      text: `- ${n}`,
909      canOpenInPlace: true,
910    };
911  return l
912    ? {
913        kind: "ordered",
914        text: `${a}. ${n}`,
915        canOpenInPlace: a === 1,
916        ordinal: a,
917      }
918    : {
919        kind: "plain",
920        text: `${i}\\${r[2]} ${n}`,
921        canOpenInPlace: false,
922      };
923}
924function Ur(e, t) {
925  let o = io(e, t?.ordinal),
926    r = o.kind === "plain",
927    n = r && t?.kind === "plain",
928    i = (!r && o.kind === t?.kind) || o.canOpenInPlace,
929    a = n
930      ? to
931      : i
932        ? `
933`
934        : `
935
936`;
937  if (t === void 0) return o;
938  return {
939    ...o,
940    text: `${a}${o.text}`,
941  };
942}
943function ao(e, t) {
944  let o = t === "" ? "" : `**${t.replace(ot, "\\$&")}**`,
945    n =
946      o !== ""
947        ? [
948            {
949              kind: "plain",
950              text: o,
951              canOpenInPlace: false,
952            },
953          ]
954        : [],
955    i = e
956      .split(
957        `
958`,
959      )
960      .filter((a) => a !== "")
961      .reduce((a, l) => [...a, Ur(l, a.at(-1))], n)
962      .map((a) => a.text)
963      .join("");
964  return i === ""
965    ? ""
966    : `${i}
967
968`;
969}
970function rt(e, t, o) {
971  let { Markdown: r } = e,
972    n = ao(t, o);
973  return n === ""
974    ? ""
975    : h(r, {
976        text: n,
977      });
978}
979function jr(e, ...[t, o, r, n = ve]) {
980  let { Box: i, Code: a } = e;
981  return h(
982    i,
983    {
984      flexDirection: "column",
985      marginTop: 1,
986    },
987    h(
988      i,
989      {
990        flexDirection: "column",
991        marginBottom: 1,
992      },
993      Re(e, n, t),
994    ),
995    o.map((l) => {
996      let u = l.sketch.length > 0;
997      return h(
998        i,
999        {
1000          flexDirection: "column",
1001          marginBottom: 1,
1002          marginLeft: 2,
1003        },
1004        rt(e, l.lead, l.title),
1005        u
1006          ? h(a, {
1007              source: l.sketch.map((w) => (w === "" ? " " : w)).join(`
1008`),
1009              language: "text",
1010              wrap: "truncate-end",
1011            })
1012          : "",
1013        rt(e, l.caption, ""),
1014      );
1015    }),
1016    r === null
1017      ? ""
1018      : ee(e, [
1019          {
1020            hotkey: "1",
1021            label: "Understood",
1022            onPress: r.gotIt,
1023          },
1024          {
1025            hotkey: "2",
1026            label: "Chat in main session",
1027            onPress: r.respond,
1028          },
1029          {
1030            hotkey: "0",
1031            label: "Dismiss",
1032            onPress: r.dismiss,
1033            role: "dismiss",
1034          },
1035        ]),
1036  );
1037}
1038function Ce(e, t) {
1039  let { Box: o, Text: r } = e;
1040  return h(
1041    o,
1042    {
1043      marginTop: 1,
1044    },
1045    h(
1046      r,
1047      {
1048        ...ue(e).star,
1049      },
1050      "\u2726",
1051    ),
1052    h(
1053      r,
1054      {
1055        wrap: "truncate-end",
1056        dimColor: true,
1057      },
1058      " ",
1059      t,
1060    ),
1061  );
1062}
1063var Wr = (e) => Ce(e, "One moment\u2026");
1064function Kr(e, t, o) {
1065  let { Box: r, Text: n } = e,
1066    i = t === "publish",
1067    a = t === "blocked",
1068    l = t === "explain",
1069    u = t === "turn_off";
1070  return h(
1071    r,
1072    {
1073      marginTop: 1,
1074    },
1075    h(
1076      n,
1077      {
1078        wrap: "truncate-end",
1079      },
1080      U(e),
1081      i
1082        ? "Couldn\u2019t publish that page"
1083        : a
1084          ? "Not published (blocked by a permission setting)"
1085          : l
1086            ? "Couldn\u2019t write that explanation"
1087            : u
1088              ? "Couldn\u2019t turn suggestions off here. Use /plugin."
1089              : "Couldn\u2019t write that page",
1090      " ",
1091      h(
1092        n,
1093        {
1094          dimColor: true,
1095        },
1096        "\xB7",
1097      ),
1098      " ",
1099    ),
1100    Z(e, {
1101      hotkey: "0",
1102      label: "OK",
1103      onPress: o,
1104    }),
1105  );
1106}
1107var nt = 2;
1108var po = 80;
1109var fo = {
1110  hangulJamo: 4352,
1111  punctuation: {
1112    first: 8208,
1113    last: 8286,
1114  },
1115  arrows: {
1116    first: 8592,
1117    last: 8703,
1118  },
1119  shapes: {
1120    first: 9472,
1121    last: 9727,
1122  },
1123  mediumSmallSquares: {
1124    white: 9725,
1125    black: 9726,
1126  },
1127};
1128function mo(e) {
1129  let {
1130    hangulJamo: t,
1131    punctuation: o,
1132    arrows: r,
1133    shapes: n,
1134    mediumSmallSquares: i,
1135  } = fo;
1136  return e < t ||
1137    (e >= o.first && e <= o.last) ||
1138    (e >= r.first && e <= r.last) ||
1139    (e >= n.first && e <= n.last && e !== i.white && e !== i.black)
1140    ? 1
1141    : 2;
1142}
1143function st(e) {
1144  let t = 0;
1145  for (let o of e) t += mo(o.codePointAt(0) ?? 0);
1146  return t;
1147}
1148function it(e, t) {
1149  if (st(e) <= t) return e;
1150  let o = 0,
1151    r = "";
1152  for (let n of e) {
1153    if (((o += st(n)), o > t - 1)) return `${r}\u2026`;
1154    r += n;
1155  }
1156  return r;
1157}
1158function Gr(e, t) {
1159  let o = Number.isFinite(t) ? t : po;
1160  return e.map((r) => ({
1161    ...r,
1162    title: it(r.title, Math.max(o - nt, 1)),
1163    sketch: r.sketch.map((n) => it(n, Math.max(o - nt, 1))),
1164  }));
1165}
1166var Yr = (e) =>
1167  Ce(e, "Making your page (a minute or two) \xB7 Claude keeps working\u2026");
1168var lo = (e, t) =>
1169  e === void 0
1170    ? []
1171    : [
1172        {
1173          hotkey: "4",
1174          label: t ? "Press again to disable" : "Disable",
1175          onPress: e,
1176          isDim: true,
1177        },
1178      ];
1179function qr(e, ...[t, o, r, n = Fo, i = ve]) {
1180  let { Box: a } = e,
1181    l = [
1182      {
1183        hotkey: "1",
1184        label: "Learn more",
1185        onPress: o.explain,
1186      },
1187      {
1188        hotkey: "2",
1189        label: "Knew this already",
1190        onPress: o.knew,
1191      },
1192    ],
1193    u = [
1194      ...lo(o.off, r),
1195      {
1196        hotkey: "0",
1197        label: "Dismiss",
1198        onPress: o.later,
1199        role: "dismiss",
1200      },
types/index.d.ts 8 lines
1declare module "claude-code" {
2  interface PluginState {
3    "you-should-know": {
4      aboutOpen: string;
5    };
6  }
7}
8