@omg-dev/app 0.2.23 → 0.3.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.
Files changed (24) hide show
  1. package/dist-lib/{ChangelogPage-CeCtrXuD.js → ChangelogPage-tITBP5A1.js} +54 -1
  2. package/dist-lib/{SessionFilesPanel-Ck0KNzua.js → SessionFilesPanel-T3CkIp2a.js} +17 -17
  3. package/dist-lib/{TermView-D2F19OhV.js → TermView-BJiSY2oC.js} +1 -1
  4. package/dist-lib/apple-touch-icon.png +0 -0
  5. package/dist-lib/{chat-engine-Bo21-04D.js → chat-engine-ChrOJLdY.js} +1 -1
  6. package/dist-lib/{coding-agents-page-Bfy-IdbL.js → coding-agents-page-Bsy-dsUo.js} +1 -1
  7. package/dist-lib/{embedded-pRKgmVAd.js → embedded-cpSkU0tg.js} +11301 -11228
  8. package/dist-lib/{highlighted-body-OFNGDK62-XrUZDzoE.js → highlighted-body-OFNGDK62-bfel3kiX.js} +1 -1
  9. package/dist-lib/icon-192.png +0 -0
  10. package/dist-lib/icon-512.png +0 -0
  11. package/dist-lib/icon-maskable-512.png +0 -0
  12. package/dist-lib/icon-maskable.svg +11 -11
  13. package/dist-lib/icon-small.svg +18 -15
  14. package/dist-lib/icon.svg +18 -15
  15. package/dist-lib/{index-CdRi0Fvj.js → index-BNac_jIC.js} +1 -1
  16. package/dist-lib/index.js +1 -1
  17. package/dist-lib/mermaid-GHXKKRXX-CTlo5kzO.js +4 -0
  18. package/dist-lib/{resume-session-sheet-9na3HKD2.js → resume-session-sheet-CsBKi_wb.js} +1 -1
  19. package/dist-lib/{session-token-usage-Buv6ihdg.js → session-token-usage-CTQR54Yk.js} +6 -6
  20. package/dist-lib/{shipped-page-DRgFmUbI.js → shipped-page-B46DR9zS.js} +91 -101
  21. package/dist-lib/{streamdown-response-k_s41jX5.js → streamdown-response-Bt7VM-cZ.js} +4 -4
  22. package/dist-lib/styles.css +1 -1
  23. package/package.json +2 -2
  24. package/dist-lib/mermaid-GHXKKRXX-CPr0wWN7.js +0 -4
