@react-grab/claude-code 0.0.55 → 0.0.57
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/README.md +78 -0
- package/dist/client.cjs +26 -2
- package/dist/client.d.cts +8 -2
- package/dist/client.d.ts +8 -2
- package/dist/client.js +26 -3
- package/dist/server.cjs +16 -16
- package/dist/server.d.cts +2 -1
- package/dist/server.d.ts +2 -1
- package/dist/server.js +16 -17
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# @react-grab/claude-code
|
|
2
|
+
|
|
3
|
+
Claude Code agent provider for React Grab. Requires running a local server that interfaces with the Claude Agent SDK.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @react-grab/claude-code
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @react-grab/claude-code
|
|
11
|
+
# or
|
|
12
|
+
bun add @react-grab/claude-code
|
|
13
|
+
# or
|
|
14
|
+
yarn add @react-grab/claude-code
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Server Setup
|
|
18
|
+
|
|
19
|
+
The server runs on port `4567` by default.
|
|
20
|
+
|
|
21
|
+
### Vite
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
// vite.config.ts
|
|
25
|
+
import "@react-grab/claude-code/server";
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Next.js
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
// next.config.ts
|
|
32
|
+
import "@react-grab/claude-code/server";
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Client Usage
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { init } from "react-grab/core";
|
|
39
|
+
import { createClaudeAgentProvider } from "@react-grab/claude-code/client";
|
|
40
|
+
|
|
41
|
+
const agentProvider = createClaudeAgentProvider();
|
|
42
|
+
|
|
43
|
+
init({
|
|
44
|
+
agent: {
|
|
45
|
+
provider: agentProvider,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Configuration
|
|
51
|
+
|
|
52
|
+
You can customize the server URL and default options:
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
const agentProvider = createClaudeAgentProvider({
|
|
56
|
+
getOptions: () => ({
|
|
57
|
+
model: "opus",
|
|
58
|
+
maxTurns: 20,
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## How It Works
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
┌─────────────────┐ HTTP ┌─────────────────┐ SDK ┌─────────────────┐
|
|
67
|
+
│ │ localhost:4567 │ │ │ │
|
|
68
|
+
│ React Grab │ ──────────────► │ Server │ ─────────────► │ Claude Code │
|
|
69
|
+
│ (Browser) │ ◄────────────── │ (Node.js) │ ◄───────────── │ (Agent) │
|
|
70
|
+
│ │ SSE │ │ │ │
|
|
71
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
72
|
+
Client Server Agent
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
1. **React Grab** sends the selected element context to the server via HTTP POST
|
|
76
|
+
2. **Server** receives the request and forwards it to Claude Code via the Agent SDK
|
|
77
|
+
3. **Claude Code** processes the request and streams responses back
|
|
78
|
+
4. **Server** relays status updates to the client via Server-Sent Events (SSE)
|
package/dist/client.cjs
CHANGED
|
@@ -73,7 +73,10 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
73
73
|
});
|
|
74
74
|
return {
|
|
75
75
|
send: async function* (context, signal) {
|
|
76
|
-
const mergedContext = {
|
|
76
|
+
const mergedContext = {
|
|
77
|
+
...context,
|
|
78
|
+
options: mergeOptions(context.options)
|
|
79
|
+
};
|
|
77
80
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
78
81
|
},
|
|
79
82
|
resume: async function* (sessionId, signal) {
|
|
@@ -87,12 +90,33 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
87
90
|
throw new Error(`Session ${sessionId} not found`);
|
|
88
91
|
}
|
|
89
92
|
const context = session.context;
|
|
90
|
-
const mergedContext = {
|
|
93
|
+
const mergedContext = {
|
|
94
|
+
...context,
|
|
95
|
+
options: mergeOptions(context.options)
|
|
96
|
+
};
|
|
91
97
|
yield "Resuming...";
|
|
92
98
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
93
99
|
},
|
|
94
100
|
supportsResume: true
|
|
95
101
|
};
|
|
96
102
|
};
|
|
103
|
+
var attachAgent = async () => {
|
|
104
|
+
if (typeof window === "undefined") return;
|
|
105
|
+
const provider = createClaudeAgentProvider();
|
|
106
|
+
const api = window.__REACT_GRAB__;
|
|
107
|
+
if (api) {
|
|
108
|
+
api.setAgent({ provider });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
window.addEventListener(
|
|
112
|
+
"react-grab:init",
|
|
113
|
+
(event) => {
|
|
114
|
+
const customEvent = event;
|
|
115
|
+
customEvent.detail.setAgent({ provider });
|
|
116
|
+
},
|
|
117
|
+
{ once: true }
|
|
118
|
+
);
|
|
119
|
+
};
|
|
97
120
|
|
|
121
|
+
exports.attachAgent = attachAgent;
|
|
98
122
|
exports.createClaudeAgentProvider = createClaudeAgentProvider;
|
package/dist/client.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AgentProvider } from 'react-grab/core';
|
|
1
|
+
import { init, AgentProvider } from 'react-grab/core';
|
|
2
2
|
import { Options } from '@anthropic-ai/claude-agent-sdk';
|
|
3
3
|
|
|
4
4
|
interface ClaudeAgentProviderOptions {
|
|
@@ -6,5 +6,11 @@ interface ClaudeAgentProviderOptions {
|
|
|
6
6
|
getOptions?: () => Partial<Options>;
|
|
7
7
|
}
|
|
8
8
|
declare const createClaudeAgentProvider: (providerOptions?: ClaudeAgentProviderOptions) => AgentProvider<Options>;
|
|
9
|
+
declare global {
|
|
10
|
+
interface Window {
|
|
11
|
+
__REACT_GRAB__?: ReturnType<typeof init>;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
declare const attachAgent: () => Promise<void>;
|
|
9
15
|
|
|
10
|
-
export { createClaudeAgentProvider };
|
|
16
|
+
export { attachAgent, createClaudeAgentProvider };
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AgentProvider } from 'react-grab/core';
|
|
1
|
+
import { init, AgentProvider } from 'react-grab/core';
|
|
2
2
|
import { Options } from '@anthropic-ai/claude-agent-sdk';
|
|
3
3
|
|
|
4
4
|
interface ClaudeAgentProviderOptions {
|
|
@@ -6,5 +6,11 @@ interface ClaudeAgentProviderOptions {
|
|
|
6
6
|
getOptions?: () => Partial<Options>;
|
|
7
7
|
}
|
|
8
8
|
declare const createClaudeAgentProvider: (providerOptions?: ClaudeAgentProviderOptions) => AgentProvider<Options>;
|
|
9
|
+
declare global {
|
|
10
|
+
interface Window {
|
|
11
|
+
__REACT_GRAB__?: ReturnType<typeof init>;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
declare const attachAgent: () => Promise<void>;
|
|
9
15
|
|
|
10
|
-
export { createClaudeAgentProvider };
|
|
16
|
+
export { attachAgent, createClaudeAgentProvider };
|
package/dist/client.js
CHANGED
|
@@ -71,7 +71,10 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
71
71
|
});
|
|
72
72
|
return {
|
|
73
73
|
send: async function* (context, signal) {
|
|
74
|
-
const mergedContext = {
|
|
74
|
+
const mergedContext = {
|
|
75
|
+
...context,
|
|
76
|
+
options: mergeOptions(context.options)
|
|
77
|
+
};
|
|
75
78
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
76
79
|
},
|
|
77
80
|
resume: async function* (sessionId, signal) {
|
|
@@ -85,12 +88,32 @@ var createClaudeAgentProvider = (providerOptions = {}) => {
|
|
|
85
88
|
throw new Error(`Session ${sessionId} not found`);
|
|
86
89
|
}
|
|
87
90
|
const context = session.context;
|
|
88
|
-
const mergedContext = {
|
|
91
|
+
const mergedContext = {
|
|
92
|
+
...context,
|
|
93
|
+
options: mergeOptions(context.options)
|
|
94
|
+
};
|
|
89
95
|
yield "Resuming...";
|
|
90
96
|
yield* streamFromServer(serverUrl, mergedContext, signal);
|
|
91
97
|
},
|
|
92
98
|
supportsResume: true
|
|
93
99
|
};
|
|
94
100
|
};
|
|
101
|
+
var attachAgent = async () => {
|
|
102
|
+
if (typeof window === "undefined") return;
|
|
103
|
+
const provider = createClaudeAgentProvider();
|
|
104
|
+
const api = window.__REACT_GRAB__;
|
|
105
|
+
if (api) {
|
|
106
|
+
api.setAgent({ provider });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
window.addEventListener(
|
|
110
|
+
"react-grab:init",
|
|
111
|
+
(event) => {
|
|
112
|
+
const customEvent = event;
|
|
113
|
+
customEvent.detail.setAgent({ provider });
|
|
114
|
+
},
|
|
115
|
+
{ once: true }
|
|
116
|
+
);
|
|
117
|
+
};
|
|
95
118
|
|
|
96
|
-
export { createClaudeAgentProvider };
|
|
119
|
+
export { attachAgent, createClaudeAgentProvider };
|
package/dist/server.cjs
CHANGED
|
@@ -765,14 +765,14 @@ var Hono = class {
|
|
|
765
765
|
}
|
|
766
766
|
#notFoundHandler = notFoundHandler;
|
|
767
767
|
errorHandler = errorHandler;
|
|
768
|
-
route(path,
|
|
768
|
+
route(path, app) {
|
|
769
769
|
const subApp = this.basePath(path);
|
|
770
|
-
|
|
770
|
+
app.routes.map((r) => {
|
|
771
771
|
let handler;
|
|
772
|
-
if (
|
|
772
|
+
if (app.errorHandler === errorHandler) {
|
|
773
773
|
handler = r.handler;
|
|
774
774
|
} else {
|
|
775
|
-
handler = async (c, next) => (await compose([],
|
|
775
|
+
handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;
|
|
776
776
|
handler[COMPOSED_HANDLER] = r.handler;
|
|
777
777
|
}
|
|
778
778
|
subApp.#addRoute(r.method, r.path, handler);
|
|
@@ -2279,7 +2279,7 @@ var createAdaptorServer = (options) => {
|
|
|
2279
2279
|
};
|
|
2280
2280
|
var serve = (options, listeningListener) => {
|
|
2281
2281
|
const server = createAdaptorServer(options);
|
|
2282
|
-
server.listen(options?.port, options.hostname, () => {
|
|
2282
|
+
server.listen(options?.port ?? 3e3, options.hostname, () => {
|
|
2283
2283
|
server.address();
|
|
2284
2284
|
});
|
|
2285
2285
|
return server;
|
|
@@ -14595,9 +14595,9 @@ var DEFAULT_PORT = 4567;
|
|
|
14595
14595
|
// src/server.ts
|
|
14596
14596
|
var isTextBlock = (block) => block.type === "text";
|
|
14597
14597
|
var createServer = () => {
|
|
14598
|
-
const
|
|
14599
|
-
|
|
14600
|
-
|
|
14598
|
+
const app = new Hono2();
|
|
14599
|
+
app.use("/*", cors());
|
|
14600
|
+
app.post("/agent", async (context) => {
|
|
14601
14601
|
const body = await context.req.json();
|
|
14602
14602
|
const { content, prompt, options } = body;
|
|
14603
14603
|
const fullPrompt = `${prompt}
|
|
@@ -14639,16 +14639,16 @@ ${content}`;
|
|
|
14639
14639
|
}
|
|
14640
14640
|
});
|
|
14641
14641
|
});
|
|
14642
|
-
|
|
14642
|
+
app.get("/health", (context) => {
|
|
14643
14643
|
return context.json({ status: "ok", provider: "claude" });
|
|
14644
14644
|
});
|
|
14645
|
-
return
|
|
14645
|
+
return app;
|
|
14646
|
+
};
|
|
14647
|
+
var startServer = (port = DEFAULT_PORT) => {
|
|
14648
|
+
const app = createServer();
|
|
14649
|
+
serve({ fetch: app.fetch, port });
|
|
14650
|
+
console.log("React Grab Claude Code server running on port", port);
|
|
14646
14651
|
};
|
|
14647
|
-
var app = createServer();
|
|
14648
|
-
serve({
|
|
14649
|
-
fetch: app.fetch,
|
|
14650
|
-
port: DEFAULT_PORT
|
|
14651
|
-
});
|
|
14652
|
-
console.log("React Grab Claude Code server running on port", DEFAULT_PORT);
|
|
14653
14652
|
|
|
14654
14653
|
exports.createServer = createServer;
|
|
14654
|
+
exports.startServer = startServer;
|
package/dist/server.d.cts
CHANGED
|
@@ -2,5 +2,6 @@ import * as hono_types from 'hono/types';
|
|
|
2
2
|
import { Hono } from 'hono';
|
|
3
3
|
|
|
4
4
|
declare const createServer: () => Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
|
|
5
|
+
declare const startServer: (port?: number) => void;
|
|
5
6
|
|
|
6
|
-
export { createServer };
|
|
7
|
+
export { createServer, startServer };
|
package/dist/server.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ import * as hono_types from 'hono/types';
|
|
|
2
2
|
import { Hono } from 'hono';
|
|
3
3
|
|
|
4
4
|
declare const createServer: () => Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
|
|
5
|
+
declare const startServer: (port?: number) => void;
|
|
5
6
|
|
|
6
|
-
export { createServer };
|
|
7
|
+
export { createServer, startServer };
|
package/dist/server.js
CHANGED
|
@@ -740,14 +740,14 @@ var Hono = class {
|
|
|
740
740
|
}
|
|
741
741
|
#notFoundHandler = notFoundHandler;
|
|
742
742
|
errorHandler = errorHandler;
|
|
743
|
-
route(path,
|
|
743
|
+
route(path, app) {
|
|
744
744
|
const subApp = this.basePath(path);
|
|
745
|
-
|
|
745
|
+
app.routes.map((r) => {
|
|
746
746
|
let handler;
|
|
747
|
-
if (
|
|
747
|
+
if (app.errorHandler === errorHandler) {
|
|
748
748
|
handler = r.handler;
|
|
749
749
|
} else {
|
|
750
|
-
handler = async (c, next) => (await compose([],
|
|
750
|
+
handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;
|
|
751
751
|
handler[COMPOSED_HANDLER] = r.handler;
|
|
752
752
|
}
|
|
753
753
|
subApp.#addRoute(r.method, r.path, handler);
|
|
@@ -2254,7 +2254,7 @@ var createAdaptorServer = (options) => {
|
|
|
2254
2254
|
};
|
|
2255
2255
|
var serve = (options, listeningListener) => {
|
|
2256
2256
|
const server = createAdaptorServer(options);
|
|
2257
|
-
server.listen(options?.port, options.hostname, () => {
|
|
2257
|
+
server.listen(options?.port ?? 3e3, options.hostname, () => {
|
|
2258
2258
|
server.address();
|
|
2259
2259
|
});
|
|
2260
2260
|
return server;
|
|
@@ -14570,9 +14570,9 @@ var DEFAULT_PORT = 4567;
|
|
|
14570
14570
|
// src/server.ts
|
|
14571
14571
|
var isTextBlock = (block) => block.type === "text";
|
|
14572
14572
|
var createServer = () => {
|
|
14573
|
-
const
|
|
14574
|
-
|
|
14575
|
-
|
|
14573
|
+
const app = new Hono2();
|
|
14574
|
+
app.use("/*", cors());
|
|
14575
|
+
app.post("/agent", async (context) => {
|
|
14576
14576
|
const body = await context.req.json();
|
|
14577
14577
|
const { content, prompt, options } = body;
|
|
14578
14578
|
const fullPrompt = `${prompt}
|
|
@@ -14614,16 +14614,15 @@ ${content}`;
|
|
|
14614
14614
|
}
|
|
14615
14615
|
});
|
|
14616
14616
|
});
|
|
14617
|
-
|
|
14617
|
+
app.get("/health", (context) => {
|
|
14618
14618
|
return context.json({ status: "ok", provider: "claude" });
|
|
14619
14619
|
});
|
|
14620
|
-
return
|
|
14620
|
+
return app;
|
|
14621
|
+
};
|
|
14622
|
+
var startServer = (port = DEFAULT_PORT) => {
|
|
14623
|
+
const app = createServer();
|
|
14624
|
+
serve({ fetch: app.fetch, port });
|
|
14625
|
+
console.log("React Grab Claude Code server running on port", port);
|
|
14621
14626
|
};
|
|
14622
|
-
var app = createServer();
|
|
14623
|
-
serve({
|
|
14624
|
-
fetch: app.fetch,
|
|
14625
|
-
port: DEFAULT_PORT
|
|
14626
|
-
});
|
|
14627
|
-
console.log("React Grab Claude Code server running on port", DEFAULT_PORT);
|
|
14628
14627
|
|
|
14629
|
-
export { createServer };
|
|
14628
|
+
export { createServer, startServer };
|
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.57",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./client": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@anthropic-ai/claude-agent-sdk": "^0.1.0",
|
|
25
25
|
"@hono/node-server": "^1.19.6",
|
|
26
26
|
"hono": "^4.0.0",
|
|
27
|
-
"react-grab": "0.0.
|
|
27
|
+
"react-grab": "0.0.57"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"dev": "tsup --watch",
|