@01.works/visual-review 0.12.0 → 0.14.0

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.
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { InstallVisualReviewOptions } from './index.js';
1
+ import type { InstallVisualReviewOptions, VisualReviewAgentBridge } from './index.js';
2
2
 
3
3
  export interface VisualReviewProps extends InstallVisualReviewOptions {
4
- onReady?: (widget: HTMLElement) => void;
4
+ onReady?: (widget: VisualReviewAgentBridge) => void;
5
5
  }
6
6
 
7
7
  /** React lifecycle adapter. It renders no host markup. */
package/dist/react.js CHANGED
@@ -1 +1 @@
1
- import{t as e}from"./install-CxzNo7RN.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,cursorChat:a,enabled:o,navigateToFeedback:s,offset:c,onError:l,onInactive:u,onReady:d,pageIdentity:f,position:p,runtime:m,serviceUrl:h,sourceContextResolver:g,styleNonce:_}){let v=n(l),y=n(u),b=n(d),x=n(null),S=i?.buildId,C=i?.gitCommit,w=i?.generatedAt,T=i?.mode;return v.current=l,y.current=u,b.current=d,t(()=>{if(o===!1)return;let t=e({activationParam:r,build:S===void 0&&C===void 0&&w===void 0&&T===void 0?void 0:{buildId:S,gitCommit:C,generatedAt:w,mode:T},cursorChat:a,enabled:o,navigateToFeedback:s,offset:c,onError:e=>v.current?.(e),onInactive:e=>{let t=`${e.reason}\n${e.origin}`;x.current!==t&&(x.current=t,y.current?.(e))},onReady:e=>{x.current=null,b.current?.(e)},pageIdentity:f,runtime:m,position:p,serviceUrl:h,sourceContextResolver:g,styleNonce:_});return()=>t.dispose()},[r,S,T,a,o,w,C,s,c?.x,c?.y,f,p,m,h,g,_]),null}r.displayName=`VisualReview`;export{r as VisualReview};
1
+ import{t as e}from"./install-DAqwiYRg.js";import{useEffect as t,useRef as n}from"react";function r({activationParam:r,build:i,cursorChat:a,developerTools:o,enabled:s,navigateToFeedback:c,offset:l,onError:u,onInactive:d,onReady:f,pageIdentity:p,position:m,runtime:h,serviceUrl:g,sourceContextResolver:_,styleNonce:v}){let y=n(u),b=n(d),x=n(f),S=n(null),C=i?.buildId,w=i?.gitCommit,T=i?.generatedAt,E=i?.mode,D=o?.codeContextCopy===!0,O=o?.reactGrab===!0;return y.current=u,b.current=d,x.current=f,t(()=>{if(s===!1)return;let t=e({activationParam:r,build:C===void 0&&w===void 0&&T===void 0&&E===void 0?void 0:{buildId:C,gitCommit:w,generatedAt:T,mode:E},cursorChat:a,developerTools:D||O?{codeContextCopy:D,reactGrab:O}:void 0,enabled:s,navigateToFeedback:c,offset:l,onError:e=>y.current?.(e),onInactive:e=>{let t=`${e.reason}\n${e.origin}`;S.current!==t&&(S.current=t,b.current?.(e))},onReady:e=>{S.current=null,x.current?.(e)},pageIdentity:p,runtime:h,position:m,serviceUrl:g,sourceContextResolver:_,styleNonce:v});return()=>t.dispose()},[r,C,E,a,D,s,T,w,O,c,l?.x,l?.y,p,m,h,g,_,v]),null}r.displayName=`VisualReview`;export{r as VisualReview};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n}from"./src-IC5X3zme.js";const r=Symbol.for(`functionName`),i=Symbol.for(`toReferencePath`);function a(e){return e[i]??null}function o(e){return e.startsWith(`function://`)}function s(e){let t;if(typeof e==`string`)t=o(e)?{functionHandle:e}:{name:e};else if(e[r])t={name:e[r]};else{let n=a(e);if(!n)throw Error(`${e} is not a functionReference`);t={reference:n}}return t}function c(e){let t=s(e);if(t.name===void 0)throw t.functionHandle===void 0?t.reference===void 0?Error(`Expected function reference like "api.file.func" or "internal.file.func", but received ${JSON.stringify(t)}`):Error(`Expected function reference in the current component like "api.file.func" or "internal.file.func", but received reference ${t.reference}`):Error(`Expected function reference like "api.file.func" or "internal.file.func", but received function handle ${t.functionHandle}`);if(typeof e==`string`)return e;let n=e[r];if(!n)throw Error(`${e} is not a functionReference`);return n}function l(e){return{[r]:e}}function u(e=[]){return new Proxy({},{get(t,n){if(typeof n==`string`)return u([...e,n]);if(n===r){if(e.length<2){let t=[`api`,...e].join(`.`);throw Error(`API path is expected to be of the form \`api.moduleName.functionName\`. Found: \`${t}\``)}let t=e.slice(0,-1).join(`/`),n=e[e.length-1];return n==="default"?t:t+`:`+n}else if(n===Symbol.toStringTag)return`FunctionReference`;else return}})}u();const d=Object.freeze({resolveSession:l(`reviews:resolveSession`),pageSnapshot:l(`reviews:pageSnapshot`),projectSnapshot:l(`reviews:projectSnapshot`),createComment:l(`reviews:createComment`),createReply:l(`reviews:createReply`),moveCommentPin:l(`reviews:moveCommentPin`),presenceList:l(`presence:list`),presenceUpdate:l(`presence:update`),presenceDisconnect:l(`presence:disconnect`),screenshotUploadUrl:l(`screenshots:generateUploadUrl`),screenshotCommit:l(`screenshots:commitUpload`),screenshotDiscard:l(`screenshots:discardUpload`)});Object.freeze({catalog:l(`owners:catalog`),listProjects:l(`owners:listProjects`),projectOverview:l(`owners:projectOverview`),feedbackPage:l(`owners:feedbackPage`),createProject:l(`owners:createProject`),createProjectWithOrigins:l(`owners:createProjectWithOrigins`),configureProjectLinkAccess:l(`owners:configureProjectLinkAccess`),deleteProject:l(`owners:deleteProject`),addOrigin:l(`owners:addOrigin`),removeOrigin:l(`owners:removeOrigin`),replaceOrigins:l(`owners:replaceOrigins`),createPage:l(`owners:createPage`),deletePage:l(`owners:deletePage`),upsertPageBuild:l(`owners:upsertPageBuild`),createInvitation:l(`owners:createInvitation`),revokeInvitation:l(`owners:revokeInvitation`),revokeReviewerAccess:l(`owners:revokeReviewerAccess`),setCommentStatus:l(`owners:setCommentStatus`),createReply:l(`owners:createReply`),deleteComment:l(`owners:deleteComment`),deleteReply:l(`owners:deleteReply`),screenshotDownload:l(`screenshots:ownerDownload`)});var f=class{client;session;#e;#t;#n;constructor(e,t,n){this.client=e,this.session=t,this.#e=_(n.invitationId??t.invitationId,`invitationId`),this.#t=v(n.origin),this.#n=n.fetch??globalThis.fetch.bind(globalThis)}async attachScreenshot(e,t,n){_(e,`pageId`);let r=_(t,`commentId`);if(n.bytes.byteLength===0||n.bytes.byteLength>15e5)throw Error(`Screenshot size is invalid`);let i=await this.client.mutation(d.screenshotUploadUrl,{...this.#r(),commentId:r}),a=await this.#n(i.uploadUrl,{method:`POST`,headers:{"content-type":n.contentType},body:p(n.bytes)});if(!a.ok)throw Error(`Screenshot upload failed`);let o=await a.json();if(typeof o.storageId!=`string`||!o.storageId)throw Error(`Screenshot upload returned an invalid storage ID`);try{await this.client.mutation(d.screenshotCommit,{...this.#r(),commentId:r,grantId:i.grantId,storageId:o.storageId,contentType:n.contentType,width:n.width,height:n.height})}catch(e){throw await this.client.mutation(d.screenshotDiscard,{...this.#r(),commentId:r,grantId:i.grantId,storageId:o.storageId}).catch(()=>void 0),e}}async getSnapshot(e){return g(await this.client.query(d.pageSnapshot,{...this.#r(),pageId:_(e,`pageId`)}))}async moveCommentPin(e,t,n,r){return this.client.mutation(d.moveCommentPin,{...this.#r(),pageId:_(e,`pageId`),commentId:_(t,`commentId`),anchorJson:JSON.stringify(n),expectedRevision:r})}async getProjectSnapshot(e){return this.#i(e),structuredClone(await this.client.query(d.projectSnapshot,{...this.#r(),projectId:e}))}subscribe(e,t,n){return this.client.onUpdate(d.pageSnapshot,{...this.#r(),pageId:_(e,`pageId`)},e=>t(g(e)),e=>n?.(m(e)))}subscribeProject(e,t,n){return this.#i(e),this.client.onUpdate(d.projectSnapshot,{...this.#r(),projectId:e},e=>t(structuredClone(e)),e=>n?.(m(e)))}async mutate(r,i){switch(i.type){case`comment.upsert`:{let a=i.comment;if(a.pageId!==r)throw Error(`Comment page mismatch`);if(a.authorId!==this.session.reviewerId)throw Error(`Comment author mismatch`);if(a.status!==`open`||a.resolvedAt!==void 0||a.resolvedById!==void 0||a.createdAt!==a.updatedAt)throw Error(`Only new open comments can be created by a reviewer`);let o=n(a.body).trim(),s=t(a.target),c=a.scope===void 0?void 0:e(a.scope);await this.client.mutation(d.createComment,{...this.#r(),pageId:r,commentId:a.id,body:o,targetJson:JSON.stringify(s.publicTarget),sourceContextJson:s.sourceContextJson,...a.authorKind===void 0?{}:{authorKind:a.authorKind},...c===void 0?{}:{scopeJson:JSON.stringify(c)}});return}case`reply.upsert`:{let e=i.reply;if(e.authorId!==this.session.reviewerId)throw Error(`Reply author mismatch`);if(e.createdAt!==e.updatedAt)throw Error(`Reply edits require an owner command`);await this.client.mutation(d.createReply,{...this.#r(),commentId:e.commentId,replyId:e.id,body:n(e.body,`Reply body`).trim(),...i.requestReopen?{requestReopen:!0}:{}});return}case`comment.delete`:throw Error(`Comment deletion requires an owner command`);case`reply.delete`:throw Error(`Reply deletion requires an owner command`)}}#r(){return{invitationId:this.#e,origin:this.#t}}#i(e){if(!e.trim()||e!==this.session.projectId)throw Error(`Project does not belong to the reviewer session`)}};function p(e){let t=new Uint8Array(e.byteLength);return t.set(e),t.buffer}function m(e){let t=h(e);return t===`UNAUTHENTICATED`||t===`INVITATION_EXPIRED`?{type:`access-lost`,code:`session-expired`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`INVITATION_REVOKED`||t===`MEMBERSHIP_REVOKED`?{type:`access-lost`,code:`membership-revoked`,recovery:`reauthenticate`,clearSnapshot:!0}:t===`ORIGIN_MISMATCH`||t===`ORIGIN_NOT_ALLOWED`||t===`INVITATION_REQUIRED`?{type:`access-lost`,code:`permission-denied`,recovery:`reauthenticate`,clearSnapshot:!0}:{type:`error`,code:e instanceof Error?`transport`:`unknown`,recovery:`retry`,clearSnapshot:!0}}function h(e){if(!e||typeof e!=`object`)return;let t=e.data;if(typeof t==`string`)return t;if(t&&typeof t==`object`){let e=t.code;if(typeof e==`string`)return e}}function g(e){return structuredClone(e)}function _(e,t){let n=e.trim();if(!n)throw Error(`${t} is required`);return n}function v(e){let t=_(e,`origin`);try{let e=new URL(t);if(e.origin!==t)throw Error();return e.origin}catch{throw Error(`A valid browser origin is required`)}}export{c as i,m as n,d as r,f as t};
@@ -4,6 +4,7 @@ import MagicString from "magic-string";
4
4
  //#region src/source-instrumentation-transform.ts
5
5
  const VISUAL_REVIEW_EMBEDDED_SOURCE_ATTRIBUTE = "data-review-source";
6
6
  const SOURCE_MODULE = /\.(?:[cm]?[jt]sx?)$/iu;
7
+ const warnedParseFailures = /* @__PURE__ */ new Set();
7
8
  /**
8
9
  * Directory names a build emits into. Matching the name wherever it appeared
9
10
  * skipped `src/build/Pipeline.tsx` and `app/build/page.tsx`, which left the
@@ -38,12 +39,21 @@ const SOURCE_ROOT_SEGMENTS = /* @__PURE__ */ new Set([
38
39
  function instrumentVisualReviewSource(source, options) {
39
40
  const sourcePath = normalizedProjectSourcePath(options.projectRoot, options.id);
40
41
  if (!sourcePath) return null;
41
- const ast = parse(source, {
42
- errorRecovery: false,
43
- plugins: parserPlugins(sourcePath),
44
- sourceFilename: sourcePath,
45
- sourceType: "unambiguous"
46
- });
42
+ let ast;
43
+ try {
44
+ ast = parse(source, {
45
+ errorRecovery: false,
46
+ plugins: parserPlugins(sourcePath),
47
+ sourceFilename: sourcePath,
48
+ sourceType: "unambiguous"
49
+ });
50
+ } catch {
51
+ if (!warnedParseFailures.has(sourcePath)) {
52
+ warnedParseFailures.add(sourcePath);
53
+ console.warn(`[VisualReview] Source metadata skipped for ${sourcePath}: unsupported syntax.`);
54
+ }
55
+ return null;
56
+ }
47
57
  const edits = new MagicString(source);
48
58
  let markerCount = 0;
49
59
  const candidates = [];
@@ -1,4 +1,4 @@
1
- import { n as isVisualReviewProjectSource, t as instrumentVisualReviewSource } from "./source-instrumentation-transform-B23vB7l6.js";
1
+ import { n as isVisualReviewProjectSource, t as instrumentVisualReviewSource } from "./source-instrumentation-transform-7yivYljc.js";
2
2
  import { transformSync } from "@babel/core";
3
3
  import transformReactJsx from "@babel/plugin-transform-react-jsx";
4
4
  import transformTypeScript from "@babel/plugin-transform-typescript";
@@ -0,0 +1 @@
1
+ import{t as e}from"./source-origin-BNA5RIlJ.js";const t=131072,n=4096,r=1e3;var i=class extends Error{constructor(e,t){super(e,t),this.name=`InstantCaptureIntegrityError`}};function a(e){let n=d(e,`comment target`,!0),r={kind:n.kind,anchor:b(n.anchor),region:S(n.region),elements:n.elements.map(e=>({selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,rect:S(e.rect),source:null,componentStack:[]})),pageUrl:n.pageUrl,pageTitle:n.pageTitle,capturedAt:n.capturedAt,...n.environment?{environment:p(n.environment)}:{}},i={elements:n.elements.map(e=>({selector:e.selector,source:e.source?C(e.source):null,componentStack:e.componentStack.map(C)})),...n.sourceProvenance?{sourceProvenance:w(n.sourceProvenance)}:{}};I(r,t,`Public target`);let a=L(i,65536,`Source context`);return{publicTarget:r,commentFields:o(r),targetElements:r.elements.map(s),sourceContextJson:a}}function o(e){let t=new URL(e.pageUrl);return{anchorSelector:e.anchor.selector,anchorOffsetX:e.anchor.offsetX,anchorOffsetY:e.anchor.offsetY,anchorViewportX:e.anchor.viewportX,anchorViewportY:e.anchor.viewportY,targetKind:e.kind,targetPageX:e.region.pageX,targetPageY:e.region.pageY,targetWidth:e.region.width,targetHeight:e.region.height,targetViewportX:e.region.viewportX,targetViewportY:e.region.viewportY,targetViewportWidth:e.region.viewportWidth,targetViewportHeight:e.region.viewportHeight,targetPageOrigin:t.origin,targetPagePathname:x(t.pathname),targetPageSearch:t.search.slice(1),targetPageHash:t.hash.slice(1),targetPageTitle:e.pageTitle,targetCapturedAt:e.capturedAt,...e.environment?{environmentBrowser:e.environment.browser,environmentOperatingSystem:e.environment.operatingSystem,environmentDeviceType:e.environment.deviceType,environmentScreenWidth:e.environment.screenWidth,environmentScreenHeight:e.environment.screenHeight,environmentDevicePixelRatio:e.environment.devicePixelRatio}:{}}}function s(e,t){return{ordinal:t,selector:e.selector,tagName:e.tagName,textPreview:e.textPreview,pageX:e.rect.pageX,pageY:e.rect.pageY,width:e.rect.width,height:e.rect.height,viewportX:e.rect.viewportX,viewportY:e.rect.viewportY,viewportWidth:e.rect.viewportWidth,viewportHeight:e.rect.viewportHeight}}function c(e,t){return d(e,t,!1)}function l(e,t=`Comment body`){return A(e,t,2e4)}function u(e){if(e==null)return;let t=E(e,`Comment scope`);if(Object.keys(t).length>20)throw R(`Comment scope has too many fields`);let n={};for(let[e,i]of Object.entries(t)){if(!e.trim()||e.length>256)throw R(`Comment scope has an invalid key`);if(typeof i==`string`){if(i.length>r)throw R(`Comment scope ${e} is too long`);n[e]=i}else if(typeof i==`number`)n[e]=j(i,`Comment scope ${e}`);else if(typeof i==`boolean`||i===null)n[e]=i;else throw R(`Comment scope ${e} is invalid`)}return I(n,32768,`Comment scope`),n}function d(e,n,i){let a=T(e,n,[`kind`,`anchor`,`region`,`elements`,`pageUrl`,`pageTitle`,`capturedAt`,`environment`,`sourceProvenance`],[`environment`,`sourceProvenance`]),o=a.kind;if(o!==`element`&&o!==`region`&&o!==`viewport`)throw R(`${n} kind is invalid`);let s=D(a.elements,`${n} elements`);if(s.length>8)throw R(`${n} contains too many elements`);if(!i&&a.sourceProvenance!=null)throw R(`${n} exposes source provenance`);let c=A(a.pageUrl,`${n} pageUrl`,8192);F(c,`${n} pageUrl`);let l={kind:o,anchor:g(a.anchor,`${n} anchor`),region:_(a.region,`${n} region`),elements:s.map((e,t)=>h(e,`${n} elements[${t}]`,i)),pageUrl:c,pageTitle:O(a.pageTitle,`${n} pageTitle`,r),capturedAt:N(a.capturedAt,`${n} capturedAt`),...a.environment==null?{}:{environment:f(a.environment,`${n} environment`)},...i&&a.sourceProvenance!=null?{sourceProvenance:y(a.sourceProvenance,`${n} provenance`)}:{}};return I(l,i?196608:t,n),l}function f(e,t){let n=T(e,t,[`browser`,`operatingSystem`,`deviceType`,`screenWidth`,`screenHeight`,`devicePixelRatio`]),r=n.deviceType;if(r!==`desktop`&&r!==`tablet`&&r!==`mobile`&&r!==`unknown`)throw R(`${t} deviceType is invalid`);return{browser:A(n.browser,`${t} browser`,120),operatingSystem:A(n.operatingSystem,`${t} operatingSystem`,120),deviceType:r,screenWidth:m(n.screenWidth,`${t} screenWidth`,1e5),screenHeight:m(n.screenHeight,`${t} screenHeight`,1e5),devicePixelRatio:m(n.devicePixelRatio,`${t} devicePixelRatio`,100)}}function p(e){return{...e}}function m(e,t,n){let r=j(e,t);if(r<=0||r>n)throw R(`${t} is invalid`);return r}function h(e,t,i){let a=T(e,t,[`selector`,`tagName`,`textPreview`,`rect`,`source`,`componentStack`]),o=D(a.componentStack,`${t} componentStack`);if(o.length>32)throw R(`${t} componentStack is too large`);if(!i&&(a.source!=null||o.length>0))throw R(`${t} exposes source metadata`);return{selector:A(a.selector,`${t} selector`,n),tagName:A(a.tagName,`${t} tagName`,128),textPreview:O(a.textPreview,`${t} textPreview`,r),rect:_(a.rect,`${t} rect`),source:i&&a.source!=null?v(a.source,`${t} source`):null,componentStack:i?o.map((e,n)=>v(e,`${t} stack[${n}]`)):[]}}function g(e,t){let r=T(e,t,[`selector`,`offsetX`,`offsetY`,`viewportX`,`viewportY`]);return{selector:O(r.selector,`${t} selector`,n),offsetX:M(r.offsetX,`${t} offsetX`),offsetY:M(r.offsetY,`${t} offsetY`),viewportX:M(r.viewportX,`${t} viewportX`),viewportY:M(r.viewportY,`${t} viewportY`)}}function _(e,t){let n=T(e,t,[`pageX`,`pageY`,`width`,`height`,`viewportX`,`viewportY`,`viewportWidth`,`viewportHeight`]),r={pageX:j(n.pageX,`${t} pageX`),pageY:j(n.pageY,`${t} pageY`),width:j(n.width,`${t} width`),height:j(n.height,`${t} height`),viewportX:j(n.viewportX,`${t} viewportX`),viewportY:j(n.viewportY,`${t} viewportY`),viewportWidth:j(n.viewportWidth,`${t} viewportWidth`),viewportHeight:j(n.viewportHeight,`${t} viewportHeight`)};if(r.width<0||r.height<0||r.viewportWidth<0||r.viewportHeight<0)throw R(`${t} has a negative dimension`);return r}function v(t,r){let i=T(t,r,[`filePath`,`lineNumber`,`columnNumber`,`componentName`,`origin`,`generated`],[`generated`]),a=i.origin;if(a!==`app`&&a!==`shared-ui`&&a!==`dependency`&&a!==`generated`&&a!==`unknown`)throw R(`${r} origin is invalid`);let o=A(i.filePath,`${r} filePath`,n);return{filePath:o,lineNumber:P(i.lineNumber,`${r} lineNumber`),columnNumber:P(i.columnNumber,`${r} columnNumber`),componentName:i.componentName==null?null:A(i.componentName,`${r} componentName`,512),origin:e(o)}}function y(e,t){let n=T(e,t,[`provider`,`build`,`resolvedAt`]),r=n.provider;if(r!==`react-grab`&&r!==`embedded`&&r!==`custom`)throw R(`${t} provider is invalid`);let i=T(n.build,`${t} build`,[`buildId`,`gitCommit`,`generatedAt`,`mode`],[`generatedAt`]),a=i.mode;if(a!==`development`&&a!==`preview`&&a!==`production`)throw R(`${t} build mode is invalid`);return{provider:r,build:{buildId:A(i.buildId,`${t} buildId`,512),gitCommit:i.gitCommit==null?null:A(i.gitCommit,`${t} gitCommit`,256),...i.generatedAt==null?{}:{generatedAt:N(i.generatedAt,`${t} generatedAt`)},mode:a},resolvedAt:N(n.resolvedAt,`${t} resolvedAt`)}}function b(e){return{...e}}function x(e){return e.replace(/\/+$/,``)||`/`}function S(e){return{...e}}function C(e){return{...e}}function w(e){return{...e,build:{...e.build}}}function T(e,t,n,r=[]){let i=E(e,t);if(Object.keys(i).some(e=>!n.includes(e)))throw R(`${t} contains unknown fields`);for(let e of n)if(!r.includes(e)&&!Object.hasOwn(i,e))throw R(`${t} is missing ${e}`);return i}function E(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw R(`${t} is missing or invalid`);return e}function D(e,t){if(!Array.isArray(e))throw R(`${t} is missing or invalid`);return e}function O(e,t,n){if(typeof e!=`string`||k(e,n)>n)throw R(`${t} is invalid or too long`);return e}function k(e,t){let n=0;for(let r of e)if(n+=1,n>t)return n;return n}function A(e,t,n){let r=O(e,t,n);if(!r.trim())throw R(`${t} is empty`);return r}function j(e,t){if(typeof e!=`number`||!Number.isFinite(e))throw R(`${t} is invalid`);return e}function M(e,t){let n=j(e,t);if(n<0||n>1)throw R(`${t} is outside 0..1`);return n}function N(e,t){if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0||e>0xe677d21fdbff)throw R(`${t} is invalid`);return e}function P(e,t){if(e===null)return null;if(typeof e!=`number`||!Number.isSafeInteger(e)||e<0)throw R(`${t} is invalid`);return e}function F(e,t){let n;try{n=new URL(e)}catch(e){throw R(`${t} is invalid`,e)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw R(`${t} must use HTTP or HTTPS`)}function I(e,t,n){L(e,t,n)}function L(e,t,n){let r;try{r=JSON.stringify(e)}catch(e){throw R(`${n} cannot be serialized`,e)}if(r.length>t)throw R(`${n} is too large`);return r}function R(e,t){return new i(e,{cause:t instanceof Error?t:void 0})}export{u as i,a as n,l as r,c as t};
package/dist/vite.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { t as resolveVisualReviewBuildIdentity } from "./build-identity-DebYe8Qe.js";
2
- import { t as instrumentVisualReviewSource } from "./source-instrumentation-transform-B23vB7l6.js";
2
+ import { t as instrumentVisualReviewSource } from "./source-instrumentation-transform-7yivYljc.js";
3
3
  //#region src/vite.ts
4
4
  const BUILD_ID_LITERAL = "process.env.VISUAL_REVIEW_PUBLIC_BUILD_ID";
5
5
  const GIT_COMMIT_LITERAL = "process.env.VISUAL_REVIEW_PUBLIC_GIT_COMMIT";
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@01.works/visual-review",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Invitation-only visual feedback for staging websites, hosted by 01.works.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/01works/visual-review.git",
7
+ "url": "git+https://github.com/01-office/visual-review.git",
8
8
  "directory": "packages/review-client"
9
9
  },
10
+ "homepage": "https://github.com/01-office/visual-review#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/01-office/visual-review/issues"
13
+ },
10
14
  "license": "UNLICENSED",
11
15
  "type": "module",
12
16
  "sideEffects": false,
@@ -18,7 +22,8 @@
18
22
  "LICENSES"
19
23
  ],
20
24
  "bin": {
21
- "visual-review": "./dist/cli.js"
25
+ "visual-review": "./dist/cli.js",
26
+ "visual-review-mcp": "./dist/mcp.js"
22
27
  },
23
28
  "types": "./dist/index.d.ts",
24
29
  "module": "./dist/index.js",
@@ -57,7 +62,7 @@
57
62
  "node": ">=18.18"
58
63
  },
59
64
  "peerDependencies": {
60
- "next": ">=15.5.0",
65
+ "next": ">=15.5.0 <17",
61
66
  "react": ">=18.2.0",
62
67
  "vite": ">=5.0.0"
63
68
  },
@@ -73,6 +78,7 @@
73
78
  }
74
79
  },
75
80
  "devDependencies": {
81
+ "@01.works/visual-review-mcp": "0.0.0",
76
82
  "@agency-review/convex-adapter": "0.0.0",
77
83
  "@agency-review/review-agent": "0.0.0",
78
84
  "@agency-review/review-widget": "0.0.0",
@@ -90,7 +96,6 @@
90
96
  "@babel/parser": "^7.28.5",
91
97
  "@babel/plugin-transform-react-jsx": "^7.27.1",
92
98
  "@babel/plugin-transform-typescript": "^7.28.5",
93
- "@instantdb/core": "^1.0.52",
94
99
  "magic-string": "^0.30.21"
95
100
  }
96
101
  }