@aiworkbench/vibe-bridge 0.0.9 → 0.0.11

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.
@@ -0,0 +1,6 @@
1
+ import type { DocumentsBridge } from "@aiworkbench/vibe-types";
2
+ export interface DocumentsAdapterDeps {
3
+ getToken: () => Promise<string>;
4
+ }
5
+ export declare function createDocumentsAdapter(deps: DocumentsAdapterDeps): DocumentsBridge;
6
+ //# sourceMappingURL=documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/adapters/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMV,eAAe,EAQhB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAmKD,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,oBAAoB,GACzB,eAAe,CA2IjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgBxE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CAuBR"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAkCxE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,gBAAgB,EAAE,GAC9B,MAAM,CA2BR"}
@@ -1,4 +1,4 @@
1
- import type { Bridge, VibeManifest, AuthBridge, ApiBridge, NavigationBridge, ThemeBridge, ToastBridge, StorageBridge, EventsBridge, ChatBridge, VoiceBridge } from "@aiworkbench/vibe-types";
1
+ import type { VibeManifest, AuthBridge, ApiBridge, NavigationBridge, ThemeBridge, ToastBridge, StorageBridge, EventsBridge, ChatBridge, VoiceBridge, DocumentsBridge, BridgeCapability } from "@aiworkbench/vibe-types";
2
2
  import type { ReactNode, CSSProperties } from "react";
