managed-deepagents 0.0.3-dev.25 → 0.0.3-dev.29
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/identity.d.ts +273 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +358 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/auth.d.ts +44 -0
- package/dist/runtime/auth.d.ts.map +1 -0
- package/dist/runtime/auth.js +168 -0
- package/dist/runtime/auth.js.map +1 -0
- package/dist/runtime/credentials.d.ts +50 -32
- package/dist/runtime/credentials.d.ts.map +1 -1
- package/dist/runtime/credentials.js +174 -57
- package/dist/runtime/credentials.js.map +1 -1
- package/dist/runtime/identity-http.d.ts +8 -0
- package/dist/runtime/identity-http.d.ts.map +1 -0
- package/dist/runtime/identity-http.js +23 -0
- package/dist/runtime/identity-http.js.map +1 -0
- package/dist/runtime/identity-runtime.d.ts +54 -0
- package/dist/runtime/identity-runtime.d.ts.map +1 -0
- package/dist/runtime/identity-runtime.js +151 -0
- package/dist/runtime/identity-runtime.js.map +1 -0
- package/dist/runtime/index.d.ts +11 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +90 -69
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-middleware.d.ts +25 -0
- package/dist/runtime/managed-middleware.d.ts.map +1 -0
- package/dist/runtime/managed-middleware.js +76 -0
- package/dist/runtime/managed-middleware.js.map +1 -0
- package/dist/runtime/managed-tools.d.ts +61 -0
- package/dist/runtime/managed-tools.d.ts.map +1 -0
- package/dist/runtime/managed-tools.js +102 -0
- package/dist/runtime/managed-tools.js.map +1 -0
- package/dist/runtime/sandbox-manager.d.ts +3 -21
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +41 -125
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/setup-script.d.ts +2 -4
- package/dist/runtime/setup-script.d.ts.map +1 -1
- package/dist/runtime/setup-script.js +2 -4
- package/dist/runtime/setup-script.js.map +1 -1
- package/dist/runtime/types.d.ts +21 -5
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/validated-token.d.ts +25 -0
- package/dist/runtime/validated-token.d.ts.map +1 -0
- package/dist/runtime/validated-token.js +260 -0
- package/dist/runtime/validated-token.js.map +1 -0
- package/dist/sandbox.d.ts +18 -18
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +37 -9
- package/dist/sandbox.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -9
- package/dist/runtime/dev-notice.d.ts +0 -7
- package/dist/runtime/dev-notice.d.ts.map +0 -1
- package/dist/runtime/dev-notice.js +0 -27
- package/dist/runtime/dev-notice.js.map +0 -1
- package/dist/runtime/local-dev-sandbox.d.ts +0 -13
- package/dist/runtime/local-dev-sandbox.d.ts.map +0 -1
- package/dist/runtime/local-dev-sandbox.js +0 -39
- package/dist/runtime/local-dev-sandbox.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-middleware.js","sourceRoot":"","sources":["../../src/runtime/managed-middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ToolRuntime } from "@langchain/core/tools";
|
|
2
|
+
import type { IdentityConfig, RuntimeIdentity } from "../identity.js";
|
|
3
|
+
import { type CredentialsProvider } from "./credentials.js";
|
|
4
|
+
import type { RuntimeConfigLike } from "./identity-runtime.js";
|
|
5
|
+
export type { RuntimeConfigLike } from "./identity-runtime.js";
|
|
6
|
+
/**
|
|
7
|
+
* A LangChain/LangGraph tool from MDA's perspective: the only surface the runtime
|
|
8
|
+
* seam touches is `invoke(input, runtime)`. Kept structural so the wrapper works
|
|
9
|
+
* across `DynamicStructuredTool`, MCP tools, and any other tool shape.
|
|
10
|
+
*/
|
|
11
|
+
export interface InvokableTool {
|
|
12
|
+
invoke(input: unknown, runtime?: RuntimeConfigLike): unknown;
|
|
13
|
+
}
|
|
14
|
+
/** The managed primitives MDA layers onto the tool runtime. */
|
|
15
|
+
export interface ManagedRuntimeExtras {
|
|
16
|
+
identity?: RuntimeIdentity;
|
|
17
|
+
/**
|
|
18
|
+
* Per-run credential minting for custom mode (`scoping.credentials: "custom"`).
|
|
19
|
+
* Absent in managed/`none` modes. Call `runtime.credentials.for(target)` and
|
|
20
|
+
* attach the returned headers to the downstream request.
|
|
21
|
+
*/
|
|
22
|
+
credentials?: CredentialsProvider;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The runtime surface managed Deep Agent tools receive: LangGraph's
|
|
26
|
+
* {@link ToolRuntime} plus MDA-managed primitives such as `identity`.
|
|
27
|
+
*
|
|
28
|
+
* Annotate the second parameter of a `tool(...)` handler when you need the
|
|
29
|
+
* frozen identity envelope for the current run.
|
|
30
|
+
*/
|
|
31
|
+
export interface ManagedDeepAgentRuntime<TState = unknown, TContext = unknown> extends ToolRuntime<TState, TContext>, ManagedRuntimeExtras {
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Derive the managed runtime primitives for a run from its config. Identity is
|
|
35
|
+
* built only from the trusted `configurable.langgraph_auth_user` the custom-auth
|
|
36
|
+
* handler produced — the field LangGraph propagates to every node and tool.
|
|
37
|
+
*/
|
|
38
|
+
export declare function managedRuntimeExtras(runtime: RuntimeConfigLike | undefined, cfg?: IdentityConfig): ManagedRuntimeExtras;
|
|
39
|
+
/**
|
|
40
|
+
* The fields MDA overlays onto the runtime a tool/middleware hook receives:
|
|
41
|
+
* the frozen `identity` (when an actor resolved) and a `configurable` with the
|
|
42
|
+
* reserved identity keys stripped (§8) so downstream code can't read a
|
|
43
|
+
* client-spoofed `actor_id`/`tenant_id`. Returns an empty object when there is
|
|
44
|
+
* nothing to change, so the original runtime passes through untouched.
|
|
45
|
+
*/
|
|
46
|
+
export declare function managedRuntimeOverrides(runtime: RuntimeConfigLike | undefined, cfg?: IdentityConfig): ManagedRuntimeExtras & {
|
|
47
|
+
configurable?: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Wrap a tool so its runtime carries the managed primitives (`runtime.identity`,
|
|
51
|
+
* …) without changing its name, schema, or class.
|
|
52
|
+
*
|
|
53
|
+
* Augments `invoke` (for LangGraph's `ToolNode`) and patches the tool's internal
|
|
54
|
+
* `func`/`coroutine` so identity reaches the authored handler even when LangChain
|
|
55
|
+
* rewrites the runtime into a RunnableConfig before calling the tool function.
|
|
56
|
+
* Every other property/method passes through untouched.
|
|
57
|
+
*/
|
|
58
|
+
export declare function withManagedRuntime<T extends InvokableTool>(managedTool: T, cfg?: IdentityConfig): T;
|
|
59
|
+
/** Wrap every tool in a list with {@link withManagedRuntime}. */
|
|
60
|
+
export declare function wrapToolsWithManagedRuntime<T extends InvokableTool>(tools: readonly T[], cfg?: IdentityConfig): T[];
|
|
61
|
+
//# sourceMappingURL=managed-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-tools.d.ts","sourceRoot":"","sources":["../../src/runtime/managed-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EACL,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAC;AAM1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC;CAC9D;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB,CAAC,MAAM,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,CAC3E,SAAQ,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,oBAAoB;CAAG;AAEhE;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,GAAG,CAAC,EAAE,cAAc,GACnB,oBAAoB,CAatB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,GAAG,CAAC,EAAE,cAAc,GACnB,oBAAoB,GAAG;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CA8BnE;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,aAAa,EACxD,WAAW,EAAE,CAAC,EACd,GAAG,CAAC,EAAE,cAAc,GACnB,CAAC,CAoCH;AAED,iEAAiE;AACjE,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,aAAa,EACjE,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,GAAG,CAAC,EAAE,cAAc,GACnB,CAAC,EAAE,CAEL"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { createCredentialsProvider, } from "./credentials.js";
|
|
2
|
+
import { buildRuntimeIdentity, resolveRuntimeConfigurable, sanitizeConfigurable, } from "./identity-runtime.js";
|
|
3
|
+
/**
|
|
4
|
+
* Derive the managed runtime primitives for a run from its config. Identity is
|
|
5
|
+
* built only from the trusted `configurable.langgraph_auth_user` the custom-auth
|
|
6
|
+
* handler produced — the field LangGraph propagates to every node and tool.
|
|
7
|
+
*/
|
|
8
|
+
export function managedRuntimeExtras(runtime, cfg) {
|
|
9
|
+
const identity = buildRuntimeIdentity(resolveRuntimeConfigurable(runtime));
|
|
10
|
+
const extras = {};
|
|
11
|
+
if (identity) {
|
|
12
|
+
extras.identity = identity;
|
|
13
|
+
}
|
|
14
|
+
if (cfg) {
|
|
15
|
+
const credentials = createCredentialsProvider(cfg, identity);
|
|
16
|
+
if (credentials) {
|
|
17
|
+
extras.credentials = credentials;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return extras;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The fields MDA overlays onto the runtime a tool/middleware hook receives:
|
|
24
|
+
* the frozen `identity` (when an actor resolved) and a `configurable` with the
|
|
25
|
+
* reserved identity keys stripped (§8) so downstream code can't read a
|
|
26
|
+
* client-spoofed `actor_id`/`tenant_id`. Returns an empty object when there is
|
|
27
|
+
* nothing to change, so the original runtime passes through untouched.
|
|
28
|
+
*/
|
|
29
|
+
export function managedRuntimeOverrides(runtime, cfg) {
|
|
30
|
+
const overrides = {};
|
|
31
|
+
const configurable = resolveRuntimeConfigurable(runtime);
|
|
32
|
+
const identity = buildRuntimeIdentity(configurable);
|
|
33
|
+
if (identity) {
|
|
34
|
+
overrides.identity = identity;
|
|
35
|
+
}
|
|
36
|
+
if (cfg) {
|
|
37
|
+
const credentials = createCredentialsProvider(cfg, identity);
|
|
38
|
+
if (credentials) {
|
|
39
|
+
overrides.credentials = credentials;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (configurable) {
|
|
43
|
+
const sanitized = sanitizeConfigurable(configurable);
|
|
44
|
+
if (Object.keys(sanitized).length !== Object.keys(configurable).length) {
|
|
45
|
+
if (runtime?.configurable !== undefined) {
|
|
46
|
+
overrides.configurable = sanitized;
|
|
47
|
+
}
|
|
48
|
+
else if (runtime?.config) {
|
|
49
|
+
overrides.config = {
|
|
50
|
+
...runtime.config,
|
|
51
|
+
configurable: sanitized,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return overrides;
|
|
57
|
+
}
|
|
58
|
+
function augmentToolConfig(config, cfg) {
|
|
59
|
+
const overrides = managedRuntimeOverrides(config, cfg);
|
|
60
|
+
return Object.keys(overrides).length > 0
|
|
61
|
+
? { ...config, ...overrides }
|
|
62
|
+
: config;
|
|
63
|
+
}
|
|
64
|
+
function wrapToolCallable(original, cfg, receiver) {
|
|
65
|
+
return (input, runManager, config) => original.call(receiver, input, runManager, augmentToolConfig(config, cfg));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Wrap a tool so its runtime carries the managed primitives (`runtime.identity`,
|
|
69
|
+
* …) without changing its name, schema, or class.
|
|
70
|
+
*
|
|
71
|
+
* Augments `invoke` (for LangGraph's `ToolNode`) and patches the tool's internal
|
|
72
|
+
* `func`/`coroutine` so identity reaches the authored handler even when LangChain
|
|
73
|
+
* rewrites the runtime into a RunnableConfig before calling the tool function.
|
|
74
|
+
* Every other property/method passes through untouched.
|
|
75
|
+
*/
|
|
76
|
+
export function withManagedRuntime(managedTool, cfg) {
|
|
77
|
+
const patchable = managedTool;
|
|
78
|
+
if (typeof patchable.func === "function") {
|
|
79
|
+
patchable.func = wrapToolCallable(patchable.func.bind(managedTool), cfg, managedTool);
|
|
80
|
+
}
|
|
81
|
+
if (typeof patchable.coroutine === "function") {
|
|
82
|
+
patchable.coroutine = wrapToolCallable(patchable.coroutine.bind(managedTool), cfg, managedTool);
|
|
83
|
+
}
|
|
84
|
+
return new Proxy(managedTool, {
|
|
85
|
+
get(target, property, receiver) {
|
|
86
|
+
if (property === "invoke") {
|
|
87
|
+
return (input, runtime) => {
|
|
88
|
+
const overrides = managedRuntimeOverrides(runtime, cfg);
|
|
89
|
+
return target.invoke(input, Object.keys(overrides).length > 0
|
|
90
|
+
? { ...runtime, ...overrides }
|
|
91
|
+
: runtime);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return Reflect.get(target, property, receiver);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** Wrap every tool in a list with {@link withManagedRuntime}. */
|
|
99
|
+
export function wrapToolsWithManagedRuntime(tools, cfg) {
|
|
100
|
+
return tools.map((managedTool) => withManagedRuntime(managedTool, cfg));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=managed-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-tools.js","sourceRoot":"","sources":["../../src/runtime/managed-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,33 +8,15 @@ type LangSmithSandboxClientLoader = () => Promise<{
|
|
|
8
8
|
};
|
|
9
9
|
}>;
|
|
10
10
|
/**
|
|
11
|
-
* Resolve (and cache) the scoped sandbox backend for this run,
|
|
12
|
-
* with `setup.sh` the first time it is created.
|
|
11
|
+
* Resolve (and cache) the scoped LangSmith sandbox backend for this run,
|
|
12
|
+
* provisioning it with `setup.sh` the first time it is created.
|
|
13
13
|
*/
|
|
14
14
|
export declare function resolveManagedSandbox(sandbox: SandboxDefinition, setupScript: string | undefined, config: ManagedRunConfig | undefined): Promise<ManagedSandboxBackend>;
|
|
15
|
-
/**
|
|
16
|
-
* Derive the reuse key from the run. Without runtime identity, sandboxes are
|
|
17
|
-
* keyed by thread; with identity, by the configured tenant/actor scope.
|
|
18
|
-
*/
|
|
15
|
+
/** Derive the process-level reuse key from the configured sandbox scope. */
|
|
19
16
|
export declare function sandboxScopeKey(sandbox: SandboxDefinition, config: ManagedRunConfig | undefined): string;
|
|
20
17
|
/** Clear the process-level sandbox cache. Test-only. */
|
|
21
18
|
export declare function clearManagedSandboxCacheForTests(): void;
|
|
22
19
|
/** Override the LangSmith SDK loader. Test-only. */
|
|
23
20
|
export declare function setLangSmithSandboxClientLoaderForTests(loader?: LangSmithSandboxClientLoader): void;
|
|
24
|
-
/**
|
|
25
|
-
* Eagerly resolve the `mda dev` sandbox at startup so the developer sees the
|
|
26
|
-
* definitive decision — local vs. the configured provider, and the temp dir
|
|
27
|
-
* path when local — right when the dev server boots, not on the first run.
|
|
28
|
-
*
|
|
29
|
-
* Sandboxes are otherwise created lazily (on first run), so with `--browser`
|
|
30
|
-
* off nothing would print until the agent is invoked. The generated entry
|
|
31
|
-
* calls this at module load (graph registration); because dev shares one
|
|
32
|
-
* sandbox ({@link DEV_SANDBOX_SCOPE_KEY}), the first real run reuses what is
|
|
33
|
-
* created here rather than provisioning a second sandbox. The authoritative
|
|
34
|
-
* "created" log (with the temp dir) is emitted by {@link createDevSandbox}.
|
|
35
|
-
*
|
|
36
|
-
* No-op outside `mda dev`, so the generated entry can always call it.
|
|
37
|
-
*/
|
|
38
|
-
export declare function announceSandboxPlan(sandbox: SandboxDefinition, setupScript?: string): Promise<void>;
|
|
39
21
|
export {};
|
|
40
22
|
//# sourceMappingURL=sandbox-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAS1E,KAAK,4BAA4B,GAAG,MAAM,OAAO,CAAC;IAChD,aAAa,EAAE,KAAK,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK;QACpD,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACpE,CAAC;CACH,CAAC,CAAC;AAeH;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAYhC;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,MAAM,CAMR;AAED,wDAAwD;AACxD,wBAAgB,gCAAgC,IAAI,IAAI,CAEvD;AAED,oDAAoD;AACpD,wBAAgB,uCAAuC,CACrD,MAAM,CAAC,EAAE,4BAA4B,GACpC,IAAI,CAEN"}
|
|
@@ -1,40 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { logDevSandboxNoticeOnce } from "./dev-notice.js";
|
|
3
|
-
import { createLocalDevSandbox } from "./local-dev-sandbox.js";
|
|
4
|
-
import { runSetupScript, runSetupScriptInline } from "./setup-script.js";
|
|
1
|
+
import { runSetupScript } from "./setup-script.js";
|
|
5
2
|
/**
|
|
6
3
|
* Created sandboxes, keyed by scope, reused for the lifetime of this runtime
|
|
7
4
|
* process. Storing the in-flight promise dedupes concurrent runs and guarantees
|
|
8
5
|
* `setup.sh` is executed only once per newly created sandbox.
|
|
9
6
|
*/
|
|
10
7
|
const managedSandboxes = new Map();
|
|
11
|
-
/**
|
|
12
|
-
* Cache key for the single, process-wide sandbox used under `mda dev`.
|
|
13
|
-
*
|
|
14
|
-
* Deploys key sandboxes per scope (thread/tenant/actor) for isolation. Dev is a
|
|
15
|
-
* single developer iterating locally, so it shares one sandbox across every
|
|
16
|
-
* thread: that lets `announceSandboxPlan` create it eagerly at startup (to
|
|
17
|
-
* report local-vs-remote and the temp dir up front) and have the first real run
|
|
18
|
-
* reuse it instead of provisioning a second one.
|
|
19
|
-
*/
|
|
20
|
-
const DEV_SANDBOX_SCOPE_KEY = "__mda_dev__";
|
|
21
8
|
const defaultLangSmithSandboxClientLoader = async () => {
|
|
22
9
|
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
23
10
|
return (await dynamicImport("langsmith/sandbox"));
|
|
24
11
|
};
|
|
25
12
|
let langSmithSandboxClientLoader = defaultLangSmithSandboxClientLoader;
|
|
26
13
|
/**
|
|
27
|
-
* Resolve (and cache) the scoped sandbox backend for this run,
|
|
28
|
-
* with `setup.sh` the first time it is created.
|
|
14
|
+
* Resolve (and cache) the scoped LangSmith sandbox backend for this run,
|
|
15
|
+
* provisioning it with `setup.sh` the first time it is created.
|
|
29
16
|
*/
|
|
30
17
|
export function resolveManagedSandbox(sandbox, setupScript, config) {
|
|
31
|
-
const key =
|
|
32
|
-
? DEV_SANDBOX_SCOPE_KEY
|
|
33
|
-
: sandboxScopeKey(sandbox, config);
|
|
18
|
+
const key = sandboxScopeKey(sandbox, config);
|
|
34
19
|
let pending = managedSandboxes.get(key);
|
|
35
20
|
if (!pending) {
|
|
36
|
-
pending =
|
|
37
|
-
// Don't cache a failed provisioning attempt
|
|
21
|
+
pending = createLangSmithSandbox(sandbox, setupScript).catch((error) => {
|
|
22
|
+
// Don't cache a failed provisioning attempt. Let the next run retry.
|
|
38
23
|
managedSandboxes.delete(key);
|
|
39
24
|
throw error;
|
|
40
25
|
});
|
|
@@ -42,26 +27,13 @@ export function resolveManagedSandbox(sandbox, setupScript, config) {
|
|
|
42
27
|
}
|
|
43
28
|
return pending;
|
|
44
29
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Derive the reuse key from the run. Without runtime identity, sandboxes are
|
|
47
|
-
* keyed by thread; with identity, by the configured tenant/actor scope.
|
|
48
|
-
*/
|
|
30
|
+
/** Derive the process-level reuse key from the configured sandbox scope. */
|
|
49
31
|
export function sandboxScopeKey(sandbox, config) {
|
|
50
|
-
const configurable = (config?.configurable ?? {});
|
|
51
|
-
const identity = configurable.identity;
|
|
52
32
|
const scope = sandbox.options?.scope ?? "thread";
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
key = identity?.actor?.id;
|
|
58
|
-
else
|
|
59
|
-
key = configurable.thread_id;
|
|
60
|
-
return (key ??
|
|
61
|
-
identity?.tenant?.id ??
|
|
62
|
-
identity?.actor?.id ??
|
|
63
|
-
configurable.thread_id ??
|
|
64
|
-
"default");
|
|
33
|
+
if (scope === "agent") {
|
|
34
|
+
return `agent:${assistantIdFromConfig(config)}`;
|
|
35
|
+
}
|
|
36
|
+
return `thread:${threadIdFromConfig(config)}`;
|
|
65
37
|
}
|
|
66
38
|
/** Clear the process-level sandbox cache. Test-only. */
|
|
67
39
|
export function clearManagedSandboxCacheForTests() {
|
|
@@ -71,93 +43,16 @@ export function clearManagedSandboxCacheForTests() {
|
|
|
71
43
|
export function setLangSmithSandboxClientLoaderForTests(loader) {
|
|
72
44
|
langSmithSandboxClientLoader = loader ?? defaultLangSmithSandboxClientLoader;
|
|
73
45
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
* path when local — right when the dev server boots, not on the first run.
|
|
78
|
-
*
|
|
79
|
-
* Sandboxes are otherwise created lazily (on first run), so with `--browser`
|
|
80
|
-
* off nothing would print until the agent is invoked. The generated entry
|
|
81
|
-
* calls this at module load (graph registration); because dev shares one
|
|
82
|
-
* sandbox ({@link DEV_SANDBOX_SCOPE_KEY}), the first real run reuses what is
|
|
83
|
-
* created here rather than provisioning a second sandbox. The authoritative
|
|
84
|
-
* "created" log (with the temp dir) is emitted by {@link createDevSandbox}.
|
|
85
|
-
*
|
|
86
|
-
* No-op outside `mda dev`, so the generated entry can always call it.
|
|
87
|
-
*/
|
|
88
|
-
export async function announceSandboxPlan(sandbox, setupScript) {
|
|
89
|
-
if (!isDevMode())
|
|
90
|
-
return;
|
|
91
|
-
await resolveManagedSandbox(sandbox, setupScript, undefined);
|
|
92
|
-
}
|
|
93
|
-
function createManagedSandbox(sandbox, setupScript) {
|
|
94
|
-
// `mda dev` never provisions a real provider sandbox the same way a deploy
|
|
95
|
-
// does (it builds no snapshot/image), so it gets its own resolution path with
|
|
96
|
-
// a local fallback. The flag gating ensures a real deployment can never be
|
|
97
|
-
// silently downgraded to local shell execution.
|
|
98
|
-
return isDevMode()
|
|
99
|
-
? createDevSandbox(sandbox, setupScript)
|
|
100
|
-
: createProviderSandbox(sandbox, setupScript, {
|
|
101
|
-
useDefaultLangSmithRuntime: true,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Production path: construct the configured provider's sandbox and provision it.
|
|
106
|
-
* Any failure propagates — a misconfigured deployment must surface, not degrade.
|
|
107
|
-
*/
|
|
108
|
-
async function createProviderSandbox(sandbox, setupScript, options) {
|
|
109
|
-
const backend = await createProviderBackend(sandbox, options);
|
|
110
|
-
if (setupScript && setupScript.trim().length > 0) {
|
|
111
|
-
await runSetupScript(backend, setupScript);
|
|
112
|
-
}
|
|
113
|
-
return backend;
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Dev path: prefer the configured provider when its credentials are present,
|
|
117
|
-
* but fall back to a local temp-directory sandbox when credentials are missing
|
|
118
|
-
* *or* the provider cannot be created (e.g. `LangSmithSandbox`, which needs a
|
|
119
|
-
* snapshot that only `mda deploy` builds). This keeps `mda dev` working offline
|
|
120
|
-
* and resilient to provider/config gaps while still exercising real providers
|
|
121
|
-
* that can spin up from an API key alone.
|
|
122
|
-
*/
|
|
123
|
-
async function createDevSandbox(sandbox, setupScript) {
|
|
124
|
-
const cred = providerCredentialStatus(sandbox.provider);
|
|
125
|
-
if (cred.status !== "missing") {
|
|
126
|
-
try {
|
|
127
|
-
const backend = await createProviderSandbox(sandbox, setupScript, {
|
|
128
|
-
useDefaultLangSmithRuntime: false,
|
|
129
|
-
});
|
|
130
|
-
logDevSandboxNoticeOnce(cred.status === "available"
|
|
131
|
-
? `[mda dev] using the configured ${cred.provider} sandbox.`
|
|
132
|
-
: `[mda dev] using the configured sandbox provider (${cred.provider}).`);
|
|
133
|
-
return backend;
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
return createLocalSandbox(setupScript, `the configured ${cred.provider} sandbox could not be created ` +
|
|
137
|
-
`(${errorMessage(error)}); using a local temporary directory instead`);
|
|
138
|
-
}
|
|
46
|
+
async function createLangSmithSandbox(sandbox, setupScript) {
|
|
47
|
+
if (providerKey(sandbox.provider) !== "LangSmithSandbox") {
|
|
48
|
+
throw new Error("MDA only supports deepagents' LangSmithSandbox provider");
|
|
139
49
|
}
|
|
140
|
-
const
|
|
141
|
-
return createLocalSandbox(setupScript, `no credentials found for the configured sandbox provider (${cred.provider}); ` +
|
|
142
|
-
`using a local temporary directory instead — set ${missing} to use it`);
|
|
143
|
-
}
|
|
144
|
-
/** Provision the local dev sandbox and run `setup.sh` inline inside it. */
|
|
145
|
-
async function createLocalSandbox(setupScript, reason) {
|
|
146
|
-
const backend = await createLocalDevSandbox(reason);
|
|
50
|
+
const backend = await createLangSmithSandboxBackend(sandbox);
|
|
147
51
|
if (setupScript && setupScript.trim().length > 0) {
|
|
148
|
-
await
|
|
52
|
+
await runSetupScript(backend, setupScript);
|
|
149
53
|
}
|
|
150
54
|
return backend;
|
|
151
55
|
}
|
|
152
|
-
/** Construct the configured provider's backend, stripping MDA-managed knobs. */
|
|
153
|
-
async function createProviderBackend(sandbox, options) {
|
|
154
|
-
if (options.useDefaultLangSmithRuntime &&
|
|
155
|
-
providerKey(sandbox.provider) === "LangSmithSandbox") {
|
|
156
|
-
return createLangSmithSandboxBackend(sandbox);
|
|
157
|
-
}
|
|
158
|
-
const { scope: _scope, idleTtlSeconds: _idleTtlSeconds, ...providerOptions } = sandbox.options ?? {};
|
|
159
|
-
return (await sandbox.provider.create(providerOptions));
|
|
160
|
-
}
|
|
161
56
|
async function createLangSmithSandboxBackend(sandbox) {
|
|
162
57
|
const { scope: _scope, apiKey = process.env.LANGSMITH_API_KEY, defaultTimeout, templateName, snapshotId, ...createSandboxOptions } = sandbox.options ?? {};
|
|
163
58
|
if (snapshotId && templateName) {
|
|
@@ -166,20 +61,41 @@ async function createLangSmithSandboxBackend(sandbox) {
|
|
|
166
61
|
if (templateName) {
|
|
167
62
|
createSandboxOptions.snapshotName = templateName;
|
|
168
63
|
}
|
|
169
|
-
const { SandboxClient } = await langSmithSandboxClientLoader();
|
|
170
64
|
if (snapshotId) {
|
|
171
65
|
createSandboxOptions.snapshotId = snapshotId;
|
|
172
66
|
}
|
|
67
|
+
const { SandboxClient } = await langSmithSandboxClientLoader();
|
|
173
68
|
const sdkOptions = stringOption(apiKey);
|
|
174
69
|
const client = new SandboxClient(sdkOptions ? { apiKey: sdkOptions } : undefined);
|
|
175
70
|
const langSmithSandbox = await client.createSandbox(createSandboxOptions);
|
|
176
71
|
const Backend = sandbox.provider;
|
|
177
72
|
return new Backend({ sandbox: langSmithSandbox, defaultTimeout });
|
|
178
73
|
}
|
|
74
|
+
function providerKey(provider) {
|
|
75
|
+
const providerId = provider.providerId;
|
|
76
|
+
if (typeof providerId === "string" && providerId.trim()) {
|
|
77
|
+
return providerId.trim();
|
|
78
|
+
}
|
|
79
|
+
return typeof provider.name === "string" ? provider.name.trim() : "";
|
|
80
|
+
}
|
|
81
|
+
function threadIdFromConfig(config) {
|
|
82
|
+
const threadId = configValue(config, "thread_id");
|
|
83
|
+
if (threadId === undefined) {
|
|
84
|
+
throw new Error('sandbox scope "thread" requires configurable.thread_id');
|
|
85
|
+
}
|
|
86
|
+
return threadId;
|
|
87
|
+
}
|
|
88
|
+
function assistantIdFromConfig(config) {
|
|
89
|
+
return configValue(config, "assistant_id") ?? "agent";
|
|
90
|
+
}
|
|
179
91
|
function stringOption(value) {
|
|
180
|
-
|
|
92
|
+
if (typeof value !== "string")
|
|
93
|
+
return undefined;
|
|
94
|
+
const trimmed = value.trim();
|
|
95
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
181
96
|
}
|
|
182
|
-
function
|
|
183
|
-
return
|
|
97
|
+
function configValue(config, key) {
|
|
98
|
+
return (stringOption(config?.metadata?.[key]) ??
|
|
99
|
+
stringOption(config?.configurable?.[key]));
|
|
184
100
|
}
|
|
185
101
|
//# sourceMappingURL=sandbox-manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-manager.js","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"sandbox-manager.js","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,8 @@ export declare function runSetupScript(backend: ManagedSandboxBackend, script: s
|
|
|
10
10
|
/**
|
|
11
11
|
* Run `setup.sh` by piping its contents straight to the backend's shell.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* filesystem, so an uploaded `/tmp/mda-setup.sh` would not be found by `bash`.
|
|
16
|
-
* Executed inline, the script runs with the temp root as its working directory.
|
|
13
|
+
* Kept as a compatibility fallback for sandbox backend implementations that
|
|
14
|
+
* conform to the execute surface but do not expose upload support.
|
|
17
15
|
*/
|
|
18
16
|
export declare function runSetupScriptInline(backend: ManagedSandboxBackend, script: string): Promise<void>;
|
|
19
17
|
export declare function assertSetupSucceeded(result: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-script.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAKxD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAED
|
|
1
|
+
{"version":3,"file":"setup-script.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAKxD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,GAAG,IAAI,CAOP"}
|
|
@@ -20,10 +20,8 @@ export async function runSetupScript(backend, script) {
|
|
|
20
20
|
/**
|
|
21
21
|
* Run `setup.sh` by piping its contents straight to the backend's shell.
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* filesystem, so an uploaded `/tmp/mda-setup.sh` would not be found by `bash`.
|
|
26
|
-
* Executed inline, the script runs with the temp root as its working directory.
|
|
23
|
+
* Kept as a compatibility fallback for sandbox backend implementations that
|
|
24
|
+
* conform to the execute surface but do not expose upload support.
|
|
27
25
|
*/
|
|
28
26
|
export async function runSetupScriptInline(backend, script) {
|
|
29
27
|
assertSetupSucceeded(await backend.execute(script));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B,EAC9B,MAAc;IAEd,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,OAAO,CAAC,WAAW,CAAC;YACxB,CAAC,iBAAiB,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACtD,CAAC,CAAC;QACH,oBAAoB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IACD,MAAM,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"setup-script.js","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B,EAC9B,MAAc;IAEd,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,OAAO,CAAC,WAAW,CAAC;YACxB,CAAC,iBAAiB,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACtD,CAAC,CAAC;QACH,oBAAoB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IACD,MAAM,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA8B,EAC9B,MAAc;IAEd,oBAAoB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAGpC;IACC,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import type { McpServersDefinition } from "../connectors.js";
|
|
2
|
+
import type { IdentityDefinition } from "../identity.js";
|
|
2
3
|
import type { SandboxDefinition } from "../sandbox.js";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* from here to scope the store/sandbox.
|
|
5
|
+
* Any object that carries a per-run LangGraph `configurable` map. The shared base
|
|
6
|
+
* for the run config and the runtime the seam augments, so the `configurable`
|
|
7
|
+
* carrier shape is declared once.
|
|
8
8
|
*/
|
|
9
|
-
export interface
|
|
9
|
+
export interface ConfigurableCarrier {
|
|
10
10
|
configurable?: Record<string, unknown>;
|
|
11
11
|
[key: string]: unknown;
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* The LangGraph runnable config passed to a graph factory at invocation time.
|
|
15
|
+
*
|
|
16
|
+
* Kept loose for v0; the managed runtime reads LangGraph metadata/configurable
|
|
17
|
+
* values from here to scope the managed sandbox.
|
|
18
|
+
*/
|
|
19
|
+
export interface ManagedRunConfig extends ConfigurableCarrier {
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* Managed values the CLI injects into the generated entry module.
|
|
15
24
|
*
|
|
@@ -37,6 +46,13 @@ export interface ManagedAgentOptions {
|
|
|
37
46
|
* The runtime loads their tools and appends them to the agent's tools.
|
|
38
47
|
*/
|
|
39
48
|
connectors?: McpServersDefinition;
|
|
49
|
+
/**
|
|
50
|
+
* The root `identity.ts` declaration, if the project opts into managed
|
|
51
|
+
* identity. Resolution + thread scoping run in the generated custom-auth
|
|
52
|
+
* handler (`buildManagedAuth`); this seam reserves the declaration for the
|
|
53
|
+
* frozen `runtime.identity` envelope and memory namespacing.
|
|
54
|
+
*/
|
|
55
|
+
identity?: IdentityDefinition;
|
|
40
56
|
}
|
|
41
57
|
/**
|
|
42
58
|
* The subset of a created sandbox backend the managed runtime relies on to run
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CACL,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type JWTPayload } from "jose";
|
|
2
|
+
import type { IdentityConfig, ValidatedTokenIngress, ValidatedTokenProvider } from "../identity.js";
|
|
3
|
+
import type { ManagedUser } from "./auth.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the caller identity for the `validated_token` ingress mode (§6.2): pick
|
|
6
|
+
* the provider by token issuer, verify the token (JWKS / introspection / guest),
|
|
7
|
+
* then map its claims into the identity envelope. Fail-closed (401) throughout.
|
|
8
|
+
*/
|
|
9
|
+
export declare function resolveValidatedTokenUser(cfg: IdentityConfig, ingress: ValidatedTokenIngress, request: Request): Promise<ManagedUser>;
|
|
10
|
+
/** Extract the bearer token from the `Authorization` header, or 401. */
|
|
11
|
+
export declare function bearerToken(request: Request): string;
|
|
12
|
+
/**
|
|
13
|
+
* Select the provider that should verify `token`. A single-provider deployment
|
|
14
|
+
* always uses its one entry; otherwise selection is by the token's `iss` claim
|
|
15
|
+
* (guest tokens carry MDA's own issuer). Fail-closed on no match (401).
|
|
16
|
+
*/
|
|
17
|
+
export declare function selectProvider(providers: ValidatedTokenProvider[], token: string): ValidatedTokenProvider;
|
|
18
|
+
/** Map verified token claims into the managed user envelope, per `provider.claims`. */
|
|
19
|
+
export declare function claimsToUser(provider: ValidatedTokenProvider, claims: JWTPayload): ManagedUser;
|
|
20
|
+
/**
|
|
21
|
+
* Mint a short-lived guest token for an anonymous caller. Exposed for the guest
|
|
22
|
+
* issue/reissue route; the same deployment key verifies it on later calls.
|
|
23
|
+
*/
|
|
24
|
+
export declare function issueGuestToken(provider: ValidatedTokenProvider, subject?: string): Promise<string>;
|
|
25
|
+
//# sourceMappingURL=validated-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validated-token.d.ts","sourceRoot":"","sources":["../../src/runtime/validated-token.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EAGhB,MAAM,MAAM,CAAC;AAEd,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAc7C;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,qBAAqB,EAC9B,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAQpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,sBAAsB,EAAE,EACnC,KAAK,EAAE,MAAM,GACZ,sBAAsB,CAsBxB;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,UAAU,GACjB,WAAW,CA0Bb;AA0JD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,sBAAsB,EAChC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAejB"}
|