managed-deepagents 0.9.6-dev.19 → 0.9.6-dev.20
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 +1075 -37
- package/dist/agent-auth.d.ts +1 -1
- package/dist/agent-auth.d.ts.map +1 -1
- package/dist/agent-auth.js +36 -12
- package/dist/agent-auth.js.map +1 -1
- package/dist/browser.d.ts +37 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +31 -0
- package/dist/browser.js.map +1 -0
- package/dist/channels/actor.d.ts +57 -0
- package/dist/channels/actor.d.ts.map +1 -0
- package/dist/channels/actor.js +24 -0
- package/dist/channels/actor.js.map +1 -0
- package/dist/channels/assistant-text.d.ts +29 -0
- package/dist/channels/assistant-text.d.ts.map +1 -1
- package/dist/channels/assistant-text.js +72 -1
- package/dist/channels/assistant-text.js.map +1 -1
- package/dist/channels/binding.d.ts +20 -1
- package/dist/channels/binding.d.ts.map +1 -1
- package/dist/channels/binding.js +44 -11
- package/dist/channels/binding.js.map +1 -1
- package/dist/channels/delivery.d.ts +51 -0
- package/dist/channels/delivery.d.ts.map +1 -0
- package/dist/channels/delivery.js +424 -0
- package/dist/channels/delivery.js.map +1 -0
- package/dist/channels/github/app-setup.d.ts +32 -0
- package/dist/channels/github/app-setup.d.ts.map +1 -0
- package/dist/channels/github/app-setup.js +146 -0
- package/dist/channels/github/app-setup.js.map +1 -0
- package/dist/channels/github/connections.d.ts +11 -0
- package/dist/channels/github/connections.d.ts.map +1 -0
- package/dist/channels/github/connections.js +14 -0
- package/dist/channels/github/connections.js.map +1 -0
- package/dist/channels/github/index.d.ts +12 -0
- package/dist/channels/github/index.d.ts.map +1 -0
- package/dist/channels/github/index.js +266 -0
- package/dist/channels/github/index.js.map +1 -0
- package/dist/channels/github/mentions.d.ts +12 -0
- package/dist/channels/github/mentions.d.ts.map +1 -0
- package/dist/channels/github/mentions.js +185 -0
- package/dist/channels/github/mentions.js.map +1 -0
- package/dist/channels/github/schema.d.ts +4165 -0
- package/dist/channels/github/schema.d.ts.map +1 -0
- package/dist/channels/github/schema.js +221 -0
- package/dist/channels/github/schema.js.map +1 -0
- package/dist/channels/github/types.d.ts +170 -0
- package/dist/channels/github/types.d.ts.map +1 -0
- package/dist/channels/github/types.js +2 -0
- package/dist/channels/github/types.js.map +1 -0
- package/dist/channels/http/endpoint.d.ts +137 -0
- package/dist/channels/http/endpoint.d.ts.map +1 -0
- package/dist/channels/http/endpoint.js +286 -0
- package/dist/channels/http/endpoint.js.map +1 -0
- package/dist/channels/http/http.d.ts.map +1 -1
- package/dist/channels/http/http.js +439 -65
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +8 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +35 -16
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +67 -5
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +155 -43
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +125 -0
- package/dist/channels/http/provider.d.ts.map +1 -0
- package/dist/channels/http/provider.js +227 -0
- package/dist/channels/http/provider.js.map +1 -0
- package/dist/channels/http/studio.d.ts +24 -0
- package/dist/channels/http/studio.d.ts.map +1 -0
- package/dist/channels/http/studio.js +95 -0
- package/dist/channels/http/studio.js.map +1 -0
- package/dist/channels/http/threads.d.ts +7 -0
- package/dist/channels/http/threads.d.ts.map +1 -0
- package/dist/channels/http/threads.js +10 -0
- package/dist/channels/http/threads.js.map +1 -0
- package/dist/channels/http/types.d.ts +166 -2
- package/dist/channels/http/types.d.ts.map +1 -1
- package/dist/channels/linear/app-setup.d.ts +29 -0
- package/dist/channels/linear/app-setup.d.ts.map +1 -0
- package/dist/channels/linear/app-setup.js +102 -0
- package/dist/channels/linear/app-setup.js.map +1 -0
- package/dist/channels/linear/connections.d.ts +11 -0
- package/dist/channels/linear/connections.d.ts.map +1 -0
- package/dist/channels/linear/connections.js +14 -0
- package/dist/channels/linear/connections.js.map +1 -0
- package/dist/channels/linear/graphql.d.ts +57 -0
- package/dist/channels/linear/graphql.d.ts.map +1 -0
- package/dist/channels/linear/graphql.js +167 -0
- package/dist/channels/linear/graphql.js.map +1 -0
- package/dist/channels/linear/index.d.ts +13 -0
- package/dist/channels/linear/index.d.ts.map +1 -0
- package/dist/channels/linear/index.js +457 -0
- package/dist/channels/linear/index.js.map +1 -0
- package/dist/channels/linear/schema.d.ts +1050 -0
- package/dist/channels/linear/schema.d.ts.map +1 -0
- package/dist/channels/linear/schema.js +255 -0
- package/dist/channels/linear/schema.js.map +1 -0
- package/dist/channels/linear/types.d.ts +169 -0
- package/dist/channels/linear/types.d.ts.map +1 -0
- package/dist/channels/linear/types.js +2 -0
- package/dist/channels/linear/types.js.map +1 -0
- package/dist/channels/message-schema.d.ts +2 -0
- package/dist/channels/message-schema.d.ts.map +1 -1
- package/dist/channels/message-schema.js +4 -0
- package/dist/channels/message-schema.js.map +1 -1
- package/dist/channels/messaging-registry.d.ts +16 -0
- package/dist/channels/messaging-registry.d.ts.map +1 -1
- package/dist/channels/messaging-registry.js +29 -0
- package/dist/channels/messaging-registry.js.map +1 -1
- package/dist/channels/reserved-connections.d.ts +12 -0
- package/dist/channels/reserved-connections.d.ts.map +1 -0
- package/dist/channels/reserved-connections.js +55 -0
- package/dist/channels/reserved-connections.js.map +1 -0
- package/dist/channels/resolve-user-endpoint.d.ts +34 -0
- package/dist/channels/resolve-user-endpoint.d.ts.map +1 -0
- package/dist/channels/resolve-user-endpoint.js +51 -0
- package/dist/channels/resolve-user-endpoint.js.map +1 -0
- package/dist/channels/resolve-user.d.ts +95 -0
- package/dist/channels/resolve-user.d.ts.map +1 -0
- package/dist/channels/resolve-user.js +143 -0
- package/dist/channels/resolve-user.js.map +1 -0
- package/dist/channels/run-input.d.ts +88 -0
- package/dist/channels/run-input.d.ts.map +1 -0
- package/dist/channels/run-input.js +177 -0
- package/dist/channels/run-input.js.map +1 -0
- package/dist/channels/runtime.d.ts +5 -2
- package/dist/channels/runtime.d.ts.map +1 -1
- package/dist/channels/runtime.js +19 -10
- package/dist/channels/runtime.js.map +1 -1
- package/dist/channels/schedule-delivery.d.ts +2 -13
- package/dist/channels/schedule-delivery.d.ts.map +1 -1
- package/dist/channels/schedule-delivery.js +6 -73
- package/dist/channels/schedule-delivery.js.map +1 -1
- package/dist/channels/slack/api.d.ts +2 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +6 -0
- package/dist/channels/slack/api.js.map +1 -1
- package/dist/channels/slack/connections.d.ts +6 -0
- package/dist/channels/slack/connections.d.ts.map +1 -0
- package/dist/channels/slack/connections.js +6 -0
- package/dist/channels/slack/connections.js.map +1 -0
- package/dist/channels/slack/events.d.ts +278 -0
- package/dist/channels/slack/events.d.ts.map +1 -0
- package/dist/channels/slack/events.js +235 -0
- package/dist/channels/slack/events.js.map +1 -0
- package/dist/channels/slack/files.d.ts.map +1 -1
- package/dist/channels/slack/files.js +2 -3
- package/dist/channels/slack/files.js.map +1 -1
- package/dist/channels/slack/index.d.ts +90 -2
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +188 -6
- package/dist/channels/slack/index.js.map +1 -1
- package/dist/channels/slack/message-content.d.ts.map +1 -1
- package/dist/channels/slack/message-content.js +23 -28
- package/dist/channels/slack/message-content.js.map +1 -1
- package/dist/channels/slack/status.d.ts +76 -0
- package/dist/channels/slack/status.d.ts.map +1 -0
- package/dist/channels/slack/status.js +427 -0
- package/dist/channels/slack/status.js.map +1 -0
- package/dist/channels/source-providers.js +1 -1
- package/dist/channels/source-providers.js.map +1 -1
- package/dist/channels/trigger/client.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +6 -9
- package/dist/channels/trigger/client.js.map +1 -1
- package/dist/channels/trigger/conversation.d.ts +11 -0
- package/dist/channels/trigger/conversation.d.ts.map +1 -0
- package/dist/channels/trigger/conversation.js +72 -0
- package/dist/channels/trigger/conversation.js.map +1 -0
- package/dist/channels/trigger/http.d.ts +130 -4
- package/dist/channels/trigger/http.d.ts.map +1 -1
- package/dist/channels/trigger/http.js +408 -78
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/ingress.d.ts +70 -1
- package/dist/channels/trigger/ingress.d.ts.map +1 -1
- package/dist/channels/trigger/ingress.js +130 -19
- package/dist/channels/trigger/ingress.js.map +1 -1
- package/dist/channels/trigger/transport.d.ts +10 -0
- package/dist/channels/trigger/transport.d.ts.map +1 -1
- package/dist/channels/trigger/transport.js +25 -9
- package/dist/channels/trigger/transport.js.map +1 -1
- package/dist/channels/trigger/types.d.ts +92 -3
- package/dist/channels/trigger/types.d.ts.map +1 -1
- package/dist/channels/trigger/types.js +37 -0
- package/dist/channels/trigger/types.js.map +1 -1
- package/dist/channels/types.d.ts +53 -4
- package/dist/channels/types.d.ts.map +1 -1
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -1
- package/dist/connections.d.ts +35 -1
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +121 -10
- package/dist/connections.js.map +1 -1
- package/dist/credential-gate.d.ts +2 -0
- package/dist/credential-gate.d.ts.map +1 -1
- package/dist/credential-gate.js +37 -3
- package/dist/credential-gate.js.map +1 -1
- package/dist/define-deep-agent.d.ts +2 -2
- package/dist/define-deep-agent.d.ts.map +1 -1
- package/dist/define-deep-agent.js +53 -2
- package/dist/define-deep-agent.js.map +1 -1
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +3 -1
- package/dist/identity/index.js.map +1 -1
- package/dist/identity/options.d.ts +9 -0
- package/dist/identity/options.d.ts.map +1 -1
- package/dist/identity/options.js +1 -1
- package/dist/identity/options.js.map +1 -1
- package/dist/identity/types.d.ts +3 -0
- package/dist/identity/types.d.ts.map +1 -1
- package/dist/index.d.ts +19 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/loopback.d.ts +1 -0
- package/dist/ingress/loopback.d.ts.map +1 -1
- package/dist/ingress/loopback.js +4 -1
- package/dist/ingress/loopback.js.map +1 -1
- package/dist/ingress/runs.d.ts +74 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +184 -9
- package/dist/ingress/runs.js.map +1 -1
- package/dist/managed-composition.d.ts +3 -0
- package/dist/managed-composition.d.ts.map +1 -1
- package/dist/managed-composition.js +29 -13
- package/dist/managed-composition.js.map +1 -1
- package/dist/namespaces.d.ts +25 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +4 -29
- package/dist/namespaces.js.map +1 -1
- package/dist/runtime/async-subagents.d.ts +27 -0
- package/dist/runtime/async-subagents.d.ts.map +1 -0
- package/dist/runtime/async-subagents.js +139 -0
- package/dist/runtime/async-subagents.js.map +1 -0
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +177 -8
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/backend.d.ts +7 -0
- package/dist/runtime/backend.d.ts.map +1 -1
- package/dist/runtime/backend.js +32 -7
- package/dist/runtime/backend.js.map +1 -1
- package/dist/runtime/browser-facade.d.ts +10 -0
- package/dist/runtime/browser-facade.d.ts.map +1 -0
- package/dist/runtime/browser-facade.js +23 -0
- package/dist/runtime/browser-facade.js.map +1 -0
- package/dist/runtime/browser-langsmith.d.ts +143 -0
- package/dist/runtime/browser-langsmith.d.ts.map +1 -0
- package/dist/runtime/browser-langsmith.js +508 -0
- package/dist/runtime/browser-langsmith.js.map +1 -0
- package/dist/runtime/browser-recorder.py +831 -0
- package/dist/runtime/browser-selection.d.ts +10 -0
- package/dist/runtime/browser-selection.d.ts.map +1 -0
- package/dist/runtime/browser-selection.js +21 -0
- package/dist/runtime/browser-selection.js.map +1 -0
- package/dist/runtime/browser.d.ts +128 -0
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +795 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/channel-icon.d.ts +22 -0
- package/dist/runtime/channel-icon.d.ts.map +1 -0
- package/dist/runtime/channel-icon.js +81 -0
- package/dist/runtime/channel-icon.js.map +1 -0
- package/dist/runtime/channel.d.ts +11 -0
- package/dist/runtime/channel.d.ts.map +1 -1
- package/dist/runtime/channel.js.map +1 -1
- package/dist/runtime/identity-http.d.ts +2 -0
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +38 -2
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +10 -0
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +22 -0
- package/dist/runtime/identity-runtime.js.map +1 -1
- package/dist/runtime/index.d.ts +38 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +76 -34
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/managed-thread.d.ts +61 -0
- package/dist/runtime/managed-thread.d.ts.map +1 -0
- package/dist/runtime/managed-thread.js +76 -0
- package/dist/runtime/managed-thread.js.map +1 -0
- package/dist/runtime/managed-tools.d.ts +10 -2
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +10 -8
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/policy.d.ts.map +1 -1
- package/dist/runtime/memory/policy.js +1 -3
- package/dist/runtime/memory/policy.js.map +1 -1
- package/dist/runtime/parent-run.d.ts +33 -0
- package/dist/runtime/parent-run.d.ts.map +1 -0
- package/dist/runtime/parent-run.js +114 -0
- package/dist/runtime/parent-run.js.map +1 -0
- package/dist/runtime/run-input.d.ts +14 -1
- package/dist/runtime/run-input.d.ts.map +1 -1
- package/dist/runtime/run-input.js +100 -7
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +15 -2
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +37 -12
- package/dist/runtime/sandbox-manager.js.map +1 -1
- package/dist/runtime/schedule-auth.d.ts +79 -0
- package/dist/runtime/schedule-auth.d.ts.map +1 -1
- package/dist/runtime/schedule-auth.js +163 -6
- package/dist/runtime/schedule-auth.js.map +1 -1
- package/dist/runtime/static-entry.d.ts.map +1 -1
- package/dist/runtime/static-entry.js +1 -0
- package/dist/runtime/static-entry.js.map +1 -1
- package/dist/runtime/thread-record.d.ts +88 -0
- package/dist/runtime/thread-record.d.ts.map +1 -0
- package/dist/runtime/thread-record.js +213 -0
- package/dist/runtime/thread-record.js.map +1 -0
- package/dist/runtime/types.d.ts +12 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime-schedules.d.ts +15 -0
- package/dist/runtime-schedules.d.ts.map +1 -1
- package/dist/runtime-schedules.js +83 -20
- package/dist/runtime-schedules.js.map +1 -1
- package/dist/sandbox.d.ts +0 -6
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +3 -7
- package/dist/sandbox.js.map +1 -1
- package/dist/schedule-channel.d.ts +5 -2
- package/dist/schedule-channel.d.ts.map +1 -1
- package/dist/schedule-channel.js +13 -12
- package/dist/schedule-channel.js.map +1 -1
- package/dist/types.d.ts +19 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/values.d.ts +15 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +31 -0
- package/dist/values.js.map +1 -0
- package/package.json +23 -9
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { RunTree } from "langsmith";
|
|
2
|
+
import type { ManagedRunConfig } from "./types.js";
|
|
3
|
+
/** The lead thread a run's caller owns, with the metadata its thread record lives in. */
|
|
4
|
+
export interface LeadThread {
|
|
5
|
+
id: string;
|
|
6
|
+
metadata: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The thread of the agent that launched this run, if deepagents sent it.
|
|
10
|
+
*
|
|
11
|
+
* Read from deepagents' parent reference, or else from the task thread's
|
|
12
|
+
* `parent_thread_id` metadata, which the Agent Server copies into every run on
|
|
13
|
+
* the thread, including runs deepagents didn't start (such as a resume).
|
|
14
|
+
*/
|
|
15
|
+
export declare function leadThreadId(config: ManagedRunConfig | undefined): string | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* The lead's thread when this run's caller owns it, else `undefined`.
|
|
18
|
+
*
|
|
19
|
+
* Reads the thread through the SDK's default client, which the Agent Server and
|
|
20
|
+
* `mda dev` point at their own API (as the run's caller), then requires its `owner` to be the
|
|
21
|
+
* caller's owner key, MDA's rule for changing a thread. Being able to read it isn't
|
|
22
|
+
* enough: Studio callers can read every thread. A thread without an owner (no
|
|
23
|
+
* managed identity) only needs to be readable.
|
|
24
|
+
*/
|
|
25
|
+
export declare function verifiedLeadThread(config: ManagedRunConfig | undefined): Promise<LeadThread | undefined>;
|
|
26
|
+
/** The thread a run's record is read from: its lead's, when given. */
|
|
27
|
+
export declare function threadSource(config: ManagedRunConfig | undefined, leadThread: LeadThread | undefined): {
|
|
28
|
+
configurable: Record<string, unknown> | undefined;
|
|
29
|
+
metadata: unknown;
|
|
30
|
+
};
|
|
31
|
+
/** Rebuild the span that launched this run from the trace headers the Agent Server kept. */
|
|
32
|
+
export declare function launchingParent(config: ManagedRunConfig | undefined): RunTree | undefined;
|
|
33
|
+
//# sourceMappingURL=parent-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parent-run.d.ts","sourceRoot":"","sources":["../../src/runtime/parent-run.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAanD,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAqBjC;AAYD,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,UAAU,EAAE,UAAU,GAAG,SAAS,GACjC;IAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAO1E;AAgBD,4FAA4F;AAC5F,wBAAgB,eAAe,CAC7B,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,OAAO,GAAG,SAAS,CAmBrB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs that deepagents launched from another agent's run (async subagents):
|
|
3
|
+
* verify the lead's thread, so the run can share its sandbox and thread
|
|
4
|
+
* record, and nest the run under the lead's trace.
|
|
5
|
+
*/
|
|
6
|
+
import { Client } from "@langchain/langgraph-sdk";
|
|
7
|
+
import { RunTree } from "langsmith";
|
|
8
|
+
import { threadOwnerKey } from "./auth.js";
|
|
9
|
+
import { resolveRuntimeConfigurable } from "./identity-runtime.js";
|
|
10
|
+
import { logger } from "./log.js";
|
|
11
|
+
import { isRecord } from "./managed-thread.js";
|
|
12
|
+
/** `configurable` key where deepagents puts an async subagent run's parent reference. */
|
|
13
|
+
const PARENT_REFERENCE_KEY = "deepagents_parent";
|
|
14
|
+
/** Run metadata key (copied from the task thread) naming an async subagent's lead thread. */
|
|
15
|
+
const PARENT_THREAD_METADATA_KEY = "parent_thread_id";
|
|
16
|
+
/** Baggage key deepagents sets to mark trace headers as a parent. */
|
|
17
|
+
const NEST_UNDER_PARENT = "ls_nest_under_parent";
|
|
18
|
+
const UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
|
|
19
|
+
const SEGMENT = `\\d{8}T\\d{6,}Z${UUID}`;
|
|
20
|
+
/** A `langsmith-trace` dotted order: `<timestamp>Z<run id>` segments joined by dots. */
|
|
21
|
+
const DOTTED_ORDER = new RegExp(`^${SEGMENT}(\\.${SEGMENT})*$`, "i");
|
|
22
|
+
/**
|
|
23
|
+
* The thread of the agent that launched this run, if deepagents sent it.
|
|
24
|
+
*
|
|
25
|
+
* Read from deepagents' parent reference, or else from the task thread's
|
|
26
|
+
* `parent_thread_id` metadata, which the Agent Server copies into every run on
|
|
27
|
+
* the thread, including runs deepagents didn't start (such as a resume).
|
|
28
|
+
*/
|
|
29
|
+
export function leadThreadId(config) {
|
|
30
|
+
const reference = config?.configurable?.[PARENT_REFERENCE_KEY];
|
|
31
|
+
const metadata = config?.metadata;
|
|
32
|
+
const id = (isRecord(reference) ? reference.thread_id : undefined) ??
|
|
33
|
+
(isRecord(metadata) ? metadata[PARENT_THREAD_METADATA_KEY] : undefined);
|
|
34
|
+
// A run on the lead's own thread is the lead's, not a subagent's.
|
|
35
|
+
return typeof id === "string" && id && id !== config?.configurable?.thread_id
|
|
36
|
+
? id
|
|
37
|
+
: undefined;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The lead's thread when this run's caller owns it, else `undefined`.
|
|
41
|
+
*
|
|
42
|
+
* Reads the thread through the SDK's default client, which the Agent Server and
|
|
43
|
+
* `mda dev` point at their own API (as the run's caller), then requires its `owner` to be the
|
|
44
|
+
* caller's owner key, MDA's rule for changing a thread. Being able to read it isn't
|
|
45
|
+
* enough: Studio callers can read every thread. A thread without an owner (no
|
|
46
|
+
* managed identity) only needs to be readable.
|
|
47
|
+
*/
|
|
48
|
+
export async function verifiedLeadThread(config) {
|
|
49
|
+
const id = leadThreadId(config);
|
|
50
|
+
if (!id)
|
|
51
|
+
return undefined;
|
|
52
|
+
let metadata;
|
|
53
|
+
try {
|
|
54
|
+
const thread = await new Client().threads.get(id);
|
|
55
|
+
metadata = isRecord(thread.metadata) ? thread.metadata : {};
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
logger.warn("lead thread not accessible to this run; using its own sandbox");
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const owner = metadata.owner;
|
|
62
|
+
if (owner !== undefined && owner !== callerOwnerKey(config)) {
|
|
63
|
+
logger.warn("lead thread belongs to another caller; using this run's own sandbox");
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return { id, metadata };
|
|
67
|
+
}
|
|
68
|
+
/** The thread owner key MDA stamps for this run's caller, if it's authenticated. */
|
|
69
|
+
function callerOwnerKey(config) {
|
|
70
|
+
const user = resolveRuntimeConfigurable(config)?.langgraph_auth_user;
|
|
71
|
+
return user ? threadOwnerKey(user) : undefined;
|
|
72
|
+
}
|
|
73
|
+
/** The thread a run's record is read from: its lead's, when given. */
|
|
74
|
+
export function threadSource(config, leadThread) {
|
|
75
|
+
return leadThread
|
|
76
|
+
? {
|
|
77
|
+
configurable: { ...config?.configurable, thread_id: leadThread.id },
|
|
78
|
+
metadata: leadThread.metadata,
|
|
79
|
+
}
|
|
80
|
+
: { configurable: config?.configurable, metadata: config?.metadata };
|
|
81
|
+
}
|
|
82
|
+
/** The `langsmith-trace` header, when deepagents marked it as a parent to nest under. */
|
|
83
|
+
function nestingTrace(configurable) {
|
|
84
|
+
const trace = configurable["langsmith-trace"];
|
|
85
|
+
const metadata = configurable["langsmith-metadata"];
|
|
86
|
+
return typeof trace === "string" &&
|
|
87
|
+
trace &&
|
|
88
|
+
isRecord(metadata) &&
|
|
89
|
+
metadata[NEST_UNDER_PARENT] === true
|
|
90
|
+
? trace
|
|
91
|
+
: undefined;
|
|
92
|
+
}
|
|
93
|
+
/** Rebuild the span that launched this run from the trace headers the Agent Server kept. */
|
|
94
|
+
export function launchingParent(config) {
|
|
95
|
+
const configurable = config?.configurable ?? {};
|
|
96
|
+
const trace = nestingTrace(configurable);
|
|
97
|
+
if (!trace)
|
|
98
|
+
return undefined;
|
|
99
|
+
const project = configurable["langsmith-project"];
|
|
100
|
+
const baggage = typeof project === "string"
|
|
101
|
+
? `langsmith-project=${encodeURIComponent(project)}`
|
|
102
|
+
: "";
|
|
103
|
+
try {
|
|
104
|
+
// `fromHeaders` accepts any string and invents a run id.
|
|
105
|
+
if (!DOTTED_ORDER.test(trace))
|
|
106
|
+
throw new Error("malformed");
|
|
107
|
+
return RunTree.fromHeaders({ "langsmith-trace": trace, baggage });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
logger.warn("ignoring a malformed langsmith-trace; the run keeps its own trace");
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=parent-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parent-run.js","sourceRoot":"","sources":["../../src/runtime/parent-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type LeadThread } from "./parent-run.js";
|
|
1
2
|
import type { ManagedRunConfig } from "./types.js";
|
|
2
3
|
import type { createDeepAgent } from "deepagents";
|
|
3
4
|
export declare function isRunExecution(config?: ManagedRunConfig): config is ManagedRunConfig;
|
|
@@ -43,6 +44,18 @@ export declare function executionContext(config?: ManagedRunConfig): {
|
|
|
43
44
|
channelRun: boolean;
|
|
44
45
|
};
|
|
45
46
|
type Agent = ReturnType<typeof createDeepAgent>;
|
|
46
|
-
|
|
47
|
+
/** The run's own thread id. */
|
|
48
|
+
export declare function threadIdOf(config?: ManagedRunConfig): string | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* The Agent Server run a config belongs to. The JS bridge passes it as the
|
|
51
|
+
* top-level `runId`; other hosts stamp `metadata.run_id` or
|
|
52
|
+
* `configurable.run_id`.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveRunId(config?: {
|
|
55
|
+
runId?: unknown;
|
|
56
|
+
metadata?: Record<string, unknown>;
|
|
57
|
+
configurable?: Record<string, unknown>;
|
|
58
|
+
}): string | undefined;
|
|
59
|
+
export declare function adaptChannelExecution(agent: Agent, leadThread?: LeadThread): Agent;
|
|
47
60
|
export {};
|
|
48
61
|
//# sourceMappingURL=run-input.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-input.d.ts","sourceRoot":"","sources":["../../src/runtime/run-input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-input.d.ts","sourceRoot":"","sources":["../../src/runtime/run-input.ts"],"names":[],"mappings":"AAaA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAazB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,cAAc,CAC5B,MAAM,CAAC,EAAE,gBAAgB,GACxB,MAAM,IAAI,gBAAgB,CAE5B;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAYrE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAOvE;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,gBAAgB;;aAMxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuDpE;AAED,KAAK,KAAK,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAiHhD,+BAA+B;AAC/B,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC,GAAG,MAAM,GAAG,SAAS,CASrB;AA8CD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,UAAU,CAAC,EAAE,UAAU,GACtB,KAAK,CASP"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { isDeepStrictEqual } from "node:util";
|
|
2
|
-
import { CompiledStateGraph, getConfig } from "@langchain/langgraph";
|
|
2
|
+
import { CompiledStateGraph, getConfig, isGraphBubbleUp, } from "@langchain/langgraph";
|
|
3
|
+
import { withRunTree } from "langsmith/traceable";
|
|
3
4
|
import { currentChannelBinding, resolveChannelBinding, } from "../channels/binding.js";
|
|
4
5
|
import { isManagedKey } from "../run-context.js";
|
|
6
|
+
import { resolveRunThread } from "./managed-thread.js";
|
|
7
|
+
import { launchingParent, leadThreadId, threadSource, } from "./parent-run.js";
|
|
8
|
+
import { deliverRunFailure, deliverRunResult, } from "../channels/delivery.js";
|
|
5
9
|
import { createLogContext, currentLogContext, runInLogContext, traceIdFromMetadata, } from "../telemetry/otel/index.js";
|
|
6
10
|
export function isRunExecution(config) {
|
|
7
11
|
return !!config && Object.hasOwn(config, "context");
|
|
@@ -71,8 +75,11 @@ export function executionContext(config) {
|
|
|
71
75
|
channelRun,
|
|
72
76
|
};
|
|
73
77
|
}
|
|
78
|
+
/** Graph property holding the lead thread a verified async subagent run shares. */
|
|
79
|
+
const LEAD_THREAD = Symbol("mda.leadThread");
|
|
74
80
|
/** Keep the adapter on native graph copies without binding an old instance. */
|
|
75
81
|
class ManagedCompiledGraph extends CompiledStateGraph {
|
|
82
|
+
[LEAD_THREAD];
|
|
76
83
|
async *_streamIterator(input, options) {
|
|
77
84
|
const ambient = getConfig();
|
|
78
85
|
const config = {
|
|
@@ -85,7 +92,19 @@ class ManagedCompiledGraph extends CompiledStateGraph {
|
|
|
85
92
|
...options?.configurable,
|
|
86
93
|
},
|
|
87
94
|
};
|
|
88
|
-
const
|
|
95
|
+
const routed = executionContext(config);
|
|
96
|
+
// A channel caller's async subagent run never answers, and reads its lead's
|
|
97
|
+
// thread record once its caller is verified to own it.
|
|
98
|
+
const subagent = routed.channelRun && !!leadThreadId(config);
|
|
99
|
+
const scope = {
|
|
100
|
+
...routed,
|
|
101
|
+
thread: resolveRunThread({
|
|
102
|
+
...threadSource(config, routed.channelRun ? this[LEAD_THREAD] : undefined),
|
|
103
|
+
binding: routed.binding,
|
|
104
|
+
}),
|
|
105
|
+
};
|
|
106
|
+
// Nest this run under the async subagent call that launched it.
|
|
107
|
+
const parent = launchingParent(config);
|
|
89
108
|
const managed = scope.routing !== undefined;
|
|
90
109
|
const execution = managed && this.config?.context !== undefined
|
|
91
110
|
? this.withConfig({})
|
|
@@ -100,12 +119,38 @@ class ManagedCompiledGraph extends CompiledStateGraph {
|
|
|
100
119
|
if (!parentLog) {
|
|
101
120
|
setRunLogAttributes(log, config);
|
|
102
121
|
}
|
|
103
|
-
|
|
122
|
+
// Each step runs bound to its channel, in the run's log context, and nested
|
|
123
|
+
// under the async subagent call that launched it, if any.
|
|
124
|
+
const within = (fn) => {
|
|
125
|
+
const step = () => currentChannelBinding.run(scope, () => runInLogContext(log, fn));
|
|
126
|
+
return parent ? withRunTree(parent, step) : step();
|
|
127
|
+
};
|
|
128
|
+
const topLevel = isTopLevelRun(config, this);
|
|
129
|
+
const delivered = {
|
|
130
|
+
runId: resolveRunId(config),
|
|
131
|
+
assistantId: assistantIdOf(config),
|
|
132
|
+
configurable: config.configurable,
|
|
133
|
+
metadata: config.metadata,
|
|
134
|
+
routing: scope.routing,
|
|
135
|
+
runThreadId: threadIdOf(config),
|
|
136
|
+
subagent,
|
|
137
|
+
};
|
|
104
138
|
try {
|
|
105
139
|
while (true) {
|
|
106
|
-
|
|
107
|
-
|
|
140
|
+
let item;
|
|
141
|
+
try {
|
|
142
|
+
item = await within(() => iterator.next());
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (topLevel && !isGraphBubbleUp(error) && !isCancellation(error))
|
|
146
|
+
await within(() => deliverRunFailure(scope.thread, delivered, error));
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
if (item.done) {
|
|
150
|
+
if (topLevel)
|
|
151
|
+
await within(() => deliverRunResult(this, scope.thread, delivered));
|
|
108
152
|
return;
|
|
153
|
+
}
|
|
109
154
|
yield item.value;
|
|
110
155
|
}
|
|
111
156
|
}
|
|
@@ -122,6 +167,53 @@ class ManagedCompiledGraph extends CompiledStateGraph {
|
|
|
122
167
|
: super._validateContext(context);
|
|
123
168
|
}
|
|
124
169
|
}
|
|
170
|
+
/** The run's own thread id. */
|
|
171
|
+
export function threadIdOf(config) {
|
|
172
|
+
const value = config?.configurable?.thread_id;
|
|
173
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The Agent Server run a config belongs to. The JS bridge passes it as the
|
|
177
|
+
* top-level `runId`; other hosts stamp `metadata.run_id` or
|
|
178
|
+
* `configurable.run_id`.
|
|
179
|
+
*/
|
|
180
|
+
export function resolveRunId(config) {
|
|
181
|
+
for (const value of [
|
|
182
|
+
config?.runId,
|
|
183
|
+
config?.metadata?.run_id,
|
|
184
|
+
config?.configurable?.run_id,
|
|
185
|
+
]) {
|
|
186
|
+
if (typeof value === "string" && value.trim())
|
|
187
|
+
return value.trim();
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
function assistantIdOf(config) {
|
|
192
|
+
for (const id of [
|
|
193
|
+
config.configurable?.assistant_id,
|
|
194
|
+
config.metadata?.assistant_id,
|
|
195
|
+
]) {
|
|
196
|
+
if (typeof id === "string" && id.trim())
|
|
197
|
+
return id.trim();
|
|
198
|
+
}
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Whether a run ended because it was cancelled, which is no failure to report.
|
|
203
|
+
* Python never sees one: its cancellation is not an `Exception`. The check
|
|
204
|
+
* mirrors LangGraph's own in `pregel/retry.js`.
|
|
205
|
+
*/
|
|
206
|
+
function isCancellation(error) {
|
|
207
|
+
if (!(error instanceof Error))
|
|
208
|
+
return false;
|
|
209
|
+
return (error.name === "AbortError" ||
|
|
210
|
+
error.message.startsWith("Cancel") ||
|
|
211
|
+
error.message.startsWith("AbortError"));
|
|
212
|
+
}
|
|
213
|
+
/** The run's own graph with state to read, not a graph a node calls. */
|
|
214
|
+
function isTopLevelRun(config, graph) {
|
|
215
|
+
return !config.configurable?.checkpoint_ns && !!graph.checkpointer;
|
|
216
|
+
}
|
|
125
217
|
function setRunLogAttributes(log, config) {
|
|
126
218
|
for (const [key, value] of [
|
|
127
219
|
["run_id", config.metadata?.run_id],
|
|
@@ -131,13 +223,14 @@ function setRunLogAttributes(log, config) {
|
|
|
131
223
|
log.attributes[key] = value;
|
|
132
224
|
}
|
|
133
225
|
}
|
|
134
|
-
export function adaptChannelExecution(agent) {
|
|
226
|
+
export function adaptChannelExecution(agent, leadThread) {
|
|
135
227
|
if (!(agent.graph instanceof CompiledStateGraph))
|
|
136
228
|
return agent;
|
|
137
229
|
Object.setPrototypeOf(agent.graph, ManagedCompiledGraph.prototype);
|
|
230
|
+
agent.graph[LEAD_THREAD] = leadThread;
|
|
138
231
|
const configure = agent.withConfig;
|
|
139
232
|
agent.withConfig = function (config) {
|
|
140
|
-
return adaptChannelExecution(configure.call(this, config));
|
|
233
|
+
return adaptChannelExecution(configure.call(this, config), leadThread);
|
|
141
234
|
};
|
|
142
235
|
return agent;
|
|
143
236
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-input.js","sourceRoot":"","sources":["../../src/runtime/run-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"run-input.js","sourceRoot":"","sources":["../../src/runtime/run-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,8 @@ export declare const SANDBOX_API_ENDPOINT_ENV = "MDA_SANDBOX_API_ENDPOINT";
|
|
|
17
17
|
* resolves `snapshotName` in the wrong workspace and 404s on the recipe.
|
|
18
18
|
*/
|
|
19
19
|
export declare const WORKSPACE_ID_ENV = "LANGSMITH_WORKSPACE_ID";
|
|
20
|
+
/** Run `fn` with sandbox scope keys resolving to `leadThread`'s sandbox, if set. */
|
|
21
|
+
export declare function withLeadSandbox<T>(leadThread: string | undefined, fn: () => T): T;
|
|
20
22
|
/** Optional runtime inputs that drive connector sandbox provisioning. */
|
|
21
23
|
export interface ResolveManagedSandboxOptions {
|
|
22
24
|
connectors?: Connector[];
|
|
@@ -34,9 +36,20 @@ export interface ResolveManagedSandboxOptions {
|
|
|
34
36
|
* messages in an already-synced thread (mode `"credentials"`).
|
|
35
37
|
*/
|
|
36
38
|
export declare function resolveManagedSandbox(sandbox: SandboxDefinition, config: ManagedRunConfig | undefined, options?: ResolveManagedSandboxOptions): Promise<SandboxBackendProtocolV2>;
|
|
39
|
+
/**
|
|
40
|
+
* The thread's sandbox if this process has opened it, by any caller; never
|
|
41
|
+
* opens one. A sandbox being recreated reads as unopened until its
|
|
42
|
+
* replacement is ready. Like resolving, it needs `configurable.thread_id`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function openedManagedSandbox(config: ManagedRunConfig | undefined, selectionFingerprint?: string): SandboxBackendProtocolV2 | undefined;
|
|
37
45
|
export declare function isSandboxNotFoundError(error: unknown): boolean;
|
|
38
46
|
export declare function recoverManagedSandbox(sandbox: SandboxDefinition, config: ManagedRunConfig | undefined, failedBackend: SandboxBackendProtocolV2, options?: ResolveManagedSandboxOptions): Promise<SandboxBackendProtocolV2>;
|
|
39
|
-
/**
|
|
47
|
+
/**
|
|
48
|
+
* Derive the process-level reuse key for a thread and optional selection.
|
|
49
|
+
*
|
|
50
|
+
* An async subagent sharing its lead's sandbox uses the lead's thread, so both
|
|
51
|
+
* resolve, sync, and name the same sandbox.
|
|
52
|
+
*/
|
|
40
53
|
export declare function sandboxScopeKey(config: ManagedRunConfig | undefined, selectionFingerprint?: string): string;
|
|
41
54
|
/**
|
|
42
55
|
* Stable, non-plaintext identity for an explicit dynamic sandbox selection.
|
|
@@ -91,7 +104,7 @@ export declare function isTransientSandboxError(error: unknown): boolean;
|
|
|
91
104
|
* is the platform's own value and is preferred when present. Undefined under
|
|
92
105
|
* local `mda dev`, where sandboxes stay unnamed and LangSmith generates a name.
|
|
93
106
|
*/
|
|
94
|
-
export declare function managedDeploymentName(): string | undefined;
|
|
107
|
+
export declare function managedDeploymentName(env?: NodeJS.ProcessEnv): string | undefined;
|
|
95
108
|
/**
|
|
96
109
|
* Deterministic sandbox name for a deployment and thread.
|
|
97
110
|
*
|
|
@@ -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":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
import { createHash, randomBytes } from "node:crypto";
|
|
2
3
|
import { LangSmithSandbox } from "deepagents";
|
|
3
4
|
import { Sandbox, SandboxClient, LangSmithResourceNotFoundError, LangSmithResourceAlreadyExistsError, LangSmithResourceNameConflictError, LangSmithSandboxConnectionError, } from "langsmith/sandbox";
|
|
@@ -61,6 +62,12 @@ const SANDBOX_DEPLOYMENT_DIGEST_LENGTH = 8;
|
|
|
61
62
|
const ADOPTABLE_STATUS = new Set(["ready", "running"]);
|
|
62
63
|
/** Sandbox status for one that is stopped but restartable. */
|
|
63
64
|
const STOPPED_STATUS = "stopped";
|
|
65
|
+
/** Lead thread whose sandbox this run shares; set only by the verified backend, never from config. */
|
|
66
|
+
const sharedLeadThread = new AsyncLocalStorage();
|
|
67
|
+
/** Run `fn` with sandbox scope keys resolving to `leadThread`'s sandbox, if set. */
|
|
68
|
+
export function withLeadSandbox(leadThread, fn) {
|
|
69
|
+
return leadThread ? sharedLeadThread.run(leadThread, fn) : fn();
|
|
70
|
+
}
|
|
64
71
|
/**
|
|
65
72
|
* Resolve (and cache) the per-thread LangSmith sandbox backend for this run.
|
|
66
73
|
* When deploy baked a recipe, new sandboxes clone it; otherwise Host supplies
|
|
@@ -73,6 +80,8 @@ const STOPPED_STATUS = "stopped";
|
|
|
73
80
|
export function resolveManagedSandbox(sandbox, config, options) {
|
|
74
81
|
const key = sandboxScopeKey(config, options?.selectionFingerprint);
|
|
75
82
|
const hasSandbox = hasSandboxConnectors(options?.connectors);
|
|
83
|
+
// A subagent on its lead's sandbox only refreshes credentials.
|
|
84
|
+
const sharesLeadSandbox = sharedLeadThread.getStore() !== undefined;
|
|
76
85
|
let entry = managedSandboxes.get(key);
|
|
77
86
|
if (!entry) {
|
|
78
87
|
const created = {
|
|
@@ -80,12 +89,13 @@ export function resolveManagedSandbox(sandbox, config, options) {
|
|
|
80
89
|
syncChain: Promise.resolve(),
|
|
81
90
|
freshlyCreated: true,
|
|
82
91
|
ready: Promise.resolve().then(async () => {
|
|
83
|
-
const { backend, hostName, sandboxId } = await createLangSmithSandbox(sandbox, config, options, "create", key);
|
|
92
|
+
const { backend, hostName, sandboxId } = await createLangSmithSandbox(sandbox, config, options, "create", key, { adoptedMode: sharesLeadSandbox ? "credentials" : "reuse" });
|
|
84
93
|
created.hostName = hostName;
|
|
85
94
|
created.sandboxId = sandboxId;
|
|
86
95
|
const id = backend.id;
|
|
87
96
|
created.backendId =
|
|
88
97
|
typeof id === "string" && id.trim() ? id.trim() : undefined;
|
|
98
|
+
created.backend = backend;
|
|
89
99
|
if (hostName) {
|
|
90
100
|
backendHostNames.set(backend, hostName);
|
|
91
101
|
}
|
|
@@ -113,8 +123,8 @@ export function resolveManagedSandbox(sandbox, config, options) {
|
|
|
113
123
|
cached.freshlyCreated = false;
|
|
114
124
|
return;
|
|
115
125
|
}
|
|
116
|
-
if (cached.syncedThreads.has(key)) {
|
|
117
|
-
// Same thread: refresh credentials / CLI wiring without re-cloning.
|
|
126
|
+
if (cached.syncedThreads.has(key) || sharesLeadSandbox) {
|
|
127
|
+
// Same thread, or a lead's subagent: refresh credentials / CLI wiring without re-cloning.
|
|
118
128
|
// Otherwise redeploys that fix auth (e.g. gh wrapper) never apply mid-thread.
|
|
119
129
|
await runConnectorSandboxHooks(options?.connectors, {
|
|
120
130
|
backend,
|
|
@@ -137,6 +147,15 @@ export function resolveManagedSandbox(sandbox, config, options) {
|
|
|
137
147
|
return backend;
|
|
138
148
|
});
|
|
139
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* The thread's sandbox if this process has opened it, by any caller; never
|
|
152
|
+
* opens one. A sandbox being recreated reads as unopened until its
|
|
153
|
+
* replacement is ready. Like resolving, it needs `configurable.thread_id`.
|
|
154
|
+
*/
|
|
155
|
+
export function openedManagedSandbox(config, selectionFingerprint) {
|
|
156
|
+
return managedSandboxes.get(sandboxScopeKey(config, selectionFingerprint))
|
|
157
|
+
?.backend;
|
|
158
|
+
}
|
|
140
159
|
export function isSandboxNotFoundError(error) {
|
|
141
160
|
return (error instanceof LangSmithResourceNotFoundError ||
|
|
142
161
|
(error instanceof LangSmithSandboxConnectionError &&
|
|
@@ -170,9 +189,10 @@ export async function recoverManagedSandbox(sandbox, config, failedBackend, opti
|
|
|
170
189
|
freshlyCreated: false,
|
|
171
190
|
hostName: entry.hostName,
|
|
172
191
|
ready: Promise.resolve().then(async () => {
|
|
173
|
-
const { backend, hostName, sandboxId } = await createLangSmithSandbox(sandbox, config, options, "create", key, entry.hostName, existing);
|
|
192
|
+
const { backend, hostName, sandboxId } = await createLangSmithSandbox(sandbox, config, options, "create", key, { recoveryName: entry.hostName, existingSandbox: existing });
|
|
174
193
|
replacement.sandboxId = sandboxId;
|
|
175
194
|
replacement.backendId = backend.id;
|
|
195
|
+
replacement.backend = backend;
|
|
176
196
|
if (hostName)
|
|
177
197
|
backendHostNames.set(backend, hostName);
|
|
178
198
|
return backend;
|
|
@@ -186,9 +206,14 @@ export async function recoverManagedSandbox(sandbox, config, failedBackend, opti
|
|
|
186
206
|
managedSandboxes.set(key, replacement);
|
|
187
207
|
return await replacement.ready;
|
|
188
208
|
}
|
|
189
|
-
/**
|
|
209
|
+
/**
|
|
210
|
+
* Derive the process-level reuse key for a thread and optional selection.
|
|
211
|
+
*
|
|
212
|
+
* An async subagent sharing its lead's sandbox uses the lead's thread, so both
|
|
213
|
+
* resolve, sync, and name the same sandbox.
|
|
214
|
+
*/
|
|
190
215
|
export function sandboxScopeKey(config, selectionFingerprint) {
|
|
191
|
-
const threadKey = `thread:${threadIdFromConfig(config)}`;
|
|
216
|
+
const threadKey = `thread:${sharedLeadThread.getStore() ?? threadIdFromConfig(config)}`;
|
|
192
217
|
return selectionFingerprint
|
|
193
218
|
? `${threadKey}:sandbox:${selectionFingerprint}`
|
|
194
219
|
: threadKey;
|
|
@@ -410,9 +435,9 @@ export function isTransientSandboxError(error) {
|
|
|
410
435
|
* is the platform's own value and is preferred when present. Undefined under
|
|
411
436
|
* local `mda dev`, where sandboxes stay unnamed and LangSmith generates a name.
|
|
412
437
|
*/
|
|
413
|
-
export function managedDeploymentName() {
|
|
414
|
-
return (stringOption(
|
|
415
|
-
stringOption(
|
|
438
|
+
export function managedDeploymentName(env = process.env) {
|
|
439
|
+
return (stringOption(env.LANGSMITH_DEPLOYMENT_NAME) ??
|
|
440
|
+
stringOption(env.MDA_DEPLOYMENT_NAME));
|
|
416
441
|
}
|
|
417
442
|
/**
|
|
418
443
|
* Deterministic sandbox name for a deployment and thread.
|
|
@@ -479,7 +504,7 @@ function legacyProvisioningFingerprint(createOptions) {
|
|
|
479
504
|
* `snapshotName`, and managed keys are dropped.
|
|
480
505
|
*/
|
|
481
506
|
function legacySandboxCreateOptions(sandbox) {
|
|
482
|
-
const {
|
|
507
|
+
const { apiKey: _apiKey, defaultTimeout: _defaultTimeout, templateName, snapshotId, ...resolvedCreateOptions } = (sandbox.options ?? {});
|
|
483
508
|
const createSandboxOptions = {
|
|
484
509
|
...resolvedCreateOptions,
|
|
485
510
|
};
|
|
@@ -512,13 +537,13 @@ function managedSandboxLookupNames(deployment, sandbox, config, selectionFingerp
|
|
|
512
537
|
names.push(legacyManagedSandboxName(deployment, scopeKey, legacySandboxCreateOptions(sandbox)));
|
|
513
538
|
return [...new Set(names)];
|
|
514
539
|
}
|
|
515
|
-
async function createLangSmithSandbox(sandbox, config, options, mode, scopeKey, recoveryName, existingSandbox) {
|
|
540
|
+
async function createLangSmithSandbox(sandbox, config, options, mode, scopeKey, { recoveryName, existingSandbox, adoptedMode = "reuse", } = {}) {
|
|
516
541
|
const { backend, adopted, hostName, sandboxId } = await createLangSmithSandboxBackend(sandbox, config, scopeKey, options?.selectionFingerprint, recoveryName, existingSandbox);
|
|
517
542
|
await runConnectorSandboxHooks(options?.connectors, {
|
|
518
543
|
backend,
|
|
519
544
|
// An adopted sandbox already ran create-time provisioning in an earlier
|
|
520
545
|
// process, so treat it as a reuse for connector purposes.
|
|
521
|
-
mode: adopted ?
|
|
546
|
+
mode: adopted ? adoptedMode : mode,
|
|
522
547
|
config,
|
|
523
548
|
identity: options?.identity,
|
|
524
549
|
});
|