@omg-dev/app 0.2.20 → 0.2.23

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,92 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
- import { M as n } from "./embedded-fYVkvd7A.js";
2
+ import { M as n } from "./embedded-pRKgmVAd.js";
3
3
  const t = `# Changelog
4
4
 
5
5
  Recent product updates and deployment notes.
6
6
 
7
+ ## August 22, 2026 - Add to home screen closes the first run (v0.2.23)
8
+
9
+ - **First-run setup now ends with an optional "Add omg to your home screen"
10
+ page.** It comes after agent connection and the value pitch, never before
11
+ them. On iPhone and Mac Safari it opens the step-by-step install sheet; on
12
+ Chrome and Android it fires the browser's real install prompt.
13
+ - **The page can never block anyone.** "Open my Computer" sits directly under
14
+ the install button, and the page only joins the flow on browsers that can
15
+ actually install. Everyone else sees the same flow as before.
16
+
17
+ ## August 21, 2026 - One \`omg\` for computer setup and create / deploy (v0.2.22)
18
+
19
+ - **\`@omg-dev/cli\` 0.5.1 keeps one public \`omg\` binary.** \`0.5.0\` rejected
20
+ \`create\` / \`deploy\` / \`login\` after it replaced the vibes 0.4.42 line.
21
+ \`@omg-dev/apps\` was never published, so a fresh \`npm i -g @omg-dev/cli\`
22
+ lost those verbs. This version starts the hosted app flow again on the
23
+ same command.
24
+ - **\`omg computer setup\` is still the local control plane.** It still
25
+ installs this repository's runtime and still opens
26
+ http://localhost:8766. You still bring your own agent accounts. omg.dev
27
+ does not resell tokens.
28
+ - **\`omg create\`, \`omg deploy\`, and \`omg login\` start the last published
29
+ hosted app CLI (\`@omg-dev/cli@0.4.42\`).** The user does not type a second
30
+ command. A maintainer can point \`OMG_APPS_BIN\` at another runner, or put
31
+ \`omg-apps\` on PATH after \`@omg-dev/apps\` is published.
32
+ - **The published \`@omg-dev\` package tarballs match the release tag again.**
33
+ \`v0.2.21\` attached tarballs that were stamped \`0.2.20\`, because that
34
+ release was built from a branch whose version was not bumped. A host that
35
+ pins \`omg-dev-app-<tag>.tgz\` could not install from it. This release ships
36
+ \`0.2.22\` tarballs under the \`v0.2.22\` tag. The runtime code is the same as
37
+ \`v0.2.21\`.
38
+
39
+ ## August 20, 2026 - jcode Claude and Codex login in the UI
40
+
41
+ - **jcode Claude and Codex sign-in now uses the same in-app login as the
42
+ other providers.** The jcode row in Settings lists Claude and Codex.
43
+ Connect opens the existing browser login dialog. It does not send you to
44
+ a terminal-only \`jcode login\` picker.
45
+ - **The real Codex flag is \`--provider openai\`.** There is no
46
+ \`--provider codex\`. Claude is \`jcode login --provider claude\`. The UI
47
+ starts those with \`--print-auth-url --json\`, then finishes with
48
+ \`--auth-code\` or \`--callback-url\`. After that, a jcode session can run
49
+ with the signed-in provider, the same way other signed-in harnesses do.
50
+ - omg.dev still drives the jcode CLI you already own. It does not resell
51
+ tokens.
52
+ - **When jcode is not installed, Connect starts setup instead of the login
53
+ dialog.** The jcode row shows only the missing CLI check. Helper text is
54
+ "Connect Claude or Codex above." The dialog title says Claude or Codex
55
+ once the CLI is present.
56
+
57
+ ## August 20, 2026 - Coding agent toggles follow readiness
58
+
59
+ - **A coding agent is on only when it can run.** The Settings list used to
60
+ default every toggle on, even when the CLI was missing or no account was
61
+ connected. A fresh box now shows those agents off, with one word:
62
+ Install or Connect. A ready agent stays on. An agent you turned off stays
63
+ off.
64
+ - Turning an unready agent on no longer enables it. The row opens to the
65
+ missing action instead.
66
+ - The expanded row no longer repeats the failure, dumps install commands, or
67
+ labels OMG tools. Provider Connect rows and a single Install or Login
68
+ control stay.
69
+
70
+ ## August 20, 2026 - Move an existing schedule onto a bot
71
+
72
+ - **An auto agent could not be handed to a bot.** A bot-owned routine could
73
+ only be created by the bot itself, from scratch. Moving one of the existing
74
+ schedules to a bot meant retyping its whole prompt and losing its id, run
75
+ history and findings. You can now reassign an existing schedule in place:
76
+ \`lfg agents auto assign <id> --bot <botId>\`, and \`--user\` moves it back to
77
+ the headless runner.
78
+ - \`lfg agents auto list\` and \`show\` now name each schedule's owner. A
79
+ bot-owned routine produces no findings, because its results go to that
80
+ bot's conversation instead, so this is the difference between quiet
81
+ because healthy and quiet because nobody is watching the right surface.
82
+ - The per-bot routine cap, the frequency ceiling, and the check that the
83
+ target bot exists and is enabled now apply to any schedule that ends up
84
+ bot-owned, not only to ones a bot created. Re-saving a routine the bot
85
+ already owns no longer trips its own cap.
86
+ - Documented which of the existing auto agents can move to which existing
87
+ bot, and which should stay headless, in
88
+ \`docs/bot-owned-automations-plan.md\`.
89
+
7
90
  ## August 20, 2026 - A new account saw no onboarding steps at all (v0.2.20)
8
91
 
9
92
  - **A brand new hosted account landed on an empty home screen.** After
@@ -2,7 +2,7 @@ import { jsx as e, jsxs as i, 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 I } 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, l as de, x as ce, J as L } from "./embedded-fYVkvd7A.js";
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";
6
6
  import { c as me } from "./create-BrnHvSDE.js";
7
7
  /**
8
8
  * @license lucide-react v0.577.0 - ISC
@@ -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, S as wQ, X as DA, a7 as sQ, l as tQ, a8 as eQ, a9 as aQ, z as MQ, aa as hQ, R as NQ, x as cQ } from "./embedded-fYVkvd7A.js";
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";
4
4
  /**
5
5
  * @license lucide-react v0.577.0 - ISC
6
6
  *
@@ -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-fYVkvd7A.js";
4
+ import { ab as uo } from "./embedded-pRKgmVAd.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.
@@ -0,0 +1,329 @@
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";
3
+ import { cn as B } from "cnfast";
4
+ import { useState as T } from "react";
5
+ function P(t) {
6
+ return /CLI$|runtime$/i.test(t);
7
+ }
8
+ function J(t) {
9
+ return t.some((l) => P(l.label) && !l.ok);
10
+ }
11
+ function Q(t) {
12
+ const l = t.filter((r) => !r.ok);
13
+ return l.length ? l.some((r) => P(r.label)) ? "Install" : "Connect" : null;
14
+ }
15
+ function V(t) {
16
+ const l = t.filter((r) => !r.ok);
17
+ return l.length ? l.length === 1 ? `${l[0].label} missing` : `${l.length} checks failing` : null;
18
+ }
19
+ function Y({ checks: t }) {
20
+ return /* @__PURE__ */ n("div", { className: "space-y-1", children: t.map((l) => /* @__PURE__ */ s(
21
+ "div",
22
+ {
23
+ className: "flex min-w-0 items-center gap-1.5 text-xs text-muted-foreground",
24
+ children: [
25
+ l.ok ? /* @__PURE__ */ n(U, { className: "size-3.5 shrink-0 text-success" }) : /* @__PURE__ */ n(W, { className: "size-3.5 shrink-0 text-destructive" }),
26
+ /* @__PURE__ */ n("span", { className: "shrink-0", children: l.label }),
27
+ l.detail ? /* @__PURE__ */ n("span", { className: "min-w-0 truncate text-muted-foreground/70", children: l.detail }) : null
28
+ ]
29
+ },
30
+ l.label
31
+ )) });
32
+ }
33
+ function D({
34
+ icon: t,
35
+ title: l,
36
+ note: r,
37
+ ok: m,
38
+ showDot: o = !0,
39
+ control: f,
40
+ open: u,
41
+ onToggle: b,
42
+ children: x
43
+ }) {
44
+ return /* @__PURE__ */ s("div", { className: "px-4 py-2.5", children: [
45
+ /* @__PURE__ */ s("div", { className: "flex items-center gap-3", children: [
46
+ /* @__PURE__ */ s(
47
+ "button",
48
+ {
49
+ type: "button",
50
+ onClick: b,
51
+ "aria-expanded": u,
52
+ className: "flex min-w-0 flex-1 items-center gap-3 text-left",
53
+ children: [
54
+ /* @__PURE__ */ n("span", { className: "flex size-8 shrink-0 items-center justify-center rounded-[8px] border border-border bg-background", children: t }),
55
+ /* @__PURE__ */ s("span", { className: "min-w-0 flex-1", children: [
56
+ /* @__PURE__ */ s("span", { className: "flex items-center gap-2", children: [
57
+ /* @__PURE__ */ n("span", { className: "truncate text-sm font-medium", children: l }),
58
+ o && !m ? /* @__PURE__ */ n("span", { className: "size-1.5 shrink-0 rounded-full bg-destructive", "aria-hidden": !0 }) : null
59
+ ] }),
60
+ r ? /* @__PURE__ */ n("span", { className: "block truncate text-xs text-muted-foreground", children: r }) : null
61
+ ] }),
62
+ /* @__PURE__ */ n(
63
+ M,
64
+ {
65
+ className: B(
66
+ "size-4 shrink-0 text-muted-foreground/60 transition-transform duration-150",
67
+ u && "rotate-180"
68
+ )
69
+ }
70
+ )
71
+ ]
72
+ }
73
+ ),
74
+ f
75
+ ] }),
76
+ u ? /* @__PURE__ */ n("div", { className: "mt-3 space-y-3 pl-11", children: x }) : null
77
+ ] });
78
+ }
79
+ function Z({
80
+ provider: t,
81
+ onConnect: l,
82
+ onDisconnect: r
83
+ }) {
84
+ return /* @__PURE__ */ s("div", { className: "flex items-center gap-2 rounded-xl border border-border/70 bg-background/55 px-2.5 py-2", children: [
85
+ /* @__PURE__ */ s("span", { className: "min-w-0 flex-1", children: [
86
+ /* @__PURE__ */ n("span", { className: "block truncate text-xs font-medium", children: t.label }),
87
+ t.detail || t.fromEnv ? /* @__PURE__ */ n("span", { className: "block truncate text-[11px] text-muted-foreground", children: t.detail ?? "From the environment" }) : null
88
+ ] }),
89
+ t.connected ? /* @__PURE__ */ s(E, { children: [
90
+ /* @__PURE__ */ n("span", { className: "text-[11px] text-success", children: "Connected" }),
91
+ t.fromEnv ? null : /* @__PURE__ */ n(
92
+ "button",
93
+ {
94
+ type: "button",
95
+ onClick: () => r(t),
96
+ title: `Disconnect ${t.label}`,
97
+ "aria-label": `Disconnect ${t.label}`,
98
+ className: "flex size-7 items-center justify-center rounded-full text-muted-foreground transition hover:bg-destructive/10 hover:text-destructive",
99
+ children: /* @__PURE__ */ n(L, { className: "size-3.5" })
100
+ }
101
+ )
102
+ ] }) : /* @__PURE__ */ s(d, { size: "sm", variant: "outline", onClick: () => l(t), children: [
103
+ t.method === "oauth" ? /* @__PURE__ */ n(h, { className: "size-3.5" }) : /* @__PURE__ */ n(X, { className: "size-3.5" }),
104
+ "Connect"
105
+ ] })
106
+ ] });
107
+ }
108
+ function le({
109
+ setupChecks: t,
110
+ agents: l,
111
+ onVisibleChange: r,
112
+ onSetup: m,
113
+ onLogin: o,
114
+ onAddClaudeAccount: f,
115
+ onRemoveClaudeAccount: u,
116
+ onConnectProvider: b,
117
+ onDisconnectProvider: x,
118
+ onSetupCheck: K,
119
+ onRefresh: O
120
+ }) {
121
+ const [g, N] = T(!1), [y, v] = T(null), z = (e) => v((a) => a === e ? null : e);
122
+ async function q() {
123
+ if (!g) {
124
+ N(!0);
125
+ try {
126
+ await O(), I.success("Coding agents refreshed");
127
+ } catch (e) {
128
+ I.error(e instanceof Error ? e.message : "Could not refresh coding agents");
129
+ } finally {
130
+ N(!1);
131
+ }
132
+ }
133
+ }
134
+ return /* @__PURE__ */ s("div", { className: "mx-auto max-w-xl space-y-3 pb-10", "data-lfg-page-column": !0, children: [
135
+ /* @__PURE__ */ s("div", { className: "flex items-center justify-between px-4", children: [
136
+ /* @__PURE__ */ n("h2", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: "Coding agents" }),
137
+ /* @__PURE__ */ s(
138
+ "button",
139
+ {
140
+ type: "button",
141
+ onClick: () => void q(),
142
+ disabled: g,
143
+ className: "flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground disabled:opacity-50",
144
+ children: [
145
+ /* @__PURE__ */ n(R, { className: B("size-3.5", g && "animate-spin") }),
146
+ "Refresh"
147
+ ]
148
+ }
149
+ )
150
+ ] }),
151
+ t.length ? /* @__PURE__ */ n("div", { className: "overflow-hidden rounded-2xl border border-border bg-card/40 divide-y divide-border", children: t.map((e) => /* @__PURE__ */ s(
152
+ D,
153
+ {
154
+ icon: /* @__PURE__ */ n(S, { className: "size-4 text-muted-foreground" }),
155
+ title: e.label,
156
+ note: V(e.checks),
157
+ ok: e.configured,
158
+ open: y === `setup:${e.key}`,
159
+ onToggle: () => z(`setup:${e.key}`),
160
+ children: [
161
+ /* @__PURE__ */ n(Y, { checks: e.checks }),
162
+ e.instructions.map((a) => /* @__PURE__ */ n("p", { className: "text-xs text-muted-foreground", children: a }, a)),
163
+ /* @__PURE__ */ s(
164
+ d,
165
+ {
166
+ size: "sm",
167
+ variant: "outline",
168
+ disabled: !e.canAutoSetup || e.running,
169
+ onClick: () => K(e.key),
170
+ title: e.canAutoSetup ? e.actionLabel : "Install a supported coding agent first",
171
+ children: [
172
+ e.running ? /* @__PURE__ */ n(w, { className: "size-4 animate-spin" }) : /* @__PURE__ */ n($, { className: "size-4" }),
173
+ e.running ? "Running…" : e.actionLabel
174
+ ]
175
+ }
176
+ )
177
+ ]
178
+ },
179
+ e.key
180
+ )) }) : null,
181
+ /* @__PURE__ */ n("div", { className: "overflow-hidden rounded-2xl border border-border bg-card/40 divide-y divide-border", children: l.map((e) => {
182
+ const a = e.status, c = e.key === "aisdk" ? a.accounts ?? [] : [], p = a.providers ?? [], F = c.some((i) => i.connected), _ = c.length > 0 || p.length > 0, C = J(a.checks);
183
+ return /* @__PURE__ */ s(
184
+ D,
185
+ {
186
+ icon: /* @__PURE__ */ n("img", { src: A(e.key), alt: H(e.key), className: "size-5" }),
187
+ title: e.label,
188
+ note: Q(a.checks),
189
+ ok: a.configured,
190
+ showDot: !1,
191
+ open: y === `agent:${e.key}`,
192
+ onToggle: () => z(`agent:${e.key}`),
193
+ control: /* @__PURE__ */ n(
194
+ G,
195
+ {
196
+ checked: e.visible,
197
+ onCheckedChange: (i) => {
198
+ if (i && !a.configured) {
199
+ v(`agent:${e.key}`);
200
+ return;
201
+ }
202
+ r(e.key, i);
203
+ },
204
+ "aria-label": `${e.label} visible in composer`
205
+ }
206
+ ),
207
+ children: [
208
+ c.length ? /* @__PURE__ */ n("div", { className: "space-y-1.5", children: c.map((i) => /* @__PURE__ */ s(
209
+ "div",
210
+ {
211
+ className: "flex items-center gap-2 rounded-xl border border-border/70 bg-background/55 px-2.5 py-2",
212
+ children: [
213
+ /* @__PURE__ */ s("span", { className: "relative flex size-7 shrink-0 items-center justify-center rounded-full bg-muted", children: [
214
+ /* @__PURE__ */ n("img", { src: A("aisdk"), alt: "", className: "size-4.5" }),
215
+ /* @__PURE__ */ n("span", { className: "absolute -bottom-0.5 -right-0.5 flex size-3.5 items-center justify-center rounded-full bg-foreground text-[8px] font-bold text-background ring-1 ring-background", children: i.number })
216
+ ] }),
217
+ /* @__PURE__ */ s("span", { className: "min-w-0 flex-1", children: [
218
+ /* @__PURE__ */ n("span", { className: "block truncate text-xs font-medium", children: i.label }),
219
+ i.needsReconnect ? /* @__PURE__ */ n("span", { className: "block truncate text-[11px] text-destructive", children: "Sign-in expired" }) : null
220
+ ] }),
221
+ i.connected ? /* @__PURE__ */ s(E, { children: [
222
+ /* @__PURE__ */ n("span", { className: "text-[11px] text-success", children: "Connected" }),
223
+ /* @__PURE__ */ n(
224
+ "button",
225
+ {
226
+ type: "button",
227
+ onClick: () => o(e.key, i.id),
228
+ title: `Sign in to ${i.label} again`,
229
+ "aria-label": `Sign in to ${i.label} again`,
230
+ className: "flex size-7 items-center justify-center rounded-full text-muted-foreground transition hover:bg-muted hover:text-foreground",
231
+ children: /* @__PURE__ */ n(R, { className: "size-3.5" })
232
+ }
233
+ )
234
+ ] }) : /* @__PURE__ */ s(
235
+ d,
236
+ {
237
+ size: "sm",
238
+ variant: "outline",
239
+ onClick: () => o(e.key, i.id),
240
+ children: [
241
+ /* @__PURE__ */ n(h, { className: "size-3.5" }),
242
+ i.needsReconnect ? "Reconnect" : "Connect"
243
+ ]
244
+ }
245
+ ),
246
+ i.removable ? /* @__PURE__ */ n(
247
+ "button",
248
+ {
249
+ type: "button",
250
+ onClick: () => u(i),
251
+ title: `Remove ${i.label}`,
252
+ "aria-label": `Remove ${i.label}`,
253
+ className: "flex size-7 items-center justify-center rounded-full text-muted-foreground transition hover:bg-destructive/10 hover:text-destructive",
254
+ children: /* @__PURE__ */ n(L, { className: "size-3.5" })
255
+ }
256
+ ) : null
257
+ ]
258
+ },
259
+ i.id
260
+ )) }) : null,
261
+ p.length ? /* @__PURE__ */ n("div", { className: "space-y-1.5", children: p.map((i) => /* @__PURE__ */ n(
262
+ Z,
263
+ {
264
+ provider: i,
265
+ onConnect: (k) => {
266
+ if (e.key === "jcode" && C) {
267
+ m(e.key);
268
+ return;
269
+ }
270
+ b(e.key, k);
271
+ },
272
+ onDisconnect: (k) => x(e.key, k)
273
+ },
274
+ i.id
275
+ )) }) : null,
276
+ /* @__PURE__ */ s("div", { className: "flex flex-wrap items-center gap-2", children: [
277
+ a.canAutoSetup && C ? /* @__PURE__ */ s(
278
+ d,
279
+ {
280
+ size: "sm",
281
+ variant: "outline",
282
+ disabled: a.setupRunning,
283
+ onClick: () => m(e.key),
284
+ title: "Run setup for this agent",
285
+ children: [
286
+ a.setupRunning ? /* @__PURE__ */ n(w, { className: "size-4 animate-spin" }) : /* @__PURE__ */ n($, { className: "size-4" }),
287
+ a.setupRunning ? "Running…" : "Install"
288
+ ]
289
+ }
290
+ ) : null,
291
+ c.length && F ? /* @__PURE__ */ s(
292
+ d,
293
+ {
294
+ size: "sm",
295
+ variant: "outline",
296
+ disabled: a.setupRunning,
297
+ onClick: () => f(),
298
+ title: "Add another Claude account",
299
+ children: [
300
+ /* @__PURE__ */ n(h, { className: "size-4" }),
301
+ "Add account"
302
+ ]
303
+ }
304
+ ) : null,
305
+ a.canLoginInTerminal && !_ ? /* @__PURE__ */ s(
306
+ d,
307
+ {
308
+ size: "sm",
309
+ variant: "outline",
310
+ disabled: a.setupRunning,
311
+ onClick: () => o(e.key),
312
+ title: e.key === "aisdk" && c.length ? "Add another Claude account" : j.has(e.key) ? `Sign in to ${e.label} in your browser` : `Open terminal and run ${a.loginCommand}`,
313
+ children: [
314
+ j.has(e.key) ? /* @__PURE__ */ n(h, { className: "size-4" }) : /* @__PURE__ */ n(S, { className: "size-4" }),
315
+ "Login"
316
+ ]
317
+ }
318
+ ) : null
319
+ ] })
320
+ ]
321
+ },
322
+ e.key
323
+ );
324
+ }) })
325
+ ] });
326
+ }
327
+ export {
328
+ le as default
329
+ };