managed-deepagents 0.5.0-dev.78 → 0.5.0-dev.80
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 +50 -8
- package/dist/channels/assistant-text.js +1 -1
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +3 -1
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/index.d.ts +6 -8
- package/dist/channels/index.d.ts.map +1 -1
- package/dist/channels/index.js +5 -5
- package/dist/channels/index.js.map +1 -1
- package/dist/channels/manifest.d.ts +36 -3
- package/dist/channels/manifest.d.ts.map +1 -1
- package/dist/channels/messaging-registry.d.ts +17 -0
- package/dist/channels/messaging-registry.d.ts.map +1 -0
- package/dist/channels/messaging-registry.js +44 -0
- package/dist/channels/messaging-registry.js.map +1 -0
- package/dist/channels/registry.d.ts +4 -3
- package/dist/channels/registry.d.ts.map +1 -1
- package/dist/channels/registry.js +6 -5
- package/dist/channels/registry.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +4 -1
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +4 -2
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/connectors/github/adapter-core.d.ts +15 -0
- package/dist/connectors/github/adapter-core.d.ts.map +1 -0
- package/dist/connectors/github/adapter-core.js +52 -0
- package/dist/connectors/github/adapter-core.js.map +1 -0
- package/dist/{channels → connectors}/github/define.d.ts +28 -58
- package/dist/connectors/github/define.d.ts.map +1 -0
- package/dist/connectors/github/define.js +72 -0
- package/dist/connectors/github/define.js.map +1 -0
- package/dist/{channels → connectors}/github/http.d.ts +4 -4
- package/dist/connectors/github/http.d.ts.map +1 -0
- package/dist/{channels → connectors}/github/http.js +13 -24
- package/dist/connectors/github/http.js.map +1 -0
- package/dist/connectors/github/index.d.ts +59 -16
- package/dist/connectors/github/index.d.ts.map +1 -1
- package/dist/connectors/github/index.js +159 -73
- package/dist/connectors/github/index.js.map +1 -1
- package/dist/connectors/github/match.d.ts +20 -0
- package/dist/connectors/github/match.d.ts.map +1 -0
- package/dist/connectors/github/match.js +41 -0
- package/dist/connectors/github/match.js.map +1 -0
- package/dist/{channels → connectors}/github/normalize.d.ts +1 -1
- package/dist/connectors/github/normalize.d.ts.map +1 -0
- package/dist/{channels → connectors}/github/normalize.js +2 -2
- package/dist/connectors/github/normalize.js.map +1 -0
- package/dist/connectors/github/sandbox.d.ts.map +1 -1
- package/dist/connectors/github/sandbox.js +30 -23
- package/dist/connectors/github/sandbox.js.map +1 -1
- package/dist/connectors/github/source-thread.d.ts.map +1 -0
- package/dist/connectors/github/source-thread.js.map +1 -0
- package/dist/{channels → connectors}/github/transport.d.ts +7 -1
- package/dist/connectors/github/transport.d.ts.map +1 -0
- package/dist/{channels → connectors}/github/transport.js +18 -4
- package/dist/connectors/github/transport.js.map +1 -0
- package/dist/connectors/langsmith/index.d.ts +29 -17
- package/dist/connectors/langsmith/index.d.ts.map +1 -1
- package/dist/connectors/langsmith/index.js +34 -29
- package/dist/connectors/langsmith/index.js.map +1 -1
- package/dist/connectors/langsmith/routes.d.ts +4 -15
- package/dist/connectors/langsmith/routes.d.ts.map +1 -1
- package/dist/connectors/langsmith/routes.js +63 -72
- package/dist/connectors/langsmith/routes.js.map +1 -1
- package/dist/connectors/mcp/index.d.ts +13 -20
- package/dist/connectors/mcp/index.d.ts.map +1 -1
- package/dist/connectors/mcp/index.js +92 -112
- package/dist/connectors/mcp/index.js.map +1 -1
- package/dist/connectors/mcp/load.d.ts.map +1 -1
- package/dist/connectors/mcp/load.js +16 -40
- package/dist/connectors/mcp/load.js.map +1 -1
- package/dist/{channels → connectors}/slack/adapter-core.d.ts +1 -1
- package/dist/connectors/slack/adapter-core.d.ts.map +1 -0
- package/dist/connectors/slack/adapter-core.js.map +1 -0
- package/dist/{channels → connectors}/slack/adapter.d.ts +3 -4
- package/dist/connectors/slack/adapter.d.ts.map +1 -0
- package/dist/{channels → connectors}/slack/adapter.js +1 -1
- package/dist/connectors/slack/adapter.js.map +1 -0
- package/dist/{channels → connectors}/slack/http.d.ts +6 -40
- package/dist/connectors/slack/http.d.ts.map +1 -0
- package/dist/{channels → connectors}/slack/http.js +22 -125
- package/dist/connectors/slack/http.js.map +1 -0
- package/dist/connectors/slack/index.d.ts +108 -0
- package/dist/connectors/slack/index.d.ts.map +1 -0
- package/dist/connectors/slack/index.js +191 -0
- package/dist/connectors/slack/index.js.map +1 -0
- package/dist/{channels → connectors}/slack/normalize.d.ts +5 -5
- package/dist/connectors/slack/normalize.d.ts.map +1 -0
- package/dist/{channels → connectors}/slack/normalize.js +21 -20
- package/dist/connectors/slack/normalize.js.map +1 -0
- package/dist/connectors/slack/source-thread.d.ts.map +1 -0
- package/dist/connectors/slack/source-thread.js.map +1 -0
- package/dist/{channels → connectors}/slack/transport.d.ts +1 -1
- package/dist/connectors/slack/transport.d.ts.map +1 -0
- package/dist/{channels → connectors}/slack/transport.js +4 -3
- package/dist/connectors/slack/transport.js.map +1 -0
- package/dist/connectors/tool-selection.d.ts +31 -0
- package/dist/connectors/tool-selection.d.ts.map +1 -0
- package/dist/connectors/tool-selection.js +54 -0
- package/dist/connectors/tool-selection.js.map +1 -0
- package/dist/connectors/toolserver/catalog.d.ts +134 -0
- package/dist/connectors/toolserver/catalog.d.ts.map +1 -0
- package/dist/connectors/toolserver/catalog.js +74 -0
- package/dist/connectors/toolserver/catalog.js.map +1 -0
- package/dist/connectors/toolserver/index.d.ts +119 -0
- package/dist/connectors/toolserver/index.d.ts.map +1 -0
- package/dist/connectors/toolserver/index.js +150 -0
- package/dist/connectors/toolserver/index.js.map +1 -0
- package/dist/connectors/toolserver/load.d.ts +55 -0
- package/dist/connectors/toolserver/load.d.ts.map +1 -0
- package/dist/connectors/toolserver/load.js +162 -0
- package/dist/connectors/toolserver/load.js.map +1 -0
- package/dist/extension.d.ts +77 -0
- package/dist/extension.d.ts.map +1 -0
- package/dist/extension.js +127 -0
- package/dist/extension.js.map +1 -0
- package/dist/identity/claims.d.ts +18 -0
- package/dist/identity/claims.d.ts.map +1 -0
- package/dist/identity/claims.js +37 -0
- package/dist/identity/claims.js.map +1 -0
- package/dist/identity/connect-inference.d.ts +28 -0
- package/dist/identity/connect-inference.d.ts.map +1 -0
- package/dist/identity/connect-inference.js +39 -0
- package/dist/identity/connect-inference.js.map +1 -0
- package/dist/identity/connect-provider-types.d.ts +23 -6
- package/dist/identity/connect-provider-types.d.ts.map +1 -1
- package/dist/identity/connect-provider-types.js +3 -1
- package/dist/identity/connect-provider-types.js.map +1 -1
- package/dist/identity/connect-provider.d.ts +9 -4
- package/dist/identity/connect-provider.d.ts.map +1 -1
- package/dist/identity/connect-provider.js +19 -9
- package/dist/identity/connect-provider.js.map +1 -1
- package/dist/identity/credential-resolvers.d.ts +33 -0
- package/dist/identity/credential-resolvers.d.ts.map +1 -0
- package/dist/identity/credential-resolvers.js +62 -0
- package/dist/identity/credential-resolvers.js.map +1 -0
- package/dist/identity/github/connect-http.d.ts +3 -3
- package/dist/identity/github/connect-http.d.ts.map +1 -1
- package/dist/identity/github/connect-http.js +21 -13
- package/dist/identity/github/connect-http.js.map +1 -1
- package/dist/identity/github/credentials-store.d.ts +10 -10
- package/dist/identity/github/credentials-store.d.ts.map +1 -1
- package/dist/identity/github/credentials-store.js +40 -43
- package/dist/identity/github/credentials-store.js.map +1 -1
- package/dist/identity/github/credentials.d.ts +16 -13
- package/dist/identity/github/credentials.d.ts.map +1 -1
- package/dist/identity/github/credentials.js +43 -23
- package/dist/identity/github/credentials.js.map +1 -1
- package/dist/identity/github/index.d.ts +2 -3
- package/dist/identity/github/index.d.ts.map +1 -1
- package/dist/identity/github/index.js +1 -2
- package/dist/identity/github/index.js.map +1 -1
- package/dist/identity/github/oauth.d.ts +3 -3
- package/dist/identity/github/oauth.d.ts.map +1 -1
- package/dist/identity/github/oauth.js +10 -9
- package/dist/identity/github/oauth.js.map +1 -1
- package/dist/identity/index.d.ts +35 -29
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +98 -131
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/loopback.d.ts +27 -2
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +61 -8
- package/dist/identity/loopback.js.map +1 -1
- package/dist/identity/options.d.ts +90 -0
- package/dist/identity/options.d.ts.map +1 -0
- package/dist/identity/options.js +171 -0
- package/dist/identity/options.js.map +1 -0
- package/dist/identity/slack/connect-http.d.ts +3 -3
- package/dist/identity/slack/connect-http.d.ts.map +1 -1
- package/dist/identity/slack/connect-http.js +22 -14
- package/dist/identity/slack/connect-http.js.map +1 -1
- package/dist/identity/slack/index.d.ts +1 -2
- package/dist/identity/slack/index.d.ts.map +1 -1
- package/dist/identity/slack/index.js +1 -2
- package/dist/identity/slack/index.js.map +1 -1
- package/dist/identity/slack/links.d.ts +15 -15
- package/dist/identity/slack/links.d.ts.map +1 -1
- package/dist/identity/slack/links.js +50 -53
- package/dist/identity/slack/links.js.map +1 -1
- package/dist/identity/slack/oauth.d.ts +2 -2
- package/dist/identity/slack/oauth.d.ts.map +1 -1
- package/dist/identity/slack/oauth.js +9 -24
- package/dist/identity/slack/oauth.js.map +1 -1
- package/dist/identity/supabase.js +9 -9
- package/dist/identity/supabase.js.map +1 -1
- package/dist/identity/types.d.ts +82 -36
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/index.d.ts +11 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -12
- package/dist/index.js.map +1 -1
- package/dist/ingress/index.d.ts +54 -0
- package/dist/ingress/index.d.ts.map +1 -0
- package/dist/ingress/index.js +128 -0
- package/dist/ingress/index.js.map +1 -0
- package/dist/namespaces.d.ts +76 -0
- package/dist/namespaces.d.ts.map +1 -0
- package/dist/namespaces.js +94 -0
- package/dist/namespaces.js.map +1 -0
- package/dist/runtime/auth.d.ts +18 -14
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +88 -68
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/backend.d.ts +1 -1
- package/dist/runtime/backend.d.ts.map +1 -1
- package/dist/runtime/connector.d.ts +66 -23
- package/dist/runtime/connector.d.ts.map +1 -1
- package/dist/runtime/connector.js +63 -27
- package/dist/runtime/connector.js.map +1 -1
- package/dist/runtime/cors.d.ts +2 -3
- package/dist/runtime/cors.d.ts.map +1 -1
- package/dist/runtime/cors.js +2 -7
- package/dist/runtime/cors.js.map +1 -1
- package/dist/runtime/credentials.d.ts.map +1 -1
- package/dist/runtime/credentials.js +39 -14
- package/dist/runtime/credentials.js.map +1 -1
- package/dist/runtime/http.d.ts +47 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +54 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/identity-http.d.ts +6 -16
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +71 -54
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +18 -17
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +55 -39
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts +77 -104
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +36 -35
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/memory/index.d.ts +1 -0
- package/dist/runtime/memory/index.d.ts.map +1 -1
- package/dist/runtime/memory/index.js +1 -0
- package/dist/runtime/memory/index.js.map +1 -1
- package/dist/runtime/memory/lazy-context-backend.d.ts +66 -0
- package/dist/runtime/memory/lazy-context-backend.d.ts.map +1 -0
- package/dist/runtime/memory/lazy-context-backend.js +154 -0
- package/dist/runtime/memory/lazy-context-backend.js.map +1 -0
- package/dist/runtime/memory/user-repo.js +3 -3
- package/dist/runtime/memory/user-repo.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +33 -0
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +173 -9
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/sandbox-stream-retry.d.ts +16 -0
- package/dist/runtime/sandbox-stream-retry.d.ts.map +1 -0
- package/dist/runtime/sandbox-stream-retry.js +61 -0
- package/dist/runtime/sandbox-stream-retry.js.map +1 -0
- package/dist/runtime/setup-script.d.ts.map +1 -1
- package/dist/runtime/setup-script.js +4 -2
- package/dist/runtime/setup-script.js.map +1 -1
- package/dist/runtime/validated-token.d.ts +1 -1
- package/dist/runtime/validated-token.d.ts.map +1 -1
- package/dist/runtime/validated-token.js +75 -33
- package/dist/runtime/validated-token.js.map +1 -1
- package/dist/sandbox.d.ts +19 -22
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +20 -34
- package/dist/sandbox.js.map +1 -1
- package/dist/schedules.js +8 -9
- package/dist/schedules.js.map +1 -1
- package/package.json +18 -28
- package/dist/channels/collect.d.ts +0 -26
- package/dist/channels/collect.d.ts.map +0 -1
- package/dist/channels/collect.js +0 -42
- package/dist/channels/collect.js.map +0 -1
- package/dist/channels/github/adapter-core.d.ts +0 -6
- package/dist/channels/github/adapter-core.d.ts.map +0 -1
- package/dist/channels/github/adapter-core.js +0 -27
- package/dist/channels/github/adapter-core.js.map +0 -1
- package/dist/channels/github/adapter.d.ts +0 -16
- package/dist/channels/github/adapter.d.ts.map +0 -1
- package/dist/channels/github/adapter.js +0 -52
- package/dist/channels/github/adapter.js.map +0 -1
- package/dist/channels/github/define.d.ts.map +0 -1
- package/dist/channels/github/define.js +0 -166
- package/dist/channels/github/define.js.map +0 -1
- package/dist/channels/github/http.d.ts.map +0 -1
- package/dist/channels/github/http.js.map +0 -1
- package/dist/channels/github/index.d.ts +0 -12
- package/dist/channels/github/index.d.ts.map +0 -1
- package/dist/channels/github/index.js +0 -10
- package/dist/channels/github/index.js.map +0 -1
- package/dist/channels/github/normalize.d.ts.map +0 -1
- package/dist/channels/github/normalize.js.map +0 -1
- package/dist/channels/github/source-thread.d.ts.map +0 -1
- package/dist/channels/github/source-thread.js.map +0 -1
- package/dist/channels/github/transport.d.ts.map +0 -1
- package/dist/channels/github/transport.js.map +0 -1
- package/dist/channels/plugin.d.ts +0 -61
- package/dist/channels/plugin.d.ts.map +0 -1
- package/dist/channels/plugin.js +0 -80
- package/dist/channels/plugin.js.map +0 -1
- package/dist/channels/slack/adapter-core.d.ts.map +0 -1
- package/dist/channels/slack/adapter-core.js.map +0 -1
- package/dist/channels/slack/adapter.d.ts.map +0 -1
- package/dist/channels/slack/adapter.js.map +0 -1
- package/dist/channels/slack/define.d.ts +0 -74
- package/dist/channels/slack/define.d.ts.map +0 -1
- package/dist/channels/slack/define.js +0 -160
- package/dist/channels/slack/define.js.map +0 -1
- package/dist/channels/slack/http.d.ts.map +0 -1
- package/dist/channels/slack/http.js.map +0 -1
- package/dist/channels/slack/index.d.ts +0 -18
- package/dist/channels/slack/index.d.ts.map +0 -1
- package/dist/channels/slack/index.js +0 -13
- package/dist/channels/slack/index.js.map +0 -1
- package/dist/channels/slack/normalize.d.ts.map +0 -1
- package/dist/channels/slack/normalize.js.map +0 -1
- package/dist/channels/slack/source-thread.d.ts.map +0 -1
- package/dist/channels/slack/source-thread.js.map +0 -1
- package/dist/channels/slack/transport.d.ts.map +0 -1
- package/dist/channels/slack/transport.js.map +0 -1
- /package/dist/{channels → connectors}/github/source-thread.d.ts +0 -0
- /package/dist/{channels → connectors}/github/source-thread.js +0 -0
- /package/dist/{channels → connectors}/slack/adapter-core.js +0 -0
- /package/dist/{channels → connectors}/slack/source-thread.d.ts +0 -0
- /package/dist/{channels → connectors}/slack/source-thread.js +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy per-run CompositeBackend for identity-scoped user/organization memory.
|
|
3
|
+
*
|
|
4
|
+
* deepagents prefers a pre-constructed BackendProtocol instance over a factory.
|
|
5
|
+
* This facade remounts `/memories/user` from the ambient LangGraph configurable
|
|
6
|
+
* on each operation — the TypeScript counterpart of Python
|
|
7
|
+
* `LazyPerRunContextBackend`.
|
|
8
|
+
*/
|
|
9
|
+
import { resolveRuntimeConfigurable } from "../identity-runtime.js";
|
|
10
|
+
import { managedContextBackend } from "./mounts.js";
|
|
11
|
+
import { ensureUserMemorySeed } from "./seed.js";
|
|
12
|
+
import { openUserMemoryBackend, resolveRunMemoryRepoHandle, } from "./user-repo.js";
|
|
13
|
+
const UNAUTHENTICATED_KEY = "__unauthenticated__";
|
|
14
|
+
/**
|
|
15
|
+
* Lazy CompositeBackend facade that remounts per-actor memory.
|
|
16
|
+
*
|
|
17
|
+
* Construct unbound via {@link LazyPerRunContextBackend.create}, or call
|
|
18
|
+
* {@link forRuntime} so concurrent requests each freeze their own
|
|
19
|
+
* `configurable`.
|
|
20
|
+
*
|
|
21
|
+
* Only the memory mount (open + seed) is cached by actor repo handle. The
|
|
22
|
+
* CompositeBackend is rebuilt per operation with a fresh `forRuntime` sandbox
|
|
23
|
+
* so thread-scoped sandboxes stay isolated across concurrent runs.
|
|
24
|
+
*/
|
|
25
|
+
export class LazyPerRunContextBackend {
|
|
26
|
+
deps;
|
|
27
|
+
memoryCache;
|
|
28
|
+
pendingMemory;
|
|
29
|
+
boundConfigurable;
|
|
30
|
+
/** Matches deepagents CompositeBackend; FilesystemMiddleware reads this. */
|
|
31
|
+
artifactsRoot = "/";
|
|
32
|
+
constructor(deps, memoryCache, pendingMemory, boundConfigurable) {
|
|
33
|
+
this.deps = deps;
|
|
34
|
+
this.memoryCache = memoryCache;
|
|
35
|
+
this.pendingMemory = pendingMemory;
|
|
36
|
+
this.boundConfigurable = boundConfigurable;
|
|
37
|
+
}
|
|
38
|
+
/** Build the unbound backend used at compile time. */
|
|
39
|
+
static create(deps) {
|
|
40
|
+
return new LazyPerRunContextBackend(deps, new Map(), new Map(), undefined);
|
|
41
|
+
}
|
|
42
|
+
/** Per-run sibling with this request's `configurable` frozen. */
|
|
43
|
+
forRuntime(runtime) {
|
|
44
|
+
const configurable = resolveRuntimeConfigurable(runtime);
|
|
45
|
+
return new LazyPerRunContextBackend(this.deps, this.memoryCache, this.pendingMemory, configurable);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Duck-type as CompositeBackend for deepagents
|
|
49
|
+
* (`CompositeBackend.isInstance` checks `Array.isArray(routePrefixes)`).
|
|
50
|
+
*/
|
|
51
|
+
get routePrefixes() {
|
|
52
|
+
const prefixes = ["/instructions.md", "/skills/", "/memories/user/"];
|
|
53
|
+
if (this.deps.mountOrgMemory) {
|
|
54
|
+
prefixes.push("/memories/org/");
|
|
55
|
+
}
|
|
56
|
+
return prefixes;
|
|
57
|
+
}
|
|
58
|
+
async ls(path = "/") {
|
|
59
|
+
return (await this.composite()).ls(path);
|
|
60
|
+
}
|
|
61
|
+
async read(filePath, offset, limit) {
|
|
62
|
+
return (await this.composite()).read(filePath, offset, limit);
|
|
63
|
+
}
|
|
64
|
+
async readRaw(filePath) {
|
|
65
|
+
const backend = await this.composite();
|
|
66
|
+
const readRaw = backend.readRaw;
|
|
67
|
+
if (typeof readRaw === "function") {
|
|
68
|
+
return readRaw.call(backend, filePath);
|
|
69
|
+
}
|
|
70
|
+
return backend.read(filePath);
|
|
71
|
+
}
|
|
72
|
+
async grep(pattern, path, glob) {
|
|
73
|
+
return (await this.composite()).grep(pattern, path, glob);
|
|
74
|
+
}
|
|
75
|
+
async glob(pattern, path) {
|
|
76
|
+
return (await this.composite()).glob(pattern, path);
|
|
77
|
+
}
|
|
78
|
+
async write(filePath, content) {
|
|
79
|
+
return (await this.composite()).write(filePath, content);
|
|
80
|
+
}
|
|
81
|
+
async edit(filePath, oldString, newString, replaceAll = false) {
|
|
82
|
+
return (await this.composite()).edit(filePath, oldString, newString, replaceAll);
|
|
83
|
+
}
|
|
84
|
+
async delete(filePath) {
|
|
85
|
+
const backend = await this.composite();
|
|
86
|
+
const del = backend.delete;
|
|
87
|
+
return del?.call(backend, filePath);
|
|
88
|
+
}
|
|
89
|
+
async uploadFiles(files) {
|
|
90
|
+
return (await this.composite()).uploadFiles?.(files);
|
|
91
|
+
}
|
|
92
|
+
async downloadFiles(paths) {
|
|
93
|
+
return (await this.composite()).downloadFiles?.(paths);
|
|
94
|
+
}
|
|
95
|
+
async execute(command) {
|
|
96
|
+
return (await this.composite()).execute(command);
|
|
97
|
+
}
|
|
98
|
+
memoryCacheKey(runtime) {
|
|
99
|
+
const handle = resolveRunMemoryRepoHandle(this.deps.deployHandle, this.deps.identityConfig, runtime);
|
|
100
|
+
return handle ?? UNAUTHENTICATED_KEY;
|
|
101
|
+
}
|
|
102
|
+
runtimeBag() {
|
|
103
|
+
if (this.boundConfigurable === undefined) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return { configurable: this.boundConfigurable };
|
|
107
|
+
}
|
|
108
|
+
/** Rebuild composite each call with a per-run sandbox + cached memory mount. */
|
|
109
|
+
async composite() {
|
|
110
|
+
const runtime = this.runtimeBag();
|
|
111
|
+
const scopedSandbox = this.deps.sandboxBackend?.forRuntime(runtime);
|
|
112
|
+
return managedContextBackend(this.deps.contextBackend, scopedSandbox, await this.memoryUser(runtime), this.deps.mountOrgMemory);
|
|
113
|
+
}
|
|
114
|
+
memoryUser(runtime) {
|
|
115
|
+
const key = this.memoryCacheKey(runtime);
|
|
116
|
+
const hit = this.memoryCache.get(key);
|
|
117
|
+
if (hit !== undefined) {
|
|
118
|
+
return Promise.resolve(hit);
|
|
119
|
+
}
|
|
120
|
+
const pending = this.pendingMemory.get(key);
|
|
121
|
+
if (pending) {
|
|
122
|
+
return pending;
|
|
123
|
+
}
|
|
124
|
+
// Cache only successful mounts. Clear pending on settle so a rejected
|
|
125
|
+
// open/seed (e.g. transient Context Hub failure) can retry next call.
|
|
126
|
+
const resolving = this.resolveMemoryUser(runtime)
|
|
127
|
+
.then((mount) => {
|
|
128
|
+
this.memoryCache.set(key, mount);
|
|
129
|
+
return mount;
|
|
130
|
+
})
|
|
131
|
+
.finally(() => {
|
|
132
|
+
if (this.pendingMemory.get(key) === resolving) {
|
|
133
|
+
this.pendingMemory.delete(key);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
this.pendingMemory.set(key, resolving);
|
|
137
|
+
return resolving;
|
|
138
|
+
}
|
|
139
|
+
async resolveMemoryUser(runtime) {
|
|
140
|
+
const userRepo = resolveRunMemoryRepoHandle(this.deps.deployHandle, this.deps.identityConfig, runtime);
|
|
141
|
+
if (userRepo === null) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const memoryBackend = await openUserMemoryBackend(userRepo, this.deps.localRoot);
|
|
145
|
+
await ensureUserMemorySeed({
|
|
146
|
+
userBackend: memoryBackend.backend,
|
|
147
|
+
deployBackend: this.deps.contextBackend,
|
|
148
|
+
localRoot: memoryBackend.rootDir,
|
|
149
|
+
deployRoot: this.deps.localRoot,
|
|
150
|
+
});
|
|
151
|
+
return { kind: "repo", backend: memoryBackend.backend };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=lazy-context-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-context-backend.js","sourceRoot":"","sources":["../../../src/runtime/memory/lazy-context-backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,13 @@ import { downloadContextFile, pathExists } from "./context-io.js";
|
|
|
7
7
|
* Resolve the dedicated Hub repo handle for actor/tenant memory on this run.
|
|
8
8
|
*/
|
|
9
9
|
export function resolveRunMemoryRepoHandle(deployRepo, identityConfig, runtime) {
|
|
10
|
-
const scope = identityConfig.
|
|
11
|
-
if (scope !== "
|
|
10
|
+
const scope = identityConfig.scope.memory;
|
|
11
|
+
if (scope !== "user" && scope !== "organization") {
|
|
12
12
|
return null;
|
|
13
13
|
}
|
|
14
14
|
const configurable = resolveRuntimeConfigurable(runtime);
|
|
15
15
|
const ident = buildRuntimeIdentity(configurable);
|
|
16
|
-
return memoryHubRepoHandle(deployRepo, scope, identityConfig.
|
|
16
|
+
return memoryHubRepoHandle(deployRepo, scope, identityConfig.organizations, ident?.user.id, ident?.organization?.id);
|
|
17
17
|
}
|
|
18
18
|
/** Open (or create-on-write) the per-user Hub repo / local mock root. */
|
|
19
19
|
export async function openUserMemoryBackend(repoHandle, deployRoot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-repo.js","sourceRoot":"","sources":["../../../src/runtime/memory/user-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIlE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,cAA8B,EAC9B,OAAgB;IAEhB,MAAM,KAAK,GAAG,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"user-repo.js","sourceRoot":"","sources":["../../../src/runtime/memory/user-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAIlE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAkB,EAClB,cAA8B,EAC9B,OAAgB;IAEhB,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,0BAA0B,CAC7C,OAA2D,CAC5D,CAAC;IACF,MAAM,KAAK,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IACjD,OAAO,mBAAmB,CACxB,UAAU,EACV,KAAK,EACL,cAAc,CAAC,aAAa,EAC5B,KAAK,EAAE,IAAI,CAAC,EAAE,EACd,KAAK,EAAE,YAAY,EAAE,EAAE,CACxB,CAAC;AACJ,CAAC;AAOD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,UAA8B;IAE9B,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,IAAI,iBAAiB,CAAC;gBAC7B,OAAO;gBACP,WAAW,EAAE,IAAI;aAClB,CAAC;YACF,OAAO;SACR,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAA0B,EAC1B,OAAgB;IAEhB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YACtE,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,OAAO,EACP,2BAA2B,CAC5B,CAAC;IACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA0B,EAC1B,OAAgB;IAEhB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAC3E,OAAO,MAAM,KAAK,SAAS,CAAC;AAC9B,CAAC"}
|
|
@@ -8,6 +8,8 @@ type LangSmithSandboxClientLoader = () => Promise<{
|
|
|
8
8
|
apiKey?: string;
|
|
9
9
|
}) => {
|
|
10
10
|
createSandbox(options?: Record<string, unknown>): Promise<unknown>;
|
|
11
|
+
getSandbox?(name: string): Promise<unknown>;
|
|
12
|
+
startSandbox?(name: string): Promise<unknown>;
|
|
11
13
|
};
|
|
12
14
|
}>;
|
|
13
15
|
/** Optional runtime inputs that drive connector sandbox provisioning. */
|
|
@@ -37,5 +39,36 @@ export declare function invalidateManagedSandbox(sandbox: SandboxDefinition, con
|
|
|
37
39
|
export declare function isTransientSandboxError(error: unknown): boolean;
|
|
38
40
|
/** Override the LangSmith SDK loader. Test-only. */
|
|
39
41
|
export declare function setLangSmithSandboxClientLoaderForTests(loader?: LangSmithSandboxClientLoader): void;
|
|
42
|
+
/**
|
|
43
|
+
* Deployment this runtime belongs to, used to name the sandboxes it creates so
|
|
44
|
+
* `mda delete` can find them again.
|
|
45
|
+
*
|
|
46
|
+
* `MDA_DEPLOYMENT_NAME` is injected by `mda deploy`; `LANGSMITH_DEPLOYMENT_NAME`
|
|
47
|
+
* is the platform's own value and is preferred when present. Undefined under
|
|
48
|
+
* local `mda dev`, where sandboxes stay unnamed and LangSmith generates a name.
|
|
49
|
+
*/
|
|
50
|
+
export declare function managedDeploymentName(): string | undefined;
|
|
51
|
+
/** How a sandbox was provisioned, beyond the scope it serves. */
|
|
52
|
+
export interface SandboxProvisioning {
|
|
53
|
+
/** Options handed to `createSandbox` (snapshot, sizing, TTLs). */
|
|
54
|
+
createOptions?: Record<string, unknown>;
|
|
55
|
+
/** Contents of the project's `setup.sh`, if it has one. */
|
|
56
|
+
setupScript?: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Deterministic sandbox name for a deployment, sandbox scope, and provisioning
|
|
60
|
+
* recipe.
|
|
61
|
+
*
|
|
62
|
+
* The inputs are digested rather than embedded because the scope key carries
|
|
63
|
+
* thread and assistant UUIDs; a short digest keeps the name clear of any length
|
|
64
|
+
* limit while staying stable across container restarts, which is what lets a
|
|
65
|
+
* restarted deployment re-adopt its sandbox instead of leaking it.
|
|
66
|
+
*
|
|
67
|
+
* Provisioning is part of the identity so that editing `setup.sh` or switching
|
|
68
|
+
* snapshots produces a different name. An adopted sandbox skips provisioning, so
|
|
69
|
+
* without this a redeploy would silently leave existing threads on the old
|
|
70
|
+
* environment.
|
|
71
|
+
*/
|
|
72
|
+
export declare function managedSandboxName(deployment: string, scopeKey: string, provisioning?: SandboxProvisioning): string;
|
|
40
73
|
export {};
|
|
41
74
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"sandbox-manager.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAgDnD,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;QACnE,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5C,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,CAAC;CACH,CAAC,CAAC;AAeH,yEAAyE;AACzE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,OAAO,CAAC,EAAE,4BAA4B,GACrC,OAAO,CAAC,wBAAwB,CAAC,CAmEnC;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;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,IAAI,CAEN;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAgB/D;AAED,oDAAoD;AACpD,wBAAgB,uCAAuC,CACrD,MAAM,CAAC,EAAE,4BAA4B,GACpC,IAAI,CAEN;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAK1D;AAED,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,GAAE,mBAAwB,GACrC,MAAM,CAQR"}
|
|
@@ -1,11 +1,29 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
1
2
|
import { hasSandboxConnectors, runConnectorSandboxHooks, } from "./connector.js";
|
|
2
3
|
import { runSetupScript } from "./setup-script.js";
|
|
4
|
+
import { isSandboxStreamError } from "./sandbox-stream-retry.js";
|
|
3
5
|
/**
|
|
4
6
|
* Created sandboxes, keyed by scope, reused for the lifetime of this runtime
|
|
5
7
|
* process. Storing the in-flight promise dedupes concurrent runs and guarantees
|
|
6
8
|
* `setup.sh` is executed only once per newly created sandbox.
|
|
7
9
|
*/
|
|
8
10
|
const managedSandboxes = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Separator between the deployment name and the identity digest in a managed
|
|
13
|
+
* sandbox name.
|
|
14
|
+
*
|
|
15
|
+
* Doubled so one deployment's prefix can never match another's name:
|
|
16
|
+
* `agent--<digest>` is not matched by the `agent-staging--` prefix. Mirrors the
|
|
17
|
+
* `--u--` / `--t--` convention used for Context Hub child repos, and must stay
|
|
18
|
+
* in sync with `SANDBOX_NAME_SEPARATOR` in the CLI.
|
|
19
|
+
*/
|
|
20
|
+
const SANDBOX_NAME_SEPARATOR = "--";
|
|
21
|
+
/** Hex characters of the identity digest kept in a sandbox name. */
|
|
22
|
+
const SANDBOX_DIGEST_LENGTH = 12;
|
|
23
|
+
/** Sandbox statuses that can be adopted as-is. */
|
|
24
|
+
const ADOPTABLE_STATUS = new Set(["ready", "running"]);
|
|
25
|
+
/** Sandbox status for one that is stopped but restartable. */
|
|
26
|
+
const STOPPED_STATUS = "stopped";
|
|
9
27
|
const defaultLangSmithSandboxClientLoader = async () => {
|
|
10
28
|
const dynamicImport = new Function("specifier", "return import(specifier)");
|
|
11
29
|
return (await dynamicImport("langsmith/sandbox"));
|
|
@@ -30,7 +48,7 @@ export function resolveManagedSandbox(sandbox, setupScript, config, options) {
|
|
|
30
48
|
syncChain: Promise.resolve(),
|
|
31
49
|
freshlyCreated: true,
|
|
32
50
|
ready: Promise.resolve().then(async () => {
|
|
33
|
-
const backend = await createLangSmithSandbox(sandbox, setupScript, config, options, "create");
|
|
51
|
+
const backend = await createLangSmithSandbox(sandbox, setupScript, config, options, "create", key);
|
|
34
52
|
created.syncedThreads.add(threadKey);
|
|
35
53
|
return backend;
|
|
36
54
|
}),
|
|
@@ -100,34 +118,84 @@ export function invalidateManagedSandbox(sandbox, config) {
|
|
|
100
118
|
}
|
|
101
119
|
/** True when a sandbox API error is worth invalidating + recreating once. */
|
|
102
120
|
export function isTransientSandboxError(error) {
|
|
121
|
+
// Never-started stream race is also recreate-safe (and retried in place first
|
|
122
|
+
// by executeWithStreamRetry during provision). Truncated HTTP bodies and
|
|
123
|
+
// peer-closed errors are recreate-only — do not replay in place.
|
|
124
|
+
if (isSandboxStreamError(error)) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
103
127
|
const message = error instanceof Error
|
|
104
128
|
? `${error.name}: ${error.message}`
|
|
105
129
|
: typeof error === "string"
|
|
106
130
|
? error
|
|
107
131
|
: String(error);
|
|
108
|
-
return /LangSmithSandboxError|HTTP 502|Bad Gateway|HTTP 503|HTTP 504|ECONNRESET|ETIMEDOUT|sandbox.*(not found|gone|unavailable|terminated)/i.test(message);
|
|
132
|
+
return /LangSmithSandboxError|HTTP 502|Bad Gateway|HTTP 503|HTTP 504|ECONNRESET|ETIMEDOUT|peer closed connection without sending complete message body|incomplete chunked read|sandbox.*(not found|gone|unavailable|terminated)/i.test(message);
|
|
109
133
|
}
|
|
110
134
|
/** Override the LangSmith SDK loader. Test-only. */
|
|
111
135
|
export function setLangSmithSandboxClientLoaderForTests(loader) {
|
|
112
136
|
langSmithSandboxClientLoader = loader ?? defaultLangSmithSandboxClientLoader;
|
|
113
137
|
}
|
|
114
|
-
|
|
138
|
+
/**
|
|
139
|
+
* Deployment this runtime belongs to, used to name the sandboxes it creates so
|
|
140
|
+
* `mda delete` can find them again.
|
|
141
|
+
*
|
|
142
|
+
* `MDA_DEPLOYMENT_NAME` is injected by `mda deploy`; `LANGSMITH_DEPLOYMENT_NAME`
|
|
143
|
+
* is the platform's own value and is preferred when present. Undefined under
|
|
144
|
+
* local `mda dev`, where sandboxes stay unnamed and LangSmith generates a name.
|
|
145
|
+
*/
|
|
146
|
+
export function managedDeploymentName() {
|
|
147
|
+
return (stringOption(process.env.LANGSMITH_DEPLOYMENT_NAME) ??
|
|
148
|
+
stringOption(process.env.MDA_DEPLOYMENT_NAME));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Deterministic sandbox name for a deployment, sandbox scope, and provisioning
|
|
152
|
+
* recipe.
|
|
153
|
+
*
|
|
154
|
+
* The inputs are digested rather than embedded because the scope key carries
|
|
155
|
+
* thread and assistant UUIDs; a short digest keeps the name clear of any length
|
|
156
|
+
* limit while staying stable across container restarts, which is what lets a
|
|
157
|
+
* restarted deployment re-adopt its sandbox instead of leaking it.
|
|
158
|
+
*
|
|
159
|
+
* Provisioning is part of the identity so that editing `setup.sh` or switching
|
|
160
|
+
* snapshots produces a different name. An adopted sandbox skips provisioning, so
|
|
161
|
+
* without this a redeploy would silently leave existing threads on the old
|
|
162
|
+
* environment.
|
|
163
|
+
*/
|
|
164
|
+
export function managedSandboxName(deployment, scopeKey, provisioning = {}) {
|
|
165
|
+
const digest = createHash("sha256")
|
|
166
|
+
.update(scopeKey)
|
|
167
|
+
.update("\0")
|
|
168
|
+
.update(provisioningFingerprint(provisioning))
|
|
169
|
+
.digest("hex")
|
|
170
|
+
.slice(0, SANDBOX_DIGEST_LENGTH);
|
|
171
|
+
return `${deployment}${SANDBOX_NAME_SEPARATOR}${digest}`;
|
|
172
|
+
}
|
|
173
|
+
/** Stable string for a provisioning recipe, insensitive to option ordering. */
|
|
174
|
+
function provisioningFingerprint(provisioning) {
|
|
175
|
+
const createOptions = Object.entries(provisioning.createOptions ?? {}).sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
|
|
176
|
+
return JSON.stringify([createOptions, provisioning.setupScript ?? ""]);
|
|
177
|
+
}
|
|
178
|
+
async function createLangSmithSandbox(sandbox, setupScript, config, options, mode, scopeKey) {
|
|
115
179
|
if (providerKey(sandbox.provider) !== "LangSmithSandbox") {
|
|
116
180
|
throw new Error("MDA only supports deepagents' LangSmithSandbox provider");
|
|
117
181
|
}
|
|
118
|
-
const backend = await createLangSmithSandboxBackend(sandbox);
|
|
182
|
+
const { backend, adopted } = await createLangSmithSandboxBackend(sandbox, scopeKey, setupScript);
|
|
119
183
|
await runConnectorSandboxHooks(options?.connectors, {
|
|
120
184
|
backend,
|
|
121
|
-
|
|
185
|
+
// An adopted sandbox already ran create-time provisioning in an earlier
|
|
186
|
+
// process, so treat it as a reuse for connector purposes.
|
|
187
|
+
mode: adopted ? "reuse" : mode,
|
|
122
188
|
config,
|
|
123
189
|
identity: options?.identity,
|
|
124
190
|
});
|
|
125
|
-
|
|
191
|
+
// Only a new sandbox needs `setup.sh`: an adopted one ran this exact script
|
|
192
|
+
// already, since a changed script yields a different sandbox name.
|
|
193
|
+
if (!adopted && setupScript && setupScript.trim().length > 0) {
|
|
126
194
|
await runSetupScript(backend, setupScript);
|
|
127
195
|
}
|
|
128
196
|
return backend;
|
|
129
197
|
}
|
|
130
|
-
async function createLangSmithSandboxBackend(sandbox) {
|
|
198
|
+
async function createLangSmithSandboxBackend(sandbox, scopeKey, setupScript) {
|
|
131
199
|
const { scope: _scope, apiKey = process.env.LANGSMITH_API_KEY, defaultTimeout, templateName, snapshotId, ...createSandboxOptions } = sandbox.options ?? {};
|
|
132
200
|
if (snapshotId && templateName) {
|
|
133
201
|
throw new Error("snapshotId and templateName are mutually exclusive. Pass only one creation source.");
|
|
@@ -141,9 +209,105 @@ async function createLangSmithSandboxBackend(sandbox) {
|
|
|
141
209
|
const { SandboxClient } = await langSmithSandboxClientLoader();
|
|
142
210
|
const sdkOptions = stringOption(apiKey);
|
|
143
211
|
const client = new SandboxClient(sdkOptions ? { apiKey: sdkOptions } : undefined);
|
|
144
|
-
const
|
|
212
|
+
const deployment = managedDeploymentName();
|
|
213
|
+
const { sandbox: langSmithSandbox, adopted } = await resolveSandboxInstance(client, createSandboxOptions, deployment
|
|
214
|
+
? managedSandboxName(deployment, scopeKey, {
|
|
215
|
+
createOptions: createSandboxOptions,
|
|
216
|
+
setupScript,
|
|
217
|
+
})
|
|
218
|
+
: undefined);
|
|
145
219
|
const Backend = sandbox.provider;
|
|
146
|
-
return
|
|
220
|
+
return {
|
|
221
|
+
backend: new Backend({ sandbox: langSmithSandbox, defaultTimeout }),
|
|
222
|
+
adopted,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Adopt this deployment's existing sandbox for `name`, or create it.
|
|
227
|
+
*
|
|
228
|
+
* Names are deterministic per scope, so a redeployed or restarted container
|
|
229
|
+
* finds the sandbox its predecessor created instead of stranding it until the
|
|
230
|
+
* idle TTL fires. When `name` is undefined (local dev) this is a plain create.
|
|
231
|
+
*/
|
|
232
|
+
async function resolveSandboxInstance(client, createSandboxOptions, name) {
|
|
233
|
+
if (!name) {
|
|
234
|
+
return {
|
|
235
|
+
sandbox: await client.createSandbox(createSandboxOptions),
|
|
236
|
+
adopted: false,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const existing = await adoptSandbox(client, name);
|
|
240
|
+
if (existing !== undefined) {
|
|
241
|
+
return { sandbox: existing, adopted: true };
|
|
242
|
+
}
|
|
243
|
+
try {
|
|
244
|
+
return {
|
|
245
|
+
sandbox: await client.createSandbox({ ...createSandboxOptions, name }),
|
|
246
|
+
adopted: false,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
if (!isSandboxNameConflict(error)) {
|
|
251
|
+
throw error;
|
|
252
|
+
}
|
|
253
|
+
// Either a concurrent container won the create race, or an unusable sandbox
|
|
254
|
+
// (failed, mid-delete) still holds the name.
|
|
255
|
+
const winner = await adoptSandbox(client, name);
|
|
256
|
+
if (winner !== undefined) {
|
|
257
|
+
return { sandbox: winner, adopted: true };
|
|
258
|
+
}
|
|
259
|
+
// Keep the deployment prefix so teardown still finds this sandbox.
|
|
260
|
+
return {
|
|
261
|
+
sandbox: await client.createSandbox({
|
|
262
|
+
...createSandboxOptions,
|
|
263
|
+
name: `${name}-${sandboxNameSuffix()}`,
|
|
264
|
+
}),
|
|
265
|
+
adopted: false,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Return the existing sandbox for `name` when it is usable, else undefined.
|
|
271
|
+
*
|
|
272
|
+
* Best-effort by design: this runs on the sandbox hot path, so a lookup failure
|
|
273
|
+
* falls back to creating rather than failing the run.
|
|
274
|
+
*/
|
|
275
|
+
async function adoptSandbox(client, name) {
|
|
276
|
+
if (typeof client.getSandbox !== "function") {
|
|
277
|
+
return undefined;
|
|
278
|
+
}
|
|
279
|
+
let existing;
|
|
280
|
+
try {
|
|
281
|
+
existing = await client.getSandbox(name);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return undefined;
|
|
285
|
+
}
|
|
286
|
+
if (existing === undefined || existing === null) {
|
|
287
|
+
return undefined;
|
|
288
|
+
}
|
|
289
|
+
const status = stringOption(existing.status)?.toLowerCase();
|
|
290
|
+
// No status reported: assume the SDK handed back a usable sandbox.
|
|
291
|
+
if (status === undefined || ADOPTABLE_STATUS.has(status)) {
|
|
292
|
+
return existing;
|
|
293
|
+
}
|
|
294
|
+
if (status === STOPPED_STATUS && typeof client.startSandbox === "function") {
|
|
295
|
+
try {
|
|
296
|
+
return (await client.startSandbox(name)) ?? existing;
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return undefined;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
/** True when a create failed because the sandbox name is already taken. */
|
|
305
|
+
function isSandboxNameConflict(error) {
|
|
306
|
+
const message = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
|
|
307
|
+
return /409|conflict|already exists|already in use|duplicate/i.test(message);
|
|
308
|
+
}
|
|
309
|
+
function sandboxNameSuffix() {
|
|
310
|
+
return randomBytes(4).toString("hex");
|
|
147
311
|
}
|
|
148
312
|
function threadSyncKey(sandbox, config) {
|
|
149
313
|
const scope = sandbox.options?.scope ?? "thread";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-manager.js","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sandbox-manager.js","sourceRoot":"","sources":["../../src/runtime/sandbox-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry sandbox `execute` when the command stream dies before start.
|
|
3
|
+
*
|
|
4
|
+
* LangSmith sandboxes can return HTTP 201 / accept uploads while the websocket
|
|
5
|
+
* command channel is not ready yet. The first `execute` then fails with
|
|
6
|
+
* `Command stream ended before 'started' message`. Cold GitHub provision and
|
|
7
|
+
* `setup.sh` hit this path immediately after create; retrying the same execute
|
|
8
|
+
* with backoff is cheaper (and more reliable) than throwing away the box.
|
|
9
|
+
*/
|
|
10
|
+
export declare function isSandboxStreamError(error: unknown): boolean;
|
|
11
|
+
export declare function executeWithStreamRetry<T>(execute: (command: string) => Promise<T> | T, command: string, options?: {
|
|
12
|
+
attempts?: number;
|
|
13
|
+
baseDelayMs?: number;
|
|
14
|
+
sleep?: (ms: number) => Promise<void>;
|
|
15
|
+
}): Promise<T>;
|
|
16
|
+
//# sourceMappingURL=sandbox-stream-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-stream-retry.d.ts","sourceRoot":"","sources":["../../src/runtime/sandbox-stream-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAiBH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAoB5D;AAED,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAC5C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,GACL,OAAO,CAAC,CAAC,CAAC,CAuBZ"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry sandbox `execute` when the command stream dies before start.
|
|
3
|
+
*
|
|
4
|
+
* LangSmith sandboxes can return HTTP 201 / accept uploads while the websocket
|
|
5
|
+
* command channel is not ready yet. The first `execute` then fails with
|
|
6
|
+
* `Command stream ended before 'started' message`. Cold GitHub provision and
|
|
7
|
+
* `setup.sh` hit this path immediately after create; retrying the same execute
|
|
8
|
+
* with backoff is cheaper (and more reliable) than throwing away the box.
|
|
9
|
+
*/
|
|
10
|
+
const STREAM_EXECUTE_ATTEMPTS = 6;
|
|
11
|
+
// Cold boxes often need several seconds after HTTP 201 before the websocket
|
|
12
|
+
// command channel is ready — a 1s base burned through attempts too quickly.
|
|
13
|
+
const STREAM_EXECUTE_BASE_DELAY_MS = 2_000;
|
|
14
|
+
// Only the "never started" race is safe to retry in place. Broader transport
|
|
15
|
+
// errors (bare SandboxOperationError, truncated HTTP bodies) can arrive after
|
|
16
|
+
// the command began or finished — those belong on the invalidate/recreate path.
|
|
17
|
+
const STREAM_NEVER_STARTED_RE = /Command stream ended before ['"]started['"] message/i;
|
|
18
|
+
const STREAM_NEVER_STARTED_NAMES = new Set([
|
|
19
|
+
"_StreamEndedBeforeStarted",
|
|
20
|
+
"StreamEndedBeforeStarted",
|
|
21
|
+
]);
|
|
22
|
+
export function isSandboxStreamError(error) {
|
|
23
|
+
if (error instanceof Error && STREAM_NEVER_STARTED_NAMES.has(error.name)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
if (error !== null &&
|
|
27
|
+
typeof error === "object" &&
|
|
28
|
+
STREAM_NEVER_STARTED_NAMES.has(error.constructor?.name ?? "")) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const message = error instanceof Error
|
|
32
|
+
? `${error.name}: ${error.message}`
|
|
33
|
+
: typeof error === "string"
|
|
34
|
+
? error
|
|
35
|
+
: String(error);
|
|
36
|
+
return STREAM_NEVER_STARTED_RE.test(message);
|
|
37
|
+
}
|
|
38
|
+
export async function executeWithStreamRetry(execute, command, options = {}) {
|
|
39
|
+
const attempts = options.attempts ?? STREAM_EXECUTE_ATTEMPTS;
|
|
40
|
+
const baseDelayMs = options.baseDelayMs ?? STREAM_EXECUTE_BASE_DELAY_MS;
|
|
41
|
+
const sleep = options.sleep ??
|
|
42
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
43
|
+
if (attempts < 1) {
|
|
44
|
+
throw new Error("attempts must be >= 1");
|
|
45
|
+
}
|
|
46
|
+
let lastError;
|
|
47
|
+
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
48
|
+
try {
|
|
49
|
+
return await execute(command);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
lastError = error;
|
|
53
|
+
if (!isSandboxStreamError(error) || attempt >= attempts - 1) {
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
await sleep(baseDelayMs * 2 ** attempt);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
throw lastError;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=sandbox-stream-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-stream-retry.js","sourceRoot":"","sources":["../../src/runtime/sandbox-stream-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAClC,4EAA4E;AAC5E,4EAA4E;AAC5E,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAE3C,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,MAAM,uBAAuB,GAC3B,sDAAsD,CAAC;AACzD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACzC,2BAA2B;IAC3B,0BAA0B;CAC3B,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,YAAY,KAAK,IAAI,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,0BAA0B,CAAC,GAAG,CAC3B,KAA6C,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CACvE,EACD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;QACpB,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE;QACnC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAA4C,EAC5C,OAAe,EACf,OAAO,GAIH,EAAE;IAEN,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,uBAAuB,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;IACxE,MAAM,KAAK,GACT,OAAO,CAAC,KAAK;QACb,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,SAAkB,CAAC;IACvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAC5D,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-script.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"setup-script.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-script.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAO5E;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,QAAQ,CAAC,GACnD,IAAI,CAON"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { executeWithStreamRetry } from "./sandbox-stream-retry.js";
|
|
1
2
|
/** Absolute path the provisioning script is uploaded to inside the sandbox. */
|
|
2
3
|
const SETUP_REMOTE_PATH = "/tmp/mda-setup.sh";
|
|
3
4
|
/**
|
|
@@ -12,7 +13,8 @@ export async function runSetupScript(backend, script) {
|
|
|
12
13
|
await backend.uploadFiles([
|
|
13
14
|
[SETUP_REMOTE_PATH, new TextEncoder().encode(script)],
|
|
14
15
|
]);
|
|
15
|
-
|
|
16
|
+
// Fresh sandboxes often reject the first websocket execute; retry in place.
|
|
17
|
+
assertSetupSucceeded(await executeWithStreamRetry((command) => backend.execute(command), `bash ${SETUP_REMOTE_PATH}`));
|
|
16
18
|
return;
|
|
17
19
|
}
|
|
18
20
|
await runSetupScriptInline(backend, script);
|
|
@@ -24,7 +26,7 @@ export async function runSetupScript(backend, script) {
|
|
|
24
26
|
* conform to the execute surface but do not expose upload support.
|
|
25
27
|
*/
|
|
26
28
|
export async function runSetupScriptInline(backend, script) {
|
|
27
|
-
assertSetupSucceeded(await backend.execute(script));
|
|
29
|
+
assertSetupSucceeded(await executeWithStreamRetry((command) => backend.execute(command), script));
|
|
28
30
|
}
|
|
29
31
|
export function assertSetupSucceeded(result) {
|
|
30
32
|
if (typeof result.exitCode === "number" && result.exitCode !== 0) {
|