managed-deepagents 0.9.6-dev.13 → 0.9.6-dev.15

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.
Files changed (332) hide show
  1. package/README.md +953 -57
  2. package/dist/agent-auth.d.ts +1 -1
  3. package/dist/agent-auth.d.ts.map +1 -1
  4. package/dist/agent-auth.js +36 -12
  5. package/dist/agent-auth.js.map +1 -1
  6. package/dist/channels/actor.d.ts +43 -0
  7. package/dist/channels/actor.d.ts.map +1 -0
  8. package/dist/channels/actor.js +2 -0
  9. package/dist/channels/actor.js.map +1 -0
  10. package/dist/channels/assistant-text.d.ts +24 -0
  11. package/dist/channels/assistant-text.d.ts.map +1 -1
  12. package/dist/channels/assistant-text.js +65 -1
  13. package/dist/channels/assistant-text.js.map +1 -1
  14. package/dist/channels/binding.d.ts +20 -1
  15. package/dist/channels/binding.d.ts.map +1 -1
  16. package/dist/channels/binding.js +39 -10
  17. package/dist/channels/binding.js.map +1 -1
  18. package/dist/channels/delivery.d.ts +21 -0
  19. package/dist/channels/delivery.d.ts.map +1 -0
  20. package/dist/channels/delivery.js +196 -0
  21. package/dist/channels/delivery.js.map +1 -0
  22. package/dist/channels/github/connections.d.ts +11 -0
  23. package/dist/channels/github/connections.d.ts.map +1 -0
  24. package/dist/channels/github/connections.js +14 -0
  25. package/dist/channels/github/connections.js.map +1 -0
  26. package/dist/channels/github/index.d.ts +8 -0
  27. package/dist/channels/github/index.d.ts.map +1 -0
  28. package/dist/channels/github/index.js +274 -0
  29. package/dist/channels/github/index.js.map +1 -0
  30. package/dist/channels/github/mentions.d.ts +12 -0
  31. package/dist/channels/github/mentions.d.ts.map +1 -0
  32. package/dist/channels/github/mentions.js +185 -0
  33. package/dist/channels/github/mentions.js.map +1 -0
  34. package/dist/channels/github/schema.d.ts +4165 -0
  35. package/dist/channels/github/schema.d.ts.map +1 -0
  36. package/dist/channels/github/schema.js +221 -0
  37. package/dist/channels/github/schema.js.map +1 -0
  38. package/dist/channels/github/types.d.ts +163 -0
  39. package/dist/channels/github/types.d.ts.map +1 -0
  40. package/dist/channels/github/types.js +2 -0
  41. package/dist/channels/github/types.js.map +1 -0
  42. package/dist/channels/http/endpoint.d.ts +95 -0
  43. package/dist/channels/http/endpoint.d.ts.map +1 -0
  44. package/dist/channels/http/endpoint.js +276 -0
  45. package/dist/channels/http/endpoint.js.map +1 -0
  46. package/dist/channels/http/http.d.ts.map +1 -1
  47. package/dist/channels/http/http.js +386 -65
  48. package/dist/channels/http/http.js.map +1 -1
  49. package/dist/channels/http/index.d.ts +2 -1
  50. package/dist/channels/http/index.d.ts.map +1 -1
  51. package/dist/channels/http/index.js +14 -10
  52. package/dist/channels/http/index.js.map +1 -1
  53. package/dist/channels/http/ingress.d.ts +65 -5
  54. package/dist/channels/http/ingress.d.ts.map +1 -1
  55. package/dist/channels/http/ingress.js +149 -33
  56. package/dist/channels/http/ingress.js.map +1 -1
  57. package/dist/channels/http/provider.d.ts +119 -0
  58. package/dist/channels/http/provider.d.ts.map +1 -0
  59. package/dist/channels/http/provider.js +227 -0
  60. package/dist/channels/http/provider.js.map +1 -0
  61. package/dist/channels/http/studio.d.ts +24 -0
  62. package/dist/channels/http/studio.d.ts.map +1 -0
  63. package/dist/channels/http/studio.js +95 -0
  64. package/dist/channels/http/studio.js.map +1 -0
  65. package/dist/channels/http/threads.d.ts +7 -0
  66. package/dist/channels/http/threads.d.ts.map +1 -0
  67. package/dist/channels/http/threads.js +10 -0
  68. package/dist/channels/http/threads.js.map +1 -0
  69. package/dist/channels/http/types.d.ts +143 -2
  70. package/dist/channels/http/types.d.ts.map +1 -1
  71. package/dist/channels/linear/connections.d.ts +11 -0
  72. package/dist/channels/linear/connections.d.ts.map +1 -0
  73. package/dist/channels/linear/connections.js +14 -0
  74. package/dist/channels/linear/connections.js.map +1 -0
  75. package/dist/channels/linear/graphql.d.ts +57 -0
  76. package/dist/channels/linear/graphql.d.ts.map +1 -0
  77. package/dist/channels/linear/graphql.js +167 -0
  78. package/dist/channels/linear/graphql.js.map +1 -0
  79. package/dist/channels/linear/index.d.ts +9 -0
  80. package/dist/channels/linear/index.d.ts.map +1 -0
  81. package/dist/channels/linear/index.js +489 -0
  82. package/dist/channels/linear/index.js.map +1 -0
  83. package/dist/channels/linear/schema.d.ts +1050 -0
  84. package/dist/channels/linear/schema.d.ts.map +1 -0
  85. package/dist/channels/linear/schema.js +255 -0
  86. package/dist/channels/linear/schema.js.map +1 -0
  87. package/dist/channels/linear/types.d.ts +162 -0
  88. package/dist/channels/linear/types.d.ts.map +1 -0
  89. package/dist/channels/linear/types.js +2 -0
  90. package/dist/channels/linear/types.js.map +1 -0
  91. package/dist/channels/message-schema.d.ts +2 -0
  92. package/dist/channels/message-schema.d.ts.map +1 -1
  93. package/dist/channels/message-schema.js +4 -0
  94. package/dist/channels/message-schema.js.map +1 -1
  95. package/dist/channels/messaging-registry.d.ts +16 -0
  96. package/dist/channels/messaging-registry.d.ts.map +1 -1
  97. package/dist/channels/messaging-registry.js +29 -0
  98. package/dist/channels/messaging-registry.js.map +1 -1
  99. package/dist/channels/reserved-connections.d.ts +12 -0
  100. package/dist/channels/reserved-connections.d.ts.map +1 -0
  101. package/dist/channels/reserved-connections.js +55 -0
  102. package/dist/channels/reserved-connections.js.map +1 -0
  103. package/dist/channels/run-input.d.ts +71 -0
  104. package/dist/channels/run-input.d.ts.map +1 -0
  105. package/dist/channels/run-input.js +155 -0
  106. package/dist/channels/run-input.js.map +1 -0
  107. package/dist/channels/runtime.d.ts +1 -1
  108. package/dist/channels/runtime.d.ts.map +1 -1
  109. package/dist/channels/runtime.js +1 -1
  110. package/dist/channels/runtime.js.map +1 -1
  111. package/dist/channels/schedule-delivery.d.ts +1 -1
  112. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  113. package/dist/channels/schedule-delivery.js +12 -23
  114. package/dist/channels/schedule-delivery.js.map +1 -1
  115. package/dist/channels/slack/api.d.ts +2 -0
  116. package/dist/channels/slack/api.d.ts.map +1 -1
  117. package/dist/channels/slack/api.js +6 -0
  118. package/dist/channels/slack/api.js.map +1 -1
  119. package/dist/channels/slack/connections.d.ts +6 -0
  120. package/dist/channels/slack/connections.d.ts.map +1 -0
  121. package/dist/channels/slack/connections.js +6 -0
  122. package/dist/channels/slack/connections.js.map +1 -0
  123. package/dist/channels/slack/events.d.ts +272 -0
  124. package/dist/channels/slack/events.d.ts.map +1 -0
  125. package/dist/channels/slack/events.js +235 -0
  126. package/dist/channels/slack/events.js.map +1 -0
  127. package/dist/channels/slack/files.d.ts.map +1 -1
  128. package/dist/channels/slack/files.js +2 -3
  129. package/dist/channels/slack/files.js.map +1 -1
  130. package/dist/channels/slack/index.d.ts +76 -2
  131. package/dist/channels/slack/index.d.ts.map +1 -1
  132. package/dist/channels/slack/index.js +177 -6
  133. package/dist/channels/slack/index.js.map +1 -1
  134. package/dist/channels/slack/message-content.d.ts.map +1 -1
  135. package/dist/channels/slack/message-content.js +23 -28
  136. package/dist/channels/slack/message-content.js.map +1 -1
  137. package/dist/channels/slack/status.d.ts +76 -0
  138. package/dist/channels/slack/status.d.ts.map +1 -0
  139. package/dist/channels/slack/status.js +427 -0
  140. package/dist/channels/slack/status.js.map +1 -0
  141. package/dist/channels/source-providers.js +1 -1
  142. package/dist/channels/source-providers.js.map +1 -1
  143. package/dist/channels/trigger/client.d.ts.map +1 -1
  144. package/dist/channels/trigger/client.js +6 -15
  145. package/dist/channels/trigger/client.js.map +1 -1
  146. package/dist/channels/trigger/http.d.ts +114 -3
  147. package/dist/channels/trigger/http.d.ts.map +1 -1
  148. package/dist/channels/trigger/http.js +314 -82
  149. package/dist/channels/trigger/http.js.map +1 -1
  150. package/dist/channels/trigger/identity-context.d.ts +1 -1
  151. package/dist/channels/trigger/identity-context.d.ts.map +1 -1
  152. package/dist/channels/trigger/identity-context.js +2 -3
  153. package/dist/channels/trigger/identity-context.js.map +1 -1
  154. package/dist/channels/trigger/ingress.d.ts +38 -1
  155. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  156. package/dist/channels/trigger/ingress.js +47 -19
  157. package/dist/channels/trigger/ingress.js.map +1 -1
  158. package/dist/channels/trigger/types.d.ts +82 -3
  159. package/dist/channels/trigger/types.d.ts.map +1 -1
  160. package/dist/channels/trigger/types.js +36 -0
  161. package/dist/channels/trigger/types.js.map +1 -1
  162. package/dist/channels/types.d.ts +19 -3
  163. package/dist/channels/types.d.ts.map +1 -1
  164. package/dist/channels/types.js +2 -0
  165. package/dist/channels/types.js.map +1 -1
  166. package/dist/connections.d.ts +31 -0
  167. package/dist/connections.d.ts.map +1 -1
  168. package/dist/connections.js +108 -11
  169. package/dist/connections.js.map +1 -1
  170. package/dist/credential-gate.d.ts +2 -0
  171. package/dist/credential-gate.d.ts.map +1 -1
  172. package/dist/credential-gate.js +37 -3
  173. package/dist/credential-gate.js.map +1 -1
  174. package/dist/define-deep-agent.d.ts.map +1 -1
  175. package/dist/define-deep-agent.js +6 -0
  176. package/dist/define-deep-agent.js.map +1 -1
  177. package/dist/identity/loopback.d.ts +1 -6
  178. package/dist/identity/loopback.d.ts.map +1 -1
  179. package/dist/identity/loopback.js +2 -12
  180. package/dist/identity/loopback.js.map +1 -1
  181. package/dist/index.d.ts +15 -4
  182. package/dist/index.d.ts.map +1 -1
  183. package/dist/index.js +2 -1
  184. package/dist/index.js.map +1 -1
  185. package/dist/ingress/index.d.ts +0 -8
  186. package/dist/ingress/index.d.ts.map +1 -1
  187. package/dist/ingress/index.js +2 -32
  188. package/dist/ingress/index.js.map +1 -1
  189. package/dist/ingress/runs.d.ts +74 -1
  190. package/dist/ingress/runs.d.ts.map +1 -1
  191. package/dist/ingress/runs.js +176 -16
  192. package/dist/ingress/runs.js.map +1 -1
  193. package/dist/managed-composition.d.ts.map +1 -1
  194. package/dist/managed-composition.js +8 -13
  195. package/dist/managed-composition.js.map +1 -1
  196. package/dist/memory/instructions-middleware.d.ts.map +1 -1
  197. package/dist/memory/instructions-middleware.js +5 -6
  198. package/dist/memory/instructions-middleware.js.map +1 -1
  199. package/dist/namespaces.d.ts +21 -21
  200. package/dist/namespaces.d.ts.map +1 -1
  201. package/dist/namespaces.js +4 -29
  202. package/dist/namespaces.js.map +1 -1
  203. package/dist/runtime/auth.d.ts.map +1 -1
  204. package/dist/runtime/auth.js +151 -21
  205. package/dist/runtime/auth.js.map +1 -1
  206. package/dist/runtime/channel-icon.d.ts +22 -0
  207. package/dist/runtime/channel-icon.d.ts.map +1 -0
  208. package/dist/runtime/channel-icon.js +70 -0
  209. package/dist/runtime/channel-icon.js.map +1 -0
  210. package/dist/runtime/channel.d.ts +6 -0
  211. package/dist/runtime/channel.d.ts.map +1 -1
  212. package/dist/runtime/channel.js.map +1 -1
  213. package/dist/runtime/http.d.ts +0 -15
  214. package/dist/runtime/http.d.ts.map +1 -1
  215. package/dist/runtime/http.js +0 -37
  216. package/dist/runtime/http.js.map +1 -1
  217. package/dist/runtime/identity-http.d.ts +2 -0
  218. package/dist/runtime/identity-http.d.ts.map +1 -1
  219. package/dist/runtime/identity-http.js +40 -16
  220. package/dist/runtime/identity-http.js.map +1 -1
  221. package/dist/runtime/identity-runtime.d.ts +10 -0
  222. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  223. package/dist/runtime/identity-runtime.js +22 -0
  224. package/dist/runtime/identity-runtime.js.map +1 -1
  225. package/dist/runtime/index.d.ts.map +1 -1
  226. package/dist/runtime/index.js +46 -47
  227. package/dist/runtime/index.js.map +1 -1
  228. package/dist/runtime/log.d.ts +14 -8
  229. package/dist/runtime/log.d.ts.map +1 -1
  230. package/dist/runtime/log.js +7 -16
  231. package/dist/runtime/log.js.map +1 -1
  232. package/dist/runtime/managed-middleware.d.ts.map +1 -1
  233. package/dist/runtime/managed-middleware.js +14 -1
  234. package/dist/runtime/managed-middleware.js.map +1 -1
  235. package/dist/runtime/managed-thread.d.ts +60 -0
  236. package/dist/runtime/managed-thread.d.ts.map +1 -0
  237. package/dist/runtime/managed-thread.js +76 -0
  238. package/dist/runtime/managed-thread.js.map +1 -0
  239. package/dist/runtime/managed-tools.d.ts +10 -10
  240. package/dist/runtime/managed-tools.d.ts.map +1 -1
  241. package/dist/runtime/managed-tools.js +24 -24
  242. package/dist/runtime/managed-tools.js.map +1 -1
  243. package/dist/runtime/memory/mounts.d.ts +11 -82
  244. package/dist/runtime/memory/mounts.d.ts.map +1 -1
  245. package/dist/runtime/memory/mounts.js +34 -173
  246. package/dist/runtime/memory/mounts.js.map +1 -1
  247. package/dist/runtime/memory/policy.d.ts.map +1 -1
  248. package/dist/runtime/memory/policy.js +1 -3
  249. package/dist/runtime/memory/policy.js.map +1 -1
  250. package/dist/runtime/run-input.d.ts +10 -0
  251. package/dist/runtime/run-input.d.ts.map +1 -1
  252. package/dist/runtime/run-input.js +47 -19
  253. package/dist/runtime/run-input.js.map +1 -1
  254. package/dist/runtime/sandbox-manager.d.ts +1 -1
  255. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  256. package/dist/runtime/sandbox-manager.js +9 -7
  257. package/dist/runtime/sandbox-manager.js.map +1 -1
  258. package/dist/runtime/schedule-auth.d.ts +17 -0
  259. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  260. package/dist/runtime/schedule-auth.js +39 -1
  261. package/dist/runtime/schedule-auth.js.map +1 -1
  262. package/dist/runtime/selected-skills-backend.d.ts +3 -3
  263. package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
  264. package/dist/runtime/selected-skills-backend.js +5 -5
  265. package/dist/runtime/selected-skills-backend.js.map +1 -1
  266. package/dist/runtime/thread-record.d.ts +81 -0
  267. package/dist/runtime/thread-record.d.ts.map +1 -0
  268. package/dist/runtime/thread-record.js +205 -0
  269. package/dist/runtime/thread-record.js.map +1 -0
  270. package/dist/runtime/types.d.ts +5 -1
  271. package/dist/runtime/types.d.ts.map +1 -1
  272. package/dist/runtime-schedules.d.ts +13 -0
  273. package/dist/runtime-schedules.d.ts.map +1 -1
  274. package/dist/runtime-schedules.js +86 -22
  275. package/dist/runtime-schedules.js.map +1 -1
  276. package/dist/sandbox.d.ts +0 -6
  277. package/dist/sandbox.d.ts.map +1 -1
  278. package/dist/sandbox.js +3 -7
  279. package/dist/sandbox.js.map +1 -1
  280. package/dist/schedule-channel.d.ts +5 -2
  281. package/dist/schedule-channel.d.ts.map +1 -1
  282. package/dist/schedule-channel.js +13 -12
  283. package/dist/schedule-channel.js.map +1 -1
  284. package/dist/telemetry/run-listener.d.ts +1 -1
  285. package/dist/telemetry/run-listener.d.ts.map +1 -1
  286. package/dist/telemetry/run-listener.js +2 -32
  287. package/dist/telemetry/run-listener.js.map +1 -1
  288. package/dist/telemetry/transport/posthog.d.ts +1 -13
  289. package/dist/telemetry/transport/posthog.d.ts.map +1 -1
  290. package/dist/telemetry/transport/posthog.js +30 -68
  291. package/dist/telemetry/transport/posthog.js.map +1 -1
  292. package/dist/values.d.ts +15 -0
  293. package/dist/values.d.ts.map +1 -0
  294. package/dist/values.js +31 -0
  295. package/dist/values.js.map +1 -0
  296. package/package.json +11 -11
  297. package/dist/concurrency/batch-processor.d.ts +0 -51
  298. package/dist/concurrency/batch-processor.d.ts.map +0 -1
  299. package/dist/concurrency/batch-processor.js +0 -99
  300. package/dist/concurrency/batch-processor.js.map +0 -1
  301. package/dist/resilience/retry.d.ts +0 -21
  302. package/dist/resilience/retry.d.ts.map +0 -1
  303. package/dist/resilience/retry.js +0 -40
  304. package/dist/resilience/retry.js.map +0 -1
  305. package/dist/runtime/graph-build-timing.d.ts +0 -30
  306. package/dist/runtime/graph-build-timing.d.ts.map +0 -1
  307. package/dist/runtime/graph-build-timing.js +0 -50
  308. package/dist/runtime/graph-build-timing.js.map +0 -1
  309. package/dist/telemetry/lifecycle.d.ts +0 -26
  310. package/dist/telemetry/lifecycle.d.ts.map +0 -1
  311. package/dist/telemetry/lifecycle.js +0 -49
  312. package/dist/telemetry/lifecycle.js.map +0 -1
  313. package/dist/telemetry/otel/context.d.ts +0 -57
  314. package/dist/telemetry/otel/context.d.ts.map +0 -1
  315. package/dist/telemetry/otel/context.js +0 -122
  316. package/dist/telemetry/otel/context.js.map +0 -1
  317. package/dist/telemetry/otel/exporter.d.ts +0 -53
  318. package/dist/telemetry/otel/exporter.d.ts.map +0 -1
  319. package/dist/telemetry/otel/exporter.js +0 -190
  320. package/dist/telemetry/otel/exporter.js.map +0 -1
  321. package/dist/telemetry/otel/index.d.ts +0 -6
  322. package/dist/telemetry/otel/index.d.ts.map +0 -1
  323. package/dist/telemetry/otel/index.js +0 -3
  324. package/dist/telemetry/otel/index.js.map +0 -1
  325. package/dist/telemetry/otel/otlp.d.ts +0 -44
  326. package/dist/telemetry/otel/otlp.d.ts.map +0 -1
  327. package/dist/telemetry/otel/otlp.js +0 -7
  328. package/dist/telemetry/otel/otlp.js.map +0 -1
  329. package/dist/telemetry/otel/truncate.d.ts +0 -10
  330. package/dist/telemetry/otel/truncate.d.ts.map +0 -1
  331. package/dist/telemetry/otel/truncate.js +0 -39
  332. package/dist/telemetry/otel/truncate.js.map +0 -1
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ import type { ChannelBinding } from "../channels/binding.js";
3
+ export declare const THREAD_RECORD_METADATA = "ls_mda_thread";
4
+ export declare const THREAD_PARTICIPANTS_METADATA = "ls_mda_participants";
5
+ /** Every thread-record key; only managed ingress may write one. */
6
+ export declare const THREAD_RECORD_METADATA_PREFIX = "ls_mda_";
7
+ export type ThreadRole = "owner" | "member";
8
+ /** A person on the thread, by `principal.id`. */
9
+ export interface ThreadRecordParticipant {
10
+ id: string;
11
+ role: ThreadRole;
12
+ }
13
+ declare const storedOriginSchema: z.ZodObject<{
14
+ channel: z.ZodObject<{
15
+ name: z.ZodString;
16
+ provider: z.ZodString;
17
+ transport: z.ZodEnum<{
18
+ direct: "direct";
19
+ trigger_server: "trigger_server";
20
+ }>;
21
+ source_thread_key: z.ZodString;
22
+ address: z.ZodJSONSchema;
23
+ delivery_id: z.ZodString;
24
+ }, z.core.$strict>;
25
+ sender: z.ZodDefault<z.ZodNullable<z.ZodString>>;
26
+ }, z.core.$strict>;
27
+ /** A Trigger binding's target: the channel, its opaque address and its thread. */
28
+ export declare const triggerTargetSchema: z.ZodObject<{
29
+ channel_id: z.ZodString;
30
+ address: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
31
+ source_thread_key: z.ZodString;
32
+ }, z.core.$strip>;
33
+ export type StoredOrigin = z.infer<typeof storedOriginSchema>;
34
+ export interface ThreadRecord {
35
+ origin: StoredOrigin | null;
36
+ /** In the order they joined the thread. */
37
+ participants: ThreadRecordParticipant[];
38
+ }
39
+ /** A binding rebuilt from a stored origin: it has no event. */
40
+ export type OriginBinding = Omit<ChannelBinding, "event" | "rawEvent">;
41
+ /**
42
+ * A person is a non-blank principal id outside the `mda:` service namespace
43
+ * (`mda:channel`, `mda:slack`, `mda:schedule:*`).
44
+ */
45
+ export declare function isPersonPrincipal(id: unknown): id is string;
46
+ /** The stored form of a binding: no event, and its target as `address`. */
47
+ export declare function originFromBinding(binding: OriginBinding, sender: string | null): StoredOrigin;
48
+ /** The binding a stored origin was made from, without its event. */
49
+ export declare function bindingFromOrigin(origin: StoredOrigin): OriginBinding | undefined;
50
+ /**
51
+ * The record in a thread's or run's metadata, or `null` when there is none or
52
+ * it is malformed. A malformed origin keeps the participants. With `exact`,
53
+ * as a write must be, a malformed origin or a participant list that does not
54
+ * name exactly the participants rejects the whole record.
55
+ */
56
+ export declare function parseThreadRecord(metadata: unknown, { exact }?: {
57
+ exact?: boolean;
58
+ }): ThreadRecord | null;
59
+ /**
60
+ * The record after a channel event: the event's channel is the origin, and a
61
+ * person who sends it joins, as owner when they are the first.
62
+ */
63
+ export declare function nextThreadRecord(current: ThreadRecord | null, binding: OriginBinding, senderId: string): ThreadRecord;
64
+ /** The metadata keys that store a record. */
65
+ export declare function threadRecordMetadata(record: ThreadRecord): {
66
+ [THREAD_RECORD_METADATA]: Record<string, unknown>;
67
+ [THREAD_PARTICIPANTS_METADATA]: string[];
68
+ };
69
+ /** Whether metadata already stores exactly this record. */
70
+ export declare function storesThreadRecord(metadata: unknown, record: ThreadRecord): boolean;
71
+ /**
72
+ * Remove every thread-record key from a metadata object, in place. With
73
+ * `keepRecord`, the two keys a record is stored in stay.
74
+ */
75
+ export declare function stripThreadRecordKeys(metadata: unknown, { keepRecord }?: {
76
+ keepRecord?: boolean;
77
+ }): void;
78
+ /** Whether metadata names any thread-record key. */
79
+ export declare function hasThreadRecordKeys(metadata: unknown): boolean;
80
+ export {};
81
+ //# sourceMappingURL=thread-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-record.d.ts","sourceRoot":"","sources":["../../src/runtime/thread-record.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AACtD,eAAO,MAAM,4BAA4B,wBAAwB,CAAC;AAClE,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,YAAY,CAAC;AAEvD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5C,iDAAiD;AACjD,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;CAClB;AAWD,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;kBAGtB,CAAC;AASH,kFAAkF;AAClF,eAAO,MAAM,mBAAmB;;;;iBAI9B,CAAC;AAMH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,2CAA2C;IAC3C,YAAY,EAAE,uBAAuB,EAAE,CAAC;CACzC;AAED,+DAA+D;AAC/D,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;AAWvE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAE3D;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,YAAY,CAqBd;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,YAAY,GACnB,aAAa,GAAG,SAAS,CAqB3B;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,EACjB,EAAE,KAAa,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,YAAY,GAAG,IAAI,CAgCrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GACf,YAAY,CASd;AAED,6CAA6C;AAC7C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG;IAC1D,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1C,CAYA;AAED,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,EACjB,MAAM,EAAE,YAAY,GACnB,OAAO,CAaT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EACjB,EAAE,UAAkB,EAAE,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACpD,IAAI,CAYN;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAO9D"}
@@ -0,0 +1,205 @@
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
+ /** Every thread-record key; only managed ingress may write one. */
16
+ export const THREAD_RECORD_METADATA_PREFIX = "ls_mda_";
17
+ const nonblankString = z.string().refine((value) => value.trim().length > 0);
18
+ const storedChannelSchema = z.strictObject({
19
+ name: nonblankString,
20
+ provider: nonblankString,
21
+ transport: z.enum(["trigger_server", "direct"]),
22
+ source_thread_key: nonblankString,
23
+ address: z.json(),
24
+ delivery_id: nonblankString,
25
+ });
26
+ const storedOriginSchema = z.strictObject({
27
+ channel: storedChannelSchema,
28
+ sender: z.string().nullable().default(null),
29
+ });
30
+ const recordSchema = z.strictObject({
31
+ v: z.literal(1),
32
+ origin: z.unknown().optional(),
33
+ participants: z
34
+ .record(z.string(), z.strictObject({ role: z.enum(["owner", "member"]) }))
35
+ .default({}),
36
+ });
37
+ /** A Trigger binding's target: the channel, its opaque address and its thread. */
38
+ export const triggerTargetSchema = z.object({
39
+ channel_id: nonblankString,
40
+ address: z.record(z.string(), z.json()),
41
+ source_thread_key: nonblankString,
42
+ });
43
+ /** A stored Trigger address: the target's address with its channel id. */
44
+ const triggerAddressSchema = z
45
+ .object({ channel_id: nonblankString })
46
+ .catchall(z.json());
47
+ let reportedMalformed = false;
48
+ /** Say once that a record was ignored, without any of its values. */
49
+ function reportMalformed(part) {
50
+ if (reportedMalformed)
51
+ return;
52
+ reportedMalformed = true;
53
+ logger.warn(`thread ${part} metadata is malformed and was ignored`);
54
+ }
55
+ /**
56
+ * A person is a non-blank principal id outside the `mda:` service namespace
57
+ * (`mda:channel`, `mda:slack`, `mda:schedule:*`).
58
+ */
59
+ export function isPersonPrincipal(id) {
60
+ return typeof id === "string" && !!id.trim() && !id.startsWith("mda:");
61
+ }
62
+ /** The stored form of a binding: no event, and its target as `address`. */
63
+ export function originFromBinding(binding, sender) {
64
+ const trigger = binding.transport === "trigger_server"
65
+ ? triggerTargetSchema.safeParse(binding.target)
66
+ : undefined;
67
+ // A Trigger target that doesn't parse is stored as is, and no run can
68
+ // rebuild it.
69
+ const address = trigger?.success
70
+ ? { channel_id: trigger.data.channel_id, ...trigger.data.address }
71
+ : binding.target;
72
+ return {
73
+ channel: {
74
+ name: binding.name,
75
+ provider: binding.provider,
76
+ transport: binding.transport,
77
+ source_thread_key: binding.sourceThreadKey,
78
+ address,
79
+ delivery_id: binding.deliveryId,
80
+ },
81
+ sender,
82
+ };
83
+ }
84
+ /** The binding a stored origin was made from, without its event. */
85
+ export function bindingFromOrigin(origin) {
86
+ const { channel } = origin;
87
+ let target = channel.address;
88
+ if (channel.transport === "trigger_server") {
89
+ const address = triggerAddressSchema.safeParse(channel.address);
90
+ if (!address.success)
91
+ return undefined;
92
+ const { channel_id, ...rest } = address.data;
93
+ target = {
94
+ channel_id,
95
+ address: rest,
96
+ source_thread_key: channel.source_thread_key,
97
+ };
98
+ }
99
+ return {
100
+ name: channel.name,
101
+ provider: channel.provider,
102
+ transport: channel.transport,
103
+ sourceThreadKey: channel.source_thread_key,
104
+ deliveryId: channel.delivery_id,
105
+ target,
106
+ };
107
+ }
108
+ /**
109
+ * The record in a thread's or run's metadata, or `null` when there is none or
110
+ * it is malformed. A malformed origin keeps the participants. With `exact`,
111
+ * as a write must be, a malformed origin or a participant list that does not
112
+ * name exactly the participants rejects the whole record.
113
+ */
114
+ export function parseThreadRecord(metadata, { exact = false } = {}) {
115
+ if (!isRecord(metadata) || metadata[THREAD_RECORD_METADATA] == null)
116
+ return null;
117
+ const parsed = recordSchema.safeParse(metadata[THREAD_RECORD_METADATA]);
118
+ if (!parsed.success) {
119
+ reportMalformed("record");
120
+ return null;
121
+ }
122
+ const roles = parsed.data.participants;
123
+ const origin = parsed.data.origin == null
124
+ ? undefined
125
+ : storedOriginSchema.safeParse(parsed.data.origin);
126
+ if (origin?.success === false)
127
+ reportMalformed("origin");
128
+ // JSON object keys that look like integers lose their order, so the list
129
+ // carries who joined first.
130
+ const listed = metadata[THREAD_PARTICIPANTS_METADATA];
131
+ const ids = isStringList(listed) &&
132
+ listed.length === Object.keys(roles).length &&
133
+ new Set(listed).size === listed.length &&
134
+ listed.every((id) => Object.hasOwn(roles, id))
135
+ ? listed
136
+ : undefined;
137
+ if (exact && (origin?.success === false || !ids))
138
+ return null;
139
+ return {
140
+ origin: origin?.success ? origin.data : null,
141
+ participants: (ids ?? Object.keys(roles)).map((id) => ({
142
+ id,
143
+ role: roles[id].role,
144
+ })),
145
+ };
146
+ }
147
+ /**
148
+ * The record after a channel event: the event's channel is the origin, and a
149
+ * person who sends it joins, as owner when they are the first.
150
+ */
151
+ export function nextThreadRecord(current, binding, senderId) {
152
+ const sender = isPersonPrincipal(senderId) ? senderId : null;
153
+ const participants = [...(current?.participants ?? [])];
154
+ if (sender !== null && !participants.some(({ id }) => id === sender))
155
+ participants.push({
156
+ id: sender,
157
+ role: participants.length ? "member" : "owner",
158
+ });
159
+ return { origin: originFromBinding(binding, sender), participants };
160
+ }
161
+ /** The metadata keys that store a record. */
162
+ export function threadRecordMetadata(record) {
163
+ return {
164
+ [THREAD_RECORD_METADATA]: {
165
+ v: 1,
166
+ // Absent rather than `null`: a SQLite metadata patch deletes nulls.
167
+ ...(record.origin !== null && { origin: record.origin }),
168
+ participants: Object.fromEntries(record.participants.map(({ id, role }) => [id, { role }])),
169
+ },
170
+ [THREAD_PARTICIPANTS_METADATA]: record.participants.map(({ id }) => id),
171
+ };
172
+ }
173
+ /** Whether metadata already stores exactly this record. */
174
+ export function storesThreadRecord(metadata, record) {
175
+ const stored = threadRecordMetadata(record);
176
+ return (isRecord(metadata) &&
177
+ isDeepStrictEqual(metadata[THREAD_RECORD_METADATA], stored[THREAD_RECORD_METADATA]) &&
178
+ isDeepStrictEqual(metadata[THREAD_PARTICIPANTS_METADATA], stored[THREAD_PARTICIPANTS_METADATA]));
179
+ }
180
+ /**
181
+ * Remove every thread-record key from a metadata object, in place. With
182
+ * `keepRecord`, the two keys a record is stored in stay.
183
+ */
184
+ export function stripThreadRecordKeys(metadata, { keepRecord = false } = {}) {
185
+ if (!isRecord(metadata))
186
+ return;
187
+ for (const key of Object.keys(metadata)) {
188
+ if (key.startsWith(THREAD_RECORD_METADATA_PREFIX) &&
189
+ !(keepRecord &&
190
+ (key === THREAD_RECORD_METADATA || key === THREAD_PARTICIPANTS_METADATA)))
191
+ delete metadata[key];
192
+ }
193
+ }
194
+ /** Whether metadata names any thread-record key. */
195
+ export function hasThreadRecordKeys(metadata) {
196
+ return (isRecord(metadata) &&
197
+ Object.keys(metadata).some((key) => key.startsWith(THREAD_RECORD_METADATA_PREFIX)));
198
+ }
199
+ function isStringList(value) {
200
+ return (Array.isArray(value) && value.every((item) => typeof item === "string"));
201
+ }
202
+ function isRecord(value) {
203
+ return typeof value === "object" && value !== null && !Array.isArray(value);
204
+ }
205
+ //# 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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"}
@@ -5,6 +5,7 @@ import type { MemoryDefinition } from "../memory/index.js";
5
5
  import type { SandboxDefinition } from "../sandbox.js";
