@astrasyncai/verification-gateway 3.11.0 → 3.12.0

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 (103) hide show
  1. package/dist/adapter-interface/interface.d.mts +2 -2
  2. package/dist/adapter-interface/interface.d.ts +2 -2
  3. package/dist/adapters/express.d.mts +2 -2
  4. package/dist/adapters/express.d.ts +2 -2
  5. package/dist/adapters/express.js +22 -3
  6. package/dist/adapters/express.js.map +1 -1
  7. package/dist/adapters/express.mjs +22 -3
  8. package/dist/adapters/express.mjs.map +1 -1
  9. package/dist/adapters/mcp.d.mts +1 -1
  10. package/dist/adapters/mcp.d.ts +1 -1
  11. package/dist/adapters/mcp.js +22 -3
  12. package/dist/adapters/mcp.js.map +1 -1
  13. package/dist/adapters/mcp.mjs +22 -3
  14. package/dist/adapters/mcp.mjs.map +1 -1
  15. package/dist/adapters/nextjs.d.mts +2 -2
  16. package/dist/adapters/nextjs.d.ts +2 -2
  17. package/dist/adapters/nextjs.js +22 -3
  18. package/dist/adapters/nextjs.js.map +1 -1
  19. package/dist/adapters/nextjs.mjs +22 -3
  20. package/dist/adapters/nextjs.mjs.map +1 -1
  21. package/dist/adapters/sdk.d.mts +2 -2
  22. package/dist/adapters/sdk.d.ts +2 -2
  23. package/dist/adapters/sdk.js +22 -3
  24. package/dist/adapters/sdk.js.map +1 -1
  25. package/dist/adapters/sdk.mjs +22 -3
  26. package/dist/adapters/sdk.mjs.map +1 -1
  27. package/dist/agent/index.d.mts +2 -2
  28. package/dist/agent/index.d.ts +2 -2
  29. package/dist/bin/astrasync-claude-hook.js +84 -21
  30. package/dist/bin/astrasync-codex-hook.js +84 -21
  31. package/dist/bin/astrasync-guard.js +84 -21
  32. package/dist/bin/astrasync.js +85 -21
  33. package/dist/browser/background.js +84 -21
  34. package/dist/browser/background.js.map +1 -1
  35. package/dist/browser/background.mjs +84 -21
  36. package/dist/browser/background.mjs.map +1 -1
  37. package/dist/browser/browser-adapter.d.mts +2 -2
  38. package/dist/browser/browser-adapter.d.ts +2 -2
  39. package/dist/claude-code/claude-code-adapter.d.mts +2 -2
  40. package/dist/claude-code/claude-code-adapter.d.ts +2 -2
  41. package/dist/cli/index.d.mts +2 -2
  42. package/dist/cli/index.d.ts +2 -2
  43. package/dist/codex/index.d.mts +2 -2
  44. package/dist/codex/index.d.ts +2 -2
  45. package/dist/codex/index.js +84 -21
  46. package/dist/codex/index.js.map +1 -1
  47. package/dist/codex/index.mjs +84 -21
  48. package/dist/codex/index.mjs.map +1 -1
  49. package/dist/cursor/cursor-adapter.d.mts +2 -2
  50. package/dist/cursor/cursor-adapter.d.ts +2 -2
  51. package/dist/cursor/extension.d.mts +2 -2
  52. package/dist/cursor/extension.d.ts +2 -2
  53. package/dist/cursor/extension.js +84 -21
  54. package/dist/cursor/extension.js.map +1 -1
  55. package/dist/cursor/extension.mjs +84 -21
  56. package/dist/cursor/extension.mjs.map +1 -1
  57. package/dist/edge-config.d.mts +1 -1
  58. package/dist/edge-config.d.ts +1 -1
  59. package/dist/{express-DCXa1oqj.d.mts → express-B39o89gf.d.mts} +1 -1
  60. package/dist/{express-ClNtDhhc.d.ts → express-BuxKNO_q.d.ts} +1 -1
  61. package/dist/gateway/gateway.d.mts +2 -2
  62. package/dist/gateway/gateway.d.ts +2 -2
  63. package/dist/gateway/gateway.js +84 -21
  64. package/dist/gateway/gateway.js.map +1 -1
  65. package/dist/gateway/gateway.mjs +84 -21
  66. package/dist/gateway/gateway.mjs.map +1 -1
  67. package/dist/git-trigger/git-hooks.d.mts +2 -2
  68. package/dist/git-trigger/git-hooks.d.ts +2 -2
  69. package/dist/{index-CfHurO1P.d.ts → index-BG62SXso.d.ts} +1 -1
  70. package/dist/{index-D2ztkumS.d.ts → index-CLHdqs2M.d.ts} +1 -1
  71. package/dist/{index-Dr_XiN65.d.mts → index-CqydB4ks.d.mts} +1 -1
  72. package/dist/{index-BrNKDmiR.d.mts → index-DME3w3lf.d.mts} +1 -1
  73. package/dist/index.d.mts +9 -9
  74. package/dist/index.d.ts +9 -9
  75. package/dist/index.js +42 -3
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +41 -3
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/local-evaluator/evaluator.d.mts +11 -2
  80. package/dist/local-evaluator/evaluator.d.ts +11 -2
  81. package/dist/local-evaluator/evaluator.js +20 -9
  82. package/dist/local-evaluator/evaluator.js.map +1 -1
  83. package/dist/local-evaluator/evaluator.mjs +20 -9
  84. package/dist/local-evaluator/evaluator.mjs.map +1 -1
  85. package/dist/{nextjs-DcQIk6Zj.d.mts → nextjs-D74W7wt-.d.mts} +1 -1
  86. package/dist/{nextjs-CEBVBsdi.d.ts → nextjs-Ddlw_J1J.d.ts} +1 -1
  87. package/dist/{sdk-CZkbSOeO.d.mts → sdk-Bn6bj7kt.d.mts} +1 -1
  88. package/dist/{sdk-H0JCLW2y.d.ts → sdk-CT7gdkfR.d.ts} +1 -1
  89. package/dist/transport/index.d.mts +2 -2
  90. package/dist/transport/index.d.ts +2 -2
  91. package/dist/{types-sy3tq8lp.d.mts → types-BntuzEEn.d.mts} +103 -1
  92. package/dist/{types-BV6abBnF.d.mts → types-DHu7m9HI.d.ts} +7 -2
  93. package/dist/{types-C23_uaY8.d.ts → types-Djw4GLtz.d.mts} +7 -2
  94. package/dist/{types-9tns4wyl.d.ts → types-SDu4Llbe.d.ts} +103 -1
  95. package/dist/ui/index.d.mts +1 -1
  96. package/dist/ui/index.d.ts +1 -1
  97. package/dist/verify.d.mts +13 -2
  98. package/dist/verify.d.ts +13 -2
  99. package/dist/verify.js +42 -3
  100. package/dist/verify.js.map +1 -1
  101. package/dist/verify.mjs +41 -3
  102. package/dist/verify.mjs.map +1 -1
  103. package/package.json +1 -1
