@runcore-sh/runcore 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/dictionary.json +2 -2
  2. package/dist/activity/log.js +2 -2
  3. package/dist/activity/log.js.map +1 -1
  4. package/dist/agents/governed-spawn.d.ts.map +1 -1
  5. package/dist/cli.js +101 -11
  6. package/dist/cli.js.map +1 -1
  7. package/dist/extensions/cache.d.ts +57 -0
  8. package/dist/extensions/cache.d.ts.map +1 -0
  9. package/dist/extensions/cache.js +173 -0
  10. package/dist/extensions/cache.js.map +1 -0
  11. package/dist/extensions/client.d.ts +55 -0
  12. package/dist/extensions/client.d.ts.map +1 -0
  13. package/dist/extensions/client.js +120 -0
  14. package/dist/extensions/client.js.map +1 -0
  15. package/dist/extensions/index.d.ts +13 -0
  16. package/dist/extensions/index.d.ts.map +1 -0
  17. package/dist/extensions/index.js +12 -0
  18. package/dist/extensions/index.js.map +1 -0
  19. package/dist/extensions/loader.d.ts +50 -0
  20. package/dist/extensions/loader.d.ts.map +1 -0
  21. package/dist/extensions/loader.js +166 -0
  22. package/dist/extensions/loader.js.map +1 -0
  23. package/dist/extensions/manifest.d.ts +38 -0
  24. package/dist/extensions/manifest.d.ts.map +1 -0
  25. package/dist/extensions/manifest.js +17 -0
  26. package/dist/extensions/manifest.js.map +1 -0
  27. package/dist/extensions/stubs.d.ts +27 -0
  28. package/dist/extensions/stubs.d.ts.map +1 -0
  29. package/dist/extensions/stubs.js +45 -0
  30. package/dist/extensions/stubs.js.map +1 -0
  31. package/dist/lib/audit.js +2 -2
  32. package/dist/lib/audit.js.map +1 -1
  33. package/dist/lib/brain-migrate.d.ts +21 -0
  34. package/dist/lib/brain-migrate.d.ts.map +1 -0
  35. package/dist/lib/brain-migrate.js +137 -0
  36. package/dist/lib/brain-migrate.js.map +1 -0
  37. package/dist/lib/paths.d.ts +27 -0
  38. package/dist/lib/paths.d.ts.map +1 -1
  39. package/dist/lib/paths.js +65 -0
  40. package/dist/lib/paths.js.map +1 -1
  41. package/dist/llm/call-log.d.ts +40 -0
  42. package/dist/llm/call-log.d.ts.map +1 -0
  43. package/dist/llm/call-log.js +35 -0
  44. package/dist/llm/call-log.js.map +1 -0
  45. package/dist/llm/complete.d.ts +6 -0
  46. package/dist/llm/complete.d.ts.map +1 -1
  47. package/dist/llm/complete.js +27 -0
  48. package/dist/llm/complete.js.map +1 -1
  49. package/dist/mcp-server.js +118 -2
  50. package/dist/mcp-server.js.map +1 -1
  51. package/dist/memory/file-backed.d.ts +4 -0
  52. package/dist/memory/file-backed.d.ts.map +1 -1
  53. package/dist/memory/file-backed.js +4 -0
  54. package/dist/memory/file-backed.js.map +1 -1
  55. package/dist/memory/vector-index.d.ts +4 -12
  56. package/dist/memory/vector-index.d.ts.map +1 -1
  57. package/dist/memory/vector-index.js +11 -93
  58. package/dist/memory/vector-index.js.map +1 -1
  59. package/dist/search/brain-docs.d.ts +17 -7
  60. package/dist/search/brain-docs.d.ts.map +1 -1
  61. package/dist/search/brain-docs.js +170 -52
  62. package/dist/search/brain-docs.js.map +1 -1
  63. package/dist/search/brain-rag.d.ts +45 -0
  64. package/dist/search/brain-rag.d.ts.map +1 -0
  65. package/dist/search/brain-rag.js +275 -0
  66. package/dist/search/brain-rag.js.map +1 -0
  67. package/dist/search/chunker.d.ts +24 -0
  68. package/dist/search/chunker.d.ts.map +1 -0
  69. package/dist/search/chunker.js +95 -0
  70. package/dist/search/chunker.js.map +1 -0
  71. package/dist/search/embedder.d.ts +16 -0
  72. package/dist/search/embedder.d.ts.map +1 -0
  73. package/dist/search/embedder.js +108 -0
  74. package/dist/search/embedder.js.map +1 -0
  75. package/dist/search/file-watcher.d.ts +11 -0
  76. package/dist/search/file-watcher.d.ts.map +1 -0
  77. package/dist/search/file-watcher.js +86 -0
  78. package/dist/search/file-watcher.js.map +1 -0
  79. package/dist/server.d.ts.map +1 -1
  80. package/dist/server.js +168 -20
  81. package/dist/server.js.map +1 -1
  82. package/dist/sessions/store.d.ts +9 -0
  83. package/dist/sessions/store.d.ts.map +1 -1
  84. package/dist/sessions/store.js.map +1 -1
  85. package/dist/settings.d.ts +26 -0
  86. package/dist/settings.d.ts.map +1 -1
  87. package/dist/settings.js +78 -2
  88. package/dist/settings.js.map +1 -1
  89. package/dist/tracing/init.d.ts +1 -1
  90. package/dist/tracing/init.d.ts.map +1 -1
  91. package/dist/utils/logger.js +2 -2
  92. package/dist/utils/logger.js.map +1 -1
  93. package/module-tiers.json +164 -0
  94. package/package.json +9 -13
  95. package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
  96. package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
  97. package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
  98. package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
  99. package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
  100. package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
  101. package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
  102. package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
  103. package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
  104. package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
  105. package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
  106. package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
  107. package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
  108. package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
  109. package/public/index.html +379 -59
  110. package/dist/agents/autonomous.js +0 -749
  111. package/dist/agents/autonomous.js.map +0 -1
  112. package/dist/agents/commit.js +0 -113
  113. package/dist/agents/commit.js.map +0 -1
  114. package/dist/agents/continue.js +0 -158
  115. package/dist/agents/continue.js.map +0 -1
  116. package/dist/agents/cooldown.js +0 -397
  117. package/dist/agents/cooldown.js.map +0 -1
  118. package/dist/agents/dedup-guard.js +0 -131
  119. package/dist/agents/dedup-guard.js.map +0 -1
  120. package/dist/agents/feed.js +0 -176
  121. package/dist/agents/feed.js.map +0 -1
  122. package/dist/agents/governance.js +0 -292
  123. package/dist/agents/governance.js.map +0 -1
  124. package/dist/agents/governed-spawn.js +0 -192
  125. package/dist/agents/governed-spawn.js.map +0 -1
  126. package/dist/agents/heartbeat.js +0 -324
  127. package/dist/agents/heartbeat.js.map +0 -1
  128. package/dist/agents/instance-manager.js +0 -850
  129. package/dist/agents/instance-manager.js.map +0 -1
  130. package/dist/agents/issue-reporter.js +0 -123
  131. package/dist/agents/issue-reporter.js.map +0 -1
  132. package/dist/agents/issues.js +0 -141
  133. package/dist/agents/issues.js.map +0 -1
  134. package/dist/agents/locks.js +0 -234
  135. package/dist/agents/locks.js.map +0 -1
  136. package/dist/agents/memory.js +0 -93
  137. package/dist/agents/memory.js.map +0 -1
  138. package/dist/agents/monitor.js +0 -235
  139. package/dist/agents/monitor.js.map +0 -1
  140. package/dist/agents/orchestration.js +0 -715
  141. package/dist/agents/orchestration.js.map +0 -1
  142. package/dist/agents/recover.js +0 -166
  143. package/dist/agents/recover.js.map +0 -1
  144. package/dist/agents/reflection.js +0 -199
  145. package/dist/agents/reflection.js.map +0 -1
  146. package/dist/agents/runtime/bus.js +0 -174
  147. package/dist/agents/runtime/bus.js.map +0 -1
  148. package/dist/agents/runtime/config.js +0 -101
  149. package/dist/agents/runtime/config.js.map +0 -1
  150. package/dist/agents/runtime/driver.js +0 -214
  151. package/dist/agents/runtime/driver.js.map +0 -1
  152. package/dist/agents/runtime/errors.js +0 -40
  153. package/dist/agents/runtime/errors.js.map +0 -1
  154. package/dist/agents/runtime/index.js +0 -54
  155. package/dist/agents/runtime/index.js.map +0 -1
  156. package/dist/agents/runtime/lifecycle.js +0 -116
  157. package/dist/agents/runtime/lifecycle.js.map +0 -1
  158. package/dist/agents/runtime/manager.js +0 -948
  159. package/dist/agents/runtime/manager.js.map +0 -1
  160. package/dist/agents/runtime/registry.js +0 -195
  161. package/dist/agents/runtime/registry.js.map +0 -1
  162. package/dist/agents/runtime/resources.js +0 -146
  163. package/dist/agents/runtime/resources.js.map +0 -1
  164. package/dist/agents/runtime/types.js +0 -24
  165. package/dist/agents/runtime/types.js.map +0 -1
  166. package/dist/agents/spawn-policy.js +0 -202
  167. package/dist/agents/spawn-policy.js.map +0 -1
  168. package/dist/agents/spawn.js +0 -970
  169. package/dist/agents/spawn.js.map +0 -1
  170. package/dist/agents/triage.js +0 -81
  171. package/dist/agents/triage.js.map +0 -1
  172. package/dist/agents/workflow.js +0 -543
  173. package/dist/agents/workflow.js.map +0 -1
  174. package/dist/avatar/client.js +0 -172
  175. package/dist/avatar/client.js.map +0 -1
  176. package/dist/avatar/sidecar.js +0 -125
  177. package/dist/avatar/sidecar.js.map +0 -1
  178. package/dist/browser/sessions.js +0 -122
  179. package/dist/browser/sessions.js.map +0 -1
  180. package/dist/capabilities/definitions/browser.js +0 -242
  181. package/dist/capabilities/definitions/browser.js.map +0 -1
  182. package/dist/channels/whatsapp.js +0 -200
  183. package/dist/channels/whatsapp.js.map +0 -1
  184. package/dist/credentials/store.js +0 -189
  185. package/dist/credentials/store.js.map +0 -1
  186. package/dist/files/deep-index.js +0 -337
  187. package/dist/files/deep-index.js.map +0 -1
  188. package/dist/files/extract.js +0 -33
  189. package/dist/files/extract.js.map +0 -1
  190. package/dist/files/gdrive.js +0 -246
  191. package/dist/files/gdrive.js.map +0 -1
  192. package/dist/github/client.js +0 -408
  193. package/dist/github/client.js.map +0 -1
  194. package/dist/github/commit-analysis.js +0 -276
  195. package/dist/github/commit-analysis.js.map +0 -1
  196. package/dist/github/contributor-stats.js +0 -119
  197. package/dist/github/contributor-stats.js.map +0 -1
  198. package/dist/github/issue-sla.js +0 -220
  199. package/dist/github/issue-sla.js.map +0 -1
  200. package/dist/github/issue-triage.js +0 -286
  201. package/dist/github/issue-triage.js.map +0 -1
  202. package/dist/github/pr-readiness.js +0 -197
  203. package/dist/github/pr-readiness.js.map +0 -1
  204. package/dist/github/pr-review.js +0 -410
  205. package/dist/github/pr-review.js.map +0 -1
  206. package/dist/github/release-notes.js +0 -227
  207. package/dist/github/release-notes.js.map +0 -1
  208. package/dist/github/repo-health.js +0 -303
  209. package/dist/github/repo-health.js.map +0 -1
  210. package/dist/github/retry.js +0 -117
  211. package/dist/github/retry.js.map +0 -1
  212. package/dist/github/types.js +0 -8
  213. package/dist/github/types.js.map +0 -1
  214. package/dist/github/webhooks.js +0 -153
  215. package/dist/github/webhooks.js.map +0 -1
  216. package/dist/google/auth.js +0 -325
  217. package/dist/google/auth.js.map +0 -1
  218. package/dist/google/calendar-timer.js +0 -91
  219. package/dist/google/calendar-timer.js.map +0 -1
  220. package/dist/google/calendar.js +0 -270
  221. package/dist/google/calendar.js.map +0 -1
  222. package/dist/google/docs.js +0 -309
  223. package/dist/google/docs.js.map +0 -1
  224. package/dist/google/gmail-send.js +0 -219
  225. package/dist/google/gmail-send.js.map +0 -1
  226. package/dist/google/gmail-timer.js +0 -223
  227. package/dist/google/gmail-timer.js.map +0 -1
  228. package/dist/google/gmail.js +0 -470
  229. package/dist/google/gmail.js.map +0 -1
  230. package/dist/google/plugin.js +0 -169
  231. package/dist/google/plugin.js.map +0 -1
  232. package/dist/google/tasks-timer.js +0 -107
  233. package/dist/google/tasks-timer.js.map +0 -1
  234. package/dist/google/tasks.js +0 -331
  235. package/dist/google/tasks.js.map +0 -1
  236. package/dist/google/temporal.js +0 -176
  237. package/dist/google/temporal.js.map +0 -1
  238. package/dist/integrations/gate.js +0 -100
  239. package/dist/integrations/gate.js.map +0 -1
  240. package/dist/integrations/github.js +0 -331
  241. package/dist/integrations/github.js.map +0 -1
  242. package/dist/integrations/google-tasks.js +0 -432
  243. package/dist/integrations/google-tasks.js.map +0 -1
  244. package/dist/mdns.js +0 -110
  245. package/dist/mdns.js.map +0 -1
  246. package/dist/notifications/channel.js +0 -83
  247. package/dist/notifications/channel.js.map +0 -1
  248. package/dist/notifications/channels/adapter.js +0 -55
  249. package/dist/notifications/channels/adapter.js.map +0 -1
  250. package/dist/notifications/channels/index.js +0 -6
  251. package/dist/notifications/channels/index.js.map +0 -1
  252. package/dist/notifications/channels/log.js +0 -29
  253. package/dist/notifications/channels/log.js.map +0 -1
  254. package/dist/notifications/email.js +0 -72
  255. package/dist/notifications/email.js.map +0 -1
  256. package/dist/notifications/engine.js +0 -198
  257. package/dist/notifications/engine.js.map +0 -1
  258. package/dist/notifications/index.js +0 -24
  259. package/dist/notifications/index.js.map +0 -1
  260. package/dist/notifications/phone.js +0 -48
  261. package/dist/notifications/phone.js.map +0 -1
  262. package/dist/notifications/sms.js +0 -65
  263. package/dist/notifications/sms.js.map +0 -1
  264. package/dist/notifications/types.js +0 -14
  265. package/dist/notifications/types.js.map +0 -1
  266. package/dist/notifications/webhook.js +0 -65
  267. package/dist/notifications/webhook.js.map +0 -1
  268. package/dist/resend/inbox.js +0 -199
  269. package/dist/resend/inbox.js.map +0 -1
  270. package/dist/resend/webhooks.js +0 -244
  271. package/dist/resend/webhooks.js.map +0 -1
  272. package/dist/search/browse.js +0 -225
  273. package/dist/search/browse.js.map +0 -1
  274. package/dist/search/perplexity.js +0 -41
  275. package/dist/search/perplexity.js.map +0 -1
  276. package/dist/slack/channels.js +0 -277
  277. package/dist/slack/channels.js.map +0 -1
  278. package/dist/slack/client.js +0 -468
  279. package/dist/slack/client.js.map +0 -1
  280. package/dist/slack/retry.js +0 -100
  281. package/dist/slack/retry.js.map +0 -1
  282. package/dist/slack/types.js +0 -52
  283. package/dist/slack/types.js.map +0 -1
  284. package/dist/slack/webhooks.js +0 -285
  285. package/dist/slack/webhooks.js.map +0 -1
  286. package/dist/stt/client.js +0 -66
  287. package/dist/stt/client.js.map +0 -1
  288. package/dist/stt/sidecar.js +0 -115
  289. package/dist/stt/sidecar.js.map +0 -1
  290. package/dist/tracing/bridge.js +0 -70
  291. package/dist/tracing/bridge.js.map +0 -1
  292. package/dist/tracing/correlation.js +0 -49
  293. package/dist/tracing/correlation.js.map +0 -1
  294. package/dist/tracing/index.js +0 -18
  295. package/dist/tracing/index.js.map +0 -1
  296. package/dist/tracing/init.js +0 -81
  297. package/dist/tracing/init.js.map +0 -1
  298. package/dist/tracing/instrument.js +0 -145
  299. package/dist/tracing/instrument.js.map +0 -1
  300. package/dist/tracing/middleware.js +0 -69
  301. package/dist/tracing/middleware.js.map +0 -1
  302. package/dist/tracing/tracer.js +0 -327
  303. package/dist/tracing/tracer.js.map +0 -1
  304. package/dist/tts/client.js +0 -48
  305. package/dist/tts/client.js.map +0 -1
  306. package/dist/tts/sidecar.js +0 -148
  307. package/dist/tts/sidecar.js.map +0 -1
  308. package/dist/twilio/call.js +0 -79
  309. package/dist/twilio/call.js.map +0 -1
  310. package/dist/vault/matcher.js +0 -197
  311. package/dist/vault/matcher.js.map +0 -1
  312. package/dist/vault/personal.js +0 -163
  313. package/dist/vault/personal.js.map +0 -1
  314. package/dist/vault/policy.js +0 -159
  315. package/dist/vault/policy.js.map +0 -1
  316. package/dist/vault/store.js +0 -122
  317. package/dist/vault/store.js.map +0 -1
  318. package/dist/vault/transfer.js +0 -188
  319. package/dist/vault/transfer.js.map +0 -1
  320. package/dist/volumes/index.js +0 -2
  321. package/dist/volumes/index.js.map +0 -1
  322. package/dist/volumes/manager.js +0 -462
  323. package/dist/volumes/manager.js.map +0 -1
  324. package/dist/volumes/types.js +0 -8
  325. package/dist/volumes/types.js.map +0 -1
  326. package/dist/webhooks/config.js +0 -214
  327. package/dist/webhooks/config.js.map +0 -1
  328. package/dist/webhooks/event-log.js +0 -132
  329. package/dist/webhooks/event-log.js.map +0 -1
  330. package/dist/webhooks/handler.js +0 -103
  331. package/dist/webhooks/handler.js.map +0 -1
  332. package/dist/webhooks/handlers.js +0 -231
  333. package/dist/webhooks/handlers.js.map +0 -1
  334. package/dist/webhooks/index.js +0 -33
  335. package/dist/webhooks/index.js.map +0 -1
  336. package/dist/webhooks/mount.js +0 -400
  337. package/dist/webhooks/mount.js.map +0 -1
  338. package/dist/webhooks/registry.js +0 -143
  339. package/dist/webhooks/registry.js.map +0 -1
  340. package/dist/webhooks/relay.js +0 -53
  341. package/dist/webhooks/relay.js.map +0 -1
  342. package/dist/webhooks/retry.js +0 -270
  343. package/dist/webhooks/retry.js.map +0 -1
  344. package/dist/webhooks/router.js +0 -290
  345. package/dist/webhooks/router.js.map +0 -1
  346. package/dist/webhooks/twilio.js +0 -129
  347. package/dist/webhooks/twilio.js.map +0 -1
  348. package/dist/webhooks/types.js +0 -8
  349. package/dist/webhooks/types.js.map +0 -1
  350. package/dist/webhooks/verify.js +0 -154
  351. package/dist/webhooks/verify.js.map +0 -1
