@omg-dev/app 0.1.323 → 0.1.324

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,4 +1,4 @@
1
- import { R as c, L as f, A as d } from "./streamdown-response-BaisNaaU.js";
1
+ import { R as c, L as f, A as d } from "./streamdown-response-D8l09MFq.js";
2
2
  import { useContext as p, useState as L, useEffect as N } from "react";
3
3
  import { jsx as x } from "react/jsx-runtime";
4
4
  var A = ({ code: s, language: e, raw: a, className: o, startLine: m, lineNumbers: u, ...g }) => {
@@ -1,4 +1,4 @@
1
- import { w as T, s as U, h as X, c as Y, v as G, S as J, o as k, l as Q, f as M, m as y } from "./streamdown-response-BaisNaaU.js";
1
+ import { w as T, s as U, h as X, c as Y, v as G, S as J, o as k, l as Q, f as M, m as y } from "./streamdown-response-D8l09MFq.js";
2
2
  import v from "./katex-jHfnQmlp.js";
3
3
  function Z(t, e) {
4
4
  return B(t, {}) || { type: "root", children: [] };
@@ -25,6 +25,41 @@ export interface OmgErrorSink {
25
25
  appVersion?: string;
26
26
  }
27
27
 
28
+ /**
29
+ * Push notifications in an embedded surface.
30
+ *
31
+ * The machine encrypts each notice INTO the push (RFC 8291), so the worker that
32
+ * receives it needs no callback to the machine — which matters here, because
33
+ * the receiving worker belongs to the HOST's origin, where the machine's
34
+ * /api/push/pending does not exist.
35
+ *
36
+ * A host that wants notifications only has to render the decrypted message in
37
+ * its own service worker:
38
+ *
39
+ * self.addEventListener("push", (event) => {
40
+ * const n = event.data?.json();
41
+ * if (!n?.title) return;
42
+ * event.waitUntil(self.registration.showNotification(n.title, {
43
+ * body: n.body || "",
44
+ * tag: n.tag,
45
+ * requireInteraction: !!n.requireInteraction,
46
+ * data: { url: n.url },
47
+ * }));
48
+ * });
49
+ *
50
+ * `url` arrives absolute, resolved against the origin the device subscribed
51
+ * from. The host never sees the notification text — it is encrypted end to end
52
+ * between the machine and the device.
53
+ */
54
+ export interface OmgPushNotification {
55
+ title: string;
56
+ body?: string;
57
+ /** Absolute deep link into the surface the device subscribed from. */
58
+ url?: string;
59
+ tag?: string;
60
+ requireInteraction?: boolean;
61
+ }
62
+
28
63
  /** Presentation-only identity supplied by an embedding host. */
29
64
  export interface EmbeddedViewer {
30
65
  id: string;
package/dist-lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "react/jsx-runtime";
2
2
  import "react";
3
- import { ae as p, af as m, ag as o } from "./embedded-BgLSMF4E.js";
3
+ import { ae as p, af as m, ag as o } from "./embedded-BZxhC9Lo.js";
4
4
  export {
5
5
  p as OmgAppSurface,
6
6
  m as OmgSettingsSurface,
@@ -0,0 +1,4 @@
1
+ import { p } from "./streamdown-response-D8l09MFq.js";
2
+ export {
3
+ p as Mermaid
4
+ };
@@ -1,5 +1,5 @@
1
1
  import { jsx as t, jsxs as s, Fragment as N } from "react/jsx-runtime";
2
- import { r as H, n as Q, a as le, o as re, p as oe, q as ie, X, A, f as u, R as B, s as ce, u as de, v as J, T as ue, w as me, x as he, y as pe, L as fe } from "./embedded-BgLSMF4E.js";
2
+ import { r as H, n as Q, a as le, o as re, p as oe, q as ie, X, A, f as u, R as B, s as ce, u as de, v as J, T as ue, w as me, x as he, y as pe, L as fe } from "./embedded-BZxhC9Lo.js";
3
3
  import { useState as a, useRef as L, useEffect as v, useCallback as ge } from "react";
4
4
  function we({
5
5
  initial: m,
@@ -1,5 +1,5 @@
1
1
  import { jsx as s, jsxs as n, Fragment as $ } from "react/jsx-runtime";
2
- import { a as C, D as T, b as M, c as D, d as S, G as F, e as L, t as R, L as j, f as z } from "./embedded-BgLSMF4E.js";
2
+ import { a as C, D as T, b as M, c as D, d as S, G as F, e as L, t as R, L as j, f as z } from "./embedded-BZxhC9Lo.js";
3
3
  import { useState as g, useCallback as P, useEffect as U } from "react";
4
4
  function u({
5
5
  title: r,
@@ -1,6 +1,6 @@
1
1
  import { jsxs as l, jsx as r, Fragment as me } from "react/jsx-runtime";
2
2
  import { useState as f, useEffect as w, useRef as fe, useContext as $e, useMemo as ze } from "react";
3
- import { z as ve, O as he, Q as Te, U as S, V as ge, W as Se, Y as Pe, Z as je, B as Fe, L as pe, v as J, y as Ye, R as Ge, f as P, T as Be, _ as Ke, k as be, g as Ue, $ as He, a as L, a0 as k, a1 as R, l as _, a2 as W, a3 as Ve, a4 as qe, a5 as Qe, a6 as Xe, P as Je, a7 as We } from "./embedded-BgLSMF4E.js";
3
+ import { z as ve, O as he, Q as Te, U as S, V as ge, W as Se, Y as Pe, Z as je, B as Fe, L as pe, v as J, y as Ye, R as Ge, f as P, T as Be, _ as Ke, k as be, g as Ue, $ as He, a as L, a0 as k, a1 as R, l as _, a2 as W, a3 as Ve, a4 as qe, a5 as Qe, a6 as Xe, P as Je, a7 as We } from "./embedded-BZxhC9Lo.js";
4
4
  /**
5
5
  * @license lucide-react v0.577.0 - ISC
6
6
  *
@@ -3,7 +3,7 @@ var Od = (e, t, n) => t in e ? Rd(e, t, { enumerable: !0, configurable: !0, writ
3
3
  var le = (e, t, n) => Od(e, typeof t != "symbol" ? t + "" : t, n);
4
4
  import { jsx as y, jsxs as J, Fragment as _t } from "react/jsx-runtime";
5
5
  import { memo as he, useId as Dd, useTransition as Pd, useMemo as Ee, useRef as Re, useEffect as De, useState as ge, createElement as Xa, isValidElement as Vt, cloneElement as Md, useContext as Pe, createContext as Jt, useCallback as ze, Suspense as wi, lazy as Zu } from "react";
6
- import { ad as Ju, f as eo, a8 as vd, m as Bd, a9 as Fd } from "./embedded-BgLSMF4E.js";
6
+ import { ad as Ju, f as eo, a8 as vd, m as Bd, a9 as Fd } from "./embedded-BZxhC9Lo.js";
7
7
  import { createPortal as to } from "react-dom";
8
8
  import { f as Ur, p as Ka, e as Za, g as Ja, h as Jn, s as Mt, z as no, i as ro, j as io, k as Hd, l as es, w as Ud, b as zd, c as $d, m as jd, d as qd } from "./engine-compile-BeZvvx0I.js";
9
9
  import { g as ao } from "./_commonjsHelpers-C6fGbg64.js";
@@ -18959,7 +18959,7 @@ var yc = Jt(!1), kk = () => Pe(yc), Ua = (...e) => nc(Ju(e)), xk = (e, t) => {
18959
18959
  for (; t > 0 && e[t - 1] === `
18960
18960
  `; ) t--;
18961
18961
  return e.slice(0, t);
18962
- }, wk = Zu(() => import("./highlighted-body-OFNGDK62-DI8qFchC.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), Lk = ({ code: e, language: t, className: n, children: r, isIncomplete: i = !1, startLine: a, lineNumbers: s, ...u }) => {
18962
+ }, wk = Zu(() => import("./highlighted-body-OFNGDK62-e8XppaNF.js").then((e) => ({ default: e.HighlightedCodeBlockBody }))), Lk = ({ code: e, language: t, className: n, children: r, isIncomplete: i = !1, startLine: a, lineNumbers: s, ...u }) => {
18963
18963
  let o = ee(), l = Ee(() => Sk(e), [e]), d = Ee(() => ({ bg: "transparent", fg: "inherit", tokens: l.split(`
18964
18964
  `).map((f) => [{ content: f, color: "inherit", bgColor: "transparent", htmlStyle: {}, offset: 0 }]) }), [l]);
18965
18965
  return y(Cc.Provider, { value: { code: e }, children: J(Ik, { isIncomplete: i, language: t, children: [y(Nk, { language: t }), r ? y("div", { className: o("pointer-events-none sticky top-2 z-10 -mt-10 flex h-8 items-center justify-end"), children: y("div", { className: o("pointer-events-auto flex shrink-0 items-center gap-2 rounded-md border border-sidebar bg-sidebar/80 px-1.5 py-1 supports-[backdrop-filter]:bg-sidebar/70 supports-[backdrop-filter]:backdrop-blur"), "data-streamdown": "code-block-actions", children: r }) }) : null, y(wi, { fallback: y(Ck, { className: n, language: t, lineNumbers: s, result: d, startLine: a, ...u }), children: y(wk, { className: n, code: l, language: t, lineNumbers: s, raw: d, startLine: a, ...u }) })] }) });
@@ -19301,7 +19301,7 @@ var yc = Jt(!1), kk = () => Pe(yc), Ua = (...e) => nc(Ju(e)), xk = (e, t) => {
19301
19301
  }, Zk = ({ children: e, className: t, showControls: n, showCopy: r = !0, showDownload: i = !0, showFullscreen: a = !0, ...s }) => {
19302
19302
  let u = ee(), o = n && r, l = n && i, d = n && a, f = o || l || d;
19303
19303
  return J("div", { className: u("my-4 flex flex-col gap-2 rounded-lg border border-border bg-sidebar p-2"), "data-streamdown": "table-wrapper", children: [f ? J("div", { className: u("flex items-center justify-end gap-1"), children: [o ? y(Rc, {}) : null, l ? y(Oc, {}) : null, d ? y(Kk, { showCopy: o, showDownload: l, children: e }) : null] }) : null, y("div", { className: u("border-collapse overflow-x-auto overflow-y-auto rounded-md border border-border bg-background"), children: y("table", { className: u("w-full divide-y divide-border", t), "data-streamdown": "table", ...s, children: e }) })] });
19304
- }, Jk = /startLine=(\d+)/, ex = /\bnoLineNumbers\b/, tx = Zu(() => import("./mermaid-GHXKKRXX-CV6iAjsp.js").then((e) => ({ default: e.Mermaid }))), nx = /language-([^\s]+)/;
19304
+ }, Jk = /startLine=(\d+)/, ex = /\bnoLineNumbers\b/, tx = Zu(() => import("./mermaid-GHXKKRXX-DZ_SVE42.js").then((e) => ({ default: e.Mermaid }))), nx = /language-([^\s]+)/;
19305
19305
  function Jr(e, t) {
19306
19306
  if (!(e != null && e.position || t != null && t.position)) return !0;
19307
19307
  if (!(e != null && e.position && t != null && t.position)) return !1;
@@ -20814,7 +20814,7 @@ function S6(e) {
20814
20814
  }
20815
20815
  function w6() {
20816
20816
  return Tr || (Tr = Promise.all([
20817
- import("./index-DbqbmqNj.js"),
20817
+ import("./index-Drj31VZQ.js"),
20818
20818
  import("./index-JkCQXUYs.js").then((e) => e.bp)
20819
20819
  ]).then(([e, t]) => {
20820
20820
  Hn = { math: e.math, mermaid: t.mermaid };
package/dist-lib/sw.js CHANGED
@@ -121,6 +121,9 @@ async function showOmgNotification(title, options) {
121
121
  }
122
122
 
123
123
  async function showLatest(payload) {
124
+ // Encrypted-payload push: everything needed is in the message, so render it
125
+ // without calling back to the API. This is the path that works when the app
126
+ // is served from an origin that is not the lfg box.
124
127
  if (payload?.title) {
125
128
  await showOmgNotification(payload.title, {
126
129
  body: payload.body || "",
@@ -128,6 +131,7 @@ async function showLatest(payload) {
128
131
  badge: "/icon-maskable.svg",
129
132
  tag: payload.tag || "lfg",
130
133
  renotify: true,
134
+ requireInteraction: !!payload.requireInteraction,
131
135
  data: { url: payload.url || "/" },
132
136
  });
133
137
  return;
@@ -205,9 +209,19 @@ self.addEventListener("notificationclick", (event) => {
205
209
  const all = await self.clients.matchAll({ type: "window", includeUncontrolled: true });
206
210
  const client = all.find((c) => "focus" in c);
207
211
  if (client) {
208
- if ("navigate" in client) await client.navigate(target);
212
+ // navigate() rejects for a cross-origin target — which an absolute url
213
+ // from a hosted surface legitimately is. Focus the window regardless,
214
+ // then let openWindow handle the destination we could not navigate to.
215
+ let navigated = true;
216
+ if ("navigate" in client) {
217
+ try {
218
+ await client.navigate(target);
219
+ } catch {
220
+ navigated = false;
221
+ }
222
+ }
209
223
  await client.focus();
210
- return;
224
+ if (navigated) return;
211
225
  }
212
226
  if (self.clients.openWindow) await self.clients.openWindow(target);
213
227
  })(),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omg-dev/app",
3
- "version": "0.1.323",
3
+ "version": "0.1.324",
4
4
  "description": "The full OMG application surface for React hosts.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://omg.dev",
@@ -24,7 +24,7 @@
24
24
  },
25
25
  "type": "module",
26
26
  "dependencies": {
27
- "@omg-dev/client": "0.1.323",
27
+ "@omg-dev/client": "0.1.324",
28
28
  "@ai-sdk/react": "^4.0.19",
29
29
  "@base-ui/react": "^1.3.0",
30
30
  "@number-flow/react": "^0.6.2",
@@ -1,4 +0,0 @@
1
- import { p } from "./streamdown-response-BaisNaaU.js";
2
- export {
3
- p as Mermaid
4
- };