@@ -1,9 +1,62 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
- import { M as n } from "./embedded-pRKgmVAd.js";
2
+ import { M as n } from "./embedded-cpSkU0tg.js";
3
3
  const t = `# Changelog
4
4
 
5
5
  Recent product updates and deployment notes.
6
6
 
7
+ ## August 22, 2026 - One session list, and sessions get their own page (v0.3.0)
8
+
9
+ - **Mobile and desktop now render the same session list.** Mobile used to show
10
+ a grid of cards, each carrying a whole transcript, split into Working and
11
+ Idle. It shows the desktop rail's rows now: one line of preview, a fixed
12
+ height, and the same delegated-child spine. A row cannot hold a transcript,
13
+ so tapping one opens the session instead of expanding in place.
14
+ - **An open session has its own URL.** \`/sessions/<id>\` is a real page. Back —
15
+ the browser's, the phone's gesture, ours — leaves the session rather than the
16
+ app, and a transcript can be linked to.
17
+ - **Folders are the only grouping, and the folder title is the filter.** Click
18
+ a folder heading to scope the list to it. The scoped heading carries a cross
19
+ to come back. Working and Idle are gone: they moved a session between two
20
+ groups every time it started or stopped, which reordered the list to say
21
+ something each row already shows.
22
+ - **The folder button is only for folders now.** It used to scope the list and
23
+ add projects at the same time. It opens the folder manager; scoping belongs
24
+ to the heading.
25
+ - **Bots have their own surface on both widths.** They are no longer repeated
26
+ inside the Chat list. The roster and the session list share one row
27
+ component, so bot rows gain the swipe gestures and the right-click menu they
28
+ never had. Creating a bot is the first row of the list.
29
+ - **A bot conversation opens even when its session is not running.** The
30
+ transcript lives on disk and outlives the process that wrote it. A bot with
31
+ months of history used to look brand new.
32
+ - **Thinking says how long it took.** "Thinking… 12s" while it runs, "Thought
33
+ for 12s" after. Thinking that happens between tool calls folds into that run,
34
+ so a turn using six tools reads as one line rather than twelve.
35
+ - **Tool calls and the typing indicator lost their cards.** A tool call is a
36
+ line in the transcript, not an object stacked between the sentences.
37
+ - **Working is one treatment everywhere.** The agent mark shrinks and an amber
38
+ spinner fills the space around it. The rail and the session header used to
39
+ disagree, in two different colours.
40
+ - **The app icon and favicons are the omg.dev mark.** They still drew the
41
+ "lfg" wordmark on a blue tile.
42
+ - **Settings is smaller.** Section headers that restated the single row below
43
+ them are gone, and so are descriptions that repeated the control they sat
44
+ under. Version and Updates are one row that expands, and it reports a version
45
+ skew without being expanded. Ping moved to the bottom of More as a plain
46
+ line. Your account picture appears once, not twice.
47
+ - **Removed: "Pause new agents" and "Archive idle agents".** Both are gone from
48
+ the interface and from the server. Agent creation is no longer refused by a
49
+ pause flag. An idle agent is now reclaimed only under memory pressure, or by
50
+ the systemd memory bound. Stored values from an older install are ignored
51
+ rather than rejected.
52
+ - **The findings feed no longer merges different errors.** Every "React error
53
+ #NNN" collapsed into one row, so a dismissed finding could silently absorb a
54
+ new, unrelated crash. A finding whose fix has landed now says which commit
55
+ fixed it, and resolves itself after two days without recurrence.
56
+ - **Attached images are shown, not described.** The composer used to list a
57
+ filename, a byte count and three buttons beside a thumbnail. Click the image
58
+ to annotate or remove it.
59
+
7
60
  ## August 22, 2026 - Add to home screen closes the first run (v0.2.23)
8
61
 
9
62
  - **First-run setup now ends with an optional "Add omg to your home screen"
@@ -1,8 +1,8 @@
1
1
  import { jsx as e, jsxs as i, Fragment as te } from "react/jsx-runtime";
2
- import { memo as ne, useState as m, useRef as T, useCallback as v, useEffect as C, useMemo as q, Suspense as I } from "react";
2
+ import { memo as ne, useState as m, useRef as T, useCallback as v, useEffect as C, useMemo as q, Suspense as U } from "react";
3
3
  import { createPortal as re } from "react-dom";
4
4
  import { cn as y } from "cnfast";
5
- import { y as oe, z as H, F as se, X as U, E as ie, H as ae, L as J, I as le, x as de, C as ce, J as L } from "./embedded-pRKgmVAd.js";
5
+ import { y as oe, a2 as W, a3 as se, X as I, a4 as ie, a5 as ae, L as H, a6 as le, x as de, C as ce, a7 as L } from "./embedded-cpSkU0tg.js";
6
6
  import { c as me } from "./create-BrnHvSDE.js";
7
7
  /**
8
8
  * @license lucide-react v0.577.0 - ISC
@@ -33,7 +33,7 @@ function xe(n, s, o) {
33
33
  }
34
34
  const ge = L("session-file-tree", () => import("./FileTreePane-BG2k7gTc.js")), be = L("session-file-viewer", () => import("./FileViewer-DgjR_OJp.js")), ve = L("session-file-editor", () => import("./FileEditor-ByMnm-sa.js"));
35
35
  async function _(n) {
36
- const s = await H(n), o = await s.json().catch(() => ({}));
36
+ const s = await W(n), o = await s.json().catch(() => ({}));
37
37
  if (!s.ok) throw new Error((o == null ? void 0 : o.error) || `${s.status}`);
38
38
  return o;
39
39
  }
@@ -45,7 +45,7 @@ function ye() {
45
45
  }, []), s;
46
46
  }
47
47
  const N = ({ label: n }) => /* @__PURE__ */ i("div", { className: "flex items-center justify-center gap-2 py-8 text-[12px] text-muted-foreground", children: [
48
- /* @__PURE__ */ e(J, { className: "size-3.5 animate-spin" }),
48
+ /* @__PURE__ */ e(H, { className: "size-3.5 animate-spin" }),
49
49
  " ",
50
50
  n
51
51
  ] });
@@ -81,7 +81,7 @@ function ke({ tree: n, onNavigate: s }) {
81
81
  );
82
82
  }
83
83
  function we({ sid: n, onClose: s }) {
84
- const [o, c] = m(null), [t, h] = m(null), [k, x] = m(null), [g, j] = m(null), [a, z] = m(null), [R, $] = m(null), [W, P] = m(!1), [u, w] = m(!1), [S, A] = m(""), [p, f] = m({ kind: "idle" }), [V, E] = m("tree"), M = ye(), b = T(null), X = v((r) => {
84
+ const [o, c] = m(null), [t, h] = m(null), [k, x] = m(null), [g, j] = m(null), [a, S] = m(null), [R, $] = m(null), [J, P] = m(!1), [u, w] = m(!1), [z, A] = m(""), [p, f] = m({ kind: "idle" }), [V, E] = m("tree"), M = ye(), b = T(null), X = v((r) => {
85
85
  b.current = r;
86
86
  }, []), F = T(null);
87
87
  C(() => {
@@ -101,15 +101,15 @@ function we({ sid: n, onClose: s }) {
101
101
  }, [s]);
102
102
  const D = v(
103
103
  (r) => {
104
- t && (E("file"), r !== F.current && (F.current = r, j(r), w(!1), f({ kind: "idle" }), A(""), b.current = null, z(null), $(null), P(!0), _(
104
+ t && (E("file"), r !== F.current && (F.current = r, j(r), w(!1), f({ kind: "idle" }), A(""), b.current = null, S(null), $(null), P(!0), _(
105
105
  `/api/sessions/${n}/file?path=${encodeURIComponent(`${t.root}/${r}`)}`
106
106
  ).then((d) => {
107
- z(d.file), b.current = d.file.contents;
107
+ S(d.file), b.current = d.file.contents;
108
108
  }).catch((d) => $(d instanceof Error ? d.message : String(d))).finally(() => P(!1))));
109
109
  },
110
110
  [n, t]
111
111
  ), O = v((r) => {
112
- c(r), F.current = null, j(null), z(null), w(!1), E("tree");
112
+ c(r), F.current = null, j(null), S(null), w(!1), E("tree");
113
113
  }, []), K = v(() => E("tree"), []), Y = q(
114
114
  () => a ? { ...a, contents: b.current ?? a.contents } : null,
115
115
  // eslint-disable-next-line react-hooks/exhaustive-deps -- `editing` is the
@@ -121,7 +121,7 @@ function we({ sid: n, onClose: s }) {
121
121
  displayPath: r,
122
122
  original: a.contents,
123
123
  edited: b.current,
124
- note: S
124
+ note: z
125
125
  });
126
126
  if (!d.ok) {
127
127
  f({
@@ -132,7 +132,7 @@ function we({ sid: n, onClose: s }) {
132
132
  }
133
133
  f({ kind: "sending" });
134
134
  try {
135
- const l = await H(`/api/sessions/${n}/send`, {
135
+ const l = await W(`/api/sessions/${n}/send`, {
136
136
  method: "POST",
137
137
  headers: { "Content-Type": "application/json" },
138
138
  // Queued rather than steered: the agent finishes its current turn and
@@ -150,7 +150,7 @@ function we({ sid: n, onClose: s }) {
150
150
  } catch (l) {
151
151
  f({ kind: "error", message: l instanceof Error ? l.message : String(l) });
152
152
  }
153
- }, [n, a, g, S]), Q = !!g && V === "file", B = p.kind === "sent" || p.kind === "error" ? "banner" : u ? "editor" : "content", Z = /* @__PURE__ */ e(
153
+ }, [n, a, g, z]), Q = !!g && V === "file", B = p.kind === "sent" || p.kind === "error" ? "banner" : u ? "editor" : "content", Z = /* @__PURE__ */ e(
154
154
  "div",
155
155
  {
156
156
  role: "dialog",
@@ -193,7 +193,7 @@ function we({ sid: n, onClose: s }) {
193
193
  onClick: s,
194
194
  "aria-label": "Close files",
195
195
  className: "flex size-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground md:size-auto md:p-1.5",
196
- children: /* @__PURE__ */ e(U, { className: "size-5 md:size-4" })
196
+ children: /* @__PURE__ */ e(I, { className: "size-5 md:size-4" })
197
197
  }
198
198
  )
199
199
  ] }),
@@ -203,7 +203,7 @@ function we({ sid: n, onClose: s }) {
203
203
  /* @__PURE__ */ e("div", { className: "min-h-0 flex-1 overflow-hidden pb-[var(--lfg-safe-bottom,0px)] md:pb-0", children: k ? /* @__PURE__ */ i("div", { className: "px-3 py-2 text-[12px] text-[var(--destructive)]", children: [
204
204
  "Could not list files: ",
205
205
  k
206
- ] }) : t ? /* @__PURE__ */ e(I, { fallback: /* @__PURE__ */ e(N, { label: "Loading tree…" }), children: /* @__PURE__ */ e(
206
+ ] }) : t ? /* @__PURE__ */ e(U, { fallback: /* @__PURE__ */ e(N, { label: "Loading tree…" }), children: /* @__PURE__ */ e(
207
207
  ge,
208
208
  {
209
209
  paths: t.paths,
@@ -258,7 +258,7 @@ function we({ sid: n, onClose: s }) {
258
258
  onClick: s,
259
259
  "aria-label": "Close files",
260
260
  className: "flex size-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-muted hover:text-foreground md:hidden",
261
- children: /* @__PURE__ */ e(U, { className: "size-5" })
261
+ children: /* @__PURE__ */ e(I, { className: "size-5" })
262
262
  }
263
263
  )
264
264
  ] }),
@@ -273,7 +273,7 @@ function we({ sid: n, onClose: s }) {
273
273
  R ? /* @__PURE__ */ i("div", { className: "px-3 py-2 text-[12px] text-[var(--destructive)]", children: [
274
274
  "Could not open: ",
275
275
  R
276
- ] }) : W || !a ? /* @__PURE__ */ e(N, { label: "Opening…" }) : a.binary ? /* @__PURE__ */ e("div", { className: "px-3 py-3 text-[12px] text-muted-foreground", children: "Binary file — not shown." }) : /* @__PURE__ */ e(I, { fallback: /* @__PURE__ */ e(N, { label: u ? "Loading editor…" : "Rendering…" }), children: u ? /* @__PURE__ */ e(ve, { file: Y ?? a, themeType: M, onChange: X }) : /* @__PURE__ */ e(be, { file: a, themeType: M }) }),
276
+ ] }) : J || !a ? /* @__PURE__ */ e(N, { label: "Opening…" }) : a.binary ? /* @__PURE__ */ e("div", { className: "px-3 py-3 text-[12px] text-muted-foreground", children: "Binary file — not shown." }) : /* @__PURE__ */ e(U, { fallback: /* @__PURE__ */ e(N, { label: u ? "Loading editor…" : "Rendering…" }), children: u ? /* @__PURE__ */ e(ve, { file: Y ?? a, themeType: M, onChange: X }) : /* @__PURE__ */ e(be, { file: a, themeType: M }) }),
277
277
  a != null && a.truncated ? /* @__PURE__ */ e("div", { className: "px-3 py-1.5 text-[11px] text-[var(--warning)]", children: "File truncated — only the first megabyte is shown." }) : null
278
278
  ]
279
279
  }
@@ -289,7 +289,7 @@ function we({ sid: n, onClose: s }) {
289
289
  /* @__PURE__ */ e(
290
290
  "textarea",
291
291
  {
292
- value: S,
292
+ value: z,
293
293
  onChange: (r) => A(r.target.value),
294
294
  rows: 2,
295
295
  placeholder: "Optional: anything else the agent should do alongside this edit",
@@ -306,7 +306,7 @@ function we({ sid: n, onClose: s }) {
306
306
  disabled: p.kind === "sending",
307
307
  className: "flex min-h-11 w-full shrink-0 items-center justify-center gap-1.5 rounded-lg bg-[var(--primary)] px-3 text-[13px] font-medium text-[var(--primary-foreground)] transition-opacity hover:opacity-90 disabled:opacity-60 md:min-h-0 md:w-auto md:py-1.5 md:text-[12px]",
308
308
  children: [
309
- p.kind === "sending" ? /* @__PURE__ */ e(J, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ e(le, { className: "size-3.5" }),
309
+ p.kind === "sending" ? /* @__PURE__ */ e(H, { className: "size-3.5 animate-spin" }) : /* @__PURE__ */ e(le, { className: "size-3.5" }),
310
310
  "Send to agent"
311
311
  ]
312
312
  }
@@ -1,6 +1,6 @@
1
1
  import { jsxs as r, jsx as k, Fragment as ZA } from "react/jsx-runtime";
2
2
  import { useState as L, useRef as S, useEffect as x, useCallback as Y } from "react";
3
- import { y as cA, n as wQ, X as DA, a7 as sQ, x as tQ, a8 as eQ, a9 as aQ, z as MQ, aa as hQ, R as NQ, C as cQ } from "./embedded-pRKgmVAd.js";
3
+ import { y as cA, n as wQ, X as DA, a8 as sQ, x as tQ, a9 as eQ, aa as aQ, a2 as MQ, ab as hQ, R as NQ, C as cQ } from "./embedded-cpSkU0tg.js";
4
4
  /**
5
5
  * @license lucide-react v0.577.0 - ISC
6
6
  *
Binary file
@@ -1,7 +1,7 @@
1
1
  import { jsx as ao } from "react/jsx-runtime";
2
2
  import { useRef as Dt, useCallback as Lt, useSyncExternalStore as ut, useEffect as so } from "react";
3
3
  import { g as io } from "./_commonjsHelpers-C6fGbg64.js";
4
- import { ab as uo } from "./embedded-pRKgmVAd.js";
4
+ import { ac as uo } from "./embedded-cpSkU0tg.js";
5
5
  var Ar = "vercel.ai.error", co = Symbol.for(Ar), Ut, Ft, se = class Nr extends (Ft = Error, Ut = co, Ft) {
6
6
  /**
7
7
  * Creates an AI SDK Error.
@@ -1,5 +1,5 @@
1
1
  import { jsxs as s, jsx as n, Fragment as E } from "react/jsx-runtime";
2
- import { R, B as d, L as w, m as $, n as S, o as A, p as h, T as L, q as j, s as G, u as H, v as I, w as M, x as U, X as W, K as X } from "./embedded-pRKgmVAd.js";
2
+ import { R, B as d, L as w, m as $, n as S, o as A, p as h, T as L, q as j, s as G, u as H, v as I, w as M, x as U, X as W, K as X } from "./embedded-cpSkU0tg.js";
3
3
  import { cn as B } from "cnfast";
4
4
  import { useState as T } from "react";
5
5
  function P(t) {