devez-vibe 1.9.37 → 1.9.38

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/bin/dvz.exe CHANGED
Binary file
@@ -2835,7 +2835,12 @@ async function processResult(session, message) {
2835
2835
  const detail = message.errors?.join("\n") || message.result || message.stop_reason || "Claude 실행 실패";
2836
2836
  const guide = STARTUP_FAILURE_GUIDES[message.startup_failure_reason];
2837
2837
  let error = message.is_error && !interrupted
2838
- ? { message: guide ? `${guide}\n${detail}` : detail }
2838
+ ? {
2839
+ message: guide ? `${guide}\n${detail}` : detail,
2840
+ // An expired login gets the host's sign-in guide instead of the raw
2841
+ // `API Error: 401 {...}`; Codex tags the same failure `unauthorized`.
2842
+ ...(session.turn?.assistantError === "authentication_failed" ? { codexErrorInfo: "unauthorized" } : {}),
2843
+ }
2839
2844
  : null;
2840
2845
  if (!error && !interrupted) {
2841
2846
  const outcome = abnormalStopOutcome(message.stop_reason);
@@ -2935,7 +2940,12 @@ function finishTurn(session, error, durationMs) {
2935
2940
  clearForegroundSubagents(session);
2936
2941
  const turn = { id: session.turn.id, status: error ? "failed" : session.turn.interruptRequested ? "interrupted" : "completed" };
2937
2942
  if (turn.status === "completed") completeLingeringTasks(session, Date.now());
2938
- if (error) turn.error = { message: error instanceof Error ? error.message : error.message || String(error) };
2943
+ if (error) {
2944
+ turn.error = {
2945
+ message: error instanceof Error ? error.message : error.message || String(error),
2946
+ ...(error.codexErrorInfo ? { codexErrorInfo: error.codexErrorInfo } : {}),
2947
+ };
2948
+ }
2939
2949
  if (durationMs != null) turn.durationMs = durationMs;
2940
2950
  notify("turn/completed", { threadId: session.id, turn });
2941
2951
  session.turn = null;
@@ -4806,6 +4816,21 @@ async function runSelfTest() {
4806
4816
  await consumeMessage(limitSession, { type: "assistant", error: "server_error", message: { content: [] } });
4807
4817
  await consumeMessage(limitSession, failedResult);
4808
4818
  if (limitSession.usageLimitWait) throw new Error("Unrelated server error started a usage wait");
4819
+ // An expired login reaches the host tagged like Codex's `unauthorized`.
4820
+ const authNotices = [];
4821
+ const authWrite = process.stdout.write;
4822
+ process.stdout.write = (chunk) => { authNotices.push(JSON.parse(String(chunk))); return true; };
4823
+ try {
4824
+ beginTurn(limitSession);
4825
+ await consumeMessage(limitSession, { type: "assistant", error: "authentication_failed", message: { content: [] } });
4826
+ await consumeMessage(limitSession, { ...failedResult, errors: ["API Error: 401 {\"type\":\"error\"}"] });
4827
+ } finally {
4828
+ process.stdout.write = authWrite;
4829
+ }
4830
+ const authTurn = authNotices.find((notice) => notice.method === "turn/completed")?.params?.turn;
4831
+ if (authTurn?.error?.codexErrorInfo !== "unauthorized" || !authTurn.error.message.includes("401")) {
4832
+ throw new Error(`Claude login failure lost its tag: ${JSON.stringify(authTurn)}`);
4833
+ }
4809
4834
  beginTurn(limitSession);
4810
4835
  for (let attempt = 0; attempt < 4; attempt++) {
4811
4836
  await rejectLimit();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devez-vibe",
3
- "version": "1.9.37",
3
+ "version": "1.9.38",
4
4
  "type": "module",
5
5
  "description": "Stable terminal UI for Codex and Claude Agent SDK",
6
6
  "keywords": [