devez-vibe 1.9.32 → 1.9.33

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
@@ -902,11 +902,14 @@ async function requestToolPermission(toolName, input, permission) {
902
902
  // decide that a human answer is needed. Forward every such request to the host;
903
903
  // auto-allowing the ordinary cases here would silently defeat default/auto mode.
904
904
  const planApproval = toolName === "ExitPlanMode";
905
- const persistentApprovalLabel = permissionSuggestionLabel(permission.suggestions);
906
- const common = {
907
- claudePermission: true,
908
- title: permission.title || permission.displayName,
909
- persistentApprovalLabel,
905
+ const persistentApprovalLabel = permission.suppressAlwaysAllowRule
906
+ ? "" : permissionSuggestionLabel(permission.suggestions);
907
+ const common = {
908
+ claudePermission: true,
909
+ title: permission.title || permission.displayName,
910
+ persistentApprovalLabel,
911
+ defaultToNo: Boolean(permission.defaultToNo),
912
+ suppressAlwaysAllowRule: Boolean(permission.suppressAlwaysAllowRule),
910
913
  };
911
914
 
912
915
  let method = "item/permissions/requestApproval";
@@ -944,9 +947,10 @@ async function requestToolPermission(toolName, input, permission) {
944
947
  return {
945
948
  behavior: "allow",
946
949
  updatedInput: input,
947
- ...(response?.decision === "acceptForSession" || response?.scope === "session"
948
- ? { updatedPermissions: permission.suggestions }
949
- : {}),
950
+ ...(!permission.suppressAlwaysAllowRule
951
+ && (response?.decision === "acceptForSession" || response?.scope === "session")
952
+ ? { updatedPermissions: permission.suggestions }
953
+ : {}),
950
954
  };
951
955
  }
952
956
 
@@ -3891,7 +3895,7 @@ async function dispatch(method, params = {}) {
3891
3895
  throw new Error(`지원하지 않는 Claude 브리지 메서드: ${method}`);
3892
3896
  }
3893
3897
 
3894
- async function runPermissionModeSelfTest() {
3898
+ async function runPermissionModeSelfTest() {
3895
3899
  const fakeSession = (setPermissionMode) => ({
3896
3900
  id: "permission-mode-self-test",
3897
3901
  permissionMode: BOOTSTRAP_PERMISSION_MODE,
@@ -3923,7 +3927,35 @@ async function runPermissionModeSelfTest() {
3923
3927
  || rejectedCalls.join(",") !== "auto" || rejected.permissionModeVerified) {
3924
3928
  throw new Error(`Claude permission double rejection self-test failed: ${doubleRejection}`);
3925
3929
  }
3926
- }
3930
+ }
3931
+
3932
+ async function runGuardedPermissionSelfTest() {
3933
+ const captured = [];
3934
+ const originalWrite = process.stdout.write;
3935
+ process.stdout.write = (chunk) => { captured.push(JSON.parse(String(chunk))); return true; };
3936
+ try {
3937
+ const pending = requestToolPermission("Bash", { command: "npm test" }, {
3938
+ defaultToNo: true,
3939
+ suppressAlwaysAllowRule: true,
3940
+ suggestions: [{ destination: "projectSettings", rules: [{ toolName: "Bash" }] }],
3941
+ });
3942
+ const request = captured[0];
3943
+ if (request.params.defaultToNo !== true
3944
+ || request.params.suppressAlwaysAllowRule !== true
3945
+ || request.params.persistentApprovalLabel) {
3946
+ throw new Error("Claude guarded permission request self-test failed");
3947
+ }
3948
+ const reply = pendingHostRequests.get(request.id);
3949
+ pendingHostRequests.delete(request.id);
3950
+ reply.resolve({ decision: "acceptForSession" });
3951
+ const result = await pending;
3952
+ if (result.behavior !== "allow" || "updatedPermissions" in result) {
3953
+ throw new Error("Claude guarded permission response self-test failed");
3954
+ }
3955
+ } finally {
3956
+ process.stdout.write = originalWrite;
3957
+ }
3958
+ }
3927
3959
 
3928
3960
  function runToolPolicySelfTest() {
3929
3961
  const cwd = process.platform === "win32" ? "C:\\repo" : "/repo";
@@ -4019,7 +4051,8 @@ async function runSelfTest() {
4019
4051
  if (startupGaps.length) {
4020
4052
  throw new Error(`Claude 기동 실패 안내 누락: ${startupGaps.join(", ")}`);
4021
4053
  }
4022
- await runPermissionModeSelfTest();
4054
+ await runPermissionModeSelfTest();
4055
+ await runGuardedPermissionSelfTest();
4023
4056
  runToolPolicySelfTest();
4024
4057
  await runCommandTimeoutSelfTest();
4025
4058
  // A turn that ends with no answer must reach the user: refusal as an error
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devez-vibe",
3
- "version": "1.9.32",
3
+ "version": "1.9.33",
4
4
  "type": "module",
5
5
  "description": "Stable terminal UI for Codex and Claude Agent SDK",
6
6
  "keywords": [
@@ -45,6 +45,6 @@
45
45
  "postinstall": "node install-skills.mjs && node prepare-search-deps.mjs"
46
46
  },
47
47
  "dependencies": {
48
- "@anthropic-ai/claude-agent-sdk": "0.3.280"
48
+ "@anthropic-ai/claude-agent-sdk": "0.3.283"
49
49
  }
50
50
  }