@astrasyncai/verification-gateway 4.1.0 → 4.2.1

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.
Files changed (39) hide show
  1. package/dist/agent/index.js +2 -2
  2. package/dist/agent/index.js.map +1 -1
  3. package/dist/agent/index.mjs +2 -2
  4. package/dist/agent/index.mjs.map +1 -1
  5. package/dist/bin/astrasync-claude-hook.js +2 -2
  6. package/dist/bin/astrasync-codex-hook.js +2 -2
  7. package/dist/bin/astrasync-guard.js +89 -2
  8. package/dist/bin/astrasync.js +92 -5
  9. package/dist/browser/background.js +2 -2
  10. package/dist/browser/background.js.map +1 -1
  11. package/dist/browser/background.mjs +2 -2
  12. package/dist/browser/background.mjs.map +1 -1
  13. package/dist/codex/index.js +13 -2
  14. package/dist/codex/index.js.map +1 -1
  15. package/dist/codex/index.mjs +13 -2
  16. package/dist/codex/index.mjs.map +1 -1
  17. package/dist/cursor/extension.js +2 -2
  18. package/dist/cursor/extension.js.map +1 -1
  19. package/dist/cursor/extension.mjs +2 -2
  20. package/dist/cursor/extension.mjs.map +1 -1
  21. package/dist/gateway/gateway.js +2 -2
  22. package/dist/gateway/gateway.js.map +1 -1
  23. package/dist/gateway/gateway.mjs +2 -2
  24. package/dist/gateway/gateway.mjs.map +1 -1
  25. package/dist/{index-BPEBlOsE.d.mts → index-BTeQ9fgV.d.mts} +2 -2
  26. package/dist/{index-B0YHu_SP.d.ts → index-BqHKlLOU.d.ts} +2 -2
  27. package/dist/index.d.mts +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/index.js +5 -5
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +2 -2
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/transport/index.d.mts +1 -1
  34. package/dist/transport/index.d.ts +1 -1
  35. package/dist/transport/index.js +5 -5
  36. package/dist/transport/index.js.map +1 -1
  37. package/dist/transport/index.mjs +2 -2
  38. package/dist/transport/index.mjs.map +1 -1
  39. package/package.json +2 -4