6
6
  import type { Channel } from "./channel.js";
7
7
  import type { ManagedRuntimeExtras } from "./managed-tools.js";
8
+ import type { ManagedThread } from "./managed-thread.js";
8
9
  import type { Connector } from "./connector.js";
9
10
  /**
10
11
  * The LangGraph runnable config passed to a graph factory at invocation time.
@@ -14,7 +15,10 @@ import type { Connector } from "./connector.js";
14
15
  */
15
16
  export type ManagedRunConfig = LangGraphRunnableConfig<Record<string, unknown>>;
16
17
  /** Native Agent Server factory runtime with managed fields. */
17
- export type ManagedServerRuntime<AppContext = Record<string, unknown>> = ServerRuntime<AppContext> & ManagedRuntimeExtras;
18
+ export type ManagedServerRuntime<AppContext = Record<string, unknown>> = ServerRuntime<AppContext> & Omit<ManagedRuntimeExtras, "thread"> & {
19
+ /** The run's thread; `null` outside a run, such as for graph inspection. */
20
+ thread?: ManagedThread | null;
21
+ };
18
22
  /**
19
23
  * Managed values the CLI injects into the generated entry module.
20
24
  *
@@ -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,GAAG,oBAAoB,CAAC;AAEnD;;;;;;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;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
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,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;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B"}
@@ -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,12 @@ 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
+ runAs?: ThreadParticipant | null;
37
44
  };
38
45
  export type SchedulePatch = ({
39
46
  cron?: string;
@@ -68,8 +75,14 @@ export interface ScheduleRecord {
68
75
  input?: ScheduleInput;
69
76
  thread: ScheduleThreadConfig;
70
77
  newThread: boolean;
78
+ /**
79
+ * The channel a new-thread schedule posts to. `null` for a same-thread
80
+ * schedule, whose thread decides at each run.
81
+ */
71
82
  channel: string | null;
