@react-grab/opencode 0.0.83 → 0.0.85
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 +6 -6
- package/dist/cli.cjs +6596 -58
- package/dist/cli.js +6589 -57
- package/dist/client.cjs +3 -3
- package/dist/client.global.js +3 -3
- package/dist/client.js +3 -3
- package/dist/server.cjs +22 -13
- package/dist/server.js +22 -13
- package/package.json +4 -5
package/dist/client.cjs
CHANGED
|
@@ -118,7 +118,7 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
118
118
|
signal.removeEventListener("abort", handleAbort);
|
|
119
119
|
}
|
|
120
120
|
};
|
|
121
|
-
var
|
|
121
|
+
var createOpenCodeAgentProvider = (options = {}) => {
|
|
122
122
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = options;
|
|
123
123
|
let connectionCache = null;
|
|
124
124
|
const mergeOptions = (contextOptions) => ({
|
|
@@ -178,7 +178,7 @@ var createOpencodeAgentProvider = (options = {}) => {
|
|
|
178
178
|
};
|
|
179
179
|
var attachAgent = async () => {
|
|
180
180
|
if (typeof window === "undefined") return;
|
|
181
|
-
const provider =
|
|
181
|
+
const provider = createOpenCodeAgentProvider();
|
|
182
182
|
const attach = (api2) => {
|
|
183
183
|
api2.setAgent({ provider, storage: sessionStorage });
|
|
184
184
|
};
|
|
@@ -203,4 +203,4 @@ var attachAgent = async () => {
|
|
|
203
203
|
attachAgent();
|
|
204
204
|
|
|
205
205
|
exports.attachAgent = attachAgent;
|
|
206
|
-
exports.
|
|
206
|
+
exports.createOpenCodeAgentProvider = createOpenCodeAgentProvider;
|
package/dist/client.global.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
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
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: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
|
|
5
|
-
exports.attachAgent=
|
|
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 C=`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);}},E=(c={})=>{let{serverUrl:e=C,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{}}}},O=async()=>{if(typeof window>"u")return;let c=E(),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);};O();
|
|
5
|
+
exports.attachAgent=O;exports.createOpenCodeAgentProvider=E;return exports;})({});
|
package/dist/client.js
CHANGED
|
@@ -116,7 +116,7 @@ var streamFromServer = async function* (serverUrl, context, signal) {
|
|
|
116
116
|
signal.removeEventListener("abort", handleAbort);
|
|
117
117
|
}
|
|
118
118
|
};
|
|
119
|
-
var
|
|
119
|
+
var createOpenCodeAgentProvider = (options = {}) => {
|
|
120
120
|
const { serverUrl = DEFAULT_SERVER_URL, getOptions } = options;
|
|
121
121
|
let connectionCache = null;
|
|
122
122
|
const mergeOptions = (contextOptions) => ({
|
|
@@ -176,7 +176,7 @@ var createOpencodeAgentProvider = (options = {}) => {
|
|
|
176
176
|
};
|
|
177
177
|
var attachAgent = async () => {
|
|
178
178
|
if (typeof window === "undefined") return;
|
|
179
|
-
const provider =
|
|
179
|
+
const provider = createOpenCodeAgentProvider();
|
|
180
180
|
const attach = (api2) => {
|
|
181
181
|
api2.setAgent({ provider, storage: sessionStorage });
|
|
182
182
|
};
|
|
@@ -200,4 +200,4 @@ var attachAgent = async () => {
|
|
|
200
200
|
};
|
|
201
201
|
attachAgent();
|
|
202
202
|
|
|
203
|
-
export { attachAgent,
|
|
203
|
+
export { attachAgent, createOpenCodeAgentProvider };
|
package/dist/server.cjs
CHANGED
|
@@ -7342,16 +7342,23 @@ var DEFAULT_PORT = 6567;
|
|
|
7342
7342
|
|
|
7343
7343
|
// ../utils/dist/server.js
|
|
7344
7344
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7345
|
-
var VERSION = "0.0.
|
|
7345
|
+
var VERSION = "0.0.85";
|
|
7346
|
+
try {
|
|
7347
|
+
fetch(`https://www.react-grab.com/api/version?source=opencode&t=${Date.now()}`).catch(() => {
|
|
7348
|
+
});
|
|
7349
|
+
} catch {
|
|
7350
|
+
}
|
|
7346
7351
|
var OPENCODE_SDK_PORT = 4096;
|
|
7347
7352
|
var opencodeInstance = null;
|
|
7348
7353
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7349
7354
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7350
|
-
var
|
|
7351
|
-
var
|
|
7355
|
+
var lastOpenCodeSessionId;
|
|
7356
|
+
var getOpenCodeClient = async () => {
|
|
7352
7357
|
if (!opencodeInstance) {
|
|
7353
|
-
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7354
|
-
|
|
7358
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7359
|
+
() => {
|
|
7360
|
+
}
|
|
7361
|
+
);
|
|
7355
7362
|
await sleep(100);
|
|
7356
7363
|
const instance = await createOpencode({
|
|
7357
7364
|
hostname: "127.0.0.1",
|
|
@@ -7361,8 +7368,8 @@ var getOpencodeClient = async () => {
|
|
|
7361
7368
|
}
|
|
7362
7369
|
return opencodeInstance.client;
|
|
7363
7370
|
};
|
|
7364
|
-
var
|
|
7365
|
-
const client2 = await
|
|
7371
|
+
var executeOpenCodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
|
|
7372
|
+
const client2 = await getOpenCodeClient();
|
|
7366
7373
|
onStatus?.("Thinking...");
|
|
7367
7374
|
let opencodeSessionId;
|
|
7368
7375
|
if (reactGrabSessionId && sessionMap.has(reactGrabSessionId)) {
|
|
@@ -7379,7 +7386,7 @@ var executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId
|
|
|
7379
7386
|
sessionMap.set(reactGrabSessionId, opencodeSessionId);
|
|
7380
7387
|
}
|
|
7381
7388
|
}
|
|
7382
|
-
|
|
7389
|
+
lastOpenCodeSessionId = opencodeSessionId;
|
|
7383
7390
|
const modelConfig = options?.model ? {
|
|
7384
7391
|
providerID: options.model.split("/")[0],
|
|
7385
7392
|
modelID: options.model.split("/")[1] || options.model
|
|
@@ -7416,7 +7423,7 @@ ${content}
|
|
|
7416
7423
|
return streamSSE(context, async (stream2) => {
|
|
7417
7424
|
const isAborted = () => sessionId && abortedSessions.has(sessionId);
|
|
7418
7425
|
try {
|
|
7419
|
-
await
|
|
7426
|
+
await executeOpenCodePrompt(
|
|
7420
7427
|
formattedPrompt,
|
|
7421
7428
|
options,
|
|
7422
7429
|
(text) => {
|
|
@@ -7463,13 +7470,13 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7463
7470
|
return context.json({ status: "ok" });
|
|
7464
7471
|
});
|
|
7465
7472
|
honoApplication.post("/undo", async (context) => {
|
|
7466
|
-
if (!
|
|
7473
|
+
if (!lastOpenCodeSessionId) {
|
|
7467
7474
|
return context.json({ status: "error", message: "No session to undo" });
|
|
7468
7475
|
}
|
|
7469
7476
|
try {
|
|
7470
|
-
const client2 = await
|
|
7477
|
+
const client2 = await getOpenCodeClient();
|
|
7471
7478
|
await client2.session.prompt({
|
|
7472
|
-
path: { id:
|
|
7479
|
+
path: { id: lastOpenCodeSessionId },
|
|
7473
7480
|
body: {
|
|
7474
7481
|
parts: [{ type: "text", text: "/undo" }]
|
|
7475
7482
|
}
|
|
@@ -7491,7 +7498,9 @@ var startServer = async (port = DEFAULT_PORT) => {
|
|
|
7491
7498
|
await sleep(100);
|
|
7492
7499
|
const honoApplication = createServer();
|
|
7493
7500
|
serve({ fetch: honoApplication.fetch, port });
|
|
7494
|
-
console.log(
|
|
7501
|
+
console.log(
|
|
7502
|
+
`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(OpenCode)")}`
|
|
7503
|
+
);
|
|
7495
7504
|
console.log(`- Local: ${import_picocolors.default.cyan(`http://localhost:${port}`)}`);
|
|
7496
7505
|
};
|
|
7497
7506
|
if ((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('server.cjs', document.baseURI).href)) === url.pathToFileURL(process.argv[1]).href) {
|
package/dist/server.js
CHANGED
|
@@ -7331,16 +7331,23 @@ var DEFAULT_PORT = 6567;
|
|
|
7331
7331
|
|
|
7332
7332
|
// ../utils/dist/server.js
|
|
7333
7333
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
7334
|
-
var VERSION = "0.0.
|
|
7334
|
+
var VERSION = "0.0.85";
|
|
7335
|
+
try {
|
|
7336
|
+
fetch(`https://www.react-grab.com/api/version?source=opencode&t=${Date.now()}`).catch(() => {
|
|
7337
|
+
});
|
|
7338
|
+
} catch {
|
|
7339
|
+
}
|
|
7335
7340
|
var OPENCODE_SDK_PORT = 4096;
|
|
7336
7341
|
var opencodeInstance = null;
|
|
7337
7342
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7338
7343
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7339
|
-
var
|
|
7340
|
-
var
|
|
7344
|
+
var lastOpenCodeSessionId;
|
|
7345
|
+
var getOpenCodeClient = async () => {
|
|
7341
7346
|
if (!opencodeInstance) {
|
|
7342
|
-
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7343
|
-
|
|
7347
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7348
|
+
() => {
|
|
7349
|
+
}
|
|
7350
|
+
);
|
|
7344
7351
|
await sleep(100);
|
|
7345
7352
|
const instance = await createOpencode({
|
|
7346
7353
|
hostname: "127.0.0.1",
|
|
@@ -7350,8 +7357,8 @@ var getOpencodeClient = async () => {
|
|
|
7350
7357
|
}
|
|
7351
7358
|
return opencodeInstance.client;
|
|
7352
7359
|
};
|
|
7353
|
-
var
|
|
7354
|
-
const client2 = await
|
|
7360
|
+
var executeOpenCodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
|
|
7361
|
+
const client2 = await getOpenCodeClient();
|
|
7355
7362
|
onStatus?.("Thinking...");
|
|
7356
7363
|
let opencodeSessionId;
|
|
7357
7364
|
if (reactGrabSessionId && sessionMap.has(reactGrabSessionId)) {
|
|
@@ -7368,7 +7375,7 @@ var executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId
|
|
|
7368
7375
|
sessionMap.set(reactGrabSessionId, opencodeSessionId);
|
|
7369
7376
|
}
|
|
7370
7377
|
}
|
|
7371
|
-
|
|
7378
|
+
lastOpenCodeSessionId = opencodeSessionId;
|
|
7372
7379
|
const modelConfig = options?.model ? {
|
|
7373
7380
|
providerID: options.model.split("/")[0],
|
|
7374
7381
|
modelID: options.model.split("/")[1] || options.model
|
|
@@ -7405,7 +7412,7 @@ ${content}
|
|
|
7405
7412
|
return streamSSE(context, async (stream2) => {
|
|
7406
7413
|
const isAborted = () => sessionId && abortedSessions.has(sessionId);
|
|
7407
7414
|
try {
|
|
7408
|
-
await
|
|
7415
|
+
await executeOpenCodePrompt(
|
|
7409
7416
|
formattedPrompt,
|
|
7410
7417
|
options,
|
|
7411
7418
|
(text) => {
|
|
@@ -7452,13 +7459,13 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7452
7459
|
return context.json({ status: "ok" });
|
|
7453
7460
|
});
|
|
7454
7461
|
honoApplication.post("/undo", async (context) => {
|
|
7455
|
-
if (!
|
|
7462
|
+
if (!lastOpenCodeSessionId) {
|
|
7456
7463
|
return context.json({ status: "error", message: "No session to undo" });
|
|
7457
7464
|
}
|
|
7458
7465
|
try {
|
|
7459
|
-
const client2 = await
|
|
7466
|
+
const client2 = await getOpenCodeClient();
|
|
7460
7467
|
await client2.session.prompt({
|
|
7461
|
-
path: { id:
|
|
7468
|
+
path: { id: lastOpenCodeSessionId },
|
|
7462
7469
|
body: {
|
|
7463
7470
|
parts: [{ type: "text", text: "/undo" }]
|
|
7464
7471
|
}
|
|
@@ -7480,7 +7487,9 @@ var startServer = async (port = DEFAULT_PORT) => {
|
|
|
7480
7487
|
await sleep(100);
|
|
7481
7488
|
const honoApplication = createServer();
|
|
7482
7489
|
serve({ fetch: honoApplication.fetch, port });
|
|
7483
|
-
console.log(
|
|
7490
|
+
console.log(
|
|
7491
|
+
`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(OpenCode)")}`
|
|
7492
|
+
);
|
|
7484
7493
|
console.log(`- Local: ${import_picocolors.default.cyan(`http://localhost:${port}`)}`);
|
|
7485
7494
|
};
|
|
7486
7495
|
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@react-grab/opencode",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.85",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"react-grab-opencode": "./dist/cli.cjs"
|
|
@@ -24,18 +24,17 @@
|
|
|
24
24
|
"dist"
|
|
25
25
|
],
|
|
26
26
|
"devDependencies": {
|
|
27
|
-
"@types/cross-spawn": "^6.0.6",
|
|
28
27
|
"tsup": "^8.4.0",
|
|
29
|
-
"@react-grab/utils": "0.0.
|
|
28
|
+
"@react-grab/utils": "0.0.85"
|
|
30
29
|
},
|
|
31
30
|
"dependencies": {
|
|
32
31
|
"@hono/node-server": "^1.19.6",
|
|
33
32
|
"@opencode-ai/sdk": "^1.0.0",
|
|
34
|
-
"
|
|
33
|
+
"execa": "^9.6.0",
|
|
35
34
|
"fkill": "^9.0.0",
|
|
36
35
|
"hono": "^4.0.0",
|
|
37
36
|
"picocolors": "^1.1.1",
|
|
38
|
-
"react-grab": "0.0.
|
|
37
|
+
"react-grab": "0.0.85"
|
|
39
38
|
},
|
|
40
39
|
"scripts": {
|
|
41
40
|
"dev": "tsup --watch",
|