@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/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 createOpencodeAgentProvider = (options = {}) => {
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 = createOpencodeAgentProvider();
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.createOpencodeAgentProvider = createOpencodeAgentProvider;
206
+ exports.createOpenCodeAgentProvider = createOpenCodeAgentProvider;
@@ -1,5 +1,5 @@
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(`
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 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;})({});
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 createOpencodeAgentProvider = (options = {}) => {
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 = createOpencodeAgentProvider();
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, createOpencodeAgentProvider };
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.83";
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 lastOpencodeSessionId;
7351
- var getOpencodeClient = async () => {
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 executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
7365
- const client2 = await getOpencodeClient();
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
- lastOpencodeSessionId = opencodeSessionId;
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 executeOpencodePrompt(
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 (!lastOpencodeSessionId) {
7473
+ if (!lastOpenCodeSessionId) {
7467
7474
  return context.json({ status: "error", message: "No session to undo" });
7468
7475
  }
7469
7476
  try {
7470
- const client2 = await getOpencodeClient();
7477
+ const client2 = await getOpenCodeClient();
7471
7478
  await client2.session.prompt({
7472
- path: { id: lastOpencodeSessionId },
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(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
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.83";
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 lastOpencodeSessionId;
7340
- var getOpencodeClient = async () => {
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 executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
7354
- const client2 = await getOpencodeClient();
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
- lastOpencodeSessionId = opencodeSessionId;
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 executeOpencodePrompt(
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 (!lastOpencodeSessionId) {
7462
+ if (!lastOpenCodeSessionId) {
7456
7463
  return context.json({ status: "error", message: "No session to undo" });
7457
7464
  }
7458
7465
  try {
7459
- const client2 = await getOpencodeClient();
7466
+ const client2 = await getOpenCodeClient();
7460
7467
  await client2.session.prompt({
7461
- path: { id: lastOpencodeSessionId },
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(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
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.83",
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.83"
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
- "cross-spawn": "^7.0.6",
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.83"
37
+ "react-grab": "0.0.85"
39
38
  },
40
39
  "scripts": {
41
40
  "dev": "tsup --watch",