@@ -1,199 +0,0 @@
1
- /**
2
- * Resend inbound email inbox — pull-on-activity pattern.
3
- *
4
- * Instead of a timer, Core checks for pending emails whenever it's
5
- * already doing work. The check is debounced: at most once every 2 minutes.
6
- * Emails are pulled from the Cloudflare Worker's KV-backed inbox,
7
- * processed through the Brain pipeline, and acknowledged.
8
- *
9
- * Call `checkResendInbox()` from any activity hook — it's cheap when
10
- * there's nothing to do (single GET, empty array).
11
- */
12
- import { readFile } from "node:fs/promises";
13
- import { join } from "node:path";
14
- import { logActivity } from "../activity/log.js";
15
- import { createLogger } from "../utils/logger.js";
16
- import { processInboundEmail, sendResendReply } from "./webhooks.js";
17
- import { BRAIN_DIR } from "../lib/paths.js";
18
- const log = createLogger("resend.inbox");
19
- /** Minimum interval between inbox checks (ms). */
20
- const CHECK_DEBOUNCE_MS = 2 * 60 * 1000; // 2 minutes
21
- /** Last time we checked the inbox. */
22
- let lastCheckAt = 0;
23
- /** Whether a check is currently in flight (prevents overlapping). */
24
- let checking = false;
25
- /** Resolved worker URL (cached after first call). */
26
- let workerUrl = null;
27
- let agentRegistryCache = null;
28
- async function loadAgentRegistry() {
29
- if (agentRegistryCache)
30
- return agentRegistryCache;
31
- try {
32
- const raw = await readFile(join(BRAIN_DIR, "identity", "email-agents.json"), "utf-8");
33
- agentRegistryCache = JSON.parse(raw);
34
- return agentRegistryCache;
35
- }
36
- catch {
37
- // Fallback — single default agent
38
- return {
39
- agents: { agent: { address: "agent@pqrsystems.com", label: "Core" } },
40
- catchAll: "agent",
41
- humanNotifyEmail: null,
42
- };
43
- }
44
- }
45
- function resolveAgent(registry, toAddresses) {
46
- for (const addr of toAddresses) {
47
- const local = addr.toLowerCase().split("@")[0];
48
- if (registry.agents[local])
49
- return registry.agents[local];
50
- }
51
- // Catch-all
52
- return registry.agents[registry.catchAll] ?? { address: "agent@pqrsystems.com", label: "Core" };
53
- }
54
- function getWorkerUrl() {
55
- if (workerUrl !== null)
56
- return workerUrl;
57
- const url = process.env.RESEND_WORKER_URL;
58
- if (!url)
59
- return null;
60
- workerUrl = url.replace(/\/$/, "");
61
- return workerUrl;
62
- }
63
- function getRelaySecret() {
64
- return process.env.RELAY_SECRET || null;
65
- }
66
- /**
67
- * Check the Resend Worker inbox for pending emails.
68
- * Debounced — returns immediately if checked recently.
69
- * Safe to call frequently from any activity path.
70
- */
71
- export async function checkResendInbox() {
72
- // Debounce
73
- const now = Date.now();
74
- if (now - lastCheckAt < CHECK_DEBOUNCE_MS)
75
- return;
76
- if (checking)
77
- return;
78
- const url = getWorkerUrl();
79
- const secret = getRelaySecret();
80
- if (!url || !secret)
81
- return; // Not configured — silently skip
82
- checking = true;
83
- lastCheckAt = now;
84
- try {
85
- // Pull pending emails
86
- const res = await fetch(`${url}/api/resend/inbox`, {
87
- headers: { Authorization: `Bearer ${secret}` },
88
- signal: AbortSignal.timeout(10_000),
89
- });
90
- if (!res.ok) {
91
- log.warn("Inbox check failed", { status: res.status });
92
- return;
93
- }
94
- const data = (await res.json());
95
- if (data.count === 0)
96
- return;
97
- log.info(`${data.count} pending email(s) in inbox`);
98
- // Process each email
99
- for (const email of data.emails) {
100
- try {
101
- await processEmail(email, url, secret);
102
- }
103
- catch (err) {
104
- log.error("Failed to process inbox email", {
105
- id: email.id,
106
- from: email.from,
107
- error: String(err),
108
- });
109
- }
110
- }
111
- }
112
- catch (err) {
113
- // Network error, Worker down, etc. — not critical, try next time
114
- log.debug("Inbox check error", { error: String(err) });
115
- }
116
- finally {
117
- checking = false;
118
- }
119
- }
120
- async function processEmail(email, workerUrl, secret) {
121
- if (!email.body?.trim()) {
122
- // Empty email — just ack it
123
- await ackEmail(email.id, workerUrl, secret);
124
- return;
125
- }
126
- // Resolve which agent identity should handle this email
127
- const registry = await loadAgentRegistry();
128
- const agent = resolveAgent(registry, email.to);
129
- logActivity({
130
- source: "resend",
131
- summary: `Processing inbound email from ${email.from} → ${agent.label}: "${email.subject}"`,
132
- });
133
- const reply = await processInboundEmail({
134
- from: email.from,
135
- subject: email.subject,
136
- body: email.body,
137
- date: email.created_at || email.received_at,
138
- agentName: agent.label,
139
- });
140
- if (reply) {
141
- const sent = await sendResendReply({
142
- to: email.from,
143
- subject: email.subject,
144
- body: reply,
145
- inReplyTo: email.message_id,
146
- from: `${agent.label} <${agent.address}>`,
147
- });
148
- logActivity({
149
- source: "resend",
150
- summary: sent
151
- ? `${agent.label} replied to ${email.from}: "${email.subject}" (${reply.length} chars)`
152
- : `${agent.label} failed to reply to ${email.from}: "${email.subject}"`,
153
- });
154
- }
155
- // Acknowledge — remove from Worker KV regardless of reply success
156
- await ackEmail(email.id, workerUrl, secret);
157
- }
158
- async function ackEmail(id, workerUrl, secret) {
159
- try {
160
- await fetch(`${workerUrl}/api/resend/inbox/${id}`, {
161
- method: "DELETE",
162
- headers: { Authorization: `Bearer ${secret}` },
163
- signal: AbortSignal.timeout(5_000),
164
- });
165
- }
166
- catch (err) {
167
- log.warn("Failed to ack email", { id, error: String(err) });
168
- }
169
- }
170
- /**
171
- * Force an immediate inbox check, bypassing the debounce.
172
- * Useful for manual triggers (e.g., "check email" command).
173
- */
174
- export async function forceCheckResendInbox() {
175
- lastCheckAt = 0;
176
- checking = false;
177
- const url = getWorkerUrl();
178
- const secret = getRelaySecret();
179
- if (!url || !secret)
180
- return 0;
181
- // Quick count check before full processing
182
- try {
183
- const res = await fetch(`${url}/api/resend/inbox`, {
184
- headers: { Authorization: `Bearer ${secret}` },
185
- signal: AbortSignal.timeout(10_000),
186
- });
187
- if (!res.ok)
188
- return 0;
189
- const data = (await res.json());
190
- if (data.count === 0)
191
- return 0;
192
- await checkResendInbox();
193
- return data.count;
194
- }
195
- catch {
196
- return 0;
197
- }
198
- }
199
- //# sourceMappingURL=inbox.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/resend/inbox.ts"],"names":[],"mappings":"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"}
@@ -1,244 +0,0 @@
1
- /**
2
- * Resend inbound email webhook provider.
3
- *
4
- * Handles email.received events from Resend via Svix-signed webhooks.
5
- * Fetches full email body from Resend API, processes through the email Brain
6
- * pipeline, and replies via Resend API with proper threading headers.
7
- */
8
- import { createSvixStyleProvider, safeHandler } from "../webhooks/handlers.js";
9
- import { logActivity } from "../activity/log.js";
10
- import { createLogger } from "../utils/logger.js";
11
- import { Brain } from "../brain.js";
12
- import { FileSystemLongTermMemory } from "../memory/file-backed.js";
13
- import { getInstanceName } from "../instance.js";
14
- import { getProvider as getLLMProvider } from "../llm/providers/index.js";
15
- import { resolveProvider, resolveChatModel } from "../settings.js";
16
- import { readHuman } from "../auth/identity.js";
17
- import { getCapabilityRegistry } from "../capabilities/index.js";
18
- const log = createLogger("resend.webhooks");
19
- const RESEND_API = "https://api.resend.com";
20
- const MEMORY_DIR = "brain/memory";
21
- // ── Resend API helpers ──────────────────────────────────────────────────────
22
- /**
23
- * Fetch the full email content from Resend's receiving API.
24
- * The webhook only includes metadata — the body must be fetched separately.
25
- */
26
- async function fetchEmailContent(emailId) {
27
- const apiKey = process.env.RESEND_API_KEY;
28
- if (!apiKey) {
29
- log.error("RESEND_API_KEY not set — cannot fetch email content");
30
- return null;
31
- }
32
- try {
33
- const res = await fetch(`${RESEND_API}/emails/receiving/${emailId}`, {
34
- headers: { Authorization: `Bearer ${apiKey}` },
35
- signal: AbortSignal.timeout(15_000),
36
- });
37
- if (!res.ok) {
38
- log.error("Resend API error fetching email", {
39
- emailId,
40
- status: res.status,
41
- statusText: res.statusText,
42
- });
43
- return null;
44
- }
45
- return (await res.json());
46
- }
47
- catch (err) {
48
- log.error("Failed to fetch email from Resend", {
49
- emailId,
50
- error: String(err),
51
- });
52
- return null;
53
- }
54
- }
55
- /**
56
- * Send a reply via Resend API with proper threading headers.
57
- */
58
- export async function sendResendReply(opts) {
59
- const apiKey = process.env.RESEND_API_KEY;
60
- if (!apiKey) {
61
- log.error("RESEND_API_KEY not set — cannot send reply");
62
- return false;
63
- }
64
- const from = opts.from ?? `${getInstanceName()} <agent@pqrsystems.com>`;
65
- const payload = {
66
- from,
67
- to: [opts.to],
68
- subject: opts.subject.startsWith("Re:") ? opts.subject : `Re: ${opts.subject}`,
69
- text: opts.body,
70
- };
71
- // Threading headers
72
- if (opts.inReplyTo) {
73
- payload.headers = {
74
- "In-Reply-To": opts.inReplyTo,
75
- References: opts.inReplyTo,
76
- };
77
- }
78
- try {
79
- const res = await fetch(`${RESEND_API}/emails`, {
80
- method: "POST",
81
- headers: {
82
- "Content-Type": "application/json",
83
- Authorization: `Bearer ${apiKey}`,
84
- },
85
- body: JSON.stringify(payload),
86
- signal: AbortSignal.timeout(15_000),
87
- });
88
- if (!res.ok) {
89
- const text = await res.text().catch(() => "");
90
- log.error("Resend send failed", {
91
- status: res.status,
92
- to: opts.to,
93
- error: text,
94
- });
95
- return false;
96
- }
97
- log.info("Resend reply sent", { to: opts.to, subject: opts.subject });
98
- return true;
99
- }
100
- catch (err) {
101
- log.error("Resend send exception", { to: opts.to, error: String(err) });
102
- return false;
103
- }
104
- }
105
- // ── Email processing (shared Brain pipeline) ────────────────────────────────
106
- /**
107
- * Process an inbound email through the Brain + LLM + capability pipeline.
108
- * Reuses the same logic as the Gmail email handler in server.ts.
109
- */
110
- export async function processInboundEmail(opts) {
111
- const human = await readHuman();
112
- const name = human?.name ?? "Human";
113
- const agentLabel = opts.agentName ?? getInstanceName();
114
- if (!opts.body.trim())
115
- return null;
116
- // Build a lightweight Brain for email context
117
- const ltm = new FileSystemLongTermMemory(MEMORY_DIR);
118
- await ltm.init();
119
- const emailBrain = new Brain({
120
- systemPrompt: [
121
- `You are ${agentLabel}, a personal AI agent paired with ${name}. You run locally on ${name}'s machine.`,
122
- `You are responding to an email that was sent to you at ${agentLabel.toLowerCase()}@pqrsystems.com. This is a working email channel — you received this email and your reply will be sent back automatically.`,
123
- ``,
124
- `Your capabilities — USE THEM when the email requests action:`,
125
- `- Google Calendar: CREATE, UPDATE, DELETE events using [CALENDAR_ACTION] blocks.`,
126
- `- Gmail: SEND emails and REPLY to threads using [EMAIL_ACTION] blocks.`,
127
- `- Google Docs & Sheets: CREATE documents using [DOC_ACTION] blocks.`,
128
- `- Task board for tracking work.`,
129
- `- Long-term memory of past conversations and learned facts.`,
130
- ``,
131
- ...(getCapabilityRegistry()?.getPromptInstructions({ origin: "email", name }) ?? "").split("\n"),
132
- ``,
133
- `Rules for email replies:`,
134
- `- Write a natural, helpful reply as plain text (no markdown).`,
135
- `- Be warm and direct — you have personality, you're not a corporate assistant.`,
136
- `- Keep it concise and appropriate for email.`,
137
- `- Do not include a subject line. Just write the body of the reply.`,
138
- `- NEVER claim you can't do something you clearly just did (you ARE sending this email).`,
139
- `- When someone asks you to DO something (schedule, create, send), DO IT with the appropriate action block — don't just acknowledge it.`,
140
- `- Action blocks will be stripped from the email reply automatically. The recipient only sees your text.`,
141
- `- Sign off as "— ${agentLabel}"`,
142
- ].join("\n"),
143
- }, ltm);
144
- const ctx = await emailBrain.getContextForTurn({
145
- userInput: opts.body,
146
- conversationHistory: [],
147
- });
148
- // Inject email metadata so the agent knows the context
149
- ctx.messages.splice(1, 0, {
150
- role: "system",
151
- content: [
152
- `--- Incoming email ---`,
153
- `From: ${opts.from}`,
154
- `Subject: ${opts.subject}`,
155
- `Date: ${opts.date}`,
156
- `--- End email metadata ---`,
157
- ].join("\n"),
158
- });
159
- // Add the email body as the "user" message
160
- ctx.messages.push({ role: "user", content: opts.body });
161
- const provider = getLLMProvider(resolveProvider());
162
- const model = resolveChatModel();
163
- let reply = await provider.completeChat(ctx.messages, model ?? undefined);
164
- if (!reply?.trim())
165
- return null;
166
- // Process action blocks from the AI response via capability registry
167
- const capReg = getCapabilityRegistry();
168
- if (capReg) {
169
- const { cleaned } = await capReg.processResponse(reply, { origin: "email", name });
170
- reply = cleaned;
171
- }
172
- // Guard: if stripping action blocks left only a signature, don't send
173
- const signaturePattern = new RegExp(`[\\s\\n]*[—\\-]+\\s*${getInstanceName()}[\\s.!]*$`, "i");
174
- const withoutSignature = reply.replace(signaturePattern, "").trim();
175
- if (!withoutSignature) {
176
- log.warn("Email reply was empty after stripping action blocks — not sending", {
177
- from: opts.from,
178
- subject: opts.subject,
179
- });
180
- return null;
181
- }
182
- return reply.trim();
183
- }
184
- // ── Webhook provider ─────────────────────────────────────────────────────────
185
- export const resendProvider = createSvixStyleProvider({
186
- name: "resend",
187
- process: safeHandler("resend", async (payload) => {
188
- const event = payload;
189
- if (event?.type !== "email.received") {
190
- return {
191
- handled: false,
192
- message: `Unhandled event type: ${event?.type ?? "unknown"}`,
193
- };
194
- }
195
- const { email_id, from, subject, message_id, created_at } = event.data;
196
- log.info("Resend inbound email received", { email_id, from, subject });
197
- logActivity({
198
- source: "resend",
199
- summary: `Inbound email from ${from}: "${subject}"`,
200
- });
201
- // Fetch full email content (webhook only has metadata)
202
- const content = await fetchEmailContent(email_id);
203
- if (!content) {
204
- return {
205
- handled: false,
206
- message: `Failed to fetch email content for ${email_id}`,
207
- };
208
- }
209
- const body = content.text || content.html?.replace(/<[^>]+>/g, " ") || "";
210
- if (!body.trim()) {
211
- return { handled: true, message: "Empty email body — skipped" };
212
- }
213
- // Process through Brain pipeline
214
- const reply = await processInboundEmail({
215
- from,
216
- subject,
217
- body,
218
- date: created_at || new Date().toISOString(),
219
- });
220
- if (!reply) {
221
- return { handled: true, message: "No reply generated — skipped" };
222
- }
223
- // Send reply via Resend with threading
224
- const sent = await sendResendReply({
225
- to: from,
226
- subject,
227
- body: reply,
228
- inReplyTo: message_id,
229
- });
230
- logActivity({
231
- source: "resend",
232
- summary: sent
233
- ? `Replied to ${from}: "${subject}" (${reply.length} chars)`
234
- : `Failed to reply to ${from}: "${subject}"`,
235
- });
236
- return {
237
- handled: true,
238
- message: sent
239
- ? `Processed and replied to email from ${from}`
240
- : `Processed email from ${from} but reply send failed`,
241
- };
242
- }),
243
- });
244
- //# sourceMappingURL=webhooks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/resend/webhooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,GAAG,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;AAE5C,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAC5C,MAAM,UAAU,GAAG,cAAc,CAAC;AA+BlC,+EAA+E;AAE/E;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,OAAe;IAEf,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,qBAAqB,OAAO,EAAE,EAAE;YACnE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;YAC9C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC3C,OAAO;gBACP,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE;YAC7C,OAAO;YACP,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAMrC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,eAAe,EAAE,yBAAyB,CAAC;IAExE,MAAM,OAAO,GAA4B;QACvC,IAAI;QACJ,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACb,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;QAC9E,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC;IAEF,oBAAoB;IACpB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,OAAO,GAAG;YAChB,aAAa,EAAE,IAAI,CAAC,SAAS;YAC7B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,SAAS,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,MAAM,EAAE;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAC9B,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAMzC;IACC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,OAAO,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,IAAI,eAAe,EAAE,CAAC;IAEvD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAEnC,8CAA8C;IAC9C,MAAM,GAAG,GAAG,IAAI,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,KAAK,CAC1B;QACE,YAAY,EAAE;YACZ,WAAW,UAAU,qCAAqC,IAAI,wBAAwB,IAAI,aAAa;YACvG,0DAA0D,UAAU,CAAC,WAAW,EAAE,4HAA4H;YAC9M,EAAE;YACF,8DAA8D;YAC9D,kFAAkF;YAClF,wEAAwE;YACxE,qEAAqE;YACrE,iCAAiC;YACjC,6DAA6D;YAC7D,EAAE;YACF,GAAG,CAAC,qBAAqB,EAAE,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAChG,EAAE;YACF,0BAA0B;YAC1B,+DAA+D;YAC/D,gFAAgF;YAChF,8CAA8C;YAC9C,oEAAoE;YACpE,yFAAyF;YACzF,wIAAwI;YACxI,yGAAyG;YACzG,oBAAoB,UAAU,GAAG;SAClC,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,EACD,GAAG,CACJ,CAAC;IAEF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC;QAC7C,SAAS,EAAE,IAAI,CAAC,IAAI;QACpB,mBAAmB,EAAE,EAAE;KACxB,CAAC,CAAC;IAEH,uDAAuD;IACvD,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE;QACxB,IAAI,EAAE,QAAiB;QACvB,OAAO,EAAE;YACP,wBAAwB;YACxB,SAAS,IAAI,CAAC,IAAI,EAAE;YACpB,YAAY,IAAI,CAAC,OAAO,EAAE;YAC1B,SAAS,IAAI,CAAC,IAAI,EAAE;YACpB,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC,CAAC;IAEH,2CAA2C;IAC3C,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;IAE1E,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAEhC,qEAAqE;IACrE,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,KAAK,GAAG,OAAO,CAAC;IAClB,CAAC;IAED,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,IAAI,MAAM,CACjC,uBAAuB,eAAe,EAAE,WAAW,EACnD,GAAG,CACJ,CAAC;IACF,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,GAAG,CAAC,IAAI,CAAC,mEAAmE,EAAE;YAC5E,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;IACpD,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,OAAqC,CAAC;QAEpD,IAAI,KAAK,EAAE,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,yBAA0B,KAA2B,EAAE,IAAI,IAAI,SAAS,EAAE;aACpF,CAAC;QACJ,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;QAEvE,GAAG,CAAC,IAAI,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,WAAW,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,sBAAsB,IAAI,MAAM,OAAO,GAAG;SACpD,CAAC,CAAC;QAEH,uDAAuD;QACvD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,qCAAqC,QAAQ,EAAE;aACzD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QAClE,CAAC;QAED,iCAAiC;QACjC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC;YACtC,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,IAAI,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;QACpE,CAAC;QAED,uCAAuC;QACvC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;YACjC,EAAE,EAAE,IAAI;YACR,OAAO;YACP,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,UAAU;SACtB,CAAC,CAAC;QAEH,WAAW,CAAC;YACV,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI;gBACX,CAAC,CAAC,cAAc,IAAI,MAAM,OAAO,MAAM,KAAK,CAAC,MAAM,SAAS;gBAC5D,CAAC,CAAC,sBAAsB,IAAI,MAAM,OAAO,GAAG;SAC/C,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;gBACX,CAAC,CAAC,uCAAuC,IAAI,EAAE;gBAC/C,CAAC,CAAC,wBAAwB,IAAI,wBAAwB;SACzD,CAAC;IACJ,CAAC,CAAC;CACH,CAAC,CAAC"}