@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,470 +0,0 @@
1
- /**
2
- * Gmail API client.
3
- * Raw fetch via googleGet/googlePost — no SDK.
4
- * All functions return { ok, data?, message } — never throw.
5
- */
6
- import { googleGet, googlePost, isGoogleAuthenticated } from "./auth.js";
7
- import { createLogger } from "../utils/logger.js";
8
- const log = createLogger("google.gmail");
9
- const GMAIL_API = "https://www.googleapis.com/gmail/v1/users/me";
10
- // --- Helpers ---
11
- function getHeader(msg, name) {
12
- return msg.payload?.headers?.find((h) => h.name.toLowerCase() === name.toLowerCase())?.value ?? "";
13
- }
14
- function decodeBase64Url(data) {
15
- // Gmail uses URL-safe base64 — replace chars and pad
16
- const base64 = data.replace(/-/g, "+").replace(/_/g, "/");
17
- return Buffer.from(base64, "base64").toString("utf-8");
18
- }
19
- function extractTextBody(part) {
20
- if (part.mimeType === "text/plain" && part.body?.data) {
21
- return decodeBase64Url(part.body.data);
22
- }
23
- if (part.parts) {
24
- for (const sub of part.parts) {
25
- const text = extractTextBody(sub);
26
- if (text)
27
- return text;
28
- }
29
- }
30
- return "";
31
- }
32
- function parseMessage(msg) {
33
- const labels = msg.labelIds ?? [];
34
- const rfc822MessageId = getHeader(msg, "Message-ID") || undefined;
35
- return {
36
- id: msg.id,
37
- threadId: msg.threadId,
38
- subject: getHeader(msg, "Subject") || "(no subject)",
39
- from: getHeader(msg, "From"),
40
- to: getHeader(msg, "To"),
41
- date: getHeader(msg, "Date") || (msg.internalDate ? new Date(parseInt(msg.internalDate)).toISOString() : ""),
42
- snippet: msg.snippet ?? "",
43
- labels,
44
- isUnread: labels.includes("UNREAD"),
45
- rfc822MessageId,
46
- };
47
- }
48
- function parseMessageWithBody(msg) {
49
- const parsed = parseMessage(msg);
50
- // Extract plain text body
51
- if (msg.payload) {
52
- let body = "";
53
- if (msg.payload.body?.data) {
54
- body = decodeBase64Url(msg.payload.body.data);
55
- }
56
- else if (msg.payload.parts) {
57
- for (const part of msg.payload.parts) {
58
- body = extractTextBody(part);
59
- if (body)
60
- break;
61
- }
62
- }
63
- parsed.body = body;
64
- }
65
- return parsed;
66
- }
67
- // --- Public API ---
68
- /**
69
- * Check if Gmail is ready (Google authenticated).
70
- */
71
- export function isGmailAvailable() {
72
- return isGoogleAuthenticated();
73
- }
74
- /**
75
- * Get recent messages from the last N hours (headers + snippet, no body).
76
- */
77
- export async function getRecentMessages(hours = 24) {
78
- log.debug("Fetching recent messages", { hours });
79
- const afterEpoch = Math.floor((Date.now() - hours * 60 * 60 * 1000) / 1000);
80
- const query = `after:${afterEpoch}`;
81
- const listResult = await googleGet(`${GMAIL_API}/messages`, { q: query, maxResults: "30" });
82
- if (!listResult.ok) {
83
- log.error("Failed to list recent messages", { hours, error: listResult.message });
84
- return { ok: false, message: listResult.message };
85
- }
86
- const ids = listResult.data?.messages ?? [];
87
- if (ids.length === 0) {
88
- log.debug("No recent messages found", { hours });
89
- return { ok: true, messages: [], message: "No recent messages" };
90
- }
91
- // Fetch each message metadata (parallel, limit to 20)
92
- const fetches = ids.slice(0, 20).map(async ({ id }) => {
93
- const r = await googleGet(`${GMAIL_API}/messages/${id}`, { format: "metadata", metadataHeaders: ["Subject", "From", "To", "Date"] });
94
- return r.ok && r.data ? parseMessage(r.data) : null;
95
- });
96
- const results = await Promise.all(fetches);
97
- const messages = results.filter((m) => m !== null);
98
- log.info("Fetched recent messages", { hours, count: messages.length });
99
- return { ok: true, messages, message: `${messages.length} messages in last ${hours}h` };
100
- }
101
- /**
102
- * Get a single message with full body.
103
- */
104
- export async function getMessage(id) {
105
- log.debug("Fetching message", { messageId: id });
106
- const result = await googleGet(`${GMAIL_API}/messages/${id}`, { format: "full" });
107
- if (!result.ok) {
108
- log.error("Failed to fetch message", { messageId: id, error: result.message });
109
- return { ok: false, status: result.message };
110
- }
111
- log.debug("Message fetched", { messageId: id });
112
- return {
113
- ok: true,
114
- message: parseMessageWithBody(result.data),
115
- status: "OK",
116
- };
117
- }
118
- /**
119
- * Get a full conversation thread.
120
- */
121
- export async function getThread(threadId) {
122
- log.debug("Fetching thread", { threadId });
123
- const result = await googleGet(`${GMAIL_API}/threads/${threadId}`, { format: "full" });
124
- if (!result.ok) {
125
- log.error("Failed to fetch thread", { threadId, error: result.message });
126
- return { ok: false, message: result.message };
127
- }
128
- const rawMessages = result.data?.messages ?? [];
129
- const messages = rawMessages.map(parseMessageWithBody);
130
- const subject = messages[0]?.subject ?? "(no subject)";
131
- log.debug("Thread fetched", { threadId, messageCount: messages.length });
132
- return {
133
- ok: true,
134
- thread: { id: threadId, messages, subject },
135
- message: `Thread with ${messages.length} messages`,
136
- };
137
- }
138
- /**
139
- * Search messages using Gmail search syntax.
140
- */
141
- export async function searchMessages(query, maxResults = 10) {
142
- log.debug("Searching messages", { query, maxResults });
143
- const listResult = await googleGet(`${GMAIL_API}/messages`, { q: query, maxResults: String(maxResults) });
144
- if (!listResult.ok) {
145
- log.error("Failed to search messages", { query, error: listResult.message });
146
- return { ok: false, message: listResult.message };
147
- }
148
- const ids = listResult.data?.messages ?? [];
149
- if (ids.length === 0) {
150
- log.debug("No messages matched search", { query });
151
- return { ok: true, messages: [], message: `No messages matching: ${query}` };
152
- }
153
- const fetches = ids.map(async ({ id }) => {
154
- const r = await googleGet(`${GMAIL_API}/messages/${id}`, { format: "metadata", metadataHeaders: ["Subject", "From", "To", "Date"] });
155
- return r.ok && r.data ? parseMessage(r.data) : null;
156
- });
157
- const results = await Promise.all(fetches);
158
- const messages = results.filter((m) => m !== null);
159
- log.debug("Search complete", { query, resultCount: messages.length });
160
- return { ok: true, messages, message: `${messages.length} results for: ${query}` };
161
- }
162
- /**
163
- * Get unread message count.
164
- */
165
- export async function getUnreadCount() {
166
- log.debug("Fetching unread count");
167
- const listResult = await googleGet(`${GMAIL_API}/messages`, { q: "is:unread", maxResults: "1" });
168
- if (!listResult.ok) {
169
- log.error("Failed to fetch unread count", { error: listResult.message });
170
- return { ok: false, message: listResult.message };
171
- }
172
- const count = listResult.data?.resultSizeEstimate ?? 0;
173
- log.debug("Unread count fetched", { count });
174
- return {
175
- ok: true,
176
- count,
177
- message: `${count} unread`,
178
- };
179
- }
180
- /**
181
- * Format messages as a readable text block for LLM context injection.
182
- */
183
- export function formatMessagesForContext(messages) {
184
- if (messages.length === 0)
185
- return "No messages.";
186
- return messages
187
- .map((m) => {
188
- const unread = m.isUnread ? " [UNREAD]" : "";
189
- const date = m.date
190
- ? new Date(m.date).toLocaleString("en-US", {
191
- month: "short",
192
- day: "numeric",
193
- hour: "numeric",
194
- minute: "2-digit",
195
- })
196
- : "";
197
- const msgId = m.rfc822MessageId ? `, messageId: ${m.rfc822MessageId}` : "";
198
- return `- ${date}: ${m.from} — "${m.subject}"${unread} [threadId: ${m.threadId}${msgId}]\n ${m.snippet}`;
199
- })
200
- .join("\n");
201
- }
202
- /**
203
- * Mark a message as read (remove UNREAD label).
204
- */
205
- export async function markAsRead(messageId) {
206
- log.debug("Marking message as read", { messageId });
207
- const result = await googlePost(`${GMAIL_API}/messages/${messageId}/modify`, { removeLabelIds: ["UNREAD"] });
208
- if (!result.ok) {
209
- log.error("Failed to mark message as read", { messageId, error: result.message });
210
- return { ok: false, message: result.message };
211
- }
212
- log.debug("Message marked as read", { messageId });
213
- return { ok: true, message: `Marked ${messageId} as read` };
214
- }
215
- /**
216
- * Mark a message as unread (add UNREAD label).
217
- */
218
- export async function markAsUnread(messageId) {
219
- log.debug("Marking message as unread", { messageId });
220
- const result = await googlePost(`${GMAIL_API}/messages/${messageId}/modify`, { addLabelIds: ["UNREAD"] });
221
- if (!result.ok) {
222
- log.error("Failed to mark message as unread", { messageId, error: result.message });
223
- return { ok: false, message: result.message };
224
- }
225
- log.debug("Message marked as unread", { messageId });
226
- return { ok: true, message: `Marked ${messageId} as unread` };
227
- }
228
- /**
229
- * Batch mark multiple messages as read.
230
- */
231
- export async function batchMarkAsRead(messageIds) {
232
- const results = await Promise.all(messageIds.map(markAsRead));
233
- const succeeded = results.filter((r) => r.ok).length;
234
- const failed = results.length - succeeded;
235
- return {
236
- ok: failed === 0,
237
- succeeded,
238
- failed,
239
- message: `Marked ${succeeded}/${results.length} as read`,
240
- };
241
- }
242
- /**
243
- * Batch mark multiple messages as unread.
244
- */
245
- export async function batchMarkAsUnread(messageIds) {
246
- const results = await Promise.all(messageIds.map(markAsUnread));
247
- const succeeded = results.filter((r) => r.ok).length;
248
- const failed = results.length - succeeded;
249
- return {
250
- ok: failed === 0,
251
- succeeded,
252
- failed,
253
- message: `Marked ${succeeded}/${results.length} as unread`,
254
- };
255
- }
256
- // --- Sender categorization & priority detection ---
257
- const NOREPLY_PATTERNS = [
258
- /^no-?reply@/i,
259
- /^noreply@/i,
260
- /^donotreply@/i,
261
- /^do-not-reply@/i,
262
- /^mailer-daemon@/i,
263
- /^notifications?@/i,
264
- /^alert(s)?@/i,
265
- /^info@/i,
266
- ];
267
- const SOCIAL_DOMAINS = [
268
- "facebookmail.com", "linkedin.com", "twitter.com", "x.com",
269
- "instagram.com", "tiktok.com", "pinterest.com", "reddit.com",
270
- "discord.com", "slack.com", "medium.com",
271
- ];
272
- const NEWSLETTER_PATTERNS = [
273
- /^newsletter@/i,
274
- /^digest@/i,
275
- /^updates?@/i,
276
- /^weekly@/i,
277
- /^daily@/i,
278
- /^news@/i,
279
- /^subscribe@/i,
280
- ];
281
- /**
282
- * Extract email address from a "Name <email>" formatted From header.
283
- */
284
- function extractEmail(from) {
285
- const match = from.match(/<([^>]+)>/);
286
- return (match ? match[1] : from).toLowerCase().trim();
287
- }
288
- /**
289
- * Extract domain from an email address.
290
- */
291
- function extractDomain(email) {
292
- const parts = email.split("@");
293
- return parts.length > 1 ? parts[1] : "";
294
- }
295
- /**
296
- * Categorize a sender based on email address and Gmail labels.
297
- */
298
- export function categorizeSender(from, labels) {
299
- // Gmail category labels take precedence
300
- if (labels.includes("CATEGORY_SOCIAL"))
301
- return "social";
302
- if (labels.includes("CATEGORY_PROMOTIONS"))
303
- return "promotion";
304
- if (labels.includes("CATEGORY_FORUMS"))
305
- return "forum";
306
- if (labels.includes("CATEGORY_UPDATES"))
307
- return "update";
308
- const email = extractEmail(from);
309
- const domain = extractDomain(email);
310
- // Social domain check
311
- if (SOCIAL_DOMAINS.some((d) => domain.endsWith(d)))
312
- return "social";
313
- // Newsletter patterns
314
- if (NEWSLETTER_PATTERNS.some((p) => p.test(email)))
315
- return "newsletter";
316
- // Noreply / notification patterns
317
- if (NOREPLY_PATTERNS.some((p) => p.test(email)))
318
- return "notification";
319
- // CATEGORY_PRIMARY or no category label → direct
320
- if (labels.includes("CATEGORY_PRIMARY"))
321
- return "direct";
322
- return "unknown";
323
- }
324
- /**
325
- * Detect message priority from Gmail labels and headers.
326
- * High: IMPORTANT label or STARRED.
327
- * Low: promotions, social, forums.
328
- * Normal: everything else.
329
- */
330
- export function detectPriority(labels, senderCategory) {
331
- if (labels.includes("IMPORTANT") || labels.includes("STARRED"))
332
- return "high";
333
- if (senderCategory === "promotion" || senderCategory === "social" || senderCategory === "forum")
334
- return "low";
335
- return "normal";
336
- }
337
- /**
338
- * Enrich a GmailMessage with priority and sender category.
339
- */
340
- export function categorizeMessage(msg) {
341
- const senderCategory = categorizeSender(msg.from, msg.labels);
342
- const priority = detectPriority(msg.labels, senderCategory);
343
- return { ...msg, priority, senderCategory };
344
- }
345
- // --- Batch triage helpers ---
346
- /**
347
- * Categorize an array of messages by sender type.
348
- * Returns messages grouped by category, sorted with direct first.
349
- */
350
- export async function categorizeMessages(hours = 24) {
351
- const result = await getRecentMessages(hours);
352
- if (!result.ok)
353
- return { ok: false, message: result.message };
354
- const categorized = (result.messages ?? []).map(categorizeMessage);
355
- const byCategory = {
356
- direct: [], notification: [], newsletter: [], social: [],
357
- promotion: [], forum: [], update: [], unknown: [],
358
- };
359
- for (const msg of categorized) {
360
- byCategory[msg.senderCategory].push(msg);
361
- }
362
- return {
363
- ok: true,
364
- categorized,
365
- byCategory,
366
- message: `${categorized.length} messages categorized`,
367
- };
368
- }
369
- /**
370
- * Return messages scored and sorted by priority (high → normal → low).
371
- * Within each tier, messages are in reverse-chronological order.
372
- */
373
- export async function prioritizeInbox(hours = 24) {
374
- const result = await getRecentMessages(hours);
375
- if (!result.ok)
376
- return { ok: false, message: result.message };
377
- const categorized = (result.messages ?? []).map(categorizeMessage);
378
- const priorityOrder = { high: 0, normal: 1, low: 2 };
379
- const sorted = categorized.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
380
- const counts = { high: 0, normal: 0, low: 0 };
381
- for (const m of sorted)
382
- counts[m.priority]++;
383
- return {
384
- ok: true,
385
- messages: sorted,
386
- counts,
387
- message: `${counts.high} high, ${counts.normal} normal, ${counts.low} low priority`,
388
- };
389
- }
390
- /**
391
- * Alias for fetchInboxSummary — provides complete triage overview.
392
- */
393
- export const getInboxSummary = fetchInboxSummary;
394
- // --- Inbox summary ---
395
- /**
396
- * Fetch a triage-ready inbox summary: unread count, categorized recent messages,
397
- * category breakdown, and high-priority items.
398
- */
399
- export async function fetchInboxSummary(hours = 24) {
400
- // Fetch unread count and recent messages in parallel
401
- const [unreadResult, recentResult] = await Promise.all([
402
- getUnreadCount(),
403
- getRecentMessages(hours),
404
- ]);
405
- if (!unreadResult.ok)
406
- return { ok: false, message: `Unread count failed: ${unreadResult.message}` };
407
- if (!recentResult.ok)
408
- return { ok: false, message: `Recent messages failed: ${recentResult.message}` };
409
- const categorized = (recentResult.messages ?? []).map(categorizeMessage);
410
- // Build category counts
411
- const byCategory = {
412
- direct: 0, notification: 0, newsletter: 0, social: 0,
413
- promotion: 0, forum: 0, update: 0, unknown: 0,
414
- };
415
- for (const msg of categorized) {
416
- byCategory[msg.senderCategory]++;
417
- }
418
- const highPriority = categorized.filter((m) => m.priority === "high");
419
- return {
420
- ok: true,
421
- summary: {
422
- unreadCount: unreadResult.count ?? 0,
423
- recentMessages: categorized,
424
- byCategory,
425
- highPriority,
426
- },
427
- message: `${unreadResult.count ?? 0} unread, ${categorized.length} recent, ${highPriority.length} high priority`,
428
- };
429
- }
430
- /**
431
- * Format an inbox summary as a readable text block for LLM context injection.
432
- */
433
- export function formatInboxSummaryForContext(summary) {
434
- const lines = [];
435
- lines.push(`📬 Inbox: ${summary.unreadCount} unread`);
436
- // Category breakdown (only non-zero)
437
- const cats = Object.entries(summary.byCategory)
438
- .filter(([, count]) => count > 0)
439
- .map(([cat, count]) => `${cat}: ${count}`)
440
- .join(", ");
441
- if (cats)
442
- lines.push(`Categories: ${cats}`);
443
- // High priority
444
- if (summary.highPriority.length > 0) {
445
- lines.push(`\nHigh priority (${summary.highPriority.length}):`);
446
- for (const m of summary.highPriority) {
447
- const unread = m.isUnread ? " [UNREAD]" : "";
448
- lines.push(` ⚡ ${m.from} — "${m.subject}"${unread}`);
449
- }
450
- }
451
- // Recent messages
452
- if (summary.recentMessages.length > 0) {
453
- lines.push(`\nRecent (${summary.recentMessages.length}):`);
454
- for (const m of summary.recentMessages) {
455
- const unread = m.isUnread ? " [UNREAD]" : "";
456
- const pri = m.priority === "high" ? "⚡" : m.priority === "low" ? "↓" : "·";
457
- const date = m.date
458
- ? new Date(m.date).toLocaleString("en-US", {
459
- month: "short",
460
- day: "numeric",
461
- hour: "numeric",
462
- minute: "2-digit",
463
- })
464
- : "";
465
- lines.push(` ${pri} ${date}: ${m.from} — "${m.subject}"${unread} [${m.senderCategory}]`);
466
- }
467
- }
468
- return lines.join("\n");
469
- }
470
- //# sourceMappingURL=gmail.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/google/gmail.ts"],"names":[],"mappings":"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"}
@@ -1,169 +0,0 @@
1
- /**
2
- * Google plugin wrapper.
3
- *
4
- * Wraps the existing Google OAuth, Calendar, Gmail, and Tasks integrations
5
- * behind the standard Plugin interface so the PluginRegistry can manage
6
- * the lifecycle uniformly.
7
- *
8
- * This is a WRAPPER — it delegates to existing code in google/auth.ts,
9
- * google/calendar-timer.ts, google/gmail-timer.ts, and google/tasks-timer.ts.
10
- */
11
- import { isGoogleConfigured, isGoogleAuthenticated, getAccessToken, getAuthUrl, exchangeCode, clearTokenCache, GOOGLE_SCOPES, } from "./auth.js";
12
- import { startCalendarTimer, stopCalendarTimer, isCalendarTimerRunning } from "./calendar-timer.js";
13
- import { startGmailTimer, stopGmailTimer, isGmailTimerRunning } from "./gmail-timer.js";
14
- import { startTasksTimer, stopTasksTimer, isTasksTimerRunning } from "./tasks-timer.js";
15
- // ── Manifest ────────────────────────────────────────────────────────────────
16
- const manifest = {
17
- name: "google",
18
- version: "1.0.0",
19
- description: "Google Workspace integration — Calendar, Gmail, Tasks, and Drive.",
20
- authType: "oauth2",
21
- requiredConfig: ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"],
22
- optionalConfig: ["GOOGLE_REFRESH_TOKEN"],
23
- scopes: GOOGLE_SCOPES,
24
- contextKeywords: /\b(calendar|schedule|meeting|event|email|gmail|inbox|task|tasks)\b/i,
25
- capabilities: ["read", "write", "poll", "context", "oauth"],
26
- };
27
- // ── Auth Provider ───────────────────────────────────────────────────────────
28
- class GoogleAuthProvider {
29
- isConfigured() {
30
- return isGoogleConfigured();
31
- }
32
- isAuthenticated() {
33
- return isGoogleAuthenticated();
34
- }
35
- getAuthUrl(redirectUri) {
36
- const result = getAuthUrl(redirectUri);
37
- return {
38
- ok: result.ok,
39
- data: result.url,
40
- message: result.message,
41
- };
42
- }
43
- async exchangeCode(code, redirectUri) {
44
- const result = await exchangeCode(code, redirectUri);
45
- const credentials = {};
46
- if (result.refreshToken)
47
- credentials.GOOGLE_REFRESH_TOKEN = result.refreshToken;
48
- if (result.accessToken)
49
- credentials.GOOGLE_ACCESS_TOKEN = result.accessToken;
50
- return {
51
- ok: result.ok,
52
- message: result.message,
53
- credentials: Object.keys(credentials).length > 0 ? credentials : undefined,
54
- };
55
- }
56
- async getAccessToken() {
57
- const result = await getAccessToken();
58
- return {
59
- ok: result.ok,
60
- data: result.token,
61
- message: result.message,
62
- };
63
- }
64
- clearCredentials() {
65
- clearTokenCache();
66
- }
67
- }
68
- // ── Client ──────────────────────────────────────────────────────────────────
69
- class GoogleClient {
70
- pluginName = "google";
71
- lastError = null;
72
- lastErrorAt = null;
73
- isAvailable() {
74
- return isGoogleAuthenticated();
75
- }
76
- getHealth() {
77
- return {
78
- available: this.isAvailable(),
79
- lastError: this.lastError,
80
- lastErrorAt: this.lastErrorAt,
81
- };
82
- }
83
- /** Record an error (called internally if needed). */
84
- recordError(message) {
85
- this.lastError = message;
86
- this.lastErrorAt = new Date().toISOString();
87
- }
88
- }
89
- // ── Timer Provider ──────────────────────────────────────────────────────────
90
- class GoogleTimerProvider {
91
- startTimer(intervalMs) {
92
- startCalendarTimer(intervalMs);
93
- startGmailTimer(intervalMs);
94
- startTasksTimer(intervalMs);
95
- }
96
- stopTimer() {
97
- stopCalendarTimer();
98
- stopGmailTimer();
99
- stopTasksTimer();
100
- }
101
- isTimerRunning() {
102
- return isCalendarTimerRunning() || isGmailTimerRunning() || isTasksTimerRunning();
103
- }
104
- }
105
- // ── Context Provider ────────────────────────────────────────────────────────
106
- class GoogleContextProvider {
107
- contextKeywords = /\b(calendar|schedule|meeting|event|email|gmail|inbox|task|tasks)\b/i;
108
- async getContext(_userMessage) {
109
- // The existing context injection in server.ts handles Google context.
110
- // This is a future migration path — for now, return null.
111
- return null;
112
- }
113
- }
114
- // ── Plugin Implementation ───────────────────────────────────────────────────
115
- class GooglePlugin {
116
- manifest = manifest;
117
- auth = new GoogleAuthProvider();
118
- client = new GoogleClient();
119
- context = new GoogleContextProvider();
120
- timer = new GoogleTimerProvider();
121
- async init(ctx) {
122
- // Validate that required config keys exist
123
- const missing = manifest.requiredConfig.filter((key) => !ctx.getVaultKey(key));
124
- if (missing.length > 0) {
125
- ctx.logActivity({
126
- source: "google",
127
- summary: `Plugin init: missing config keys: ${missing.join(", ")}`,
128
- });
129
- }
130
- }
131
- async authenticate(ctx) {
132
- if (!this.auth.isConfigured()) {
133
- return {
134
- ok: false,
135
- message: "Google OAuth not configured — missing GOOGLE_CLIENT_ID or GOOGLE_CLIENT_SECRET",
136
- };
137
- }
138
- if (this.auth.isAuthenticated()) {
139
- ctx.logActivity({
140
- source: "google",
141
- summary: "Plugin authenticated (refresh token present)",
142
- });
143
- return { ok: true, message: "Already authenticated" };
144
- }
145
- return {
146
- ok: false,
147
- message: "Not authenticated — no GOOGLE_REFRESH_TOKEN. Complete OAuth flow first.",
148
- };
149
- }
150
- async start(ctx) {
151
- this.timer.startTimer();
152
- ctx.logActivity({
153
- source: "google",
154
- summary: "Plugin started — Calendar, Gmail, and Tasks timers running",
155
- });
156
- }
157
- async stop() {
158
- this.timer.stopTimer();
159
- }
160
- }
161
- // ── Factory ─────────────────────────────────────────────────────────────────
162
- /**
163
- * Create a Google plugin instance.
164
- * Use with the PluginRegistry: `registry.register(createGooglePlugin(), ctx)`
165
- */
166
- export function createGooglePlugin() {
167
- return new GooglePlugin();
168
- }
169
- //# sourceMappingURL=plugin.js.map