managed-deepagents 0.6.2-dev.8 → 0.7.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/README.md +34 -16
- package/dist/agent-auth.d.ts +167 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +520 -0
- package/dist/agent-auth.js.map +1 -0
- package/dist/channels/manifest.d.ts +4 -0
- package/dist/channels/manifest.d.ts.map +1 -1
- package/dist/channels/response-format.d.ts +1 -1
- package/dist/channels/response-format.d.ts.map +1 -1
- package/dist/channels/response-format.js +1 -1
- package/dist/channels/response-format.js.map +1 -1
- package/dist/channels/trigger/http.d.ts +8 -0
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +56 -6
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/identity-context.d.ts +47 -0
- package/dist/channels/trigger/identity-context.d.ts.map +1 -0
- package/dist/channels/trigger/identity-context.js +171 -0
- package/dist/channels/trigger/identity-context.js.map +1 -0
- package/dist/channels/trigger/types.d.ts +10 -0
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +5 -0
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/connection-authorization.d.ts +17 -0
- package/dist/connection-authorization.d.ts.map +1 -0
- package/dist/connection-authorization.js +46 -0
- package/dist/connection-authorization.js.map +1 -0
- package/dist/connections.d.ts +98 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +339 -0
- package/dist/connections.js.map +1 -0
- package/dist/connectors/mcp/index.d.ts +36 -95
- package/dist/connectors/mcp/index.d.ts.map +1 -1
- package/dist/connectors/mcp/index.js +266 -57
- package/dist/connectors/mcp/index.js.map +1 -1
- package/dist/connectors/mcp/schema.d.ts +17 -0
- package/dist/connectors/mcp/schema.d.ts.map +1 -0
- package/dist/connectors/mcp/schema.js +122 -0
- package/dist/connectors/mcp/schema.js.map +1 -0
- package/dist/connectors/mcp/types.d.ts +81 -0
- package/dist/connectors/mcp/types.d.ts.map +1 -0
- package/dist/connectors/mcp/types.js +2 -0
- package/dist/connectors/mcp/types.js.map +1 -0
- package/dist/connectors/tool-selection.d.ts +10 -19
- package/dist/connectors/tool-selection.d.ts.map +1 -1
- package/dist/connectors/tool-selection.js +33 -59
- package/dist/connectors/tool-selection.js.map +1 -1
- package/dist/credential-gate.d.ts +28 -0
- package/dist/credential-gate.d.ts.map +1 -0
- package/dist/credential-gate.js +179 -0
- package/dist/credential-gate.js.map +1 -0
- package/dist/extension.d.ts +3 -3
- package/dist/extension.js +2 -2
- package/dist/identity/index.d.ts +1 -1
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/types.d.ts +102 -5
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/index.d.ts +9 -34
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -6
- package/dist/index.js.map +1 -1
- package/dist/ingress/index.d.ts +10 -2
- package/dist/ingress/index.d.ts.map +1 -1
- package/dist/ingress/index.js +18 -9
- package/dist/ingress/index.js.map +1 -1
- package/dist/namespaces.d.ts +12 -29
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +26 -9
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/auth.d.ts +76 -5
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +114 -6
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/http.d.ts +1 -1
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +65 -5
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +164 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +13 -8
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-middleware.d.ts +2 -2
- package/dist/runtime/managed-middleware.js +6 -6
- package/dist/runtime/managed-tools.d.ts +19 -15
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +14 -13
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/types.d.ts +2 -2
- package/dist/runtime/validated-token.d.ts.map +1 -1
- package/dist/runtime/validated-token.js +23 -0
- package/dist/runtime/validated-token.js.map +1 -1
- package/package.json +8 -8
- package/dist/connectors/mcp/load.d.ts +0 -12
- package/dist/connectors/mcp/load.d.ts.map +0 -1
- package/dist/connectors/mcp/load.js +0 -122
- package/dist/connectors/mcp/load.js.map +0 -1
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { v5 as uuidv5 } from "uuid";
|
|
3
|
+
import { missingWorkspaceConnectionSlug } from "../../agent-auth.js";
|
|
3
4
|
import { extractAssistantText } from "../assistant-text.js";
|
|
4
5
|
import { logger } from "../../runtime/log.js";
|
|
5
6
|
import { observeIngressAgent, resumeIngressAgent, scheduleIngressWork, startIngressAgent, } from "../../ingress/index.js";
|
|
6
7
|
import { createTriggerClient, LANGSMITH_MDA_TRIGGER_SERVER_URL_ENV, TriggerClientError, } from "./client.js";
|
|
8
|
+
import { IdentityContextUnavailableError, InvalidIdentityContextError, principalIdFromIdentityContext, } from "./identity-context.js";
|
|
7
9
|
import { parseTriggerChannelEvent, TRIGGER_SERVICE_KEY_HEADER, } from "./types.js";
|
|
8
10
|
export { TRIGGER_SERVICE_KEY_HEADER } from "./types.js";
|
|
9
11
|
export const ASSISTANT_ID_ENV = "MDA_ASSISTANT_ID";
|
|
12
|
+
class MissingIdentityContextError extends Error {
|
|
13
|
+
name = "MissingIdentityContextError";
|
|
14
|
+
}
|
|
15
|
+
/** Every delivery requires a verified Agent Auth principal. */
|
|
16
|
+
async function resolveEventPrincipal(event, verify) {
|
|
17
|
+
const token = event.identity_context;
|
|
18
|
+
if (token == null || !token.trim()) {
|
|
19
|
+
throw new MissingIdentityContextError();
|
|
20
|
+
}
|
|
21
|
+
return await principalIdFromIdentityContext(token, verify);
|
|
22
|
+
}
|
|
10
23
|
/** Validate one Trigger message, start its run, and enqueue observation. */
|
|
11
24
|
export async function handleTriggerChannelEventRequest(request, options) {
|
|
12
25
|
if (!request.headers.get(TRIGGER_SERVICE_KEY_HEADER)?.trim()) {
|
|
13
26
|
return Response.json({ error: "unauthorized" }, { status: 401 });
|
|
14
27
|
}
|
|
28
|
+
// Trigger signs x-service-key as a platform service JWT; presence-only is
|
|
29
|
+
// still a prototype gate. identity_context below is EdDSA-verified against
|
|
30
|
+
// LangSmith JWKS so forged principals cannot ride a blank/any service key.
|
|
15
31
|
let event;
|
|
16
32
|
try {
|
|
17
33
|
const raw = await requestBody(request, options.rawBody);
|
|
@@ -21,6 +37,25 @@ export async function handleTriggerChannelEventRequest(request, options) {
|
|
|
21
37
|
logger.warn("invalid channel event");
|
|
22
38
|
return Response.json({ error: "invalid channel event" }, { status: 400 });
|
|
23
39
|
}
|
|
40
|
+
let userId;
|
|
41
|
+
try {
|
|
42
|
+
userId = await resolveEventPrincipal(event, options.identityContext);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof MissingIdentityContextError) {
|
|
46
|
+
logger.warn("missing channel identity_context");
|
|
47
|
+
return Response.json({ error: "missing channel identity_context" }, { status: 400 });
|
|
48
|
+
}
|
|
49
|
+
if (error instanceof IdentityContextUnavailableError) {
|
|
50
|
+
logger.error(`channel identity_context unavailable (${logger.safeErrorLabel(error)})`);
|
|
51
|
+
return Response.json({ error: "identity_context verification unavailable" }, { status: 503 });
|
|
52
|
+
}
|
|
53
|
+
if (error instanceof InvalidIdentityContextError) {
|
|
54
|
+
logger.warn(`invalid channel identity_context (${logger.safeErrorLabel(error)})`);
|
|
55
|
+
return Response.json({ error: "invalid channel identity_context" }, { status: 400 });
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
24
59
|
logger.info(`Channel incoming event (type=${event.type}, event_id=${logger.logIdentifier(event.event_id)}, delivery_id=${logger.logIdentifier(event.delivery_id)}, channel_id=${logger.logIdentifier(event.channel_id)})`);
|
|
25
60
|
let client = options.triggerClient;
|
|
26
61
|
if (!client) {
|
|
@@ -52,6 +87,7 @@ export async function handleTriggerChannelEventRequest(request, options) {
|
|
|
52
87
|
assistantId,
|
|
53
88
|
sourceProvider: options.sourceProvider,
|
|
54
89
|
sourceThreadKey: event.source_thread_key,
|
|
90
|
+
userId,
|
|
55
91
|
};
|
|
56
92
|
started =
|
|
57
93
|
event.type === "message"
|
|
@@ -73,6 +109,9 @@ export async function handleTriggerChannelEventRequest(request, options) {
|
|
|
73
109
|
started,
|
|
74
110
|
client,
|
|
75
111
|
observeAgent: options.observeAgent,
|
|
112
|
+
sourceProvider: options.sourceProvider,
|
|
113
|
+
sourceThreadKey: event.source_thread_key,
|
|
114
|
+
userId,
|
|
76
115
|
}), {
|
|
77
116
|
label: "Channel run observation",
|
|
78
117
|
schedule: options.schedule,
|
|
@@ -81,9 +120,9 @@ export async function handleTriggerChannelEventRequest(request, options) {
|
|
|
81
120
|
}
|
|
82
121
|
async function observeAcceptedRun(input) {
|
|
83
122
|
const { event, started, client } = input;
|
|
84
|
-
const lifecycle = (type, interrupts) => {
|
|
123
|
+
const lifecycle = (type, interrupts, message) => {
|
|
85
124
|
logger.info(`Channel outgoing event (type=${type}, delivery_id=${logger.logIdentifier(event.delivery_id)}, channel_id=${logger.logIdentifier(event.channel_id)}, run_id=${logger.logIdentifier(started.runId)})`);
|
|
86
|
-
return bestEffort(client.postRuntimeEvent(event.channel_id, runtimeEvent(type, event, started, interrupts)));
|
|
125
|
+
return bestEffort(client.postRuntimeEvent(event.channel_id, runtimeEvent(type, event, started, interrupts, message)));
|
|
87
126
|
};
|
|
88
127
|
await lifecycle("run.started");
|
|
89
128
|
let observed;
|
|
@@ -91,10 +130,13 @@ async function observeAcceptedRun(input) {
|
|
|
91
130
|
observed = await (input.observeAgent ?? observeIngressAgent)({
|
|
92
131
|
threadId: started.threadId,
|
|
93
132
|
runId: started.runId,
|
|
133
|
+
sourceProvider: input.sourceProvider,
|
|
134
|
+
sourceThreadKey: input.sourceThreadKey,
|
|
135
|
+
userId: input.userId,
|
|
94
136
|
});
|
|
95
137
|
}
|
|
96
|
-
catch {
|
|
97
|
-
await lifecycle("run.failed");
|
|
138
|
+
catch (error) {
|
|
139
|
+
await lifecycle("run.failed", undefined, missingConnectionFailureMessage(error));
|
|
98
140
|
return;
|
|
99
141
|
}
|
|
100
142
|
if (isInterruptedRun(observed)) {
|
|
@@ -113,7 +155,7 @@ async function observeAcceptedRun(input) {
|
|
|
113
155
|
logger.info(`Channel outgoing action (type=post, delivery_id=${logger.logIdentifier(event.delivery_id)}, channel_id=${logger.logIdentifier(event.channel_id)}, run_id=${logger.logIdentifier(started.runId)})`);
|
|
114
156
|
const action = await bestEffort(client.postAction(event.channel_id, {
|
|
115
157
|
type: "post",
|
|
116
|
-
action_id:
|
|
158
|
+
action_id: event.event_id,
|
|
117
159
|
address: event.address,
|
|
118
160
|
source_thread_key: event.source_thread_key,
|
|
119
161
|
message: { text },
|
|
@@ -125,7 +167,7 @@ async function observeAcceptedRun(input) {
|
|
|
125
167
|
}
|
|
126
168
|
await lifecycle("run.completed");
|
|
127
169
|
}
|
|
128
|
-
function runtimeEvent(type, event, started, interrupts) {
|
|
170
|
+
function runtimeEvent(type, event, started, interrupts, message) {
|
|
129
171
|
return {
|
|
130
172
|
id: randomUUID(),
|
|
131
173
|
type,
|
|
@@ -134,9 +176,17 @@ function runtimeEvent(type, event, started, interrupts) {
|
|
|
134
176
|
address: event.address,
|
|
135
177
|
run_thread_id: started.threadId,
|
|
136
178
|
run_id: started.runId,
|
|
179
|
+
...(message ? { message: { text: message } } : {}),
|
|
137
180
|
...(interrupts?.length ? { interrupts } : {}),
|
|
138
181
|
};
|
|
139
182
|
}
|
|
183
|
+
function missingConnectionFailureMessage(error) {
|
|
184
|
+
const slug = missingWorkspaceConnectionSlug(String(error));
|
|
185
|
+
if (slug === undefined) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
return `This agent can't respond because the \`${slug}\` connection isn't configured. An agent developer can configure it with \`mda connections create ${slug} --project <project>\`, then try again.`;
|
|
189
|
+
}
|
|
140
190
|
function triggerThreadId(sourceThreadKey) {
|
|
141
191
|
return uuidv5(sourceThreadKey, uuidv5.URL);
|
|
142
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/channels/trigger/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,oCAAoC,EACpC,kBAAkB,GAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAM3B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/channels/trigger/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { type JWTVerifyGetKey } from "jose";
|
|
11
|
+
export declare const IDENTITY_CONTEXT_TOKEN_TYP = "identity-context+jwt";
|
|
12
|
+
export declare const IDENTITY_CONTEXT_AUDIENCE = "mda";
|
|
13
|
+
export declare const IDENTITY_CONTEXT_VERSION = "1";
|
|
14
|
+
export declare const IDENTITY_CONTEXT_ALGORITHMS: readonly ["EdDSA"];
|
|
15
|
+
export declare class InvalidIdentityContextError extends Error {
|
|
16
|
+
readonly name = "InvalidIdentityContextError";
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
/** JWKS / network failure while verifying identity_context. Callers should 5xx. */
|
|
20
|
+
export declare class IdentityContextUnavailableError extends Error {
|
|
21
|
+
readonly name = "IdentityContextUnavailableError";
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
export interface IdentityContextVerifyOptions {
|
|
25
|
+
/**
|
|
26
|
+
* Override key resolution (unit tests). When set, skips the remote LangSmith
|
|
27
|
+
* JWKS fetch.
|
|
28
|
+
*/
|
|
29
|
+
getKey?: JWTVerifyGetKey;
|
|
30
|
+
/** Override expected `iss` (defaults to {@link resolveIdentityContextIssuer}). */
|
|
31
|
+
issuer?: string;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
}
|
|
34
|
+
/** LangSmith API origin used as identity-context `iss` and JWKS host. */
|
|
35
|
+
export declare function resolveIdentityContextIssuer(env?: NodeJS.ProcessEnv): string;
|
|
36
|
+
/** Public JWKS URL for Agent Auth identity-context signatures. */
|
|
37
|
+
export declare function resolveIdentityContextJwksUrl(env?: NodeJS.ProcessEnv): string;
|
|
38
|
+
/**
|
|
39
|
+
* Extract the Agent Auth principal UUID from a Trigger `identity_context` JWT.
|
|
40
|
+
*
|
|
41
|
+
* @throws {InvalidIdentityContextError} when the token is missing, malformed,
|
|
42
|
+
* or fails signature / claim checks.
|
|
43
|
+
*/
|
|
44
|
+
export declare function principalIdFromIdentityContext(token: string, options?: IdentityContextVerifyOptions): Promise<string>;
|
|
45
|
+
/** Resolve a principal id from an optional event field; `undefined` when absent. */
|
|
46
|
+
export declare function optionalPrincipalIdFromIdentityContext(token: string | null | undefined, options?: IdentityContextVerifyOptions): Promise<string | undefined>;
|
|
47
|
+
//# sourceMappingURL=identity-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-context.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/identity-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,MAAM,CAAC;AAKd,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAC/C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,2BAA2B,YAAI,OAAO,CAAU,CAAC;AAS9D,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,IAAI,iCAAiC;IAE9C,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED,mFAAmF;AACnF,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,QAAQ,CAAC,IAAI,qCAAqC;IAElD,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,kFAAkF;IAClF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,yEAAyE;AACzE,wBAAgB,4BAA4B,CAC1C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAMR;AAED,kEAAkE;AAClE,wBAAgB,6BAA6B,CAC3C,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,MAAM,CAAC,CA2FjB;AAED,oFAAoF;AACpF,wBAAsB,sCAAsC,CAC1D,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-context.js","sourceRoot":"","sources":["../../../src/channels/trigger/identity-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ declare const messageEventSchema: z.ZodObject<{
|
|
|
10
10
|
channel_id: z.ZodString;
|
|
11
11
|
source_thread_key: z.ZodString;
|
|
12
12
|
address: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
13
|
+
identity_context: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
13
14
|
type: z.ZodLiteral<"message">;
|
|
14
15
|
input: z.ZodObject<{
|
|
15
16
|
messages: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -23,6 +24,7 @@ declare const interruptResumeEventSchema: z.ZodObject<{
|
|
|
23
24
|
channel_id: z.ZodString;
|
|
24
25
|
source_thread_key: z.ZodString;
|
|
25
26
|
address: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
27
|
+
identity_context: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
26
28
|
type: z.ZodLiteral<"interrupt_resume">;
|
|
27
29
|
interaction: z.ZodObject<{
|
|
28
30
|
type: z.ZodLiteral<"interrupt_resume">;
|
|
@@ -37,6 +39,7 @@ declare const eventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
37
39
|
channel_id: z.ZodString;
|
|
38
40
|
source_thread_key: z.ZodString;
|
|
39
41
|
address: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
42
|
+
identity_context: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
40
43
|
type: z.ZodLiteral<"message">;
|
|
41
44
|
input: z.ZodObject<{
|
|
42
45
|
messages: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -49,6 +52,7 @@ declare const eventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
49
52
|
channel_id: z.ZodString;
|
|
50
53
|
source_thread_key: z.ZodString;
|
|
51
54
|
address: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
55
|
+
identity_context: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
52
56
|
type: z.ZodLiteral<"interrupt_resume">;
|
|
53
57
|
interaction: z.ZodObject<{
|
|
54
58
|
type: z.ZodLiteral<"interrupt_resume">;
|
|
@@ -93,6 +97,12 @@ export interface TriggerChannelRuntimeEventRequest {
|
|
|
93
97
|
address: TriggerChannelAddress;
|
|
94
98
|
run_thread_id: string;
|
|
95
99
|
run_id: string;
|
|
100
|
+
/**
|
|
101
|
+
* Safe, user-facing status text. Raw runtime exceptions must never be sent.
|
|
102
|
+
*/
|
|
103
|
+
message?: {
|
|
104
|
+
text: string;
|
|
105
|
+
};
|
|
96
106
|
/**
|
|
97
107
|
* Present on `run.interrupted`. The Trigger Server cannot read the
|
|
98
108
|
* deployment's threads, so pending interrupts travel on the event itself.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,0BAA0B,kBAAkB,CAAC;AAK1D,uDAAuD;AACvD,QAAA,MAAM,YAAY,wCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/channels/trigger/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,0BAA0B,kBAAkB,CAAC;AAK1D,uDAAuD;AACvD,QAAA,MAAM,YAAY,wCAAoC,CAAC;AAoBvD,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;iBAKtB,CAAC;AACH,QAAA,MAAM,0BAA0B;;;;;;;;;;;;;;iBAM9B,CAAC;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAGf,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACjE,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAC9C,OAAO,kBAAkB,CAAC,KAAK,CAAC,KAAK,CACtC,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC5E,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,KAAK,CACtD,OAAO,0BAA0B,CAClC,CAAC;AACF,6HAA6H;AAC7H,MAAM,MAAM,oBAAoB,GAC9B,kCAAkC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC9D,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAE9D,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,8BAA8B,GACtC,aAAa,GACb,eAAe,GACf,iBAAiB,GACjB,YAAY,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iCAAiC;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,8BAA8B,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAG5E"}
|
|
@@ -19,6 +19,11 @@ const channelEventBase = z.object({
|
|
|
19
19
|
channel_id: channelId,
|
|
20
20
|
source_thread_key: nonblankString,
|
|
21
21
|
address: opaqueObject,
|
|
22
|
+
/**
|
|
23
|
+
* Short-lived Agent Auth identity-context JWT. When present, ingress stamps
|
|
24
|
+
* its principal UUID as `x-mda-user-id` instead of `mda:channel`.
|
|
25
|
+
*/
|
|
26
|
+
identity_context: z.string().nullish(),
|
|
22
27
|
});
|
|
23
28
|
const messageEventSchema = channelEventBase.extend({
|
|
24
29
|
type: z.literal("message"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/channels/trigger/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,0BAA0B,GAAG,eAAe,CAAC;AAE1D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;IAC3E,OAAO,EAAE,kBAAkB;CAC5B,CAAC,CAAC;AACH,uDAAuD;AACvD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACvD,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;IACrD,OAAO,EAAE,cAAc;CACxB,CAAC,CAAC;AACL,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvB,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,cAAc;IAC1B,UAAU,EAAE,SAAS;IACrB,iBAAiB,EAAE,cAAc;IACjC,OAAO,EAAE,YAAY;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/channels/trigger/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,0BAA0B,GAAG,eAAe,CAAC;AAE1D,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;IAC3E,OAAO,EAAE,kBAAkB;CAC5B,CAAC,CAAC;AACH,uDAAuD;AACvD,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACvD,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;IACrD,OAAO,EAAE,cAAc;CACxB,CAAC,CAAC;AACL,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IACvB,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,cAAc;IAC3B,UAAU,EAAE,cAAc;IAC1B,UAAU,EAAE,SAAS;IACrB,iBAAiB,EAAE,cAAc;IACjC,OAAO,EAAE,YAAY;IACrB;;;OAGG;IACH,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;CACvC,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;KAChC,CAAC;CACH,CAAC,CAAC;AACH,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,MAAM,CAAC;IACzD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACnC,MAAM,EAAE,YAAY;KACrB,CAAC;CACH,CAAC,CAAC;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/C,kBAAkB;IAClB,0BAA0B;CAC3B,CAAC,CAAC;AAmEH,mFAAmF;AACnF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,OAAO,KAA4B,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Resolve user-owned connections or interrupt for authorization. */
|
|
2
|
+
import { type AgentAuth } from "./agent-auth.js";
|
|
3
|
+
export interface PendingCredential {
|
|
4
|
+
slug: string;
|
|
5
|
+
kind: "oauth2" | "secret";
|
|
6
|
+
connect_url?: string;
|
|
7
|
+
auth_id?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Interrupt payload when the caller has not granted one or more connections. */
|
|
10
|
+
export interface CredentialAuthorizationRequiredInterrupt {
|
|
11
|
+
type: "credential_authorization_required";
|
|
12
|
+
message: string;
|
|
13
|
+
credentials: PendingCredential[];
|
|
14
|
+
}
|
|
15
|
+
/** Return user connection material or interrupt once for every missing grant. */
|
|
16
|
+
export declare function resolveUserConnectionGrants(agentAuth: AgentAuth, slugs: readonly string[]): Promise<Map<string, string>>;
|
|
17
|
+
//# sourceMappingURL=connection-authorization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-authorization.d.ts","sourceRoot":"","sources":["../src/connection-authorization.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iFAAiF;AACjF,MAAM,WAAW,wCAAwC;IACvD,IAAI,EAAE,mCAAmC,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAQD,iFAAiF;AACjF,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAuC9B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Resolve user-owned connections or interrupt for authorization. */
|
|
2
|
+
import { interrupt } from "@langchain/langgraph";
|
|
3
|
+
import { CredentialAuthorizationRequiredError, CredentialStoreError, } from "./agent-auth.js";
|
|
4
|
+
/** Return user connection material or interrupt once for every missing grant. */
|
|
5
|
+
export async function resolveUserConnectionGrants(agentAuth, slugs) {
|
|
6
|
+
const grants = await Promise.all([...new Set(slugs)].map((slug) => readUserConnectionGrant(agentAuth, slug)));
|
|
7
|
+
const missingOAuth = grants.filter((grant) => !grant.token && grant.kind === "oauth2");
|
|
8
|
+
const missingSecret = grants.filter((grant) => !grant.token && grant.kind === "secret");
|
|
9
|
+
if (missingOAuth.length > 0 || missingSecret.length > 0) {
|
|
10
|
+
const sessions = await Promise.all(missingOAuth.map((grant) => agentAuth.startAuthorizationSession(grant.slug)));
|
|
11
|
+
const payload = {
|
|
12
|
+
type: "credential_authorization_required",
|
|
13
|
+
message: "Connect the following integrations to continue.",
|
|
14
|
+
credentials: [
|
|
15
|
+
...sessions.map((session) => ({
|
|
16
|
+
slug: session.slug,
|
|
17
|
+
kind: "oauth2",
|
|
18
|
+
connect_url: session.connectUrl,
|
|
19
|
+
auth_id: session.authId,
|
|
20
|
+
})),
|
|
21
|
+
...missingSecret.map((grant) => ({
|
|
22
|
+
slug: grant.slug,
|
|
23
|
+
kind: "secret",
|
|
24
|
+
})),
|
|
25
|
+
],
|
|
26
|
+
};
|
|
27
|
+
interrupt(payload);
|
|
28
|
+
throw new CredentialAuthorizationRequiredError([
|
|
29
|
+
...missingOAuth.map((grant) => grant.slug),
|
|
30
|
+
...missingSecret.map((grant) => grant.slug),
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
return new Map(grants.map((grant) => [grant.slug, grant.token]));
|
|
34
|
+
}
|
|
35
|
+
async function readUserConnectionGrant(agentAuth, slug) {
|
|
36
|
+
const row = await agentAuth.findWorkspaceConnection(slug);
|
|
37
|
+
if (!row) {
|
|
38
|
+
throw new CredentialStoreError(`workspace connection ${JSON.stringify(slug)} is not configured`);
|
|
39
|
+
}
|
|
40
|
+
const kind = row.kind === "secret" ? "secret" : "oauth2";
|
|
41
|
+
const token = kind === "secret"
|
|
42
|
+
? await agentAuth.readUserSecretForConnection(row)
|
|
43
|
+
: await agentAuth.readUserAccessTokenForConnection(row);
|
|
44
|
+
return { slug, kind, token };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=connection-authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-authorization.js","sourceRoot":"","sources":["../src/connection-authorization.ts"],"names":[],"mappings":"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"}
|