managed-deepagents 0.10.0-dev.9 → 0.10.1-dev.1
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 +864 -143
- 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 +38 -46
- 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 +50 -26
- 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 +209 -89
- 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 -23
- 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 +38 -15
- package/dist/channels/http/provider.d.ts.map +1 -1
- package/dist/channels/http/provider.js +54 -24
- package/dist/channels/http/provider.js.map +1 -1
- package/dist/channels/http/studio.d.ts +8 -1
- package/dist/channels/http/studio.d.ts.map +1 -1
- package/dist/channels/http/studio.js +13 -0
- package/dist/channels/http/studio.js.map +1 -1
- package/dist/channels/http/types.d.ts +95 -69
- 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 +65 -94
- 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 +37 -31
- 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
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The thread record: where a thread's conversation lives and who takes part.
|
|
3
|
+
*
|
|
4
|
+
* Managed ingress keeps it in thread metadata, so every run on the thread
|
|
5
|
+
* (Studio resumes and schedules included) reads it from its own config. Thread
|
|
6
|
+
* metadata reaches traces, so the record never holds message text, the event
|
|
7
|
+
* or the provider's raw payload. Keys inside it are snake_case wire data,
|
|
8
|
+
* shared with the Python runtime.
|
|
9
|
+
*/
|
|
10
|
+
import { isDeepStrictEqual } from "node:util";
|
|
11
|
+
import { z } from "zod";
|
|
12
|
+
import { logger } from "./log.js";
|
|
13
|
+
export const THREAD_RECORD_METADATA = "ls_mda_thread";
|
|
14
|
+
export const THREAD_PARTICIPANTS_METADATA = "ls_mda_participants";
|
|
15
|
+
/**
|
|
16
|
+
* The source thread key of a conversation a scheduled run started, on the
|
|
17
|
+
* run's own thread. Ingress runs the conversation's events there.
|
|
18
|
+
*/
|
|
19
|
+
export const THREAD_CONVERSATION_METADATA = "ls_mda_conversation";
|
|
20
|
+
/** Every thread-record key; only managed ingress may write one. */
|
|
21
|
+
export const THREAD_RECORD_METADATA_PREFIX = "ls_mda_";
|
|
22
|
+
const nonblankString = z.string().refine((value) => value.trim().length > 0);
|
|
23
|
+
const storedChannelSchema = z.strictObject({
|
|
24
|
+
name: nonblankString,
|
|
25
|
+
provider: nonblankString,
|
|
26
|
+
transport: z.enum(["trigger_server", "direct"]),
|
|
27
|
+
source_thread_key: nonblankString,
|
|
28
|
+
address: z.json(),
|
|
29
|
+
delivery_id: nonblankString,
|
|
30
|
+
});
|
|
31
|
+
const storedOriginSchema = z.strictObject({
|
|
32
|
+
channel: storedChannelSchema,
|
|
33
|
+
sender: z.string().nullable().default(null),
|
|
34
|
+
});
|
|
35
|
+
const recordSchema = z.strictObject({
|
|
36
|
+
v: z.literal(1),
|
|
37
|
+
origin: z.unknown().optional(),
|
|
38
|
+
participants: z
|
|
39
|
+
.record(z.string(), z.strictObject({ role: z.enum(["owner", "member"]) }))
|
|
40
|
+
.default({}),
|
|
41
|
+
});
|
|
42
|
+
/** A Trigger binding's target: the channel, its opaque address and its thread. */
|
|
43
|
+
export const triggerTargetSchema = z.object({
|
|
44
|
+
channel_id: nonblankString,
|
|
45
|
+
address: z.record(z.string(), z.json()),
|
|
46
|
+
source_thread_key: nonblankString,
|
|
47
|
+
});
|
|
48
|
+
/** A stored Trigger address: the target's address with its channel id. */
|
|
49
|
+
const triggerAddressSchema = z
|
|
50
|
+
.object({ channel_id: nonblankString })
|
|
51
|
+
.catchall(z.json());
|
|
52
|
+
let reportedMalformed = false;
|
|
53
|
+
/** Say once that a record was ignored, without any of its values. */
|
|
54
|
+
function reportMalformed(part) {
|
|
55
|
+
if (reportedMalformed)
|
|
56
|
+
return;
|
|
57
|
+
reportedMalformed = true;
|
|
58
|
+
logger.warn(`thread ${part} metadata is malformed and was ignored`);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A person is a non-blank principal id outside the `mda:` service namespace
|
|
62
|
+
* (`mda:channel`, `mda:slack`, `mda:schedule:*`).
|
|
63
|
+
*/
|
|
64
|
+
export function isPersonPrincipal(id) {
|
|
65
|
+
return typeof id === "string" && !!id.trim() && !id.startsWith("mda:");
|
|
66
|
+
}
|
|
67
|
+
/** The stored form of a binding: no event, and its target as `address`. */
|
|
68
|
+
export function originFromBinding(binding, sender) {
|
|
69
|
+
const trigger = binding.transport === "trigger_server"
|
|
70
|
+
? triggerTargetSchema.safeParse(binding.target)
|
|
71
|
+
: undefined;
|
|
72
|
+
// A Trigger target that doesn't parse is stored as is, and no run can
|
|
73
|
+
// rebuild it.
|
|
74
|
+
const address = trigger?.success
|
|
75
|
+
? { channel_id: trigger.data.channel_id, ...trigger.data.address }
|
|
76
|
+
: binding.target;
|
|
77
|
+
return {
|
|
78
|
+
channel: {
|
|
79
|
+
name: binding.name,
|
|
80
|
+
provider: binding.provider,
|
|
81
|
+
transport: binding.transport,
|
|
82
|
+
source_thread_key: binding.sourceThreadKey,
|
|
83
|
+
address,
|
|
84
|
+
delivery_id: binding.deliveryId,
|
|
85
|
+
},
|
|
86
|
+
sender,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** The binding a stored origin was made from, without its event. */
|
|
90
|
+
export function bindingFromOrigin(origin) {
|
|
91
|
+
const { channel } = origin;
|
|
92
|
+
let target = channel.address;
|
|
93
|
+
if (channel.transport === "trigger_server") {
|
|
94
|
+
const address = triggerAddressSchema.safeParse(channel.address);
|
|
95
|
+
if (!address.success)
|
|
96
|
+
return undefined;
|
|
97
|
+
const { channel_id, ...rest } = address.data;
|
|
98
|
+
target = {
|
|
99
|
+
channel_id,
|
|
100
|
+
address: rest,
|
|
101
|
+
source_thread_key: channel.source_thread_key,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
name: channel.name,
|
|
106
|
+
provider: channel.provider,
|
|
107
|
+
transport: channel.transport,
|
|
108
|
+
sourceThreadKey: channel.source_thread_key,
|
|
109
|
+
deliveryId: channel.delivery_id,
|
|
110
|
+
target,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The record in a thread's or run's metadata, or `null` when there is none or
|
|
115
|
+
* it is malformed. A malformed origin keeps the participants. With `exact`,
|
|
116
|
+
* as a write must be, a malformed origin or a participant list that does not
|
|
117
|
+
* name exactly the participants rejects the whole record.
|
|
118
|
+
*/
|
|
119
|
+
export function parseThreadRecord(metadata, { exact = false } = {}) {
|
|
120
|
+
if (!isRecord(metadata) || metadata[THREAD_RECORD_METADATA] == null)
|
|
121
|
+
return null;
|
|
122
|
+
const parsed = recordSchema.safeParse(metadata[THREAD_RECORD_METADATA]);
|
|
123
|
+
if (!parsed.success) {
|
|
124
|
+
reportMalformed("record");
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
const roles = parsed.data.participants;
|
|
128
|
+
const origin = parsed.data.origin == null
|
|
129
|
+
? undefined
|
|
130
|
+
: storedOriginSchema.safeParse(parsed.data.origin);
|
|
131
|
+
if (origin?.success === false)
|
|
132
|
+
reportMalformed("origin");
|
|
133
|
+
// JSON object keys that look like integers lose their order, so the list
|
|
134
|
+
// carries who joined first.
|
|
135
|
+
const listed = metadata[THREAD_PARTICIPANTS_METADATA];
|
|
136
|
+
const ids = isStringList(listed) &&
|
|
137
|
+
listed.length === Object.keys(roles).length &&
|
|
138
|
+
new Set(listed).size === listed.length &&
|
|
139
|
+
listed.every((id) => Object.hasOwn(roles, id))
|
|
140
|
+
? listed
|
|
141
|
+
: undefined;
|
|
142
|
+
if (exact && (origin?.success === false || !ids))
|
|
143
|
+
return null;
|
|
144
|
+
return {
|
|
145
|
+
origin: origin?.success ? origin.data : null,
|
|
146
|
+
participants: (ids ?? Object.keys(roles)).map((id) => ({
|
|
147
|
+
id,
|
|
148
|
+
role: roles[id].role,
|
|
149
|
+
})),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The record after a channel event: the event's channel is the origin, and a
|
|
154
|
+
* person who sends it joins, as owner when they are the first.
|
|
155
|
+
*/
|
|
156
|
+
export function nextThreadRecord(current, binding, senderId) {
|
|
157
|
+
const sender = isPersonPrincipal(senderId) ? senderId : null;
|
|
158
|
+
const participants = [...(current?.participants ?? [])];
|
|
159
|
+
if (sender !== null && !participants.some(({ id }) => id === sender))
|
|
160
|
+
participants.push({
|
|
161
|
+
id: sender,
|
|
162
|
+
role: participants.length ? "member" : "owner",
|
|
163
|
+
});
|
|
164
|
+
return { origin: originFromBinding(binding, sender), participants };
|
|
165
|
+
}
|
|
166
|
+
/** The metadata keys that store a record. */
|
|
167
|
+
export function threadRecordMetadata(record) {
|
|
168
|
+
return {
|
|
169
|
+
[THREAD_RECORD_METADATA]: {
|
|
170
|
+
v: 1,
|
|
171
|
+
// Absent rather than `null`: a SQLite metadata patch deletes nulls.
|
|
172
|
+
...(record.origin !== null && { origin: record.origin }),
|
|
173
|
+
participants: Object.fromEntries(record.participants.map(({ id, role }) => [id, { role }])),
|
|
174
|
+
},
|
|
175
|
+
[THREAD_PARTICIPANTS_METADATA]: record.participants.map(({ id }) => id),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/** Whether metadata already stores exactly this record. */
|
|
179
|
+
export function storesThreadRecord(metadata, record) {
|
|
180
|
+
const stored = threadRecordMetadata(record);
|
|
181
|
+
return (isRecord(metadata) &&
|
|
182
|
+
isDeepStrictEqual(metadata[THREAD_RECORD_METADATA], stored[THREAD_RECORD_METADATA]) &&
|
|
183
|
+
isDeepStrictEqual(metadata[THREAD_PARTICIPANTS_METADATA], stored[THREAD_PARTICIPANTS_METADATA]));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Remove every thread-record key from a metadata object, in place. With
|
|
187
|
+
* `keepRecord`, the two keys a record is stored in stay; with
|
|
188
|
+
* `keepConversation`, the conversation key stays too.
|
|
189
|
+
*/
|
|
190
|
+
export function stripThreadRecordKeys(metadata, { keepRecord = false, keepConversation = false, } = {}) {
|
|
191
|
+
if (!isRecord(metadata))
|
|
192
|
+
return;
|
|
193
|
+
for (const key of Object.keys(metadata)) {
|
|
194
|
+
const kept = (keepRecord &&
|
|
195
|
+
(key === THREAD_RECORD_METADATA ||
|
|
196
|
+
key === THREAD_PARTICIPANTS_METADATA)) ||
|
|
197
|
+
(keepConversation && key === THREAD_CONVERSATION_METADATA);
|
|
198
|
+
if (key.startsWith(THREAD_RECORD_METADATA_PREFIX) && !kept)
|
|
199
|
+
delete metadata[key];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Whether metadata names any thread-record key. */
|
|
203
|
+
export function hasThreadRecordKeys(metadata) {
|
|
204
|
+
return (isRecord(metadata) &&
|
|
205
|
+
Object.keys(metadata).some((key) => key.startsWith(THREAD_RECORD_METADATA_PREFIX)));
|
|
206
|
+
}
|
|
207
|
+
function isStringList(value) {
|
|
208
|
+
return (Array.isArray(value) && value.every((item) => typeof item === "string"));
|
|
209
|
+
}
|
|
210
|
+
function isRecord(value) {
|
|
211
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=thread-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-record.js","sourceRoot":"","sources":["../../src/runtime/thread-record.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/types.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { LangGraphRunnableConfig } from "@langchain/langgraph";
|
|
2
2
|
import type { ServerRuntime } from "@langchain/langgraph-sdk";
|
|
3
|
+
import type { BrowserDefinition } from "../browser.js";
|
|
3
4
|
import type { IdentityDefinition } from "../identity/index.js";
|
|
4
5
|
import type { MemoryDefinition } from "../memory/index.js";
|
|
5
6
|
import type { SandboxDefinition } from "../sandbox.js";
|
|
6
7
|
import type { Channel } from "./channel.js";
|
|
7
8
|
import type { ManagedRuntimeExtras } from "./managed-tools.js";
|
|
9
|
+
import type { ManagedThread } from "./managed-thread.js";
|
|
8
10
|
import type { Connector } from "./connector.js";
|
|
9
11
|
/**
|
|
10
12
|
* The LangGraph runnable config passed to a graph factory at invocation time.
|
|
@@ -14,7 +16,10 @@ import type { Connector } from "./connector.js";
|
|
|
14
16
|
*/
|
|
15
17
|
export type ManagedRunConfig = LangGraphRunnableConfig<Record<string, unknown>>;
|
|
16
18
|
/** Native Agent Server factory runtime with managed fields. */
|
|
17
|
-
export type ManagedServerRuntime<AppContext = Record<string, unknown>> = ServerRuntime<AppContext> & ManagedRuntimeExtras
|
|
19
|
+
export type ManagedServerRuntime<AppContext = Record<string, unknown>> = ServerRuntime<AppContext> & Omit<ManagedRuntimeExtras, "thread"> & {
|
|
20
|
+
/** The run's thread; `null` outside a run, such as for graph inspection. */
|
|
21
|
+
thread?: ManagedThread | null;
|
|
22
|
+
};
|
|
18
23
|
/**
|
|
19
24
|
* Managed values the CLI injects into the generated entry module.
|
|
20
25
|
*
|
|
@@ -69,6 +74,8 @@ export interface ManagedAgentOptions {
|
|
|
69
74
|
* not select memory, and remains independent of identity.
|
|
70
75
|
*/
|
|
71
76
|
memory?: MemoryDefinition<never>;
|
|
77
|
+
/** The root `browser.ts` declaration, if the project gives the agent a browser. */
|
|
78
|
+
browser?: BrowserDefinition;
|
|
72
79
|
/**
|
|
73
80
|
* Harbor eval trial workspace root (usually `/app`). When set, the managed
|
|
74
81
|
* runtime installs a disk `FilesystemBackend` so verifier-visible writes land
|
|
@@ -85,5 +92,9 @@ export interface ManagedAgentOptions {
|
|
|
85
92
|
* CLI's own `command_completed`.
|
|
86
93
|
*/
|
|
87
94
|
reportTelemetry?: boolean;
|
|
95
|
+
/** Graph id of each async subagent, by name (set by the generated entry). */
|
|
96
|
+
asyncSubagentGraphs?: Readonly<Record<string, string>>;
|
|
97
|
+
/** Build this async subagent's own graph instead of the lead's. */
|
|
98
|
+
asyncSubagent?: string;
|
|
88
99
|
}
|
|
89
100
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhF,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACnE,aAAa,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/runtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhF,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACnE,aAAa,CAAC,UAAU,CAAC,GACvB,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,GAAG;IACrC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEN;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B;;;;OAIG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACjC,mFAAmF;IACnF,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { JsonValue } from "./channels/types.js";
|
|
2
2
|
import { type RuntimeConfigLike } from "./runtime/identity-runtime.js";
|
|
3
|
+
import type { ThreadParticipant } from "./runtime/managed-thread.js";
|
|
3
4
|
import type { ScheduleDeliveryTarget, ScheduleThreadConfig } from "./schedules.js";
|
|
4
5
|
export type ScheduleOwner = {
|
|
5
6
|
type: "agent";
|
|
@@ -34,6 +35,14 @@ export type ScheduleCreate = Timing & Input & {
|
|
|
34
35
|
paused?: boolean;
|
|
35
36
|
metadata?: Record<string, JsonValue>;
|
|
36
37
|
context?: Record<string, JsonValue>;
|
|
38
|
+
/**
|
|
39
|
+
* Run the schedule as this participant of the current thread instead of
|
|
40
|
+
* the caller. Needs `owner: { type: "user" }`; the caller still owns the
|
|
41
|
+
* schedule.
|
|
42
|
+
*
|
|
43
|
+
* @experimental This may change in a minor release.
|
|
44
|
+
*/
|
|
45
|
+
runAs?: ThreadParticipant | null;
|
|
37
46
|
};
|
|
38
47
|
export type SchedulePatch = ({
|
|
39
48
|
cron?: string;
|
|
@@ -68,8 +77,14 @@ export interface ScheduleRecord {
|
|
|
68
77
|
input?: ScheduleInput;
|
|
69
78
|
thread: ScheduleThreadConfig;
|
|
70
79
|
newThread: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* The channel a new-thread schedule posts to. `null` for a same-thread
|
|
82
|
+
* schedule, whose thread decides at each run.
|
|
83
|
+
*/
|
|
71
84
|
channel: string | null;
|
|
72
85
|
target: JsonValue;
|
|
86
|
+
/** Who the schedule runs as, when not its owner. */
|
|
87
|
+
runAs: ThreadParticipant | null;
|
|
73
88
|
deliverTo?: ScheduleDeliveryTarget;
|
|
74
89
|
context?: Record<string, JsonValue>;
|
|
75
90
|
paused: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-schedules.d.ts","sourceRoot":"","sources":["../src/runtime-schedules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-schedules.d.ts","sourceRoot":"","sources":["../src/runtime-schedules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { readScheduleDeliverTo } from "./channels/schedule-delivery.js";
|
|
3
|
+
import { getDeploymentId, readScheduleDeliverTo, } from "./channels/schedule-delivery.js";
|
|
4
4
|
import { resolveAgentAuthContext, resolveOwnerId } from "./connections.js";
|
|
5
5
|
import { buildRuntimeIdentity, resolveAuthUser, resolveRuntimeConfigurable, } from "./runtime/identity-runtime.js";
|
|
6
|
-
import { SCHEDULE_LIMIT_PREFIX, scheduleRequestConfig, } from "./runtime/schedule-auth.js";
|
|
7
|
-
import {
|
|
6
|
+
import { SCHEDULE_LIMIT_PREFIX, runAsSchema, scheduleRequestConfig, } from "./runtime/schedule-auth.js";
|
|
7
|
+
import { scheduleThread } from "./schedule-channel.js";
|
|
8
8
|
import { channelContextSchema, isManagedKey } from "./run-context.js";
|
|
9
|
+
import { THREAD_RECORD_METADATA_PREFIX, bindingFromOrigin, isPersonPrincipal, originFromBinding, parseThreadRecord, threadRecordMetadata, } from "./runtime/thread-record.js";
|
|
9
10
|
import { scheduleTiming } from "./schedule-time.js";
|
|
10
11
|
const ownerSchema = z.union([
|
|
11
12
|
z.strictObject({ type: z.literal("agent") }),
|
|
@@ -36,7 +37,7 @@ const contextSchema = z
|
|
|
36
37
|
.refine((value) => !Object.keys(value).some(isManagedKey), "Context keys mda_* are reserved");
|
|
37
38
|
const metadataSchema = z
|
|
38
39
|
.record(z.string(), z.json())
|
|
39
|
-
.refine((value) => Object.keys(value).every((key) => !key
|
|
40
|
+
.refine((value) => Object.keys(value).every((key) => !isReservedMetadataKey(key)), "Metadata keys starting with mda_ or ls_mda_ are reserved");
|
|
40
41
|
const fields = {
|
|
41
42
|
cron: z.string().optional(),
|
|
42
43
|
at: z.string().optional(),
|
|
@@ -47,6 +48,7 @@ const fields = {
|
|
|
47
48
|
newThread: z.boolean().optional(),
|
|
48
49
|
paused: z.boolean().optional(),
|
|
49
50
|
metadata: metadataSchema.optional(),
|
|
51
|
+
runAs: runAsSchema.nullable().optional(),
|
|
50
52
|
};
|
|
51
53
|
const specSchema = z.strictObject(fields);
|
|
52
54
|
const createSchema = specSchema.omit({ deliverTo: true }).extend({
|
|
@@ -55,7 +57,7 @@ const createSchema = specSchema.omit({ deliverTo: true }).extend({
|
|
|
55
57
|
context: contextSchema.optional(),
|
|
56
58
|
});
|
|
57
59
|
const patchSchema = specSchema
|
|
58
|
-
.omit({ deliverTo: true, newThread: true })
|
|
60
|
+
.omit({ deliverTo: true, newThread: true, runAs: true })
|
|
59
61
|
.extend({
|
|
60
62
|
at: z.union([z.string(), z.date()]).optional(),
|
|
61
63
|
context: contextSchema.optional(),
|
|
@@ -78,22 +80,27 @@ const wireSchema = z.object({
|
|
|
78
80
|
.optional(),
|
|
79
81
|
}),
|
|
80
82
|
});
|
|
83
|
+
function isReservedMetadataKey(key) {
|
|
84
|
+
return (key.startsWith("mda_") || key.startsWith(THREAD_RECORD_METADATA_PREFIX));
|
|
85
|
+
}
|
|
81
86
|
function readSpec(raw) {
|
|
82
|
-
const { deliver_to, new_thread, ...rest } = z
|
|
87
|
+
const { deliver_to, new_thread, run_as, ...rest } = z
|
|
83
88
|
.record(z.string(), z.unknown())
|
|
84
89
|
.parse(raw ?? {});
|
|
85
90
|
return specSchema.parse({
|
|
86
91
|
...rest,
|
|
87
92
|
...(new_thread !== undefined ? { newThread: new_thread } : {}),
|
|
93
|
+
...(run_as !== undefined ? { runAs: run_as } : {}),
|
|
88
94
|
...(deliver_to ? { deliverTo: readScheduleDeliverTo(deliver_to) } : {}),
|
|
89
95
|
});
|
|
90
96
|
}
|
|
91
97
|
function writeSpec(spec) {
|
|
92
|
-
const { deliverTo, newThread, metadata: _metadata, input: _input, ...rest } = spec;
|
|
98
|
+
const { deliverTo, newThread, runAs, metadata: _metadata, input: _input, ...rest } = spec;
|
|
93
99
|
const to = deliverTo?.to;
|
|
94
100
|
return {
|
|
95
101
|
...rest,
|
|
96
102
|
...(newThread !== undefined ? { new_thread: newThread } : {}),
|
|
103
|
+
...(runAs !== undefined ? { run_as: runAs } : {}),
|
|
97
104
|
...(deliverTo && to
|
|
98
105
|
? {
|
|
99
106
|
deliver_to: {
|
|
@@ -130,8 +137,7 @@ async function context(owner, config) {
|
|
|
130
137
|
const selected = ownerSchema.parse(owner);
|
|
131
138
|
const identity = buildRuntimeIdentity(config);
|
|
132
139
|
const assistant = z.string().uuid().parse(config.assistant_id);
|
|
133
|
-
const deployment =
|
|
134
|
-
process.env.LANGGRAPH_CLOUD_ID?.trim();
|
|
140
|
+
const deployment = getDeploymentId();
|
|
135
141
|
if (!deployment)
|
|
136
142
|
throw new Error("Schedules require a deployment ID");
|
|
137
143
|
if (!identity)
|
|
@@ -236,9 +242,12 @@ function record(wire, ctx, now = Date.now()) {
|
|
|
236
242
|
const routing = wire.payload.context ?? wire.payload.config?.configurable;
|
|
237
243
|
const schedule = routing?.mda_schedule;
|
|
238
244
|
const deliverTo = spec.deliverTo ?? readScheduleDeliverTo(schedule?.deliver_to);
|
|
245
|
+
// New-thread schedules carry their thread's record; older ones a channel.
|
|
246
|
+
const stored = parseThreadRecord(wire.metadata)?.origin;
|
|
239
247
|
const rawChannel = routing?.mda_channel ??
|
|
240
248
|
(wire.payload.context == null ? routing?.channel : undefined);
|
|
241
|
-
const channel =
|
|
249
|
+
const channel = (stored && bindingFromOrigin(stored)) ??
|
|
250
|
+
(rawChannel == null ? undefined : channelContextSchema.parse(rawChannel));
|
|
242
251
|
const context = Object.fromEntries(Object.entries(wire.payload.context ?? {}).filter(([key]) => !isManagedKey(key)));
|
|
243
252
|
const managedBy = wire.metadata.mda_managed_by;
|
|
244
253
|
if (managedBy !== "runtime" && managedBy !== "deploy")
|
|
@@ -247,12 +256,13 @@ function record(wire, ctx, now = Date.now()) {
|
|
|
247
256
|
id: wire.cron_id,
|
|
248
257
|
owner: {
|
|
249
258
|
type: ctx.access.owner === "agent" ? "agent" : "user",
|
|
259
|
+
// Not the execution's: a schedule can run as someone else.
|
|
250
260
|
id: ctx.access.owner === "agent"
|
|
251
261
|
? ctx.deployment
|
|
252
|
-
: ctx.access.
|
|
262
|
+
: ctx.access.owner.slice("user:".length),
|
|
253
263
|
},
|
|
254
264
|
managedBy,
|
|
255
|
-
metadata: metadataSchema.parse(Object.fromEntries(Object.entries(wire.metadata).filter(([key]) => !key
|
|
265
|
+
metadata: metadataSchema.parse(Object.fromEntries(Object.entries(wire.metadata).filter(([key]) => !isReservedMetadataKey(key)))),
|
|
256
266
|
...(spec.at ? { at: spec.at } : { cron: wire.schedule }),
|
|
257
267
|
timezone: spec.timezone ?? wire.timezone ?? "UTC",
|
|
258
268
|
...(spec.prompt ? { prompt: spec.prompt } : { input: wire.payload.input }),
|
|
@@ -264,6 +274,7 @@ function record(wire, ctx, now = Date.now()) {
|
|
|
264
274
|
newThread: spec.newThread ?? !wire.thread_id,
|
|
265
275
|
channel: channel?.name ?? null,
|
|
266
276
|
target: channel?.target ?? null,
|
|
277
|
+
runAs: spec.runAs ?? null,
|
|
267
278
|
paused: !wire.enabled,
|
|
268
279
|
expired: wire.end_time != null && Date.parse(wire.end_time) < now,
|
|
269
280
|
};
|
|
@@ -293,6 +304,52 @@ async function verifyTarget(wire, target, ctx, created = true) {
|
|
|
293
304
|
throw new Error(`One-time target was missed; schedule ${created ? "removed" : "paused"}`);
|
|
294
305
|
}
|
|
295
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* Run a schedule as a participant of the current thread. The caller keeps
|
|
309
|
+
* owning it; only the identity its runs act as changes.
|
|
310
|
+
*/
|
|
311
|
+
async function runAsParticipant(ctx, owner, runAs, run) {
|
|
312
|
+
if (owner.type !== "user")
|
|
313
|
+
throw new Error('runAs requires owner { type: "user" }');
|
|
314
|
+
const participant = run.thread?.participants.find(({ id, role }) => id === runAs.id && role === runAs.role);
|
|
315
|
+
if (!participant)
|
|
316
|
+
throw new Error("runAs must be a participant of the current thread");
|
|
317
|
+
const origin = run.origin;
|
|
318
|
+
if (!origin)
|
|
319
|
+
throw new Error("runAs requires the thread's channel");
|
|
320
|
+
// A Trigger participant's id is their Agent Auth principal.
|
|
321
|
+
let principal = participant.id;
|
|
322
|
+
if (origin.transport !== "trigger_server") {
|
|
323
|
+
try {
|
|
324
|
+
principal = (await resolveAgentAuthContext({
|
|
325
|
+
user: { kind: "person", id: participant.id },
|
|
326
|
+
source: { provider: origin.provider },
|
|
327
|
+
})).principalId;
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
throw new Error(`Cannot run the schedule as this participant: ${error instanceof Error ? error.message : String(error)}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
ctx.access.run_as = { id: participant.id, role: participant.role };
|
|
334
|
+
ctx.access.execution = {
|
|
335
|
+
identity: participant.id,
|
|
336
|
+
permissions: [],
|
|
337
|
+
mda_user_id: participant.id,
|
|
338
|
+
mda_agent_auth_principal_id: principal,
|
|
339
|
+
mda_source_provider: "schedule",
|
|
340
|
+
mda_scheduled_run: true,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
/** The record a new-thread schedule's thread starts with. */
|
|
344
|
+
function newThreadRecord(origin, run, access) {
|
|
345
|
+
const executor = access.execution.mda_user_id;
|
|
346
|
+
return threadRecordMetadata({
|
|
347
|
+
origin: originFromBinding(origin, run.thread?.origin?.sender?.id ?? null),
|
|
348
|
+
participants: access.owner !== "agent" && isPersonPrincipal(executor)
|
|
349
|
+
? [{ id: executor, role: "owner" }]
|
|
350
|
+
: [],
|
|
351
|
+
});
|
|
352
|
+
}
|
|
296
353
|
/**
|
|
297
354
|
* Bind schedule operations to a tool or middleware runtime. MDA attaches the
|
|
298
355
|
* result as `runtime.schedules`; each call reads the run's trusted identity.
|
|
@@ -305,14 +362,17 @@ export function createRuntimeSchedules(runtime) {
|
|
|
305
362
|
const input = runInput(value);
|
|
306
363
|
const timing = scheduleTiming(value);
|
|
307
364
|
const newThread = value.newThread ?? value.cron !== undefined;
|
|
308
|
-
const
|
|
365
|
+
const run = scheduleThread(runtime, configurable);
|
|
366
|
+
const origin = run.origin;
|
|
309
367
|
const threadId = configurable?.thread_id;
|
|
310
368
|
if (!newThread && !threadId)
|
|
311
369
|
throw new Error("Same-thread schedules require a current thread; use newThread=true");
|
|
312
370
|
const ctx = await context(value.owner, configurable);
|
|
313
|
-
if (
|
|
314
|
-
ctx.
|
|
315
|
-
|
|
371
|
+
if (value.runAs)
|
|
372
|
+
await runAsParticipant(ctx, value.owner, value.runAs, run);
|
|
373
|
+
if (origin) {
|
|
374
|
+
ctx.access.execution.mda_source_provider = origin.provider;
|
|
375
|
+
ctx.access.execution.mda_source_thread_id = origin.sourceThreadKey;
|
|
316
376
|
}
|
|
317
377
|
else if (!newThread && value.owner.type === "agent") {
|
|
318
378
|
throw new Error("Agent-owned schedules outside a channel require newThread=true");
|
|
@@ -328,7 +388,7 @@ export function createRuntimeSchedules(runtime) {
|
|
|
328
388
|
}
|
|
329
389
|
}
|
|
330
390
|
const name = randomUUID();
|
|
331
|
-
const { owner: _owner, context: runContext, ...spec } = { ...value, newThread };
|
|
391
|
+
const { owner: _owner, context: runContext, ...spec } = { ...value, newThread, runAs: value.runAs ?? null };
|
|
332
392
|
if (timing.at) {
|
|
333
393
|
spec.at = timing.at;
|
|
334
394
|
spec.timezone = "UTC";
|
|
@@ -343,16 +403,18 @@ export function createRuntimeSchedules(runtime) {
|
|
|
343
403
|
...(timing.end_time ? { end_time: timing.end_time } : {}),
|
|
344
404
|
input,
|
|
345
405
|
enabled: !value.paused,
|
|
346
|
-
on_run_completed: (!newThread ||
|
|
406
|
+
on_run_completed: (!newThread || origin
|
|
347
407
|
? "keep"
|
|
348
408
|
: "delete"),
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
...runContext,
|
|
353
|
-
},
|
|
409
|
+
// A same-thread schedule answers wherever its thread's record
|
|
410
|
+
// points when it runs, so it carries no channel of its own.
|
|
411
|
+
context: { mda_schedule: { name }, ...runContext },
|
|
354
412
|
metadata: {
|
|
355
413
|
...value.metadata,
|
|
414
|
+
// The cron's new thread starts with the conversation's record.
|
|
415
|
+
...(newThread &&
|
|
416
|
+
origin &&
|
|
417
|
+
newThreadRecord(origin, run, ctx.access)),
|
|
356
418
|
mda_managed: true,
|
|
357
419
|
mda_managed_by: "runtime",
|
|
358
420
|
mda_schedule: name,
|