managed-deepagents 0.6.2-dev.36 → 0.6.2-dev.37
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/README.md +1 -3
- package/dist/agent-auth.d.ts +9 -21
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +46 -79
- package/dist/agent-auth.js.map +1 -1
- package/dist/channels/trigger/http.d.ts +0 -8
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +0 -41
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +0 -4
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +0 -5
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/connections.d.ts +1 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +6 -3
- package/dist/connections.js.map +1 -1
- package/dist/credential-gate.js +2 -2
- package/dist/credential-gate.js.map +1 -1
- package/dist/ingress/index.d.ts +2 -10
- package/dist/ingress/index.d.ts.map +1 -1
- package/dist/ingress/index.js +9 -17
- package/dist/ingress/index.js.map +1 -1
- package/dist/runtime/auth.d.ts +1 -18
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +8 -48
- package/dist/runtime/auth.js.map +1 -1
- package/package.json +7 -7
- package/dist/channels/trigger/identity-context.d.ts +0 -47
- package/dist/channels/trigger/identity-context.d.ts.map +0 -1
- package/dist/channels/trigger/identity-context.js +0 -171
- package/dist/channels/trigger/identity-context.js.map +0 -1
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Verify Trigger Server `identity_context` JWTs into Agent Auth principal ids.
|
|
3
|
-
*
|
|
4
|
-
* Agent Auth signs these with the LangSmith EdDSA JWKS published at
|
|
5
|
-
* `{LANGSMITH_ENDPOINT}/.well-known/jwks.json`. MDA verifies the signature
|
|
6
|
-
* (and typ/version/aud/iss/exp/principal UUID) before stamping `x-mda-user-id`.
|
|
7
|
-
* Delivery still requires Trigger's `x-service-key` header; signature verify is
|
|
8
|
-
* what stops a forged principal when that gate is weak.
|
|
9
|
-
*/
|
|
10
|
-
import { createRemoteJWKSet, decodeProtectedHeader, jwtVerify, } from "jose";
|
|
11
|
-
import { JWKS_HTTP_TIMEOUT_MS } from "../../runtime/http.js";
|
|
12
|
-
import { normalizeUuid } from "./uuid.js";
|
|
13
|
-
export const IDENTITY_CONTEXT_TOKEN_TYP = "identity-context+jwt";
|
|
14
|
-
export const IDENTITY_CONTEXT_AUDIENCE = "mda";
|
|
15
|
-
export const IDENTITY_CONTEXT_VERSION = "1";
|
|
16
|
-
export const IDENTITY_CONTEXT_ALGORITHMS = ["EdDSA"];
|
|
17
|
-
const DEFAULT_LANGSMITH_ENDPOINT = "https://api.smith.langchain.com";
|
|
18
|
-
/** Remote JWKS key sets, cached per URI for the process lifetime. */
|
|
19
|
-
const jwksCache = new Map();
|
|
20
|
-
export class InvalidIdentityContextError extends Error {
|
|
21
|
-
name = "InvalidIdentityContextError";
|
|
22
|
-
constructor(message) {
|
|
23
|
-
super(message);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/** JWKS / network failure while verifying identity_context. Callers should 5xx. */
|
|
27
|
-
export class IdentityContextUnavailableError extends Error {
|
|
28
|
-
name = "IdentityContextUnavailableError";
|
|
29
|
-
constructor(message) {
|
|
30
|
-
super(message);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
/** LangSmith API origin used as identity-context `iss` and JWKS host. */
|
|
34
|
-
export function resolveIdentityContextIssuer(env = process.env) {
|
|
35
|
-
const raw = env.LANGSMITH_ENDPOINT?.trim() ||
|
|
36
|
-
env.LANGCHAIN_ENDPOINT?.trim() ||
|
|
37
|
-
DEFAULT_LANGSMITH_ENDPOINT;
|
|
38
|
-
return raw.replace(/\/+$/, "");
|
|
39
|
-
}
|
|
40
|
-
/** Public JWKS URL for Agent Auth identity-context signatures. */
|
|
41
|
-
export function resolveIdentityContextJwksUrl(env = process.env) {
|
|
42
|
-
return `${resolveIdentityContextIssuer(env)}/.well-known/jwks.json`;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Extract the Agent Auth principal UUID from a Trigger `identity_context` JWT.
|
|
46
|
-
*
|
|
47
|
-
* @throws {InvalidIdentityContextError} when the token is missing, malformed,
|
|
48
|
-
* or fails signature / claim checks.
|
|
49
|
-
*/
|
|
50
|
-
export async function principalIdFromIdentityContext(token, options = {}) {
|
|
51
|
-
const value = token.trim();
|
|
52
|
-
if (!value) {
|
|
53
|
-
throw new InvalidIdentityContextError("identity_context is blank");
|
|
54
|
-
}
|
|
55
|
-
let header;
|
|
56
|
-
try {
|
|
57
|
-
header = decodeProtectedHeader(value);
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
throw new InvalidIdentityContextError("identity_context is not a JWT");
|
|
61
|
-
}
|
|
62
|
-
if (header.typ !== IDENTITY_CONTEXT_TOKEN_TYP) {
|
|
63
|
-
throw new InvalidIdentityContextError(`identity_context typ must be ${IDENTITY_CONTEXT_TOKEN_TYP}`);
|
|
64
|
-
}
|
|
65
|
-
if (header.alg !== "EdDSA") {
|
|
66
|
-
throw new InvalidIdentityContextError("identity_context alg must be EdDSA");
|
|
67
|
-
}
|
|
68
|
-
const env = options.env ?? process.env;
|
|
69
|
-
const issuer = options.issuer ?? resolveIdentityContextIssuer(env);
|
|
70
|
-
const getKey = options.getKey ?? remoteJwks(env);
|
|
71
|
-
let claims;
|
|
72
|
-
try {
|
|
73
|
-
const verified = await jwtVerify(value, getKey, {
|
|
74
|
-
issuer,
|
|
75
|
-
audience: IDENTITY_CONTEXT_AUDIENCE,
|
|
76
|
-
algorithms: [...IDENTITY_CONTEXT_ALGORITHMS],
|
|
77
|
-
typ: IDENTITY_CONTEXT_TOKEN_TYP,
|
|
78
|
-
requiredClaims: ["exp"],
|
|
79
|
-
});
|
|
80
|
-
claims = verified.payload;
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
if (error instanceof InvalidIdentityContextError ||
|
|
84
|
-
error instanceof IdentityContextUnavailableError) {
|
|
85
|
-
throw error;
|
|
86
|
-
}
|
|
87
|
-
if (isIdentityContextUnavailable(error)) {
|
|
88
|
-
throw new IdentityContextUnavailableError("identity_context JWKS verification is unavailable");
|
|
89
|
-
}
|
|
90
|
-
const detail = error instanceof Error ? error.message : String(error);
|
|
91
|
-
const code = error && typeof error === "object" && "code" in error
|
|
92
|
-
? String(error.code)
|
|
93
|
-
: "";
|
|
94
|
-
if (code === "ERR_JWT_EXPIRED" || /expir|"exp"|claim.*exp/i.test(detail)) {
|
|
95
|
-
throw new InvalidIdentityContextError("identity_context is expired");
|
|
96
|
-
}
|
|
97
|
-
if (code === "ERR_JWT_CLAIM_VALIDATION_FAILED" &&
|
|
98
|
-
/required.*exp|"exp"/i.test(detail)) {
|
|
99
|
-
throw new InvalidIdentityContextError("identity_context is missing exp");
|
|
100
|
-
}
|
|
101
|
-
throw new InvalidIdentityContextError("identity_context signature verification failed");
|
|
102
|
-
}
|
|
103
|
-
if (typeof claims.exp !== "number") {
|
|
104
|
-
throw new InvalidIdentityContextError("identity_context is missing exp");
|
|
105
|
-
}
|
|
106
|
-
if (claims.version !== IDENTITY_CONTEXT_VERSION) {
|
|
107
|
-
throw new InvalidIdentityContextError(`identity_context version must be ${IDENTITY_CONTEXT_VERSION}`);
|
|
108
|
-
}
|
|
109
|
-
const fromPrincipal = principalIdClaim(claims.principal);
|
|
110
|
-
const fromSubject = typeof claims.sub === "string" ? normalizeUuid(claims.sub) : undefined;
|
|
111
|
-
if (fromPrincipal && fromSubject && fromPrincipal !== fromSubject) {
|
|
112
|
-
throw new InvalidIdentityContextError("identity_context principal.id and sub disagree");
|
|
113
|
-
}
|
|
114
|
-
const principalId = fromPrincipal ?? fromSubject;
|
|
115
|
-
if (!principalId) {
|
|
116
|
-
throw new InvalidIdentityContextError("identity_context is missing a principal UUID");
|
|
117
|
-
}
|
|
118
|
-
return principalId;
|
|
119
|
-
}
|
|
120
|
-
/** Resolve a principal id from an optional event field; `undefined` when absent. */
|
|
121
|
-
export async function optionalPrincipalIdFromIdentityContext(token, options = {}) {
|
|
122
|
-
if (token == null) {
|
|
123
|
-
return undefined;
|
|
124
|
-
}
|
|
125
|
-
if (typeof token !== "string") {
|
|
126
|
-
throw new InvalidIdentityContextError("identity_context must be a string");
|
|
127
|
-
}
|
|
128
|
-
if (!token.trim()) {
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
|
-
return await principalIdFromIdentityContext(token, options);
|
|
132
|
-
}
|
|
133
|
-
function isIdentityContextUnavailable(error) {
|
|
134
|
-
if (error instanceof TypeError) {
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
const code = error && typeof error === "object" && "code" in error
|
|
138
|
-
? String(error.code)
|
|
139
|
-
: "";
|
|
140
|
-
if (code === "ERR_JWKS_TIMEOUT" || code === "ABORT_ERR") {
|
|
141
|
-
return true;
|
|
142
|
-
}
|
|
143
|
-
const name = error && typeof error === "object" && "name" in error
|
|
144
|
-
? String(error.name)
|
|
145
|
-
: "";
|
|
146
|
-
if (name === "TimeoutError" || name === "JWKSTimeout") {
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
if (error instanceof Error) {
|
|
150
|
-
return /fetch failed|ECONNREFUSED|ENOTFOUND|network|timed out/i.test(error.message);
|
|
151
|
-
}
|
|
152
|
-
return false;
|
|
153
|
-
}
|
|
154
|
-
function remoteJwks(env) {
|
|
155
|
-
const uri = resolveIdentityContextJwksUrl(env);
|
|
156
|
-
let keySet = jwksCache.get(uri);
|
|
157
|
-
if (!keySet) {
|
|
158
|
-
keySet = createRemoteJWKSet(new URL(uri), {
|
|
159
|
-
timeoutDuration: JWKS_HTTP_TIMEOUT_MS,
|
|
160
|
-
});
|
|
161
|
-
jwksCache.set(uri, keySet);
|
|
162
|
-
}
|
|
163
|
-
return keySet;
|
|
164
|
-
}
|
|
165
|
-
function principalIdClaim(value) {
|
|
166
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
167
|
-
return undefined;
|
|
168
|
-
}
|
|
169
|
-
return normalizeUuid(value.id);
|
|
170
|
-
}
|
|
171
|
-
//# sourceMappingURL=identity-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"identity-context.js","sourceRoot":"","sources":["../../../src/channels/trigger/identity-context.ts"],"names":[],"mappings":"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"}
|