Skip to content

Commit c9e622d

Browse files
authored
fix(daemon): ship baseline OpenCode for Windows and stop retrying AVX2 illegal-instruction crashes (#5733)
* Classify AVX2 illegal-instruction agent crashes as cpu_unsupported and stop retrying them The Windows opencode.exe bundled with the AMR runtime is a Bun build that requires AVX2. On CPUs without it (Intel Atom/Celeron/Pentium N-series through 2021) the binary dies with STATUS_ILLEGAL_INSTRUCTION before readiness; vela surfaces an ACP fatal, the daemon classified it as a retryable fatal_rpc_error, and the automatic retry deterministically failed again. 88 of 105 pre-readiness Windows crash traces in Langfuse are this single failure. The crash text (Bun 'Illegal instruction' banner with a no_avx2 CPU feature line, or the raw 0xC000001D / decimal 3221225501 exit status) now classifies as process_exit/cpu_unsupported ahead of the fatal_rpc_error close-reason promotion, is never auto-retried, and renders a dedicated error card telling the user to update Open Design instead of a dead Retry button. * Bump @powerformer/vela-cli to 0.0.23 so packaged Windows builds bundle the baseline (non-AVX2) OpenCode The 0.0.23 win32-x64 platform package compiles the OpenCode fork with --target=windows-x64-baseline, so the bundled opencode.exe no longer requires AVX2 and starts on Intel Atom/Celeron/Pentium N-series CPUs. Verified in vela CI: the build log shows the baseline target and the new post-publish smoke job boots the published bundle's opencode.exe on a real Windows runner (powerformer/vela#838). * Refresh Nix pnpm deps hashes for the vela-cli 0.0.23 lockfile change * Add the abort-after-panic (exit status 3) production shape to cpu_unsupported specs A user on an AVX-but-no-AVX2 CPU (Sandy/Ivy Bridge era) hit the same illegal-instruction crash, but Bun panicked during its own panic handler and abort()ed, so vela reported exit status 3 instead of STATUS_ILLEGAL_INSTRUCTION. The stderr banner (no_avx2 / Illegal instruction) is the only signal; encode the real Langfuse trace shape so the classifier keeps catching it. * Bump @powerformer/vela-cli to 0.0.25 so packaged Windows builds bundle the baseline (non-AVX2) OpenCode 0.0.25 is the first stable cut after powerformer/vela#838 merged: its win32-x64 package compiles the OpenCode fork with --target=windows-x64-baseline (verified in the release CI log), the post-publish smoke boots the published bundle on a real Windows runner, and the lockfile regenerator now pins the baseline asset so a routine version bump cannot silently flip back. 0.0.24 predated that merge and still shipped the AVX2 build. * Tighten cpu_unsupported to precise signals only (no bare 'Illegal instruction') Review is right that a bare illegal-instruction line is too broad: an unrelated SIGILL on an AVX2-capable machine (runtime bug, corrupted jump) would be mislabeled 'Processor not supported' and lose its retry. Bun's crash banner always prints the CPU-feature line, so machines actually missing AVX2 are identified by no_avx2; the bare Windows STATUS_ILLEGAL_INSTRUCTION renderings (0xC000001D / 3221225501) stay because those runs carry no banner at all. Generic illegal-instruction banners without no_avx2 return to process_crashed / fatal_rpc_error, locked by a new negative spec. * Refresh Nix pnpm deps hashes for the vela-cli 0.0.25 lockfile change * Gate raw STATUS_ILLEGAL_INSTRUCTION on the bundled-opencode startup context
1 parent 06ce4ee commit c9e622d

26 files changed

Lines changed: 287 additions & 0 deletions

File tree

apps/daemon/src/run-failure-classification.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,32 @@ function isProcessCrashText(text: string): boolean {
495495
.test(text);
496496
}
497497

498+
// The child binary executed an instruction this CPU does not implement — in
499+
// practice a Bun-compiled agent (bundled opencode) built for AVX2 running on a
500+
// CPU without it (Intel Atom/Celeron/Pentium N-series through 2021, and
501+
// AVX-but-not-AVX2 Sandy/Ivy Bridge cores). Matched only on signals that
502+
// prove the unsupported-CPU case:
503+
// - `no_avx2`: the CPU-feature line Bun's crash banner prints on such
504+
// machines. Unconditional — the feature line itself is the proof.
505+
// - Windows STATUS_ILLEGAL_INSTRUCTION (hex 0xC000001D or Go/Node's decimal
506+
// exit-status rendering 3221225501), but ONLY inside vela's bundled-opencode
507+
// startup wrapper text ("start opencode server" / "opencode exited before
508+
// readiness"). The raw status code is a generic Windows SIGILL that any
509+
// agent binary could die with for unrelated reasons; every bannerless
510+
// production trace carries the vela wrapper, so the gate costs no recall.
511+
// A bare "Illegal instruction" line is deliberately NOT matched: any
512+
// unrelated SIGILL (a runtime bug on an AVX2-capable machine) would then be
513+
// mislabeled as a processor limitation and lose its retry. The same binary on
514+
// the same CPU fails deterministically, so cpu_unsupported must never be
515+
// auto-retried.
516+
function isCpuUnsupportedCrashText(text: string): boolean {
517+
if (/\bno_avx2\b/i.test(text)) return true;
518+
return (
519+
/0xc000001d|\b3221225501\b/i.test(text) &&
520+
/\bstart opencode server\b|\bopencode exited before readiness\b/i.test(text)
521+
);
522+
}
523+
498524
// The daemon emits a `runtime_close` diagnostic into the run's event stream at
499525
// finalize time (see `deriveRpcCloseReason` in server.ts) carrying the mechanism
500526
// that ended the child as `rpc_close_reason`. When the agent-level error code is
@@ -869,6 +895,21 @@ export function classifyRunFailure(
869895
);
870896
}
871897