72
83
  target: JsonValue;
84
+ /** Who the schedule runs as, when not its owner. */
85
+ runAs: ThreadParticipant | null;
73
86
  deliverTo?: ScheduleDeliveryTarget;
74
87
  context?: Record<string, JsonValue>;
75
88
  paused: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-schedules.d.ts","sourceRoot":"","sources":["../src/runtime-schedules.ts"],"names":[],"mappings":"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"}
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;AAGrD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AASvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAWrE,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAI9E,MAAM,MAAM,aAAa,GACrB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC5B;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,CAAC;AACnC,KAAK,MAAM,GACP;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC1D,KAAK,KAAK,GACN;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GACjC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,MAAM,GACjC,KAAK,GAAG;IACN,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC;;;;OAIG;IACH,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAClC,CAAC;AACJ,MAAM,MAAM,aAAa,GAAG,CACxB;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAA;CAAE,CACxD,GACC,CACI;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAC3C,GAAG;IACF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC,CAAC;AACJ,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,oDAAoD;IACpD,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC;AACD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAuID,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,cAGC;CACF;AA8RD,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE;QACZ,KAAK,EAAE,aAAa,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5E,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE,GAChC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,CAqPlB;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,gBAA2C,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { z } from "zod";
3
- import { getDeploymentId, readScheduleDeliverTo, } from "./channels/schedule-delivery.js";
3
+ import { 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 { captureScheduleChannel } from "./schedule-channel.js";
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.startsWith("mda_")), "Metadata keys starting with mda_ are reserved");
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,7 +137,8 @@ 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 = getDeploymentId();
140
+ const deployment = process.env.LANGSMITH_HOST_PROJECT_ID?.trim() ||
141
+ process.env.LANGGRAPH_CLOUD_ID?.trim();
134
142
  if (!deployment)
