managed-deepagents 0.0.3-dev.23 → 0.0.3-dev.25
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 +110 -5
- package/dist/connectors.d.ts +30 -15
- package/dist/connectors.d.ts.map +1 -1
- package/dist/connectors.js +42 -2
- package/dist/connectors.js.map +1 -1
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +5 -3
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +16 -4
- package/dist/resolve.js.map +1 -1
- package/dist/runtime/connectors-manager.d.ts.map +1 -1
- package/dist/runtime/connectors-manager.js +60 -2
- package/dist/runtime/connectors-manager.js.map +1 -1
- package/dist/runtime/credentials.d.ts.map +1 -1
- package/dist/runtime/credentials.js +4 -1
- package/dist/runtime/credentials.js.map +1 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +110 -42
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-dev-sandbox.d.ts.map +1 -1
- package/dist/runtime/local-dev-sandbox.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +14 -8
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/setup-script.d.ts.map +1 -1
- package/dist/runtime/setup-script.js +3 -1
- package/dist/runtime/setup-script.js.map +1 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js.map +1 -1
- package/dist/schedules.d.ts +90 -0
- package/dist/schedules.d.ts.map +1 -0
- package/dist/schedules.js +40 -0
- package/dist/schedules.js.map +1 -0
- package/dist/types.d.ts +1 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +14 -8
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
TypeScript and Node.js. It includes:
|
|
22
22
|
|
|
23
23
|
- `defineDeepAgent`, the TypeScript authoring contract for managed agents.
|
|
24
|
+
- `defineSchedule`, the TypeScript contract for managed cron schedules.
|
|
24
25
|
- `mda`, the CLI used to build and deploy your agent to LangSmith.
|
|
25
26
|
- `managed-deepagents/runtime`, the runtime helper used by generated managed
|
|
26
27
|
entry modules.
|
|
@@ -44,6 +45,14 @@ This package requires Node.js 22 or newer. The `mda` binary is delivered through
|
|
|
44
45
|
per-platform optional dependencies, so install only downloads the binary for your
|
|
45
46
|
OS and CPU architecture.
|
|
46
47
|
|
|
48
|
+
To start a new project:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
mda init my-agent
|
|
52
|
+
cd my-agent
|
|
53
|
+
npm install
|
|
54
|
+
```
|
|
55
|
+
|
|
47
56
|
## Define an Agent
|
|
48
57
|
|
|
49
58
|
Create an `agent.ts` that exports a named `agent` definition:
|
|
@@ -65,24 +74,106 @@ export const agent = defineDeepAgent({
|
|
|
65
74
|
|
|
66
75
|
```text
|
|
67
76
|
my-agent/
|
|
68
|
-
agent.ts
|
|
69
|
-
instructions.md
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
agent.ts # named `agent` export
|
|
78
|
+
instructions.md # managed system prompt
|
|
79
|
+
package.json
|
|
80
|
+
.env # local deploy secrets, never committed
|
|
81
|
+
schedules/ # optional managed cron schedules
|
|
82
|
+
tools/ # optional custom tools
|
|
83
|
+
middleware/ # optional middleware
|
|
84
|
+
skills/ # optional skills synced to Context Hub
|
|
85
|
+
sandbox/ # optional managed sandbox declaration
|
|
86
|
+
connectors/mcp.ts # optional MCP server declaration
|
|
73
87
|
```
|
|
74
88
|
|
|
75
89
|
The CLI copies your project files into the managed build and generates the entry
|
|
76
90
|
module that connects your definition to the hosted runtime.
|
|
77
91
|
|
|
92
|
+
The agent entry must live at the project root as `agent.ts` or `agent.tsx`.
|
|
93
|
+
|
|
94
|
+
## Define a Schedule
|
|
95
|
+
|
|
96
|
+
Create one file per schedule under `schedules/` and export a named `schedule`:
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
// schedules/daily-digest.ts
|
|
100
|
+
import { defineSchedule } from "managed-deepagents";
|
|
101
|
+
|
|
102
|
+
export const schedule = defineSchedule({
|
|
103
|
+
cron: "0 8 * * 1-5",
|
|
104
|
+
timezone: "America/Los_Angeles",
|
|
105
|
+
prompt: "Write the daily digest.",
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
`mda deploy` reconciles schedules as LangSmith cron jobs after the deployment is
|
|
110
|
+
live. Declarations must be statically serializable literals or top-level
|
|
111
|
+
constants; prompt schedules become user-message input, and stateless runs clean
|
|
112
|
+
up their temporary thread after completion.
|
|
113
|
+
|
|
114
|
+
## Sandbox
|
|
115
|
+
|
|
116
|
+
Add `sandbox/index.ts` when the agent needs a managed execution environment:
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
import { LangSmithSandbox } from "deepagents";
|
|
120
|
+
import { defineSandbox } from "managed-deepagents";
|
|
121
|
+
|
|
122
|
+
export const sandbox = defineSandbox(LangSmithSandbox, {
|
|
123
|
+
scope: "thread",
|
|
124
|
+
idleTtlSeconds: 600,
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
If `sandbox/setup.sh` exists, MDA embeds it and runs it once when the sandbox is
|
|
129
|
+
first provisioned. MDA owns sandbox naming, image/snapshot selection, reuse, and
|
|
130
|
+
lifecycle.
|
|
131
|
+
|
|
132
|
+
## MCP Connectors
|
|
133
|
+
|
|
134
|
+
Add `connectors/mcp.ts` to attach MCP servers. The file must export a named
|
|
135
|
+
`mcp` declaration. By default, MDA exposes every tool loaded from each declared
|
|
136
|
+
server:
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { defineMcpServers } from "managed-deepagents";
|
|
140
|
+
|
|
141
|
+
export const mcp = defineMcpServers({
|
|
142
|
+
mcpServers: {
|
|
143
|
+
langchainDocs: {
|
|
144
|
+
transport: "http",
|
|
145
|
+
url: "https://docs.langchain.com/mcp",
|
|
146
|
+
includeTools: ["search", "fetch"],
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Use `includeTools` or `excludeTools` inside a server config to select a subset.
|
|
153
|
+
Tool names are raw MCP tool names before the managed `{server}__` prefix is
|
|
154
|
+
applied, so `includeTools: ["search"]` on server `langchainDocs` exposes
|
|
155
|
+
`langchainDocs__search` when prefixing is enabled.
|
|
156
|
+
|
|
78
157
|
## CLI
|
|
79
158
|
|
|
159
|
+
Create a new project:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
mda init my-agent
|
|
163
|
+
```
|
|
164
|
+
|
|
80
165
|
Build locally:
|
|
81
166
|
|
|
82
167
|
```bash
|
|
83
168
|
mda build ./my-agent
|
|
84
169
|
```
|
|
85
170
|
|
|
171
|
+
Run on the local LangGraph dev server:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
mda dev ./my-agent
|
|
175
|
+
```
|
|
176
|
+
|
|
86
177
|
Deploy to LangSmith:
|
|
87
178
|
|
|
88
179
|
```bash
|
|
@@ -90,3 +181,17 @@ mda deploy ./my-agent
|
|
|
90
181
|
```
|
|
91
182
|
|
|
92
183
|
The generated build is written to `<root>/.mda/build` by default.
|
|
184
|
+
|
|
185
|
+
Common deploy options:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
mda deploy ./my-agent --name my-agent-dev --deployment-type dev
|
|
189
|
+
mda deploy ./my-agent --tenant-id "$LANGSMITH_TENANT_ID"
|
|
190
|
+
mda deploy ./my-agent --no-wait
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Before deploying, make sure `LANGSMITH_API_KEY` and your model provider key
|
|
194
|
+
such as `OPENAI_API_KEY` or `ANTHROPIC_API_KEY` are available in the project
|
|
195
|
+
`.env`, the process environment, or LangSmith workspace secrets. TypeScript
|
|
196
|
+
deploys also require `npm` on `PATH` because the CLI generates a lockfile for
|
|
197
|
+
the remote build.
|
package/dist/connectors.d.ts
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
* intentionally out of scope: they introduce process management, packaging, and
|
|
14
14
|
* sandboxing concerns beyond this POC.
|
|
15
15
|
*
|
|
16
|
+
* By default, all tools loaded from each declared server are exposed. Use
|
|
17
|
+
* `includeTools` or `excludeTools` inside a server config to select a subset by
|
|
18
|
+
* raw MCP tool name, before any managed `{server}__` prefix is applied.
|
|
19
|
+
*
|
|
16
20
|
* @example
|
|
17
21
|
* ```ts
|
|
18
22
|
* // connectors/mcp.ts
|
|
@@ -31,38 +35,48 @@
|
|
|
31
35
|
* });
|
|
32
36
|
* ```
|
|
33
37
|
*/
|
|
38
|
+
/** Per-server MCP tool selection. Names are raw, unprefixed MCP tool names. */
|
|
39
|
+
export interface McpToolSelectionConfig {
|
|
40
|
+
/**
|
|
41
|
+
* Raw MCP tool names to expose from this server. Names are matched before any
|
|
42
|
+
* managed `{server}__` prefix is applied.
|
|
43
|
+
*/
|
|
44
|
+
includeTools?: string[];
|
|
45
|
+
/**
|
|
46
|
+
* Raw MCP tool names to hide from this server. Names are matched before any
|
|
47
|
+
* managed `{server}__` prefix is applied.
|
|
48
|
+
*/
|
|
49
|
+
excludeTools?: string[];
|
|
50
|
+
}
|
|
51
|
+
/** Shared options for all remote MCP server connections. */
|
|
52
|
+
export interface RemoteMcpServerBaseConfig extends McpToolSelectionConfig {
|
|
53
|
+
/** URL of the remote MCP server endpoint. */
|
|
54
|
+
url: string;
|
|
55
|
+
/** Optional static headers sent when connecting to the MCP server. */
|
|
56
|
+
headers?: Record<string, string>;
|
|
57
|
+
/** Default timeout, in milliseconds, for tools loaded from this server. */
|
|
58
|
+
defaultToolTimeout?: number;
|
|
59
|
+
}
|
|
34
60
|
/** Streamable HTTP MCP server connection. */
|
|
35
|
-
export interface HttpMcpServerConfig {
|
|
61
|
+
export interface HttpMcpServerConfig extends RemoteMcpServerBaseConfig {
|
|
36
62
|
/** Remote transport. `"http"` selects Streamable HTTP. */
|
|
37
63
|
transport: "http";
|
|
38
|
-
/** URL of the remote MCP server endpoint. */
|
|
39
|
-
url: string;
|
|
40
64
|
/**
|
|
41
65
|
* Whether the client may fall back to SSE if the server does not support
|
|
42
66
|
* Streamable HTTP. Defaults to the behavior of `@langchain/mcp-adapters`.
|
|
43
67
|
*/
|
|
44
68
|
automaticSSEFallback?: boolean;
|
|
45
|
-
/** Optional static headers sent when connecting to the MCP server. */
|
|
46
|
-
headers?: Record<string, string>;
|
|
47
|
-
/** Default timeout, in milliseconds, for tools loaded from this server. */
|
|
48
|
-
defaultToolTimeout?: number;
|
|
49
69
|
}
|
|
50
70
|
/** Legacy SSE MCP server connection. */
|
|
51
|
-
export interface SseMcpServerConfig {
|
|
71
|
+
export interface SseMcpServerConfig extends RemoteMcpServerBaseConfig {
|
|
52
72
|
/** Remote transport. `"sse"` selects legacy SSE. */
|
|
53
73
|
transport: "sse";
|
|
54
|
-
/** URL of the remote SSE MCP server endpoint. */
|
|
55
|
-
url: string;
|
|
56
|
-
/** Optional static headers sent when connecting to the MCP server. */
|
|
57
|
-
headers?: Record<string, string>;
|
|
58
74
|
/** Reconnection behavior for SSE MCP servers. */
|
|
59
75
|
reconnect?: {
|
|
60
76
|
enabled: boolean;
|
|
61
77
|
maxAttempts?: number;
|
|
62
78
|
delayMs?: number;
|
|
63
79
|
};
|
|
64
|
-
/** Default timeout, in milliseconds, for tools loaded from this server. */
|
|
65
|
-
defaultToolTimeout?: number;
|
|
66
80
|
}
|
|
67
81
|
/** A remote MCP server connection. Stdio servers are intentionally excluded. */
|
|
68
82
|
export type RemoteMcpServerConfig = HttpMcpServerConfig | SseMcpServerConfig;
|
|
@@ -108,7 +122,8 @@ export interface McpServersDefinition extends McpServersConfig {
|
|
|
108
122
|
* Validates the config eagerly so misconfiguration surfaces at module load
|
|
109
123
|
* (build/dev startup) rather than mid-run: at least one server must be
|
|
110
124
|
* declared, and every server must use a remote transport (`"http"` or
|
|
111
|
-
* `"sse"`). Stdio servers are rejected with a clear
|
|
125
|
+
* `"sse"`). Stdio servers and invalid tool selectors are rejected with a clear
|
|
126
|
+
* error.
|
|
112
127
|
*/
|
|
113
128
|
export declare function defineMcpServers(config: McpServersConfig): McpServersDefinition;
|
|
114
129
|
//# sourceMappingURL=connectors.d.ts.map
|
package/dist/connectors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connectors.d.ts","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,4DAA4D;AAC5D,MAAM,WAAW,yBAA0B,SAAQ,sBAAsB;IACvE,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2EAA2E;IAC3E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,6CAA6C;AAC7C,MAAM,WAAW,mBAAoB,SAAQ,yBAAyB;IACpE,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,oDAAoD;IACpD,SAAS,EAAE,KAAK,CAAC;IACjB,iDAAiD;IACjD,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;AAE7E,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAClD;;;;OAIG;IACH,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,oDAAoD;AACpD,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,qDAAqD;IACrD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,GACvB,oBAAoB,CA2BtB"}
|
package/dist/connectors.js
CHANGED
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
* intentionally out of scope: they introduce process management, packaging, and
|
|
14
14
|
* sandboxing concerns beyond this POC.
|
|
15
15
|
*
|
|
16
|
+
* By default, all tools loaded from each declared server are exposed. Use
|
|
17
|
+
* `includeTools` or `excludeTools` inside a server config to select a subset by
|
|
18
|
+
* raw MCP tool name, before any managed `{server}__` prefix is applied.
|
|
19
|
+
*
|
|
16
20
|
* @example
|
|
17
21
|
* ```ts
|
|
18
22
|
* // connectors/mcp.ts
|
|
@@ -38,12 +42,15 @@
|
|
|
38
42
|
* Validates the config eagerly so misconfiguration surfaces at module load
|
|
39
43
|
* (build/dev startup) rather than mid-run: at least one server must be
|
|
40
44
|
* declared, and every server must use a remote transport (`"http"` or
|
|
41
|
-
* `"sse"`). Stdio servers are rejected with a clear
|
|
45
|
+
* `"sse"`). Stdio servers and invalid tool selectors are rejected with a clear
|
|
46
|
+
* error.
|
|
42
47
|
*/
|
|
43
48
|
export function defineMcpServers(config) {
|
|
44
49
|
const provided = config;
|
|
45
50
|
const servers = provided.mcpServers;
|
|
46
|
-
if (servers === null ||
|
|
51
|
+
if (servers === null ||
|
|
52
|
+
typeof servers !== "object" ||
|
|
53
|
+
Array.isArray(servers)) {
|
|
47
54
|
throw new Error("defineMcpServers(...) requires an `mcpServers` object mapping server " +
|
|
48
55
|
"names to remote MCP server configs.");
|
|
49
56
|
}
|
|
@@ -82,5 +89,38 @@ function validateRemoteServer(name, server) {
|
|
|
82
89
|
if (typeof config.url !== "string" || config.url.trim().length === 0) {
|
|
83
90
|
throw new Error(`MCP server "${name}" must declare a non-empty \`url\`.`);
|
|
84
91
|
}
|
|
92
|
+
validateToolSelection(name, config);
|
|
93
|
+
}
|
|
94
|
+
function validateToolSelection(name, config) {
|
|
95
|
+
const includeTools = validateToolNameList(name, "includeTools", config.includeTools);
|
|
96
|
+
const excludeTools = validateToolNameList(name, "excludeTools", config.excludeTools);
|
|
97
|
+
if (!includeTools || !excludeTools) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const included = new Set(includeTools);
|
|
101
|
+
const conflicts = excludeTools.filter((toolName) => included.has(toolName));
|
|
102
|
+
if (conflicts.length > 0) {
|
|
103
|
+
throw new Error(`MCP server "${name}" selects tool(s) in both \`includeTools\` and ` +
|
|
104
|
+
`\`excludeTools\`: ${conflicts.sort().join(", ")}.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
function validateToolNameList(serverName, field, value) {
|
|
108
|
+
if (value === undefined) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
if (!Array.isArray(value)) {
|
|
112
|
+
throw new Error(`MCP server "${serverName}" \`${field}\` must be an array of strings.`);
|
|
113
|
+
}
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
for (const [index, item] of value.entries()) {
|
|
116
|
+
if (typeof item !== "string" || item.trim().length === 0) {
|
|
117
|
+
throw new Error(`MCP server "${serverName}" \`${field}\` entry ${index} must be a non-empty string.`);
|
|
118
|
+
}
|
|
119
|
+
if (seen.has(item)) {
|
|
120
|
+
throw new Error(`MCP server "${serverName}" \`${field}\` contains duplicate tool name "${item}".`);
|
|
121
|
+
}
|
|
122
|
+
seen.add(item);
|
|
123
|
+
}
|
|
124
|
+
return value;
|
|
85
125
|
}
|
|
86
126
|
//# sourceMappingURL=connectors.js.map
|
package/dist/connectors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectors.js","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connectors.js","sourceRoot":"","sources":["../src/connectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-deep-agent.d.ts","sourceRoot":"","sources":["../src/define-deep-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"define-deep-agent.d.ts","sourceRoot":"","sources":["../src/define-deep-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,qBAAqB,GAC5B,mBAAmB,CAoCrB"}
|
|
@@ -33,17 +33,19 @@ export function defineDeepAgent(config) {
|
|
|
33
33
|
"Write your agent's system prompt in instructions.md next to agent.ts; " +
|
|
34
34
|
"the CLI embeds it at deploy time.");
|
|
35
35
|
}
|
|
36
|
+
if ("disableMemory" in provided &&
|
|
37
|
+
typeof provided.disableMemory !== "boolean") {
|
|
38
|
+
throw new Error("disableMemory must be a boolean");
|
|
39
|
+
}
|
|
36
40
|
const managed = ["backend", "store", "checkpointer", "memory", "skills"].filter((key) => key in provided);
|
|
37
41
|
if (managed.length > 0) {
|
|
38
42
|
throw new Error(`${managed.join(", ")} ${managed.length === 1 ? "is" : "are"} owned by the ` +
|
|
39
43
|
"managed runtime and cannot be set in defineDeepAgent(...). Configure the " +
|
|
40
44
|
"sandbox under sandbox/; the store and checkpointer are wired automatically.");
|
|
41
45
|
}
|
|
42
|
-
const { disableMemory = false, ...agentConfig } = config;
|
|
43
46
|
return {
|
|
44
47
|
kind: "deep-agent",
|
|
45
|
-
config
|
|
46
|
-
disableMemory,
|
|
48
|
+
config,
|
|
47
49
|
};
|
|
48
50
|
}
|
|
49
51
|
//# sourceMappingURL=define-deep-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-deep-agent.js","sourceRoot":"","sources":["../src/define-deep-agent.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"define-deep-agent.js","sourceRoot":"","sources":["../src/define-deep-agent.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA6B;IAE7B,+EAA+E;IAC/E,0EAA0E;IAC1E,qDAAqD;IACrD,MAAM,QAAQ,GAAG,MAAiC,CAAC;IAEnD,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,4EAA4E;YAC1E,wEAAwE;YACxE,mCAAmC,CACtC,CAAC;IACJ,CAAC;IAED,IACE,eAAe,IAAI,QAAQ;QAC3B,OAAO,QAAQ,CAAC,aAAa,KAAK,SAAS,EAC3C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,OAAO,GACX,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,CACxD,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB;YAC1E,2EAA2E;YAC3E,6EAA6E,CAChF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,MAAM;KACP,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { defineDeepAgent } from "./define-deep-agent.js";
|
|
2
2
|
export { defineMcpServers } from "./connectors.js";
|
|
3
|
+
export { defineSchedule } from "./schedules.js";
|
|
3
4
|
export { defineSandbox } from "./sandbox.js";
|
|
4
|
-
export type { HttpMcpServerConfig, McpServersConfig, McpServersDefinition, RemoteMcpServerConfig, SseMcpServerConfig, } from "./connectors.js";
|
|
5
|
+
export type { HttpMcpServerConfig, McpServersConfig, McpServersDefinition, McpToolSelectionConfig, RemoteMcpServerBaseConfig, RemoteMcpServerConfig, SseMcpServerConfig, } from "./connectors.js";
|
|
6
|
+
export type { ScheduleConfig, ScheduleDefinition, ScheduleDeliveryTarget, ScheduleThreadConfig, } from "./schedules.js";
|
|
5
7
|
export type { ChannelAttachment, ChannelDestination, ChannelEvent, ChannelMessage, ChannelPostOptions, DeepAgentDefinition, DefineDeepAgentConfig, ManagedDeepAgentKey, PostedChannelMessage, Runtime, RuntimeChannel, } from "./types.js";
|
|
6
8
|
export type { DefineSandboxOptions, ManagedSandboxOptionKey, SandboxDefinition, SandboxProviderClass, SandboxProviderOptions, SandboxScope, } from "./sandbox.js";
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,GACb,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACP,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,GACb,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/resolve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AASA,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AASA,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAmB7D,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAqBtC"}
|
package/dist/resolve.js
CHANGED
|
@@ -5,12 +5,24 @@
|
|
|
5
5
|
import { createRequire } from "node:module";
|
|
6
6
|
const require = createRequire(import.meta.url);
|
|
7
7
|
export const PLATFORM_PACKAGES = {
|
|
8
|
-
"darwin arm64": {
|
|
8
|
+
"darwin arm64": {
|
|
9
|
+
pkg: "@langchain/managed-deepagents-darwin-arm64",
|
|
10
|
+
bin: "mda",
|
|
11
|
+
},
|
|
9
12
|
"darwin x64": { pkg: "@langchain/managed-deepagents-darwin-x64", bin: "mda" },
|
|
10
|
-
"linux arm64": {
|
|
13
|
+
"linux arm64": {
|
|
14
|
+
pkg: "@langchain/managed-deepagents-linux-arm64",
|
|
15
|
+
bin: "mda",
|
|
16
|
+
},
|
|
11
17
|
"linux x64": { pkg: "@langchain/managed-deepagents-linux-x64", bin: "mda" },
|
|
12
|
-
"win32 x64": {
|
|
13
|
-
|
|
18
|
+
"win32 x64": {
|
|
19
|
+
pkg: "@langchain/managed-deepagents-win32-x64",
|
|
20
|
+
bin: "mda.exe",
|
|
21
|
+
},
|
|
22
|
+
"win32 arm64": {
|
|
23
|
+
pkg: "@langchain/managed-deepagents-win32-arm64",
|
|
24
|
+
bin: "mda.exe",
|
|
25
|
+
},
|
|
14
26
|
};
|
|
15
27
|
/**
|
|
16
28
|
* Resolve the absolute path to the platform-specific `mda` binary.
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,yCAAyC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,gFAAgF;AAChF,yCAAyC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAO/C,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,cAAc,EAAE;QACd,GAAG,EAAE,4CAA4C;QACjD,GAAG,EAAE,KAAK;KACX;IACD,YAAY,EAAE,EAAE,GAAG,EAAE,0CAA0C,EAAE,GAAG,EAAE,KAAK,EAAE;IAC7E,aAAa,EAAE;QACb,GAAG,EAAE,2CAA2C;QAChD,GAAG,EAAE,KAAK;KACX;IACD,WAAW,EAAE,EAAE,GAAG,EAAE,yCAAyC,EAAE,GAAG,EAAE,KAAK,EAAE;IAC3E,WAAW,EAAE;QACX,GAAG,EAAE,yCAAyC;QAC9C,GAAG,EAAE,SAAS;KACf;IACD,aAAa,EAAE;QACb,GAAG,EAAE,2CAA2C;QAChD,GAAG,EAAE,SAAS;KACf;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,0DAA0D,GAAG,KAAK;YAChE,wBAAwB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,yBAAyB,KAAK,CAAC,GAAG,uBAAuB;YACvD,yEAAyE;YACzE,yFAAyF,EAC3F,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectors-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/connectors-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"connectors-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/connectors-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,kBAAkB,CAAC;AAa1B;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB;AAED,yDAAyD;AACzD,wBAAgB,iCAAiC,IAAI,IAAI,CAExD"}
|
|
@@ -39,13 +39,13 @@ export function clearManagedMcpToolsCacheForTests() {
|
|
|
39
39
|
async function createClientAndLoadTools(connectors) {
|
|
40
40
|
const prefixToolNameWithServerName = connectors.prefixToolNameWithServerName ?? true;
|
|
41
41
|
const client = new MultiServerMCPClient({
|
|
42
|
-
mcpServers: connectors.mcpServers,
|
|
42
|
+
mcpServers: stripManagedToolSelection(connectors.mcpServers),
|
|
43
43
|
prefixToolNameWithServerName,
|
|
44
44
|
throwOnLoadError: connectors.throwOnLoadError ?? true,
|
|
45
45
|
useStandardContentBlocks: connectors.useStandardContentBlocks ?? true,
|
|
46
46
|
onConnectionError: connectors.onConnectionError ?? "throw",
|
|
47
47
|
});
|
|
48
|
-
const tools = await client.
|
|
48
|
+
const tools = await loadToolsByServer(client, connectors.mcpServers, prefixToolNameWithServerName);
|
|
49
49
|
// When prefixing is disabled, names can collide with authored tools or across
|
|
50
50
|
// servers. The spec only allows opting out if MDA validates no collisions.
|
|
51
51
|
if (!prefixToolNameWithServerName) {
|
|
@@ -53,6 +53,64 @@ async function createClientAndLoadTools(connectors) {
|
|
|
53
53
|
}
|
|
54
54
|
return tools;
|
|
55
55
|
}
|
|
56
|
+
function stripManagedToolSelection(servers) {
|
|
57
|
+
return Object.fromEntries(Object.entries(servers).map(([name, server]) => {
|
|
58
|
+
const { includeTools: _includeTools, excludeTools: _excludeTools, ...clientConfig } = server;
|
|
59
|
+
return [name, clientConfig];
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
async function loadToolsByServer(client, servers, prefixToolNameWithServerName) {
|
|
63
|
+
const tools = [];
|
|
64
|
+
for (const [serverName, server] of Object.entries(servers)) {
|
|
65
|
+
const serverTools = await client.getTools(serverName);
|
|
66
|
+
tools.push(...filterToolsForServer(serverName, server, serverTools, prefixToolNameWithServerName));
|
|
67
|
+
}
|
|
68
|
+
return tools;
|
|
69
|
+
}
|
|
70
|
+
function filterToolsForServer(serverName, selection, tools, prefixToolNameWithServerName) {
|
|
71
|
+
const includeTools = selection.includeTools;
|
|
72
|
+
const excludeTools = selection.excludeTools;
|
|
73
|
+
if (!includeTools && !excludeTools) {
|
|
74
|
+
return tools;
|
|
75
|
+
}
|
|
76
|
+
const availableNames = new Set(tools
|
|
77
|
+
.map((tool) => selectionToolName(serverName, tool, prefixToolNameWithServerName))
|
|
78
|
+
.filter((name) => typeof name === "string"));
|
|
79
|
+
assertSelectedToolsExist(serverName, availableNames, includeTools, excludeTools);
|
|
80
|
+
const included = includeTools ? new Set(includeTools) : undefined;
|
|
81
|
+
const excluded = excludeTools ? new Set(excludeTools) : undefined;
|
|
82
|
+
return tools.filter((tool) => {
|
|
83
|
+
const toolName = selectionToolName(serverName, tool, prefixToolNameWithServerName);
|
|
84
|
+
if (typeof toolName !== "string") {
|
|
85
|
+
return included === undefined;
|
|
86
|
+
}
|
|
87
|
+
return ((included === undefined || included.has(toolName)) &&
|
|
88
|
+
!excluded?.has(toolName));
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function selectionToolName(serverName, tool, prefixToolNameWithServerName) {
|
|
92
|
+
const name = tool.name;
|
|
93
|
+
if (typeof name !== "string") {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const prefix = `${serverName}__`;
|
|
97
|
+
return prefixToolNameWithServerName && name.startsWith(prefix)
|
|
98
|
+
? name.slice(prefix.length)
|
|
99
|
+
: name;
|
|
100
|
+
}
|
|
101
|
+
function assertSelectedToolsExist(serverName, availableNames, includeTools, excludeTools) {
|
|
102
|
+
const selected = [...(includeTools ?? []), ...(excludeTools ?? [])];
|
|
103
|
+
const unknown = selected.filter((toolName) => !availableNames.has(toolName));
|
|
104
|
+
if (unknown.length === 0) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const available = [...availableNames].sort().join(", ") || "(none)";
|
|
108
|
+
throw new Error(`MCP server "${serverName}" selected unknown tool(s): ${[
|
|
109
|
+
...new Set(unknown),
|
|
110
|
+
]
|
|
111
|
+
.sort()
|
|
112
|
+
.join(", ")}. Available tools: ${available}.`);
|
|
113
|
+
}
|
|
56
114
|
/**
|
|
57
115
|
* Reject duplicate tool names among the loaded MCP tools. Only reached when the
|
|
58
116
|
* author opted out of server-name prefixing.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectors-manager.js","sourceRoot":"","sources":["../../src/runtime/connectors-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"connectors-manager.js","sourceRoot":"","sources":["../../src/runtime/connectors-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/runtime/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/runtime/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAyBnE,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAGnC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,GAAG,MAAM,CAG3E;AAED,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,GACtC,wBAAwB,CAU1B"}
|
|
@@ -28,7 +28,10 @@ export const PROVIDER_CREDENTIAL_ENV_VARS = {
|
|
|
28
28
|
["VERCEL_TOKEN", "VERCEL_TEAM_ID", "VERCEL_PROJECT_ID"],
|
|
29
29
|
],
|
|
30
30
|
// AWS Bedrock AgentCore: standard AWS credential resolution.
|
|
31
|
-
AgentCoreSandbox: [
|
|
31
|
+
AgentCoreSandbox: [
|
|
32
|
+
["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
|
|
33
|
+
["AWS_PROFILE"],
|
|
34
|
+
],
|
|
32
35
|
// Deno Deploy microVMs (`@langchain/deno`) need an organization token.
|
|
33
36
|
DenoSandbox: [["DENO_DEPLOY_TOKEN"]],
|
|
34
37
|
// Node VFS runs locally and needs no credentials.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/runtime/credentials.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA+B;IACtE,+BAA+B;IAC/B,gBAAgB,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACzC,+DAA+D;IAC/D,cAAc,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrC,mDAAmD;IACnD,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACxD,oBAAoB;IACpB,cAAc,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrC,yEAAyE;IACzE,aAAa,EAAE;QACb,CAAC,mBAAmB,CAAC;QACrB,CAAC,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;KACxD;IACD,6DAA6D;IAC7D,gBAAgB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/runtime/credentials.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAA+B;IACtE,+BAA+B;IAC/B,gBAAgB,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACzC,+DAA+D;IAC/D,cAAc,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrC,mDAAmD;IACnD,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAC7B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACxD,oBAAoB;IACpB,cAAc,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACrC,yEAAyE;IACzE,aAAa,EAAE;QACb,CAAC,mBAAmB,CAAC;QACrB,CAAC,cAAc,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;KACxD;IACD,6DAA6D;IAC7D,gBAAgB,EAAE;QAChB,CAAC,mBAAmB,EAAE,uBAAuB,CAAC;QAC9C,CAAC,aAAa,CAAC;KAChB;IACD,uEAAuE;IACvE,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACpC,kDAAkD;IAClD,cAAc,EAAE,EAAE;CACnB,CAAC;AAeF;;;GAGG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,QAAuC;IACjE,MAAM,CAAC,GAAG,QAAkD,CAAC;IAC7D,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC/C,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,sBAAsB,CAAC,OAAiB;IACtD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CACtC,QAAuC;IAEvC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,mBAAmB,EAC/B,MAAM,CAAC,EAAE,gBAAgB,EACzB,OAAO,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2YA4D9B"}
|