@omg-dev/app 0.6.38 → 0.6.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,61 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
- import { z as n } from "./embedded-CblBLBh9.js";
2
+ import { z as n } from "./embedded-crKLFtim.js";
3
3
  const t = `# Changelog
4
4
 
5
5
  Recent product updates and deployment notes.
6
6
 
7
+ ## September 4, 2026 - Auto agent reports and a clearer schedule editor (v0.6.40)
8
+
9
+ - **One row per auto agent in the Auto section.** Findings from the same
10
+ agent no longer stack as separate rows. The row shows the agent, a count
11
+ pill, the worst open finding, and a severity dot in the unread-dot slot.
12
+ - **Agent report sheet.** Tap a row to open the agent's report. It lists the
13
+ open findings worst first, with the last sighting and how many runs repeated
14
+ each one. Tap a finding to read it and act on it in place. Dismiss all or
15
+ edit the schedule from the footer.
16
+ - **Full-height sheets on mobile.** The finding sheet, the report sheet and the
17
+ schedule editor are full pages on a phone. The composer no longer hides
18
+ behind the keyboard.
19
+ - **Schedules list rows are two lines.** The name gets the full width. The
20
+ "N open" pill opens the agent's report.
21
+ - **Schedule editor redesign.** The prompt comes first. Schedule, repo, agent
22
+ and enabled sit in one grouped card. The schedule picker has labelled rows.
23
+ Save and Run now stay pinned at the bottom.
24
+ - **Meta Muse Code is available as a coding agent.**
25
+ - **Agents can show any file with \`omg_display_file\`.**
26
+ - **Mobile app:** findings are rows like the web live list, and the app gains a
27
+ user filter, a Pages menu and a Schedules screen.
28
+
29
+ ## September 4, 2026 - Banked Codex resets in Usage (v0.6.39)
30
+
31
+ - **Usage shows every banked Codex reset.** The Codex row now gives the
32
+ authoritative available count, each returned expiry date and grant date, and
33
+ says when Codex returned a count without all detail rows.
34
+ - **A selected reset can be used from Usage.** Each available credit has a
35
+ \`Use reset\` button, followed by an explicit confirmation because redemption
36
+ immediately resets the current Codex limit and cannot be undone.
37
+ - **The remaining stock is hard to miss.** A prominent counter says exactly
38
+ how many resets are still available before any action is taken.
39
+ - **Codex usage is current when the local app server is available.** Older
40
+ Codex installs still fall back to the last session snapshot for the normal
41
+ usage windows.
42
+ ## September 4, 2026 - Native integrations and per-role tool access (v0.6.39)
43
+
44
+ - **Connect integrations natively.** The Integrations panel lists your
45
+ connectors with their logos. It uses the integrations.sh catalog. The old
46
+ embedded iframe is gone.
47
+ - **OAuth connect for a connector.** You authorize a connector in a popup. omg
48
+ owns the callback and stores the tokens encrypted on the box. The flow
49
+ completes over remote access.
50
+ - **Add a custom MCP or OpenAPI source.** The custom source form is collapsed
51
+ behind a button so the panel stays clean.
52
+ - **Per-member and per-role tool access.** Each member gets connectors scoped to
53
+ the member. A role controls which tools a session can use.
54
+ - **Approve connector calls from chat.** A restricted role must get approval in
55
+ the chat before a connector tool runs.
56
+ - **Sandbox for restricted roles.** A restricted-role session runs with a
57
+ bubblewrap filesystem sandbox and a per-role network egress allowlist.
58
+
7
59
  ## September 3, 2026 - Board in the desktop workspace (v0.6.38)
8
60
 
9
61
  - **The Board sits in the desktop workspace.** On a wide screen the session
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as s, Fragment as te } from "react/jsx-runtime";
2
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 { f as oe, a4 as W, a5 as se, X as I, a6 as ie, a7 as ae, L as H, a8 as le, y as de, C as ce, a9 as L } from "./embedded-CblBLBh9.js";
5
+ import { f as oe, a5 as W, a6 as se, X as I, a7 as ae, a8 as ie, L as H, a9 as le, y as de, C as ce, aa as L } from "./embedded-crKLFtim.js";
6
6
  import { c as me } from "./create-CBk9uwJH.js";
7
7
  /**
8
8
  * @license lucide-react v0.577.0 - ISC
@@ -15,13 +15,13 @@ const ue = [
15
15
  ["path", { d: "M12 3v14", key: "7cf3v8" }],
16
16
  ["path", { d: "M5 21h14", key: "11awu3" }]
17
17
  ], pe = oe("arrow-up-from-line", ue), fe = 6e4;
18
- function he({ displayPath: n, original: o, edited: i, note: c }) {
19
- if (o === i) return { ok: !1, reason: "unchanged" };
20
- const t = me(n, o, i, void 0, void 0, { context: 3 });
18
+ function he({ displayPath: n, original: o, edited: a, note: c }) {
19
+ if (o === a) return { ok: !1, reason: "unchanged" };
20
+ const t = me(n, o, a, void 0, void 0, { context: 3 });
21
21
  return t.length > fe ? { ok: !1, reason: "too-large" } : { ok: !0, patch: t, message: xe(n, t, c) };
22
22
  }
23
- function xe(n, o, i) {
24
- const c = i?.trim(), t = [
23
+ function xe(n, o, a) {
24
+ const c = a?.trim(), t = [
25
25
  `I edited \`${n}\` in the file viewer. Apply this patch to the file exactly as written — do not reformat it, improve it, or make any other change:`,
