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

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 (343) hide show
  1. package/README.md +57 -953
  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 +12 -36
  5. package/dist/agent-auth.js.map +1 -1
  6. package/dist/channels/assistant-text.d.ts +0 -24
  7. package/dist/channels/assistant-text.d.ts.map +1 -1
  8. package/dist/channels/assistant-text.js +1 -65
  9. package/dist/channels/assistant-text.js.map +1 -1
  10. package/dist/channels/binding.d.ts +1 -20
  11. package/dist/channels/binding.d.ts.map +1 -1
  12. package/dist/channels/binding.js +10 -39
  13. package/dist/channels/binding.js.map +1 -1
  14. package/dist/channels/http/http.d.ts.map +1 -1
  15. package/dist/channels/http/http.js +65 -386
  16. package/dist/channels/http/http.js.map +1 -1
  17. package/dist/channels/http/index.d.ts +1 -2
  18. package/dist/channels/http/index.d.ts.map +1 -1
  19. package/dist/channels/http/index.js +10 -14
  20. package/dist/channels/http/index.js.map +1 -1
  21. package/dist/channels/http/ingress.d.ts +5 -65
  22. package/dist/channels/http/ingress.d.ts.map +1 -1
  23. package/dist/channels/http/ingress.js +33 -149
  24. package/dist/channels/http/ingress.js.map +1 -1
  25. package/dist/channels/http/types.d.ts +2 -143
  26. package/dist/channels/http/types.d.ts.map +1 -1
  27. package/dist/channels/message-schema.d.ts +0 -2
  28. package/dist/channels/message-schema.d.ts.map +1 -1
  29. package/dist/channels/message-schema.js +0 -4
  30. package/dist/channels/message-schema.js.map +1 -1
  31. package/dist/channels/messaging-registry.d.ts +0 -16
  32. package/dist/channels/messaging-registry.d.ts.map +1 -1
  33. package/dist/channels/messaging-registry.js +0 -29
  34. package/dist/channels/messaging-registry.js.map +1 -1
  35. package/dist/channels/runtime.d.ts +1 -1
  36. package/dist/channels/runtime.d.ts.map +1 -1
  37. package/dist/channels/runtime.js +1 -1
  38. package/dist/channels/runtime.js.map +1 -1
  39. package/dist/channels/schedule-delivery.d.ts +1 -1
  40. package/dist/channels/schedule-delivery.d.ts.map +1 -1
  41. package/dist/channels/schedule-delivery.js +23 -12
  42. package/dist/channels/schedule-delivery.js.map +1 -1
  43. package/dist/channels/slack/api.d.ts +0 -2
  44. package/dist/channels/slack/api.d.ts.map +1 -1
  45. package/dist/channels/slack/api.js +0 -6
  46. package/dist/channels/slack/api.js.map +1 -1
  47. package/dist/channels/slack/files.d.ts.map +1 -1
  48. package/dist/channels/slack/files.js +3 -2
  49. package/dist/channels/slack/files.js.map +1 -1
  50. package/dist/channels/slack/index.d.ts +2 -76
  51. package/dist/channels/slack/index.d.ts.map +1 -1
  52. package/dist/channels/slack/index.js +6 -177
  53. package/dist/channels/slack/index.js.map +1 -1
  54. package/dist/channels/slack/message-content.d.ts.map +1 -1
  55. package/dist/channels/slack/message-content.js +28 -23
  56. package/dist/channels/slack/message-content.js.map +1 -1
  57. package/dist/channels/source-providers.js +1 -1
  58. package/dist/channels/source-providers.js.map +1 -1
  59. package/dist/channels/trigger/client.d.ts.map +1 -1
  60. package/dist/channels/trigger/client.js +12 -6
  61. package/dist/channels/trigger/client.js.map +1 -1
  62. package/dist/channels/trigger/http.d.ts +3 -114
  63. package/dist/channels/trigger/http.d.ts.map +1 -1
  64. package/dist/channels/trigger/http.js +82 -314
  65. package/dist/channels/trigger/http.js.map +1 -1
  66. package/dist/channels/trigger/identity-context.d.ts +1 -1
  67. package/dist/channels/trigger/identity-context.d.ts.map +1 -1
  68. package/dist/channels/trigger/identity-context.js +3 -5
  69. package/dist/channels/trigger/identity-context.js.map +1 -1
  70. package/dist/channels/trigger/ingress.d.ts +1 -38
  71. package/dist/channels/trigger/ingress.d.ts.map +1 -1
  72. package/dist/channels/trigger/ingress.js +24 -49
  73. package/dist/channels/trigger/ingress.js.map +1 -1
  74. package/dist/channels/trigger/types.d.ts +3 -82
  75. package/dist/channels/trigger/types.d.ts.map +1 -1
  76. package/dist/channels/trigger/types.js +0 -36
  77. package/dist/channels/trigger/types.js.map +1 -1
  78. package/dist/channels/types.d.ts +3 -19
  79. package/dist/channels/types.d.ts.map +1 -1
  80. package/dist/channels/types.js +0 -2
  81. package/dist/channels/types.js.map +1 -1
  82. package/dist/concurrency/batch-processor.d.ts +51 -0
  83. package/dist/concurrency/batch-processor.d.ts.map +1 -0
  84. package/dist/concurrency/batch-processor.js +99 -0
  85. package/dist/concurrency/batch-processor.js.map +1 -0
  86. package/dist/connections.d.ts +1 -42
  87. package/dist/connections.d.ts.map +1 -1
  88. package/dist/connections.js +14 -127
  89. package/dist/connections.js.map +1 -1
  90. package/dist/credential-gate.d.ts +0 -2
  91. package/dist/credential-gate.d.ts.map +1 -1
  92. package/dist/credential-gate.js +3 -37
  93. package/dist/credential-gate.js.map +1 -1
  94. package/dist/define-deep-agent.d.ts.map +1 -1
  95. package/dist/define-deep-agent.js +0 -6
  96. package/dist/define-deep-agent.js.map +1 -1
  97. package/dist/identity/loopback.d.ts +7 -2
  98. package/dist/identity/loopback.d.ts.map +1 -1
  99. package/dist/identity/loopback.js +15 -4
  100. package/dist/identity/loopback.js.map +1 -1
  101. package/dist/identity/slack/links.js +3 -2
  102. package/dist/identity/slack/links.js.map +1 -1
  103. package/dist/index.d.ts +4 -15
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +1 -2
  106. package/dist/index.js.map +1 -1
  107. package/dist/ingress/index.d.ts +8 -0
  108. package/dist/ingress/index.d.ts.map +1 -1
  109. package/dist/ingress/index.js +32 -2
  110. package/dist/ingress/index.js.map +1 -1
  111. package/dist/ingress/loopback.js +4 -3
  112. package/dist/ingress/loopback.js.map +1 -1
  113. package/dist/ingress/runs.d.ts +1 -74
  114. package/dist/ingress/runs.d.ts.map +1 -1
  115. package/dist/ingress/runs.js +16 -176
  116. package/dist/ingress/runs.js.map +1 -1
  117. package/dist/managed-composition.d.ts.map +1 -1
  118. package/dist/managed-composition.js +13 -8
  119. package/dist/managed-composition.js.map +1 -1
  120. package/dist/memory/instructions-middleware.d.ts.map +1 -1
  121. package/dist/memory/instructions-middleware.js +6 -5
  122. package/dist/memory/instructions-middleware.js.map +1 -1
  123. package/dist/namespaces.d.ts +21 -21
  124. package/dist/namespaces.d.ts.map +1 -1
  125. package/dist/namespaces.js +29 -4
  126. package/dist/namespaces.js.map +1 -1
  127. package/dist/resilience/retry.d.ts +21 -0
  128. package/dist/resilience/retry.d.ts.map +1 -0
  129. package/dist/resilience/retry.js +40 -0
  130. package/dist/resilience/retry.js.map +1 -0
  131. package/dist/runtime/auth.d.ts.map +1 -1
  132. package/dist/runtime/auth.js +21 -151
  133. package/dist/runtime/auth.js.map +1 -1
  134. package/dist/runtime/channel.d.ts +0 -6
  135. package/dist/runtime/channel.d.ts.map +1 -1
  136. package/dist/runtime/channel.js.map +1 -1
  137. package/dist/runtime/graph-build-timing.d.ts +30 -0
  138. package/dist/runtime/graph-build-timing.d.ts.map +1 -0
  139. package/dist/runtime/graph-build-timing.js +50 -0
  140. package/dist/runtime/graph-build-timing.js.map +1 -0
  141. package/dist/runtime/http.d.ts +15 -0
  142. package/dist/runtime/http.d.ts.map +1 -1
  143. package/dist/runtime/http.js +37 -0
  144. package/dist/runtime/http.js.map +1 -1
  145. package/dist/runtime/identity-http.d.ts +0 -2
  146. package/dist/runtime/identity-http.d.ts.map +1 -1
  147. package/dist/runtime/identity-http.js +16 -40
  148. package/dist/runtime/identity-http.js.map +1 -1
  149. package/dist/runtime/identity-runtime.d.ts +0 -10
  150. package/dist/runtime/identity-runtime.d.ts.map +1 -1
  151. package/dist/runtime/identity-runtime.js +0 -22
  152. package/dist/runtime/identity-runtime.js.map +1 -1
  153. package/dist/runtime/index.d.ts.map +1 -1
  154. package/dist/runtime/index.js +47 -46
  155. package/dist/runtime/index.js.map +1 -1
  156. package/dist/runtime/langsmith-env.d.ts +19 -0
  157. package/dist/runtime/langsmith-env.d.ts.map +1 -0
  158. package/dist/runtime/langsmith-env.js +38 -0
  159. package/dist/runtime/langsmith-env.js.map +1 -0
  160. package/dist/runtime/log.d.ts +8 -14
  161. package/dist/runtime/log.d.ts.map +1 -1
  162. package/dist/runtime/log.js +16 -7
  163. package/dist/runtime/log.js.map +1 -1
  164. package/dist/runtime/managed-middleware.d.ts.map +1 -1
  165. package/dist/runtime/managed-middleware.js +1 -14
  166. package/dist/runtime/managed-middleware.js.map +1 -1
  167. package/dist/runtime/managed-tools.d.ts +10 -10
  168. package/dist/runtime/managed-tools.d.ts.map +1 -1
  169. package/dist/runtime/managed-tools.js +24 -24
  170. package/dist/runtime/managed-tools.js.map +1 -1
  171. package/dist/runtime/memory/mounts.d.ts +82 -11
  172. package/dist/runtime/memory/mounts.d.ts.map +1 -1
  173. package/dist/runtime/memory/mounts.js +173 -34
  174. package/dist/runtime/memory/mounts.js.map +1 -1
  175. package/dist/runtime/memory/policy.d.ts.map +1 -1
  176. package/dist/runtime/memory/policy.js +3 -1
  177. package/dist/runtime/memory/policy.js.map +1 -1
  178. package/dist/runtime/run-input.d.ts +0 -10
  179. package/dist/runtime/run-input.d.ts.map +1 -1
  180. package/dist/runtime/run-input.js +19 -47
  181. package/dist/runtime/run-input.js.map +1 -1
  182. package/dist/runtime/sandbox-manager.d.ts +1 -1
  183. package/dist/runtime/sandbox-manager.d.ts.map +1 -1
  184. package/dist/runtime/sandbox-manager.js +10 -15
  185. package/dist/runtime/sandbox-manager.js.map +1 -1
  186. package/dist/runtime/schedule-auth.d.ts +0 -17
  187. package/dist/runtime/schedule-auth.d.ts.map +1 -1
  188. package/dist/runtime/schedule-auth.js +3 -40
  189. package/dist/runtime/schedule-auth.js.map +1 -1
  190. package/dist/runtime/selected-skills-backend.d.ts +3 -3
  191. package/dist/runtime/selected-skills-backend.d.ts.map +1 -1
  192. package/dist/runtime/selected-skills-backend.js +5 -5
  193. package/dist/runtime/selected-skills-backend.js.map +1 -1
  194. package/dist/runtime/types.d.ts +1 -5
  195. package/dist/runtime/types.d.ts.map +1 -1
  196. package/dist/runtime-schedules.d.ts +0 -13
  197. package/dist/runtime-schedules.d.ts.map +1 -1
  198. package/dist/runtime-schedules.js +22 -86
  199. package/dist/runtime-schedules.js.map +1 -1
  200. package/dist/sandbox.d.ts +6 -0
  201. package/dist/sandbox.d.ts.map +1 -1
  202. package/dist/sandbox.js +7 -3
  203. package/dist/sandbox.js.map +1 -1
  204. package/dist/schedule-channel.d.ts +2 -5
  205. package/dist/schedule-channel.d.ts.map +1 -1
  206. package/dist/schedule-channel.js +12 -13
  207. package/dist/schedule-channel.js.map +1 -1
  208. package/dist/telemetry/lifecycle.d.ts +26 -0
  209. package/dist/telemetry/lifecycle.d.ts.map +1 -0
  210. package/dist/telemetry/lifecycle.js +49 -0
  211. package/dist/telemetry/lifecycle.js.map +1 -0
  212. package/dist/telemetry/metadata.d.ts.map +1 -1
  213. package/dist/telemetry/metadata.js +4 -4
  214. package/dist/telemetry/metadata.js.map +1 -1
  215. package/dist/telemetry/otel/context.d.ts +57 -0
  216. package/dist/telemetry/otel/context.d.ts.map +1 -0
  217. package/dist/telemetry/otel/context.js +122 -0
  218. package/dist/telemetry/otel/context.js.map +1 -0
  219. package/dist/telemetry/otel/exporter.d.ts +53 -0
  220. package/dist/telemetry/otel/exporter.d.ts.map +1 -0
  221. package/dist/telemetry/otel/exporter.js +190 -0
  222. package/dist/telemetry/otel/exporter.js.map +1 -0
  223. package/dist/telemetry/otel/index.d.ts +6 -0
  224. package/dist/telemetry/otel/index.d.ts.map +1 -0
  225. package/dist/telemetry/otel/index.js +3 -0
  226. package/dist/telemetry/otel/index.js.map +1 -0
  227. package/dist/telemetry/otel/otlp.d.ts +44 -0
  228. package/dist/telemetry/otel/otlp.d.ts.map +1 -0
  229. package/dist/telemetry/otel/otlp.js +7 -0
  230. package/dist/telemetry/otel/otlp.js.map +1 -0
  231. package/dist/telemetry/otel/truncate.d.ts +10 -0
  232. package/dist/telemetry/otel/truncate.d.ts.map +1 -0
  233. package/dist/telemetry/otel/truncate.js +39 -0
  234. package/dist/telemetry/otel/truncate.js.map +1 -0
  235. package/dist/telemetry/run-listener.d.ts +1 -1
  236. package/dist/telemetry/run-listener.d.ts.map +1 -1
  237. package/dist/telemetry/run-listener.js +32 -2
  238. package/dist/telemetry/run-listener.js.map +1 -1
  239. package/dist/telemetry/transport/posthog.d.ts +13 -1
  240. package/dist/telemetry/transport/posthog.d.ts.map +1 -1
  241. package/dist/telemetry/transport/posthog.js +68 -30
  242. package/dist/telemetry/transport/posthog.js.map +1 -1
  243. package/package.json +11 -11
  244. package/dist/channels/actor.d.ts +0 -43
  245. package/dist/channels/actor.d.ts.map +0 -1
  246. package/dist/channels/actor.js +0 -2
  247. package/dist/channels/actor.js.map +0 -1
  248. package/dist/channels/delivery.d.ts +0 -21
  249. package/dist/channels/delivery.d.ts.map +0 -1
  250. package/dist/channels/delivery.js +0 -196
  251. package/dist/channels/delivery.js.map +0 -1
  252. package/dist/channels/github/connections.d.ts +0 -11
  253. package/dist/channels/github/connections.d.ts.map +0 -1
  254. package/dist/channels/github/connections.js +0 -14
  255. package/dist/channels/github/connections.js.map +0 -1
  256. package/dist/channels/github/index.d.ts +0 -8
  257. package/dist/channels/github/index.d.ts.map +0 -1
  258. package/dist/channels/github/index.js +0 -274
  259. package/dist/channels/github/index.js.map +0 -1
  260. package/dist/channels/github/mentions.d.ts +0 -12
  261. package/dist/channels/github/mentions.d.ts.map +0 -1
  262. package/dist/channels/github/mentions.js +0 -185
  263. package/dist/channels/github/mentions.js.map +0 -1
  264. package/dist/channels/github/schema.d.ts +0 -4165
  265. package/dist/channels/github/schema.d.ts.map +0 -1
  266. package/dist/channels/github/schema.js +0 -221
  267. package/dist/channels/github/schema.js.map +0 -1
  268. package/dist/channels/github/types.d.ts +0 -163
  269. package/dist/channels/github/types.d.ts.map +0 -1
  270. package/dist/channels/github/types.js +0 -2
  271. package/dist/channels/github/types.js.map +0 -1
  272. package/dist/channels/http/endpoint.d.ts +0 -95
  273. package/dist/channels/http/endpoint.d.ts.map +0 -1
  274. package/dist/channels/http/endpoint.js +0 -276
  275. package/dist/channels/http/endpoint.js.map +0 -1
  276. package/dist/channels/http/provider.d.ts +0 -119
  277. package/dist/channels/http/provider.d.ts.map +0 -1
  278. package/dist/channels/http/provider.js +0 -227
  279. package/dist/channels/http/provider.js.map +0 -1
  280. package/dist/channels/http/studio.d.ts +0 -24
  281. package/dist/channels/http/studio.d.ts.map +0 -1
  282. package/dist/channels/http/studio.js +0 -95
  283. package/dist/channels/http/studio.js.map +0 -1
  284. package/dist/channels/http/threads.d.ts +0 -7
  285. package/dist/channels/http/threads.d.ts.map +0 -1
  286. package/dist/channels/http/threads.js +0 -10
  287. package/dist/channels/http/threads.js.map +0 -1
  288. package/dist/channels/linear/connections.d.ts +0 -11
  289. package/dist/channels/linear/connections.d.ts.map +0 -1
  290. package/dist/channels/linear/connections.js +0 -14
  291. package/dist/channels/linear/connections.js.map +0 -1
  292. package/dist/channels/linear/graphql.d.ts +0 -57
  293. package/dist/channels/linear/graphql.d.ts.map +0 -1
  294. package/dist/channels/linear/graphql.js +0 -167
  295. package/dist/channels/linear/graphql.js.map +0 -1
  296. package/dist/channels/linear/index.d.ts +0 -9
  297. package/dist/channels/linear/index.d.ts.map +0 -1
  298. package/dist/channels/linear/index.js +0 -489
  299. package/dist/channels/linear/index.js.map +0 -1
  300. package/dist/channels/linear/schema.d.ts +0 -1050
  301. package/dist/channels/linear/schema.d.ts.map +0 -1
  302. package/dist/channels/linear/schema.js +0 -255
  303. package/dist/channels/linear/schema.js.map +0 -1
  304. package/dist/channels/linear/types.d.ts +0 -162
  305. package/dist/channels/linear/types.d.ts.map +0 -1
  306. package/dist/channels/linear/types.js +0 -2
  307. package/dist/channels/linear/types.js.map +0 -1
  308. package/dist/channels/reserved-connections.d.ts +0 -12
  309. package/dist/channels/reserved-connections.d.ts.map +0 -1
  310. package/dist/channels/reserved-connections.js +0 -55
  311. package/dist/channels/reserved-connections.js.map +0 -1
  312. package/dist/channels/run-input.d.ts +0 -71
  313. package/dist/channels/run-input.d.ts.map +0 -1
  314. package/dist/channels/run-input.js +0 -155
  315. package/dist/channels/run-input.js.map +0 -1
  316. package/dist/channels/slack/connections.d.ts +0 -6
  317. package/dist/channels/slack/connections.d.ts.map +0 -1
  318. package/dist/channels/slack/connections.js +0 -6
  319. package/dist/channels/slack/connections.js.map +0 -1
  320. package/dist/channels/slack/events.d.ts +0 -272
  321. package/dist/channels/slack/events.d.ts.map +0 -1
  322. package/dist/channels/slack/events.js +0 -235
  323. package/dist/channels/slack/events.js.map +0 -1
  324. package/dist/channels/slack/status.d.ts +0 -76
  325. package/dist/channels/slack/status.d.ts.map +0 -1
  326. package/dist/channels/slack/status.js +0 -427
  327. package/dist/channels/slack/status.js.map +0 -1
  328. package/dist/runtime/channel-icon.d.ts +0 -22
  329. package/dist/runtime/channel-icon.d.ts.map +0 -1
  330. package/dist/runtime/channel-icon.js +0 -70
  331. package/dist/runtime/channel-icon.js.map +0 -1
  332. package/dist/runtime/managed-thread.d.ts +0 -60
  333. package/dist/runtime/managed-thread.d.ts.map +0 -1
  334. package/dist/runtime/managed-thread.js +0 -76
  335. package/dist/runtime/managed-thread.js.map +0 -1
  336. package/dist/runtime/thread-record.d.ts +0 -81
  337. package/dist/runtime/thread-record.d.ts.map +0 -1
  338. package/dist/runtime/thread-record.js +0 -205
  339. package/dist/runtime/thread-record.js.map +0 -1
  340. package/dist/values.d.ts +0 -15
  341. package/dist/values.d.ts.map +0 -1
  342. package/dist/values.js +0 -31
  343. package/dist/values.js.map +0 -1
