@react-grab/claude-code 0.0.69 → 0.0.71

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/cli.cjs CHANGED
@@ -111,7 +111,7 @@ var import_picocolors = __toESM(require_picocolors());
111
111
  var DEFAULT_PORT = 4567;
112
112
 
113
113
  // src/cli.ts
114
- var VERSION = "0.0.69";
114
+ var VERSION = "0.0.71";
115
115
  var __filename$1 = url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli.cjs', document.baseURI).href)));
116
116
  var __dirname$1 = path.dirname(__filename$1);
117
117
  var serverPath = path.join(__dirname$1, "server.js");
package/dist/cli.js CHANGED
@@ -108,7 +108,7 @@ var import_picocolors = __toESM(require_picocolors());
108
108
  var DEFAULT_PORT = 4567;
109
109
 
110
110
  // src/cli.ts
111
- var VERSION = "0.0.69";
111
+ var VERSION = "0.0.71";
112
112
  var __filename = fileURLToPath(import.meta.url);
113
113
  var __dirname = dirname(__filename);
114
114
  var serverPath = join(__dirname, "server.js");
package/dist/client.cjs CHANGED
@@ -27,13 +27,27 @@ var parseSSEEvent = (eventBlock) => {
27
27
  }
28
28
  return { eventType, data };
29
29
  };