26
26
  "",
27
27
  "```diff",
@@ -33,14 +33,14 @@ function xe(n, o, i) {
33
33
  }
34
34
  const ge = L("session-file-tree", () => import("./FileTreePane-J8P-OiHb.js")), be = L("session-file-viewer", () => import("./FileViewer-rlK_MPcS.js")), ve = L("session-file-editor", () => import("./FileEditor-Cd_j2Pn3.js"));
35
35
  async function _(n) {
36
- const o = await W(n), i = await o.json().catch(() => ({}));
37
- if (!o.ok) throw new Error(i?.error || `${o.status}`);
38
- return i;
36
+ const o = await W(n), a = await o.json().catch(() => ({}));
37
+ if (!o.ok) throw new Error(a?.error || `${o.status}`);
38
+ return a;
39
39
  }
40
40
  function ye() {
41
- const n = () => typeof document < "u" && document.documentElement.classList.contains("dark") ? "dark" : "light", [o, i] = m(n);
41
+ const n = () => typeof document < "u" && document.documentElement.classList.contains("dark") ? "dark" : "light", [o, a] = m(n);
42
42
  return C(() => {
43
- const c = new MutationObserver(() => i(n()));
43
+ const c = new MutationObserver(() => a(n()));
44
44
  return c.observe(document.documentElement, { attributes: !0, attributeFilter: ["class"] }), () => c.disconnect();
45
45
  }, []), o;
46
46
  }
@@ -50,7 +50,7 @@ const N = ({ label: n }) => /* @__PURE__ */ s("div", { className: "flex items-ce
50
50
  n
51
51
  ] });