@@ -1,276 +0,0 @@
1
- /**
2
- * Event endpoints: an `onEvent` value that is a URL or a `Request` rather than
3
- * a function. MDA asks that service of yours what the event starts, for logic
4
- * that lives outside the deployment.
5
- */
6
- import { createHmac } from "node:crypto";
7
- import { z } from "zod";
8
- import { jsonValueSchema } from "../message-schema.js";
9
- /** How long the service may take to answer one attempt. */
10
- const TIMEOUT_MS = 60_000;
11
- /**
12
- * The pauses before trying again after a network error, HTTP 429 or a 5xx:
13
- * three attempts in all, each with the same webhook ID, so a receiver that
14
- * dedupes on it acts once.
15
- */
16
- const RETRY_DELAYS_MS = [1_000, 5_000];
17
- /** The largest answer read; run input may carry images. */
18
- const MAX_RESPONSE_BYTES = 10 * 1024 * 1024;
19
- const ANSWER_SHAPE = "event endpoint answer must be null or { input, context?, metadata?, webhook? }";
20
- /**
21
- * The deployment's env var holding the secret it shares with your services:
22
- * every event endpoint request is signed with it, as Standard Webhooks does.
23
- * Several, separated by whitespace or commas, each sign the request, for
24
- * rotation.
25
- */
26
- export const SERVICE_SECRET_ENV = "MDA_SERVICE_SECRET";
27
- /** Standard Webhooks' optional secret prefix. */
28
- const SECRET_PREFIX = "whsec_";
29
- /** The key sizes Standard Webhooks allows, in bytes. */
30
- const MIN_KEY_BYTES = 24;
31
- const MAX_KEY_BYTES = 64;
32
- const SECRET_SHAPE = `${SERVICE_SECRET_ENV} must hold Standard Webhooks secrets: padded base64 of 24 to 64 bytes, optionally prefixed with whsec_`;
33
- let cachedKeys;
34
- /** The signing keys `MDA_SERVICE_SECRET` holds; none when it's unset. */
35
- function signingKeys() {
36
- const secrets = process.env[SERVICE_SECRET_ENV]?.trim() ?? "";
37
- if (cachedKeys?.secrets !== secrets)
38
- cachedKeys = {
39
- secrets,
40
- // Stray separators, as rotation leaves behind, name no secret.
41
- keys: secrets
42
- .split(/[\s,]+/)
43
- .filter(Boolean)
44
- .map(signingKey),
45
- };
46
- return cachedKeys.keys;
47
- }
48
- /** The key a Standard Webhooks secret stands for; a malformed one throws. */
49
- export function signingKey(secret) {
50
- const encoded = secret.startsWith(SECRET_PREFIX)
51
- ? secret.slice(SECRET_PREFIX.length)
52
- : secret;
53
- // Buffer.from skips characters that aren't base64 and missing padding; the
54
- // round trip refuses both, as Standard Webhooks libraries' decoders do.
55
- const key = Buffer.from(encoded, "base64");
56
- if (!encoded ||
57
- key.toString("base64") !== encoded ||
58
- key.byteLength < MIN_KEY_BYTES ||
59
- key.byteLength > MAX_KEY_BYTES)
60
- throw new TypeError(SECRET_SHAPE);
61
- return key;
62
- }
63
- /**
64
- * The Standard Webhooks headers that sign one request with `keys`: none
65
- * without a key. Each key signs `<id>.<timestamp>.<body>`.
66
- */
67
- export function signatureHeaders(keys, id, timestamp, body) {
68
- if (!keys.length)
69
- return {};
70
- const signed = `${id}.${timestamp}.${body}`;
71
- return {
72
- "webhook-id": id,
73
- "webhook-timestamp": String(timestamp),
74
- "webhook-signature": keys
75
- .map((key) => `v1,${createHmac("sha256", key).update(signed).digest("base64")}`)
76
- .join(" "),
77
- };
78
- }
79
- /** The fields of an event every endpoint is sent. */
80
- const EVENT_FIELDS = ["key", "deliveryId", "payload"];
81
- const answerSchema = z.strictObject({
82
- /**
83
- * The run's input: text, or state such as `{ messages }`. Never an array,
84
- * which a handler's `[input, options]` would be read as.
85
- */
86
- input: z.union([z.string(), z.record(z.string(), jsonValueSchema)]),
87
- /** Run context, as `agent.invoke(input, { context })` takes it. */
88
- context: z.record(z.string(), jsonValueSchema).optional(),
89
- /** Metadata for the run; see `ChannelRunOptions`. */
90
- metadata: z.record(z.string(), jsonValueSchema).optional(),
91
- /** A URL the Agent Server POSTs the finished run to; see `ChannelRunOptions`. */
92
- webhook: z.string().optional(),
93
- });
94
- /** The handlers endpoints stand for, so a channel knows to answer first. */
95
- const endpointCallbacks = new WeakSet();
96
- /** Whether a handler is one an endpoint stands for. */
97
- export function isEndpointCallback(handler) {
98
- return typeof handler === "function" && endpointCallbacks.has(handler);
99
- }
100
- /** Whether an `onEvent` value is an endpoint rather than a handler function. */
101
- export function isEventEndpoint(value) {
102
- return (typeof value === "string" ||
103
- value instanceof URL ||
104
- value instanceof Request);
105
- }
106
- /**
107
- * The handler an endpoint stands for. When the event's thread takes a turn,
108
- * MDA POSTs `{ event: { key, deliveryId, payload }, thread: { id, channel,
109
- * interrupted? } }` as JSON to the endpoint's URL, with the event's `fields`,
110
- * the channel's own, beside the payload, and a `Request`'s headers,
111
- * signed when the deployment has `MDA_SERVICE_SECRET`, and starts the
112
- * run the service answers with: `{ input, context?, metadata?, webhook? }`.
113
- * `null` or HTTP 204 starts nothing. A network error before the answer, HTTP
114
- * 429 or a 5xx is tried again, up to three attempts. Any other answer, one cut
115
- * off, a redirect, or no answer within 60 seconds fails the handler, as a
116
- * handler that throws does.
117
- * The URL is https, or http to a loopback host for local development, without
118
- * credentials in it.
119
- *
120
- * The webhook ID is `msg_<deliveryId>` for the call that starts the run, and
121
- * `msg_<deliveryId>_interrupted` for the one that asks whether to tell the
122
- * conversation its thread waits on a decision.
123
- */
124
- export function endpointHandler(endpoint, label, fields = []) {
125
- const template = endpoint instanceof Request ? endpoint : undefined;
126
- const target = endpointUrl(template ? template.url : String(endpoint), label);
127
- // A malformed secret throws when the channel is declared, not on each event.
128
- signingKeys();
129
- const baseHeaders = new Headers(template?.headers);
130
- baseHeaders.set("content-type", "application/json");
131
- baseHeaders.set("accept", "application/json");
132
- const sent = [...EVENT_FIELDS, ...fields];
133
- const callback = async (event, thread) => {
134
- const request = {
135
- event: pick(event, sent),
136
- thread: {
137
- id: thread.id,
138
- channel: { name: thread.channel.name },
139
- ...(thread.interrupted && { interrupted: true }),
140
- },
141
- };
142
- // The exact bytes sent are the ones signed.
143
- const body = JSON.stringify(request);
144
- const id = `msg_${event.deliveryId}${thread.interrupted ? "_interrupted" : ""}`;
145
- for (let attempt = 0;; attempt++) {
146
- const response = await post(target, baseHeaders, id, body).catch((error) => {
147
- // A timeout isn't tried again: the service may still be acting on it.
148
- if (attempt < RETRY_DELAYS_MS.length && !isTimeout(error))
149
- return undefined;
150
- throw error;
151
- });
152
- if (response?.status === 204) {
153
- await response.body?.cancel();
154
- return null;
155
- }
156
- if (response?.ok)
157
- return runResult(await boundedJson(response));
158
- await response?.body?.cancel();
159
- if (response &&
160
- (attempt >= RETRY_DELAYS_MS.length || !retried(response.status)))
161
- throw new Error(`event endpoint answered HTTP ${response.status}`);
162
- await sleep(RETRY_DELAYS_MS[attempt]);
163
- }
164
- };
165
- endpointCallbacks.add(callback);
166
- return callback;
167
- }
168
- /** The event's `fields`; an absent one stays absent. */
169
- function pick(event, fields) {
170
- const picked = {};
171
- for (const field of fields)
172
- if (event[field] !== undefined)
173
- picked[field] = event[field];
174
- // Every field of `EVENT_FIELDS` is one of `fields`.
175
- return picked;
176
- }
177
- /** One attempt, signed afresh: Standard Webhooks timestamps each. */
178
- function post(target, baseHeaders, id, body) {
179
- const headers = new Headers(baseHeaders);
180
- const signature = signatureHeaders(signingKeys(), id, Math.floor(Date.now() / 1000), body);
181
- for (const [name, value] of Object.entries(signature))
182
- headers.set(name, value);
183
- return fetch(target, {
184
- method: "POST",
185
- headers,
186
- body,
187
- redirect: "manual",
188
- signal: AbortSignal.timeout(TIMEOUT_MS),
189
- });
190
- }
191
- /** Whether an answer's status is worth trying again. */
192
- function retried(status) {
193
- return status === 429 || status >= 500;
194
- }
195
- function isTimeout(error) {
196
- return error instanceof DOMException && error.name === "TimeoutError";
197
- }
198
- function sleep(ms) {
199
- return new Promise((resolve) => setTimeout(resolve, ms));
200
- }
201
- /**
202
- * The endpoint's URL. Plain http only reaches a loopback host: the answer
203
- * isn't signed, so anyone on the path could write the run's input otherwise.
204
- */
205
- function endpointUrl(url, label) {
206
- let parsed;
207
- try {
208
- parsed = new URL(url);
209
- }
210
- catch {
211
- parsed = undefined;
212
- }
213
- if (!parsed ||
214
- !(parsed.protocol === "https:" ||
215
- (parsed.protocol === "http:" && isLoopback(parsed.hostname))) ||
216
- parsed.username ||
217
- parsed.password)
218
- throw new TypeError(`${label} must be an absolute https URL, or http to localhost, without credentials in it`);
219
- return parsed.href;
220
- }
221
- /** Whether a URL's hostname is this machine. */
222
- function isLoopback(hostname) {
223
- return (hostname === "localhost" ||
224
- hostname.endsWith(".localhost") ||
225
- hostname === "[::1]" ||
226
- /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(hostname));
227
- }
228
- /** The answer as JSON, read only up to `MAX_RESPONSE_BYTES`. */
229
- async function boundedJson(response) {
230
- const declared = Number(response.headers.get("content-length"));
231
- if (declared > MAX_RESPONSE_BYTES) {
232
- await response.body?.cancel();
233
- throw new Error("event endpoint answer is too large");
234
- }
235
- const reader = response.body?.getReader();
236
- const chunks = [];
237
- let size = 0;
238
- for (;;) {
239
- const chunk = await reader?.read();
240
- if (!chunk || chunk.done)
241
- break;
242
- size += chunk.value.byteLength;
243
- if (size > MAX_RESPONSE_BYTES) {
244
- await reader?.cancel();
245
- throw new Error("event endpoint answer is too large");
246
- }
247
- chunks.push(chunk.value);
248
- }
249
- const text = new TextDecoder().decode(chunks.length === 1 ? chunks[0] : concat(chunks, size));
250
- try {
251
- return JSON.parse(text);
252
- }
253
- catch {
254
- throw new Error("event endpoint answer is not JSON");
255
- }
256
- }
257
- function concat(chunks, size) {
258
- const joined = new Uint8Array(size);
259
- let offset = 0;
260
- for (const chunk of chunks) {
261
- joined.set(chunk, offset);
262
- offset += chunk.byteLength;
263
- }
264
- return joined;
265
- }
266
- /** The run the answer names; the channel checks the input and options as a handler's. */
267
- function runResult(body) {
268
- const parsed = answerSchema.nullable().safeParse(body);
269
- if (!parsed.success)
270
- throw new Error(ANSWER_SHAPE);
271
- if (parsed.data === null)
272
- return null;
273
- const { input, ...options } = parsed.data;
274
- return [input, options];
275
- }
276
- //# sourceMappingURL=endpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/channels/http/endpoint.ts"],"names":[],"mappings":"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"}
@@ -1,119 +0,0 @@
1
- import type { JsonObject } from "../manifest.js";
2
- import type { JsonValue } from "../types.js";
3
- import type { ChannelRunResult } from "../run-input.js";
4
- import type { HttpChannel } from "./index.js";
5
- import type { HttpChannelAdapter, HttpFinish, HttpFinishedDelivery } from "./types.js";
6
- import { type EndpointEvent, type EndpointThread, type EventEndpoint, type EventField } from "./endpoint.js";
7
- /** The channel's name in the project, or its provider before it has one. */
8
- export declare function channelName(channel: HttpChannel): string;
9
- /**
10
- * Check a channel's `onEvent` keys. The types limit them, but a JavaScript
11
- * caller or a cast gets no error, and a key nothing dispatches never runs.
12
- */
13
- export declare function checkEventKeys(provider: string, handlers: object, supported: ReadonlySet<string>): void;
14
- /** A channel's event handler, as the channel calls it with the event's thread. */
15
- export type EventCallback<E, T> = (event: E, thread: T) => EventHandlerResult | Promise<EventHandlerResult>;
16
- /**
17
- * A channel's `onEvent` with each endpoint, a URL or `Request`, replaced by
18
- * the handler it stands for, so the channel calls handlers alone. A bad
19
- * endpoint, or a value that is neither a handler nor an endpoint, throws when
20
- * the channel is declared. The endpoint's handler is
21
- * typed as the channel's own: `E` and `T` carry what it sends, and `fields`
22
- * are the channel's own fields of `E` it sends beside key, delivery ID and
23
- * payload, listed in one place per channel.
24
- */
25
- export declare function resolveEndpoints<E extends EndpointEvent, T extends EndpointThread, X extends EventField<E> & string = never>(provider: string, onEvent: Readonly<Record<string, EventCallback<E, T> | EventEndpoint | undefined>> | undefined, fields?: readonly X[]): Partial<Record<string, EventCallback<E, T>>>;
26
- /**
27
- * A provider channel's `onFinish`: a delivery of one of its events is done,
28
- * with the event, its thread, and how it finished, to switch on by `type`:
29
- * the run it started, why it started none, or that MDA lost it; see
30
- * {@link HttpFinish}.
31
- */
32
- export type EventFinished<E, T = EventThread> = (event: E, thread: T, finished: HttpFinish) => void | Promise<void>;
33
- /** The thread a provider channel's hooks hear about. */
34
- export interface EventThread {
35
- id: string;
36
- channel: {
37
- name: string;
38
- };
39
- }
40
- /** The thread of a delivery to the channel named `name`. */
41
- export declare function eventThread(delivery: {
42
- threadId: string;
43
- }, name: string): EventThread;
44
- /**
45
- * The HTTP channel's `onFinish` for a provider channel: the channel's own
46
- * notice first, such as a link to a pending decision, then the user's hook,
47
- * for the deliveries whose event the channel parsed. A failing notice is
48
- * logged and doesn't keep the user's hook from running.
49
- */
50
- export declare function finishEvents<E, T = EventThread>(notice: NonNullable<HttpChannelAdapter["onFinish"]>, onFinish: EventFinished<E, T> | undefined, parse: (rawEvent: JsonValue | undefined) => E | undefined | Promise<E | undefined>, thread: (delivery: HttpFinishedDelivery) => T): HttpChannelAdapter["onFinish"];
51
- /**
52
- * A provider channel's `onReceived`: a delivery of one of its events reached
53
- * its thread, before MDA reads the thread; see `channels.http`'s `onReceived`.
54
- */
55
- export type EventReceived<E, T = EventThread> = (event: E, thread: T) => void | Promise<void>;
56
- /**
57
- * The HTTP channel's `onReceived` for a provider channel's user hook, for the
58
- * deliveries whose event the channel parsed.
59
- */
60
- export declare function receiveEvents<E>(onReceived: EventReceived<E> | undefined, parse: (rawEvent: JsonValue | undefined) => E | undefined, name: () => string): HttpChannelAdapter["onReceived"];
61
- /** The events deploy subscribes the provider's webhook to: the handled ones. */
62
- export declare function handledEventKeys(handlers: object): string[];
63
- /**
64
- * The connection `mda deploy` stores for the provider's app, or one of the
65
- * values stored beside it, such as `webhook-secret`, when `suffix` is given.
66
- */
67
- export declare function appConnectionSlug(provider: string, deploymentId: string, suffix?: string): string;
68
- /**
69
- * A frozen copy of a parsed event, kept as the delivery's raw event so a
70
- * handler that changes its argument can't change what MDA keeps.
71
- */
72
- export declare function eventSnapshot(event: unknown, provider: string): JsonValue;
73
- /** App options for deploy, without unset fields. */
74
- export declare function definedFields(fields: Record<string, JsonValue | undefined>): JsonObject;
75
- /**
76
- * Whether `signature`, a hex HMAC-SHA256 the caller checked the format of,
77
- * signs `rawBody` with `secret`. Compared in constant time.
78
- */
79
- export declare function verifyHmacSha256(secret: string, rawBody: Uint8Array, signature: string): boolean;
80
- /**
81
- * A value read at most every `ttlMs(value)` milliseconds. Concurrent callers
82
- * share the read in flight; a failed read is not kept, so the next call reads
83
- * again.
84
- */
85
- export declare class CachedRead<T> {
86
- #private;
87
- private readonly read;
88
- private readonly ttlMs;
89
- constructor(read: () => Promise<T>, ttlMs: (value: T) => number);
90
- get(): Promise<T>;
91
- /** Read again on the next call. */
92
- reset(): void;
93
- }
94
- /**
95
- * A value `mda deploy` stored for the deployment, such as a webhook secret:
96
- * the `env` override when set, otherwise the agent secret Agent Auth keeps at
97
- * `slug(deploymentId)`. Only a missing connection reads as `undefined`, and is
98
- * logged as `label`; credential store failures propagate.
99
- */
100
- export declare function readDeploymentSecret(env: string, slug: (deploymentId: string) => string, label: string): Promise<string | undefined>;
101
- /** Forget values read from Agent Auth; for tests. */
102
- export declare function resetDeploymentSecrets(): void;
103
- /** What an event's handler did: returned run input, skipped, or threw. */
104
- export type EventHandlerOutcome = {
105
- type: "input";
106
- input: ChannelRunResult;
107
- } | {
108
- type: "skipped";
109
- } | {
110
- type: "failed";
111
- };
112
- /** What an event handler returns: run input, or nothing to skip. */
113
- export type EventHandlerResult = ChannelRunResult | null | undefined | void;
114
- /** Run an event's handler. A throw is logged, not raised. */
115
- export declare function runEventHandler(provider: string, event: {
116
- key: string;
117
- deliveryId: string;
118
- }, call: () => EventHandlerResult | Promise<EventHandlerResult>): Promise<EventHandlerOutcome>;
119
- //# sourceMappingURL=provider.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/channels/http/provider.ts"],"names":[],"mappings":"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"}
@@ -1,227 +0,0 @@
1
- /**
2
- * What webhook channels built on `httpChannel`, such as GitHub and Linear,
3
- * share: their name, the events they subscribe to, the secrets they read from
4
- * Agent Auth, signature checks, running an event's handler, and the hooks
5
- * that hand their typed events to the user.
6
- */
7
- import { createHmac, timingSafeEqual } from "node:crypto";
8
- import { isJsonValue } from "../message-schema.js";
9
- import { immutableCopy } from "../runtime.js";
10
- import { logger } from "../../runtime/log.js";
11
- import { endpointHandler, isEventEndpoint, } from "./endpoint.js";
12
- import { ConnectionNotFoundError, DEPLOYMENT_ID_ENV, connections, } from "../../connections.js";
13
- /** The channel's name in the project, or its provider before it has one. */
14
- export function channelName(channel) {
15
- return channel.name ?? channel.kind;
16
- }
17
- /**
18
- * Check a channel's `onEvent` keys. The types limit them, but a JavaScript
19
- * caller or a cast gets no error, and a key nothing dispatches never runs.
20
- */
21
- export function checkEventKeys(provider, handlers, supported) {
22
- const unknown = Object.keys(handlers).filter((key) => !supported.has(key));
23
- if (unknown.length)
24
- throw new TypeError(`unsupported ${provider} event key ${unknown.sort().join(", ")}`);
25
- }
26
- /**
27
- * A channel's `onEvent` with each endpoint, a URL or `Request`, replaced by
28
- * the handler it stands for, so the channel calls handlers alone. A bad
29
- * endpoint, or a value that is neither a handler nor an endpoint, throws when
30
- * the channel is declared. The endpoint's handler is
31
- * typed as the channel's own: `E` and `T` carry what it sends, and `fields`
32
- * are the channel's own fields of `E` it sends beside key, delivery ID and
33
- * payload, listed in one place per channel.
34
- */
35
- export function resolveEndpoints(provider, onEvent, fields = []) {
36
- return Object.fromEntries(Object.entries(onEvent ?? {}).map(([key, value]) => {
37
- const label = `${provider} onEvent["${key}"]`;
38
- if (isEventEndpoint(value))
39
- return [key, endpointHandler(value, label, fields)];
40
- if (value !== undefined && typeof value !== "function")
41
- throw new TypeError(`${label} must be a function, a URL or a Request`);
42
- return [key, value];
43
- }));
44
- }
45
- /** The thread of a delivery to the channel named `name`. */
46
- export function eventThread(delivery, name) {
47
- return { id: delivery.threadId, channel: { name } };
48
- }
49
- /**
50
- * The HTTP channel's `onFinish` for a provider channel: the channel's own
51
- * notice first, such as a link to a pending decision, then the user's hook,
52
- * for the deliveries whose event the channel parsed. A failing notice is
53
- * logged and doesn't keep the user's hook from running.
54
- */
55
- export function finishEvents(notice, onFinish, parse, thread) {
56
- return async (target, delivery) => {
57
- try {
58
- await notice(target, delivery);
59
- }
60
- catch (error) {
61
- logger.error(`channel finish notice failed (${logger.safeErrorLabel(error)})`);
62
- }
63
- const event = onFinish && (await parse(delivery.rawEvent));
64
- if (event === undefined)
65
- return;
66
- await onFinish?.(event, thread(delivery), finishOf(delivery));
67
- };
68
- }
69
- /** How a delivery finished, without the delivery's own fields. */
70
- function finishOf(delivery) {
71
- const { interrupts } = delivery;
72
- switch (delivery.type) {
73
- case "run":
74
- return { type: "run", run: delivery.run, interrupts };
75
- case "skipped":
76
- return { type: "skipped", reason: delivery.reason, interrupts };
77
- default:
78
- return { type: "failed", reason: delivery.reason, interrupts };
79
- }
80
- }
81
- /**
82
- * The HTTP channel's `onReceived` for a provider channel's user hook, for the
83
- * deliveries whose event the channel parsed.
84
- */
85
- export function receiveEvents(onReceived, parse, name) {
86
- if (!onReceived)
87
- return undefined;
88
- return async (_target, delivery) => {
89
- const event = parse(delivery.rawEvent);
90
- if (event === undefined)
91
- return;
92
- await onReceived(event, {
93
- id: delivery.threadId,
94
- channel: { name: name() },
95
- });
96
- };
97
- }
98
- /** The events deploy subscribes the provider's webhook to: the handled ones. */
99
- export function handledEventKeys(handlers) {
100
- return Object.entries(handlers)
101
- .filter(([, handler]) => handler !== undefined)
102
- .map(([key]) => key)
103
- .sort();
104
- }
105
- /**
106
- * The connection `mda deploy` stores for the provider's app, or one of the
107
- * values stored beside it, such as `webhook-secret`, when `suffix` is given.
108
- */
109
- export function appConnectionSlug(provider, deploymentId, suffix) {
110
- const slug = `mda/${provider}-app/${deploymentId}`;
111
- return suffix ? `${slug}/${suffix}` : slug;
112
- }
113
- /**
114
- * A frozen copy of a parsed event, kept as the delivery's raw event so a
115
- * handler that changes its argument can't change what MDA keeps.
116
- */
117
- export function eventSnapshot(event, provider) {
118
- if (!isJsonValue(event))
119
- throw new TypeError(`invalid ${provider} event`);
120
- return immutableCopy(event);
121
- }
122
- /** App options for deploy, without unset fields. */
123
- export function definedFields(fields) {
124
- const defined = {};
125
- for (const [key, value] of Object.entries(fields))
126
- if (value !== undefined)
127
- defined[key] = value;
128
- return defined;
129
- }
130
- /**
131
- * Whether `signature`, a hex HMAC-SHA256 the caller checked the format of,
132
- * signs `rawBody` with `secret`. Compared in constant time.
133
- */
134
- export function verifyHmacSha256(secret, rawBody, signature) {
135
- const expected = createHmac("sha256", secret).update(rawBody).digest();
136
- const given = Buffer.from(signature, "hex");
137
- return given.length === expected.length && timingSafeEqual(expected, given);
138
- }
139
- /**
140
- * A value read at most every `ttlMs(value)` milliseconds. Concurrent callers
141
- * share the read in flight; a failed read is not kept, so the next call reads
142
- * again.
143
- */
144
- export class CachedRead {
145
- read;
146
- ttlMs;
147
- #entry;
148
- constructor(read, ttlMs) {
149
- this.read = read;
150
- this.ttlMs = ttlMs;
151
- }
152
- get() {
153
- if (this.#entry && this.#entry.expiresAt > Date.now())
154
- return this.#entry.value;
155
- const entry = {
156
- value: this.read().then((value) => {
157
- entry.expiresAt = Date.now() + this.ttlMs(value);
158
- return value;
159
- }, (error) => {
160
- if (this.#entry === entry)
161
- this.#entry = undefined;
162
- throw error;
163
- }),
164
- expiresAt: Number.POSITIVE_INFINITY,
165
- };
166
- this.#entry = entry;
167
- return entry.value;
168
- }
169
- /** Read again on the next call. */
170
- reset() {
171
- this.#entry = undefined;
172
- }
173
- }
174
- /** How long a value read from Agent Auth is reused before it is read again. */
175
- const SECRET_TTL_MS = 5 * 60_000;
176
- /** How long a missing value is remembered, so unsigned traffic can't hammer Agent Auth. */
177
- const MISSING_SECRET_TTL_MS = 60_000;
178
- const deploymentSecrets = new Map();
179
- /**
180
- * A value `mda deploy` stored for the deployment, such as a webhook secret:
181
- * the `env` override when set, otherwise the agent secret Agent Auth keeps at
182
- * `slug(deploymentId)`. Only a missing connection reads as `undefined`, and is
183
- * logged as `label`; credential store failures propagate.
184
- */
185
- export function readDeploymentSecret(env, slug, label) {
186
- const override = process.env[env]?.trim();
187
- if (override)
188
- return Promise.resolve(override);
189
- const deploymentId = process.env[DEPLOYMENT_ID_ENV]?.trim();
190
- if (!deploymentId)
191
- return Promise.resolve(undefined);
192
- const key = slug(deploymentId);
193
- let cached = deploymentSecrets.get(key);
194
- if (!cached) {
195
- cached = new CachedRead(() => connections.resolveDeploymentSecret(key).catch((error) => {
196
- if (!(error instanceof ConnectionNotFoundError))
197
- throw error;
198
- logger.error(`${label} is not stored in Agent Auth`);
199
- return undefined;
200
- }), (value) => (value === undefined ? MISSING_SECRET_TTL_MS : SECRET_TTL_MS));
201
- deploymentSecrets.set(key, cached);
202
- }
203
- return cached.get();
204
- }
205
- /** Forget values read from Agent Auth; for tests. */
206
- export function resetDeploymentSecrets() {
207
- deploymentSecrets.clear();
208
- }
209
- /** Run an event's handler. A throw is logged, not raised. */
210
- export async function runEventHandler(provider, event, call) {
211
- const receipt = JSON.stringify({
212
- event: logger.logIdentifier(event.key),
213
- deliveryId: logger.logIdentifier(event.deliveryId),
214
- });
215
- try {
216
- const input = await call();
217
- if (input === undefined || input === null)
218
- return { type: "skipped" };
219
- logger.info(`${provider} handler returned run input ${receipt}`);
220
- return { type: "input", input };
221
- }
222
- catch (error) {
223
- logger.error(`${provider.toLowerCase()} callback failed ${receipt} (${logger.safeErrorLabel(error)})`);
224
- return { type: "failed" };
225
- }
226
- }
227
- //# sourceMappingURL=provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/channels/http/provider.ts"],"names":[],"mappings":"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"}