@omg-dev/app 0.2.19 → 0.2.22

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,101 @@
1
1
  import { jsx as e } from "react/jsx-runtime";
2
- import { M as n } from "./embedded-BIt88EBO.js";
2
+ import { M as n } from "./embedded-Dg1UH3AQ.js";
3
3
  const t = `# Changelog
4
4
 
5
5
  Recent product updates and deployment notes.
6
6
 
7
+ ## August 21, 2026 - One \`omg\` for computer setup and create / deploy (v0.2.22)
8
+
9
+ - **\`@omg-dev/cli\` 0.5.1 keeps one public \`omg\` binary.** \`0.5.0\` rejected
10
+ \`create\` / \`deploy\` / \`login\` after it replaced the vibes 0.4.42 line.
11
+ \`@omg-dev/apps\` was never published, so a fresh \`npm i -g @omg-dev/cli\`
12
+ lost those verbs. This version starts the hosted app flow again on the
13
+ same command.
14
+ - **\`omg computer setup\` is still the local control plane.** It still
15
+ installs this repository's runtime and still opens
16
+ http://localhost:8766. You still bring your own agent accounts. omg.dev
17
+ does not resell tokens.
18
+ - **\`omg create\`, \`omg deploy\`, and \`omg login\` start the last published
19
+ hosted app CLI (\`@omg-dev/cli@0.4.42\`).** The user does not type a second
20
+ command. A maintainer can point \`OMG_APPS_BIN\` at another runner, or put
21
+ \`omg-apps\` on PATH after \`@omg-dev/apps\` is published.
22
+ - **The published \`@omg-dev\` package tarballs match the release tag again.**
23
+ \`v0.2.21\` attached tarballs that were stamped \`0.2.20\`, because that
24
+ release was built from a branch whose version was not bumped. A host that
25
+ pins \`omg-dev-app-<tag>.tgz\` could not install from it. This release ships
26
+ \`0.2.22\` tarballs under the \`v0.2.22\` tag. The runtime code is the same as
27
+ \`v0.2.21\`.
28
+
29
+ ## August 20, 2026 - jcode Claude and Codex login in the UI
30
+
31
+ - **jcode Claude and Codex sign-in now uses the same in-app login as the
32
+ other providers.** The jcode row in Settings lists Claude and Codex.
33
+ Connect opens the existing browser login dialog. It does not send you to
34
+ a terminal-only \`jcode login\` picker.
35
+ - **The real Codex flag is \`--provider openai\`.** There is no
36
+ \`--provider codex\`. Claude is \`jcode login --provider claude\`. The UI
37
+ starts those with \`--print-auth-url --json\`, then finishes with
38
+ \`--auth-code\` or \`--callback-url\`. After that, a jcode session can run
39
+ with the signed-in provider, the same way other signed-in harnesses do.
40
+ - omg.dev still drives the jcode CLI you already own. It does not resell
41
+ tokens.
42
+ - **When jcode is not installed, Connect starts setup instead of the login
43
+ dialog.** The jcode row shows only the missing CLI check. Helper text is
44
+ "Connect Claude or Codex above." The dialog title says Claude or Codex
45
+ once the CLI is present.
46
+
47
+ ## August 20, 2026 - Coding agent toggles follow readiness
48
+
49
+ - **A coding agent is on only when it can run.** The Settings list used to
50
+ default every toggle on, even when the CLI was missing or no account was
51
+ connected. A fresh box now shows those agents off, with one word:
52
+ Install or Connect. A ready agent stays on. An agent you turned off stays
53
+ off.
54
+ - Turning an unready agent on no longer enables it. The row opens to the
55
+ missing action instead.
56
+ - The expanded row no longer repeats the failure, dumps install commands, or
57
+ labels OMG tools. Provider Connect rows and a single Install or Login
58
+ control stay.
59
+
60
+ ## August 20, 2026 - Move an existing schedule onto a bot
61
+
62
+ - **An auto agent could not be handed to a bot.** A bot-owned routine could
63
+ only be created by the bot itself, from scratch. Moving one of the existing
64
+ schedules to a bot meant retyping its whole prompt and losing its id, run
65
+ history and findings. You can now reassign an existing schedule in place:
66
+ \`lfg agents auto assign <id> --bot <botId>\`, and \`--user\` moves it back to
67
+ the headless runner.
68
+ - \`lfg agents auto list\` and \`show\` now name each schedule's owner. A
69
+ bot-owned routine produces no findings, because its results go to that
70
+ bot's conversation instead, so this is the difference between quiet
71
+ because healthy and quiet because nobody is watching the right surface.
72
+ - The per-bot routine cap, the frequency ceiling, and the check that the
73
+ target bot exists and is enabled now apply to any schedule that ends up
74
+ bot-owned, not only to ones a bot created. Re-saving a routine the bot
75
+ already owns no longer trips its own cap.
76
+ - Documented which of the existing auto agents can move to which existing
77
+ bot, and which should stay headless, in
78
+ \`docs/bot-owned-automations-plan.md\`.
79
+
80
+ ## August 20, 2026 - A new account saw no onboarding steps at all (v0.2.20)
81
+
82
+ - **A brand new hosted account landed on an empty home screen.** After
83
+ finishing (or skipping) the connect screens, there was nothing on the page
84
+ that said what the Computer could do: no steps, no suggestions, only "No
85
+ running sessions". The first-run steps existed on the server the whole
86
+ time, but no screen ever showed them. There is now a "Getting started"
87
+ panel on the home screen with the remaining steps. It can be dismissed, it
88
+ stays dismissed on every device, and Settings > Setup guide replays it.
89
+ - Each step completes on its own when you do the thing, so the panel never
90
+ asks you to start a first session while you are looking at one.
91
+ - **A shared persistent-bot conversation's header showed a human avatar and
92
+ name chip** next to the bot's own identity, reading as who created or owns
93
+ the bot. The header now shows only the bot's identity and settings.
94
+ - **Messages from other people in a shared bot conversation now show whose
95
+ they are.** A verified message from someone other than you shows their
96
+ avatar and name beside it, like a group chat inside the bot conversation.
97
+ Your own messages and the bot's replies look exactly as they did before.
98
+
7
99
  ## August 20, 2026 - Opening a bot from the roster could show the wrong chat surface (v0.2.19)
8
100
 
9
101
  - **Selecting a persistent bot on the desktop layout could render a plain
@@ -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-BIt88EBO.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-Dg1UH3AQ.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-BIt88EBO.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-Dg1UH3AQ.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-BIt88EBO.js";
4
+ import { ab as uo } from "./embedded-Dg1UH3AQ.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-Dg1UH3AQ.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
+ };