30
- async function* streamSSE(stream) {
30
+ async function* streamSSE(stream, signal) {
31
31
  const reader = stream.getReader();
32
32
  const decoder = new TextDecoder();
33
33
  let buffer = "";
34
+ let aborted = false;
35
+ const onAbort = () => {
36
+ aborted = true;
37
+ reader.cancel().catch(() => {
38
+ });
39
+ };
40
+ signal.addEventListener("abort", onAbort);
34
41
  try {
42
+ if (signal.aborted) {
43
+ throw new DOMException("Aborted", "AbortError");
44
+ }
35
45
  while (true) {
36
- const { done, value } = await reader.read();
46
+ const result = await reader.read();
47
+ if (aborted || signal.aborted) {
48
+ throw new DOMException("Aborted", "AbortError");
49
+ }
50
+ const { done, value } = result;
37
51
  if (value) buffer += decoder.decode(value, { stream: true });
38
52
  let boundary;
39
53
  while ((boundary = buffer.indexOf("\n\n")) !== -1) {
@@ -49,7 +63,11 @@ async function* streamSSE(stream) {
49
63
  if (done) break;
50
64
  }
51
65
  } finally {
52
- reader.releaseLock();
66
+ signal.removeEventListener("abort", onAbort);
67
+ try {
68
+ reader.releaseLock();
69
+ } catch {
70
+ }
53
71
  }
54
72
  }
55
73
  async function* streamFromServer(serverUrl, context, signal) {
@@ -65,7 +83,7 @@ async function* streamFromServer(serverUrl, context, signal) {
65
83
  if (!response.body) {
66
84
  throw new Error("No response body");
67
85
  }
68
- yield* streamSSE(response.body);
86
+ yield* streamSSE(response.body, signal);
69
87
  }
70
88
  var createClaudeAgentProvider = (providerOptions = {}) => {
71
89
  const { serverUrl = DEFAULT_SERVER_URL, getOptions } = providerOptions;
@@ -1,6 +1,6 @@
1
- var ReactGrabClaudeCode=(function(exports){'use strict';var f=`http://localhost:${4567}`,m="react-grab:agent-sessions",y={systemPrompt:{type:"preset",preset:"claude_code",append:`You are helping a user make changes to a React component based on a selected element.
1
+ var ReactGrabClaudeCode=(function(exports){'use strict';var A=`http://localhost:${4567}`,m="react-grab:agent-sessions",y={systemPrompt:{type:"preset",preset:"claude_code",append:`You are helping a user make changes to a React component based on a selected element.
2
2
  The user has selected an element from their UI and wants you to help modify it.
3
- Provide clear, concise status updates as you work.`},model:"haiku",permissionMode:"bypassPermissions",maxTurns:10},A=n=>{let t="",o="";for(let e of n.split(`
4
- `))e.startsWith("event:")?t=e.slice(6).trim():e.startsWith("data:")&&(o=e.slice(5).trim());return {eventType:t,data:o}};async function*S(n){let t=n.getReader(),o=new TextDecoder,e="";try{for(;;){let{done:s,value:i}=await t.read();i&&(e+=o.decode(i,{stream:!0}));let r;for(;(r=e.indexOf(`
3
+ Provide clear, concise status updates as you work.`},model:"haiku",permissionMode:"bypassPermissions",maxTurns:10},b=r=>{let e="",n="";for(let t of r.split(`
4
+ `))t.startsWith("event:")?e=t.slice(6).trim():t.startsWith("data:")&&(n=t.slice(5).trim());return {eventType:e,data:n}};async function*E(r,e){let n=r.getReader(),t=new TextDecoder,o="",s=false,a=()=>{s=true,n.cancel().catch(()=>{});};e.addEventListener("abort",a);try{if(e.aborted)throw new DOMException("Aborted","AbortError");for(;;){let d=await n.read();if(s||e.aborted)throw new DOMException("Aborted","AbortError");let{done:u,value:c}=d;c&&(o+=t.decode(c,{stream:!0}));let i;for(;(i=o.indexOf(`
5
5
 
6
- `))!==-1;){let{eventType:a,data:c}=A(e.slice(0,r));if(e=e.slice(r+2),a==="done")return;if(a==="error"){console.error("[react-grab]",c||"Agent error");return}c&&(yield c);}if(s)break}}finally{t.releaseLock();}}async function*p(n,t,o){let e=await fetch(`${n}/agent`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:o});if(!e.ok)throw new Error(`Server error: ${e.status}`);if(!e.body)throw new Error("No response body");yield*S(e.body);}var C=(n={})=>{let{serverUrl:t=f,getOptions:o}=n,e=s=>({...y,...o?.()??{},...s??{}});return {send:async function*(s,i){let r={...s,options:e(s.options)};yield*p(t,r,i);},resume:async function*(s,i,r){let a=r.getItem(m);if(!a)throw new Error("No sessions to resume");let d=JSON.parse(a)[s];if(!d)throw new Error(`Session ${s} not found`);let l=d.context,g={...l,options:e(l.options)};yield "Resuming...",yield*p(t,g,i);},supportsResume:true}},E=async()=>{if(typeof window>"u")return;let n=C(),t=window.__REACT_GRAB__;if(t){t.setAgent({provider:n,storage:sessionStorage});return}window.addEventListener("react-grab:init",o=>{o.detail.setAgent({provider:n,storage:sessionStorage});},{once:true});};E();exports.attachAgent=E;exports.createClaudeAgentProvider=C;return exports;})({});
6
+ `))!==-1;){let{eventType:l,data:p}=b(o.slice(0,i));if(o=o.slice(i+2),l==="done")return;if(l==="error"){console.error("[react-grab]",p||"Agent error");return}p&&(yield p);}if(u)break}}finally{e.removeEventListener("abort",a);try{n.releaseLock();}catch{}}}async function*g(r,e,n){let t=await fetch(`${r}/agent`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:n});if(!t.ok)throw new Error(`Server error: ${t.status}`);if(!t.body)throw new Error("No response body");yield*E(t.body,n);}var S=(r={})=>{let{serverUrl:e=A,getOptions:n}=r,t=o=>({...y,...n?.()??{},...o??{}});return {send:async function*(o,s){let a={...o,options:t(o.options)};yield*g(e,a,s);},resume:async function*(o,s,a){let d=a.getItem(m);if(!d)throw new Error("No sessions to resume");let c=JSON.parse(d)[o];if(!c)throw new Error(`Session ${o} not found`);let i=c.context,l={...i,options:t(i.options)};yield "Resuming...",yield*g(e,l,s);},supportsResume:true}},v=async()=>{if(typeof window>"u")return;let r=S(),e=window.__REACT_GRAB__;if(e){e.setAgent({provider:r,storage:sessionStorage});return}window.addEventListener("react-grab:init",n=>{n.detail.setAgent({provider:r,storage:sessionStorage});},{once:true});};v();exports.attachAgent=v;exports.createClaudeAgentProvider=S;return exports;})({});
package/dist/client.js CHANGED
@@ -25,13 +25,27 @@ var parseSSEEvent = (eventBlock) => {
25
25
  }
26
26
  return { eventType, data };
27
27
  };