@@ -5164,14 +5164,14 @@ var InMemoryNonceStore = class {
5164
5164
  var defaultNonceStore = new InMemoryNonceStore();
5165
5165
 
5166
5166
  // src/transport/vi.ts
5167
- var import_decode = require("@sd-jwt/decode");
5167
+ var import_core = require("@sd-jwt/core");
5168
5168
  var import_node_crypto = require("crypto");
5169
5169
 
5170
5170
  // src/transport/stripe-webhook.ts
5171
5171
  var import_node_crypto2 = require("crypto");
5172
5172
 
5173
5173
  // src/transport/ap2.ts
5174
- var import_decode2 = require("@sd-jwt/decode");
5174
+ var import_core2 = require("@sd-jwt/core");
5175
5175
  var import_node_crypto3 = require("crypto");
5176
5176
 
5177
5177
  // src/transport/mpp.ts
@@ -5912,6 +5912,72 @@ function uninstallClaudeHooks(settingsPath, marker2 = ASTRASYNC_HOOK_MARKER) {
5912
5912
  writeSettings(settingsPath, settings);
5913
5913
  return true;
5914
5914
  }
5915
+ var PERMISSION_DENY_PATHS = [
5916
+ "**/.claude/settings.json",
5917
+ "**/.claude/settings.local.json",
5918
+ "~/.claude/settings.json",
5919
+ "~/.claude/settings.local.json",
5920
+ "**/.astrasync/**",
5921
+ "~/.astrasync/**"
5922
+ ];
5923
+ var GUARD_PERMISSION_DENY_RULES = PERMISSION_DENY_PATHS.map(
5924
+ (p) => `Edit(${p})`
5925
+ );
5926
+ var LEGACY_GUARD_PERMISSION_DENY_RULES = [];
5927
+ function readDenyRules(settings, settingsPath) {
5928
+ const permissions = settings.permissions;
5929
+ if (permissions !== void 0 && (typeof permissions !== "object" || Array.isArray(permissions) || permissions === null)) {
5930
+ throw new Error(`${settingsPath}: "permissions" is not an object \u2014 refusing to rewrite it.`);
5931
+ }
5932
+ const deny = permissions?.deny;
5933
+ if (deny === void 0) return [];
5934
+ if (!Array.isArray(deny) || deny.some((r) => typeof r !== "string")) {
5935
+ throw new Error(
5936
+ `${settingsPath}: "permissions.deny" is not an array of strings \u2014 refusing to rewrite it.`
5937
+ );
5938
+ }
5939
+ return deny;
5940
+ }
5941
+ function installClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
5942
+ const settings = readSettings(settingsPath);
5943
+ const deny = readDenyRules(settings, settingsPath);
5944
+ const stale = new Set(staleRules);
5945
+ const removedStaleRules = deny.filter((r) => stale.has(r));
5946
+ const kept = deny.filter((r) => !stale.has(r));
5947
+ const present = new Set(kept);
5948
+ const addedRules = rules.filter((r) => !present.has(r));
5949
+ const changed = addedRules.length > 0 || removedStaleRules.length > 0;
5950
+ if (changed) {
5951
+ settings.permissions = settings.permissions ?? {};
5952
+ settings.permissions.deny = [...kept, ...addedRules];
5953
+ writeSettings(settingsPath, settings);
5954
+ }
5955
+ return { addedRules, removedStaleRules, changed };
5956
+ }
5957
+ function uninstallClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
5958
+ if (!(0, import_fs5.existsSync)(settingsPath)) return [];
5959
+ let settings;
5960
+ let deny;
5961
+ try {
5962
+ settings = readSettings(settingsPath);
5963
+ deny = readDenyRules(settings, settingsPath);
5964
+ } catch {
5965
+ return [];
5966
+ }
5967
+ if (deny.length === 0) return [];
5968
+ const ours = /* @__PURE__ */ new Set([...rules, ...staleRules]);
5969
+ const removed = deny.filter((r) => ours.has(r));
5970
+ if (removed.length === 0) return [];
5971
+ const remaining = deny.filter((r) => !ours.has(r));
5972
+ if (remaining.length > 0) {
5973
+ settings.permissions.deny = remaining;
5974
+ } else {
5975
+ delete settings.permissions.deny;
5976
+ if (Object.keys(settings.permissions).length === 0) delete settings.permissions;
5977
+ }
5978
+ writeSettings(settingsPath, settings);
5979
+ return removed;
5980
+ }
5915
5981
  var GUARD_SELF_PROTECTION_PATTERNS = [
5916
5982
  "**/.claude/settings.json",
5917
5983
  "**/.claude/settings.local.json",
@@ -6306,6 +6372,17 @@ async function cmdInstallClaudeCode() {
6306
6372
  } else {
6307
6373
  console.log(` Hook: already present in ${settingsPath}`);
6308
6374
  }
6375
+ const permResult = installClaudePermissionRules(settingsPath);
6376
+ if (permResult.addedRules.length > 0) {
6377
+ console.log(
6378
+ ` Deny: ${permResult.addedRules.length} permissions.deny self-protection rules added in ${settingsPath}`
6379
+ );
6380
+ } else {
6381
+ console.log(" Deny: permissions.deny self-protection rules already present");
6382
+ }
6383
+ if (permResult.removedStaleRules.length > 0) {
6384
+ console.log(` removed ${permResult.removedStaleRules.length} stale guard rules`);
6385
+ }
6309
6386
  console.log("\n Next steps:");
6310
6387
  console.log(" 1. Start a NEW Claude Code session (settings load at startup).");
6311
6388
  console.log(` 2. Watch decisions: tail -f ${path.join(astrasyncDir, "traces")}/*.jsonl`);
@@ -6323,6 +6400,16 @@ async function cmdUninstallClaudeCode() {
6323
6400
  } else {
6324
6401
  console.log(`[AstraSync] No AstraSync hook found in ${settingsPath}`);
6325
6402
  }
6403
+ const removedRules = uninstallClaudePermissionRules(settingsPath);
6404
+ if (removedRules.length > 0) {
6405
+ console.log(
6406
+ `[AstraSync] Removed ${removedRules.length} permissions.deny rules from ${settingsPath}.`
6407
+ );
6408
+ console.log(" If you had added any of these yourself, re-add them:");
6409
+ for (const rule of removedRules) {
6410
+ console.log(` ${rule}`);
6411
+ }
6412
+ }
6326
6413
  console.log(
6327
6414
  `[AstraSync] Policy and traces left in place at ${astrasyncDir} \u2014 delete manually if unwanted.`
6328
6415
  );
@@ -5786,11 +5786,11 @@ var init_acp = __esm({
5786
5786
  });
5787
5787
 
5788
5788
  // src/transport/vi.ts
5789
- var import_decode, import_node_crypto;
5789
+ var import_core, import_node_crypto;
5790
5790
  var init_vi = __esm({
5791
5791
  "src/transport/vi.ts"() {
5792
5792
  "use strict";
5793
- import_decode = require("@sd-jwt/decode");
5793
+ import_core = require("@sd-jwt/core");
5794
5794
  import_node_crypto = require("crypto");
5795
5795
  }
5796
5796
  });
@@ -5819,11 +5819,11 @@ var init_identity_binding = __esm({
5819
5819
  });
5820
5820
 
5821
5821
  // src/transport/ap2.ts
5822
- var import_decode2, import_node_crypto3;
5822
+ var import_core2, import_node_crypto3;
5823
5823
  var init_ap2 = __esm({
5824
5824
  "src/transport/ap2.ts"() {
5825
5825
  "use strict";
5826
- import_decode2 = require("@sd-jwt/decode");
5826
+ import_core2 = require("@sd-jwt/core");
5827
5827
  import_node_crypto3 = require("crypto");
5828
5828
  }
5829
5829
  });
@@ -6851,6 +6851,60 @@ function uninstallClaudeHooks(settingsPath, marker2 = ASTRASYNC_HOOK_MARKER) {
6851
6851
  writeSettings(settingsPath, settings);
6852
6852
  return true;
6853
6853
  }
6854
+ function readDenyRules(settings, settingsPath) {
6855
+ const permissions = settings.permissions;
6856
+ if (permissions !== void 0 && (typeof permissions !== "object" || Array.isArray(permissions) || permissions === null)) {
6857
+ throw new Error(`${settingsPath}: "permissions" is not an object \u2014 refusing to rewrite it.`);
6858
+ }
6859
+ const deny = permissions?.deny;
6860
+ if (deny === void 0) return [];
6861
+ if (!Array.isArray(deny) || deny.some((r) => typeof r !== "string")) {
6862
+ throw new Error(
6863
+ `${settingsPath}: "permissions.deny" is not an array of strings \u2014 refusing to rewrite it.`
6864
+ );
6865
+ }
6866
+ return deny;
6867
+ }
6868
+ function installClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
6869
+ const settings = readSettings(settingsPath);
6870
+ const deny = readDenyRules(settings, settingsPath);
6871
+ const stale = new Set(staleRules);
6872
+ const removedStaleRules = deny.filter((r) => stale.has(r));
6873
+ const kept = deny.filter((r) => !stale.has(r));
6874
+ const present = new Set(kept);
6875
+ const addedRules = rules.filter((r) => !present.has(r));
6876
+ const changed = addedRules.length > 0 || removedStaleRules.length > 0;
6877
+ if (changed) {
6878
+ settings.permissions = settings.permissions ?? {};
6879
+ settings.permissions.deny = [...kept, ...addedRules];
6880
+ writeSettings(settingsPath, settings);
6881
+ }
6882
+ return { addedRules, removedStaleRules, changed };
6883
+ }
6884
+ function uninstallClaudePermissionRules(settingsPath, rules = GUARD_PERMISSION_DENY_RULES, staleRules = LEGACY_GUARD_PERMISSION_DENY_RULES) {
6885
+ if (!(0, import_fs5.existsSync)(settingsPath)) return [];
6886
+ let settings;
6887
+ let deny;
6888
+ try {
6889
+ settings = readSettings(settingsPath);
6890
+ deny = readDenyRules(settings, settingsPath);
6891
+ } catch {
6892
+ return [];
6893
+ }
6894
+ if (deny.length === 0) return [];
6895
+ const ours = /* @__PURE__ */ new Set([...rules, ...staleRules]);
6896
+ const removed = deny.filter((r) => ours.has(r));
6897
+ if (removed.length === 0) return [];
6898
+ const remaining = deny.filter((r) => !ours.has(r));
6899
+ if (remaining.length > 0) {
6900
+ settings.permissions.deny = remaining;
6901
+ } else {
6902
+ delete settings.permissions.deny;
6903
+ if (Object.keys(settings.permissions).length === 0) delete settings.permissions;
6904
+ }
6905
+ writeSettings(settingsPath, settings);
6906
+ return removed;
6907
+ }
6854
6908
  function ensureGuardSelfProtection(policyPath) {
6855
6909
  const parsed = parseFile(policyPath);
6856
6910
  if (!parsed.validation.valid || !parsed.policy) return false;
@@ -6895,7 +6949,7 @@ function buildDefaultClaudeCodePolicy(name = "claude-code-local-guard") {
6895
6949
  riskThresholds: permissive.thresholds
6896
6950
  };
6897
6951
  }
