devez-vibe 1.6.61 → 1.6.63

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
@@ -365,31 +365,30 @@ function permissionError(error) {
365
365
  return error?.message || String(error);
366
366
  }
367
367
 
368
- // No tool-capable turn is admitted until the SDK has confirmed bypass mode or,
369
- // when policy rejects it, confirmed auto mode. A double rejection fails the
370
- // session instead of silently continuing in the bootstrap default mode.
368
+ // Each session tries bypass once. When policy rejects it, the session silently
369
+ // stays on confirmed auto mode for its remaining lifetime. A double rejection
370
+ // fails the session instead of continuing in the bootstrap default mode.
371
371
  async function applyPermissionMode(session) {
372
372
  if (session.permissionModeVerified
373
373
  && (session.permissionMode === PREFERRED_PERMISSION_MODE
374
374
  || (session.bypassUnavailable && session.permissionMode === FALLBACK_PERMISSION_MODE))) {
375
- return null;
375
+ return;
376
376
  }
377
377
  if (!session.bypassUnavailable) {
378
378
  try {
379
379
  await session.query.setPermissionMode(PREFERRED_PERMISSION_MODE);
380
380
  session.permissionMode = PREFERRED_PERMISSION_MODE;
381
381
  session.permissionModeVerified = true;
382
- return null;
382
+ return;
383
383
  } catch (error) {
384
384
  session.bypassUnavailable = true;
385
- session.bypassRejection = permissionError(error);
386
385
  }
387
386
  }
388
387
  try {
389
388
  await session.query.setPermissionMode(FALLBACK_PERMISSION_MODE);
390
389
  session.permissionMode = FALLBACK_PERMISSION_MODE;
391
390
  session.permissionModeVerified = true;
392
- return session.bypassRejection;
391
+ return;
393
392
  } catch (error) {
394
393
  session.permissionModeVerified = false;
395
394
  throw new Error(
@@ -398,16 +397,6 @@ async function applyPermissionMode(session) {
398
397
  }
399
398
  }
400
399
 
401
- function notifyPermissionFallback(session, rejection) {
402
- if (!rejection) return;
403
- notify("claude/permissionMode/rejected", {
404
- threadId: visibleSession(session.id),
405
- permissionMode: PREFERRED_PERMISSION_MODE,
406
- effectivePermissionMode: FALLBACK_PERMISSION_MODE,
407
- message: `Bypass 모드를 사용할 수 없어 auto 모드로 실행합니다: ${rejection}`,
408
- });
409
- }
410
-
411
400
  async function claudePermissionStatus(params) {
412
401
  const resolved = await resolveSettings({
413
402
  cwd: params.cwd || process.cwd(),
@@ -1160,7 +1149,6 @@ async function createSession(params, resumeId) {
1160
1149
  permissionMode: BOOTSTRAP_PERMISSION_MODE,
1161
1150
  permissionModeVerified: false,
1162
1151
  bypassUnavailable: false,
1163
- bypassRejection: null,
1164
1152
  models: [],
1165
1153
  queue,
1166
1154
  query: null,
@@ -1204,10 +1192,9 @@ async function createSession(params, resumeId) {
1204
1192
  });
1205
1193
  session.consumer = consumer;
1206
1194
  let initialization;
1207
- let permissionRejection;
1208
1195
  try {
1209
1196
  initialization = await agentQuery.initializationResult();
1210
- permissionRejection = await applyPermissionMode(session);
1197
+ await applyPermissionMode(session);
1211
1198
  } catch (error) {
1212
1199
  sessions.delete(id);
1213
1200
  queue.close();
@@ -1215,7 +1202,6 @@ async function createSession(params, resumeId) {
1215
1202
  await Promise.race([consumer, new Promise((resolve) => setTimeout(resolve, 1000))]);
1216
1203
  throw error;
1217
1204
  }
1218
- notifyPermissionFallback(session, permissionRejection);
1219
1205
  session.models = Array.isArray(initialization.models) ? initialization.models : [];
1220
1206
  const capabilities = modelCapabilities(session.models, params.model);
1221
1207
  // A resumed session can only name its model as the resolved id the transcript
@@ -2590,9 +2576,6 @@ async function runPrompt(session, params) {
2590
2576
  const model = stripClaudeModel(params.model);
2591
2577
  await session.query.setModel(model);
2592
2578
  session.model = visibleModel(params.model);
2593
- // Model switches can change which permission modes policy accepts. Recheck
2594
- // the preferred/fallback pair before admitting the turn.
2595
- session.permissionModeVerified = false;
2596
2579
  }
2597
2580
  session.steerPending = 0;
2598
2581
  const effort = supportedEffort(modelCapabilities(session.models, params.model || session.model), params.effort);
@@ -2600,8 +2583,6 @@ async function runPrompt(session, params) {
2600
2583
  await session.query.applyFlagSettings({ effortLevel: effort });
2601
2584
  }
2602
2585
  session.effort = effort;
2603
- const permissionRejection = await applyPermissionMode(session);
2604
- notifyPermissionFallback(session, permissionRejection);
2605
2586
  const content = await inputContent(params.input, params.handoffContext);
2606
2587
  const turnId = beginTurn(session, params.input);
2607
2588
  session.queue.push({
@@ -3047,12 +3028,7 @@ async function dispatch(method, params = {}) {
3047
3028
  if (method === "session/permissionMode") {
3048
3029
  const session = lookupSession(params.sessionId);
3049
3030
  if (!session) return { permissionMode: PREFERRED_PERMISSION_MODE };
3050
- const rejection = await applyPermissionMode(session);
3051
- notifyPermissionFallback(session, rejection);
3052
- return {
3053
- permissionMode: session.permissionMode,
3054
- ...(rejection ? { rejection } : {}),
3055
- };
3031
+ return { permissionMode: session.permissionMode };
3056
3032
  }
3057
3033
  // The host clears its `Working` row on `turn/completed` alone, so a single
3058
3034
  // dropped notification would strand the spinner forever. This answers "is the
@@ -3222,15 +3198,14 @@ async function runPermissionModeSelfTest() {
3222
3198
  permissionMode: BOOTSTRAP_PERMISSION_MODE,
3223
3199
  permissionModeVerified: false,
3224
3200
  bypassUnavailable: false,
3225
- bypassRejection: null,
3226
3201
  query: { setPermissionMode },
3227
3202
  });
3228
3203
 
3229
3204
  const preferredCalls = [];
3230
3205
  const preferred = fakeSession(async (mode) => preferredCalls.push(mode));
3231
- const preferredRejection = await applyPermissionMode(preferred);
3232
- if (preferredRejection !== null
3233
- || preferred.permissionMode !== PREFERRED_PERMISSION_MODE
3206
+ await applyPermissionMode(preferred);
3207
+ await applyPermissionMode(preferred);
3208
+ if (preferred.permissionMode !== PREFERRED_PERMISSION_MODE
3234
3209
  || preferredCalls.join(",") !== PREFERRED_PERMISSION_MODE) {
3235
3210
  throw new Error(`Claude bypass permission self-test failed: ${JSON.stringify(preferredCalls)}`);
3236
3211
  }
@@ -3240,10 +3215,9 @@ async function runPermissionModeSelfTest() {
3240
3215
  fallbackCalls.push(mode);
3241
3216
  if (mode === PREFERRED_PERMISSION_MODE) throw new Error("organization policy");
3242
3217
  });
3243
- const fallbackRejection = await applyPermissionMode(fallback);
3244
3218
  await applyPermissionMode(fallback);
3245
- if (fallbackRejection !== "organization policy"
3246
- || fallback.permissionMode !== FALLBACK_PERMISSION_MODE
3219
+ await applyPermissionMode(fallback);
3220
+ if (fallback.permissionMode !== FALLBACK_PERMISSION_MODE
3247
3221
  || fallbackCalls.join(",") !== `${PREFERRED_PERMISSION_MODE},${FALLBACK_PERMISSION_MODE}`) {
3248
3222
  throw new Error(`Claude auto fallback self-test failed: ${JSON.stringify(fallbackCalls)}`);
3249
3223
  }
package/package.json CHANGED
@@ -1,46 +1,46 @@
1
- {
2
- "name": "devez-vibe",
3
- "version": "1.6.61",
4
- "description": "Stable terminal UI for Codex and Claude Agent SDK",
5
- "keywords": [
6
- "codex",
7
- "cli",
8
- "tui",
9
- "terminal",
10
- "app-server",
11
- "claude-agent-sdk"
12
- ],
13
- "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
14
- "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
15
- "repository": {
16
- "type": "git",
17
- "url": "git+https://github.com/MrHoje/Devez-vibe.git"
18
- },
19
- "license": "MIT",
20
- "bin": {
21
- "dvz": "bin/dvz.exe"
22
- },
23
- "files": [
24
- "bin/dvz.exe",
25
- "bridge/claude-agent-sdk-bridge.mjs",
26
- "install-skills.mjs",
27
- "skills/luna-loop/",
28
- "README.md",
29
- "LICENSE"
30
- ],
31
- "os": [
32
- "win32"
33
- ],
34
- "cpu": [
35
- "x64"
36
- ],
37
- "engines": {
38
- "node": ">=18"
39
- },
40
- "scripts": {
41
- "postinstall": "node install-skills.mjs"
42
- },
43
- "dependencies": {
44
- "@anthropic-ai/claude-agent-sdk": "0.3.251"
45
- }
46
- }
1
+ {
2
+ "name": "devez-vibe",
3
+ "version": "1.6.63",
4
+ "description": "Stable terminal UI for Codex and Claude Agent SDK",
5
+ "keywords": [
6
+ "codex",
7
+ "cli",
8
+ "tui",
9
+ "terminal",
10
+ "app-server",
11
+ "claude-agent-sdk"
12
+ ],
13
+ "homepage": "https://github.com/MrHoje/Devez-vibe#readme",
14
+ "bugs": "https://github.com/MrHoje/Devez-vibe/issues",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/MrHoje/Devez-vibe.git"
18
+ },
19
+ "license": "MIT",
20
+ "bin": {
21
+ "dvz": "bin/dvz.exe"
22
+ },
23
+ "files": [
24
+ "bin/dvz.exe",
25
+ "bridge/claude-agent-sdk-bridge.mjs",
26
+ "install-skills.mjs",
27
+ "skills/luna-loop/",
28
+ "README.md",
29
+ "LICENSE"
30
+ ],
31
+ "os": [
32
+ "win32"
33
+ ],
34
+ "cpu": [
35
+ "x64"
36
+ ],
37
+ "engines": {
38
+ "node": ">=18"
39
+ },
40
+ "scripts": {
41
+ "postinstall": "node install-skills.mjs"
42
+ },
43
+ "dependencies": {
44
+ "@anthropic-ai/claude-agent-sdk": "0.3.251"
45
+ }
46
+ }