@aiworkbench/vibe-bridge 0.0.4 → 0.0.5

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 +1 @@
1
- {"version":3,"file":"VibeHost.d.ts","sourceRoot":"","sources":["../../src/components/VibeHost.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAiFnD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAiB5C"}
1
+ {"version":3,"file":"VibeHost.d.ts","sourceRoot":"","sources":["../../src/components/VibeHost.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAkFnD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAiB5C"}
@@ -1,3 +1,35 @@
1
- export declare function loadScript(src: string): Promise<void>;
1
+ /**
2
+ * Register shared dependencies that mini-app bundles may import as bare
3
+ * specifiers. Call this once at app startup, *before* any VibeHost renders.
4
+ *
5
+ * Example:
6
+ * setSharedDependencies({
7
+ * "react": "https://esm.sh/react@19",
8
+ * "react/jsx-runtime":"https://esm.sh/react@19/jsx-runtime",
9
+ * "react-dom": "https://esm.sh/react-dom@19",
10
+ * "react-dom/client": "https://esm.sh/react-dom@19/client",
11
+ * });
12
+ */
13
+ export declare function setSharedDependencies(deps: Record<string, string>): void;
14
+ /**
15
+ * Configure the set of trusted origins for mini-app bundles.
16
+ * Call this once at app startup before any VibeHost renders.
17
+ *
18
+ * Example:
19
+ * setAllowedOrigins([
20
+ * "https://vibedevstore.blob.core.windows.net",
21
+ * "https://vibestagingstore.blob.core.windows.net",
22
+ * ]);
23
+ */
24
+ export declare function setAllowedOrigins(origins: string[]): void;
25
+ export interface LoadScriptOptions {
26
+ /** SRI integrity hash (e.g. "sha384-..."). If provided, the browser will
27
+ * refuse to execute the script if the content doesn't match. */
28
+ integrity?: string;
29
+ /** CORS setting for the script. Required for SRI on cross-origin scripts.
30
+ * Defaults to "anonymous" when integrity is provided. */
31
+ crossOrigin?: string;
32
+ }
33
+ export declare function loadScript(src: string, options?: LoadScriptOptions): Promise<void>;
2
34
  export declare function waitForElement(tagName: string): Promise<void>;
3
35
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAmBA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BrD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"AAoBA;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CASxE;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAQzD;AAwBD,MAAM,WAAW,iBAAiB;IAChC;qEACiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;8DAC0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D"}
@@ -5,6 +5,10 @@ export interface VibeHostProps {
5
5
  manifest: VibeManifest;
6
6
  /** URL to the built JS bundle for the mini-app. */
7
7
  src: string;
8
+ /** SRI integrity hash (e.g. "sha384-...") from the registry entry.
9
+ * When provided, the browser refuses to execute the script if the
10
+ * content doesn't match — preventing tampered bundles from running. */
11
+ integrity?: string;
8
12
  /** Shown while the script loads and custom element registers. */
9
13
  fallback?: ReactNode;
10
14
  /** Shown when the script fails to load or the element fails to mount. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,QAAQ,EAAE,YAAY,CAAC;IACvB,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;IAC5C,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,YAAY,EACZ,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC5B,iEAAiE;IACjE,QAAQ,EAAE,YAAY,CAAC;IACvB,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;4EAEwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yEAAyE;IACzE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;IAC5C,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC"}
@@ -1,3 +1,3 @@
1
1
  import type { UseVibeLoaderResult } from "../core/types";
2
- export declare function useVibeLoader(src: string, tagName: string): UseVibeLoaderResult;
2
+ export declare function useVibeLoader(src: string, tagName: string, integrity?: string): UseVibeLoaderResult;
3
3
  //# sourceMappingURL=useVibeLoader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useVibeLoader.d.ts","sourceRoot":"","sources":["../../src/hooks/useVibeLoader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,mBAAmB,CAkCrB"}
1
+ {"version":3,"file":"useVibeLoader.d.ts","sourceRoot":"","sources":["../../src/hooks/useVibeLoader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,mBAAmB,CAkCrB"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { createStorageAdapter } from "./adapters/storage";
12
12
  export { createEventsAdapter } from "./adapters/events";
13
13
  export { filterByPermissions } from "./core/permissions";
14
14
  export { getEventBus, emitEvent } from "./core/event-bus";
15
+ export { setAllowedOrigins, setSharedDependencies } from "./core/loader";
15
16
  export type { VibeHostProps, AdapterOverrides, LoaderStatus, UseVibeLoaderResult, } from "./core/types";
16
17
  export type { AuthAdapterDeps } from "./adapters/auth";
17
18
  export type { ApiAdapterDeps } from "./adapters/api";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG1D,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAGzE,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -7,6 +7,31 @@ import { useState, useEffect } from "react";
7
7
  // src/core/loader.ts
8
8
  var loadedScripts = new Set;
9
9
  var ALLOWED_PROTOCOLS = new Set(["https:", "http:"]);
10
+ var allowedOrigins = null;
11
+ var sharedDeps = null;
12
+ var importMapInjected = false;
13
+ function setSharedDependencies(deps) {
14
+ if (importMapInjected) {
15
+ console.warn("[vibe-bridge] setSharedDependencies() called after an import map " + "was already injected. The new entries will be ignored.");
16
+ return;
17
+ }
18
+ sharedDeps = { ...deps };
19
+ }
20
+ function ensureImportMap() {
21
+ if (importMapInjected || !sharedDeps)
22
+ return;
23
+ const script = document.createElement("script");
24
+ script.type = "importmap";
25
+ script.textContent = JSON.stringify({ imports: sharedDeps });
26
+ document.head.appendChild(script);
27
+ importMapInjected = true;
28
+ }
29
+ function setAllowedOrigins(origins) {
30
+ allowedOrigins = new Set(origins.map((o) => {
31
+ const url = new URL(o);
32
+ return url.origin;
33
+ }));
34
+ }
10
35
  function validateScriptSrc(src) {
11
36
  let url;
12
37
  try {
@@ -17,9 +42,12 @@ function validateScriptSrc(src) {
17
42
  if (!ALLOWED_PROTOCOLS.has(url.protocol)) {
18
43
  return `Refused to load vibe app script with disallowed protocol "${url.protocol}": ${src}`;
19
44
  }
45
+ if (allowedOrigins && !allowedOrigins.has(url.origin)) {
46
+ return `Refused to load vibe app script from untrusted origin "${url.origin}": ${src}. ` + `Allowed origins: ${[...allowedOrigins].join(", ")}`;
47
+ }
20
48
  return null;
21
49
  }
22
- function loadScript(src) {
50
+ function loadScript(src, options) {
23
51
  const validationError = validateScriptSrc(src);
24
52
  if (validationError) {
25
53
  return Promise.reject(new Error(validationError));
@@ -37,13 +65,19 @@ function loadScript(src) {
37
65
  const script = document.createElement("script");
38
66
  script.type = "module";
39
67
  script.src = src;
68
+ if (options?.integrity) {
69
+ script.integrity = options.integrity;
70
+ script.crossOrigin = options.crossOrigin ?? "anonymous";
71
+ }
40
72
  script.onload = () => {
41
73
  loadedScripts.add(src);
42
74
  resolve();
43
75
  };
44
76
  script.onerror = () => {
45
- reject(new Error(`Failed to load vibe app script: ${src}`));
77
+ const integrityHint = options?.integrity ? " This may be an SRI integrity mismatch — the bundle content doesn't match the expected hash." : "";
78
+ reject(new Error(`Failed to load vibe app script: ${src}.${integrityHint}`));
46
79
  };
80
+ ensureImportMap();
47
81
  document.head.appendChild(script);
48
82
  });
49
83
  }
@@ -57,14 +91,14 @@ function waitForElement(tagName) {
57
91
  }
58
92
 
59
93
  // src/hooks/useVibeLoader.ts
60
- function useVibeLoader(src, tagName) {
94
+ function useVibeLoader(src, tagName, integrity) {
61
95
  const [status, setStatus] = useState("loading");
62
96
  const [error, setError] = useState(null);
63
97
  useEffect(() => {
64
98
  let cancelled = false;
65
99
  setStatus("loading");
66
100
  setError(null);
67
- loadScript(src).then(() => waitForElement(tagName)).then(() => {
101
+ loadScript(src, integrity ? { integrity } : undefined).then(() => waitForElement(tagName)).then(() => {
68
102
  if (!cancelled) {
69
103
  setStatus("ready");
70
104
  }
@@ -78,7 +112,7 @@ function useVibeLoader(src, tagName) {
78
112
  return () => {
79
113
  cancelled = true;
80
114
  };
81
- }, [src, tagName]);
115
+ }, [src, tagName, integrity]);
82
116
  return { status, error };
83
117
  }
84
118
 
@@ -339,6 +373,7 @@ import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
339
373
  function VibeHostInner({
340
374
  manifest,
341
375
  src,
376
+ integrity,
342
377
  fallback,
343
378
  errorFallback,
344
379
  adapters,
@@ -350,7 +385,7 @@ function VibeHostInner({
350
385
  const containerRef = useRef(null);
351
386
  const elementRef = useRef(null);
352
387
  const readyFiredRef = useRef(false);
353
- const { status, error: loadError } = useVibeLoader(src, manifest.id);
388
+ const { status, error: loadError } = useVibeLoader(src, manifest.id, integrity);
354
389
  const bridge = useVibeBridge({
355
390
  appId: manifest.id,
356
391
  permissions: manifest.permissions,
@@ -435,6 +470,8 @@ export {
435
470
  useVibeLoader,
436
471
  useVibeEvents,
437
472
  useVibeBridge,
473
+ setSharedDependencies,
474
+ setAllowedOrigins,
438
475
  getEventBus,
439
476
  filterByPermissions,
440
477
  emitEvent,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiworkbench/vibe-bridge",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "publishConfig": { "access": "public" },
5
5
  "type": "module",
6
6
  "main": "dist/index.js",