@react-grab/opencode 0.0.83 → 0.0.84
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 +17 -13
- package/dist/server.js +17 -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,18 @@ 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.84";
|
|
7346
7346
|
var OPENCODE_SDK_PORT = 4096;
|
|
7347
7347
|
var opencodeInstance = null;
|
|
7348
7348
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7349
7349
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7350
|
-
var
|
|
7351
|
-
var
|
|
7350
|
+
var lastOpenCodeSessionId;
|
|
7351
|
+
var getOpenCodeClient = async () => {
|
|
7352
7352
|
if (!opencodeInstance) {
|
|
7353
|
-
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7354
|
-
|
|
7353
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7354
|
+
() => {
|
|
7355
|
+
}
|
|
7356
|
+
);
|
|
7355
7357
|
await sleep(100);
|
|
7356
7358
|
const instance = await createOpencode({
|
|
7357
7359
|
hostname: "127.0.0.1",
|
|
@@ -7361,8 +7363,8 @@ var getOpencodeClient = async () => {
|
|
|
7361
7363
|
}
|
|
7362
7364
|
return opencodeInstance.client;
|
|
7363
7365
|
};
|
|
7364
|
-
var
|
|
7365
|
-
const client2 = await
|
|
7366
|
+
var executeOpenCodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
|
|
7367
|
+
const client2 = await getOpenCodeClient();
|
|
7366
7368
|
onStatus?.("Thinking...");
|
|
7367
7369
|
let opencodeSessionId;
|
|
7368
7370
|
if (reactGrabSessionId && sessionMap.has(reactGrabSessionId)) {
|
|
@@ -7379,7 +7381,7 @@ var executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId
|
|
|
7379
7381
|
sessionMap.set(reactGrabSessionId, opencodeSessionId);
|
|
7380
7382
|
}
|
|
7381
7383
|
}
|
|
7382
|
-
|
|
7384
|
+
lastOpenCodeSessionId = opencodeSessionId;
|
|
7383
7385
|
const modelConfig = options?.model ? {
|
|
7384
7386
|
providerID: options.model.split("/")[0],
|
|
7385
7387
|
modelID: options.model.split("/")[1] || options.model
|
|
@@ -7416,7 +7418,7 @@ ${content}
|
|
|
7416
7418
|
return streamSSE(context, async (stream2) => {
|
|
7417
7419
|
const isAborted = () => sessionId && abortedSessions.has(sessionId);
|
|
7418
7420
|
try {
|
|
7419
|
-
await
|
|
7421
|
+
await executeOpenCodePrompt(
|
|
7420
7422
|
formattedPrompt,
|
|
7421
7423
|
options,
|
|
7422
7424
|
(text) => {
|
|
@@ -7463,13 +7465,13 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7463
7465
|
return context.json({ status: "ok" });
|
|
7464
7466
|
});
|
|
7465
7467
|
honoApplication.post("/undo", async (context) => {
|
|
7466
|
-
if (!
|
|
7468
|
+
if (!lastOpenCodeSessionId) {
|
|
7467
7469
|
return context.json({ status: "error", message: "No session to undo" });
|
|
7468
7470
|
}
|
|
7469
7471
|
try {
|
|
7470
|
-
const client2 = await
|
|
7472
|
+
const client2 = await getOpenCodeClient();
|
|
7471
7473
|
await client2.session.prompt({
|
|
7472
|
-
path: { id:
|
|
7474
|
+
path: { id: lastOpenCodeSessionId },
|
|
7473
7475
|
body: {
|
|
7474
7476
|
parts: [{ type: "text", text: "/undo" }]
|
|
7475
7477
|
}
|
|
@@ -7491,7 +7493,9 @@ var startServer = async (port = DEFAULT_PORT) => {
|
|
|
7491
7493
|
await sleep(100);
|
|
7492
7494
|
const honoApplication = createServer();
|
|
7493
7495
|
serve({ fetch: honoApplication.fetch, port });
|
|
7494
|
-
console.log(
|
|
7496
|
+
console.log(
|
|
7497
|
+
`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(OpenCode)")}`
|
|
7498
|
+
);
|
|
7495
7499
|
console.log(`- Local: ${import_picocolors.default.cyan(`http://localhost:${port}`)}`);
|
|
7496
7500
|
};
|
|
7497
7501
|
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,18 @@ 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.84";
|
|
7335
7335
|
var OPENCODE_SDK_PORT = 4096;
|
|
7336
7336
|
var opencodeInstance = null;
|
|
7337
7337
|
var sessionMap = /* @__PURE__ */ new Map();
|
|
7338
7338
|
var abortedSessions = /* @__PURE__ */ new Set();
|
|
7339
|
-
var
|
|
7340
|
-
var
|
|
7339
|
+
var lastOpenCodeSessionId;
|
|
7340
|
+
var getOpenCodeClient = async () => {
|
|
7341
7341
|
if (!opencodeInstance) {
|
|
7342
|
-
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7343
|
-
|
|
7342
|
+
await fkill(`:${OPENCODE_SDK_PORT}`, { force: true, silent: true }).catch(
|
|
7343
|
+
() => {
|
|
7344
|
+
}
|
|
7345
|
+
);
|
|
7344
7346
|
await sleep(100);
|
|
7345
7347
|
const instance = await createOpencode({
|
|
7346
7348
|
hostname: "127.0.0.1",
|
|
@@ -7350,8 +7352,8 @@ var getOpencodeClient = async () => {
|
|
|
7350
7352
|
}
|
|
7351
7353
|
return opencodeInstance.client;
|
|
7352
7354
|
};
|
|
7353
|
-
var
|
|
7354
|
-
const client2 = await
|
|
7355
|
+
var executeOpenCodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
|
|
7356
|
+
const client2 = await getOpenCodeClient();
|
|
7355
7357
|
onStatus?.("Thinking...");
|
|
7356
7358
|
let opencodeSessionId;
|
|
7357
7359
|
if (reactGrabSessionId && sessionMap.has(reactGrabSessionId)) {
|
|
@@ -7368,7 +7370,7 @@ var executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId
|
|
|
7368
7370
|
sessionMap.set(reactGrabSessionId, opencodeSessionId);
|
|
7369
7371
|
}
|
|
7370
7372
|
}
|
|
7371
|
-
|
|
7373
|
+
lastOpenCodeSessionId = opencodeSessionId;
|
|
7372
7374
|
const modelConfig = options?.model ? {
|
|
7373
7375
|
providerID: options.model.split("/")[0],
|
|
7374
7376
|
modelID: options.model.split("/")[1] || options.model
|
|
@@ -7405,7 +7407,7 @@ ${content}
|
|
|
7405
7407
|
return streamSSE(context, async (stream2) => {
|
|
7406
7408
|
const isAborted = () => sessionId && abortedSessions.has(sessionId);
|
|
7407
7409
|
try {
|
|
7408
|
-
await
|
|
7410
|
+
await executeOpenCodePrompt(
|
|
7409
7411
|
formattedPrompt,
|
|
7410
7412
|
options,
|
|
7411
7413
|
(text) => {
|
|
@@ -7452,13 +7454,13 @@ ${stderr.trim()}` : errorMessage;
|
|
|
7452
7454
|
return context.json({ status: "ok" });
|
|
7453
7455
|
});
|
|
7454
7456
|
honoApplication.post("/undo", async (context) => {
|
|
7455
|
-
if (!
|
|
7457
|
+
if (!lastOpenCodeSessionId) {
|
|
7456
7458
|
return context.json({ status: "error", message: "No session to undo" });
|
|
7457
7459
|
}
|
|
7458
7460
|
try {
|
|
7459
|
-
const client2 = await
|
|
7461
|
+
const client2 = await getOpenCodeClient();
|
|
7460
7462
|
await client2.session.prompt({
|
|
7461
|
-
path: { id:
|
|
7463
|
+
path: { id: lastOpenCodeSessionId },
|
|
7462
7464
|
body: {
|
|
7463
7465
|
parts: [{ type: "text", text: "/undo" }]
|
|
7464
7466
|
}
|
|
@@ -7480,7 +7482,9 @@ var startServer = async (port = DEFAULT_PORT) => {
|
|
|
7480
7482
|
await sleep(100);
|
|
7481
7483
|
const honoApplication = createServer();
|
|
7482
7484
|
serve({ fetch: honoApplication.fetch, port });
|
|
7483
|
-
console.log(
|
|
7485
|
+
console.log(
|
|
7486
|
+
`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(OpenCode)")}`
|
|
7487
|
+
);
|
|
7484
7488
|
console.log(`- Local: ${import_picocolors.default.cyan(`http://localhost:${port}`)}`);
|
|
7485
7489
|
};
|
|
7486
7490
|
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.84",
|
|
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.84"
|
|
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.84"
|
|
39
38
|
},
|
|
40
39
|
"scripts": {
|
|
41
40
|
"dev": "tsup --watch",
|