devez-vibe 1.9.5 → 1.9.7

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
@@ -1940,7 +1940,8 @@ const SUBAGENT_TOOLS = ["Agent", "Task"];
1940
1940
  // 행 요약 상한. 사용자가 읽는 한 줄이라 지침의 80자 요청과 같은 값으로 자른다.
1941
1941
  const SUBAGENT_DESCRIPTION_LIMIT = 80;
1942
1942
  const SUBAGENT_PULSE_MS = 5000;
1943
- const BACKGROUND_SUBAGENT_LEASE_MS = 60_000;
1943
+ // 자체 시험에서 "오래 조용한 행"을 만들 때 쓰는 나이.
1944
+ const IDLE_ROW_AGE_MS = 120_000;
1944
1945
 
1945
1946
  function startSubagent(session, block) {
1946
1947
  const input = block.input || {};
@@ -2405,25 +2406,11 @@ function firstLine(value, limit) {
2405
2406
  return String(value ?? "").split("\n")[0].trim().slice(0, limit);
2406
2407
  }
2407
2408
 
2408
- function emitSubagents(session, pulse = false) {
2409
- // 구조화된 진행 신호가 끊긴 백그라운드 행은 pulse로 영구 연장하지 않는다.
2410
- // 정상 작업은 task_progress/background_tasks_changed가 lease를 갱신하고,
2411
- // 종료 edge와 level 신호를 모두 놓친 행만 유한 시간 뒤 제거된다.
2412
- // 백그라운드 명령(셸로 띄운 검증자 포함)에는 task_progress가 오지 않으므로
2413
- // lease를 적용하면 살아 있는 행이 1분 뒤 사라진다. 명령 행은 종료 통지와
2414
- // level 스냅숏으로만 지운다.
2415
- if (pulse) {
2416
- const now = Date.now();
2417
- for (const [id, agent] of session.subagents) {
2418
- const lastSeenAt = agent.lastSeenAt || agent.startedAt || now;
2419
- if (agent.background && !agent.command
2420
- && now - lastSeenAt >= BACKGROUND_SUBAGENT_LEASE_MS) {
2421
- session.subagents.delete(id);
2422
- }
2423
- }
2424
- }
2409
+ function emitSubagents(session) {
2410
+ // 백그라운드 행은 조용하다고 지우지 않는다. 오래 걸리는 조사 에이전트는 진행
2411
+ // 신호 없이 몇 분을 보내므로, 종료 통지와 level 스냅숏만 행을 거둔다.
2425
2412
  if (session.subagents.size && !session.subagentPulse) {
2426
- session.subagentPulse = setInterval(() => emitSubagents(session, true), SUBAGENT_PULSE_MS);
2413
+ session.subagentPulse = setInterval(() => emitSubagents(session), SUBAGENT_PULSE_MS);
2427
2414
  session.subagentPulse.unref?.();
2428
2415
  } else if (!session.subagents.size && session.subagentPulse) {
2429
2416
  clearInterval(session.subagentPulse);
@@ -2815,7 +2802,18 @@ async function consumeMessage(session, message) {
2815
2802
  }
2816
2803
  await processStreamEvent(session, message);
2817
2804
  } else if (message.type === "assistant") {
2818
- if (session.turn && !message.parent_tool_use_id) session.turn.assistantError = message.error || null;
2805
+ if (session.turn && !message.parent_tool_use_id) {
2806
+ session.turn.assistantError = message.error || null;
2807
+ // 2.1.273's new error: the account itself is blocked until the user
2808
+ // verifies it, so no retry here can clear it.
2809
+ if (message.error === "verification_required") {
2810
+ notify("warning", {
2811
+ threadId: session.id,
2812
+ provider: "Claude",
2813
+ message: "Claude 계정 확인이 필요합니다. claude.ai에서 확인을 마친 뒤 다시 요청하세요.",
2814
+ });
2815
+ }
2816
+ }
2819
2817
  processAssistant(session, message);
2820
2818
  }
2821
2819
  else if (message.type === "user") processUser(session, message);
@@ -4541,6 +4539,18 @@ async function runSelfTest() {
4541
4539
  resumeAfterUsageLimit(limitSession, sleptWait, sleptWait.resetsAt + 31 * 60 * 1000);
4542
4540
  if (limitSession.turn || retryInputs.length !== beforeSleep) throw new Error("Long sleep resumed unattended work");
4543
4541
  beginTurn(limitSession);
4542
+ const beforeVerify = captured.length;
4543
+ await consumeMessage(limitSession, {
4544
+ type: "assistant", error: "verification_required", message: { content: [] },
4545
+ });
4546
+ const verifyWarning = captured.slice(beforeVerify).join("").trim().split("\n").filter(Boolean)
4547
+ .map((line) => JSON.parse(line))
4548
+ .find((event) => event.method === "warning" && event.params?.message?.includes("계정 확인"));
4549
+ if (!verifyWarning || limitSession.usageLimitWait) {
4550
+ throw new Error(`Verification required self-test failed: ${captured.slice(beforeVerify).join("")}`);
4551
+ }
4552
+ finishTurn(limitSession, null);
4553
+ beginTurn(limitSession);
4544
4554
  await rejectLimit();
4545
4555
  await consumeMessage(limitSession, failedResult);
4546
4556
  const replacedWait = limitSession.usageLimitWait;
@@ -4877,14 +4887,16 @@ async function runSelfTest() {
4877
4887
  name: "Explore",
4878
4888
  description: "",
4879
4889
  tool: "",
4880
- startedAt: Date.now() - BACKGROUND_SUBAGENT_LEASE_MS * 2,
4881
- lastSeenAt: Date.now() - BACKGROUND_SUBAGENT_LEASE_MS * 2,
4890
+ startedAt: Date.now() - IDLE_ROW_AGE_MS,
4891
+ lastSeenAt: Date.now() - IDLE_ROW_AGE_MS,
4882
4892
  });
4883
- commandRow.lastSeenAt = Date.now() - BACKGROUND_SUBAGENT_LEASE_MS * 2;
4884
- emitSubagents(commandSession, true);
4885
- if (!commandSession.subagents.has("toolu_bash") || commandSession.subagents.has("toolu_agent_idle")) {
4886
- throw new Error(`Claude background command lease self-test failed: ${JSON.stringify([...commandSession.subagents.keys()])}`);
4893
+ commandRow.lastSeenAt = Date.now() - IDLE_ROW_AGE_MS;
4894
+ emitSubagents(commandSession);
4895
+ // 오래 조용해도 명령 행과 에이전트 행 모두 남는다. 행은 종료 신호로만 사라진다.
4896
+ if (!commandSession.subagents.has("toolu_bash") || !commandSession.subagents.has("toolu_agent_idle")) {
4897
+ throw new Error(`Claude idle background row self-test failed: ${JSON.stringify([...commandSession.subagents.keys()])}`);
4887
4898
  }
4899
+ commandSession.subagents.delete("toolu_agent_idle");
4888
4900
  processUser(commandSession, {
4889
4901
  origin: { kind: "task-notification" },
4890
4902
  message: { content: `<task-notification>
@@ -4902,8 +4914,8 @@ async function runSelfTest() {
4902
4914
  tasks: [{ task_id: "bash-2", task_type: "local_bash", description: "빌드 감시" }],
4903
4915
  });
4904
4916
  const plainCommand = findSubagent(commandSession, "bash-2");
4905
- plainCommand.lastSeenAt = Date.now() - BACKGROUND_SUBAGENT_LEASE_MS * 2;
4906
- emitSubagents(commandSession, true);
4917
+ plainCommand.lastSeenAt = Date.now() - IDLE_ROW_AGE_MS;
4918
+ emitSubagents(commandSession);
4907
4919
  if (!findSubagent(commandSession, "bash-2") || plainCommand.name !== "Bash" || plainCommand.command !== true) {
4908
4920
  throw new Error(`Claude plain background command lease self-test failed: ${JSON.stringify([...commandSession.subagents])}`);
4909
4921
  }
@@ -5116,13 +5128,14 @@ async function runSelfTest() {
5116
5128
  name: "Explore",
5117
5129
  description: "",
5118
5130
  tool: "",
5119
- startedAt: Date.now() - BACKGROUND_SUBAGENT_LEASE_MS - 1,
5120
- lastSeenAt: Date.now() - BACKGROUND_SUBAGENT_LEASE_MS - 1,
5131
+ startedAt: Date.now() - IDLE_ROW_AGE_MS,
5132
+ lastSeenAt: Date.now() - IDLE_ROW_AGE_MS,
5121
5133
  });
5122
- emitSubagents(structuredSession, true);
5123
- if (structuredSession.subagents.size !== 0) {
5124
- throw new Error("Claude expired background subagent lease self-test failed");
5134
+ emitSubagents(structuredSession);
5135
+ if (structuredSession.subagents.size !== 1) {
5136
+ throw new Error("Claude idle background subagent self-test failed");
5125
5137
  }
5138
+ structuredSession.subagents.clear();
5126
5139
  } finally {
5127
5140
  process.stdout.write = stdoutWrite;
5128
5141
  }
package/package.json CHANGED
@@ -1,50 +1,50 @@
1
- {
2
- "name": "devez-vibe",
3
- "version": "1.9.5",
4
- "type": "module",
5
- "description": "Stable terminal UI for Codex and Claude Agent SDK",
6
- "keywords": [
7
- "codex",
8
- "cli",
9
- "tui",
10
- "terminal",
11
- "app-server",
12
- "claude-agent-sdk"
13
- ],
14
- "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
15
- "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
16
- "repository": {
17
- "type": "git",
18
- "url": "git+https://github.com/MrHoje/Devez-vibe.git"
19
- },
20
- "license": "MIT",
21
- "bin": {
22
- "dvz": "bin/dvz.js"
23
- },
24
- "files": [
25
- "bin/dvz.js",
26
- "bin/dvz.exe",
27
- "bridge/claude-agent-sdk-bridge.mjs",
28
- "install-skills.mjs",
29
- "prepare-search-deps.mjs",
30
- "skills/luna-loop/",
31
- "skills/insane-search/",
32
- "README.md",
33
- "LICENSE"
34
- ],
35
- "os": [
36
- "win32"
37
- ],
38
- "cpu": [
39
- "x64"
40
- ],
41
- "engines": {
42
- "node": ">=18"
43
- },
44
- "scripts": {
45
- "postinstall": "node install-skills.mjs && node prepare-search-deps.mjs"
46
- },
47
- "dependencies": {
48
- "@anthropic-ai/claude-agent-sdk": "0.3.267"
49
- }
50
- }
1
+ {
2
+ "name": "devez-vibe",
3
+ "version": "1.9.7",
4
+ "type": "module",
5
+ "description": "Stable terminal UI for Codex and Claude Agent SDK",
6
+ "keywords": [
7
+ "codex",
8
+ "cli",
9
+ "tui",
10
+ "terminal",
11
+ "app-server",
12
+ "claude-agent-sdk"
13
+ ],
14
+ "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
15
+ "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/MrHoje/Devez-vibe.git"
19
+ },
20
+ "license": "MIT",
21
+ "bin": {
22
+ "dvz": "bin/dvz.js"
23
+ },
24
+ "files": [
25
+ "bin/dvz.js",
26
+ "bin/dvz.exe",
27
+ "bridge/claude-agent-sdk-bridge.mjs",
28
+ "install-skills.mjs",
29
+ "prepare-search-deps.mjs",
30
+ "skills/luna-loop/",
31
+ "skills/insane-search/",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "os": [
36
+ "win32"
37
+ ],
38
+ "cpu": [
39
+ "x64"
40
+ ],
41
+ "engines": {
42
+ "node": ">=18"
43
+ },
44
+ "scripts": {
45
+ "postinstall": "node install-skills.mjs && node prepare-search-deps.mjs"
46
+ },
47
+ "dependencies": {
48
+ "@anthropic-ai/claude-agent-sdk": "0.3.273"
49
+ }
50
+ }