28
- async function* streamSSE(stream) {
28
+ async function* streamSSE(stream, signal) {
29
29
  const reader = stream.getReader();
30
30
  const decoder = new TextDecoder();
31
31
  let buffer = "";
32
+ let aborted = false;
33
+ const onAbort = () => {
34
+ aborted = true;
35
+ reader.cancel().catch(() => {
36
+ });
37
+ };
38
+ signal.addEventListener("abort", onAbort);
32
39
  try {
40
+ if (signal.aborted) {
41
+ throw new DOMException("Aborted", "AbortError");
42
+ }
33
43
  while (true) {
34
- const { done, value } = await reader.read();
44
+ const result = await reader.read();
45
+ if (aborted || signal.aborted) {
46
+ throw new DOMException("Aborted", "AbortError");
47
+ }
48
+ const { done, value } = result;
35
49
  if (value) buffer += decoder.decode(value, { stream: true });
36
50
  let boundary;
37
51
  while ((boundary = buffer.indexOf("\n\n")) !== -1) {
@@ -47,7 +61,11 @@ async function* streamSSE(stream) {
47
61
  if (done) break;
48
62
  }
49
63
  } finally {
50
- reader.releaseLock();
64
+ signal.removeEventListener("abort", onAbort);
65
+ try {
66
+ reader.releaseLock();
67
+ } catch {
68
+ }
51
69
  }
52
70
  }
53
71
  async function* streamFromServer(serverUrl, context, signal) {
@@ -63,7 +81,7 @@ async function* streamFromServer(serverUrl, context, signal) {
63
81
  if (!response.body) {
64
82
  throw new Error("No response body");
65
83
  }
66
- yield* streamSSE(response.body);
84
+ yield* streamSSE(response.body, signal);
67
85
  }
68
86
  var createClaudeAgentProvider = (providerOptions = {}) => {
69
87
  const { serverUrl = DEFAULT_SERVER_URL, getOptions } = providerOptions;
package/dist/server.cjs CHANGED
@@ -14696,7 +14696,7 @@ function query({
14696
14696
  var DEFAULT_PORT = 4567;
14697
14697
 
14698
14698
  // src/server.ts
14699
- var VERSION = "0.0.69";
14699
+ var VERSION = "0.0.71";
14700
14700
  var isTextBlock = (block) => block.type === "text";
14701
14701
  var createServer = () => {
14702
14702
  const app = new Hono2();
@@ -14709,7 +14709,7 @@ var createServer = () => {
14709
14709
  ${content}`;
14710
14710
  return streamSSE(context, async (stream2) => {
14711
14711
  try {
14712
- await stream2.writeSSE({ data: "Please wait...", event: "status" });
14712
+ await stream2.writeSSE({ data: "Thinking...", event: "status" });
14713
14713
  const queryResult = query({
14714
14714
  prompt: fullPrompt,
14715
14715
  options: {
package/dist/server.js CHANGED
@@ -14670,7 +14670,7 @@ function query({
14670
14670
  var DEFAULT_PORT = 4567;
14671
14671
 
14672
14672
  // src/server.ts
14673
- var VERSION = "0.0.69";
14673
+ var VERSION = "0.0.71";
14674
14674
  var isTextBlock = (block) => block.type === "text";
14675
14675
  var createServer = () => {
14676
14676
  const app = new Hono2();
@@ -14683,7 +14683,7 @@ var createServer = () => {
14683
14683
  ${content}`;
14684
14684
  return streamSSE(context, async (stream2) => {
14685
14685
  try {
14686
- await stream2.writeSSE({ data: "Please wait...", event: "status" });
14686
+ await stream2.writeSSE({ data: "Thinking...", event: "status" });
14687
14687
  const queryResult = query({
14688
14688
  prompt: fullPrompt,
14689
14689
  options: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-grab/claude-code",
3
- "version": "0.0.69",
3
+ "version": "0.0.71",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "react-grab-claude-code": "./dist/cli.js"
@@ -31,7 +31,7 @@
31
31
  "@hono/node-server": "^1.19.6",
32
32
  "hono": "^4.0.0",
33
33
  "picocolors": "^1.1.1",
34
- "react-grab": "0.0.69"
34
+ "react-grab": "0.0.71"
35
35
  },
36
36
  "scripts": {
37
37
  "dev": "tsup --watch",