898+
// Must be checked BEFORE the fatal_rpc_error close-reason promotion below:
899+
// when the bundled agent binary dies of an illegal instruction before
900+
// readiness, vela surfaces an ACP fatal and the close reason alone would
901+
// classify this as a retryable fatal_rpc_error — but the retry re-runs the
902+
// same binary on the same CPU and deterministically fails again.
903+
if (isCpuUnsupportedCrashText(text)) {
904+
return classification(
905+
'process_exit',
906+
'cpu_unsupported',
907+
inferFailureStageFromEvents(input.events, 'session_init'),
908+
false,
909+
'none',
910+
);
911+
}
912+
872913
// ACP fatal paths ask the host to terminate the child after the protocol
873914
// failure. The resulting exit/signal is therefore cleanup, not the cause.
874915
// Prefer the runtime_close reason once specific text classifiers above have

apps/daemon/tests/run-failure-classification.test.ts

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,10 @@ describe('classifyRunFailure — signal and interrupt attribution', () => {
11411141
),
11421142
).toMatchObject({
11431143
failure_category: 'process_exit',
1144+
// A bare Bun illegal-instruction banner WITHOUT the no_avx2 CPU-feature
1145+
// line stays process_crashed: it may be an unrelated SIGILL on an
1146+
// AVX2-capable machine, so it must not claim the cpu_unsupported detail
1147+
// (which shows "Processor not supported" guidance).
11441148
failure_detail: 'process_crashed',
11451149
retryable: false,
11461150
user_action: 'none',
@@ -1152,6 +1156,158 @@ function runtimeCloseEvent(reason: string): RunEventForFailureClassification {
11521156
return { event: 'diagnostic', data: { type: 'runtime_close', rpc_close_reason: reason } };
11531157
}
11541158

1159+
describe('cpu_unsupported (AVX2) crash classification', () => {
1160+
// Windows AMR failure shape from Langfuse: the bundled opencode.exe is a Bun
1161+
// build requiring AVX2; on CPUs without it the child dies with an illegal
1162+
// instruction BEFORE readiness, vela surfaces an ACP fatal, and the daemon
1163+
// stamps runtime_close: fatal_rpc_error. The crash text must win over the
1164+
// fatal_rpc_error close-reason promotion — retrying the same binary on the
1165+
// same CPU deterministically fails again.
1166+
it('classifies a Bun illegal-instruction crash under an ACP fatal close as cpu_unsupported', () => {
1167+
const stderr = [
1168+
'============================================================',
1169+
'Bun v1.3.10 (30e609e0) Windows x64',
1170+
'CPU: sse42 popcnt no_avx no_avx2',
1171+
'panic(main thread): Illegal instruction',
1172+
'oh no: Bun has crashed. This indicates a bug in Bun, not your code.',
1173+
].join('\n');
1174+
expect(
1175+
classify('AGENT_EXECUTION_FAILED', '', [
1176+
{ event: 'stderr', data: { chunk: stderr } },
1177+
errorEvent('AGENT_EXECUTION_FAILED', ''),
1178+
runtimeCloseEvent('fatal_rpc_error'),
1179+
]),
1180+
).toMatchObject({
1181+
failure_category: 'process_exit',
1182+
failure_detail: 'cpu_unsupported',
1183+
retryable: false,
1184+
user_action: 'none',
1185+
});
1186+
});
1187+
1188+
it('classifies the abort-after-panic shape (exit status 3) via its stderr banner', () => {
1189+
// Production shape (Langfuse trace 266a5706, 0.15.0 stable): on a CPU with
1190+
// AVX but not AVX2 (Sandy/Ivy Bridge era), Bun panics on an illegal
1191+
// instruction, panics again during the panic, and abort()s — so the exit
1192+
// status vela reports is 3, not STATUS_ILLEGAL_INSTRUCTION. Only the
1193+
// stderr banner carries the truth.
1194+
const stderr = [
1195+
'============================================================',
1196+
'Bun v1.3.14 (0d9b296a) Windows x64',
1197+
'Windows v.win10_cu',
1198+
'CPU: sse42 avx',
1199+
'Args: ',
1200+
'Features: no_avx2 ',
1201+
'',
1202+
'panic: Illegal instruction at address 0x7FF6C08DF82C',
1203+
'panicked during a panic. Aborting.',
1204+
].join('\n');
1205+
expect(
1206+
classify(
1207+
'AGENT_EXECUTION_FAILED',
1208+
'json-rpc id 2: start opencode server: opencode exited before readiness: exit status 3',
1209+
[
1210+
{ event: 'stderr', data: { chunk: stderr } },
1211+
errorEvent(
1212+
'AGENT_EXECUTION_FAILED',
1213+
'json-rpc id 2: start opencode server: opencode exited before readiness: exit status 3',
1214+
),
1215+
runtimeCloseEvent('fatal_rpc_error'),
1216+
],
1217+
),
1218+
).toMatchObject({
1219+
failure_category: 'process_exit',
1220+
failure_detail: 'cpu_unsupported',
1221+
retryable: false,
1222+
user_action: 'none',
1223+
});
1224+
});
1225+
1226+
it('classifies a bare STATUS_ILLEGAL_INSTRUCTION exit under an ACP fatal close as cpu_unsupported', () => {
1227+
// No Bun crash banner — vela only reports the raw Windows exit status
1228+
// (0xC000001D, decimal 3221225501 in Go/Node exit-status text).
1229+
expect(
1230+
classify(
1231+
'AGENT_EXECUTION_FAILED',
1232+
'start opencode server: exit status 3221225501',
1233+
[
1234+
errorEvent('AGENT_EXECUTION_FAILED', 'start opencode server: exit status 3221225501'),
1235+
runtimeCloseEvent('fatal_rpc_error'),
1236+
],
1237+
),
1238+
).toMatchObject({
1239+
failure_category: 'process_exit',
1240+
failure_detail: 'cpu_unsupported',
1241+
retryable: false,
1242+
user_action: 'none',
1243+
});
1244+
});
1245+
1246+
it('classifies the hex STATUS_ILLEGAL_INSTRUCTION form as cpu_unsupported', () => {
1247+
const message = 'start opencode server: opencode exited before readiness: exit status 0xC000001D';
1248+
expect(
1249+
classify('AGENT_EXECUTION_FAILED', message, [
1250+
errorEvent('AGENT_EXECUTION_FAILED', message),
1251+
runtimeCloseEvent('fatal_rpc_error'),
1252+
]),
1253+
).toMatchObject({
1254+
failure_detail: 'cpu_unsupported',
1255+
retryable: false,
1256+
});
1257+
});
1258+
1259+
it('keeps a STATUS_ILLEGAL_INSTRUCTION exit outside the opencode startup context retryable', () => {
1260+
// The raw status code is generic Windows SIGILL — any agent binary can die
1261+
// with it for reasons that have nothing to do with AVX2. Without vela's
1262+
// bundled-opencode startup wrapper text it must stay on the existing
1263+
// fatal_rpc_error path instead of surfacing the processor-support card.
1264+
const message = 'codex acp bridge exited: exit status 3221225501';
1265+
expect(
1266+
classify('AGENT_EXECUTION_FAILED', message, [
1267+
errorEvent('AGENT_EXECUTION_FAILED', message),
1268+
runtimeCloseEvent('fatal_rpc_error'),
1269+
]),
1270+
).toMatchObject({
1271+
failure_detail: 'fatal_rpc_error',
1272+
retryable: true,
1273+
});
1274+
});
1275+
1276+
it('does not claim an illegal-instruction crash without the no_avx2 feature line', () => {
1277+
// A SIGILL on an AVX2-capable machine (runtime bug, corrupted jump) prints
1278+
// the same "Illegal instruction" panic but a CPU-feature line WITHOUT
1279+
// no_avx2. That must keep the retryable fatal_rpc_error path — labeling it
1280+
// "Processor not supported" would mislead the user and drop the retry.
1281+
const stderr = [
1282+
'Bun v1.3.14 (0d9b296a) Windows x64',
1283+
'CPU: sse42 avx avx2',
1284+
'panic(main thread): Illegal instruction at address 0x7FF6C08DF82C',
1285+
].join('\n');
1286+
expect(
1287+
classify('AGENT_EXECUTION_FAILED', '', [
1288+
{ event: 'stderr', data: { chunk: stderr } },
1289+
errorEvent('AGENT_EXECUTION_FAILED', ''),
1290+
runtimeCloseEvent('fatal_rpc_error'),
1291+
]),
1292+
).toMatchObject({
1293+
failure_detail: 'fatal_rpc_error',
1294+
retryable: true,
1295+
});
1296+
});
1297+
1298+
it('keeps plain ACP fatal closes without crash text on fatal_rpc_error', () => {
1299+
expect(
1300+
classify('AGENT_EXECUTION_FAILED', '', [
1301+
errorEvent('AGENT_EXECUTION_FAILED', ''),
1302+
runtimeCloseEvent('fatal_rpc_error'),
1303+
]),
1304+
).toMatchObject({
1305+
failure_detail: 'fatal_rpc_error',
1306+
retryable: true,
1307+
});
1308+
});
1309+
})
1310+
11551311
describe('execution_failed close-reason refinement', () => {
11561312
// A generic AGENT_EXECUTION_FAILED whose text matched no pattern, plus the
11571313
// runtime_close diagnostic the daemon stamps at finalize time.

apps/daemon/tests/run-retry-policy.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,25 @@ describe('decideSafeRunRetry', () => {
300300
});
301301
});
302302

303+
it('never auto-retries a cpu_unsupported crash even when marked retryable', () => {
304+
// An AVX2-requiring binary on a CPU without AVX2 crashes deterministically;
305+
// the process_exit allowlist must keep cpu_unsupported out even if an
306+
// upstream retryable hint leaks in as true.
307+
expect(
308+
decide({
309+
failure: {
310+
failure_category: 'process_exit',
311+
failure_detail: 'cpu_unsupported',
312+
failure_stage: 'session_init',
313+
retryable: true,
314+
},
315+
}),
316+
).toMatchObject({
317+
shouldRetry: false,
318+
retrySuppressedReason: 'non_retryable_category',
319+
});
320+
});
321+
303322
it('never auto-retries process kills, crashes, or interruptions', () => {
304323
for (const failure_detail of [
305324
'signal_killed',

apps/web/src/i18n/locales/ar.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ export const ar: Dict = {
7878
'chat.runError.title.emptyOutput': "لا يوجد ناتج",
7979
'chat.runError.title.sessionExpired': "انتهت الجلسة",
8080
'chat.runError.title.gitBashMissing': "Git Bash غير موجود",
81+
'chat.runError.title.cpuUnsupported': "المعالج غير مدعوم",
8182
'chat.runError.quotaExhaustedMessage': "انتهت حصة خدمة النموذج أو حد الفوترة، لذا لن تفيد إعادة المحاولة. اشحن رصيدك لدى المزوّد أو بدّل إلى نموذج أو خدمة أخرى.",
8283
'chat.runError.workspaceCreditsMessage': "نفدت أرصدة مساحة عملك. أضف أرصدة (أو اطلب من مالك المساحة إعادة الشحن)، أو بدّل إلى نموذج أو خدمة أخرى.",
8384
'chat.runError.timedOutMessage': "استغرق هذا التشغيل وقتًا طويلاً وتم إيقافه. أعد المحاولة، أو قلّص المهمة ثم أعد المحاولة.",
8485
'chat.runError.inactivityTimeoutMessage': "توقّف الوكيل عن إنتاج ناتج جديد لفترة طويلة فتم إيقافه بسبب انتهاء المهلة. عادةً ما تعيد المحاولة تشغيله من جديد.",
8586
'chat.runError.emptyOutputMessage': "انتهى الوكيل دون إنتاج أي ناتج. هذا مؤقت غالبًا، فأعد المحاولة.",
8687
'chat.runError.sessionExpiredMessage': "انتهت صلاحية الجلسة المستأنفة. تمت إعادة ضبطها، لذا أعد المحاولة لبدء تشغيل جديد.",
8788
'chat.runError.gitBashMissingMessage': "يلزم Git Bash لتشغيل هذا الوكيل على Windows لكنه غير موجود. ثبّت Git for Windows ثم أعد المحاولة.",
89+
'chat.runError.cpuUnsupportedMessage': "تتطلب بيئة تشغيل هذا الوكيل مجموعة تعليمات للمعالج (AVX2) غير متوفرة في هذا الجهاز، لذا يتعذر تشغيلها. حدِّث Open Design إلى أحدث إصدار الذي يتضمن بيئة تشغيل متوافقة.",
8890
'common.cancel': 'إلغاء',
8991
'chat.selectFromLibrary': 'استيراد من المكتبة',
9092
'chat.importFigma': 'استيراد من Figma',

apps/web/src/i18n/locales/de.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ export const de: Dict = {
7878
'chat.runError.title.emptyOutput': "Keine Ausgabe",
7979
'chat.runError.title.sessionExpired': "Sitzung abgelaufen",
8080
'chat.runError.title.gitBashMissing': "Git Bash fehlt",
81+
'chat.runError.title.cpuUnsupported': "Prozessor nicht unterstützt",
8182
'chat.runError.quotaExhaustedMessage': "Das Kontingent oder Abrechnungslimit deines Modelldienstes ist aufgebraucht – ein erneuter Versuch hilft nicht. Lade bei deinem Anbieter auf oder wechsle zu einem anderen Modell oder Dienst.",
8283
'chat.runError.workspaceCreditsMessage': "Dein Workspace hat keine Credits mehr. Füge Credits hinzu (oder bitte den Workspace-Eigentümer aufzuladen) oder wechsle zu einem anderen Modell oder Dienst.",
8384
'chat.runError.timedOutMessage': "Dieser Lauf hat zu lange gedauert und wurde abgebrochen. Versuche es erneut oder verkleinere die Aufgabe und wiederhole.",
8485
'chat.runError.inactivityTimeoutMessage': "Der Agent hat zu lange keine neue Ausgabe geliefert und wurde als Zeitüberschreitung abgebrochen. Ein erneuter Versuch bringt ihn meist wieder in Gang.",
8586
'chat.runError.emptyOutputMessage': "Der Agent wurde beendet, ohne Ausgabe zu erzeugen. Das ist meist vorübergehend, versuche es erneut.",
8687
'chat.runError.sessionExpiredMessage': "Die fortgesetzte Sitzung war abgelaufen. Sie wurde zurückgesetzt, wiederhole, um einen neuen Lauf zu starten.",
8788
'chat.runError.gitBashMissingMessage': "Für diesen Agenten unter Windows wird Git Bash benötigt, es wurde aber nicht gefunden. Installiere Git für Windows und versuche es erneut.",
89+
'chat.runError.cpuUnsupportedMessage': "Die Laufzeitumgebung dieses Agenten benötigt einen CPU-Befehlssatz (AVX2), den dieses Gerät nicht besitzt, und kann daher nicht starten. Aktualisiere Open Design auf die neueste Version, die eine kompatible Laufzeitumgebung mitliefert.",
8890
'common.cancel': 'Abbrechen',
8991
'chat.selectFromLibrary': 'Aus Bibliothek importieren',
9092
'chat.importFigma': 'Aus Figma importieren',

apps/web/src/i18n/locales/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ export const en: Dict = {
7878
'chat.runError.title.emptyOutput': "No output produced",
7979
'chat.runError.title.sessionExpired': "Session expired",
8080
'chat.runError.title.gitBashMissing': "Git Bash missing",
81+
'chat.runError.title.cpuUnsupported': "Processor not supported",
8182
'chat.runError.quotaExhaustedMessage': "Your model service's quota or billing limit is used up, so retrying won't help. Top up with your provider, or switch to another model or service.",
8283
'chat.runError.workspaceCreditsMessage': "Your workspace is out of credits. Add credits (or ask your workspace owner to refill), or switch to another model or service.",
8384
'chat.runError.timedOutMessage': "This run took too long and was stopped. Try again, or narrow the task and retry.",
8485
'chat.runError.inactivityTimeoutMessage': "The agent went quiet for too long and was stopped as a timeout. Retrying usually gets it moving again.",
8586
'chat.runError.emptyOutputMessage': "The agent finished without producing any output. This is usually temporary, so retry to run it again.",
8687
'chat.runError.sessionExpiredMessage': "The resumed session had expired. It has been reset, so retry to start a fresh run.",
8788
'chat.runError.gitBashMissingMessage': "Git Bash is required to run this agent on Windows but wasn't found. Install Git for Windows, then retry.",
89+
'chat.runError.cpuUnsupportedMessage': "This agent's runtime needs a CPU instruction set (AVX2) that this device doesn't have, so it can't start. Update Open Design to the latest version, which ships a compatible runtime.",
8890
'common.cancel': 'Cancel',
8991
'chat.selectFromLibrary': 'Import from library',
9092
'chat.importFigma': 'Import from Figma',

apps/web/src/i18n/locales/es-ES.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,15 @@ export const esES: Dict = {
7878
'chat.runError.title.emptyOutput': "Sin salida",
7979
'chat.runError.title.sessionExpired': "Sesión caducada",
8080
'chat.runError.title.gitBashMissing': "Falta Git Bash",
81+
'chat.runError.title.cpuUnsupported': "Procesador no compatible",
8182
'chat.runError.quotaExhaustedMessage': "La cuota o el límite de facturación de tu servicio de modelo se ha agotado, así que reintentar no servirá. Recarga con tu proveedor o cambia a otro modelo o servicio.",
8283
'chat.runError.workspaceCreditsMessage': "Tu espacio de trabajo se ha quedado sin créditos. Añade créditos (o pide al propietario del espacio que recargue) o cambia a otro modelo o servicio.",
8384
'chat.runError.timedOutMessage': "Esta ejecución tardó demasiado y se detuvo. Inténtalo de nuevo o reduce la tarea y reintenta.",
8485
'chat.runError.inactivityTimeoutMessage': "El agente estuvo demasiado tiempo sin nueva salida y se detuvo por tiempo agotado. Reintentar suele reanudarlo.",
8586
'chat.runError.emptyOutputMessage': "El agente terminó sin producir ninguna salida. Suele ser temporal: reintenta para ejecutarlo de nuevo.",
8687
'chat.runError.sessionExpiredMessage': "La sesión reanudada había caducado. Se ha restablecido, así que reintenta para iniciar una ejecución nueva.",
8788
'chat.runError.gitBashMissingMessage': "Se necesita Git Bash para ejecutar este agente en Windows, pero no se encontró. Instala Git para Windows y reintenta.",
89+
'chat.runError.cpuUnsupportedMessage': "El entorno de ejecución de este agente necesita un conjunto de instrucciones de CPU (AVX2) que este dispositivo no tiene, por lo que no puede iniciarse. Actualiza Open Design a la última versión, que incluye un entorno de ejecución compatible.",
8890
'common.cancel': 'Cancelar',
8991
'chat.selectFromLibrary': 'Importar de la biblioteca',
9092
'chat.importFigma': 'Importar de Figma',

0 commit comments

Comments
 (0)