@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/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,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.83";
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 lastOpencodeSessionId;
7351
- var getOpencodeClient = async () => {
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 executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
7365
- const client2 = await getOpencodeClient();
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
- lastOpencodeSessionId = opencodeSessionId;
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 executeOpencodePrompt(
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 (!lastOpencodeSessionId) {
7468
+ if (!lastOpenCodeSessionId) {
7467
7469
  return context.json({ status: "error", message: "No session to undo" });
7468
7470
  }
7469
7471
  try {
7470
- const client2 = await getOpencodeClient();
7472
+ const client2 = await getOpenCodeClient();
7471
7473
  await client2.session.prompt({
7472
- path: { id: lastOpencodeSessionId },
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(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
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.83";
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 lastOpencodeSessionId;
7340
- var getOpencodeClient = async () => {
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 executeOpencodePrompt = async (prompt, options, onStatus, reactGrabSessionId) => {
7354
- const client2 = await getOpencodeClient();
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
- lastOpencodeSessionId = opencodeSessionId;
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 executeOpencodePrompt(
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 (!lastOpencodeSessionId) {
7457
+ if (!lastOpenCodeSessionId) {
7456
7458
  return context.json({ status: "error", message: "No session to undo" });
7457
7459
  }
7458
7460
  try {
7459
- const client2 = await getOpencodeClient();
7461
+ const client2 = await getOpenCodeClient();
7460
7462
  await client2.session.prompt({
7461
- path: { id: lastOpencodeSessionId },
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(`${import_picocolors.default.magenta("\u269B")} ${import_picocolors.default.bold("React Grab")} ${import_picocolors.default.gray(VERSION)} ${import_picocolors.default.dim("(Opencode)")}`);
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.83",
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.83"
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
- "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.84"
39
38
  },
40
39
  "scripts": {
41
40
  "dev": "tsup --watch",