@react-grab/opencode 0.0.90 → 0.0.92

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 CHANGED
@@ -7138,7 +7138,7 @@ var import_picocolors = __toESM(require_picocolors());
7138
7138
  var DEFAULT_PORT = 6567;
7139
7139
 
7140
7140
  // src/cli.ts
7141
- var VERSION = "0.0.90";
7141
+ var VERSION = "0.0.92";
7142
7142
  var serverPath = path2.join(__dirname, "server.cjs");
7143
7143
  execa(process.execPath, [serverPath], {
7144
7144
  detached: true,
package/dist/cli.js CHANGED
@@ -7130,7 +7130,7 @@ var import_picocolors = __toESM(require_picocolors());
7130
7130
  var DEFAULT_PORT = 6567;
7131
7131
 
7132
7132
  // src/cli.ts
7133
- var VERSION = "0.0.90";
7133
+ var VERSION = "0.0.92";
7134
7134
  var serverPath = join(__dirname, "server.cjs");
7135
7135
  execa(process.execPath, [serverPath], {
7136
7136
  detached: true,
package/dist/client.cjs CHANGED
@@ -71,7 +71,7 @@ var getStoredAgentContext = (storage, sessionId, storageKey = STORAGE_KEY) => {
71
71
  if (!isRecord(context)) throw new Error(`Session ${sessionId} is invalid`);
72
72
  const content = context.content;
73
73
  const prompt = context.prompt;
74
- if (typeof content !== "string" || typeof prompt !== "string") {
74
+ if (!Array.isArray(content) || typeof prompt !== "string") {
75
75
  throw new Error(`Session ${sessionId} is invalid`);
76
76
  }
77
77
  const options = context.options;
@@ -1,5 +1,5 @@
1
- var ReactGrabOpenCode=(function(exports){'use strict';var A=5e3,O="react-grab:agent-sessions",b=t=>{let e="",o="";for(let r of t.split(`
1
+ var ReactGrabOpenCode=(function(exports){'use strict';var m=5e3,O="react-grab:agent-sessions",b=t=>{let e="",o="";for(let r of t.split(`
2
2
  `))r.startsWith("event:")?e=r.slice(6).trim():r.startsWith("data:")&&(o=r.slice(5).trim());return {eventType:e,data:o}},v=async function*(t,e){let o=t.getReader(),r=new TextDecoder,n="",s=false,a=()=>{s=true,o.cancel().catch(()=>{});};e.addEventListener("abort",a);try{if(e.aborted)throw new DOMException("Aborted","AbortError");for(;;){let d=await o.read();if(s||e.aborted)throw new DOMException("Aborted","AbortError");let{done:i,value:p}=d;p&&(n+=r.decode(p,{stream:!0}));let c;for(;(c=n.indexOf(`
3
3
 
4
- `))!==-1;){let{eventType:f,data:l}=b(n.slice(0,c));if(n=n.slice(c+2),f==="done")return;if(f==="error")throw new Error(l||"Agent error");l&&(yield l);}if(i)break}}finally{e.removeEventListener("abort",a);try{o.releaseLock();}catch{}}},m=t=>typeof t=="object"&&t!==null,S=(t,e,o=O)=>{let r=t.getItem(o);if(!r)throw new Error("No sessions to resume");let n;try{n=JSON.parse(r);}catch{throw new Error("Failed to parse stored sessions")}if(!m(n))throw new Error("Invalid stored sessions");let s=n[e];if(!m(s))throw new Error(`Session ${e} not found`);let a=s.context;if(!m(a))throw new Error(`Session ${e} is invalid`);let d=a.content,i=a.prompt;if(typeof d!="string"||typeof i!="string")throw new Error(`Session ${e} is invalid`);let p=a.options,c=a.sessionId;return {content:d,prompt:i,options:p,sessionId:typeof c=="string"?c:void 0}},y=async function*(t,e,o){let r=Date.now(),n=e.sessionId,s=t.pollIntervalMs??100,a=`${t.serverUrl}${t.agentPath??"/agent"}`,d=()=>{if(!n)return;let i=t.abortPath?.(n)??`/abort/${n}`;fetch(`${t.serverUrl}${i}`,{method:"POST"}).catch(()=>{});};o.addEventListener("abort",d);try{let i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:o});if(!i.ok)throw new Error(`Server error: ${i.status}`);if(!i.body)throw new Error("No response body");let p=v(i.body,o)[Symbol.asyncIterator](),c=!1,f=p.next(),l=null;for(;!c;){let C=await Promise.race([f.then(u=>({type:"status",iteratorResult:u})),new Promise(u=>setTimeout(()=>u({type:"timeout"}),s))]),g=(Date.now()-r)/1e3;if(C.type==="status"){let u=C.iteratorResult;c=u.done??!1,!c&&u.value&&(l=u.value,f=p.next());}l===t.completedStatus?yield `Completed in ${g.toFixed(1)}s`:l?yield `${l} ${g.toFixed(1)}s`:yield `Working\u2026 ${g.toFixed(1)}s`;}}finally{o.removeEventListener("abort",d);}},E=(t,e=A)=>{let o=null;return async()=>{let r=Date.now();if(o&&r-o.timestamp<e)return o.result;try{let n=await t();return o={result:n,timestamp:r},n}catch{return o={result:false,timestamp:r},false}}};var w="Completed successfully";var x=`http://localhost:${6567}`,h=t=>typeof t=="object"&&t!==null&&"setAgent"in t,_=(t={})=>{let{serverUrl:e=x,getOptions:o}=t,r=s=>({...o?.()??{},...s??{}}),n=E(async()=>(await fetch(`${e}/health`,{method:"GET"})).ok,A);return {send:async function*(s,a){let d={...s,options:r(s.options)};yield*y({serverUrl:e,completedStatus:w},d,a);},resume:async function*(s,a,d){let i=S(d,s),p={content:i.content,prompt:i.prompt,options:i.options,sessionId:i.sessionId??s},c={...p,options:r(p.options)};yield "Resuming...",yield*y({serverUrl:e,completedStatus:w},c,a);},supportsResume:true,supportsFollowUp:true,checkConnection:n,undo:async()=>{try{await fetch(`${e}/undo`,{method:"POST"});}catch{}}}},R=async()=>{if(typeof window>"u")return;let t=_(),e=n=>{n.setAgent({provider:t,storage:sessionStorage});},o=window.__REACT_GRAB__;if(h(o)){e(o);return}window.addEventListener("react-grab:init",n=>{n instanceof CustomEvent&&h(n.detail)&&e(n.detail);},{once:true});let r=window.__REACT_GRAB__;h(r)&&e(r);};R();
4
+ `))!==-1;){let{eventType:f,data:l}=b(n.slice(0,c));if(n=n.slice(c+2),f==="done")return;if(f==="error")throw new Error(l||"Agent error");l&&(yield l);}if(i)break}}finally{e.removeEventListener("abort",a);try{o.releaseLock();}catch{}}},A=t=>typeof t=="object"&&t!==null,S=(t,e,o=O)=>{let r=t.getItem(o);if(!r)throw new Error("No sessions to resume");let n;try{n=JSON.parse(r);}catch{throw new Error("Failed to parse stored sessions")}if(!A(n))throw new Error("Invalid stored sessions");let s=n[e];if(!A(s))throw new Error(`Session ${e} not found`);let a=s.context;if(!A(a))throw new Error(`Session ${e} is invalid`);let d=a.content,i=a.prompt;if(!Array.isArray(d)||typeof i!="string")throw new Error(`Session ${e} is invalid`);let p=a.options,c=a.sessionId;return {content:d,prompt:i,options:p,sessionId:typeof c=="string"?c:void 0}},y=async function*(t,e,o){let r=Date.now(),n=e.sessionId,s=t.pollIntervalMs??100,a=`${t.serverUrl}${t.agentPath??"/agent"}`,d=()=>{if(!n)return;let i=t.abortPath?.(n)??`/abort/${n}`;fetch(`${t.serverUrl}${i}`,{method:"POST"}).catch(()=>{});};o.addEventListener("abort",d);try{let i=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),signal:o});if(!i.ok)throw new Error(`Server error: ${i.status}`);if(!i.body)throw new Error("No response body");let p=v(i.body,o)[Symbol.asyncIterator](),c=!1,f=p.next(),l=null;for(;!c;){let C=await Promise.race([f.then(u=>({type:"status",iteratorResult:u})),new Promise(u=>setTimeout(()=>u({type:"timeout"}),s))]),g=(Date.now()-r)/1e3;if(C.type==="status"){let u=C.iteratorResult;c=u.done??!1,!c&&u.value&&(l=u.value,f=p.next());}l===t.completedStatus?yield `Completed in ${g.toFixed(1)}s`:l?yield `${l} ${g.toFixed(1)}s`:yield `Working\u2026 ${g.toFixed(1)}s`;}}finally{o.removeEventListener("abort",d);}},E=(t,e=m)=>{let o=null;return async()=>{let r=Date.now();if(o&&r-o.timestamp<e)return o.result;try{let n=await t();return o={result:n,timestamp:r},n}catch{return o={result:false,timestamp:r},false}}};var w="Completed successfully";var x=`http://localhost:${6567}`,h=t=>typeof t=="object"&&t!==null&&"setAgent"in t,_=(t={})=>{let{serverUrl:e=x,getOptions:o}=t,r=s=>({...o?.()??{},...s??{}}),n=E(async()=>(await fetch(`${e}/health`,{method:"GET"})).ok,m);return {send:async function*(s,a){let d={...s,options:r(s.options)};yield*y({serverUrl:e,completedStatus:w},d,a);},resume:async function*(s,a,d){let i=S(d,s),p={content:i.content,prompt:i.prompt,options:i.options,sessionId:i.sessionId??s},c={...p,options:r(p.options)};yield "Resuming...",yield*y({serverUrl:e,completedStatus:w},c,a);},supportsResume:true,supportsFollowUp:true,checkConnection:n,undo:async()=>{try{await fetch(`${e}/undo`,{method:"POST"});}catch{}}}},R=async()=>{if(typeof window>"u")return;let t=_(),e=n=>{n.setAgent({provider:t,storage:sessionStorage});},o=window.__REACT_GRAB__;if(h(o)){e(o);return}window.addEventListener("react-grab:init",n=>{n instanceof CustomEvent&&h(n.detail)&&e(n.detail);},{once:true});let r=window.__REACT_GRAB__;h(r)&&e(r);};R();
5
5
  exports.attachAgent=R;exports.createOpenCodeAgentProvider=_;return exports;})({});
package/dist/client.js CHANGED
@@ -69,7 +69,7 @@ var getStoredAgentContext = (storage, sessionId, storageKey = STORAGE_KEY) => {
69
69
  if (!isRecord(context)) throw new Error(`Session ${sessionId} is invalid`);
70
70
  const content = context.content;
71
71
  const prompt = context.prompt;
72
- if (typeof content !== "string" || typeof prompt !== "string") {
72
+ if (!Array.isArray(content) || typeof prompt !== "string") {
73
73
  throw new Error(`Session ${sessionId} is invalid`);
74
74
  }
75
75
  const options = context.options;
package/dist/server.cjs CHANGED
@@ -7343,7 +7343,7 @@ var COMPLETED_STATUS = "Completed successfully";
7343
7343
 
7344
7344
  // ../utils/dist/server.js
7345
7345
  var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
7346
- var VERSION = "0.0.90";
7346
+ var VERSION = "0.0.92";
7347
7347
  try {
7348
7348
  fetch(
7349
7349
  `https://www.react-grab.com/api/version?source=opencode&t=${Date.now()}`
@@ -7525,24 +7525,56 @@ var createServer = () => {
7525
7525
  const requestBody = await context.req.json();
7526
7526
  const { content, prompt, options, sessionId } = requestBody;
7527
7527
  const isFollowUp = Boolean(sessionId && sessionMap.has(sessionId));
7528
- const formattedPrompt = isFollowUp ? prompt : `
7528
+ const contentItems = Array.isArray(content) ? content : [content];
7529
+ return streamSSE(context, async (stream2) => {
7530
+ if (isFollowUp) {
7531
+ for await (const message of runAgent(prompt, {
7532
+ ...options,
7533
+ sessionId
7534
+ })) {
7535
+ if (message.type === "error") {
7536
+ await stream2.writeSSE({
7537
+ data: `Error: ${message.content}`,
7538
+ event: "error"
7539
+ });
7540
+ } else {
7541
+ await stream2.writeSSE({
7542
+ data: message.content,
7543
+ event: message.type
7544
+ });
7545
+ }
7546
+ }
7547
+ return;
7548
+ }
7549
+ for (let i = 0; i < contentItems.length; i++) {
7550
+ const elementContent = contentItems[i];
7551
+ const formattedPrompt = `
7529
7552
  User Request: ${prompt}
7530
7553
 
7531
7554
  Context:
7532
- ${content}
7555
+ ${elementContent}
7533
7556
  `;
7534
- return streamSSE(context, async (stream2) => {
7535
- for await (const message of runAgent(formattedPrompt, {
7536
- ...options,
7537
- sessionId
7538
- })) {
7539
- if (message.type === "error") {
7557
+ if (contentItems.length > 1) {
7540
7558
  await stream2.writeSSE({
7541
- data: `Error: ${message.content}`,
7542
- event: "error"
7559
+ data: `Processing element ${i + 1} of ${contentItems.length}...`,
7560
+ event: "status"
7543
7561
  });
7544
- } else {
7545
- await stream2.writeSSE({ data: message.content, event: message.type });
7562
+ }
7563
+ for await (const message of runAgent(formattedPrompt, {
7564
+ ...options,
7565
+ sessionId
7566
+ })) {
7567
+ if (message.type === "error") {
7568
+ await stream2.writeSSE({
7569
+ data: `Error: ${message.content}`,
7570
+ event: "error"
7571
+ });
7572
+ } else {
7573
+ await stream2.writeSSE({
7574
+ data: message.content,
7575
+ event: message.type
7576
+ });
7577
+ }
7546
7578
  }
7547
7579
  }
7548
7580
  });
package/dist/server.js CHANGED
@@ -7332,7 +7332,7 @@ var COMPLETED_STATUS = "Completed successfully";
7332
7332
 
7333
7333
  // ../utils/dist/server.js
7334
7334
  var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
7335
- var VERSION = "0.0.90";
7335
+ var VERSION = "0.0.92";
7336
7336
  try {
7337
7337
  fetch(
7338
7338
  `https://www.react-grab.com/api/version?source=opencode&t=${Date.now()}`
@@ -7514,24 +7514,56 @@ var createServer = () => {
7514
7514
  const requestBody = await context.req.json();
7515
7515
  const { content, prompt, options, sessionId } = requestBody;
7516
7516
  const isFollowUp = Boolean(sessionId && sessionMap.has(sessionId));
7517
- const formattedPrompt = isFollowUp ? prompt : `
7517
+ const contentItems = Array.isArray(content) ? content : [content];
7518
+ return streamSSE(context, async (stream2) => {
7519
+ if (isFollowUp) {
7520
+ for await (const message of runAgent(prompt, {
7521
+ ...options,
7522
+ sessionId
7523
+ })) {
7524
+ if (message.type === "error") {
7525
+ await stream2.writeSSE({
7526
+ data: `Error: ${message.content}`,
7527
+ event: "error"
7528
+ });
7529
+ } else {
7530
+ await stream2.writeSSE({
7531
+ data: message.content,
7532
+ event: message.type
7533
+ });
7534
+ }
7535
+ }
7536
+ return;
7537
+ }
7538
+ for (let i = 0; i < contentItems.length; i++) {
7539
+ const elementContent = contentItems[i];
7540
+ const formattedPrompt = `
7518
7541
  User Request: ${prompt}
7519
7542
 
7520
7543
  Context:
7521
- ${content}
7544
+ ${elementContent}
7522
7545
  `;
7523
- return streamSSE(context, async (stream2) => {
7524
- for await (const message of runAgent(formattedPrompt, {
7525
- ...options,
7526
- sessionId
7527
- })) {
7528
- if (message.type === "error") {
7546
+ if (contentItems.length > 1) {
7529
7547
  await stream2.writeSSE({
7530
- data: `Error: ${message.content}`,
7531
- event: "error"
7548
+ data: `Processing element ${i + 1} of ${contentItems.length}...`,
7549
+ event: "status"
7532
7550
  });
7533
- } else {
7534
- await stream2.writeSSE({ data: message.content, event: message.type });
7551
+ }
7552
+ for await (const message of runAgent(formattedPrompt, {
7553
+ ...options,
7554
+ sessionId
7555
+ })) {
7556
+ if (message.type === "error") {
7557
+ await stream2.writeSSE({
7558
+ data: `Error: ${message.content}`,
7559
+ event: "error"
7560
+ });
7561
+ } else {
7562
+ await stream2.writeSSE({
7563
+ data: message.content,
7564
+ event: message.type
7565
+ });
7566
+ }
7535
7567
  }
7536
7568
  }
7537
7569
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-grab/opencode",
3
- "version": "0.0.90",
3
+ "version": "0.0.92",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "react-grab-opencode": "./dist/cli.cjs"
@@ -26,7 +26,7 @@
26
26
  "devDependencies": {
27
27
  "@types/node": "^22.10.7",
28
28
  "tsup": "^8.4.0",
29
- "@react-grab/utils": "0.0.90"
29
+ "@react-grab/utils": "0.0.92"
30
30
  },
31
31
  "dependencies": {
32
32
  "@hono/node-server": "^1.19.6",
@@ -35,7 +35,7 @@
35
35
  "fkill": "^9.0.0",
36
36
  "hono": "^4.0.0",
37
37
  "picocolors": "^1.1.1",
38
- "react-grab": "0.0.90"
38
+ "react-grab": "0.0.92"
39
39
  },
40
40
  "scripts": {
41
41
  "dev": "tsup --watch",