@markmo/europacore-session-ui 0.3.0 → 0.4.0
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/ArtifactsPage-BxaqShTv.js +1178 -0
- package/dist/{BoardPage-DDcf5vup.js → BoardPage-DH7p5o99.js} +54 -54
- package/dist/{CardDetail-D0TLVhf7.js → CardDetail-LfDCJQhS.js} +26 -26
- package/dist/{ComparePage-C32hPOqV.js → ComparePage-CrbCyu4u.js} +33 -33
- package/dist/MemoriesPage-BRA53Hlb.js +679 -0
- package/dist/{OverviewPage-BkeuYg6d.js → OverviewPage-BSBqY83_.js} +31 -31
- package/dist/{RegisterPage-Dawr26jh.js → RegisterPage-64yGl9E-.js} +75 -75
- package/dist/SessionPage-C4hSlxWQ.js +906 -0
- package/dist/api/agentClient.d.ts +62 -1
- package/dist/api/wire.d.ts +461 -4
- package/dist/features/artifacts/ArtifactDetail.d.ts +15 -0
- package/dist/features/artifacts/ArtifactDialogs.d.ts +29 -0
- package/dist/features/artifacts/ArtifactLedger.d.ts +11 -0
- package/dist/features/artifacts/ArtifactStats.d.ts +9 -0
- package/dist/features/artifacts/ArtifactsPage.d.ts +1 -0
- package/dist/features/artifacts/artifactsCommands.d.ts +3 -0
- package/dist/features/artifacts/artifactsStore.d.ts +27 -0
- package/dist/features/artifacts/artifactsUi.d.ts +33 -0
- package/dist/features/bootstrap.d.ts +1 -0
- package/dist/features/chat/model/artifactAccess.d.ts +50 -0
- package/dist/features/chat/model/artifactCsv.d.ts +11 -0
- package/dist/features/chat/model/artifactExport.d.ts +45 -0
- package/dist/features/chat/model/artifactStats.d.ts +79 -0
- package/dist/features/chat/model/artifacts.d.ts +151 -0
- package/dist/features/chat/model/claims.d.ts +102 -0
- package/dist/features/chat/model/contextSources.d.ts +41 -0
- package/dist/features/chat/model/entries.d.ts +32 -2
- package/dist/features/chat/model/format.d.ts +6 -0
- package/dist/features/chat/model/memoryRecords.d.ts +79 -0
- package/dist/features/chat/model/monitors.d.ts +11 -0
- package/dist/features/chat/model/progress.d.ts +73 -0
- package/dist/features/chat/model/tasks.d.ts +1 -1
- package/dist/features/chat/panels/ProgressPanel.d.ts +8 -0
- package/dist/features/chat/session/SessionController.d.ts +3 -2
- package/dist/features/chat/session/useFileMentions.d.ts +18 -5
- package/dist/features/chat/transcript/ArtifactCard.d.ts +8 -0
- package/dist/features/chat/transcript/Rows.d.ts +12 -1
- package/dist/features/memories/MemoriesPage.d.ts +1 -0
- package/dist/features/memories/memoriesCommands.d.ts +3 -0
- package/dist/features/memories/memoriesController.d.ts +81 -0
- package/dist/features/workspace/claimsCommands.d.ts +26 -0
- package/dist/features/workspace/collisionsWatcher.d.ts +7 -0
- package/dist/features/workspace/useSessionPageHooks.d.ts +1 -1
- package/dist/{index-B0hmy2Cw.js → index-CMPf-3JZ.js} +4412 -3293
- package/dist/index.d.ts +2 -0
- package/dist/index.js +86 -82
- package/dist/lib/paths.d.ts +12 -0
- package/dist/lib/zip.d.ts +14 -0
- package/dist/{promptHistory-DQyt2Br0.js → promptHistory-BR0NpLCI.js} +14 -14
- package/package.json +1 -1
- package/dist/SessionPage-68nDek9w.js +0 -881
|
@@ -2,17 +2,17 @@ import { jsxs as l, jsx as t, Fragment as re } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState as x, useRef as W, useEffect as K, forwardRef as De, useMemo as Re } from "react";
|
|
3
3
|
import { useNavigate as Ae, useSearchParams as Oe, Link as B } from "react-router";
|
|
4
4
|
import { Hourglass as Te, Send as Ke, Play as Le, Plus as $e, LayoutList as oe, Inbox as ce, Search as de, X as Ie, Pin as q, MessageSquareReply as pe, Eye as Me, PinOff as Ue, Pencil as _e } from "lucide-react";
|
|
5
|
-
import {
|
|
6
|
-
import { C as st } from "./CardDetail-
|
|
7
|
-
import { d as Se, P as at, p as we } from "./promptHistory-
|
|
8
|
-
const
|
|
9
|
-
function
|
|
5
|
+
import { n as ee, K as c, u as Be, a6 as He, Y as D, a3 as Ne, C as H, H as X, J as ve, a8 as Fe, a9 as Z, s as We, aa as je, ab as he, ac as qe, O as ue, ad as Ye, Z as me, a as $, ae as Ge, af as Je, ag as Qe, V as fe, ah as Y, $ as xe, ai as Ve, aj as ge, ak as Xe, al as be, am as Ze, an as et, r as ye, ao as I, ap as G, I as J, aq as tt, ar as nt } from "./index-CMPf-3JZ.js";
|
|
6
|
+
import { C as st } from "./CardDetail-LfDCJQhS.js";
|
|
7
|
+
import { d as Se, P as at, p as we } from "./promptHistory-BR0NpLCI.js";
|
|
8
|
+
const Q = /* @__PURE__ */ new Map(), Ce = "Commands run in a session: open it to run one.";
|
|
9
|
+
function F(i) {
|
|
10
10
|
return !!i.id && !i.parent && !i.run;
|
|
11
11
|
}
|
|
12
12
|
function it({ row: i, onOpen: m, onClose: v, autoFocus: S = !0 }) {
|
|
13
13
|
const { toast: R } = ee(), g = i.id ? c.get(i.id) : void 0;
|
|
14
|
-
Be(g,
|
|
15
|
-
const [w, M] = x(() =>
|
|
14
|
+
Be(g, H.pause, H.run, H.session, H.reset);
|
|
15
|
+
const [w, M] = x(() => Q.get(i.key) ?? ""), [f, o] = x(null), [P, b] = x(!1), A = W(null);
|
|
16
16
|
K(() => {
|
|
17
17
|
i.id && !c.get(i.id) && c.attach(i.id);
|
|
18
18
|
}, [i.id]);
|
|
@@ -23,7 +23,7 @@ function it({ row: i, onOpen: m, onClose: v, autoFocus: S = !0 }) {
|
|
|
23
23
|
S && !h && A.current?.focus();
|
|
24
24
|
}, [S, h]);
|
|
25
25
|
const k = (r) => {
|
|
26
|
-
M(r), o(null), r ?
|
|
26
|
+
M(r), o(null), r ? Q.set(i.key, r) : Q.delete(i.key);
|
|
27
27
|
}, C = async () => {
|
|
28
28
|
const r = w.trim();
|
|
29
29
|
if (!r) return m();
|
|
@@ -38,7 +38,7 @@ function it({ row: i, onOpen: m, onClose: v, autoFocus: S = !0 }) {
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
return h && g ? /* @__PURE__ */ l("fieldset", { className: "flex min-w-0 flex-col gap-2", "aria-label": `Decision for ${i.title}`, children: [
|
|
41
|
-
/* @__PURE__ */ t(at, { controller: g, collisions:
|
|
41
|
+
/* @__PURE__ */ t(at, { controller: g, collisions: He.collisions }),
|
|
42
42
|
w.trim() && /* @__PURE__ */ t("button", { type: "button", className: "self-start text-[12px] text-muted hover:text-ink", onClick: () => b(!1), children: "Back to your message" })
|
|
43
43
|
] }) : /* @__PURE__ */ l("div", { className: "flex flex-col gap-1.5", children: [
|
|
44
44
|
y && /* @__PURE__ */ l("div", { className: "flex items-center gap-2 rounded-lg border border-warn-line bg-warn-soft px-2.5 py-1.5 text-[12.5px] text-ink", children: [
|
|
@@ -85,7 +85,7 @@ function rt(i) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
const ot = De(function({ onStarted: m, onOpenNew: v, onLeave: S }, R) {
|
|
88
|
-
const { toast: g } = ee(), w =
|
|
88
|
+
const { toast: g } = ee(), w = X((n) => n.agents), M = X((n) => n.features), f = ve(w, M), [o, P] = x(() => ({ agent: "", workspace: "", ...lt() })), [b, A] = x(null), [y, h] = x(""), [k, C] = x(null), [r, O] = x(!1), p = f.find((n) => n.name === o.agent) ?? f.find((n) => n.name === "chat") ?? f[0], z = !!(p && Fe.has(p.name)), N = b?.find((n) => n.path === o.workspace) ?? b?.[0] ?? null;
|
|
89
89
|
K(() => {
|
|
90
90
|
if (!z || b !== null) return;
|
|
91
91
|
const n = We().workspaces;
|
|
@@ -144,20 +144,20 @@ const ot = De(function({ onStarted: m, onOpenNew: v, onLeave: S }, R) {
|
|
|
144
144
|
function pt(i, m) {
|
|
145
145
|
return i.flatMap((v) => [{ row: v, depth: 0 }, ...m.has(v.key) ? v.children.map((S) => ({ row: S, depth: 1 })) : []]);
|
|
146
146
|
}
|
|
147
|
-
const
|
|
147
|
+
const V = (i) => !!(i?.id && !i.parent && !i.run);
|
|
148
148
|
function yt() {
|
|
149
|
-
const i = je(), m = Ae(), { toast: v } = ee(), S =
|
|
149
|
+
const i = je(), m = Ae(), { toast: v } = ee(), S = X((e) => ve(e.agents, e.features).length > 0), R = he(ct), g = he(dt), w = R ? "aside" : g ? "table" : "card", [M, f] = Oe(), o = M.get("view") === "inbox" ? "inbox" : "all", [P, b] = x(/* @__PURE__ */ new Set()), [A, y] = x(null), [h, k] = x(""), [C, r] = x(null), [O, p] = x(null), z = W(null), N = W(null), L = W(null), T = c.seen, n = qe(o === "inbox" ? c.inbox() : i, h), d = Re(() => o === "inbox" ? n.map((e) => ({ row: e, depth: 0 })) : pt(n, P), [n, P, o]), E = Math.max(0, d.findIndex((e) => e.row.key === A)), s = d[E]?.row ?? null, U = s !== null && C === s.key, te = (e) => {
|
|
150
150
|
const a = d[Math.max(0, Math.min(d.length - 1, e))]?.row;
|
|
151
151
|
a && y(a.key);
|
|
152
152
|
};
|
|
153
153
|
K(() => (c.wantFleetTasks([...P], "overview"), () => c.wantFleetTasks([], "overview")), [P]);
|
|
154
154
|
const j = (e) => {
|
|
155
155
|
if (e) {
|
|
156
|
-
if (!
|
|
156
|
+
if (!F(e)) return m(I(e));
|
|
157
157
|
y(e.key), r(e.key);
|
|
158
158
|
}
|
|
159
159
|
}, ne = (e) => {
|
|
160
|
-
if (!
|
|
160
|
+
if (!V(e)) return;
|
|
161
161
|
const a = c.togglePin(e.id);
|
|
162
162
|
v(a ? `Pinned “${e.title}” to the top` : `Unpinned “${e.title}”`, "ok");
|
|
163
163
|
}, Pe = ({ agent: e, workspace: a }) => {
|
|
@@ -175,7 +175,7 @@ function yt() {
|
|
|
175
175
|
else if (a.key === "n" && S) L.current?.focus();
|
|
176
176
|
else if (a.key === "/") N.current?.focus();
|
|
177
177
|
else if (a.key === "*") ne(s);
|
|
178
|
-
else if (a.key === "e" &&
|
|
178
|
+
else if (a.key === "e" && V(s)) p(s.key);
|
|
179
179
|
else if (a.key === "m" && s) c.markSeen(s);
|
|
180
180
|
else if (a.key === "Escape" && h) k("");
|
|
181
181
|
else if (a.key === "Escape" && C) r(null);
|
|
@@ -193,14 +193,14 @@ function yt() {
|
|
|
193
193
|
const se = (e) => b((a) => {
|
|
194
194
|
const u = new Set(a);
|
|
195
195
|
return u.has(e) ? u.delete(e) : u.add(e), u;
|
|
196
|
-
}), ze = (e, a) => O === e.key && w === "table" ? /* @__PURE__ */ t(
|
|
196
|
+
}), ze = (e, a) => O === e.key && w === "table" ? /* @__PURE__ */ t(G, { row: e, onDone: () => p(null) }) : /* @__PURE__ */ l(B, { to: I(e), className: $("flex min-w-0 items-center gap-1", a, e.attention && "font-semibold"), children: [
|
|
197
197
|
c.isPinned(e.id) && /* @__PURE__ */ t(q, { size: 11, "aria-label": "Pinned", className: "shrink-0 text-accent" }),
|
|
198
198
|
/* @__PURE__ */ t("span", { className: "truncate", children: e.title })
|
|
199
|
-
] }), ae = c.inbox().length, ie = s &&
|
|
199
|
+
] }), ae = c.inbox().length, ie = s && F(s) && /* @__PURE__ */ t(it, { row: s, onOpen: () => m(ue(s.key)), onClose: () => r(null), autoFocus: U }, s.key), le = !!(s?.id && c.get(s.id) && Se(c.get(s.id)));
|
|
200
200
|
return /* @__PURE__ */ l("div", { className: "flex h-full min-h-0 flex-col", children: [
|
|
201
201
|
/* @__PURE__ */ l("div", { className: "shrink-0 px-4 pt-5 sm:px-6", children: [
|
|
202
202
|
/* @__PURE__ */ t(
|
|
203
|
-
|
|
203
|
+
Ye,
|
|
204
204
|
{
|
|
205
205
|
eyebrow: "Agents",
|
|
206
206
|
title: o === "inbox" ? "Inbox" : "Sessions",
|
|
@@ -253,7 +253,7 @@ function yt() {
|
|
|
253
253
|
o === "all" && // biome-ignore lint/a11y/noLabelWithoutControl: NativeSelect is a select
|
|
254
254
|
/* @__PURE__ */ l("label", { className: "ml-auto flex items-center gap-2 text-[12.5px] text-muted", children: [
|
|
255
255
|
"Sort",
|
|
256
|
-
/* @__PURE__ */ t(Z, { value: c.sort, onChange: (e) =>
|
|
256
|
+
/* @__PURE__ */ t(Z, { value: c.sort, onChange: (e) => Qe(e.target.value) && c.setSort(e.target.value), className: "h-8 w-auto text-[12.5px]", children: Ge.map((e) => /* @__PURE__ */ t("option", { value: e, children: Je[e] }, e)) })
|
|
257
257
|
] })
|
|
258
258
|
] })
|
|
259
259
|
] }),
|
|
@@ -270,7 +270,7 @@ function yt() {
|
|
|
270
270
|
/* @__PURE__ */ t("th", { className: "py-2 pr-3 text-right", children: "Updated" })
|
|
271
271
|
] }) }),
|
|
272
272
|
/* @__PURE__ */ t("tbody", { children: d.map(({ row: e, depth: a }, u) => {
|
|
273
|
-
const _ =
|
|
273
|
+
const _ = Y(e, T);
|
|
274
274
|
return /* @__PURE__ */ l(
|
|
275
275
|
"tr",
|
|
276
276
|
{
|
|
@@ -283,7 +283,7 @@ function yt() {
|
|
|
283
283
|
/* @__PURE__ */ t("td", { className: "py-2 pl-3", children: /* @__PURE__ */ t(xe, { row: e }) }),
|
|
284
284
|
/* @__PURE__ */ l("td", { className: "max-w-0 py-2 pr-3", children: [
|
|
285
285
|
/* @__PURE__ */ l("div", { className: "flex items-center gap-1.5", style: { paddingLeft: a * 16 }, children: [
|
|
286
|
-
e.children.length > 0 && /* @__PURE__ */ t(
|
|
286
|
+
e.children.length > 0 && /* @__PURE__ */ t(Ve, { open: P.has(e.key), onClick: () => se(e.key), label: "Tasks" }),
|
|
287
287
|
ze(e, "text-ink hover:text-accent")
|
|
288
288
|
] }),
|
|
289
289
|
/* @__PURE__ */ l("div", { className: "flex gap-2 truncate text-[11.5px] text-faint", style: { paddingLeft: a * 16 }, children: [
|
|
@@ -298,7 +298,7 @@ function yt() {
|
|
|
298
298
|
] }),
|
|
299
299
|
/* @__PURE__ */ t("td", { className: "py-2 pr-3", children: o === "inbox" && _ ? /* @__PURE__ */ t("span", { className: $("text-[12px] font-semibold", _ === "input" ? "text-warn" : _ === "failed" ? "text-danger" : "text-ok"), children: ke[_] }) : /* @__PURE__ */ l("span", { className: "flex items-center gap-1.5", children: [
|
|
300
300
|
/* @__PURE__ */ t(ge, { stage: e.stage, text: e.stageText }),
|
|
301
|
-
e.stageSince && /* @__PURE__ */ t("span", { className: "text-[11px] text-faint", children:
|
|
301
|
+
e.stageSince && /* @__PURE__ */ t("span", { className: "text-[11px] text-faint", children: Xe(Date.now() - e.stageSince) })
|
|
302
302
|
] }) }),
|
|
303
303
|
/* @__PURE__ */ t("td", { className: "hidden py-2 pr-3 lg:table-cell", children: /* @__PURE__ */ t(be, { pct: e.contextPct, width: "w-14" }) }),
|
|
304
304
|
/* @__PURE__ */ t("td", { className: "hidden py-2 pr-3 text-right text-muted tabular-nums lg:table-cell", children: e.tokens ? Ze(e.tokens) : "" }),
|
|
@@ -311,9 +311,9 @@ function yt() {
|
|
|
311
311
|
}) })
|
|
312
312
|
] }),
|
|
313
313
|
/* @__PURE__ */ t("ul", { className: "divide-y divide-line-soft md:hidden", children: d.map(({ row: e, depth: a }) => {
|
|
314
|
-
const u =
|
|
314
|
+
const u = Y(e, T);
|
|
315
315
|
return /* @__PURE__ */ l("li", { className: "flex items-stretch", style: { paddingLeft: a * 16 }, children: [
|
|
316
|
-
O === e.key && w === "card" ? /* @__PURE__ */ t("div", { className: "flex-1 px-3 py-2.5", children: /* @__PURE__ */ t(
|
|
316
|
+
O === e.key && w === "card" ? /* @__PURE__ */ t("div", { className: "flex-1 px-3 py-2.5", children: /* @__PURE__ */ t(G, { row: e, onDone: () => p(null) }) }) : /* @__PURE__ */ l(B, { to: I(e), className: "flex min-h-14 min-w-0 flex-1 items-start gap-2.5 px-3 py-2.5 active:bg-surface-hover", children: [
|
|
317
317
|
/* @__PURE__ */ t(xe, { row: e, className: "mt-1" }),
|
|
318
318
|
/* @__PURE__ */ l("span", { className: "min-w-0 flex-1", children: [
|
|
319
319
|
/* @__PURE__ */ l("span", { className: $("flex items-center gap-1 text-[14px] text-ink", e.attention && "font-semibold"), children: [
|
|
@@ -331,21 +331,21 @@ function yt() {
|
|
|
331
331
|
/* @__PURE__ */ t(be, { pct: e.contextPct, width: "w-10", showLabel: !1 })
|
|
332
332
|
] })
|
|
333
333
|
] }),
|
|
334
|
-
|
|
334
|
+
F(e) && /* @__PURE__ */ t(J, { label: e.status === "input" ? `Answer ${e.title}` : `Reply to ${e.title}`, className: "m-1 h-12 w-12 self-center", onClick: () => j(e), children: /* @__PURE__ */ t(pe, { size: 16 }) })
|
|
335
335
|
] }, e.key);
|
|
336
336
|
}) })
|
|
337
337
|
] }) : h ? /* @__PURE__ */ t(fe, { icon: /* @__PURE__ */ t(de, { size: 20 }), title: "Nothing matches the filter", children: /* @__PURE__ */ t(D, { size: "sm", onClick: () => k(""), children: "Clear it" }) }) : /* @__PURE__ */ t(fe, { icon: o === "inbox" ? /* @__PURE__ */ t(ce, { size: 20 }) : /* @__PURE__ */ t(oe, { size: 20 }), title: o === "inbox" ? "Nothing needs you" : c.listedOnce ? "No sessions yet" : "Loading…", children: o === "inbox" ? "When a session waits for a decision, fails or finishes, it shows here." : null }) }),
|
|
338
338
|
s && /* @__PURE__ */ l("aside", { className: "hidden w-96 shrink-0 flex-col gap-3 overflow-y-auto rounded-lg border border-line bg-surface p-4 xl:flex", "aria-label": "Selected session", children: [
|
|
339
|
-
/* @__PURE__ */ t("h2", { className: "text-[14px] font-semibold text-ink", children: O === s.key && w === "aside" ? /* @__PURE__ */ t(
|
|
339
|
+
/* @__PURE__ */ t("h2", { className: "text-[14px] font-semibold text-ink", children: O === s.key && w === "aside" ? /* @__PURE__ */ t(G, { row: s, onDone: () => p(null) }) : s.title }),
|
|
340
340
|
/* @__PURE__ */ t(st, { card: { row: s, fleet: null }, seen: T }),
|
|
341
341
|
R && (U || le) && ie,
|
|
342
342
|
/* @__PURE__ */ l("div", { className: "flex flex-wrap gap-2", children: [
|
|
343
343
|
/* @__PURE__ */ t(B, { to: I(s), children: /* @__PURE__ */ t(D, { size: "sm", variant: "primary", children: "Open" }) }),
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
/* @__PURE__ */ t(
|
|
348
|
-
/* @__PURE__ */ t(
|
|
344
|
+
F(s) && !U && !le && /* @__PURE__ */ t(D, { size: "sm", icon: /* @__PURE__ */ t(pe, { size: 13 }), onClick: () => j(s), children: s.status === "input" ? "Answer" : "Reply" }),
|
|
345
|
+
Y(s, T) && /* @__PURE__ */ t(D, { size: "sm", icon: /* @__PURE__ */ t(Me, { size: 13 }), onClick: () => c.markSeen(s), children: "Mark seen" }),
|
|
346
|
+
V(s) && /* @__PURE__ */ l(re, { children: [
|
|
347
|
+
/* @__PURE__ */ t(J, { size: "sm", label: c.isPinned(s.id) ? "Unpin" : "Pin to the top", onClick: () => ne(s), children: c.isPinned(s.id) ? /* @__PURE__ */ t(Ue, { size: 14 }) : /* @__PURE__ */ t(q, { size: 14 }) }),
|
|
348
|
+
/* @__PURE__ */ t(J, { size: "sm", label: "Rename", onClick: () => p(s.key), children: /* @__PURE__ */ t(_e, { size: 14 }) })
|
|
349
349
|
] }),
|
|
350
350
|
s.prUrl && /* @__PURE__ */ t("a", { href: s.prUrl, target: "_blank", rel: "noreferrer", children: /* @__PURE__ */ t(D, { size: "sm", children: "Pull request" }) })
|
|
351
351
|
] }),
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { jsxs as o, jsx as s, Fragment as
|
|
2
|
-
import { useState as m, useSyncExternalStore as
|
|
3
|
-
import { useSearchParams as
|
|
4
|
-
import { Download as Re, FileText as
|
|
5
|
-
import {
|
|
1
|
+
import { jsxs as o, jsx as s, Fragment as $e } from "react/jsx-runtime";
|
|
2
|
+
import { useState as m, useSyncExternalStore as Ce, useEffect as Ee, useMemo as k, useCallback as Ae, Fragment as De } from "react";
|
|
3
|
+
import { useSearchParams as Le, Link as Me } from "react-router";
|
|
4
|
+
import { Download as Re, FileText as Te, FileSpreadsheet as je, FileJson as Fe, Search as X, RotateCcw as _e, BookMarked as Ie } from "lucide-react";
|
|
5
|
+
import { aO as B, n as Oe, aP as ye, K as O, aQ as ze, aR as y, aS as Pe, ad as Be, Y as M, aD as Ue, aG as qe, aE as Ve, a9 as Z, aT as z, aU as ee, aV as se, aJ as te, aK as Ke, V as ne, aW as ae, aX as ie, aY as oe, aZ as le, a_ as re, a as P, a$ as Je, b0 as Ye, a2 as Ge, O as We, r as He, b1 as Qe, b2 as Xe, b3 as Ze } from "./index-CMPf-3JZ.js";
|
|
6
6
|
import { Menu as es, MenuButton as ss } from "@headlessui/react";
|
|
7
7
|
function U(t) {
|
|
8
8
|
if (Number.isNaN(t.getTime())) return "";
|
|
@@ -30,12 +30,12 @@ function de(t) {
|
|
|
30
30
|
return [ce, ce.map(() => "---"), ...i].map((n) => `| ${n.map(ts).join(" | ")} |`);
|
|
31
31
|
}
|
|
32
32
|
function as(t, i) {
|
|
33
|
-
const n = [...t].sort(
|
|
33
|
+
const n = [...t].sort(B), r = `Generated ${U(i.generatedAt)}${i.workspace ? ` · workspace \`${i.workspace}\`` : ""}`, c = [`# ${i.title ?? "Decision register"}`, "", r, ""], h = [
|
|
34
34
|
["Decisions", "decision"],
|
|
35
35
|
["Requirements", "requirement"]
|
|
36
36
|
];
|
|
37
|
-
for (const [p,
|
|
38
|
-
const x = n.filter((b) => b.kind ===
|
|
37
|
+
for (const [p, $] of h) {
|
|
38
|
+
const x = n.filter((b) => b.kind === $ && b.status === "active");
|
|
39
39
|
c.push(`## ${p}`, "", ...x.length ? de(x) : ["_None recorded._"], "");
|
|
40
40
|
}
|
|
41
41
|
const g = n.filter((p) => p.status !== "active");
|
|
@@ -61,7 +61,7 @@ const os = [
|
|
|
61
61
|
"arguments"
|
|
62
62
|
];
|
|
63
63
|
function ls(t) {
|
|
64
|
-
const i = [...t].sort(
|
|
64
|
+
const i = [...t].sort(B).map((n) => [
|
|
65
65
|
n.id,
|
|
66
66
|
n.kind,
|
|
67
67
|
U(new Date(n.createdAt)),
|
|
@@ -79,16 +79,16 @@ function ls(t) {
|
|
|
79
79
|
`).join("");
|
|
80
80
|
}
|
|
81
81
|
function rs(t) {
|
|
82
|
-
return `${JSON.stringify([...t].sort(
|
|
82
|
+
return `${JSON.stringify([...t].sort(B), null, 2)}
|
|
83
83
|
`;
|
|
84
84
|
}
|
|
85
85
|
function cs(t, i, n) {
|
|
86
86
|
return t === "csv" ? ls(i) : t === "json" ? rs(i) : as(i, n);
|
|
87
87
|
}
|
|
88
88
|
const ds = 100, he = [
|
|
89
|
-
{ format: "md", label: "Markdown", icon:
|
|
90
|
-
{ format: "csv", label: "CSV", icon:
|
|
91
|
-
{ format: "json", label: "JSON", icon:
|
|
89
|
+
{ format: "md", label: "Markdown", icon: Te, type: "text/markdown;charset=utf-8" },
|
|
90
|
+
{ format: "csv", label: "CSV", icon: je, type: "text/csv;charset=utf-8" },
|
|
91
|
+
{ format: "json", label: "JSON", icon: Fe, type: "application/json;charset=utf-8" }
|
|
92
92
|
];
|
|
93
93
|
function us(t) {
|
|
94
94
|
const i = (n) => String(n).padStart(2, "0");
|
|
@@ -98,8 +98,8 @@ function ms(t) {
|
|
|
98
98
|
return t.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "register";
|
|
99
99
|
}
|
|
100
100
|
function ps(t, i, n, r = /* @__PURE__ */ new Date()) {
|
|
101
|
-
const c = cs(t, i, { workspace: n ===
|
|
102
|
-
return { text: c, type: h, filename: `decision-register-${ms(
|
|
101
|
+
const c = cs(t, i, { workspace: n === y ? null : n, generatedAt: r }), h = he.find((g) => g.format === t).type;
|
|
102
|
+
return { text: c, type: h, filename: `decision-register-${ms(z(n))}-${us(r)}.${t}` };
|
|
103
103
|
}
|
|
104
104
|
function hs(t, i, n) {
|
|
105
105
|
const r = URL.createObjectURL(new Blob([t], { type: i })), c = document.createElement("a");
|
|
@@ -125,102 +125,102 @@ function ue(t, i) {
|
|
|
125
125
|
}
|
|
126
126
|
function me({ entry: t, sessions: i, className: n }) {
|
|
127
127
|
return /* @__PURE__ */ s(
|
|
128
|
-
|
|
128
|
+
Me,
|
|
129
129
|
{
|
|
130
|
-
to:
|
|
131
|
-
className:
|
|
130
|
+
to: We(t.sessionId),
|
|
131
|
+
className: P("truncate text-muted hover:text-accent hover:underline", n),
|
|
132
132
|
title: `Open ${ue(t, i)}`,
|
|
133
133
|
children: ue(t, i)
|
|
134
134
|
}
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
137
|
function pe({ iso: t }) {
|
|
138
|
-
return /* @__PURE__ */ s("time", { dateTime: t, title: new Date(t).toLocaleString(), children:
|
|
138
|
+
return /* @__PURE__ */ s("time", { dateTime: t, title: new Date(t).toLocaleString(), children: He(t) });
|
|
139
139
|
}
|
|
140
140
|
function ks() {
|
|
141
|
-
const { toast: t } =
|
|
142
|
-
|
|
141
|
+
const { toast: t } = Oe(), [i, n] = Le(), [r, c] = m([]), [h, g] = m(/* @__PURE__ */ new Map()), [p, $] = m(!0), [x, b] = m(null), [ge, fe] = m(0), [v, q] = m("all"), [N, V] = m("all"), [w, K] = m("all"), [C, J] = m(""), [R, E] = m(null), [T, Y] = m(null), xe = ye(), be = Ce(O.subscribe, O.getVersion);
|
|
142
|
+
Ee(() => {
|
|
143
143
|
let e = !1;
|
|
144
|
-
return
|
|
144
|
+
return $(!0), b(null), gs(c, () => e).catch((a) => {
|
|
145
145
|
e || b(a instanceof Error ? a.message : String(a));
|
|
146
146
|
}).finally(() => {
|
|
147
|
-
e ||
|
|
147
|
+
e || $(!1);
|
|
148
148
|
}), () => {
|
|
149
149
|
e = !0;
|
|
150
150
|
};
|
|
151
151
|
}, [ge]);
|
|
152
|
-
const
|
|
152
|
+
const A = k(() => {
|
|
153
153
|
const e = new Map(r.map((a) => [a.id, a]));
|
|
154
154
|
for (const [a, l] of h) e.set(a, l);
|
|
155
|
-
for (const a of
|
|
155
|
+
for (const a of O.attached()) a.session && e.has(a.id) && e.set(a.id, a.session);
|
|
156
156
|
return e;
|
|
157
|
-
}, [r, h, xe, be]), S = k(() => [...
|
|
157
|
+
}, [r, h, xe, be]), S = k(() => [...A.values()], [A]), j = k(() => ze(S), [S]), d = i.get("scope") ?? j[0]?.scope ?? y, u = k(() => Pe(S, d), [S, d]), D = k(
|
|
158
158
|
() => u.filter(
|
|
159
|
-
(e) => (v === "all" || e.kind === v) && (N === "all" || e.status === N) && (w === "all" || e.source === w) && fs(e,
|
|
159
|
+
(e) => (v === "all" || e.kind === v) && (N === "all" || e.status === N) && (w === "all" || e.source === w) && fs(e, C.trim())
|
|
160
160
|
),
|
|
161
|
-
[u, v, N, w,
|
|
162
|
-
),
|
|
163
|
-
|
|
161
|
+
[u, v, N, w, C]
|
|
162
|
+
), F = u.filter((e) => e.status === "active"), L = F.filter((e) => e.kind === "decision").length, G = v !== "all" || N !== "all" || w !== "all" || C.trim() !== "", ve = (e) => {
|
|
163
|
+
E(null), n(
|
|
164
164
|
(a) => {
|
|
165
165
|
const l = new URLSearchParams(a);
|
|
166
166
|
return l.set("scope", e), l;
|
|
167
167
|
},
|
|
168
168
|
{ replace: !0 }
|
|
169
169
|
);
|
|
170
|
-
},
|
|
171
|
-
q("all"), V("all"),
|
|
172
|
-
}, Ne =
|
|
170
|
+
}, W = () => {
|
|
171
|
+
q("all"), V("all"), K("all"), J("");
|
|
172
|
+
}, Ne = Ae((e) => {
|
|
173
173
|
g((a) => {
|
|
174
174
|
const l = new Map(a);
|
|
175
175
|
for (const f of e) f && l.set(f.id, f);
|
|
176
176
|
return l;
|
|
177
177
|
});
|
|
178
|
-
}, []),
|
|
179
|
-
|
|
178
|
+
}, []), _ = { scope: d, sessions: S }, I = async (e, a) => {
|
|
179
|
+
Y(e.uid);
|
|
180
180
|
try {
|
|
181
181
|
const l = await a();
|
|
182
|
-
t(l.message, l.ok ? "ok" : "danger"), l.ok && (Ne([l.session, ...l.sessions ?? []]),
|
|
182
|
+
t(l.message, l.ok ? "ok" : "danger"), l.ok && (Ne([l.session, ...l.sessions ?? []]), E(null));
|
|
183
183
|
} finally {
|
|
184
|
-
|
|
184
|
+
Y(null);
|
|
185
185
|
}
|
|
186
|
-
},
|
|
187
|
-
a === "retire" ?
|
|
186
|
+
}, H = (e, a) => {
|
|
187
|
+
a === "retire" ? I(e, () => Ze(_, e.id)) : E({ uid: e.uid, mode: a });
|
|
188
188
|
}, we = (e, a, l, f) => {
|
|
189
|
-
a === "edit" ?
|
|
189
|
+
a === "edit" ? I(e, () => Qe(_, e.id, { text: l, rationale: f })) : I(e, () => Xe(_, e.id, { text: l, rationale: f }));
|
|
190
190
|
}, Se = (e) => {
|
|
191
191
|
const a = ps(e, u, d);
|
|
192
192
|
hs(a.text, a.type, a.filename);
|
|
193
|
-
},
|
|
194
|
-
|
|
193
|
+
}, Q = (e) => R?.uid === e.uid ? /* @__PURE__ */ s(
|
|
194
|
+
Ye,
|
|
195
195
|
{
|
|
196
196
|
entry: e,
|
|
197
197
|
mode: R.mode,
|
|
198
|
-
busy:
|
|
198
|
+
busy: T === e.uid,
|
|
199
199
|
onSave: (a, l) => we(e, R.mode, a, l),
|
|
200
|
-
onCancel: () =>
|
|
200
|
+
onCancel: () => E(null)
|
|
201
201
|
}
|
|
202
|
-
) : null, ke =
|
|
202
|
+
) : null, ke = j.some((e) => e.scope === d);
|
|
203
203
|
return /* @__PURE__ */ o("div", { className: "min-h-full bg-bg", children: [
|
|
204
204
|
/* @__PURE__ */ s(
|
|
205
|
-
|
|
205
|
+
Be,
|
|
206
206
|
{
|
|
207
207
|
eyebrow: "Memory",
|
|
208
208
|
title: "Decision register",
|
|
209
209
|
subtitle: /* @__PURE__ */ o("span", { className: "inline-flex min-w-0 max-w-full items-center gap-1", children: [
|
|
210
|
-
/* @__PURE__ */ s("span", { className: "truncate font-mono text-[12px]", title: d, children: d ===
|
|
210
|
+
/* @__PURE__ */ s("span", { className: "truncate font-mono text-[12px]", title: d, children: d === y ? "Chats without a workspace" : d }),
|
|
211
211
|
/* @__PURE__ */ s("span", { "aria-hidden": "true", children: "·" }),
|
|
212
212
|
/* @__PURE__ */ o("span", { className: "whitespace-nowrap", children: [
|
|
213
|
-
|
|
213
|
+
L,
|
|
214
214
|
" ",
|
|
215
|
-
|
|
215
|
+
L === 1 ? "decision" : "decisions",
|
|
216
216
|
" · ",
|
|
217
|
-
|
|
217
|
+
F.length - L,
|
|
218
218
|
" ",
|
|
219
|
-
|
|
219
|
+
F.length - L === 1 ? "requirement" : "requirements"
|
|
220
220
|
] })
|
|
221
221
|
] }),
|
|
222
222
|
actions: /* @__PURE__ */ o(es, { children: [
|
|
223
|
-
/* @__PURE__ */ s(ss, { as:
|
|
223
|
+
/* @__PURE__ */ s(ss, { as: M, icon: /* @__PURE__ */ s(Re, { size: 15 }), disabled: !u.length, children: "Export" }),
|
|
224
224
|
/* @__PURE__ */ o(Ue, { children: [
|
|
225
225
|
/* @__PURE__ */ o(qe, { children: [
|
|
226
226
|
"All ",
|
|
@@ -236,9 +236,9 @@ function ks() {
|
|
|
236
236
|
/* @__PURE__ */ o("div", { className: "mx-auto max-w-[1300px] px-4 py-4 sm:px-5", children: [
|
|
237
237
|
/* @__PURE__ */ o("div", { className: "mb-3 grid gap-2 sm:grid-cols-2 lg:flex lg:flex-wrap lg:items-center", children: [
|
|
238
238
|
/* @__PURE__ */ s("div", { className: "sm:col-span-2 lg:w-72", children: /* @__PURE__ */ o(Z, { "aria-label": "Scope", value: d, onChange: (e) => ve(e.target.value), className: "h-8 text-[13px]", children: [
|
|
239
|
-
!ke && /* @__PURE__ */ s("option", { value: d, children:
|
|
240
|
-
|
|
241
|
-
|
|
239
|
+
!ke && /* @__PURE__ */ s("option", { value: d, children: z(d) }),
|
|
240
|
+
j.map((e) => /* @__PURE__ */ o("option", { value: e.scope, title: e.scope, children: [
|
|
241
|
+
z(e.scope),
|
|
242
242
|
" · ",
|
|
243
243
|
e.active,
|
|
244
244
|
" active · ",
|
|
@@ -253,8 +253,8 @@ function ks() {
|
|
|
253
253
|
"input",
|
|
254
254
|
{
|
|
255
255
|
type: "search",
|
|
256
|
-
value:
|
|
257
|
-
onChange: (e) =>
|
|
256
|
+
value: C,
|
|
257
|
+
onChange: (e) => J(e.target.value),
|
|
258
258
|
placeholder: "Search statements, rationales, sessions",
|
|
259
259
|
"aria-label": "Search the register",
|
|
260
260
|
className: "h-8 w-full rounded-md border border-line bg-surface pr-2 pl-8 text-[13px] text-ink placeholder:text-faint focus:border-accent focus:ring-2 focus:ring-accent/20 focus:outline-none"
|
|
@@ -288,7 +288,7 @@ function ks() {
|
|
|
288
288
|
]
|
|
289
289
|
}
|
|
290
290
|
),
|
|
291
|
-
/* @__PURE__ */ s("div", { className: "lg:w-40", children: /* @__PURE__ */ o(Z, { "aria-label": "Source", value: w, onChange: (e) =>
|
|
291
|
+
/* @__PURE__ */ s("div", { className: "lg:w-40", children: /* @__PURE__ */ o(Z, { "aria-label": "Source", value: w, onChange: (e) => K(e.target.value), className: "h-8 text-[13px]", children: [
|
|
292
292
|
/* @__PURE__ */ s("option", { value: "all", children: "Any source" }),
|
|
293
293
|
Object.keys(se).map((e) => /* @__PURE__ */ s("option", { value: e, children: se[e] }, e))
|
|
294
294
|
] }) }),
|
|
@@ -299,18 +299,18 @@ function ks() {
|
|
|
299
299
|
r.length ? `${r.length} sessions…` : "sessions…"
|
|
300
300
|
] }),
|
|
301
301
|
!p && /* @__PURE__ */ o("span", { children: [
|
|
302
|
-
G ? `${
|
|
302
|
+
G ? `${D.length} of ${u.length}` : u.length,
|
|
303
303
|
" ",
|
|
304
304
|
u.length === 1 ? "entry" : "entries"
|
|
305
305
|
] }),
|
|
306
|
-
G && /* @__PURE__ */ s(
|
|
306
|
+
G && /* @__PURE__ */ s(M, { size: "xs", variant: "subtle", icon: /* @__PURE__ */ s(_e, { size: 12 }), onClick: W, children: "Clear" })
|
|
307
307
|
] })
|
|
308
308
|
] }),
|
|
309
|
-
x && /* @__PURE__ */ o(
|
|
309
|
+
x && /* @__PURE__ */ o(Ke, { tone: "danger", className: "mb-3", action: /* @__PURE__ */ s(M, { size: "xs", onClick: () => fe((e) => e + 1), children: "Retry" }), children: [
|
|
310
310
|
"Could not read every session: ",
|
|
311
311
|
x
|
|
312
312
|
] }),
|
|
313
|
-
u.length === 0 ? /* @__PURE__ */ s("div", { className: "rounded-xl border border-line bg-surface", children: p ? /* @__PURE__ */ s("div", { className: "flex justify-center py-16 text-accent", children: /* @__PURE__ */ s(te, {}) }) : /* @__PURE__ */ o(ne, { icon: /* @__PURE__ */ s(
|
|
313
|
+
u.length === 0 ? /* @__PURE__ */ s("div", { className: "rounded-xl border border-line bg-surface", children: p ? /* @__PURE__ */ s("div", { className: "flex justify-center py-16 text-accent", children: /* @__PURE__ */ s(te, {}) }) : /* @__PURE__ */ o(ne, { icon: /* @__PURE__ */ s(Ie, { size: 20 }), title: "Nothing remembered here yet", children: [
|
|
314
314
|
"In a session, ",
|
|
315
315
|
/* @__PURE__ */ s("code", { className: "font-mono", children: "/decision" }),
|
|
316
316
|
" or ",
|
|
@@ -318,7 +318,7 @@ function ks() {
|
|
|
318
318
|
" records one, approvals are remembered as you make them, and ",
|
|
319
319
|
/* @__PURE__ */ s("code", { className: "font-mono", children: "/decisions extract" }),
|
|
320
320
|
" asks the agent for what was agreed."
|
|
321
|
-
] }) }) :
|
|
321
|
+
] }) }) : D.length === 0 ? /* @__PURE__ */ s("div", { className: "rounded-xl border border-line bg-surface", children: /* @__PURE__ */ s(ne, { icon: /* @__PURE__ */ s(X, { size: 20 }), title: "No entries match", action: /* @__PURE__ */ s(M, { size: "sm", onClick: W, children: "Clear filters" }), children: "Nothing in this scope matches the filters." }) }) : /* @__PURE__ */ o($e, { children: [
|
|
322
322
|
/* @__PURE__ */ s("div", { className: "hidden overflow-hidden rounded-xl border border-line bg-surface md:block", children: /* @__PURE__ */ o("table", { className: "w-full table-fixed text-left text-[13px]", children: [
|
|
323
323
|
/* @__PURE__ */ o("colgroup", { children: [
|
|
324
324
|
/* @__PURE__ */ s("col", { className: "w-[84px]" }),
|
|
@@ -338,36 +338,36 @@ function ks() {
|
|
|
338
338
|
/* @__PURE__ */ s("th", { scope: "col", children: "Status" }),
|
|
339
339
|
/* @__PURE__ */ s("th", { scope: "col", children: /* @__PURE__ */ s("span", { className: "sr-only", children: "Actions" }) })
|
|
340
340
|
] }) }),
|
|
341
|
-
/* @__PURE__ */ s("tbody", { className: "divide-y divide-line-soft [&_td]:px-3 [&_td]:py-2.5 [&_td]:align-top", children:
|
|
342
|
-
const a =
|
|
343
|
-
return /* @__PURE__ */ o(
|
|
344
|
-
/* @__PURE__ */ o("tr", { className:
|
|
341
|
+
/* @__PURE__ */ s("tbody", { className: "divide-y divide-line-soft [&_td]:px-3 [&_td]:py-2.5 [&_td]:align-top", children: D.map((e) => {
|
|
342
|
+
const a = Q(e);
|
|
343
|
+
return /* @__PURE__ */ o(De, { children: [
|
|
344
|
+
/* @__PURE__ */ o("tr", { className: P("group transition-colors hover:bg-surface-hover/50", e.status !== "active" && "bg-surface-alt/60"), children: [
|
|
345
345
|
/* @__PURE__ */ s("td", { children: /* @__PURE__ */ s(ae, { entry: e }) }),
|
|
346
346
|
/* @__PURE__ */ s("td", { children: /* @__PURE__ */ s(ie, { entry: e }) }),
|
|
347
347
|
/* @__PURE__ */ s("td", { className: "hidden text-[12.5px] text-muted lg:table-cell", children: oe(e) }),
|
|
348
|
-
/* @__PURE__ */ s("td", { className: "text-[12.5px]", children: /* @__PURE__ */ s(me, { entry: e, sessions:
|
|
348
|
+
/* @__PURE__ */ s("td", { className: "text-[12.5px]", children: /* @__PURE__ */ s(me, { entry: e, sessions: A, className: "block" }) }),
|
|
349
349
|
/* @__PURE__ */ s("td", { className: "text-[12.5px] whitespace-nowrap text-muted", children: /* @__PURE__ */ s(pe, { iso: e.createdAt }) }),
|
|
350
350
|
/* @__PURE__ */ s("td", { children: /* @__PURE__ */ s(le, { status: e.status }) }),
|
|
351
|
-
/* @__PURE__ */ s("td", { className: "text-right", children: /* @__PURE__ */ s(re, { entry: e, onAction: (l) =>
|
|
351
|
+
/* @__PURE__ */ s("td", { className: "text-right", children: /* @__PURE__ */ s(re, { entry: e, onAction: (l) => H(e, l), disabled: T === e.uid }) })
|
|
352
352
|
] }),
|
|
353
353
|
a && /* @__PURE__ */ s("tr", { children: /* @__PURE__ */ s("td", { colSpan: 7, className: "bg-surface-alt", children: a }) })
|
|
354
354
|
] }, e.uid);
|
|
355
355
|
}) })
|
|
356
356
|
] }) }),
|
|
357
|
-
/* @__PURE__ */ s("ul", { className: "space-y-2 md:hidden", children:
|
|
358
|
-
const a =
|
|
359
|
-
return /* @__PURE__ */ o("li", { className:
|
|
357
|
+
/* @__PURE__ */ s("ul", { className: "space-y-2 md:hidden", children: D.map((e) => {
|
|
358
|
+
const a = Q(e);
|
|
359
|
+
return /* @__PURE__ */ o("li", { className: P("rounded-xl border border-line bg-surface p-3", e.status !== "active" && "bg-surface-alt"), children: [
|
|
360
360
|
/* @__PURE__ */ o("div", { className: "mb-1.5 flex items-center gap-1.5", children: [
|
|
361
361
|
/* @__PURE__ */ s(ae, { entry: e }),
|
|
362
|
-
/* @__PURE__ */ s(
|
|
362
|
+
/* @__PURE__ */ s(Je, { kind: e.kind }),
|
|
363
363
|
/* @__PURE__ */ s(le, { status: e.status, quietActive: !0 }),
|
|
364
|
-
/* @__PURE__ */ s("div", { className: "ml-auto", children: /* @__PURE__ */ s(re, { entry: e, onAction: (l) =>
|
|
364
|
+
/* @__PURE__ */ s("div", { className: "ml-auto", children: /* @__PURE__ */ s(re, { entry: e, onAction: (l) => H(e, l), disabled: T === e.uid }) })
|
|
365
365
|
] }),
|
|
366
366
|
a ?? /* @__PURE__ */ s(ie, { entry: e }),
|
|
367
367
|
/* @__PURE__ */ o("div", { className: "mt-2 flex min-w-0 items-center gap-1.5 text-[12px] text-faint", children: [
|
|
368
368
|
/* @__PURE__ */ s("span", { className: "shrink-0", children: oe(e) }),
|
|
369
369
|
/* @__PURE__ */ s("span", { "aria-hidden": "true", children: "·" }),
|
|
370
|
-
/* @__PURE__ */ s(me, { entry: e, sessions:
|
|
370
|
+
/* @__PURE__ */ s(me, { entry: e, sessions: A, className: "min-w-0" }),
|
|
371
371
|
/* @__PURE__ */ s("span", { "aria-hidden": "true", children: "·" }),
|
|
372
372
|
/* @__PURE__ */ s("span", { className: "shrink-0", children: /* @__PURE__ */ s(pe, { iso: e.createdAt }) })
|
|
373
373
|
] })
|