135
143
  throw new Error("Schedules require a deployment ID");
136
144
  if (!identity)
@@ -235,9 +243,12 @@ function record(wire, ctx, now = Date.now()) {
235
243
  const routing = wire.payload.context ?? wire.payload.config?.configurable;
236
244
  const schedule = routing?.mda_schedule;
237
245
  const deliverTo = spec.deliverTo ?? readScheduleDeliverTo(schedule?.deliver_to);
246
+ // New-thread schedules carry their thread's record; older ones a channel.
247
+ const stored = parseThreadRecord(wire.metadata)?.origin;
238
248
  const rawChannel = routing?.mda_channel ??
239
249
  (wire.payload.context == null ? routing?.channel : undefined);
240
- const channel = rawChannel == null ? undefined : channelContextSchema.parse(rawChannel);
250
+ const channel = (stored && bindingFromOrigin(stored)) ??
251
+ (rawChannel == null ? undefined : channelContextSchema.parse(rawChannel));
241
252
  const context = Object.fromEntries(Object.entries(wire.payload.context ?? {}).filter(([key]) => !isManagedKey(key)));
242
253
  const managedBy = wire.metadata.mda_managed_by;
243
254
  if (managedBy !== "runtime" && managedBy !== "deploy")
@@ -246,12 +257,13 @@ function record(wire, ctx, now = Date.now()) {
246
257
  id: wire.cron_id,
247
258
  owner: {
248
259
  type: ctx.access.owner === "agent" ? "agent" : "user",
260
+ // Not the execution's: a schedule can run as someone else.
249
261
  id: ctx.access.owner === "agent"
250
262
  ? ctx.deployment
251
- : ctx.access.execution.mda_user_id,
263
+ : ctx.access.owner.slice("user:".length),
252
264
  },
253
265
  managedBy,
254
- metadata: metadataSchema.parse(Object.fromEntries(Object.entries(wire.metadata).filter(([key]) => !key.startsWith("mda_")))),
266
+ metadata: metadataSchema.parse(Object.fromEntries(Object.entries(wire.metadata).filter(([key]) => !isReservedMetadataKey(key)))),
255
267
  ...(spec.at ? { at: spec.at } : { cron: wire.schedule }),
256
268
  timezone: spec.timezone ?? wire.timezone ?? "UTC",
257
269
  ...(spec.prompt ? { prompt: spec.prompt } : { input: wire.payload.input }),
@@ -263,6 +275,7 @@ function record(wire, ctx, now = Date.now()) {
263
275
  newThread: spec.newThread ?? !wire.thread_id,
264
276
  channel: channel?.name ?? null,
265
277
  target: channel?.target ?? null,
278
+ runAs: spec.runAs ?? null,
266
279
  paused: !wire.enabled,
267
280
  expired: wire.end_time != null && Date.parse(wire.end_time) < now,
268
281
  };
@@ -292,6 +305,52 @@ async function verifyTarget(wire, target, ctx, created = true) {
292
305
  throw new Error(`One-time target was missed; schedule ${created ? "removed" : "paused"}`);
293
306
  }
294
307
  }
308
+ /**
309
+ * Run a schedule as a participant of the current thread. The caller keeps
310
+ * owning it; only the identity its runs act as changes.
311
+ */
312
+ async function runAsParticipant(ctx, owner, runAs, run) {
313
+ if (owner.type !== "user")
314
+ throw new Error('runAs requires owner { type: "user" }');
315
+ const participant = run.thread?.participants.find(({ id, role }) => id === runAs.id && role === runAs.role);
316
+ if (!participant)
317
+ throw new Error("runAs must be a participant of the current thread");
318
+ const origin = run.origin;
319
+ if (!origin)
320
+ throw new Error("runAs requires the thread's channel");
321
+ // A Trigger participant's id is their Agent Auth principal.
322
+ let principal = participant.id;
323
+ if (origin.transport !== "trigger_server") {
324
+ try {
325
+ principal = (await resolveAgentAuthContext({
326
+ user: { kind: "person", id: participant.id },
327
+ source: { provider: origin.provider },
328
+ })).principalId;
329
+ }
330
+ catch (error) {
331
+ throw new Error(`Cannot run the schedule as this participant: ${error instanceof Error ? error.message : String(error)}`);
332
+ }
333
+ }
334
+ ctx.access.run_as = { id: participant.id, role: participant.role };
335
+ ctx.access.execution = {
336
+ identity: participant.id,
337
+ permissions: [],
338
+ mda_user_id: participant.id,
339
+ mda_agent_auth_principal_id: principal,
340
+ mda_source_provider: "schedule",
341
+ mda_scheduled_run: true,
342
+ };
343
+ }
344
+ /** The record a new-thread schedule's thread starts with. */
345
+ function newThreadRecord(origin, run, access) {
346
+ const executor = access.execution.mda_user_id;
347
+ return threadRecordMetadata({
348
+ origin: originFromBinding(origin, run.thread?.origin?.sender?.id ?? null),
349
+ participants: access.owner !== "agent" && isPersonPrincipal(executor)
350
+ ? [{ id: executor, role: "owner" }]
351
+ : [],
352
+ });
353
+ }
295
354
  /**
296
355
  * Bind schedule operations to a tool or middleware runtime. MDA attaches the
297
356
  * result as `runtime.schedules`; each call reads the run's trusted identity.
@@ -304,14 +363,17 @@ export function createRuntimeSchedules(runtime) {
304
363
  const input = runInput(value);
305
364
  const timing = scheduleTiming(value);
306
365
  const newThread = value.newThread ?? value.cron !== undefined;
307
- const channel = captureScheduleChannel(configurable, newThread);
366
+ const run = scheduleThread(runtime, configurable);
367
+ const origin = run.origin;
308
368
  const threadId = configurable?.thread_id;
309
369
  if (!newThread && !threadId)
310
370
  throw new Error("Same-thread schedules require a current thread; use newThread=true");
311
371
  const ctx = await context(value.owner, configurable);
312
- if (channel) {
313
- ctx.access.execution.mda_source_provider = channel.provider;
314
- ctx.access.execution.mda_source_thread_id = channel.sourceThreadKey;
372
+ if (value.runAs)
373
+ await runAsParticipant(ctx, value.owner, value.runAs, run);
374
+ if (origin) {
375
+ ctx.access.execution.mda_source_provider = origin.provider;
376
+ ctx.access.execution.mda_source_thread_id = origin.sourceThreadKey;
315
377
  }
316
378
  else if (!newThread && value.owner.type === "agent") {
317
379
  throw new Error("Agent-owned schedules outside a channel require newThread=true");
@@ -327,7 +389,7 @@ export function createRuntimeSchedules(runtime) {
327
389
  }
328
390
  }
329
391
  const name = randomUUID();
330
- const { owner: _owner, context: runContext, ...spec } = { ...value, newThread };
392
+ const { owner: _owner, context: runContext, ...spec } = { ...value, newThread, runAs: value.runAs ?? null };
331
393
  if (timing.at) {
332
394
  spec.at = timing.at;
333
395
  spec.timezone = "UTC";
@@ -342,16 +404,18 @@ export function createRuntimeSchedules(runtime) {
342
404
  ...(timing.end_time ? { end_time: timing.end_time } : {}),
343
405
  input,
344
406
  enabled: !value.paused,
345
- on_run_completed: (!newThread || channel
407
+ on_run_completed: (!newThread || origin
346
408
  ? "keep"
347
409
  : "delete"),
348
- context: {
349
- mda_schedule: { name },
350
- ...(channel ? { mda_channel: channel } : {}),
351
- ...runContext,
352
- },
410
+ // A same-thread schedule answers wherever its thread's record
411
+ // points when it runs, so it carries no channel of its own.
412
+ context: { mda_schedule: { name }, ...runContext },
353
413
  metadata: {
354
414
  ...value.metadata,
415
+ // The cron's new thread starts with the conversation's record.
416
+ ...(newThread &&
417
+ origin &&
418
+ newThreadRecord(origin, run, ctx.access)),
355
419
  mda_managed: true,
356
420
  mda_managed_by: "runtime",
357
421
  mda_schedule: name,