52
52
  function ke({ tree: n, onNavigate: o }) {
53
- const i = T(null), c = q(() => {
53
+ const a = T(null), c = q(() => {
54
54
  const t = n.root.split("/").filter(Boolean);
55
55
  return t.map((h, k) => {
56
56
  const x = "/" + t.slice(0, k + 1).join("/");
@@ -58,12 +58,12 @@ function ke({ tree: n, onNavigate: o }) {
58
58
  });
59
59
  }, [n.root, n.ceiling]);
60
60
  return C(() => {
61
- const t = i.current;
61
+ const t = a.current;
62
62
  t && (t.scrollLeft = t.scrollWidth);
63
63
  }, [c]), /* @__PURE__ */ e(
64
64
  "nav",
65
65
  {
66
- ref: i,
66
+ ref: a,
67
67
  className: "flex min-w-0 items-center gap-0.5 overflow-x-auto whitespace-nowrap font-mono text-[11px] text-muted-foreground [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
68
68
  children: c.map((t, h) => /* @__PURE__ */ s("span", { className: "flex shrink-0 items-center gap-0.5", children: [
69
69
  h > 0 ? /* @__PURE__ */ e(ce, { className: "size-3 opacity-50" }) : null,
@@ -81,18 +81,18 @@ function ke({ tree: n, onNavigate: o }) {
81
81
  );
82
82
  }
83
83
  function we({ sid: n, onClose: o }) {
84
- const [i, c] = m(null), [t, h] = m(null), [k, x] = m(null), [g, j] = m(null), [l, 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) => {
84
+ const [a, c] = m(null), [t, h] = m(null), [k, x] = m(null), [g, j] = m(null), [l, 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(() => {
88
88
  let r = !0;
89
89
  h(null), x(null);
90
- const d = i ? `?root=${encodeURIComponent(i)}` : "";
91
- return _(`/api/sessions/${n}/tree${d}`).then((a) => r && h(a.tree)).catch((a) => r && x(a instanceof Error ? a.message : String(a))), () => {
90
+ const d = a ? `?root=${encodeURIComponent(a)}` : "";
91
+ return _(`/api/sessions/${n}/tree${d}`).then((i) => r && h(i.tree)).catch((i) => r && x(i instanceof Error ? i.message : String(i))), () => {
92
92
  r = !1;
93
93
  };
94
- }, [n, i]), C(() => {
95
- const r = (a) => a.key === "Escape" && o();
94
+ }, [n, a]), C(() => {
95
+ const r = (i) => i.key === "Escape" && o();
96
96
  window.addEventListener("keydown", r);
97
97
  const d = document.body.style.overflow;
98
98
  return document.body.style.overflow = "hidden", () => {
@@ -132,23 +132,23 @@ function we({ sid: n, onClose: o }) {
132
132
  }
133
133
  f({ kind: "sending" });
134
134
  try {
135
- const a = await W(`/api/sessions/${n}/send`, {
135
+ const i = 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
139
139
  // then picks the edit up, instead of having its thought interrupted.
140
140
  body: JSON.stringify({ text: d.message, mode: "queue" })
141
- }), ee = await a.json().catch(() => ({}));
142
- if (!a.ok) {
141
+ }), ee = await i.json().catch(() => ({}));
142
+ if (!i.ok) {
143
143
  f({
144
144
  kind: "error",
145
- message: a.status === 409 ? "This session isn't running, so there's no agent to apply the edit. Resume it and try again." : ee.error || `Couldn't send (${a.status})`
145
+ message: i.status === 409 ? "This session isn't running, so there's no agent to apply the edit. Resume it and try again." : ee.error || `Couldn't send (${i.status})`
146
146
  });
147
147
  return;
148
148
  }
149
149
  f({ kind: "sent" }), w(!1);
150
- } catch (a) {
151
- f({ kind: "error", message: a instanceof Error ? a.message : String(a) });
150
+ } catch (i) {
151
+ f({ kind: "error", message: i instanceof Error ? i.message : String(i) });
152
152
  }
153
153
  }, [n, l, g, z]), Q = !!g && V === "file", B = p.kind === "sent" || p.kind === "error" ? "banner" : u ? "editor" : "content", Z = /* @__PURE__ */ e(
154
154
  "div",
@@ -229,7 +229,7 @@ function we({ sid: n, onClose: o }) {
229
229
  onClick: K,
230
230
  "aria-label": "Back to file tree",
231
231
  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",
232
- children: /* @__PURE__ */ e(ie, { className: "size-5" })
232
+ children: /* @__PURE__ */ e(ae, { className: "size-5" })
233
233
  }
234
234
  ),
235
235
  /* @__PURE__ */ e("span", { className: "min-w-0 flex-1 truncate font-mono text-[12px] text-foreground", children: g }),
@@ -245,7 +245,7 @@ function we({ sid: n, onClose: o }) {
245
245
  u ? "border-[var(--primary)]/40 bg-[var(--primary)]/10 text-foreground" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
246
246
  ),
247
247
  children: [
248
- /* @__PURE__ */ e(ae, { className: "size-3.5 md:size-3" }),
248
+ /* @__PURE__ */ e(ie, { className: "size-3.5 md:size-3" }),
249
249
  " ",
250
250
  u ? "Editing" : "Edit"
251
251
  ]
@@ -1,7 +1,7 @@
1
1
  import { jsxs as r, jsx as k, Fragment as vA } from "react/jsx-runtime";
2
2
  import { useState as L, useRef as R, useEffect as p, useCallback as q } from "react";
3
- import { f as UA, o as iQ, X as CA, aa as wQ, y as sQ, ab as tQ, ac as eQ, a4 as aQ, ad as MQ, R as hQ, C as NQ } from "./embedded-CblBLBh9.js";
4
- import { K as ZA } from "./keyboard-BI3LBFBT.js";
3
+ import { f as UA, o as iQ, X as CA, ab as wQ, y as sQ, ac as tQ, ad as eQ, a5 as aQ, ae as MQ, R as hQ, C as NQ } from "./embedded-crKLFtim.js";
4
+ import { K as ZA } from "./keyboard-DMPtynCa.js";
5
5
  /**
6
6
  * @license lucide-react v0.577.0 - ISC
7
7
  *
@@ -0,0 +1 @@
1
+ <svg height="1em" width="1em" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg"><title>Muse</title><rect width="180" height="180" rx="37" fill="#0866FF"/><path d="M44 118c0-27 10-49 26-49 12 0 20 12 28 27 8-15 16-27 28-27 16 0 26 22 26 49 0 10-4 16-11 16-8 0-12-7-15-15-5-13-10-30-18-30-6 0-11 11-17 24l-6 13c-4 7-8 8-13 8-8 0-11-7-11-16Z" fill="#fff"/><path d="M66 69c-16 0-26 22-26 49 0 9 3 16 11 16 5 0 9-1 13-8l6-13c6-13 11-24 17-24 8 0 13 17 18 30 3 8 7 15 15 15 7 0 11-6 11-16 0-27-10-49-26-49" stroke="#fff" stroke-width="8" stroke-linejoin="round"/></svg>
@@ -1,6 +1,6 @@
1
- import { jsx as i, jsxs as c } from "react/jsx-runtime";
1
+ import { jsx as i, jsxs as l } from "react/jsx-runtime";
2
2
  import { useState as x, useEffect as h, useMemo as b } from "react";
3
- import { f as y, F as N, O as k, Q as w, a3 as v, L as I, m as A, k as _ } from "./embedded-CblBLBh9.js";
3
+ import { f as y, F as N, O as k, Q as w, a4 as v, L as I, m as A, k as _ } from "./embedded-crKLFtim.js";
4
4
  import { cn as g } from "cnfast";
5
5
  /**
6
6
  * @license lucide-react v0.577.0 - ISC
@@ -56,7 +56,7 @@ function M(t) {
56
56
  for (const e of t.sessions) {
57
57
  const n = e.sessionId;
58
58
  if (!n || e.botId) continue;
59
- const f = o.get(n), l = {
59
+ const f = o.get(n), c = {
60
60
  key: `session:${n}`,
61
61
  sessionId: n,
62
62
  title: B(e),
@@ -66,7 +66,7 @@ function M(t) {
66
66
  project: e.project,
67
67
  at: e.lastActivityAt ?? e.startedAt ?? 0
68
68
  };
69
- f ? (l.note = p(f.question), d.push(l)) : e.status === "blocked" ? (l.note = C(e), d.push(l)) : e.busy ? (e.last?.text && (l.note = p(e.last.text)), a.push(l)) : (e.last?.text && (l.note = p(e.last.text)), s.push(l));
69
+ f ? (c.note = p(f.question), d.push(c)) : e.status === "blocked" ? (c.note = C(e), d.push(c)) : e.busy ? (e.last?.text && (c.note = p(e.last.text)), a.push(c)) : (e.last?.text && (c.note = p(e.last.text)), s.push(c));
70
70
  }
71
71
  const r = t.posts.map((e) => ({
72
72
  key: `post:${e.id}`,
@@ -115,14 +115,14 @@ function S({
115
115
  card: t,
116
116
  onOpen: o
117
117
  }) {
118
- return /* @__PURE__ */ c(
118
+ return /* @__PURE__ */ l(
119
119
  "button",
120
120
  {
121
121
  type: "button",
122
122
  onClick: o,
123
123
  className: "flex w-full flex-col gap-1.5 rounded-xl border border-border bg-card px-3 py-2.5 text-left shadow-xs transition-colors hover:bg-foreground/[0.03] active:bg-foreground/[0.06]",
124
124
  children: [
125
- /* @__PURE__ */ c("div", { className: "flex items-start gap-2", children: [
125
+ /* @__PURE__ */ l("div", { className: "flex items-start gap-2", children: [
126
126
  /* @__PURE__ */ i(
127
127
  A,
128
128
  {
@@ -134,7 +134,7 @@ function S({
134
134
  /* @__PURE__ */ i("span", { className: "line-clamp-2 min-w-0 flex-1 text-sm font-medium leading-snug", children: t.title })
135
135
  ] }),
136
136
  t.note ? /* @__PURE__ */ i("p", { className: "line-clamp-2 text-xs leading-snug text-muted-foreground", children: t.note }) : null,
137
- /* @__PURE__ */ c("div", { className: "flex items-center gap-2 text-[11px] text-muted-foreground/80", children: [
137
+ /* @__PURE__ */ l("div", { className: "flex items-center gap-2 text-[11px] text-muted-foreground/80", children: [
138
138
  t.project ? /* @__PURE__ */ i("span", { className: "truncate", children: t.project }) : null,
139
139
  /* @__PURE__ */ i("span", { className: "ml-auto shrink-0", children: _(t.at || null) })
140
140
  ] })
@@ -148,25 +148,25 @@ function O({
148
148
  onOpenShipped: d
149
149
  }) {
150
150
  const a = t.reduce((s, r) => s + r.cards.length, 0);
151
- return /* @__PURE__ */ c("div", { className: "flex h-full min-h-0 flex-col gap-3 px-3 pb-4 md:px-4", children: [
152
- /* @__PURE__ */ c("div", { className: "flex items-baseline justify-between gap-3", children: [
151
+ return /* @__PURE__ */ l("div", { className: "flex h-full min-h-0 flex-col gap-3 px-3 pb-4 md:px-4", children: [
152
+ /* @__PURE__ */ l("div", { className: "flex items-baseline justify-between gap-3", children: [
153
153
  /* @__PURE__ */ i("h1", { className: "text-base font-semibold tracking-tight", children: "Board" }),
154
- /* @__PURE__ */ c("span", { className: "text-xs text-muted-foreground", children: [
154
+ /* @__PURE__ */ l("span", { className: "text-xs text-muted-foreground", children: [
155
155
  a,
156
156
  " ",
157
157
  a === 1 ? "card" : "cards",
158
158
  " · read only"
159
159
  ] })
160
160
  ] }),
161
- /* @__PURE__ */ i("div", { className: "flex min-h-0 flex-1 flex-col gap-3 overflow-y-auto pb-2 md:flex-row md:overflow-x-auto md:overflow-y-hidden", children: t.map((s) => {
161
+ /* @__PURE__ */ i("div", { className: "flex min-h-0 flex-1 flex-row snap-x snap-mandatory gap-3 overflow-x-auto overflow-y-hidden pb-2 md:snap-none", children: t.map((s) => {
162
162
  const r = q[s.id], e = r.icon;
163
- return /* @__PURE__ */ c(
163
+ return /* @__PURE__ */ l(
164
164
  "section",
165
165
  {
166
166
  "aria-label": s.label,
167
- className: "flex w-full shrink-0 flex-col rounded-2xl bg-muted/40 ring-1 ring-inset ring-border/60 md:w-72 md:min-h-0",
167
+ className: "flex min-h-0 w-[82vw] max-w-72 shrink-0 snap-start flex-col rounded-2xl bg-muted/40 ring-1 ring-inset ring-border/60 md:w-72",
168
168
  children: [
169
- /* @__PURE__ */ c("header", { className: "flex items-center gap-2 px-3 pt-3 pb-2", children: [
169
+ /* @__PURE__ */ l("header", { className: "flex items-center gap-2 px-3 pt-3 pb-2", children: [
170
170
  /* @__PURE__ */ i(
171
171
  e,
172
172
  {
@@ -189,7 +189,7 @@ function O({
189
189
  }
190
190
  )
191
191
  ] }),
192
- /* @__PURE__ */ i("div", { className: "flex flex-col gap-2 px-2 pb-2 md:min-h-0 md:flex-1 md:overflow-y-auto", children: s.cards.length === 0 ? /* @__PURE__ */ i("p", { className: "px-1 py-6 text-center text-xs text-muted-foreground", children: r.empty }) : s.cards.map((n) => /* @__PURE__ */ i(
192
+ /* @__PURE__ */ i("div", { className: "flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto px-2 pb-2", children: s.cards.length === 0 ? /* @__PURE__ */ i("p", { className: "px-1 py-6 text-center text-xs text-muted-foreground", children: r.empty }) : s.cards.map((n) => /* @__PURE__ */ i(
193
193
  S,
194
194
  {
195
195
  card: n,
@@ -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 { ae as uo } from "./embedded-CblBLBh9.js";
4
+ import { af as uo } from "./embedded-crKLFtim.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 e, Fragment as O } from "react/jsx-runtime";
2
- import { R, B as u, L as $, n as A, o as S, M as G, p as j, q as E, s as f, T as P, u as D, v as W, w as T, x as X, y as J, X as Q, K as V } from "./embedded-CblBLBh9.js";
2
+ import { R, B as u, L as $, n as A, o as S, M as G, p as j, q as E, s as f, T as P, u as D, v as W, w as T, x as X, y as J, X as Q, K as V } from "./embedded-crKLFtim.js";
3
3
  import { cn as U } from "cnfast";
4
4
  import { useState as I } from "react";
5
5
  function B(l) {
@@ -1,7 +1,7 @@
1
1
  import { jsxs as pe, jsx as J, Fragment as zt } from "react/jsx-runtime";
2
2
  import { useState as Ve, useRef as Qe, useCallback as ve, useEffect as Le } from "react";
3
- import { f as Fn, a4 as Ai, ac as Mn, B as Ge, R as Tn, X as Qn, L as Xi, af as Ln } from "./embedded-CblBLBh9.js";
4
- import { K as Rn } from "./keyboard-BI3LBFBT.js";
3
+ import { f as Fn, a5 as Ai, ad as Mn, B as Ge, R as Tn, X as Qn, L as Xi, ag as Ln } from "./embedded-crKLFtim.js";
4
+ import { K as Rn } from "./keyboard-DMPtynCa.js";
5
5
  /**
6
6
  * @license lucide-react v0.577.0 - ISC
7
7
  *