@react-grab/claude-code 0.0.70 → 0.0.72
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 +1 -1
- package/dist/cli.js +1 -1
- package/dist/client.cjs +40 -5
- package/dist/client.global.js +4 -4
- package/dist/client.js +40 -5
- package/dist/server.cjs +2 -2
- package/dist/server.js +2 -2
- package/package.json +2 -2
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.
|
|
114
|
+
var VERSION = "0.0.72";
|
|
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.
|
|
111
|
+
var VERSION = "0.0.72";
|
|
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
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/constants.ts
|
|
4
4
|
var DEFAULT_PORT = 4567;
|
|
5
|
+
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
5
6
|
|
|
6
7
|
// src/client.ts
|
|
7
8
|
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
@@ -27,13 +28,27 @@ var parseSSEEvent = (eventBlock) => {
|
|
|
27
28
|
}
|
|
28
29
|
return { eventType, data };
|
|
29
30
|
};
|
|
30
|
-
async function* streamSSE(stream) {
|
|
31
|
+
async function* streamSSE(stream, signal) {
|
|
31
32
|
const reader = stream.getReader();
|
|
32
33
|
const decoder = new TextDecoder();
|
|
33
34
|
let buffer = "";
|
|
35
|
+
let aborted = false;
|
|
36
|
+
const onAbort = () => {
|
|
37
|
+
aborted = true;
|
|
38
|
+
reader.cancel().catch(() => {
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
signal.addEventListener("abort", onAbort);
|
|
34
42
|
try {
|
|
43
|
+
if (signal.aborted) {
|
|
44
|
+
throw new DOMException("Aborted", "AbortError");
|
|
45
|
+
}
|
|
35
46
|
while (true) {
|
|
36
|
-
const
|
|
47
|
+
const result = await reader.read();
|
|
48
|
+
if (aborted || signal.aborted) {
|
|
49
|
+
throw new DOMException("Aborted", "AbortError");
|
|
50
|
+
}
|
|
51
|
+
const { done, value } = result;
|
|
37
52
|
if (value) buffer += decoder.decode(value, { stream: true });
|
|
38
53
|
let boundary;
|
|
39
54
|
while ((boundary = buffer.indexOf("\n\n")) !== -1) {
|
|
@@ -49,7 +64,11 @@ async function* streamSSE(stream) {
|
|
|
49
64
|
if (done) break;
|
|
50
65
|
}
|
|
51
66
|
} finally {
|
|
52
|
-
|
|
67
|
+
signal.removeEventListener("abort", onAbort);
|
|
68
|
+
try {
|
|
69
|
+
reader.releaseLock();
|
|
70
|
+
} catch {
|
|
71
|
+
}
|
|
53
72
|
}
|
|
54
73
|
}
|
|
55
74
|
async function* streamFromServer(serverUrl, context, signal) {
|
|
@@ -65,10 +84,11 @@ async function* streamFromServer(serverUrl, context, signal) {
|
|
|
65
84
|
if (!response.body) {
|
|
66
85
|
throw new Error("No response body");
|
|
67
86
|
}
|
|
68
|
-
yield* streamSSE(response.body);
|
|
87
|
+
yield* streamSSE(response.body, signal);
|
|
69
88
|
}
|
|
70
89
|
var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
71
90
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = providerOptions;
|
|
91
|
+
let connectionCache = null;
|
|
72
92
|
const mergeOptions = (contextOptions) => ({
|
|
73
93
|
...DEFAULT_OPTIONS,
|
|
74
94
|
...getOptions?.() ?? {},
|
|
@@ -100,7 +120,22 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
100
120
|
yield "Resuming...";
|
|
101
121
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
102
122
|
},
|
|
103
|
-
supportsResume: true
|
|
123
|
+
supportsResume: true,
|
|
124
|
+
checkConnection: async () => {
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
if (connectionCache && now - connectionCache.timestamp < CONNECTION_CHECK_TTL_MS) {
|
|
127
|
+
return connectionCache.result;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const response = await fetch(`${serverUrl}/health`, { method: "GET" });
|
|
131
|
+
const result = response.ok;
|
|
132
|
+
connectionCache = { result, timestamp: now };
|
|
133
|
+
return result;
|
|
134
|
+
} catch {
|
|
135
|
+
connectionCache = { result: false, timestamp: now };
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
104
139
|
};
|
|
105
140
|
};
|
|
106
141
|
var attachAgent = async () => {
|
package/dist/client.global.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
var ReactGrabClaudeCode=(function(exports){'use strict';var
|
|
1
|
+
var ReactGrabClaudeCode=(function(exports){'use strict';var A=`http://localhost:${4567}`,y="react-grab:agent-sessions",E={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},
|
|
4
|
-
`))e.startsWith("event:")?t=e.slice(6).trim():e.startsWith("data:")&&(o=e.slice(5).trim());return {eventType:t,data:o}};async function*
|
|
3
|
+
Provide clear, concise status updates as you work.`},model:"haiku",permissionMode:"bypassPermissions",maxTurns:10},C=r=>{let t="",o="";for(let e of r.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*b(r,t){let o=r.getReader(),e=new TextDecoder,s="",n=false,i=()=>{n=true,o.cancel().catch(()=>{});};t.addEventListener("abort",i);try{if(t.aborted)throw new DOMException("Aborted","AbortError");for(;;){let a=await o.read();if(n||t.aborted)throw new DOMException("Aborted","AbortError");let{done:p,value:u}=a;u&&(s+=e.decode(u,{stream:!0}));let c;for(;(c=s.indexOf(`
|
|
5
5
|
|
|
6
|
-
`))!==-1;){let{eventType:
|
|
6
|
+
`))!==-1;){let{eventType:d,data:l}=C(s.slice(0,c));if(s=s.slice(c+2),d==="done")return;if(d==="error"){console.error("[react-grab]",l||"Agent error");return}l&&(yield l);}if(p)break}}finally{t.removeEventListener("abort",i);try{o.releaseLock();}catch{}}}async function*g(r,t,o){let e=await fetch(`${r}/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*b(e.body,o);}var h=(r={})=>{let{serverUrl:t=A,getOptions:o}=r,e=null,s=n=>({...E,...o?.()??{},...n??{}});return {send:async function*(n,i){let a={...n,options:s(n.options)};yield*g(t,a,i);},resume:async function*(n,i,a){let p=a.getItem(y);if(!p)throw new Error("No sessions to resume");let c=JSON.parse(p)[n];if(!c)throw new Error(`Session ${n} not found`);let d=c.context,l={...d,options:s(d.options)};yield "Resuming...",yield*g(t,l,i);},supportsResume:true,checkConnection:async()=>{let n=Date.now();if(e&&n-e.timestamp<5e3)return e.result;try{let a=(await fetch(`${t}/health`,{method:"GET"})).ok;return e={result:a,timestamp:n},a}catch{return e={result:false,timestamp:n},false}}}},S=async()=>{if(typeof window>"u")return;let r=h(),t=window.__REACT_GRAB__;if(t){t.setAgent({provider:r,storage:sessionStorage});return}window.addEventListener("react-grab:init",o=>{o.detail.setAgent({provider:r,storage:sessionStorage});},{once:true});};S();exports.attachAgent=S;exports.createClaudeAgentProvider=h;return exports;})({});
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
2
|
var DEFAULT_PORT = 4567;
|
|
3
|
+
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
3
4
|
|
|
4
5
|
// src/client.ts
|
|
5
6
|
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
@@ -25,13 +26,27 @@ var parseSSEEvent = (eventBlock) => {
|
|
|
25
26
|
}
|
|
26
27
|
return { eventType, data };
|
|
27
28
|
};
|
|
28
|
-
async function* streamSSE(stream) {
|
|
29
|
+
async function* streamSSE(stream, signal) {
|
|
29
30
|
const reader = stream.getReader();
|
|
30
31
|
const decoder = new TextDecoder();
|
|
31
32
|
let buffer = "";
|
|
33
|
+
let aborted = false;
|
|
34
|
+
const onAbort = () => {
|
|
35
|
+
aborted = true;
|
|
36
|
+
reader.cancel().catch(() => {
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
signal.addEventListener("abort", onAbort);
|
|
32
40
|
try {
|
|
41
|
+
if (signal.aborted) {
|
|
42
|
+
throw new DOMException("Aborted", "AbortError");
|
|
43
|
+
}
|
|
33
44
|
while (true) {
|
|
34
|
-
const
|
|
45
|
+
const result = await reader.read();
|
|
46
|
+
if (aborted || signal.aborted) {
|
|
47
|
+
throw new DOMException("Aborted", "AbortError");
|
|
48
|
+
}
|
|
49
|
+
const { done, value } = result;
|
|
35
50
|
if (value) buffer += decoder.decode(value, { stream: true });
|
|
36
51
|
let boundary;
|
|
37
52
|
while ((boundary = buffer.indexOf("\n\n")) !== -1) {
|
|
@@ -47,7 +62,11 @@ async function* streamSSE(stream) {
|
|
|
47
62
|
if (done) break;
|
|
48
63
|
}
|
|
49
64
|
} finally {
|
|
50
|
-
|
|
65
|
+
signal.removeEventListener("abort", onAbort);
|
|
66
|
+
try {
|
|
67
|
+
reader.releaseLock();
|
|
68
|
+
} catch {
|
|
69
|
+
}
|
|
51
70
|
}
|
|
52
71
|
}
|
|
53
72
|
async function* streamFromServer(serverUrl, context, signal) {
|
|
@@ -63,10 +82,11 @@ async function* streamFromServer(serverUrl, context, signal) {
|
|
|
63
82
|
if (!response.body) {
|
|
64
83
|
throw new Error("No response body");
|
|
65
84
|
}
|
|
66
|
-
yield* streamSSE(response.body);
|
|
85
|
+
yield* streamSSE(response.body, signal);
|
|
67
86
|
}
|
|
68
87
|
var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
69
88
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = providerOptions;
|
|
89
|
+
let connectionCache = null;
|
|
70
90
|
const mergeOptions = (contextOptions) => ({
|
|
71
91
|
...DEFAULT_OPTIONS,
|
|
72
92
|
...getOptions?.() ?? {},
|
|
@@ -98,7 +118,22 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
98
118
|
yield "Resuming...";
|
|
99
119
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
100
120
|
},
|
|
101
|
-
supportsResume: true
|
|
121
|
+
supportsResume: true,
|
|
122
|
+
checkConnection: async () => {
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
if (connectionCache && now - connectionCache.timestamp < CONNECTION_CHECK_TTL_MS) {
|
|
125
|
+
return connectionCache.result;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const response = await fetch(`${serverUrl}/health`, { method: "GET" });
|
|
129
|
+
const result = response.ok;
|
|
130
|
+
connectionCache = { result, timestamp: now };
|
|
131
|
+
return result;
|
|
132
|
+
} catch {
|
|
133
|
+
connectionCache = { result: false, timestamp: now };
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
102
137
|
};
|
|
103
138
|
};
|
|
104
139
|
var attachAgent = async () => {
|
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.
|
|
14699
|
+
var VERSION = "0.0.72";
|
|
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: "
|
|
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.
|
|
14673
|
+
var VERSION = "0.0.72";
|
|
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: "
|
|
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.
|
|
3
|
+
"version": "0.0.72",
|
|
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.
|
|
34
|
+
"react-grab": "0.0.72"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"dev": "tsup --watch",
|