@react-grab/opencode 0.0.81 → 0.0.83
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 +2 -6
- package/dist/cli.js +3 -6
- package/dist/client.cjs +54 -23
- package/dist/client.global.js +4 -3
- package/dist/client.js +54 -23
- package/dist/server.cjs +12 -4
- package/dist/server.js +12 -4
- package/package.json +5 -4
package/dist/cli.cjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var url = require('url');
|
|
5
4
|
var path = require('path');
|
|
6
5
|
|
|
7
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
8
6
|
var __create = Object.create;
|
|
9
7
|
var __defProp = Object.defineProperty;
|
|
10
8
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
@@ -605,10 +603,8 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
605
603
|
var DEFAULT_PORT = 6567;
|
|
606
604
|
|
|
607
605
|
// src/cli.ts
|
|
608
|
-
var VERSION = "0.0.
|
|
609
|
-
var
|
|
610
|
-
var __dirname$1 = path.dirname(__filename$1);
|
|
611
|
-
var serverPath = path.join(__dirname$1, "server.js");
|
|
606
|
+
var VERSION = "0.0.83";
|
|
607
|
+
var serverPath = path.join(__dirname, "server.cjs");
|
|
612
608
|
(0, import_cross_spawn.default)(process.execPath, [serverPath], {
|
|
613
609
|
detached: true,
|
|
614
610
|
stdio: "ignore"
|
package/dist/cli.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { dirname, join } from 'path';
|
|
2
|
+
import { join } from 'path';
|
|
4
3
|
|
|
5
4
|
var __create = Object.create;
|
|
6
5
|
var __defProp = Object.defineProperty;
|
|
@@ -602,10 +601,8 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
602
601
|
var DEFAULT_PORT = 6567;
|
|
603
602
|
|
|
604
603
|
// src/cli.ts
|
|
605
|
-
var VERSION = "0.0.
|
|
606
|
-
var
|
|
607
|
-
var __dirname = dirname(__filename);
|
|
608
|
-
var serverPath = join(__dirname, "server.js");
|
|
604
|
+
var VERSION = "0.0.83";
|
|
605
|
+
var serverPath = join(__dirname, "server.cjs");
|
|
609
606
|
(0, import_cross_spawn.default)(process.execPath, [serverPath], {
|
|
610
607
|
detached: true,
|
|
611
608
|
stdio: "ignore"
|
package/dist/client.cjs
CHANGED
|
@@ -1,29 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
var DEFAULT_PORT = 6567;
|
|
3
|
+
// ../utils/dist/client.js
|
|
5
4
|
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
6
|
-
|
|
7
|
-
// src/client.ts
|
|
8
|
-
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
9
5
|
var STORAGE_KEY = "react-grab:agent-sessions";
|
|
10
|
-
var
|
|
6
|
+
var parseSSEEvent = (eventBlock) => {
|
|
11
7
|
let eventType = "";
|
|
12
8
|
let data = "";
|
|
13
|
-
for (const line of
|
|
9
|
+
for (const line of eventBlock.split("\n")) {
|
|
14
10
|
if (line.startsWith("event:")) eventType = line.slice(6).trim();
|
|
15
11
|
else if (line.startsWith("data:")) data = line.slice(5).trim();
|
|
16
12
|
}
|
|
17
13
|
return { eventType, data };
|
|
18
14
|
};
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
const
|
|
22
|
-
let
|
|
15
|
+
async function* streamSSE(stream, signal) {
|
|
16
|
+
const reader = stream.getReader();
|
|
17
|
+
const decoder = new TextDecoder();
|
|
18
|
+
let buffer = "";
|
|
23
19
|
let aborted = false;
|
|
24
20
|
const onAbort = () => {
|
|
25
21
|
aborted = true;
|
|
26
|
-
|
|
22
|
+
reader.cancel().catch(() => {
|
|
27
23
|
});
|
|
28
24
|
};
|
|
29
25
|
signal.addEventListener("abort", onAbort);
|
|
@@ -32,18 +28,16 @@ var streamSSE = async function* (stream, signal) {
|
|
|
32
28
|
throw new DOMException("Aborted", "AbortError");
|
|
33
29
|
}
|
|
34
30
|
while (true) {
|
|
35
|
-
const result = await
|
|
31
|
+
const result = await reader.read();
|
|
36
32
|
if (aborted || signal.aborted) {
|
|
37
33
|
throw new DOMException("Aborted", "AbortError");
|
|
38
34
|
}
|
|
39
35
|
const { done, value } = result;
|
|
40
|
-
if (value)
|
|
41
|
-
let
|
|
42
|
-
while ((
|
|
43
|
-
const { eventType, data } =
|
|
44
|
-
|
|
45
|
-
);
|
|
46
|
-
textBuffer = textBuffer.slice(boundaryIndex + 2);
|
|
36
|
+
if (value) buffer += decoder.decode(value, { stream: true });
|
|
37
|
+
let boundary;
|
|
38
|
+
while ((boundary = buffer.indexOf("\n\n")) !== -1) {
|
|
39
|
+
const { eventType, data } = parseSSEEvent(buffer.slice(0, boundary));
|
|
40
|
+
buffer = buffer.slice(boundary + 2);
|
|
47
41
|
if (eventType === "done") return;
|
|
48
42
|
if (eventType === "error") throw new Error(data || "Agent error");
|
|
49
43
|
if (data) yield data;
|
|
@@ -53,12 +47,19 @@ var streamSSE = async function* (stream, signal) {
|
|
|
53
47
|
} finally {
|
|
54
48
|
signal.removeEventListener("abort", onAbort);
|
|
55
49
|
try {
|
|
56
|
-
|
|
50
|
+
reader.releaseLock();
|
|
57
51
|
} catch {
|
|
58
52
|
}
|
|
59
53
|
}
|
|
60
|
-
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/constants.ts
|
|
57
|
+
var DEFAULT_PORT = 6567;
|
|
58
|
+
|
|
59
|
+
// src/client.ts
|
|
60
|
+
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
61
61
|
var streamFromServer = async function* (serverUrl, context, signal) {
|
|
62
|
+
const startTime = Date.now();
|
|
62
63
|
const sessionId = context.sessionId;
|
|
63
64
|
const handleAbort = () => {
|
|
64
65
|
if (sessionId) {
|
|
@@ -82,7 +83,37 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
82
83
|
if (!response.body) {
|
|
83
84
|
throw new Error("No response body");
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
+
const iterator = streamSSE(response.body, signal)[Symbol.asyncIterator]();
|
|
87
|
+
let done = false;
|
|
88
|
+
let pendingNext = iterator.next();
|
|
89
|
+
while (!done) {
|
|
90
|
+
const result = await Promise.race([
|
|
91
|
+
pendingNext.then((iteratorResult) => ({
|
|
92
|
+
type: "status",
|
|
93
|
+
iteratorResult
|
|
94
|
+
})),
|
|
95
|
+
new Promise(
|
|
96
|
+
(resolve) => setTimeout(() => resolve({ type: "timeout" }), 100)
|
|
97
|
+
)
|
|
98
|
+
]);
|
|
99
|
+
if (result.type === "timeout") {
|
|
100
|
+
const elapsedSeconds = (Date.now() - startTime) / 1e3;
|
|
101
|
+
yield `Working\u2026 ${elapsedSeconds.toFixed(1)}s`;
|
|
102
|
+
} else {
|
|
103
|
+
const iteratorResult = result.iteratorResult;
|
|
104
|
+
done = iteratorResult.done ?? false;
|
|
105
|
+
if (!done && iteratorResult.value) {
|
|
106
|
+
const status = iteratorResult.value;
|
|
107
|
+
if (status === "Completed successfully") {
|
|
108
|
+
const totalSeconds = ((Date.now() - startTime) / 1e3).toFixed(1);
|
|
109
|
+
yield `Completed in ${totalSeconds}s`;
|
|
110
|
+
} else {
|
|
111
|
+
yield status;
|
|
112
|
+
}
|
|
113
|
+
pendingNext = iterator.next();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
86
117
|
} finally {
|
|
87
118
|
signal.removeEventListener("abort", handleAbort);
|
|
88
119
|
}
|
package/dist/client.global.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
var ReactGrabOpencode=(function(exports){'use strict';var m
|
|
2
|
-
`))
|
|
1
|
+
var ReactGrabOpencode=(function(exports){'use strict';var f=5e3,m="react-grab:agent-sessions",y=c=>{let e="",n="";for(let t of c.split(`
|
|
2
|
+
`))t.startsWith("event:")?e=t.slice(6).trim():t.startsWith("data:")&&(n=t.slice(5).trim());return {eventType:e,data:n}};async function*g(c,e){let n=c.getReader(),t=new TextDecoder,r="",o=false,i=()=>{o=true,n.cancel().catch(()=>{});};e.addEventListener("abort",i);try{if(e.aborted)throw new DOMException("Aborted","AbortError");for(;;){let a=await n.read();if(o||e.aborted)throw new DOMException("Aborted","AbortError");let{done:p,value:u}=a;u&&(r+=t.decode(u,{stream:!0}));let d;for(;(d=r.indexOf(`
|
|
3
3
|
|
|
4
|
-
`))!==-1;){let{eventType:
|
|
4
|
+
`))!==-1;){let{eventType:s,data:l}=y(r.slice(0,d));if(r=r.slice(d+2),s==="done")return;if(s==="error")throw new Error(l||"Agent error");l&&(yield l);}if(p)break}}finally{e.removeEventListener("abort",i);try{n.releaseLock();}catch{}}}var E=`http://localhost:${6567}`,A=async function*(c,e,n){let t=Date.now(),r=e.sessionId,o=()=>{r&&fetch(`${c}/abort/${r}`,{method:"POST"}).catch(()=>{});};n.addEventListener("abort",o);try{let i=await fetch(`${c}/agent`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:n});if(!i.ok)throw new Error(`Server error: ${i.status}`);if(!i.body)throw new Error("No response body");let a=g(i.body,n)[Symbol.asyncIterator](),p=!1,u=a.next();for(;!p;){let d=await Promise.race([u.then(s=>({type:"status",iteratorResult:s})),new Promise(s=>setTimeout(()=>s({type:"timeout"}),100))]);if(d.type==="timeout")yield `Working\u2026 ${((Date.now()-t)/1e3).toFixed(1)}s`;else {let s=d.iteratorResult;if(p=s.done??!1,!p&&s.value){let l=s.value;l==="Completed successfully"?yield `Completed in ${((Date.now()-t)/1e3).toFixed(1)}s`:yield l,u=a.next();}}}}finally{n.removeEventListener("abort",o);}},O=(c={})=>{let{serverUrl:e=E,getOptions:n}=c,t=null,r=o=>({...n?.()??{},...o??{}});return {send:async function*(o,i){let a={...o,options:r(o.options)};yield*A(e,a,i);},resume:async function*(o,i,a){let p=a.getItem(m);if(!p)throw new Error("No sessions to resume");let d=JSON.parse(p)[o];if(!d)throw new Error(`Session ${o} not found`);let s=d.context,l={...s,options:r(s.options)};yield "Resuming...",yield*A(e,l,i);},supportsResume:true,supportsFollowUp:true,checkConnection:async()=>{let o=Date.now();if(t&&o-t.timestamp<f)return t.result;try{let a=(await fetch(`${e}/health`,{method:"GET"})).ok;return t={result:a,timestamp:o},a}catch{return t={result:false,timestamp:o},false}},undo:async()=>{try{await fetch(`${e}/undo`,{method:"POST"});}catch{}}}},S=async()=>{if(typeof window>"u")return;let c=O(),e=r=>{r.setAgent({provider:c,storage:sessionStorage});},n=window.__REACT_GRAB__;if(n){e(n);return}window.addEventListener("react-grab:init",r=>{e(r.detail);},{once:true});let t=window.__REACT_GRAB__;t&&e(t);};S();
|
|
5
|
+
exports.attachAgent=S;exports.createOpencodeAgentProvider=O;return exports;})({});
|
package/dist/client.js
CHANGED
|
@@ -1,27 +1,23 @@
|
|
|
1
|
-
//
|
|
2
|
-
var DEFAULT_PORT = 6567;
|
|
1
|
+
// ../utils/dist/client.js
|
|
3
2
|
var CONNECTION_CHECK_TTL_MS = 5e3;
|
|
4
|
-
|
|
5
|
-
// src/client.ts
|
|
6
|
-
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
7
3
|
var STORAGE_KEY = "react-grab:agent-sessions";
|
|
8
|
-
var
|
|
4
|
+
var parseSSEEvent = (eventBlock) => {
|
|
9
5
|
let eventType = "";
|
|
10
6
|
let data = "";
|
|
11
|
-
for (const line of
|
|
7
|
+
for (const line of eventBlock.split("\n")) {
|
|
12
8
|
if (line.startsWith("event:")) eventType = line.slice(6).trim();
|
|
13
9
|
else if (line.startsWith("data:")) data = line.slice(5).trim();
|
|
14
10
|
}
|
|
15
11
|
return { eventType, data };
|
|
16
12
|
};
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
let
|
|
13
|
+
async function* streamSSE(stream, signal) {
|
|
14
|
+
const reader = stream.getReader();
|
|
15
|
+
const decoder = new TextDecoder();
|
|
16
|
+
let buffer = "";
|
|
21
17
|
let aborted = false;
|
|
22
18
|
const onAbort = () => {
|
|
23
19
|
aborted = true;
|
|
24
|
-
|
|
20
|
+
reader.cancel().catch(() => {
|
|
25
21
|
});
|
|
26
22
|
};
|
|
27
23
|
signal.addEventListener("abort", onAbort);
|
|
@@ -30,18 +26,16 @@ var streamSSE = async function* (stream, signal) {
|
|
|
30
26
|
throw new DOMException("Aborted", "AbortError");
|
|
31
27
|
}
|
|
32
28
|
while (true) {
|
|
33
|
-
const result = await
|
|
29
|
+
const result = await reader.read();
|
|
34
30
|
if (aborted || signal.aborted) {
|
|
35
31
|
throw new DOMException("Aborted", "AbortError");
|
|
36
32
|
}
|
|
37
33
|
const { done, value } = result;
|
|
38
|
-
if (value)
|
|
39
|
-
let
|
|
40
|
-
while ((
|
|
41
|
-
const { eventType, data } =
|
|
42
|
-
|
|
43
|
-
);
|
|
44
|
-
textBuffer = textBuffer.slice(boundaryIndex + 2);
|
|
34
|
+
if (value) buffer += decoder.decode(value, { stream: true });
|
|
35
|
+
let boundary;
|
|
36
|
+
while ((boundary = buffer.indexOf("\n\n")) !== -1) {
|
|
37
|
+
const { eventType, data } = parseSSEEvent(buffer.slice(0, boundary));
|
|
38
|
+
buffer = buffer.slice(boundary + 2);
|
|
45
39
|
if (eventType === "done") return;
|
|
46
40
|
if (eventType === "error") throw new Error(data || "Agent error");
|
|
47
41
|
if (data) yield data;
|
|
@@ -51,12 +45,19 @@ var streamSSE = async function* (stream, signal) {
|
|
|
51
45
|
} finally {
|
|
52
46
|
signal.removeEventListener("abort", onAbort);
|
|
53
47
|
try {
|
|
54
|
-
|
|
48
|
+
reader.releaseLock();
|
|
55
49
|
} catch {
|
|
56
50
|
}
|
|
57
51
|
}
|
|
58
|
-
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// src/constants.ts
|
|
55
|
+
var DEFAULT_PORT = 6567;
|
|
56
|
+
|
|
57
|
+
// src/client.ts
|
|
58
|
+
var DEFAULT_SERVER_URL = `http://localhost:${DEFAULT_PORT}`;
|
|
59
59
|
var streamFromServer = async function* (serverUrl, context, signal) {
|
|
60
|
+
const startTime = Date.now();
|
|
60
61
|
const sessionId = context.sessionId;
|
|
61
62
|
const handleAbort = () => {
|
|
62
63
|
if (sessionId) {
|
|
@@ -80,7 +81,37 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
80
81
|
if (!response.body) {
|
|
81
82
|
throw new Error("No response body");
|
|
82
83
|
}
|
|
83
|
-
|
|
84
|
+
const iterator = streamSSE(response.body, signal)[Symbol.asyncIterator]();
|
|
85
|
+
let done = false;
|
|
86
|
+
let pendingNext = iterator.next();
|
|
87
|
+
while (!done) {
|
|
88
|
+
const result = await Promise.race([
|
|
89
|
+
pendingNext.then((iteratorResult) => ({
|
|
90
|
+
type: "status",
|
|
91
|
+
iteratorResult
|
|
92
|
+
})),
|
|
93
|
+
new Promise(
|
|
94
|
+
(resolve) => setTimeout(() => resolve({ type: "timeout" }), 100)
|
|
95
|
+
)
|
|
96
|
+
]);
|
|
97
|
+
if (result.type === "timeout") {
|
|
98
|
+
const elapsedSeconds = (Date.now() - startTime) / 1e3;
|
|
99
|
+
yield `Working\u2026 ${elapsedSeconds.toFixed(1)}s`;
|
|
100
|
+
} else {
|
|
101
|
+
const iteratorResult = result.iteratorResult;
|
|
102
|
+
done = iteratorResult.done ?? false;
|
|
103
|
+
if (!done && iteratorResult.value) {
|
|
104
|
+
const status = iteratorResult.value;
|
|
105
|
+
if (status === "Completed successfully") {
|
|
106
|
+
const totalSeconds = ((Date.now() - startTime) / 1e3).toFixed(1);
|
|
107
|
+
yield `Completed in ${totalSeconds}s`;
|
|
108
|
+
} else {
|
|
109
|
+
yield status;
|
|
110
|
+
}
|
|
111
|
+
pendingNext = iterator.next();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
84
115
|
} finally {
|
|
85
116
|
signal.removeEventListener("abort", handleAbort);
|
|
86
117
|
}
|
package/dist/server.cjs
CHANGED
|
@@ -951,7 +951,7 @@ var require_picocolors = __commonJS({
|
|
|
951
951
|
// ../../node_modules/.pnpm/@opencode-ai+sdk@1.0.132/node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
|
|
952
952
|
var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url, ...options }) => {
|
|
953
953
|
let lastEventId;
|
|
954
|
-
const
|
|
954
|
+
const sleep2 = sseSleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
955
955
|
const createStream = async function* () {
|
|
956
956
|
let retryDelay = sseDefaultRetryDelay ?? 3e3;
|
|
957
957
|
let attempt = 0;
|
|
@@ -1046,7 +1046,7 @@ var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseVa
|
|
|
1046
1046
|
break;
|
|
1047
1047
|
}
|
|
1048
1048
|
const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 3e4);
|
|
1049
|
-
await
|
|
1049
|
+
await sleep2(backoff);
|
|
1050
1050
|
}
|
|
1051
1051
|
}
|
|
1052
1052
|
};
|
|
@@ -7339,16 +7339,23 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
7339
7339
|
|
|
7340
7340
|
// src/constants.ts
|
|
7341
7341
|
var DEFAULT_PORT = 6567;
|
|
7342
|
-
|
|
7342
|
+
|
|
7343
|
+
// ../utils/dist/server.js
|
|
7344
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7345
|
+
var VERSION = "0.0.83";
|
|
7346
|
+
var OPENCODE_SDK_PORT = 4096;
|
|
7343
7347
|
var opencodeInstance = null;
|
|
7344
7348
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7345
7349
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7346
7350
|
var lastOpencodeSessionId;
|
|
7347
7351
|
var getOpencodeClient = async () => {
|
|
7348
7352
|
if (!opencodeInstance) {
|
|
7353
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(() => {
|
|
7354
|
+
});
|
|
7355
|
+
await sleep(100);
|
|
7349
7356
|
const instance = await createOpencode({
|
|
7350
7357
|
hostname: "127.0.0.1",
|
|
7351
|
-
port:
|
|
7358
|
+
port: OPENCODE_SDK_PORT
|
|
7352
7359
|
});
|
|
7353
7360
|
opencodeInstance = instance;
|
|
7354
7361
|
}
|
|
@@ -7481,6 +7488,7 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7481
7488
|
var startServer = async (port = DEFAULT_PORT) => {
|
|
7482
7489
|
await fkill(`:${port}`, { force: true, silent: true }).catch(() => {
|
|
7483
7490
|
});
|
|
7491
|
+
await sleep(100);
|
|
7484
7492
|
const honoApplication = createServer();
|
|
7485
7493
|
serve({ fetch: honoApplication.fetch, port });
|
|
7486
7494
|
console.log(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
|
package/dist/server.js
CHANGED
|
@@ -940,7 +940,7 @@ var require_picocolors = __commonJS({
|
|
|
940
940
|
// ../../node_modules/.pnpm/@opencode-ai+sdk@1.0.132/node_modules/@opencode-ai/sdk/dist/gen/core/serverSentEvents.gen.js
|
|
941
941
|
var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseValidator, sseDefaultRetryDelay, sseMaxRetryAttempts, sseMaxRetryDelay, sseSleepFn, url, ...options }) => {
|
|
942
942
|
let lastEventId;
|
|
943
|
-
const
|
|
943
|
+
const sleep2 = sseSleepFn ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
944
944
|
const createStream = async function* () {
|
|
945
945
|
let retryDelay = sseDefaultRetryDelay ?? 3e3;
|
|
946
946
|
let attempt = 0;
|
|
@@ -1035,7 +1035,7 @@ var createSseClient = ({ onSseError, onSseEvent, responseTransformer, responseVa
|
|
|
1035
1035
|
break;
|
|
1036
1036
|
}
|
|
1037
1037
|
const backoff = Math.min(retryDelay * 2 ** (attempt - 1), sseMaxRetryDelay ?? 3e4);
|
|
1038
|
-
await
|
|
1038
|
+
await sleep2(backoff);
|
|
1039
1039
|
}
|
|
1040
1040
|
}
|
|
1041
1041
|
};
|
|
@@ -7328,16 +7328,23 @@ var import_picocolors = __toESM(require_picocolors());
|
|
|
7328
7328
|
|
|
7329
7329
|
// src/constants.ts
|
|
7330
7330
|
var DEFAULT_PORT = 6567;
|
|
7331
|
-
|
|
7331
|
+
|
|
7332
|
+
// ../utils/dist/server.js
|
|
7333
|
+
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7334
|
+
var VERSION = "0.0.83";
|
|
7335
|
+
var OPENCODE_SDK_PORT = 4096;
|
|
7332
7336
|
var opencodeInstance = null;
|
|
7333
7337
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7334
7338
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7335
7339
|
var lastOpencodeSessionId;
|
|
7336
7340
|
var getOpencodeClient = async () => {
|
|
7337
7341
|
if (!opencodeInstance) {
|
|
7342
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(() => {
|
|
7343
|
+
});
|
|
7344
|
+
await sleep(100);
|
|
7338
7345
|
const instance = await createOpencode({
|
|
7339
7346
|
hostname: "127.0.0.1",
|
|
7340
|
-
port:
|
|
7347
|
+
port: OPENCODE_SDK_PORT
|
|
7341
7348
|
});
|
|
7342
7349
|
opencodeInstance = instance;
|
|
7343
7350
|
}
|
|
@@ -7470,6 +7477,7 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7470
7477
|
var startServer = async (port = DEFAULT_PORT) => {
|
|
7471
7478
|
await fkill(`:${port}`, { force: true, silent: true }).catch(() => {
|
|
7472
7479
|
});
|
|
7480
|
+
await sleep(100);
|
|
7473
7481
|
const honoApplication = createServer();
|
|
7474
7482
|
serve({ fetch: honoApplication.fetch, port });
|
|
7475
7483
|
console.log(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-grab/opencode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.83",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
|
-
"react-grab-opencode": "./dist/cli.
|
|
6
|
+
"react-grab-opencode": "./dist/cli.cjs"
|
|
7
7
|
},
|
|
8
8
|
"exports": {
|
|
9
9
|
"./client": {
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
],
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/cross-spawn": "^6.0.6",
|
|
28
|
-
"tsup": "^8.4.0"
|
|
28
|
+
"tsup": "^8.4.0",
|
|
29
|
+
"@react-grab/utils": "0.0.83"
|
|
29
30
|
},
|
|
30
31
|
"dependencies": {
|
|
31
32
|
"@hono/node-server": "^1.19.6",
|
|
@@ -34,7 +35,7 @@
|
|
|
34
35
|
"fkill": "^9.0.0",
|
|
35
36
|
"hono": "^4.0.0",
|
|
36
37
|
"picocolors": "^1.1.1",
|
|
37
|
-
"react-grab": "0.0.
|
|
38
|
+
"react-grab": "0.0.83"
|
|
38
39
|
},
|
|
39
40
|
"scripts": {
|
|
40
41
|
"dev": "tsup --watch",
|