managed-deepagents 0.10.0-dev.8 → 0.10.0
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 +881 -139
- 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 +81 -4
- 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/index.d.ts +5 -1
- package/dist/channels/github/index.d.ts.map +1 -1
- package/dist/channels/github/index.js +49 -51
- package/dist/channels/github/index.js.map +1 -1
- 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 +271 -0
- package/dist/channels/github/schema.d.ts.map +1 -1
- package/dist/channels/github/schema.js +33 -0
- package/dist/channels/github/schema.js.map +1 -1
- package/dist/channels/github/types.d.ts +55 -15
- package/dist/channels/github/types.d.ts.map +1 -1
- 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 +240 -95
- package/dist/channels/http/http.js.map +1 -1
- package/dist/channels/http/index.d.ts +7 -1
- package/dist/channels/http/index.d.ts.map +1 -1
- package/dist/channels/http/index.js +32 -32
- package/dist/channels/http/index.js.map +1 -1
- package/dist/channels/http/ingress.d.ts +30 -24
- package/dist/channels/http/ingress.d.ts.map +1 -1
- package/dist/channels/http/ingress.js +61 -57
- package/dist/channels/http/ingress.js.map +1 -1
- package/dist/channels/http/provider.d.ts +51 -9
- package/dist/channels/http/provider.d.ts.map +1 -1
- package/dist/channels/http/provider.js +66 -15
- package/dist/channels/http/provider.js.map +1 -1
- package/dist/channels/http/studio.d.ts +14 -5
- package/dist/channels/http/studio.d.ts.map +1 -1
- package/dist/channels/http/studio.js +20 -5
- package/dist/channels/http/studio.js.map +1 -1
- package/dist/channels/http/types.d.ts +110 -56
- 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/index.d.ts +5 -1
- package/dist/channels/linear/index.d.ts.map +1 -1
- package/dist/channels/linear/index.js +75 -93
- package/dist/channels/linear/index.js.map +1 -1
- package/dist/channels/linear/schema.d.ts +11 -25
- package/dist/channels/linear/schema.d.ts.map +1 -1
- package/dist/channels/linear/schema.js +6 -0
- package/dist/channels/linear/schema.js.map +1 -1
- package/dist/channels/linear/types.d.ts +38 -16
- package/dist/channels/linear/types.d.ts.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.map +1 -1
- package/dist/channels/reserved-connections.js +10 -0
- package/dist/channels/reserved-connections.js.map +1 -1
- 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 +46 -4
- package/dist/channels/run-input.d.ts.map +1 -1
- package/dist/channels/run-input.js +94 -30
- package/dist/channels/run-input.js.map +1 -1
- 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 +9 -76
- 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/trigger/client.d.ts.map +1 -1
- package/dist/channels/trigger/client.js +9 -11
- 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 +419 -82
- package/dist/channels/trigger/http.js.map +1 -1
- package/dist/channels/trigger/identity-context.d.ts +1 -1
- package/dist/channels/trigger/identity-context.d.ts.map +1 -1
- package/dist/channels/trigger/identity-context.js +3 -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 +141 -9
- 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/concurrency/batch-processor.d.ts +51 -0
- package/dist/concurrency/batch-processor.d.ts.map +1 -0
- package/dist/concurrency/batch-processor.js +99 -0
- package/dist/concurrency/batch-processor.js.map +1 -0
- package/dist/connections.d.ts +5 -12
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +28 -30
- package/dist/connections.js.map +1 -1
- package/dist/connectors/mcp/langsmith-url.d.ts.map +1 -1
- package/dist/connectors/mcp/langsmith-url.js +0 -1
- package/dist/connectors/mcp/langsmith-url.js.map +1 -1
- package/dist/credential-gate.js +3 -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 +7 -2
- package/dist/identity/loopback.d.ts.map +1 -1
- package/dist/identity/loopback.js +15 -4
- 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 +15 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/ingress/index.d.ts +8 -0
- package/dist/ingress/index.d.ts.map +1 -1
- package/dist/ingress/index.js +32 -2
- package/dist/ingress/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 +27 -1
- package/dist/ingress/runs.d.ts.map +1 -1
- package/dist/ingress/runs.js +69 -6
- 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/memory/instructions-middleware.d.ts.map +1 -1
- package/dist/memory/instructions-middleware.js +6 -5
- package/dist/memory/instructions-middleware.js.map +1 -1
- package/dist/namespaces.d.ts +4 -21
- package/dist/namespaces.d.ts.map +1 -1
- package/dist/namespaces.js +0 -29
- package/dist/namespaces.js.map +1 -1
- package/dist/resilience/retry.d.ts +21 -0
- package/dist/resilience/retry.d.ts.map +1 -0
- package/dist/resilience/retry.js +40 -0
- package/dist/resilience/retry.js.map +1 -0
- 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 +1 -2
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +138 -72
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/backend.d.ts +9 -1
- package/dist/runtime/backend.d.ts.map +1 -1
- package/dist/runtime/backend.js +36 -11
- 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 +507 -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 +138 -0
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +802 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/channel-icon.d.ts.map +1 -1
- package/dist/runtime/channel-icon.js +18 -7
- package/dist/runtime/channel-icon.js.map +1 -1
- package/dist/runtime/channel.d.ts +5 -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/http.d.ts +15 -0
- package/dist/runtime/http.d.ts.map +1 -1
- package/dist/runtime/http.js +37 -0
- package/dist/runtime/http.js.map +1 -1
- package/dist/runtime/identity-http.d.ts.map +1 -1
- package/dist/runtime/identity-http.js +19 -7
- package/dist/runtime/identity-http.js.map +1 -1
- package/dist/runtime/identity-runtime.d.ts +4 -9
- package/dist/runtime/identity-runtime.d.ts.map +1 -1
- package/dist/runtime/identity-runtime.js +12 -25
- 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 +104 -52
- 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/log.d.ts +8 -14
- package/dist/runtime/log.d.ts.map +1 -1
- package/dist/runtime/log.js +16 -7
- package/dist/runtime/log.js.map +1 -1
- package/dist/runtime/managed-middleware.d.ts.map +1 -1
- package/dist/runtime/managed-middleware.js +1 -14
- package/dist/runtime/managed-middleware.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 +18 -2
- package/dist/runtime/managed-tools.d.ts.map +1 -1
- package/dist/runtime/managed-tools.js +26 -22
- package/dist/runtime/managed-tools.js.map +1 -1
- package/dist/runtime/memory/mounts.d.ts +82 -11
- package/dist/runtime/memory/mounts.d.ts.map +1 -1
- package/dist/runtime/memory/mounts.js +173 -34
- package/dist/runtime/memory/mounts.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 +118 -7
- package/dist/runtime/run-input.js.map +1 -1
- package/dist/runtime/sandbox-manager.d.ts +31 -17
- package/dist/runtime/sandbox-manager.d.ts.map +1 -1
- package/dist/runtime/sandbox-manager.js +112 -70
- 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/selected-skills-backend.d.ts +3 -3
- package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
- package/dist/runtime/selected-skills-backend.js +5 -5
- package/dist/runtime/selected-skills-backend.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 +85 -23
- 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/lifecycle.d.ts +26 -0
- package/dist/telemetry/lifecycle.d.ts.map +1 -0
- package/dist/telemetry/lifecycle.js +49 -0
- package/dist/telemetry/lifecycle.js.map +1 -0
- 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/context.d.ts +57 -0
- package/dist/telemetry/otel/context.d.ts.map +1 -0
- package/dist/telemetry/otel/context.js +122 -0
- package/dist/telemetry/otel/context.js.map +1 -0
- package/dist/telemetry/otel/exporter.d.ts +53 -0
- package/dist/telemetry/otel/exporter.d.ts.map +1 -0
- package/dist/telemetry/otel/exporter.js +190 -0
- package/dist/telemetry/otel/exporter.js.map +1 -0
- package/dist/telemetry/otel/index.d.ts +6 -0
- package/dist/telemetry/otel/index.d.ts.map +1 -0
- package/dist/telemetry/otel/index.js +3 -0
- package/dist/telemetry/otel/index.js.map +1 -0
- package/dist/telemetry/otel/otlp.d.ts +44 -0
- package/dist/telemetry/otel/otlp.d.ts.map +1 -0
- package/dist/telemetry/otel/otlp.js +7 -0
- package/dist/telemetry/otel/otlp.js.map +1 -0
- package/dist/telemetry/otel/truncate.d.ts +10 -0
- package/dist/telemetry/otel/truncate.d.ts.map +1 -0
- package/dist/telemetry/otel/truncate.js +39 -0
- package/dist/telemetry/otel/truncate.js.map +1 -0
- package/dist/telemetry/run-listener.d.ts +1 -1
- package/dist/telemetry/run-listener.d.ts.map +1 -1
- package/dist/telemetry/run-listener.js +32 -2
- package/dist/telemetry/run-listener.js.map +1 -1
- package/dist/telemetry/transport/posthog.d.ts +13 -1
- package/dist/telemetry/transport/posthog.d.ts.map +1 -1
- package/dist/telemetry/transport/posthog.js +68 -30
- package/dist/telemetry/transport/posthog.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
- package/dist/channels/http/forward.d.ts +0 -13
- package/dist/channels/http/forward.d.ts.map +0 -1
- package/dist/channels/http/forward.js +0 -128
- package/dist/channels/http/forward.js.map +0 -1
- package/dist/channels/http/reply.d.ts +0 -20
- package/dist/channels/http/reply.d.ts.map +0 -1
- package/dist/channels/http/reply.js +0 -116
- package/dist/channels/http/reply.js.map +0 -1
|
@@ -1,29 +1,23 @@
|
|
|
1
1
|
import { immutableCopy } from "../runtime.js";
|
|
2
2
|
import { handleHttpRequest } from "./http.js";
|
|
3
|
+
import { MULTITASK_STRATEGIES } from "../../ingress/runs.js";
|
|
3
4
|
import { CHANNEL_BRAND, } from "../../runtime/channel.js";
|
|
5
|
+
import { requireNonblank } from "../../values.js";
|
|
6
|
+
import { CHANNEL_REPLIES } from "../types.js";
|
|
4
7
|
export { channelThreadId } from "./threads.js";
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"rollback",
|
|
9
|
-
"reject",
|
|
10
|
-
]);
|
|
11
|
-
const INTERRUPTED_REASONS = new Set([
|
|
12
|
-
"waiting",
|
|
13
|
-
"stopped",
|
|
14
|
-
]);
|
|
8
|
+
const STRATEGIES = new Set(Object.values(MULTITASK_STRATEGIES));
|
|
9
|
+
/** Where a channel keeps the connections its setup provides, out of its public shape. */
|
|
10
|
+
const AGENT_CONNECTIONS = Symbol("mda.agentConnections");
|
|
15
11
|
export function httpChannel(adapter) {
|
|
16
|
-
const provider =
|
|
12
|
+
const provider = requireNonblank(adapter.provider, "channels.http provider");
|
|
17
13
|
if (adapter.multitaskStrategy !== undefined &&
|
|
18
|
-
!
|
|
14
|
+
!STRATEGIES.has(adapter.multitaskStrategy))
|
|
19
15
|
throw new TypeError("channel multitaskStrategy must be enqueue, interrupt, rollback or reject");
|
|
20
|
-
if (adapter.
|
|
21
|
-
(
|
|
22
|
-
adapter.interruptedReasons.length === 0 ||
|
|
23
|
-
!adapter.interruptedReasons.every((reason) => INTERRUPTED_REASONS.has(reason))))
|
|
24
|
-
throw new TypeError('channel interruptedReasons must list "waiting", "stopped" or both');
|
|
16
|
+
if (adapter.reply !== undefined && !CHANNEL_REPLIES.includes(adapter.reply))
|
|
17
|
+
throw new TypeError("channel reply must be auto or none");
|
|
25
18
|
const channel = { kind: provider };
|
|
26
19
|
hide(channel, CHANNEL_BRAND, true);
|
|
20
|
+
hide(channel, "reply", adapter.reply ?? "auto");
|
|
27
21
|
hide(channel, "events", (ctx) => handleHttpRequest(ctx, adapter));
|
|
28
22
|
const post = adapter.post?.bind(adapter);
|
|
29
23
|
if (post) {
|
|
@@ -35,23 +29,29 @@ export function httpChannel(adapter) {
|
|
|
35
29
|
})),
|
|
36
30
|
}));
|
|
37
31
|
}
|
|
38
|
-
hide(channel, "requirements", (name) =>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
32
|
+
hide(channel, "requirements", (name) => {
|
|
33
|
+
const agentConnections = channel[AGENT_CONNECTIONS];
|
|
34
|
+
return {
|
|
35
|
+
name,
|
|
36
|
+
provider,
|
|
37
|
+
eventsPath: `/channels/${name}/events`,
|
|
38
|
+
autoReply: post !== undefined && adapter.reply !== "none",
|
|
39
|
+
requiredPermissions: [],
|
|
40
|
+
requiredEnv: [],
|
|
41
|
+
...(agentConnections && { agentConnections: [...agentConnections] }),
|
|
42
|
+
providerConfig: immutableCopy(adapter.providerConfig ?? {}),
|
|
43
|
+
};
|
|
44
|
+
});
|
|
47
45
|
return channel;
|
|
48
46
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Declare the `mda/` agent connections a built-in channel's setup provides,
|
|
49
|
+
* such as `mda/github-token`, so deploy knows them. Internal:
|
|
50
|
+
* `channels.http()` provides none.
|
|
51
|
+
*/
|
|
52
|
+
export function withAgentConnections(channel, slugs) {
|
|
53
|
+
hide(channel, AGENT_CONNECTIONS, [...slugs]);
|
|
54
|
+
return channel;
|
|
55
55
|
}
|
|
56
56
|
function hide(target, key, value) {
|
|
57
57
|
Object.defineProperty(target, key, { value, enumerable: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/http/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAgC,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/channels/http/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
+
import type { Interrupt } from "@langchain/langgraph-sdk";
|
|
1
2
|
import type { MultitaskStrategy } from "../../ingress/runs.js";
|
|
2
3
|
import { type MessageContent } from "@langchain/core/messages";
|
|
3
|
-
import type
|
|
4
|
+
import { type ChannelBinding } from "../binding.js";
|
|
4
5
|
import { type StartedIngressRun } from "../../ingress/runs.js";
|
|
5
|
-
import type
|
|
6
|
+
import { type NormalizedRunInput } from "../run-input.js";
|
|
7
|
+
import type { HttpRunStatus } from "./types.js";
|
|
6
8
|
interface HttpIngressSource {
|
|
7
9
|
userId: string;
|
|
10
|
+
/** The Agent Auth principal `resolveUser` chose for the sender. */
|
|
11
|
+
principalId?: string;
|
|
8
12
|
sourceThreadKey: string;
|
|
9
13
|
binding: ChannelBinding;
|
|
10
14
|
sourceProvider?: ChannelBinding["provider"];
|
|
@@ -31,6 +35,8 @@ export type HttpIngressStart = StartedIngressRun | {
|
|
|
31
35
|
skipped: "paused";
|
|
32
36
|
/** The paused thread's assistant, for links into LangSmith Studio. */
|
|
33
37
|
assistantId?: string;
|
|
38
|
+
/** What the thread waits on. */
|
|
39
|
+
interrupts: Interrupt[];
|
|
34
40
|
} | {
|
|
35
41
|
skipped: "duplicate" | "busy" | "rejected" | "ignored";
|
|
36
42
|
};
|
|
@@ -38,6 +44,16 @@ export type HttpIngressStart = StartedIngressRun | {
|
|
|
38
44
|
export declare function waitForHttpIngressThread(input: HttpIngressSource & {
|
|
39
45
|
threadId: string;
|
|
40
46
|
}): Promise<void>;
|
|
47
|
+
/** What the thread waits on now, and its assistant, for links into LangSmith Studio. */
|
|
48
|
+
export declare function httpIngressThreadWaitsOn(input: {
|
|
49
|
+
userId: string;
|
|
50
|
+
sourceThreadKey: string;
|
|
51
|
+
sourceProvider: string;
|
|
52
|
+
threadId: string;
|
|
53
|
+
}): Promise<{
|
|
54
|
+
interrupts: Interrupt[];
|
|
55
|
+
assistantId?: string;
|
|
56
|
+
}>;
|
|
41
57
|
/**
|
|
42
58
|
* Cancel the thread's queued and running runs, keeping their progress.
|
|
43
59
|
* Returns the IDs of the runs it cancelled.
|
|
@@ -49,29 +65,19 @@ export declare function cancelHttpIngressRuns(input: {
|
|
|
49
65
|
threadId: string;
|
|
50
66
|
}): Promise<string[]>;
|
|
51
67
|
export declare function startHttpIngressAgent(input: StartHttpIngressInput): Promise<HttpIngressStart>;
|
|
52
|
-
/** How a
|
|
53
|
-
export
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
| {
|
|
60
|
-
type: "paused";
|
|
68
|
+
/** How a run a channel started ended, in LangGraph's terms. */
|
|
69
|
+
export interface HttpIngressOutcome {
|
|
70
|
+
/** The run's status; one a newer message's `rollback` deleted reads as `interrupted`. */
|
|
71
|
+
status: HttpRunStatus;
|
|
72
|
+
/** The thread's pending interrupts once it ended: what it now waits on. */
|
|
73
|
+
interrupts: Interrupt[];
|
|
74
|
+
/** The thread's assistant, for links into LangSmith Studio. */
|
|
61
75
|
assistantId?: string;
|
|
62
76
|
}
|
|
63
|
-
/**
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
| {
|
|
69
|
-
type: "replaced";
|
|
70
|
-
}
|
|
71
|
-
/** It failed. */
|
|
72
|
-
| {
|
|
73
|
-
type: "failed";
|
|
74
|
-
};
|
|
75
|
-
export declare function observeHttpIngressAgent(input: HttpIngressSource & StartedIngressRun): Promise<HttpIngressOutcome>;
|
|
77
|
+
/**
|
|
78
|
+
* How the run ended, or `undefined` when it hasn't, as observing it stopped
|
|
79
|
+
* while it was still `pending` or `running`: it may still answer.
|
|
80
|
+
*/
|
|
81
|
+
export declare function observeHttpIngressAgent(input: HttpIngressSource & StartedIngressRun): Promise<HttpIngressOutcome | undefined>;
|
|
76
82
|
export {};
|
|
77
83
|
//# sourceMappingURL=ingress.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,17 +4,29 @@ import { HumanMessage, } from "@langchain/core/messages";
|
|
|
4
4
|
import { logger } from "../../runtime/log.js";
|
|
5
5
|
import { buildIngressRunContext } from "../../ingress/index.js";
|
|
6
6
|
import { ChannelError } from "../errors.js";
|
|
7
|
+
import { bindingWithMessages } from "../binding.js";
|
|
7
8
|
import { createIngressLoopbackClient, hasLoopbackCredential, } from "../../ingress/loopback.js";
|
|
8
|
-
import { DELIVERY_KEY_METADATA, cancelIngressRuns, ingressThreadState, lookupStatus, startIngressRun, waitForIdleThread, observeIngressRun, recordThreadDelivery, } from "../../ingress/runs.js";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
import { DELIVERY_KEY_METADATA, cancelIngressRuns, ingressThreadState, lookupStatus, rejectedAsBusy, startIngressRun, waitForIdleThread, observeIngressRun, recordThreadDelivery, } from "../../ingress/runs.js";
|
|
10
|
+
import { runStartOptions } from "../run-input.js";
|
|
11
|
+
function sourceClient(input) {
|
|
12
|
+
return createIngressLoopbackClient({
|
|
12
13
|
userId: input.userId,
|
|
13
14
|
sourceThreadKey: input.sourceThreadKey,
|
|
14
15
|
sourceProvider: input.sourceProvider ?? input.binding.provider,
|
|
16
|
+
...(input.principalId && { principalId: input.principalId }),
|
|
15
17
|
});
|
|
18
|
+
}
|
|
19
|
+
/** Wait until the thread's queued and running runs have finished. */
|
|
20
|
+
export async function waitForHttpIngressThread(input) {
|
|
21
|
+
const client = sourceClient(input);
|
|
16
22
|
await waitForIdleThread(client, input.threadId);
|
|
17
23
|
}
|
|
24
|
+
/** What the thread waits on now, and its assistant, for links into LangSmith Studio. */
|
|
25
|
+
export async function httpIngressThreadWaitsOn(input) {
|
|
26
|
+
const client = createIngressLoopbackClient(input);
|
|
27
|
+
const { interrupts, assistantId } = await ingressThreadState(client, input.threadId);
|
|
28
|
+
return { interrupts, ...(assistantId !== undefined && { assistantId }) };
|
|
29
|
+
}
|
|
18
30
|
/**
|
|
19
31
|
* Cancel the thread's queued and running runs, keeping their progress.
|
|
20
32
|
* Returns the IDs of the runs it cancelled.
|
|
@@ -30,17 +42,14 @@ export async function startHttpIngressAgent(input) {
|
|
|
30
42
|
if (!hasLoopbackCredential()) {
|
|
31
43
|
throw new ChannelError("channel_run_failed", "managed loopback authentication is not configured");
|
|
32
44
|
}
|
|
33
|
-
const client =
|
|
34
|
-
|
|
35
|
-
sourceThreadKey: input.sourceThreadKey,
|
|
36
|
-
sourceProvider: input.sourceProvider ?? input.binding.provider,
|
|
37
|
-
});
|
|
38
|
-
const { state, assistantId } = await ingressThreadState(client, input.threadId, input.deliveryKey);
|
|
45
|
+
const client = sourceClient(input);
|
|
46
|
+
const { state, assistantId, interrupts } = await ingressThreadState(client, input.threadId, input.deliveryKey);
|
|
39
47
|
// A new turn would abandon the decision the thread waits on.
|
|
40
48
|
if (state === "paused")
|
|
41
49
|
return {
|
|
42
50
|
skipped: "paused",
|
|
43
51
|
...(assistantId !== undefined && { assistantId }),
|
|
52
|
+
interrupts,
|
|
44
53
|
};
|
|
45
54
|
const strategy = input.multitaskStrategy ?? "enqueue";
|
|
46
55
|
// `interrupt` and `rollback` start now and cancel the active run.
|
|
@@ -54,41 +63,28 @@ export async function startHttpIngressAgent(input) {
|
|
|
54
63
|
: await input.prepare?.();
|
|
55
64
|
if (!prepared)
|
|
56
65
|
return { skipped: "ignored" };
|
|
57
|
-
// The handler's metadata goes under MDA's own.
|
|
58
|
-
const metadata = {
|
|
59
|
-
...prepared.metadata,
|
|
60
|
-
...(input.deliveryKey !== undefined && {
|
|
61
|
-
[DELIVERY_KEY_METADATA]: input.deliveryKey,
|
|
62
|
-
}),
|
|
63
|
-
};
|
|
64
66
|
let started;
|
|
65
67
|
try {
|
|
66
68
|
started = await startIngressRun(client, {
|
|
67
69
|
threadId: input.threadId,
|
|
68
70
|
assistantId: input.assistantId,
|
|
69
|
-
...(Object.keys(metadata).length && { metadata }),
|
|
70
71
|
multitaskStrategy: strategy,
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
...runStartOptions(prepared, input.deliveryKey === undefined
|
|
73
|
+
? {}
|
|
74
|
+
: { [DELIVERY_KEY_METADATA]: input.deliveryKey }),
|
|
75
|
+
threadOrigin: { binding: input.binding, senderId: input.userId },
|
|
73
76
|
...buildIngressRunContext({
|
|
74
77
|
// The binding already holds a message's content; prepared input
|
|
75
78
|
// replaces it.
|
|
76
79
|
binding: input.input !== undefined
|
|
77
80
|
? input.binding
|
|
78
|
-
:
|
|
79
|
-
...input.binding,
|
|
80
|
-
event: {
|
|
81
|
-
type: "message",
|
|
82
|
-
messages: prepared.messages,
|
|
83
|
-
},
|
|
84
|
-
},
|
|
81
|
+
: bindingWithMessages(input.binding, prepared.messages),
|
|
85
82
|
context: prepared.context ?? input.context,
|
|
86
83
|
}),
|
|
87
84
|
});
|
|
88
85
|
}
|
|
89
86
|
catch (error) {
|
|
90
|
-
|
|
91
|
-
if (strategy === "reject" && lookupStatus(error) === 409)
|
|
87
|
+
if (rejectedAsBusy(strategy, error))
|
|
92
88
|
return { skipped: "rejected" };
|
|
93
89
|
throw error;
|
|
94
90
|
}
|
|
@@ -132,48 +128,56 @@ function contentRunInput(content) {
|
|
|
132
128
|
state: {},
|
|
133
129
|
};
|
|
134
130
|
}
|
|
131
|
+
const ENDED_STATUSES = new Set([
|
|
132
|
+
"success",
|
|
133
|
+
"error",
|
|
134
|
+
"timeout",
|
|
135
|
+
"interrupted",
|
|
136
|
+
]);
|
|
137
|
+
function isRunStatus(status) {
|
|
138
|
+
return ENDED_STATUSES.has(status);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* How the run ended, or `undefined` when it hasn't, as observing it stopped
|
|
142
|
+
* while it was still `pending` or `running`: it may still answer.
|
|
143
|
+
*/
|
|
135
144
|
export async function observeHttpIngressAgent(input) {
|
|
136
|
-
const client =
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
145
|
+
const client = sourceClient(input);
|
|
146
|
+
// What the thread waits on now, read only when the run may have stopped on it.
|
|
147
|
+
const waitingOn = async (status) => {
|
|
148
|
+
const { interrupts, assistantId } = await ingressThreadState(client, input.threadId);
|
|
149
|
+
return {
|
|
150
|
+
status,
|
|
151
|
+
interrupts,
|
|
152
|
+
...(assistantId !== undefined && { assistantId }),
|
|
153
|
+
};
|
|
154
|
+
};
|
|
141
155
|
let observed;
|
|
142
156
|
try {
|
|
143
157
|
observed = await observeIngressRun(client, input);
|
|
144
158
|
}
|
|
145
159
|
catch (error) {
|
|
146
|
-
// `rollback` deletes the run a newer message replaced
|
|
160
|
+
// `rollback` cancels, then deletes, the run a newer message replaced.
|
|
147
161
|
if (lookupStatus(error) !== 404)
|
|
148
162
|
throw error;
|
|
149
163
|
logger.info(`channel run was replaced ${JSON.stringify({ threadId: input.threadId })}`);
|
|
150
|
-
|
|
164
|
+
// It was cancelled; what the thread waits on now is the newer run's.
|
|
165
|
+
return waitingOn("interrupted");
|
|
151
166
|
}
|
|
152
167
|
const { values, status } = observed;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
type: "paused",
|
|
159
|
-
...(assistantId !== undefined && { assistantId }),
|
|
160
|
-
};
|
|
161
|
-
return { type: status === "interrupted" ? "cancelled" : "answered" };
|
|
162
|
-
};
|
|
163
|
-
if (status === "interrupted")
|
|
164
|
-
return await paused();
|
|
165
|
-
if (status !== "success")
|
|
166
|
-
return { type: "failed" };
|
|
168
|
+
if (!isRunStatus(status)) {
|
|
169
|
+
logger.warn(`channel run had not ended when observed ${JSON.stringify({ threadId: input.threadId, status })}`);
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
const ended = status;
|
|
167
173
|
const state = values && typeof values === "object" && !Array.isArray(values)
|
|
168
174
|
? values
|
|
169
175
|
: {};
|
|
170
|
-
const
|
|
171
|
-
const interrupted = interrupts &&
|
|
172
|
-
typeof interrupts === "object" &&
|
|
173
|
-
Object.keys(interrupts).length > 0;
|
|
176
|
+
const raised = state[INTERRUPT];
|
|
174
177
|
// A run that stops on `interrupt()` can still end `success`.
|
|
175
|
-
if (interrupted
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
if (ended === "interrupted" ||
|
|
179
|
+
(raised && typeof raised === "object" && Object.keys(raised).length > 0))
|
|
180
|
+
return waitingOn(ended);
|
|
181
|
+
return { status: ended, interrupts: [] };
|
|
178
182
|
}
|
|
179
183
|
//# sourceMappingURL=ingress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ingress.js","sourceRoot":"","sources":["../../../src/channels/http/ingress.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import type { JsonObject } from "../manifest.js";
|
|
|
2
2
|
import type { JsonValue } from "../types.js";
|
|
3
3
|
import type { ChannelRunResult } from "../run-input.js";
|
|
4
4
|
import type { HttpChannel } from "./index.js";
|
|
5
|
-
import type { HttpChannelAdapter,
|
|
5
|
+
import type { HttpChannelAdapter, HttpFinish, HttpFinishedDelivery } from "./types.js";
|
|
6
|
+
import { type EndpointEvent, type EndpointThread, type EventEndpoint, type EventField } from "./endpoint.js";
|
|
6
7
|
/** The channel's name in the project, or its provider before it has one. */
|
|
7
8
|
export declare function channelName(channel: HttpChannel): string;
|
|
8
9
|
/**
|
|
@@ -10,18 +11,59 @@ export declare function channelName(channel: HttpChannel): string;
|
|
|
10
11
|
* caller or a cast gets no error, and a key nothing dispatches never runs.
|
|
11
12
|
*/
|
|
12
13
|
export declare function checkEventKeys(provider: string, handlers: object, supported: ReadonlySet<string>): void;
|
|
14
|
+
/** A channel's event handler, as the channel calls it with the event's thread. */
|
|
15
|
+
export type EventCallback<E, T> = (event: E, thread: T) => EventHandlerResult | Promise<EventHandlerResult>;
|
|
13
16
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
17
|
+
* A channel's `onEvent` with each endpoint, a URL or `Request`, replaced by
|
|
18
|
+
* the handler it stands for, so the channel calls handlers alone. A bad
|
|
19
|
+
* endpoint, or a value that is neither a handler nor an endpoint, throws when
|
|
20
|
+
* the channel is declared. The endpoint's handler is
|
|
21
|
+
* typed as the channel's own: `E` and `T` carry what it sends, and `fields`
|
|
22
|
+
* are the channel's own fields of `E` it sends beside key, delivery ID and
|
|
23
|
+
* payload, listed in one place per channel.
|
|
16
24
|
*/
|
|
17
|
-
export declare function
|
|
18
|
-
/** A provider channel's `forward`: the delivery and the channel's typed event. */
|
|
19
|
-
export type EventForward<E> = (request: Request, event: E) => HttpForwardResult | Promise<HttpForwardResult>;
|
|
25
|
+
export declare function resolveEndpoints<E extends EndpointEvent, T extends EndpointThread, X extends EventField<E> & string = never>(provider: string, onEvent: Readonly<Record<string, EventCallback<E, T> | EventEndpoint | undefined>> | undefined, fields?: readonly X[]): Partial<Record<string, EventCallback<E, T>>>;
|
|
20
26
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
27
|
+
* A provider channel's `onFinish`: a delivery of one of its events is done,
|
|
28
|
+
* with the event, its thread, and how it finished, to switch on by `type`:
|
|
29
|
+
* the run it started, why it started none, or that MDA lost it; see
|
|
30
|
+
* {@link HttpFinish}.
|
|
31
|
+
*
|
|
32
|
+
* @experimental This may change in a minor release.
|
|
23
33
|
*/
|
|
24
|
-
export
|
|
34
|
+
export type EventFinished<E, T = EventThread> = (event: E, thread: T, finished: HttpFinish) => void | Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* The thread a provider channel's hooks hear about.
|
|
37
|
+
*
|
|
38
|
+
* @experimental This may change in a minor release.
|
|
39
|
+
*/
|
|
40
|
+
export interface EventThread {
|
|
41
|
+
id: string;
|
|
42
|
+
channel: {
|
|
43
|
+
name: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** The thread of a delivery to the channel named `name`. */
|
|
47
|
+
export declare function eventThread(delivery: {
|
|
48
|
+
threadId: string;
|
|
49
|
+
}, name: string): EventThread;
|
|
50
|
+
/**
|
|
51
|
+
* The HTTP channel's `onFinish` for a provider channel: the channel's own
|
|
52
|
+
* notice first, such as a link to a pending decision, then the user's hook,
|
|
53
|
+
* for the deliveries whose event the channel parsed. A failing notice is
|
|
54
|
+
* logged and doesn't keep the user's hook from running.
|
|
55
|
+
*/
|
|
56
|
+
export declare function finishEvents<E, T = EventThread>(notice: NonNullable<HttpChannelAdapter["onFinish"]>, onFinish: EventFinished<E, T> | undefined, parse: (rawEvent: JsonValue | undefined) => E | undefined | Promise<E | undefined>, thread: (delivery: HttpFinishedDelivery) => T): HttpChannelAdapter["onFinish"];
|
|
57
|
+
/**
|
|
58
|
+
* A provider channel's `onReceived`: a delivery of one of its events reached
|
|
59
|
+
* its thread, before MDA reads the thread; see `channels.http`'s `onReceived`.
|
|
60
|
+
*/
|
|
61
|
+
export type EventReceived<E, T = EventThread> = (event: E, thread: T) => void | Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* The HTTP channel's `onReceived` for a provider channel's user hook, for the
|
|
64
|
+
* deliveries whose event the channel parsed.
|
|
65
|
+
*/
|
|
66
|
+
export declare function receiveEvents<E>(onReceived: EventReceived<E> | undefined, parse: (rawEvent: JsonValue | undefined) => E | undefined, name: () => string): HttpChannelAdapter["onReceived"];
|
|
25
67
|
/** The events deploy subscribes the provider's webhook to: the handled ones. */
|
|
26
68
|
export declare function handledEventKeys(handlers: object): string[];
|
|
27
69
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/channels/http/provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/channels/http/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* What webhook channels built on `httpChannel`, such as GitHub and Linear,
|
|
3
3
|
* share: their name, the events they subscribe to, the secrets they read from
|
|
4
|
-
* Agent Auth, signature checks,
|
|
4
|
+
* Agent Auth, signature checks, running an event's handler, and the hooks
|
|
5
|
+
* that hand their typed events to the user.
|
|
5
6
|
*/
|
|
6
7
|
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
7
8
|
import { isJsonValue } from "../message-schema.js";
|
|
8
9
|
import { immutableCopy } from "../runtime.js";
|
|
9
10
|
import { logger } from "../../runtime/log.js";
|
|
11
|
+
import { endpointHandler, isEventEndpoint, } from "./endpoint.js";
|
|
10
12
|
import { ConnectionNotFoundError, DEPLOYMENT_ID_ENV, connections, } from "../../connections.js";
|
|
11
13
|
/** The channel's name in the project, or its provider before it has one. */
|
|
12
14
|
export function channelName(channel) {
|
|
@@ -22,26 +24,75 @@ export function checkEventKeys(provider, handlers, supported) {
|
|
|
22
24
|
throw new TypeError(`unsupported ${provider} event key ${unknown.sort().join(", ")}`);
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
+
* A channel's `onEvent` with each endpoint, a URL or `Request`, replaced by
|
|
28
|
+
* the handler it stands for, so the channel calls handlers alone. A bad
|
|
29
|
+
* endpoint, or a value that is neither a handler nor an endpoint, throws when
|
|
30
|
+
* the channel is declared. The endpoint's handler is
|
|
31
|
+
* typed as the channel's own: `E` and `T` carry what it sends, and `fields`
|
|
32
|
+
* are the channel's own fields of `E` it sends beside key, delivery ID and
|
|
33
|
+
* payload, listed in one place per channel.
|
|
27
34
|
*/
|
|
28
|
-
export function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
export function resolveEndpoints(provider, onEvent, fields = []) {
|
|
36
|
+
return Object.fromEntries(Object.entries(onEvent ?? {}).map(([key, value]) => {
|
|
37
|
+
const label = `${provider} onEvent["${key}"]`;
|
|
38
|
+
if (isEventEndpoint(value))
|
|
39
|
+
return [key, endpointHandler(value, label, fields)];
|
|
40
|
+
if (value !== undefined && typeof value !== "function")
|
|
41
|
+
throw new TypeError(`${label} must be a function, a URL or a Request`);
|
|
42
|
+
return [key, value];
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/** The thread of a delivery to the channel named `name`. */
|
|
46
|
+
export function eventThread(delivery, name) {
|
|
47
|
+
return { id: delivery.threadId, channel: { name } };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The HTTP channel's `onFinish` for a provider channel: the channel's own
|
|
51
|
+
* notice first, such as a link to a pending decision, then the user's hook,
|
|
52
|
+
* for the deliveries whose event the channel parsed. A failing notice is
|
|
53
|
+
* logged and doesn't keep the user's hook from running.
|
|
54
|
+
*/
|
|
55
|
+
export function finishEvents(notice, onFinish, parse, thread) {
|
|
56
|
+
return async (target, delivery) => {
|
|
57
|
+
try {
|
|
58
|
+
await notice(target, delivery);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error(`channel finish notice failed (${logger.safeErrorLabel(error)})`);
|
|
62
|
+
}
|
|
63
|
+
const event = onFinish && (await parse(delivery.rawEvent));
|
|
64
|
+
if (event === undefined)
|
|
65
|
+
return;
|
|
66
|
+
await onFinish?.(event, thread(delivery), finishOf(delivery));
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** How a delivery finished, without the delivery's own fields. */
|
|
70
|
+
function finishOf(delivery) {
|
|
71
|
+
const { interrupts } = delivery;
|
|
72
|
+
switch (delivery.type) {
|
|
73
|
+
case "run":
|
|
74
|
+
return { type: "run", run: delivery.run, interrupts };
|
|
75
|
+
case "skipped":
|
|
76
|
+
return { type: "skipped", reason: delivery.reason, interrupts };
|
|
77
|
+
default:
|
|
78
|
+
return { type: "failed", reason: delivery.reason, interrupts };
|
|
79
|
+
}
|
|
34
80
|
}
|
|
35
81
|
/**
|
|
36
|
-
* The HTTP channel's `
|
|
37
|
-
* deliveries whose event the channel parsed
|
|
82
|
+
* The HTTP channel's `onReceived` for a provider channel's user hook, for the
|
|
83
|
+
* deliveries whose event the channel parsed.
|
|
38
84
|
*/
|
|
39
|
-
export function
|
|
40
|
-
if (!
|
|
85
|
+
export function receiveEvents(onReceived, parse, name) {
|
|
86
|
+
if (!onReceived)
|
|
41
87
|
return undefined;
|
|
42
|
-
return (
|
|
88
|
+
return async (_target, delivery) => {
|
|
43
89
|
const event = parse(delivery.rawEvent);
|
|
44
|
-
|
|
90
|
+
if (event === undefined)
|
|
91
|
+
return;
|
|
92
|
+
await onReceived(event, {
|
|
93
|
+
id: delivery.threadId,
|
|
94
|
+
channel: { name: name() },
|
|
95
|
+
});
|
|
45
96
|
};
|
|
46
97
|
}
|
|
47
98
|
/** The events deploy subscribes the provider's webhook to: the handled ones. */
|