@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.
- package/dist/adapter-interface/interface.d.mts +2 -2
- package/dist/adapter-interface/interface.d.ts +2 -2
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +22 -3
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +22 -3
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/mcp.d.mts +1 -1
- package/dist/adapters/mcp.d.ts +1 -1
- package/dist/adapters/mcp.js +22 -3
- package/dist/adapters/mcp.js.map +1 -1
- package/dist/adapters/mcp.mjs +22 -3
- package/dist/adapters/mcp.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +2 -2
- package/dist/adapters/nextjs.d.ts +2 -2
- package/dist/adapters/nextjs.js +22 -3
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +22 -3
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +2 -2
- package/dist/adapters/sdk.d.ts +2 -2
- package/dist/adapters/sdk.js +22 -3
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +22 -3
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +2 -2
- package/dist/agent/index.d.ts +2 -2
- package/dist/bin/astrasync-claude-hook.js +84 -21
- package/dist/bin/astrasync-codex-hook.js +84 -21
- package/dist/bin/astrasync-guard.js +84 -21
- package/dist/bin/astrasync.js +85 -21
- package/dist/browser/background.js +84 -21
- package/dist/browser/background.js.map +1 -1
- package/dist/browser/background.mjs +84 -21
- package/dist/browser/background.mjs.map +1 -1
- package/dist/browser/browser-adapter.d.mts +2 -2
- package/dist/browser/browser-adapter.d.ts +2 -2
- package/dist/claude-code/claude-code-adapter.d.mts +2 -2
- package/dist/claude-code/claude-code-adapter.d.ts +2 -2
- package/dist/cli/index.d.mts +2 -2
- package/dist/cli/index.d.ts +2 -2
- package/dist/codex/index.d.mts +2 -2
- package/dist/codex/index.d.ts +2 -2
- package/dist/codex/index.js +84 -21
- package/dist/codex/index.js.map +1 -1
- package/dist/codex/index.mjs +84 -21
- package/dist/codex/index.mjs.map +1 -1
- package/dist/cursor/cursor-adapter.d.mts +2 -2
- package/dist/cursor/cursor-adapter.d.ts +2 -2
- package/dist/cursor/extension.d.mts +2 -2
- package/dist/cursor/extension.d.ts +2 -2
- package/dist/cursor/extension.js +84 -21
- package/dist/cursor/extension.js.map +1 -1
- package/dist/cursor/extension.mjs +84 -21
- package/dist/cursor/extension.mjs.map +1 -1
- package/dist/edge-config.d.mts +1 -1
- package/dist/edge-config.d.ts +1 -1
- package/dist/{express-DCXa1oqj.d.mts → express-B39o89gf.d.mts} +1 -1
- package/dist/{express-ClNtDhhc.d.ts → express-BuxKNO_q.d.ts} +1 -1
- package/dist/gateway/gateway.d.mts +2 -2
- package/dist/gateway/gateway.d.ts +2 -2
- package/dist/gateway/gateway.js +84 -21
- package/dist/gateway/gateway.js.map +1 -1
- package/dist/gateway/gateway.mjs +84 -21
- package/dist/gateway/gateway.mjs.map +1 -1
- package/dist/git-trigger/git-hooks.d.mts +2 -2
- package/dist/git-trigger/git-hooks.d.ts +2 -2
- package/dist/{index-CfHurO1P.d.ts → index-BG62SXso.d.ts} +1 -1
- package/dist/{index-D2ztkumS.d.ts → index-CLHdqs2M.d.ts} +1 -1
- package/dist/{index-Dr_XiN65.d.mts → index-CqydB4ks.d.mts} +1 -1
- package/dist/{index-BrNKDmiR.d.mts → index-DME3w3lf.d.mts} +1 -1
- package/dist/index.d.mts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +42 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41 -3
- package/dist/index.mjs.map +1 -1
- package/dist/local-evaluator/evaluator.d.mts +11 -2
- package/dist/local-evaluator/evaluator.d.ts +11 -2
- package/dist/local-evaluator/evaluator.js +20 -9
- package/dist/local-evaluator/evaluator.js.map +1 -1
- package/dist/local-evaluator/evaluator.mjs +20 -9
- package/dist/local-evaluator/evaluator.mjs.map +1 -1
- package/dist/{nextjs-DcQIk6Zj.d.mts → nextjs-D74W7wt-.d.mts} +1 -1
- package/dist/{nextjs-CEBVBsdi.d.ts → nextjs-Ddlw_J1J.d.ts} +1 -1
- package/dist/{sdk-CZkbSOeO.d.mts → sdk-Bn6bj7kt.d.mts} +1 -1
- package/dist/{sdk-H0JCLW2y.d.ts → sdk-CT7gdkfR.d.ts} +1 -1
- package/dist/transport/index.d.mts +2 -2
- package/dist/transport/index.d.ts +2 -2
- package/dist/{types-sy3tq8lp.d.mts → types-BntuzEEn.d.mts} +103 -1
- package/dist/{types-BV6abBnF.d.mts → types-DHu7m9HI.d.ts} +7 -2
- package/dist/{types-C23_uaY8.d.ts → types-Djw4GLtz.d.mts} +7 -2
- package/dist/{types-9tns4wyl.d.ts → types-SDu4Llbe.d.ts} +103 -1
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/verify.d.mts +13 -2
- package/dist/verify.d.ts +13 -2
- package/dist/verify.js +42 -3
- package/dist/verify.js.map +1 -1
- package/dist/verify.mjs +41 -3
- package/dist/verify.mjs.map +1 -1
- package/package.json +1 -1
package/dist/gateway/gateway.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
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
|
-
|
|
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() {
|