3
3
  export interface VibeHostProps {
4
4
  /** The mini-app manifest describing its id, permissions, etc. */
@@ -32,6 +32,7 @@ export interface AdapterOverrides {
32
32
  events: EventsBridge;
33
33
  chat: ChatBridge;
34
34
  voice: VoiceBridge;
35
+ documents: DocumentsBridge;
35
36
  }
36
37
  export type LoaderStatus = "loading" | "ready" | "error";
37
38
  export interface UseVibeLoaderResult {
@@ -40,7 +41,7 @@ export interface UseVibeLoaderResult {
40
41
  }
41
42
  export interface UseVibeBridgeOptions {
42
43
  appId: string;
43
- permissions: Bridge extends infer B ? (keyof B)[] : never;
44
+ permissions: BridgeCapability[];
44
45
  overrides?: Partial<AdapterOverrides>;
45
46
  }
46
47
  //# sourceMappingURL=types.d.ts.map
@@ -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,EACZ,UAAU,EACV,WAAW,EACZ,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;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACpB;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,YAAY,EACZ,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,gBAAgB,EACjB,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;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;CAC5B;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,gBAAgB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useVibeBridge.d.ts","sourceRoot":"","sources":["../../src/hooks/useVibeBridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAcxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CA6BnE"}
1
+ {"version":3,"file":"useVibeBridge.d.ts","sourceRoot":"","sources":["../../src/hooks/useVibeBridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAexE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAgCnE"}
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 { createChatAdapter } from "./adapters/chat";
14
14
  export { createVoiceAdapter, createNoopVoiceAdapter } from "./adapters/voice";
15
+ export { createDocumentsAdapter } from "./adapters/documents";
15
16
  export { filterByPermissions } from "./core/permissions";
16
17
  export { getEventBus, emitEvent } from "./core/event-bus";
17
18
  export { setAllowedOrigins, setSharedDependencies } from "./core/loader";
@@ -22,4 +23,5 @@ export type { NavigationAdapterDeps } from "./adapters/navigation";
22
23
  export type { ToastAdapterDeps } from "./adapters/toast";
23
24
  export type { ChatAdapterDeps } from "./adapters/chat";
24
25
  export type { VoiceAdapterDeps } from "./adapters/voice";
26
+ export type { DocumentsAdapterDeps } from "./adapters/documents";
25
27
  //# sourceMappingURL=index.d.ts.map
@@ -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;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG9E,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;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,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;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,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;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import{useRef as M,useEffect as G,useCallback as de}from"react";import{useState as R,useEffect as re}from"react";var w=new Set,Z=new Set(["https:","http:"]),B=null,P=null,k=!1;function F(e){if(k){console.warn("[vibe-bridge] setSharedDependencies() called after an import map was already injected. The new entries will be ignored.");return}P={...e}}function j(){if(k||!P)return;let e=document.createElement("script");e.type="importmap",e.textContent=JSON.stringify({imports:P}),document.head.appendChild(e),k=!0}function ee(e){B=new Set(e.map((t)=>{return new URL(t).origin}))}function te(e){let t;try{t=new URL(e,window.location.href)}catch{return`Invalid vibe app script URL: ${e}`}if(!Z.has(t.protocol))return`Refused to load vibe app script with disallowed protocol "${t.protocol}": ${e}`;if(B&&!B.has(t.origin))return`Refused to load vibe app script from untrusted origin "${t.origin}": ${e}. Allowed origins: ${[...B].join(", ")}`;return null}function O(e,t){let r=te(e);if(r)return Promise.reject(Error(r));if(w.has(e))return Promise.resolve();return new Promise((o,n)=>{if(document.querySelector(`script[src="${CSS.escape(e)}"]`)){w.add(e),o();return}let a=document.createElement("script");if(a.type="module",a.src=e,t?.integrity)a.integrity=t.integrity,a.crossOrigin=t.crossOrigin??"anonymous";a.onload=()=>{w.add(e),o()},a.onerror=()=>{let s=t?.integrity?" This may be an SRI integrity mismatch — the bundle content doesn't match the expected hash.":"";n(Error(`Failed to load vibe app script: ${e}.${s}`))},j(),document.head.appendChild(a)})}function Q(e){if(customElements.get(e))return Promise.resolve();return customElements.whenDefined(e).then(()=>{return})}function l(e,t,r){let[o,n]=R("loading"),[i,a]=R(null);return re(()=>{let s=!1;return n("loading"),a(null),O(e,r?{integrity:r}:void 0).then(()=>Q(t)).then(()=>{if(!s)n("ready")}).catch((c)=>{if(!s){let p=c instanceof Error?c:Error(`Failed to load vibe app: ${t}`);a(p),n("error")}}),()=>{s=!0}},[e,t,r]),{status:o,error:i}}import{useMemo as ae}from"react";import{useSession as se}from"next-auth/react";import{useRouter as ce}from"next/navigation";import{toast as pe}from"sonner";function C(e){return{getUser(){let t=e.session?.user;return{id:t?.email??"unknown",name:t?.name??"Unknown User",email:t?.email??void 0}},async getToken(){let t=e.session?.idToken;if(!t)throw Error("No authentication token available.");return t}}}function S(e){return{async fetch(t,r){let o=t.startsWith("/api/")?t:`/api/${t.replace(/^\//,"")}`,n=await e.getToken(),i=new Headers(r?.headers);return i.set("Authorization",`Bearer ${n}`),globalThis.fetch(o,{...r,headers:i})}}}function D(e){return{navigate(t){if(/^https?:\/\//i.test(t)||/^\/\//.test(t)||/^(javascript|data|blob|vbscript):/i.test(t))throw Error(`Navigation to external URLs is not allowed: ${t}`);e.push(t)}}}function $(){return{current(){let e=document.documentElement;if(e.classList.contains("dark"))return"dark";if(e.classList.contains("light"))return"light";let t=e.getAttribute("data-theme");if(t==="dark")return"dark";if(t==="light")return"light";if(globalThis.matchMedia?.("(prefers-color-scheme: dark)").matches)return"dark";return"light"}}}function I(e){return{show(t,r){switch(r?.type??"info"){case"success":e.toast.success(t);break;case"error":e.toast.error(t);break;case"info":e.toast.info(t);break;default:e.toast(t)}}}}function N(e){let t=`vibe:${e}:`;return{async get(r){return localStorage.getItem(`${t}${r}`)},async set(r,o){localStorage.setItem(`${t}${r}`,o)},async remove(r){localStorage.removeItem(`${t}${r}`)},async keys(){let r=[];for(let o=0;o<localStorage.length;o++){let n=localStorage.key(o);if(n?.startsWith(t))r.push(n.slice(t.length))}return r}}}var L=null;function x(){if(!L)L=new EventTarget;return L}function _(e){if(e.startsWith("vibe:"))return e;return`vibe:${e}`}function U(e,t,r){let o=x(),n={payload:t,sourceAppId:r};o.dispatchEvent(new CustomEvent(_(e),{detail:n}))}function V(e,t){let r=x(),o=_(e),n=(i)=>{t(i.detail)};return r.addEventListener(o,n),()=>r.removeEventListener(o,n)}function Y(e,t){let r=x(),o=_(e),n=(i)=>{t(i.detail)};return r.addEventListener(o,n,{once:!0}),()=>r.removeEventListener(o,n)}function X(e){return{emit(t,r){U(t,r??{},e)},on(t,r){return V(t,(o)=>r(o.payload))},once(t,r){return Y(t,(o)=>r(o.payload))}}}async function*oe(e,t){let r=new TextDecoder("utf-8"),o="",n,i,a=[];function s(){if(a.length===0&&n===void 0&&i===void 0)return null;let p=a.join(`
2
- `),u;try{u=JSON.parse(p)}catch{u={raw:p}}let f={kind:n??u.kind?.toString()??"unknown",...u};return n=void 0,i=void 0,a=[],f}while(!0){if(t?.aborted)break;let{value:p,done:u}=await e.read();if(u)break;let f=r.decode(p,{stream:!0}),E=(o+f).split(`
3
- `);o=E.pop()??"";for(let g of E){let d=g.endsWith("\r")?g.slice(0,-1):g;if(d===""){let K=s();if(K)yield K;continue}if(d.startsWith(":"))continue;let m=d.indexOf(":"),v=m===-1?d:d.slice(0,m),y=m===-1?"":d.slice(m+1);if(y.startsWith(" "))y=y.slice(1);if(v==="data")a.push(y);else if(v==="event")n=y;else if(v==="id")i=y}}let c=s();if(c)yield c}function H(e){let t=e.chatEndpoint??"/api/chat";return{send(r,o,n){let i=new AbortController;if(n?.signal)n.signal.addEventListener("abort",()=>i.abort(),{once:!0});let a=async function*(){let s=await e.getToken(),c={serverUrl:r,parts:o};if(n?.contextId)c.contextId=n.contextId;if(n?.messageId)c.messageId=n.messageId;if(n?.metadata!==void 0)c.metadata=n.metadata;let p=await globalThis.fetch(t,{method:"POST",headers:{Accept:"text/event-stream",Authorization:`Bearer ${s}`,"Content-Type":"application/json"},body:JSON.stringify(c),signal:i.signal});if(!p.ok)throw Error(`Chat stream failed: ${p.status} ${p.statusText}`);if(!p.body)throw Error("Chat response has no body");let u=p.body.getReader();yield*oe(u,i.signal)}();return{[Symbol.asyncIterator]:()=>a,abort:()=>i.abort()}}}}function A(){return Error("Voice adapter must be provided by the host. Pass adapters.voice to VibeHost or useVibeBridge().")}function ne(e){return{connect:e.connect,disconnect:e.disconnect,setMicEnabled:e.setMicEnabled,sendText:e.sendText,onStateChange:e.onStateChange,onTranscription:e.onTranscription,onAudioLevel:e.onAudioLevel,listAgents:e.listAgents,searchAgents:e.searchAgents}}function W(){return{async connect(){throw A()},disconnect(){throw A()},setMicEnabled(){throw A()},sendText(){throw A()},onStateChange(){throw A()},onTranscription(){throw A()},onAudioLevel(){throw A()},async listAgents(){throw A()},async searchAgents(){throw A()}}}function ie(e){return new Proxy({},{get(t,r){if(typeof r==="symbol")return;throw Error(`Access denied: ${e}.${r} is not permitted. Add '${e}' to your manifest.json permissions.`)}})}function q(e,t){let r=["auth","api","navigation","theme","toast","storage","events","chat","voice"],o={};for(let n of r)if(t.includes(n))o[n]=e[n];else o[n]=ie(n);return o}function z(e){let{appId:t,permissions:r,overrides:o}=e,{data:n}=se(),i=ce();return ae(()=>{let a=o?.auth??C({session:n??null}),s={auth:a,api:o?.api??S({getToken:()=>a.getToken()}),navigation:o?.navigation??D({push:(c)=>i.push(c)}),theme:o?.theme??$(),toast:o?.toast??I({toast:pe}),storage:o?.storage??N(t),events:o?.events??X(t),chat:o?.chat??H({getToken:()=>a.getToken()}),voice:o?.voice??W()};return q(s,r)},[n,i,t,r,o])}import{Component as ue}from"react";class b extends ue{constructor(e){super(e);this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){this.props.onError?.(e)}render(){if(this.state.error)return this.props.fallback(this.state.error);return this.props.children}}import{jsx as h,Fragment as J}from"react/jsx-runtime";function ge({manifest:e,src:t,integrity:r,fallback:o,errorFallback:n,adapters:i,onReady:a,onError:s,className:c,style:p}){let u=M(null),f=M(null),T=M(!1),{status:E,error:g}=l(t,e.id,r),d=z({appId:e.id,permissions:e.permissions,overrides:i});if(G(()=>{if(g)s?.(g)},[g,s]),G(()=>{let m=u.current;if(E!=="ready"||!m)return;let v=document.createElement(e.id);if(v.bridge=d,m.appendChild(v),f.current=v,!T.current)T.current=!0,a?.();return()=>{if(m.contains(v))m.removeChild(v);f.current=null}},[E,e.id]),G(()=>{if(f.current)f.current.bridge=d},[d]),E==="error"&&g){if(n)return h(J,{children:n(g)});return null}if(E==="loading")return h(J,{children:o??null});return h("div",{ref:u,className:c,style:p})}function me(e){let t=de((r)=>{if(e.onError?.(r),e.errorFallback)return h(J,{children:e.errorFallback(r)});return null},[e.onError,e.errorFallback]);return h(b,{fallback:t,onError:e.onError,children:h(ge,{...e})})}import{useEffect as ve}from"react";function Ae(e,t){ve(()=>{return V(e,(r)=>{t(r.payload,r.sourceAppId)})},[e,t])}export{l as useVibeLoader,Ae as useVibeEvents,z as useVibeBridge,F as setSharedDependencies,ee as setAllowedOrigins,x as getEventBus,q as filterByPermissions,U as emitEvent,ne as createVoiceAdapter,I as createToastAdapter,$ as createThemeAdapter,N as createStorageAdapter,W as createNoopVoiceAdapter,D as createNavigationAdapter,X as createEventsAdapter,H as createChatAdapter,C as createAuthAdapter,S as createApiAdapter,me as VibeHost,b as VibeErrorBoundary};
1
+ import{useRef as ee,useEffect as te,useCallback as Se}from"react";import{useState as se,useEffect as Ae}from"react";var $=new Set,fe=new Set(["https:","http:"]),P=null,I=null,L=!1;function le(e){if(L){console.warn("[vibe-bridge] setSharedDependencies() called after an import map was already injected. The new entries will be ignored.");return}I={...e}}function ge(){if(L||!I)return;let e=document.createElement("script");e.type="importmap",e.textContent=JSON.stringify({imports:I}),document.head.appendChild(e),L=!0}function he(e){P=new Set(e.map((t)=>{return new URL(t).origin}))}function ye(e){let t;try{t=new URL(e,window.location.href)}catch{return`Invalid vibe app script URL: ${e}`}if(!fe.has(t.protocol))return`Refused to load vibe app script with disallowed protocol "${t.protocol}": ${e}`;if(P&&!P.has(t.origin))return`Refused to load vibe app script from untrusted origin "${t.origin}": ${e}. Allowed origins: ${[...P].join(", ")}`;return null}function oe(e,t){let o=ye(e);if(o)return Promise.reject(Error(o));if($.has(e))return Promise.resolve();return new Promise((n,r)=>{if(document.querySelector(`script[src="${CSS.escape(e)}"]`)){$.add(e),n();return}let s=document.createElement("script");if(s.type="module",s.src=e,t?.integrity)s.integrity=t.integrity,s.crossOrigin=t.crossOrigin??"anonymous";s.onload=()=>{$.add(e),n()},s.onerror=()=>{let d=t?.integrity?" This may be an SRI integrity mismatch — the bundle content doesn't match the expected hash.":"";r(Error(`Failed to load vibe app script: ${e}.${d}`))},ge(),document.head.appendChild(s)})}function ie(e){if(customElements.get(e))return Promise.resolve();return customElements.whenDefined(e).then(()=>{return})}function U(e,t,o){let[n,r]=se("loading"),[i,s]=se(null);return Ae(()=>{let d=!1;return r("loading"),s(null),oe(e,o?{integrity:o}:void 0).then(()=>ie(t)).then(()=>{if(!d)r("ready")}).catch((u)=>{if(!d){let c=u instanceof Error?u:Error(`Failed to load vibe app: ${t}`);s(c),r("error")}}),()=>{d=!0}},[e,t,o]),{status:n,error:i}}import{useMemo as Be}from"react";import{useSession as Te}from"next-auth/react";import{useRouter as Pe}from"next/navigation";import{toast as Ve}from"sonner";function N(e){return{getUser(){let t=e.session?.user;return{id:t?.email??"unknown",name:t?.name??"Unknown User",email:t?.email??void 0}},async getToken(){let t=e.session?.idToken;if(!t)throw Error("No authentication token available.");return t}}}function O(e){return{async fetch(t,o){let n=t.startsWith("/api/")?t:`/api/${t.replace(/^\//,"")}`,r=await e.getToken(),i=new Headers(o?.headers);return i.set("Authorization",`Bearer ${r}`),globalThis.fetch(n,{...o,headers:i})}}}function R(e){return{navigate(t){if(/^https?:\/\//i.test(t)||/^\/\//.test(t)||/^(javascript|data|blob|vbscript):/i.test(t))throw Error(`Navigation to external URLs is not allowed: ${t}`);e.push(t)}}}function G(){return{current(){let e=document.documentElement;if(e.classList.contains("dark"))return"dark";if(e.classList.contains("light"))return"light";let t=e.getAttribute("data-theme");if(t==="dark")return"dark";if(t==="light")return"light";if(globalThis.matchMedia?.("(prefers-color-scheme: dark)").matches)return"dark";return"light"}}}function q(e){return{show(t,o){switch(o?.type??"info"){case"success":e.toast.success(t);break;case"error":e.toast.error(t);break;case"info":e.toast.info(t);break;default:e.toast(t)}}}}function z(e){let t=`vibe:${e}:`;return{async get(o){return localStorage.getItem(`${t}${o}`)},async set(o,n){localStorage.setItem(`${t}${o}`,n)},async remove(o){localStorage.removeItem(`${t}${o}`)},async keys(){let o=[];for(let n=0;n<localStorage.length;n++){let r=localStorage.key(n);if(r?.startsWith(t))o.push(r.slice(t.length))}return o}}}var H=null;function V(){if(!H)H=new EventTarget;return H}function M(e){if(e.startsWith("vibe:"))return e;return`vibe:${e}`}function X(e,t,o){let n=V(),r={payload:t,sourceAppId:o};n.dispatchEvent(new CustomEvent(M(e),{detail:r}))}function C(e,t){let o=V(),n=M(e),r=(i)=>{t(i.detail)};return o.addEventListener(n,r),()=>o.removeEventListener(n,r)}function ae(e,t){let o=V(),n=M(e),r=(i)=>{t(i.detail)};return o.addEventListener(n,r,{once:!0}),()=>o.removeEventListener(n,r)}function W(e){return{emit(t,o){X(t,o??{},e)},on(t,o){return C(t,(n)=>o(n.payload))},once(t,o){return ae(t,(n)=>o(n.payload))}}}async function*we(e,t){let o=new TextDecoder("utf-8"),n="",r,i,s=[];function d(){if(s.length===0&&r===void 0&&i===void 0)return null;let c=s.join(`
2
+ `),p;try{p=JSON.parse(c)}catch{p={raw:c}}let w={kind:r??p.kind?.toString()??"unknown",...p};return r=void 0,i=void 0,s=[],w}while(!0){if(t?.aborted)break;let{value:c,done:p}=await e.read();if(p)break;let w=o.decode(c,{stream:!0}),E=(n+w).split(`
3
+ `);n=E.pop()??"";for(let g of E){let l=g.endsWith("\r")?g.slice(0,-1):g;if(l===""){let ne=d();if(ne)yield ne;continue}if(l.startsWith(":"))continue;let h=l.indexOf(":"),y=h===-1?l:l.slice(0,h),_=h===-1?"":l.slice(h+1);if(_.startsWith(" "))_=_.slice(1);if(y==="data")s.push(_);else if(y==="event")r=_;else if(y==="id")i=_}}let u=d();if(u)yield u}function J(e){let t=e.chatEndpoint??"/api/chat";return{send(o,n,r){let i=new AbortController;if(r?.signal)r.signal.addEventListener("abort",()=>i.abort(),{once:!0});let s=async function*(){let d=await e.getToken(),u={serverUrl:o,parts:n};if(r?.contextId)u.contextId=r.contextId;if(r?.messageId)u.messageId=r.messageId;if(r?.metadata!==void 0)u.metadata=r.metadata;let c=await globalThis.fetch(t,{method:"POST",headers:{Accept:"text/event-stream",Authorization:`Bearer ${d}`,"Content-Type":"application/json"},body:JSON.stringify(u),signal:i.signal});if(!c.ok)throw Error(`Chat stream failed: ${c.status} ${c.statusText}`);if(!c.body)throw Error("Chat response has no body");let p=c.body.getReader();yield*we(p,i.signal)}();return{[Symbol.asyncIterator]:()=>s,abort:()=>i.abort()}}}}function A(){return Error("Voice adapter must be provided by the host. Pass adapters.voice to VibeHost or useVibeBridge().")}function be(e){return{connect:e.connect,disconnect:e.disconnect,setMicEnabled:e.setMicEnabled,sendText:e.sendText,onStateChange:e.onStateChange,onTranscription:e.onTranscription,onAudioLevel:e.onAudioLevel,listAgents:e.listAgents,searchAgents:e.searchAgents}}function Q(){return{async connect(){throw A()},disconnect(){throw A()},setMicEnabled(){throw A()},sendText(){throw A()},onStateChange(){throw A()},onTranscription(){throw A()},onAudioLevel(){throw A()},async listAgents(){throw A()},async searchAgents(){throw A()}}}function a(e,t,o){if(o===void 0||o===null||o===!1)return;e.set(t,String(o))}function x(e,t){let o=t.toString();return o?`${e}?${o}`:e}function D(e){return e&&typeof e==="object"&&!Array.isArray(e)?e:{}}function T(e){return Array.isArray(e)?e:[]}function ce(e,t){if(typeof e==="number"&&Number.isFinite(e))return e;if(typeof e==="string"&&e.trim()!==""){let o=Number(e);if(Number.isFinite(o))return o}if(e===void 0||e===null)return;throw Error(`Documents response field "${t}" must be a number`)}function f(e,t){let o=ce(e,t);if(o!==void 0)return o;throw Error(`Documents response field "${t}" is required`)}function b(e,t=""){return typeof e==="string"?e:t}function m(e){return typeof e==="string"||e===null?e:void 0}function v(e){if(e===null)return null;return ce(e,"optional number")}function Ee(e){return typeof e==="boolean"||e===null?e:void 0}function de(e){if(e===null)return null;return e&&typeof e==="object"&&!Array.isArray(e)?e:void 0}function B(e){let t=D(e);return{id:f(t.id,"id"),name:b(t.name),status:b(t.status,"UPLOADED"),actorId:f(t.actor_id,"actor_id"),actorGuid:b(t.actor_guid),folderId:f(t.folder_id,"folder_id"),folderActorGuid:b(t.folder_actor_guid),location:m(t.location),createdAt:m(t.created_at),updatedAt:m(t.updated_at),sizeMb:v(t.size_mb),type:m(t.type),sharedUserCount:v(t.shared_user_count),sharedGroupCount:v(t.shared_group_count),owner:t.owner}}function K(e){let t=D(e);return{id:f(t.id,"id"),name:b(t.name),description:m(t.description),actorId:f(t.actor_id,"actor_id"),actorGuid:b(t.actor_guid),folderTypeId:f(t.folder_type_id,"folder_type_id"),folderType:m(t.folder_type),location:m(t.location),folderMetadata:de(t.folder_metadata),extraConfig:de(t.extra_config),hidden:Ee(t.hidden),parentFolderId:v(t.parent_folder_id),virtualPath:m(t.virtual_path),accessGrant:m(t.access_grant),owner:t.owner,createdAt:m(t.created_at),updatedAt:m(t.updated_at),sharedUserCount:v(t.shared_user_count),sharedGroupCount:v(t.shared_group_count)}}function me(e){let t=D(e);return{folder:K(t.folder),folders:T(t.folders).map(me),files:T(t.files).map(B)}}function ue(e,t){let o=D(e);return{items:T(o.items).map(t),total:f(o.total,"total"),skip:f(o.skip,"skip"),limit:f(o.limit,"limit")}}function ve(e){let t=D(e);return{folders:T(t.folders).map(me),files:T(t.files).map(B)}}function _e(e){let t=D(e);return{fileId:f(t.file_id,"file_id"),fileName:b(t.file_name),downloadUrl:b(t.download_url),expiresInHours:f(t.expires_in_hours,"expires_in_hours"),contentType:m(t.content_type),sizeMb:v(t.size_mb)}}function De(e,t){if(t?.name)return t.name;if(typeof File<"u"&&e instanceof File)return e.name;return"upload"}function Y(e){async function t(n,r,i){let s=await e.getToken(),d=new Headers(r?.headers);if(d.set("Authorization",`Bearer ${s}`),!d.has("Accept"))d.set("Accept","application/json");let u=await globalThis.fetch(n,{...r,headers:d});if(!u.ok){let c=await u.text().catch(()=>"");throw Error(`Documents request failed: ${u.status} ${u.statusText}${c?` ${c}`:""}`)}return i(await u.json())}function o(n){let r=new URLSearchParams;return a(r,"skip",n?.skip),a(r,"limit",n?.limit),a(r,"search",n?.search),a(r,"status",n?.status),a(r,"filetype",n?.filetype),a(r,"sort_by",n?.sortBy),a(r,"sort_order",n?.sortOrder),a(r,"folder_id",n?.folderId),a(r,"recursive",n?.recursive),a(r,"fields",n?.fields),a(r,"include_sharing_info",n?.includeSharingInfo),t(x("/api/files",r),{method:"GET"},(i)=>ue(i,B))}return{getPersonalFolder(){return t("/api/folders/personal",{method:"GET"},K)},listFolders(n){let r=new URLSearchParams;return a(r,"skip",n?.skip),a(r,"limit",n?.limit),a(r,"name",n?.name),a(r,"folder_type_id",n?.folderTypeId),a(r,"sort_by",n?.sortBy),a(r,"sort_order",n?.sortOrder),t(x("/api/folders",r),{method:"GET"},(i)=>ue(i,K))},listFolderChildren(n,r){let i=new URLSearchParams;return a(i,"skip",r?.skip),a(i,"limit",r?.limit),a(i,"include",r?.include),a(i,"recursive",r?.recursive),a(i,"flat",r?.flat),a(i,"include_sharing_info",r?.includeSharingInfo),a(i,"only_shared_by_me",r?.onlySharedByMe),t(x(`/api/folders/${n}/children`,i),{method:"GET"},ve)},listFiles:o,searchFiles(n,r){return o({...r,search:n})},getFile(n,r){let i=new URLSearchParams;return a(i,"include_sharing_info",r?.includeSharingInfo),t(x(`/api/files/${n}`,i),{method:"GET"},B)},getContent(n,r){let i=new URLSearchParams;return a(i,"expire_hours",r?.expireHours),t(x(`/api/files/${n}/content`,i),{method:"GET"},_e)},upload(n,r){let i=new FormData;if(i.append("file",n,De(n,r)),r?.folderId!==void 0)i.append("folder_id",String(r.folderId));return t("/api/files",{method:"POST",body:i,signal:r?.signal},B)}}}function pe(e,t=e){return Error(`Access denied: ${e} is not permitted. Add '${t}' to your manifest.json permissions.`)}function ke(e){return new Proxy({},{get(t,o){if(typeof o==="symbol")return;throw pe(`${e}.${o}`,e)}})}function xe(e){return new Proxy(e,{get(t,o,n){if(o==="upload")return(...r)=>Promise.reject(pe("documents.upload","documents:upload"));return Reflect.get(t,o,n)}})}function Z(e,t){let o=["auth","api","navigation","theme","toast","storage","events","chat","voice","documents"],n={};for(let r of o)if(t.includes(r))n[r]=r==="documents"&&!t.includes("documents:upload")?xe(e.documents):e[r];else n[r]=ke(r);return n}function j(e){let{appId:t,permissions:o,overrides:n}=e,{data:r}=Te(),i=Pe();return Be(()=>{let s=n?.auth??N({session:r??null}),d={auth:s,api:n?.api??O({getToken:()=>s.getToken()}),navigation:n?.navigation??R({push:(u)=>i.push(u)}),theme:n?.theme??G(),toast:n?.toast??q({toast:Ve}),storage:n?.storage??z(t),events:n?.events??W(t),chat:n?.chat??J({getToken:()=>s.getToken()}),voice:n?.voice??Q(),documents:n?.documents??Y({getToken:()=>s.getToken()})};return Z(d,o)},[r,i,t,o,n])}import{Component as Ce}from"react";class S extends Ce{constructor(e){super(e);this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){this.props.onError?.(e)}render(){if(this.state.error)return this.props.fallback(this.state.error);return this.props.children}}import{jsx as k,Fragment as re}from"react/jsx-runtime";function Fe({manifest:e,src:t,integrity:o,fallback:n,errorFallback:r,adapters:i,onReady:s,onError:d,className:u,style:c}){let p=ee(null),w=ee(null),F=ee(!1),{status:E,error:g}=U(t,e.id,o),l=j({appId:e.id,permissions:e.permissions,overrides:i});if(te(()=>{if(g)d?.(g)},[g,d]),te(()=>{let h=p.current;if(E!=="ready"||!h)return;let y=document.createElement(e.id);if(y.bridge=l,h.appendChild(y),w.current=y,!F.current)F.current=!0,s?.();return()=>{if(h.contains(y))h.removeChild(y);w.current=null}},[E,e.id]),te(()=>{if(w.current)w.current.bridge=l},[l]),E==="error"&&g){if(r)return k(re,{children:r(g)});return null}if(E==="loading")return k(re,{children:n??null});return k("div",{ref:p,className:u,style:c})}function $e(e){let t=Se((o)=>{if(e.onError?.(o),e.errorFallback)return k(re,{children:e.errorFallback(o)});return null},[e.onError,e.errorFallback]);return k(S,{fallback:t,onError:e.onError,children:k(Fe,{...e})})}import{useEffect as Ie}from"react";function Le(e,t){Ie(()=>{return C(e,(o)=>{t(o.payload,o.sourceAppId)})},[e,t])}export{U as useVibeLoader,Le as useVibeEvents,j as useVibeBridge,le as setSharedDependencies,he as setAllowedOrigins,V as getEventBus,Z as filterByPermissions,X as emitEvent,be as createVoiceAdapter,q as createToastAdapter,G as createThemeAdapter,z as createStorageAdapter,Q as createNoopVoiceAdapter,R as createNavigationAdapter,W as createEventsAdapter,Y as createDocumentsAdapter,J as createChatAdapter,N as createAuthAdapter,O as createApiAdapter,$e as VibeHost,S as VibeErrorBoundary};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiworkbench/vibe-bridge",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -25,7 +25,7 @@
25
25
  "dist"
26
26
  ],
27
27
  "dependencies": {
28
- "@aiworkbench/vibe-types": "^0.0.7"
28
+ "@aiworkbench/vibe-types": "^0.0.10"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "react": "^19.0.0",