@react-grab/opencode 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 +3 -3
- 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 = 6567;
|
|
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 = 6567;
|
|
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 = 6567;
|
|
5
|
+
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
5
6
|
|
|
6
7
|
// src/client.ts
|
|
7
8
|
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
@@ -15,13 +16,27 @@ var parseServerSentEvent = (eventStringBlock) => {
|
|
|
15
16
|
}
|
|
16
17
|
return { eventType, data };
|
|
17
18
|
};
|
|
18
|
-
var streamSSE = async function* (stream) {
|
|
19
|
+
var streamSSE = async function* (stream, signal) {
|
|
19
20
|
const streamReader = stream.getReader();
|
|
20
21
|
const textDecoder = new TextDecoder();
|
|
21
22
|
let textBuffer = "";
|
|
23
|
+
let aborted = false;
|
|
24
|
+
const onAbort = () => {
|
|
25
|
+
aborted = true;
|
|
26
|
+
streamReader.cancel().catch(() => {
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
signal.addEventListener("abort", onAbort);
|
|
22
30
|
try {
|
|
31
|
+
if (signal.aborted) {
|
|
32
|
+
throw new DOMException("Aborted", "AbortError");
|
|
33
|
+
}
|
|
23
34
|
while (true) {
|
|
24
|
-
const
|
|
35
|
+
const result = await streamReader.read();
|
|
36
|
+
if (aborted || signal.aborted) {
|
|
37
|
+
throw new DOMException("Aborted", "AbortError");
|
|
38
|
+
}
|
|
39
|
+
const { done, value } = result;
|
|
25
40
|
if (value) textBuffer += textDecoder.decode(value, { stream: true });
|
|
26
41
|
let boundaryIndex;
|
|
27
42
|
while ((boundaryIndex = textBuffer.indexOf("\n\n")) !== -1) {
|
|
@@ -36,7 +51,11 @@ var streamSSE = async function* (stream) {
|
|
|
36
51
|
if (done) break;
|
|
37
52
|
}
|
|
38
53
|
} finally {
|
|
39
|
-
|
|
54
|
+
signal.removeEventListener("abort", onAbort);
|
|
55
|
+
try {
|
|
56
|
+
streamReader.releaseLock();
|
|
57
|
+
} catch {
|
|
58
|
+
}
|
|
40
59
|
}
|
|
41
60
|
};
|
|
42
61
|
var streamFromServer = async function* (serverUrl, context, signal) {
|
|
@@ -52,10 +71,11 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
52
71
|
if (!response.body) {
|
|
53
72
|
throw new Error("No response body");
|
|
54
73
|
}
|
|
55
|
-
yield* streamSSE(response.body);
|
|
74
|
+
yield* streamSSE(response.body, signal);
|
|
56
75
|
};
|
|
57
76
|
var createOpencodeAgentProvider = (options = {}) => {
|
|
58
77
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = options;
|
|
78
|
+
let connectionCache = null;
|
|
59
79
|
const mergeOptions = (contextOptions) => ({
|
|
60
80
|
...getOptions?.() ?? {},
|
|
61
81
|
...contextOptions ?? {}
|
|
@@ -86,7 +106,22 @@ var createOpencodeAgentProvider = (options = {}) => {
|
|
|
86
106
|
yield "Resuming...";
|
|
87
107
|
yield* streamFromServer(serverUrl, combinedContext, signal);
|
|
88
108
|
},
|
|
89
|
-
supportsResume: true
|
|
109
|
+
supportsResume: true,
|
|
110
|
+
checkConnection: async () => {
|
|
111
|
+
const now = Date.now();
|
|
112
|
+
if (connectionCache && now - connectionCache.timestamp < CONNECTION_CHECK_TTL_MS) {
|
|
113
|
+
return connectionCache.result;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const response = await fetch(`${serverUrl}/health`, { method: "GET" });
|
|
117
|
+
const result = response.ok;
|
|
118
|
+
connectionCache = { result, timestamp: now };
|
|
119
|
+
return result;
|
|
120
|
+
} catch {
|
|
121
|
+
connectionCache = { result: false, timestamp: now };
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
90
125
|
};
|
|
91
126
|
};
|
|
92
127
|
var attachAgent = async () => {
|
package/dist/client.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var ReactGrabOpencode=(function(exports){'use strict';var
|
|
2
|
-
`))e.startsWith("event:")?t=e.slice(6).trim():e.startsWith("data:")&&(n=e.slice(5).trim());return {eventType:t,data:n}},
|
|
1
|
+
var ReactGrabOpencode=(function(exports){'use strict';var O=`http://localhost:${6567}`,m="react-grab:agent-sessions",E=r=>{let t="",n="";for(let e of r.split(`
|
|
2
|
+
`))e.startsWith("event:")?t=e.slice(6).trim():e.startsWith("data:")&&(n=e.slice(5).trim());return {eventType:t,data:n}},S=async function*(r,t){let n=r.getReader(),e=new TextDecoder,s="",o=false,a=()=>{o=true,n.cancel().catch(()=>{});};t.addEventListener("abort",a);try{if(t.aborted)throw new DOMException("Aborted","AbortError");for(;;){let i=await n.read();if(o||t.aborted)throw new DOMException("Aborted","AbortError");let{done:g,value:l}=i;l&&(s+=e.decode(l,{stream:!0}));let c;for(;(c=s.indexOf(`
|
|
3
3
|
|
|
4
|
-
`))!==-1;){let{eventType:
|
|
4
|
+
`))!==-1;){let{eventType:d,data:p}=E(s.slice(0,c));if(s=s.slice(c+2),d==="done")return;if(d==="error")throw new Error(p||"Agent error");p&&(yield p);}if(g)break}}finally{t.removeEventListener("abort",a);try{n.releaseLock();}catch{}}},f=async function*(r,t,n){let e=await fetch(`${r}/agent`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t),signal:n});if(!e.ok)throw new Error(`Server error: ${e.status}`);if(!e.body)throw new Error("No response body");yield*S(e.body,n);},y=(r={})=>{let{serverUrl:t=O,getOptions:n}=r,e=null,s=o=>({...n?.()??{},...o??{}});return {send:async function*(o,a){let i={...o,options:s(o.options)};yield*f(t,i,a);},resume:async function*(o,a,i){let g=i.getItem(m);if(!g)throw new Error("No sessions to resume");let c=JSON.parse(g)[o];if(!c)throw new Error(`Session ${o} not found`);let d=c.context,p={...d,options:s(d.options)};yield "Resuming...",yield*f(t,p,a);},supportsResume:true,checkConnection:async()=>{let o=Date.now();if(e&&o-e.timestamp<5e3)return e.result;try{let i=(await fetch(`${t}/health`,{method:"GET"})).ok;return e={result:i,timestamp:o},i}catch{return e={result:false,timestamp:o},false}}}},b=async()=>{if(typeof window>"u")return;let r=y(),t=window.__REACT_GRAB__;if(t){t.setAgent({provider:r,storage:sessionStorage});return}window.addEventListener("react-grab:init",n=>{if(n instanceof CustomEvent){let e=n;e.detail&&typeof e.detail.setAgent=="function"&&e.detail.setAgent({provider:r,storage:sessionStorage});}},{once:true});};b();exports.attachAgent=b;exports.createOpencodeAgentProvider=y;return exports;})({});
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
2
|
var DEFAULT_PORT = 6567;
|
|
3
|
+
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
3
4
|
|
|
4
5
|
// src/client.ts
|
|
5
6
|
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
@@ -13,13 +14,27 @@ var parseServerSentEvent = (eventStringBlock) => {
|
|
|
13
14
|
}
|
|
14
15
|
return { eventType, data };
|
|
15
16
|
};
|
|
16
|
-
var streamSSE = async function* (stream) {
|
|
17
|
+
var streamSSE = async function* (stream, signal) {
|
|
17
18
|
const streamReader = stream.getReader();
|
|
18
19
|
const textDecoder = new TextDecoder();
|
|
19
20
|
let textBuffer = "";
|
|
21
|
+
let aborted = false;
|
|
22
|
+
const onAbort = () => {
|
|
23
|
+
aborted = true;
|
|
24
|
+
streamReader.cancel().catch(() => {
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
signal.addEventListener("abort", onAbort);
|
|
20
28
|
try {
|
|
29
|
+
if (signal.aborted) {
|
|
30
|
+
throw new DOMException("Aborted", "AbortError");
|
|
31
|
+
}
|
|
21
32
|
while (true) {
|
|
22
|
-
const
|
|
33
|
+
const result = await streamReader.read();
|
|
34
|
+
if (aborted || signal.aborted) {
|
|
35
|
+
throw new DOMException("Aborted", "AbortError");
|
|
36
|
+
}
|
|
37
|
+
const { done, value } = result;
|
|
23
38
|
if (value) textBuffer += textDecoder.decode(value, { stream: true });
|
|
24
39
|
let boundaryIndex;
|
|
25
40
|
while ((boundaryIndex = textBuffer.indexOf("\n\n")) !== -1) {
|
|
@@ -34,7 +49,11 @@ var streamSSE = async function* (stream) {
|
|
|
34
49
|
if (done) break;
|
|
35
50
|
}
|
|
36
51
|
} finally {
|
|
37
|
-
|
|
52
|
+
signal.removeEventListener("abort", onAbort);
|
|
53
|
+
try {
|
|
54
|
+
streamReader.releaseLock();
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
38
57
|
}
|
|
39
58
|
};
|
|
40
59
|
var streamFromServer = async function* (serverUrl, context, signal) {
|
|
@@ -50,10 +69,11 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
50
69
|
if (!response.body) {
|
|
51
70
|
throw new Error("No response body");
|
|
52
71
|
}
|
|
53
|
-
yield* streamSSE(response.body);
|
|
72
|
+
yield* streamSSE(response.body, signal);
|
|
54
73
|
};
|
|
55
74
|
var createOpencodeAgentProvider = (options = {}) => {
|
|
56
75
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = options;
|
|
76
|
+
let connectionCache = null;
|
|
57
77
|
const mergeOptions = (contextOptions) => ({
|
|
58
78
|
...getOptions?.() ?? {},
|
|
59
79
|
...contextOptions ?? {}
|
|
@@ -84,7 +104,22 @@ var createOpencodeAgentProvider = (options = {}) => {
|
|
|
84
104
|
yield "Resuming...";
|
|
85
105
|
yield* streamFromServer(serverUrl, combinedContext, signal);
|
|
86
106
|
},
|
|
87
|
-
supportsResume: true
|
|
107
|
+
supportsResume: true,
|
|
108
|
+
checkConnection: async () => {
|
|
109
|
+
const now = Date.now();
|
|
110
|
+
if (connectionCache && now - connectionCache.timestamp < CONNECTION_CHECK_TTL_MS) {
|
|
111
|
+
return connectionCache.result;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const response = await fetch(`${serverUrl}/health`, { method: "GET" });
|
|
115
|
+
const result = response.ok;
|
|
116
|
+
connectionCache = { result, timestamp: now };
|
|
117
|
+
return result;
|
|
118
|
+
} catch {
|
|
119
|
+
connectionCache = { result: false, timestamp: now };
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
88
123
|
};
|
|
89
124
|
};
|
|
90
125
|
var attachAgent = async () => {
|
package/dist/server.cjs
CHANGED
|
@@ -3877,7 +3877,7 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
3877
3877
|
|
|
3878
3878
|
// src/constants.ts
|
|
3879
3879
|
var DEFAULT_PORT = 6567;
|
|
3880
|
-
var VERSION = "0.0.
|
|
3880
|
+
var VERSION = "0.0.72";
|
|
3881
3881
|
var opencodeInstance = null;
|
|
3882
3882
|
var getOpencodeClient = async () => {
|
|
3883
3883
|
if (!opencodeInstance) {
|
|
@@ -3891,7 +3891,7 @@ var getOpencodeClient = async () => {
|
|
|
3891
3891
|
};
|
|
3892
3892
|
var executeOpencodePrompt = async (prompt, options, onStatus) => {
|
|
3893
3893
|
const client2 = await getOpencodeClient();
|
|
3894
|
-
onStatus?.("
|
|
3894
|
+
onStatus?.("Thinking...");
|
|
3895
3895
|
const sessionResponse = await client2.session.create({
|
|
3896
3896
|
body: { title: "React Grab Session" }
|
|
3897
3897
|
});
|
package/dist/server.js
CHANGED
|
@@ -3869,7 +3869,7 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
3869
3869
|
|
|
3870
3870
|
// src/constants.ts
|
|
3871
3871
|
var DEFAULT_PORT = 6567;
|
|
3872
|
-
var VERSION = "0.0.
|
|
3872
|
+
var VERSION = "0.0.72";
|
|
3873
3873
|
var opencodeInstance = null;
|
|
3874
3874
|
var getOpencodeClient = async () => {
|
|
3875
3875
|
if (!opencodeInstance) {
|
|
@@ -3883,7 +3883,7 @@ var getOpencodeClient = async () => {
|
|
|
3883
3883
|
};
|
|
3884
3884
|
var executeOpencodePrompt = async (prompt, options, onStatus) => {
|
|
3885
3885
|
const client2 = await getOpencodeClient();
|
|
3886
|
-
onStatus?.("
|
|
3886
|
+
onStatus?.("Thinking...");
|
|
3887
3887
|
const sessionResponse = await client2.session.create({
|
|
3888
3888
|
body: { title: "React Grab Session" }
|
|
3889
3889
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-grab/opencode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.72",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"react-grab-opencode": "./dist/cli.js"
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@opencode-ai/sdk": "^1.0.0",
|
|
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",
|