@@ -121,8 +121,9 @@ function extractBacktickSubstitutions(text, collect) {
121
121
  return kept.join(" ");
122
122
  }
123
123
  function basename(token) {
124
- const slash = token.lastIndexOf("/");
125
- return slash === -1 ? token : token.slice(slash + 1);
124
+ const slash = Math.max(token.lastIndexOf("/"), token.lastIndexOf("\\"));
125
+ const name = slash === -1 ? token : token.slice(slash + 1);
126
+ return name.replace(/\.(exe|cmd|bat|ps1)$/i, "");
126
127
  }
127
128
  function matchSegment(segment, list) {
128
129
  const tokens = segment.split(/\s+/).filter((t) => /[a-z0-9]/.test(t));
@@ -255,7 +256,9 @@ var LocalEvaluator = class {
255
256
  }
256
257
  return {
257
258
  recommendation: "ALLOW",
258
- reason: "All PDLSS checks passed",
259
+ // "evaluated": dimensions absent from the policy are skipped, not
260
+ // failed — evaluatedDimensions below records which ones ran.
261
+ reason: "All evaluated PDLSS checks passed",
259
262
  evaluatedDimensions: {
260
263
  purpose: true,
261
264
  scope: !!this.policy.scope,
@@ -354,7 +357,7 @@ var LocalEvaluator = class {
354
357
  }
355
358
  }
356
359
  if ((context.purpose === "file.read" || context.purpose === "file.write" || context.purpose === "file.delete") && context.target) {
357
- const targetLower = context.target.toLowerCase();
360
+ const targetLower = context.target.toLowerCase().replace(/\\/g, "/");
358
361
  for (const sensitivePath of SENSITIVE_PATHS) {
359
362
  if (targetLower.includes(sensitivePath.toLowerCase())) {
360
363
  score = Math.max(score, 50);
@@ -383,12 +386,20 @@ var LocalEvaluator = class {
383
386
  matchesAnyPattern(value, patterns) {
384
387
  return patterns.some((pattern) => this.matchGlob(value, pattern));
385
388
  }
386
- /**
387
- * Simple glob pattern matching.
388
- * Supports * (matches any characters including / and spaces) and ? (single char).
389
- * Uses the same approach as the backend's matchGlobPattern.
390
- */
389
+ homePrefix() {
390
+ if (this.cachedHomePrefix !== void 0) return this.cachedHomePrefix;
391
+ const env = typeof process !== "undefined" ? process.env : void 0;
392
+ const home = env?.HOME || env?.USERPROFILE;
393
+ this.cachedHomePrefix = home ? home.replace(/\\/g, "/") : null;
394
+ return this.cachedHomePrefix;
395
+ }
391
396
  matchGlob(value, pattern) {
397
+ value = value.replace(/\\/g, "/");
398
+ pattern = pattern.replace(/\\/g, "/");
399
+ if (pattern === "~" || pattern.startsWith("~/")) {
400
+ const home = this.homePrefix();
401
+ if (home) pattern = home + pattern.slice(1);
402
+ }
392
403
  if (pattern === value) return true;
393
404
  const starCount = (pattern.match(/\*/g) ?? []).length;
394
405
  if (starCount > 8) {
@@ -3661,7 +3672,7 @@ function getTrustLevel(score) {
3661
3672
  }
3662
3673
 
3663
3674
  // src/version.ts
3664
- var SDK_VERSION = "3.11.0";
3675
+ var SDK_VERSION = "3.12.0";
3665
3676
 
3666
3677
  // src/well-known.ts
3667
3678
  var CACHE_TTL_MS = 60 * 60 * 1e3;
@@ -3828,6 +3839,7 @@ function createGuidanceResponse(_config, reason, options = {}) {
3828
3839
  }
3829
3840
  ] : void 0,
3830
3841
  correlationId: options.correlationId,
3842
+ attemptId: options.attemptId,
3831
3843
  verifiedAt: /* @__PURE__ */ new Date()
3832
3844
  };
3833
3845
  }
@@ -3857,6 +3869,8 @@ async function callVerifyAccessAPI(config, request) {
3857
3869
  body.runtimeChallengeOptions = requestData.runtimeChallengeOptions;
3858
3870
  if (requestData.invocationProtocol) body.invocationProtocol = requestData.invocationProtocol;
3859
3871
  if (requestData.commerceArtifacts) body.commerceArtifacts = requestData.commerceArtifacts;
3872
+ if (requestData.attemptId) body.attemptId = requestData.attemptId;
3873
+ if (requestData.considerationSet) body.considerationSet = requestData.considerationSet;
3860
3874
  body.sdkVersion = SDK_VERSION;
3861
3875
  if (requestData.callerMetadata || requestData.clientIp || requestData.userAgent) {
3862
3876
  const meta = {
@@ -3884,6 +3898,9 @@ async function callVerifyAccessAPI(config, request) {
3884
3898
  if (response.status === 410) {
3885
3899
  return {
3886
3900
  success: true,
3901
+ // 3.12.0 (Trust Record): keep the server-echoed attempt handle even on
3902
+ // the synthesised 410 deny shape (echoed on every branch).
3903
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0,
3887
3904
  access: {
3888
3905
  allowed: false,
3889
3906
  accessLevel: "none",
@@ -3902,7 +3919,8 @@ async function callVerifyAccessAPI(config, request) {
3902
3919
  return {
3903
3920
  success: false,
3904
3921
  error: data.message || data.error || `API returned ${response.status}`,
3905
- correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0
3922
+ correlationId: typeof data?.correlationId === "string" ? data.correlationId : void 0,
3923
+ attemptId: typeof data?.attemptId === "string" ? data.attemptId : void 0
3906
3924
  };
3907
3925
  }
3908
3926
  return data;
@@ -3936,7 +3954,13 @@ async function verify(config, request, options) {
3936
3954
  if (mergedConfig.debug) {
3937
3955
  console.log("[VerificationGateway] Returning cached result");
3938
3956
  }
3939
- return cached;
3957
+ const hit = { ...cached };
3958
+ if (request.attemptId) {
3959
+ hit.attemptId = request.attemptId;
3960
+ } else {
3961
+ delete hit.attemptId;
3962
+ }
3963
+ return hit;
3940
3964
  }
3941
3965
  }
3942
3966
  const enrichedRequest = { ...request };
@@ -3956,6 +3980,7 @@ async function verify(config, request, options) {
3956
3980
  return createGuidanceResponse(mergedConfig, apiResponse.error, {
3957
3981
  source: "api_error",
3958
3982
  correlationId: apiResponse.correlationId,
3983
+ attemptId: apiResponse.attemptId,
3959
3984
  urls
3960
3985
  });
3961
3986
  }
@@ -3991,6 +4016,9 @@ async function verify(config, request, options) {
3991
4016
  // Anonymous traffic has no session → correlationId is the per-attempt
3992
4017
  // linking key (the sessionId-equivalent for anonymous callers).
3993
4018
  correlationId: apiResponse.correlationId,
4019
+ // 3.12.0 (Trust Record): server echoes the attempt-chain handle on
4020
+ // every branch — denials included (the funnel outlives one deny).
4021
+ attemptId: apiResponse.attemptId,
3994
4022
  recommendation: apiResponse.recommendation,
3995
4023
  recommendationReasons: apiResponse.recommendationReasons,
3996
4024
  stepUpApproval: apiResponse.stepUpApproval,
@@ -4042,6 +4070,8 @@ async function verify(config, request, options) {
4042
4070
  // v2.3.10 (defect #34, round-4): anonymous responses surface correlationId
4043
4071
  // (no session row exists for unverified callers).
4044
4072
  correlationId: apiResponse.correlationId,
4073
+ // 3.12.0 (Trust Record): server-echoed attempt-chain handle.
4074
+ attemptId: apiResponse.attemptId,
4045
4075
  runtimeChallenge: apiResponse.runtimeChallenge,
4046
4076
  tokenGuidance: apiResponse.tokenGuidance,
4047
4077
  recommendation: apiResponse.recommendation,
@@ -4428,13 +4458,29 @@ var TraceLogger = class {
4428
4458
  */
4429
4459
  logEvaluation(context, decision) {
4430
4460
  if (!this.enabled) return;
4431
- this.write({
4432
- id: this.generateId(),
4433
- timestamp: /* @__PURE__ */ new Date(),
4434
- type: "evaluation",
4435
- context: redactDeep(context),
4436
- decision: redactDeep(decision)
4437
- });
4461
+ let event;
4462
+ try {
4463
+ event = {
4464
+ id: this.generateId(),
4465
+ timestamp: /* @__PURE__ */ new Date(),
4466
+ type: "evaluation",
4467
+ context: redactDeep(context),
4468
+ decision: redactDeep(decision)
4469
+ };
4470
+ } catch (err) {
4471
+ event = {
4472
+ id: this.generateId(),
4473
+ timestamp: /* @__PURE__ */ new Date(),
4474
+ type: "error",
4475
+ metadata: {
4476
+ error: `trace redaction failed: ${err instanceof Error ? err.message : String(err)}`,
4477
+ recommendation: decision.recommendation,
4478
+ purpose: context.purpose,
4479
+ action: context.action
4480
+ }
4481
+ };
4482
+ }
4483
+ this.write(event);
4438
4484
  }
4439
4485
  /**
4440
4486
  * Log a tool call the guard saw but did not govern. One line per skip
@@ -4476,17 +4522,34 @@ var TraceLogger = class {
4476
4522
  });
4477
4523
  }
4478
4524
  write(event) {
4525
+ let line;
4526
+ try {
4527
+ line = JSON.stringify(event) + "\n";
4528
+ } catch {
4529
+ return;
4530
+ }
4479
4531
  try {
4480
4532
  const filePath = this.getCurrentFilePath();
4481
- const line = JSON.stringify(event) + "\n";
4482
4533
  if (existsSync2(filePath)) {
4483
4534
  const stats = statSync(filePath);
4484
4535
  if (stats.size > MAX_FILE_SIZE) {
4485
4536
  this.rotate();
4486
4537
  }
4487
4538
  }
4488
- appendFileSync(filePath, line);
4539
+ for (let attempt = 0; attempt < 3; attempt++) {
4540
+ try {
4541
+ appendFileSync(filePath, line);
4542
+ return;
4543
+ } catch {
4544
+ }
4545
+ }
4546
+ const fallbackPath = filePath.replace(/\.jsonl$/, `-r${process.pid}.jsonl`);
4547
+ appendFileSync(fallbackPath, line);
4489
4548
  } catch {
4549
+ try {
4550
+ console.error(`[AstraSync TraceLogger] failed to persist trace line: ${line.trim()}`);
4551
+ } catch {
4552
+ }
4490
4553
  }
4491
4554
  }
4492
4555
  getCurrentFilePath() {