@mangostudio/cli-darwin-arm64 0.1.0-canary.eb3254e → 0.1.0-canary.f244aa2

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.
@@ -6,13 +6,8 @@
6
6
  * NDJSON events (and tool_request RPC) to stdout.
7
7
  */
8
8
 
9
+ import { createInterface } from 'node:readline';
9
10
  import { Agent, Cursor } from '@cursor/sdk';
10
- import {
11
- createStdinMultiplexer,
12
- isRecord,
13
- serializeError,
14
- writeEvent,
15
- } from './sidecar-runtime.mjs';
16
11
 
17
12
  /**
18
13
  * NDJSON protocol version announced in the `ready` handshake. Must stay in
@@ -21,6 +16,48 @@ import {
21
16
  */
22
17
  const PROTOCOL_VERSION = 1;
23
18
 
19
+ /** Tool RPC wait applied when the parent does not pass toolRpcTimeoutMs. */
20
+ const DEFAULT_TOOL_RPC_TIMEOUT_MS = 300_000;
21
+
22
+ // If the parent dies mid-run, stdout writes raise EPIPE; swallow so cleanup
23
+ // paths (agent disposal, exit handlers) still run instead of crashing.
24
+ process.stdout.on('error', () => {});
25
+
26
+ function writeEvent(event) {
27
+ try {
28
+ process.stdout.write(`${JSON.stringify(event)}\n`);
29
+ } catch {
30
+ // Parent may be gone (EPIPE); nothing useful to do.
31
+ }
32
+ }
33
+
34
+ function isRecord(value) {
35
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
36
+ }
37
+
38
+ function errorStatus(error) {
39
+ if (!isRecord(error)) return undefined;
40
+ const status = error.status ?? error.statusCode;
41
+ return typeof status === 'number' ? status : undefined;
42
+ }
43
+
44
+ function errorRetryable(error) {
45
+ if (!isRecord(error)) return undefined;
46
+ return typeof error.isRetryable === 'boolean' ? error.isRetryable : undefined;
47
+ }
48
+
49
+ function serializeError(error, fallback) {
50
+ const message = error instanceof Error && error.message ? error.message : fallback;
51
+ const status = errorStatus(error);
52
+ const isRetryable = errorRetryable(error);
53
+ return {
54
+ message,
55
+ content: message,
56
+ ...(status === undefined ? {} : { status }),
57
+ ...(isRetryable === undefined ? {} : { isRetryable, retryable: isRetryable }),
58
+ };
59
+ }
60
+
24
61
  function normalizeCustomTools(value) {
25
62
  if (!Array.isArray(value)) return undefined;
26
63
 
@@ -48,6 +85,100 @@ function normalizeSettingSources(value) {
48
85
  return sources.length > 0 ? sources : ['project'];
49
86
  }
50
87
 
88
+ function createStdinMultiplexer() {
89
+ const rl = createInterface({ input: process.stdin });
90
+ const toolWaiters = new Map();
91
+ let toolRpcTimeoutMs = DEFAULT_TOOL_RPC_TIMEOUT_MS;
92
+ let requestResolve;
93
+ let gotRequest = false;
94
+ let closedByUs = false;
95
+
96
+ const requestPromise = new Promise((resolve) => {
97
+ requestResolve = resolve;
98
+ });
99
+
100
+ rl.on('line', (line) => {
101
+ if (!line.trim()) return;
102
+
103
+ let parsed;
104
+ try {
105
+ parsed = JSON.parse(line);
106
+ } catch {
107
+ return;
108
+ }
109
+
110
+ if (!gotRequest) {
111
+ gotRequest = true;
112
+ requestResolve(parsed);
113
+ return;
114
+ }
115
+
116
+ if (parsed?.type === 'tool_response' && typeof parsed.id === 'string') {
117
+ const waiter = toolWaiters.get(parsed.id);
118
+ if (waiter) {
119
+ toolWaiters.delete(parsed.id);
120
+ if (waiter.timeout) clearTimeout(waiter.timeout);
121
+ waiter.resolve(parsed);
122
+ }
123
+ }
124
+ });
125
+
126
+ rl.on('close', () => {
127
+ if (closedByUs) return;
128
+
129
+ // Parent died before sending a request: exit instead of idling forever.
130
+ if (!gotRequest) {
131
+ writeEvent({
132
+ type: 'error',
133
+ content: 'Cursor sidecar stdin closed before a request was received.',
134
+ done: true,
135
+ });
136
+ process.exit(1);
137
+ }
138
+
139
+ // Mid-run stdin close: no tool_response can ever arrive; unblock callers.
140
+ rejectPendingToolWaiters(
141
+ toolWaiters,
142
+ new Error('Cursor sidecar stdin closed while a tool call was pending.')
143
+ );
144
+ });
145
+
146
+ return {
147
+ readRequest: () => requestPromise,
148
+ setToolRpcTimeoutMs(value) {
149
+ toolRpcTimeoutMs = normalizeToolRpcTimeoutMs(value);
150
+ },
151
+ waitForToolResponse(id) {
152
+ return new Promise((resolve, reject) => {
153
+ const timeout = setTimeout(() => {
154
+ toolWaiters.delete(id);
155
+ reject(new Error(`Tool RPC timed out after ${toolRpcTimeoutMs}ms.`));
156
+ }, toolRpcTimeoutMs);
157
+ timeout.unref?.();
158
+ toolWaiters.set(id, { resolve, reject, timeout });
159
+ });
160
+ },
161
+ close: () => {
162
+ closedByUs = true;
163
+ rl.close();
164
+ },
165
+ };
166
+ }
167
+
168
+ function rejectPendingToolWaiters(toolWaiters, error) {
169
+ for (const [id, waiter] of toolWaiters) {
170
+ toolWaiters.delete(id);
171
+ if (waiter.timeout) clearTimeout(waiter.timeout);
172
+ waiter.reject(error);
173
+ }
174
+ }
175
+
176
+ function normalizeToolRpcTimeoutMs(value) {
177
+ if (typeof value !== 'number' || !Number.isFinite(value)) return DEFAULT_TOOL_RPC_TIMEOUT_MS;
178
+ const rounded = Math.trunc(value);
179
+ return rounded > 0 ? rounded : DEFAULT_TOOL_RPC_TIMEOUT_MS;
180
+ }
181
+
51
182
  let nextToolRequestId = 0;
52
183
 
53
184
  function createRpcBackedCustomTools(toolDefs, stdinMux) {
@@ -248,7 +379,7 @@ async function runAgent(request, stdinMux) {
248
379
  async function main() {
249
380
  writeEvent({ type: 'ready', protocolVersion: PROTOCOL_VERSION });
250
381
 
251
- const stdinMux = createStdinMultiplexer({ sidecarLabel: 'Cursor' });
382
+ const stdinMux = createStdinMultiplexer();
252
383
  const request = await stdinMux.readRequest();
253
384
  if (!isRecord(request)) throw new Error('Sidecar request must be a JSON object.');
254
385
 
package/mangostudio CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mangostudio/cli-darwin-arm64",
3
- "version": "0.1.0-canary.eb3254e",
3
+ "version": "0.1.0-canary.f244aa2",
4
4
  "description": "MangoStudio prebuilt binary for darwin-arm64.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/shiki-Cm6aTOwF.js","assets/index-DQGJtb18.js","assets/rolldown-runtime-BYbx6iT9.js","assets/vendor-CsAvHWDf.js","assets/ui-BEql6gkw.js","assets/vendor-deps-DbBWw3j9.js","assets/index-hn0J71bD.css","assets/syntax-core-BoMshe5A.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{i as t,r as n}from"./ui-BEql6gkw.js";import{i as r,n as i,r as a}from"./index-DQGJtb18.js";import{n as o,t as s}from"./markdown-parser-B0W8Yv4o.js";var c=e(t(),1),l=n(),u=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>`,d=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>`;function f({content:e,className:t,copyCodeLabel:n,codeCopiedLabel:i}){let{t:o}=r(),s=(0,c.useRef)(null),{resolvedCodeTheme:u}=a(),[d,f]=(0,c.useState)(null),[_,v]=(0,c.useState)(0),y=n??o.chat.copyCode,b=i??o.chat.codeCopied,x=(0,c.useMemo)(()=>k(e).join(`
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/shiki-DxX5RKSe.js","assets/index-4w2FUKV5.js","assets/rolldown-runtime-BYbx6iT9.js","assets/vendor-TU_R2f75.js","assets/ui-BEql6gkw.js","assets/vendor-deps-C4ULb-aw.js","assets/index-BYDs1qLs.css","assets/syntax-core-BoMshe5A.js"])))=>i.map(i=>d[i]);
2
+ import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{i as t,r as n}from"./ui-BEql6gkw.js";import{i as r,n as i,r as a}from"./index-4w2FUKV5.js";import{n as o,t as s}from"./markdown-parser-B0W8Yv4o.js";var c=e(t(),1),l=n(),u=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>`,d=`<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>`;function f({content:e,className:t,copyCodeLabel:n,codeCopiedLabel:i}){let{t:o}=r(),s=(0,c.useRef)(null),{resolvedCodeTheme:u}=a(),[d,f]=(0,c.useState)(null),[_,v]=(0,c.useState)(0),y=n??o.chat.copyCode,b=i??o.chat.codeCopied,x=(0,c.useMemo)(()=>k(e).join(`
3
3
  `),[e]);p((0,c.useMemo)(()=>x?x.split(`
4
- `):[],[x]),f,v),m(s,y,b);let S=h(e,(0,c.useMemo)(()=>g(u,y,d),[u,y,d,_]));return(0,l.jsx)(`div`,{ref:s,className:`markdown-content ${t??``}`,dangerouslySetInnerHTML:{__html:S}})}function p(e,t,n){(0,c.useEffect)(()=>{if(e.length===0)return;let r=!1;return A(e).then(e=>{r||(t(e),n(e=>e+1))}),()=>{r=!0}},[e,t,n])}function m(e,t,n){(0,c.useEffect)(()=>{let r=e.current;if(!r)return;let i=new Set,a=j(i,t,n);return r.addEventListener(`click`,a),()=>{r.removeEventListener(`click`,a);for(let e of i)clearTimeout(e)}},[e,t,n])}function h(e,t){return(0,c.useMemo)(()=>D(t,e),[e,t])}function g(e,t,n){return new s({gfm:!0,breaks:!0,renderer:_(e,t,n)})}function _(e,t,n){let r=new o;return r.link=v,r.image=y,r.html=e=>z(`text`in e?e.text:``),r.code=r=>w(r.text,r.lang,e,t,n),r}function v({href:e,title:t,tokens:n}){let r=n?.map(e=>`text`in e?e.text:e.raw).join(``)??``,i=C(e),a=t?` title="${z(t)}"`:``;return`<a href="${z(i)}" target="_blank" rel="noopener noreferrer"${a}>${r}</a>`}function y({href:e,title:t,text:n}){let r=C(e),i=t?` title="${z(t)}"`:``,a=n||r;return`<a href="${z(r)}" target="_blank" rel="noopener noreferrer" class="markdown-image-link"${i}>${z(a)}</a>`}var b=new Set([`http:`,`https:`,`mailto:`]),x=`#`,S=`https://markdown.invalid/`;function C(e){if(!e)return x;let t;try{t=new URL(e,S).protocol}catch{return x}return b.has(t)?e:x}function w(e,t,n,r,i){let a=t??``,o=a?i?.highlightCode(e,a,n):null;return o?T(o,a,r):E(e,a,r)}function T(e,t,n){return e.replace(`<pre `,`<pre data-lang="${z(t)}" `).replace(`</pre>`,`${R(n)}</pre>`)}function E(e,t,n){let r=t?` class="language-${z(t)}"`:``;return`<pre${t?` data-lang="${z(t)}"`:``}><code${r}>${z(e)}</code>${R(n)}</pre>`}function D(e,t){return t?e.parse(t,{async:!1}):``}var O=new s({gfm:!0,breaks:!0});function k(e){if(!e)return[];let t=new Set;return O.walkTokens(O.lexer(e),e=>{e.type===`code`&&`lang`in e&&e.lang&&t.add(e.lang)}),[...t].sort()}async function A(e){let t=await i(()=>import(`./shiki-Cm6aTOwF.js`),__vite__mapDeps([0,1,2,3,4,5,6,7]));return await t.preloadCodeLanguages(e),t}function j(e,t,n){return r=>{M(r,e,t,n)}}async function M(e,t,n,r){let i=e.target.closest(`.copy-code-btn`);if(!i)return;let a=N(i);a!==null&&await P(i,a,t,n,r)}function N(e){let t=e.closest(`pre`);return t?t.querySelector(`code`)?.textContent??t.textContent??``:null}async function P(e,t,n,r,i){try{await navigator.clipboard.writeText(t),F(e,n,r,i)}catch{}}function F(e,t,n,r){e.innerHTML=d,e.setAttribute(`aria-label`,r),e.classList.add(`copy-code-btn--copied`),I(e,t,n)}function I(e,t,n){let r=setTimeout(()=>{t.delete(r),L(e,n)},2e3);t.add(r)}function L(e,t){e.innerHTML=u,e.setAttribute(`aria-label`,t),e.classList.remove(`copy-code-btn--copied`)}function R(e){return`<button class="copy-code-btn" type="button" aria-label="${z(e)}">${u}</button>`}function z(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#39;`)}export{f as MarkdownContentRenderer};
4
+ `):[],[x]),f,v),m(s,y,b);let S=h(e,(0,c.useMemo)(()=>g(u,y,d),[u,y,d,_]));return(0,l.jsx)(`div`,{ref:s,className:`markdown-content ${t??``}`,dangerouslySetInnerHTML:{__html:S}})}function p(e,t,n){(0,c.useEffect)(()=>{if(e.length===0)return;let r=!1;return A(e).then(e=>{r||(t(e),n(e=>e+1))}),()=>{r=!0}},[e,t,n])}function m(e,t,n){(0,c.useEffect)(()=>{let r=e.current;if(!r)return;let i=new Set,a=j(i,t,n);return r.addEventListener(`click`,a),()=>{r.removeEventListener(`click`,a);for(let e of i)clearTimeout(e)}},[e,t,n])}function h(e,t){return(0,c.useMemo)(()=>D(t,e),[e,t])}function g(e,t,n){return new s({gfm:!0,breaks:!0,renderer:_(e,t,n)})}function _(e,t,n){let r=new o;return r.link=v,r.image=y,r.html=e=>z(`text`in e?e.text:``),r.code=r=>w(r.text,r.lang,e,t,n),r}function v({href:e,title:t,tokens:n}){let r=n?.map(e=>`text`in e?e.text:e.raw).join(``)??``,i=C(e),a=t?` title="${z(t)}"`:``;return`<a href="${z(i)}" target="_blank" rel="noopener noreferrer"${a}>${r}</a>`}function y({href:e,title:t,text:n}){let r=C(e),i=t?` title="${z(t)}"`:``,a=n||r;return`<a href="${z(r)}" target="_blank" rel="noopener noreferrer" class="markdown-image-link"${i}>${z(a)}</a>`}var b=new Set([`http:`,`https:`,`mailto:`]),x=`#`,S=`https://markdown.invalid/`;function C(e){if(!e)return x;let t;try{t=new URL(e,S).protocol}catch{return x}return b.has(t)?e:x}function w(e,t,n,r,i){let a=t??``,o=a?i?.highlightCode(e,a,n):null;return o?T(o,a,r):E(e,a,r)}function T(e,t,n){return e.replace(`<pre `,`<pre data-lang="${z(t)}" `).replace(`</pre>`,`${R(n)}</pre>`)}function E(e,t,n){let r=t?` class="language-${z(t)}"`:``;return`<pre${t?` data-lang="${z(t)}"`:``}><code${r}>${z(e)}</code>${R(n)}</pre>`}function D(e,t){return t?e.parse(t,{async:!1}):``}var O=new s({gfm:!0,breaks:!0});function k(e){if(!e)return[];let t=new Set;return O.walkTokens(O.lexer(e),e=>{e.type===`code`&&`lang`in e&&e.lang&&t.add(e.lang)}),[...t].sort()}async function A(e){let t=await i(()=>import(`./shiki-DxX5RKSe.js`),__vite__mapDeps([0,1,2,3,4,5,6,7]));return await t.preloadCodeLanguages(e),t}function j(e,t,n){return r=>{M(r,e,t,n)}}async function M(e,t,n,r){let i=e.target.closest(`.copy-code-btn`);if(!i)return;let a=N(i);a!==null&&await P(i,a,t,n,r)}function N(e){let t=e.closest(`pre`);return t?t.querySelector(`code`)?.textContent??t.textContent??``:null}async function P(e,t,n,r,i){try{await navigator.clipboard.writeText(t),F(e,n,r,i)}catch{}}function F(e,t,n,r){e.innerHTML=d,e.setAttribute(`aria-label`,r),e.classList.add(`copy-code-btn--copied`),I(e,t,n)}function I(e,t,n){let r=setTimeout(()=>{t.delete(r),L(e,n)},2e3);t.add(r)}function L(e,t){e.innerHTML=u,e.setAttribute(`aria-label`,t),e.classList.remove(`copy-code-btn--copied`)}function R(e){return`<button class="copy-code-btn" type="button" aria-label="${z(e)}">${u}</button>`}function z(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#39;`)}export{f as MarkdownContentRenderer};