managed-deepagents 0.9.6-dev.2 → 0.9.6-dev.21
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 +9 -15
- 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/identity-context.d.ts.map +1 -1
- package/dist/channels/trigger/identity-context.js +2 -5
- package/dist/channels/trigger/identity-context.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 +135 -21
- 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 +36 -12
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +125 -30
- 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/loopback.d.ts +1 -1
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +3 -2
- package/dist/identity/loopback.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/slack/links.js +3 -2
- package/dist/identity/slack/links.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 +7 -3
- 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/graph-build-timing.d.ts +30 -0
- package/dist/runtime/graph-build-timing.d.ts.map +1 -0
- package/dist/runtime/graph-build-timing.js +50 -0
- package/dist/runtime/graph-build-timing.js.map +1 -0
- 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 +97 -43
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/langsmith-env.d.ts +19 -0
- package/dist/runtime/langsmith-env.d.ts.map +1 -0
- package/dist/runtime/langsmith-env.js +38 -0
- package/dist/runtime/langsmith-env.js.map +1 -0
- 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 +40 -18
- 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 +165 -7
- 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/telemetry/metadata.d.ts.map +1 -1
- package/dist/telemetry/metadata.js +4 -4
- package/dist/telemetry/metadata.js.map +1 -1
- package/dist/telemetry/otel/exporter.d.ts.map +1 -1
- package/dist/telemetry/otel/exporter.js +3 -3
- package/dist/telemetry/otel/exporter.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 +26 -12
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { GITHUB_TOKEN_SLUG, githubAppConnectionSlug, } from "./github/connections.js";
|
|
2
|
+
import { LINEAR_TOKEN_SLUG, linearAppConnectionSlug, } from "./linear/connections.js";
|
|
3
|
+
import { SLACK_BOT_TOKEN_SLUG } from "./slack/connections.js";
|
|
4
|
+
// First-party channels' reserved agent connection names, listed here so
|
|
5
|
+
// resolution does not depend on adapter modules being loaded.
|
|
6
|
+
const builtinReservedConnections = new Map([
|
|
7
|
+
[
|
|
8
|
+
GITHUB_TOKEN_SLUG,
|
|
9
|
+
{
|
|
10
|
+
resolve: githubAppConnectionSlug,
|
|
11
|
+
token: "the GitHub App's installation token",
|
|
12
|
+
actsAs: "act on GitHub as the App",
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
[
|
|
16
|
+
LINEAR_TOKEN_SLUG,
|
|
17
|
+
{
|
|
18
|
+
resolve: linearAppConnectionSlug,
|
|
19
|
+
token: "the Linear app's token",
|
|
20
|
+
actsAs: "act in Linear as the app",
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
[
|
|
24
|
+
SLACK_BOT_TOKEN_SLUG,
|
|
25
|
+
{
|
|
26
|
+
// The Slack app's connection has the reserved name itself.
|
|
27
|
+
resolve: () => SLACK_BOT_TOKEN_SLUG,
|
|
28
|
+
token: "the Slack app's bot token",
|
|
29
|
+
actsAs: "act in Slack as the app",
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
]);
|
|
33
|
+
/**
|
|
34
|
+
* Why a channel's reserved agent connection cannot be read as a user
|
|
35
|
+
* connection, or undefined for any other slug. Reading an app's token as the
|
|
36
|
+
* person running the agent is not supported yet.
|
|
37
|
+
*/
|
|
38
|
+
export function reservedUserConnectionError(slug) {
|
|
39
|
+
const reserved = builtinReservedConnections.get(slug);
|
|
40
|
+
if (!reserved)
|
|
41
|
+
return undefined;
|
|
42
|
+
const name = JSON.stringify(slug);
|
|
43
|
+
return (`${name} is not supported as a user connection yet: it is ${reserved.token}, ` +
|
|
44
|
+
`an agent connection. Use connections.get(${name}, { type: "agent" }) to ` +
|
|
45
|
+
`${reserved.actsAs}.`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The connection that actually holds a channel's reserved agent connection;
|
|
49
|
+
* other slugs pass through unchanged.
|
|
50
|
+
*/
|
|
51
|
+
export function reservedAgentConnectionSlug(slug, deploymentId) {
|
|
52
|
+
const reserved = builtinReservedConnections.get(slug);
|
|
53
|
+
return reserved && deploymentId ? reserved.resolve(deploymentId) : slug;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=reserved-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reserved-connections.js","sourceRoot":"","sources":["../../src/channels/reserved-connections.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,wEAAwE;AACxE,8DAA8D;AAC9D,MAAM,0BAA0B,GAAG,IAAI,GAAG,CASxC;IACA;QACE,iBAAiB;QACjB;YACE,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,qCAAqC;YAC5C,MAAM,EAAE,0BAA0B;SACnC;KACF;IACD;QACE,iBAAiB;QACjB;YACE,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,0BAA0B;SACnC;KACF;IACD;QACE,oBAAoB;QACpB;YACE,2DAA2D;YAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB;YACnC,KAAK,EAAE,2BAA2B;YAClC,MAAM,EAAE,yBAAyB;SAClC;KACF;CACF,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,IAAY;IACtD,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,CACL,GAAG,IAAI,qDAAqD,QAAQ,CAAC,KAAK,IAAI;QAC9E,4CAA4C,IAAI,0BAA0B;QAC1E,GAAG,QAAQ,CAAC,MAAM,GAAG,CACtB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAY,EACZ,YAAgC;IAEhC,MAAM,QAAQ,GAAG,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `resolveUser` that is an endpoint. Kept apart from `resolve-user.ts`, which
|
|
3
|
+
* reaches Agent Auth, so `defineIdentity` can check one with no runtime
|
|
4
|
+
* dependency.
|
|
5
|
+
*/
|
|
6
|
+
import { type EventEndpoint } from "./http/endpoint.js";
|
|
7
|
+
import type { ResolveUser, ResolveUserRequest } from "./resolve-user.js";
|
|
8
|
+
/**
|
|
9
|
+
* A `resolveUser` that is an endpoint: a URL, or a `Request` that also carries
|
|
10
|
+
* headers, such as a credential the service checks. Before a delivery starts a
|
|
11
|
+
* run, MDA POSTs the {@link ResolveUserRequest} as JSON to the URL, with the
|
|
12
|
+
* `Request`'s headers, signed when the deployment has `MDA_SERVICE_SECRET`,
|
|
13
|
+
* with the webhook ID `msg_<deliveryId>_resolve_user`. The service answers
|
|
14
|
+
* with a `ResolveUserResult`, checked as a function's; `null` or HTTP 204
|
|
15
|
+
* keeps the channel's own principal. A network error, HTTP 429 or a 5xx is
|
|
16
|
+
* tried again once. Any other answer, a redirect, or no answer within 5
|
|
17
|
+
* seconds fails the delivery, as a function that throws does. A retry and a
|
|
18
|
+
* redelivery keep the webhook ID, so the service answers each request and
|
|
19
|
+
* never dedupes on it.
|
|
20
|
+
*/
|
|
21
|
+
export declare class ResolveUserEndpoint {
|
|
22
|
+
#private;
|
|
23
|
+
constructor(endpoint: EventEndpoint, label: string);
|
|
24
|
+
/** The service's answer about one delivery's sender, not yet checked. */
|
|
25
|
+
ask(request: ResolveUserRequest, deliveryId: string): Promise<unknown>;
|
|
26
|
+
}
|
|
27
|
+
/** A declared `resolveUser`: a function, or the service an endpoint names. */
|
|
28
|
+
export type ChannelResolveUser = ResolveUser | ResolveUserEndpoint;
|
|
29
|
+
/**
|
|
30
|
+
* A declared `resolveUser`, with an endpoint's URL and the deployment's secret
|
|
31
|
+
* checked; one that is neither a function nor an endpoint throws.
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkedResolveUser(resolveUser: unknown, owner: string): ChannelResolveUser | undefined;
|
|
34
|
+
//# sourceMappingURL=resolve-user-endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-user-endpoint.d.ts","sourceRoot":"","sources":["../../src/channels/resolve-user-endpoint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAazE;;;;;;;;;;;;GAYG;AACH,qBAAa,mBAAmB;;IAG9B,YAAY,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAEjD;IAED,yEAAyE;IACzE,GAAG,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMrE;CACF;AAED,8EAA8E;AAC9E,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,mBAAmB,CAAC;AAEnE;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,GACZ,kBAAkB,GAAG,SAAS,CAQhC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `resolveUser` that is an endpoint. Kept apart from `resolve-user.ts`, which
|
|
3
|
+
* reaches Agent Auth, so `defineIdentity` can check one with no runtime
|
|
4
|
+
* dependency.
|
|
5
|
+
*/
|
|
6
|
+
import { endpointClient, isEventEndpoint, } from "./http/endpoint.js";
|
|
7
|
+
/**
|
|
8
|
+
* The limits of a `resolveUser` endpoint. The delivery waits on it before MDA
|
|
9
|
+
* acknowledges it, and Trigger Server gives up on a delivery after 10 seconds,
|
|
10
|
+
* so two attempts share 5 seconds.
|
|
11
|
+
*/
|
|
12
|
+
const ENDPOINT_LIMITS = {
|
|
13
|
+
timeoutMs: 5_000,
|
|
14
|
+
total: true,
|
|
15
|
+
retryDelaysMs: [500],
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* A `resolveUser` that is an endpoint: a URL, or a `Request` that also carries
|
|
19
|
+
* headers, such as a credential the service checks. Before a delivery starts a
|
|
20
|
+
* run, MDA POSTs the {@link ResolveUserRequest} as JSON to the URL, with the
|
|
21
|
+
* `Request`'s headers, signed when the deployment has `MDA_SERVICE_SECRET`,
|
|
22
|
+
* with the webhook ID `msg_<deliveryId>_resolve_user`. The service answers
|
|
23
|
+
* with a `ResolveUserResult`, checked as a function's; `null` or HTTP 204
|
|
24
|
+
* keeps the channel's own principal. A network error, HTTP 429 or a 5xx is
|
|
25
|
+
* tried again once. Any other answer, a redirect, or no answer within 5
|
|
26
|
+
* seconds fails the delivery, as a function that throws does. A retry and a
|
|
27
|
+
* redelivery keep the webhook ID, so the service answers each request and
|
|
28
|
+
* never dedupes on it.
|
|
29
|
+
*/
|
|
30
|
+
export class ResolveUserEndpoint {
|
|
31
|
+
#ask;
|
|
32
|
+
constructor(endpoint, label) {
|
|
33
|
+
this.#ask = endpointClient(endpoint, label, "resolveUser endpoint");
|
|
34
|
+
}
|
|
35
|
+
/** The service's answer about one delivery's sender, not yet checked. */
|
|
36
|
+
ask(request, deliveryId) {
|
|
37
|
+
return this.#ask(`msg_${deliveryId}_resolve_user`, JSON.stringify(request), ENDPOINT_LIMITS);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A declared `resolveUser`, with an endpoint's URL and the deployment's secret
|
|
42
|
+
* checked; one that is neither a function nor an endpoint throws.
|
|
43
|
+
*/
|
|
44
|
+
export function checkedResolveUser(resolveUser, owner) {
|
|
45
|
+
if (resolveUser === undefined || typeof resolveUser === "function")
|
|
46
|
+
return resolveUser;
|
|
47
|
+
if (isEventEndpoint(resolveUser))
|
|
48
|
+
return new ResolveUserEndpoint(resolveUser, `${owner}(...) resolveUser`);
|
|
49
|
+
throw new TypeError(`${owner}(...) resolveUser must be a function or an endpoint URL`);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=resolve-user-endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-user-endpoint.js","sourceRoot":"","sources":["../../src/channels/resolve-user-endpoint.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,cAAc,EACd,eAAe,GAIhB,MAAM,oBAAoB,CAAC;AAG5B;;;;GAIG;AACH,MAAM,eAAe,GAAmB;IACtC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,IAAI;IACX,aAAa,EAAE,CAAC,GAAG,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,mBAAmB;IACrB,IAAI,CAAc;IAE3B,YAAY,QAAuB,EAAE,KAAa;QAChD,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC;IACtE,CAAC;IAED,yEAAyE;IACzE,GAAG,CAAC,OAA2B,EAAE,UAAkB;QACjD,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,UAAU,eAAe,EAChC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,eAAe,CAChB,CAAC;IACJ,CAAC;CACF;AAKD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAoB,EACpB,KAAa;IAEb,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,WAAW,KAAK,UAAU;QAChE,OAAO,WAAsC,CAAC;IAChD,IAAI,eAAe,CAAC,WAAW,CAAC;QAC9B,OAAO,IAAI,mBAAmB,CAAC,WAAW,EAAE,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC3E,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,yDAAyD,CAClE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { type ResolvePrincipalIdentity } from "../agent-auth.js";
|
|
2
|
+
import { type ChannelActor } from "./actor.js";
|
|
3
|
+
import { type ChannelResolveUser } from "./resolve-user-endpoint.js";
|
|
4
|
+
import { type ChannelMessagingAdapter } from "./runtime.js";
|
|
5
|
+
import type { ChannelMessage, JsonValue } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* What `resolveUser` gets: the verified sender of a channel delivery. An
|
|
8
|
+
* endpoint is POSTed it as JSON.
|
|
9
|
+
*
|
|
10
|
+
* @experimental This may change in a minor release.
|
|
11
|
+
*/
|
|
12
|
+
export interface ResolveUserRequest<A extends ChannelActor = ChannelActor> {
|
|
13
|
+
/** Absent when the channel could not verify who sent the delivery. */
|
|
14
|
+
actor?: A;
|
|
15
|
+
channel: {
|
|
16
|
+
name: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Who a channel delivery runs as.
|
|
21
|
+
*
|
|
22
|
+
* - `user`: one of your users. The run gets the principal a backend call with
|
|
23
|
+
* `auth: "backend"` gets for the same `id`.
|
|
24
|
+
* - `identity`: an exact Agent Auth identity, such as the IdP `sub` your web
|
|
25
|
+
* users sign in with.
|
|
26
|
+
* - `reply`: start nothing, and post `message` where the delivery came from, as
|
|
27
|
+
* `runtime.channel.post` would.
|
|
28
|
+
* - `ignore`: start nothing.
|
|
29
|
+
*
|
|
30
|
+
* `null` or `undefined` keeps the channel's own principal.
|
|
31
|
+
*
|
|
32
|
+
* @experimental This may change in a minor release.
|
|
33
|
+
*/
|
|
34
|
+
export type ResolveUserResult = {
|
|
35
|
+
type: "user";
|
|
36
|
+
id: string;
|
|
37
|
+
} | {
|
|
38
|
+
type: "identity";
|
|
39
|
+
provider: string;
|
|
40
|
+
issuer: string;
|
|
41
|
+
subject: string;
|
|
42
|
+
} | {
|
|
43
|
+
type: "reply";
|
|
44
|
+
message: ChannelMessage;
|
|
45
|
+
} | {
|
|
46
|
+
type: "ignore";
|
|
47
|
+
} | null | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Map a channel's verified sender to one of your users.
|
|
50
|
+
*
|
|
51
|
+
* @experimental This may change in a minor release.
|
|
52
|
+
*/
|
|
53
|
+
export type ResolveUser<A extends ChannelActor = ChannelActor> = (request: ResolveUserRequest<A>) => ResolveUserResult | Promise<ResolveUserResult>;
|
|
54
|
+
/**
|
|
55
|
+
* What a delivery does after `resolveUser`.
|
|
56
|
+
*
|
|
57
|
+
* @experimental This may change in a minor release.
|
|
58
|
+
*/
|
|
59
|
+
export type ChannelUser = {
|
|
60
|
+
type: "principal";
|
|
61
|
+
id: string;
|
|
62
|
+
} | {
|
|
63
|
+
type: "reply";
|
|
64
|
+
message: ChannelMessage;
|
|
65
|
+
} | {
|
|
66
|
+
type: "ignore";
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Ask `resolveUser` about the actor of delivery `deliveryId`; `undefined` keeps
|
|
70
|
+
* the channel's principal.
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveChannelUser(resolveUser: ChannelResolveUser | undefined, actor: ChannelActor | undefined, channelName: string, deliveryId: string, resolvePrincipal?: (identity: ResolvePrincipalIdentity) => Promise<string>): Promise<ChannelUser | undefined>;
|
|
73
|
+
/**
|
|
74
|
+
* The principal a webhook channel's sender runs as when no `resolveUser` maps
|
|
75
|
+
* them, from {@link actorIdentity}; `undefined` runs the delivery as the
|
|
76
|
+
* channel. Unlike a mapped user's, it owns no user connections: whoever
|
|
77
|
+
* completes a connection's sign-in from a public thread would attach their
|
|
78
|
+
* account to it. Without Agent Auth (`mda dev` without a LangSmith key) the
|
|
79
|
+
* channel's own user ID stays.
|
|
80
|
+
*/
|
|
81
|
+
export declare function senderPrincipalId(actor: ChannelActor | undefined, resolvePrincipal?: (identity: ResolvePrincipalIdentity) => Promise<string>): Promise<string | undefined>;
|
|
82
|
+
/** Set a channel's own `resolveUser`, which overrides the identity's. */
|
|
83
|
+
export declare function withResolveUser<C extends object>(channel: C, resolveUser: unknown, owner: string): C;
|
|
84
|
+
/**
|
|
85
|
+
* Post `resolveUser`'s reply through the path `runtime.channel.post` takes,
|
|
86
|
+
* once per `deliveryKey`.
|
|
87
|
+
*/
|
|
88
|
+
export declare function postReply(message: ChannelMessage, channel: {
|
|
89
|
+
name: string;
|
|
90
|
+
provider: string;
|
|
91
|
+
target: JsonValue;
|
|
92
|
+
transport: ChannelMessagingAdapter | undefined;
|
|
93
|
+
deliveryKey?: string;
|
|
94
|
+
}): Promise<void>;
|
|
95
|
+
//# sourceMappingURL=resolve-user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-user.d.ts","sourceRoot":"","sources":["../../src/channels/resolve-user.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK9D,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACvE,sEAAsE;IACtE,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB,IAAI,GACJ,SAAS,CAAC;AAEd;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,CAC/D,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAC3B,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAiBpD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,kBAAkB,GAAG,SAAS,EAC3C,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,gBAAgB,GAAE,CAChB,QAAQ,EAAE,wBAAwB,KAC/B,OAAO,CAAC,MAAM,CAA8B,GAChD,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAqClC;AAKD;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,gBAAgB,GAAE,CAChB,QAAQ,EAAE,wBAAwB,KAC/B,OAAO,CAAC,MAAM,CAA8B,GAChD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe7B;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAC9C,OAAO,EAAE,CAAC,EACV,WAAW,EAAE,OAAO,EACpB,KAAK,EAAE,MAAM,GACZ,CAAC,CAQH;AAMD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACA,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ConnectionsNotConfiguredError, WORKSPACE_SETTING, } from "../agent-auth.js";
|
|
3
|
+
import { resolveExternalPrincipalId, TRUSTED_BACKEND_PROVIDER, } from "../connections.js";
|
|
4
|
+
import { resolveWorkspaceId } from "../runtime/langsmith-env.js";
|
|
5
|
+
import { logger } from "../runtime/log.js";
|
|
6
|
+
import { actorIdentity } from "./actor.js";
|
|
7
|
+
import { channelMessageSchema, nonblankStringSchema, } from "./message-schema.js";
|
|
8
|
+
import { checkedResolveUser, ResolveUserEndpoint, } from "./resolve-user-endpoint.js";
|
|
9
|
+
import { createRuntimeChannel, } from "./runtime.js";
|
|
10
|
+
/** A result `resolveUser` returns, or an endpoint answers, other than `null`. */
|
|
11
|
+
const resultSchema = z.discriminatedUnion("type", [
|
|
12
|
+
z.strictObject({ type: z.literal("user"), id: nonblankStringSchema }),
|
|
13
|
+
z.strictObject({
|
|
14
|
+
type: z.literal("identity"),
|
|
15
|
+
provider: nonblankStringSchema,
|
|
16
|
+
issuer: nonblankStringSchema,
|
|
17
|
+
subject: nonblankStringSchema,
|
|
18
|
+
}),
|
|
19
|
+
z.strictObject({ type: z.literal("reply"), message: channelMessageSchema }),
|
|
20
|
+
z.strictObject({ type: z.literal("ignore") }),
|
|
21
|
+
]);
|
|
22
|
+
const RESULT_SHAPE = 'resolveUser must return { type: "user", id }, { type: "identity", provider, issuer, subject }, { type: "reply", message }, { type: "ignore" } or null';
|
|
23
|
+
/**
|
|
24
|
+
* Ask `resolveUser` about the actor of delivery `deliveryId`; `undefined` keeps
|
|
25
|
+
* the channel's principal.
|
|
26
|
+
*/
|
|
27
|
+
export async function resolveChannelUser(resolveUser, actor, channelName, deliveryId, resolvePrincipal = resolveExternalPrincipalId) {
|
|
28
|
+
if (!resolveUser)
|
|
29
|
+
return undefined;
|
|
30
|
+
const request = {
|
|
31
|
+
...(actor && { actor }),
|
|
32
|
+
channel: { name: channelName },
|
|
33
|
+
};
|
|
34
|
+
const answer = resolveUser instanceof ResolveUserEndpoint
|
|
35
|
+
? await resolveUser.ask(request, deliveryId)
|
|
36
|
+
: await resolveUser(request);
|
|
37
|
+
if (answer === null || answer === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
// An endpoint's answer is any JSON, and a function's is checked the same way.
|
|
40
|
+
const parsed = resultSchema.safeParse(answer);
|
|
41
|
+
if (!parsed.success)
|
|
42
|
+
throw new TypeError(RESULT_SHAPE);
|
|
43
|
+
const result = parsed.data;
|
|
44
|
+
switch (result.type) {
|
|
45
|
+
case "user":
|
|
46
|
+
return {
|
|
47
|
+
type: "principal",
|
|
48
|
+
id: await resolvePrincipal(appUserIdentity(result.id)),
|
|
49
|
+
};
|
|
50
|
+
case "identity":
|
|
51
|
+
return {
|
|
52
|
+
type: "principal",
|
|
53
|
+
id: await resolvePrincipal({
|
|
54
|
+
provider: result.provider,
|
|
55
|
+
issuer: result.issuer,
|
|
56
|
+
subject: result.subject,
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
case "reply":
|
|
60
|
+
return { type: "reply", message: result.message };
|
|
61
|
+
case "ignore":
|
|
62
|
+
return { type: "ignore" };
|
|
63
|
+
default:
|
|
64
|
+
throw new TypeError(RESULT_SHAPE);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Whether the fallback without Agent Auth was logged already. */
|
|
68
|
+
let loggedSenderFallback = false;
|
|
69
|
+
/**
|
|
70
|
+
* The principal a webhook channel's sender runs as when no `resolveUser` maps
|
|
71
|
+
* them, from {@link actorIdentity}; `undefined` runs the delivery as the
|
|
72
|
+
* channel. Unlike a mapped user's, it owns no user connections: whoever
|
|
73
|
+
* completes a connection's sign-in from a public thread would attach their
|
|
74
|
+
* account to it. Without Agent Auth (`mda dev` without a LangSmith key) the
|
|
75
|
+
* channel's own user ID stays.
|
|
76
|
+
*/
|
|
77
|
+
export async function senderPrincipalId(actor, resolvePrincipal = resolveExternalPrincipalId) {
|
|
78
|
+
const identity = actor && actorIdentity(actor);
|
|
79
|
+
if (!identity)
|
|
80
|
+
return undefined;
|
|
81
|
+
try {
|
|
82
|
+
return await resolvePrincipal(identity);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (!(error instanceof ConnectionsNotConfiguredError))
|
|
86
|
+
throw error;
|
|
87
|
+
if (!loggedSenderFallback) {
|
|
88
|
+
loggedSenderFallback = true;
|
|
89
|
+
logger.warn(`channel senders keep the channel's user ID: ${error.message}`);
|
|
90
|
+
}
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** Set a channel's own `resolveUser`, which overrides the identity's. */
|
|
95
|
+
export function withResolveUser(channel, resolveUser, owner) {
|
|
96
|
+
const checked = checkedResolveUser(resolveUser, owner);
|
|
97
|
+
if (checked === undefined)
|
|
98
|
+
return channel;
|
|
99
|
+
Object.defineProperty(channel, "resolveUser", {
|
|
100
|
+
value: checked,
|
|
101
|
+
enumerable: false,
|
|
102
|
+
});
|
|
103
|
+
return channel;
|
|
104
|
+
}
|
|
105
|
+
/** Deliveries already replied to; a provider may redeliver one. */
|
|
106
|
+
const repliedDeliveries = new Set();
|
|
107
|
+
const REPLIED_DELIVERIES_KEPT = 1000;
|
|
108
|
+
/**
|
|
109
|
+
* Post `resolveUser`'s reply through the path `runtime.channel.post` takes,
|
|
110
|
+
* once per `deliveryKey`.
|
|
111
|
+
*/
|
|
112
|
+
export async function postReply(message, channel) {
|
|
113
|
+
const { deliveryKey, ...route } = channel;
|
|
114
|
+
if (deliveryKey !== undefined) {
|
|
115
|
+
if (repliedDeliveries.has(deliveryKey))
|
|
116
|
+
return;
|
|
117
|
+
repliedDeliveries.add(deliveryKey);
|
|
118
|
+
if (repliedDeliveries.size > REPLIED_DELIVERIES_KEPT)
|
|
119
|
+
repliedDeliveries.delete(repliedDeliveries.values().next().value);
|
|
120
|
+
}
|
|
121
|
+
const { post } = createRuntimeChannel({ ...route, event: null });
|
|
122
|
+
if (!post) {
|
|
123
|
+
logger.warn("channel cannot post resolveUser's reply");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
await post(message);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger.error(`channel resolveUser reply failed (${logger.safeErrorLabel(error)})`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function appUserIdentity(id) {
|
|
134
|
+
const workspaceId = resolveWorkspaceId();
|
|
135
|
+
if (!workspaceId)
|
|
136
|
+
throw new ConnectionsNotConfiguredError(WORKSPACE_SETTING);
|
|
137
|
+
return {
|
|
138
|
+
provider: TRUSTED_BACKEND_PROVIDER,
|
|
139
|
+
issuer: workspaceId,
|
|
140
|
+
subject: id,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=resolve-user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-user.js","sourceRoot":"","sources":["../../src/channels/resolve-user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a channel handler starts a run with, in the shapes `agent.invoke`
|
|
3
|
+
* takes, normalized to the JSON the Agent Server accepts.
|
|
4
|
+
*/
|
|
5
|
+
import { type BaseMessage, type BaseMessageLike } from "@langchain/core/messages";
|
|
6
|
+
import type { LangGraphRunnableConfig } from "@langchain/langgraph";
|
|
7
|
+
import type { JsonObject } from "./manifest.js";
|
|
8
|
+
import type { JsonValue } from "./types.js";
|
|
9
|
+
/**
|
|
10
|
+
* State to start a run with, as `agent.invoke` takes it: `messages` plus any
|
|
11
|
+
* other keys of the agent's state.
|
|
12
|
+
*/
|
|
13
|
+
export interface ChannelStateInput {
|
|
14
|
+
messages?: BaseMessageLike[];
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
/** A user message's text, a message, or state to start a run with. */
|
|
18
|
+
export type ChannelRunInput = string | BaseMessage | ChannelStateInput;
|
|
19
|
+
/**
|
|
20
|
+
* Run options a handler may set with its input, as `agent.invoke` takes them.
|
|
21
|
+
*
|
|
22
|
+
* @experimental This may change in a minor release.
|
|
23
|
+
*/
|
|
24
|
+
export type ChannelRunOptions = Pick<LangGraphRunnableConfig<Record<string, unknown>>, "context"> & {
|
|
25
|
+
/**
|
|
26
|
+
* Metadata for the run, such as where it came from, to find it by in
|
|
27
|
+
* LangSmith. Keys are letters, digits, `_`, `.` or `-` and start with a
|
|
28
|
+
* letter. Keys the Agent Server and LangSmith set are reserved: those
|
|
29
|
+
* starting with `mda_`, `langgraph_` or `ls_`, and ids such as `thread_id`,
|
|
30
|
+
* `session_id`, `run_id` or `user_id`.
|
|
31
|
+
*/
|
|
32
|
+
metadata?: {
|
|
33
|
+
readonly [key: string]: JsonValue;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* A URL the Agent Server POSTs the finished run to (its status, metadata,
|
|
37
|
+
* values and any error), as LangGraph's `runs.create({ webhook })` does:
|
|
38
|
+
* from the server, so it reaches you even if the deployment restarts.
|
|
39
|
+
* http(s), without credentials in it.
|
|
40
|
+
*/
|
|
41
|
+
webhook?: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* What a channel handler may return to start a run: the input, or the input
|
|
45
|
+
* with run options, as `agent.invoke(input, options)` takes them.
|
|
46
|
+
*
|
|
47
|
+
* @experimental This may change in a minor release.
|
|
48
|
+
*/
|
|
49
|
+
export type ChannelRunResult = ChannelRunInput | readonly [ChannelRunInput, ChannelRunOptions];
|
|
50
|
+
/** A handler's result as the Agent Server takes it. */
|
|
51
|
+
export interface NormalizedRunInput {
|
|
52
|
+
/** Messages as JSON, each with a `role`. */
|
|
53
|
+
messages: JsonObject[];
|
|
54
|
+
/** Other state keys. */
|
|
55
|
+
state: JsonObject;
|
|
56
|
+
context?: JsonObject;
|
|
57
|
+
metadata?: JsonObject;
|
|
58
|
+
webhook?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A handler's run input as `startIngressRun` takes it, with MDA's own
|
|
62
|
+
* `metadata` over the handler's, so a handler can't replace it. Empty state
|
|
63
|
+
* and metadata are left out.
|
|
64
|
+
*/
|
|
65
|
+
export declare function runStartOptions(input: NormalizedRunInput, metadata?: JsonObject): {
|
|
66
|
+
messages: JsonObject[];
|
|
67
|
+
state?: JsonObject;
|
|
68
|
+
metadata?: JsonObject;
|
|
69
|
+
webhook?: string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Run input MDA starts no run with. Its `reason`, which is also its message,
|
|
73
|
+
* says what is wrong in a fixed phrase. A key or type it names is bounded to
|
|
74
|
+
* one log line, so the channel logs the reason, where it logs no other
|
|
75
|
+
* error's message. A `TypeError`, as invalid run input threw before.
|
|
76
|
+
*/
|
|
77
|
+
export declare class InvalidRunInput extends TypeError {
|
|
78
|
+
/** Why MDA refused the input, such as `run metadata key is reserved: user_id`. */
|
|
79
|
+
readonly reason: string;
|
|
80
|
+
constructor(reason: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Normalize what a handler returned. `null` and `undefined` start nothing;
|
|
84
|
+
* anything else that is not valid input throws an {@link InvalidRunInput}, a
|
|
85
|
+
* `TypeError`. A run option that is `null` or `undefined` is not set.
|
|
86
|
+
*/
|
|
87
|
+
export declare function normalizeRunInput(value: unknown): NormalizedRunInput | undefined;
|
|
88
|
+
//# sourceMappingURL=run-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-input.d.ts","sourceRoot":"","sources":["../../src/channels/run-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,eAAe,EAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAEvE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAChD,SAAS,CACV,GAAG;IACF;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACjD;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAElD,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,4CAA4C;IAC5C,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,wBAAwB;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,GAAE,UAAe,GACxB;IACD,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAQA;AASD;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YAAY,MAAM,EAAE,MAAM,EAIzB;CACF;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,kBAAkB,GAAG,SAAS,CAsBhC"}
|