6898
- var import_fs5, import_path4, ASTRASYNC_HOOK_MARKER, HOOK_MATCHER, HOOK_TIMEOUT_SECONDS, GUARD_SELF_PROTECTION_PATTERNS;
6952
+ var import_fs5, import_path4, ASTRASYNC_HOOK_MARKER, HOOK_MATCHER, HOOK_TIMEOUT_SECONDS, PERMISSION_DENY_PATHS, GUARD_PERMISSION_DENY_RULES, LEGACY_GUARD_PERMISSION_DENY_RULES, GUARD_SELF_PROTECTION_PATTERNS;
6899
6953
  var init_settings_installer = __esm({
6900
6954
  "src/claude-code/settings-installer.ts"() {
6901
6955
  "use strict";
@@ -6906,6 +6960,18 @@ var init_settings_installer = __esm({
6906
6960
  ASTRASYNC_HOOK_MARKER = "astrasync-claude-hook";
6907
6961
  HOOK_MATCHER = "Bash|PowerShell|Write|Edit|MultiEdit|NotebookEdit|Read|Glob|Grep|WebFetch|WebSearch|Task|Agent|mcp__.*";
6908
6962
  HOOK_TIMEOUT_SECONDS = 10;
6963
+ PERMISSION_DENY_PATHS = [
6964
+ "**/.claude/settings.json",
6965
+ "**/.claude/settings.local.json",
6966
+ "~/.claude/settings.json",
6967
+ "~/.claude/settings.local.json",
6968
+ "**/.astrasync/**",
6969
+ "~/.astrasync/**"
6970
+ ];
6971
+ GUARD_PERMISSION_DENY_RULES = PERMISSION_DENY_PATHS.map(
6972
+ (p) => `Edit(${p})`
6973
+ );
6974
+ LEGACY_GUARD_PERMISSION_DENY_RULES = [];
6909
6975
  GUARD_SELF_PROTECTION_PATTERNS = [
6910
6976
  "**/.claude/settings.json",
6911
6977
  "**/.claude/settings.local.json",
@@ -7264,6 +7330,17 @@ async function cmdInstallClaudeCode() {
7264
7330
  } else {
7265
7331
  console.log(` Hook: already present in ${settingsPath}`);
7266
7332
  }
7333
+ const permResult = installClaudePermissionRules(settingsPath);
7334
+ if (permResult.addedRules.length > 0) {
7335
+ console.log(
7336
+ ` Deny: ${permResult.addedRules.length} permissions.deny self-protection rules added in ${settingsPath}`
7337
+ );
7338
+ } else {
7339
+ console.log(" Deny: permissions.deny self-protection rules already present");
7340
+ }
7341
+ if (permResult.removedStaleRules.length > 0) {
7342
+ console.log(` removed ${permResult.removedStaleRules.length} stale guard rules`);
7343
+ }
7267
7344
  console.log("\n Next steps:");
7268
7345
  console.log(" 1. Start a NEW Claude Code session (settings load at startup).");
7269
7346
  console.log(` 2. Watch decisions: tail -f ${path.join(astrasyncDir, "traces")}/*.jsonl`);
@@ -7281,6 +7358,16 @@ async function cmdUninstallClaudeCode() {
7281
7358
  } else {
7282
7359
  console.log(`[AstraSync] No AstraSync hook found in ${settingsPath}`);
7283
7360
  }
7361
+ const removedRules = uninstallClaudePermissionRules(settingsPath);
7362
+ if (removedRules.length > 0) {
7363
+ console.log(
7364
+ `[AstraSync] Removed ${removedRules.length} permissions.deny rules from ${settingsPath}.`
7365
+ );
7366
+ console.log(" If you had added any of these yourself, re-add them:");
7367
+ for (const rule of removedRules) {
7368
+ console.log(` ${rule}`);
7369
+ }
7370
+ }
7284
7371
  console.log(
7285
7372
  `[AstraSync] Policy and traces left in place at ${astrasyncDir} \u2014 delete manually if unwanted.`
7286
7373
  );
@@ -4493,14 +4493,14 @@ var InMemoryNonceStore = class {
4493
4493
  var defaultNonceStore = new InMemoryNonceStore();
4494
4494
 
4495
4495
  // src/transport/vi.ts
4496
- var import_decode = require("@sd-jwt/decode");
4496
+ var import_core = require("@sd-jwt/core");
4497
4497
  var import_node_crypto = require("crypto");
4498
4498
 
4499
4499
  // src/transport/stripe-webhook.ts
4500
4500
  var import_node_crypto2 = require("crypto");
4501
4501
 
4502
4502
  // src/transport/ap2.ts
4503
- var import_decode2 = require("@sd-jwt/decode");
4503
+ var import_core2 = require("@sd-jwt/core");
4504
4504
  var import_node_crypto3 = require("crypto");
4505
4505
 
4506
4506
  // src/transport/mpp.ts