@runcore-sh/runcore 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +814 -472
  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,325 +0,0 @@
1
- /**
2
- * Google OAuth2 token management.
3
- * Raw fetch — no SDK. Credentials from vault (process.env).
4
- * Follows src/twilio/call.ts pattern: never throws, returns { ok, message }.
5
- *
6
- * Stores refresh token in vault as GOOGLE_REFRESH_TOKEN.
7
- * Access tokens are cached in memory and auto-refreshed (they expire hourly).
8
- */
9
- import { createLogger } from "../utils/logger.js";
10
- const log = createLogger("google.auth");
11
- const GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
12
- const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
13
- /** All scopes requested upfront to avoid re-consent. */
14
- export const GOOGLE_SCOPES = [
15
- "https://www.googleapis.com/auth/gmail.modify",
16
- "https://www.googleapis.com/auth/calendar.events",
17
- "https://www.googleapis.com/auth/drive.file",
18
- "https://www.googleapis.com/auth/tasks",
19
- ];
20
- const REQUIRED_VARS = [
21
- "GOOGLE_CLIENT_ID",
22
- "GOOGLE_CLIENT_SECRET",
23
- ];
24
- // --- In-memory access token cache ---
25
- let cachedAccessToken = null;
26
- let tokenExpiresAt = 0; // epoch ms
27
- /**
28
- * Check if Google OAuth is configured (client ID + secret in vault).
29
- */
30
- export function isGoogleConfigured() {
31
- return !!process.env.GOOGLE_CLIENT_ID && !!process.env.GOOGLE_CLIENT_SECRET;
32
- }
33
- /**
34
- * Check if Google OAuth is authenticated (refresh token exists).
35
- * When google integration is disabled via the integration gate,
36
- * GOOGLE_* env vars are never hydrated so this naturally returns false.
37
- */
38
- export function isGoogleAuthenticated() {
39
- return isGoogleConfigured() && !!process.env.GOOGLE_REFRESH_TOKEN;
40
- }
41
- /**
42
- * Build the Google authorization URL for the consent screen.
43
- * Redirects to localhost callback after user approves.
44
- */
45
- export function getAuthUrl(redirectUri) {
46
- const missing = REQUIRED_VARS.filter((v) => !process.env[v]);
47
- if (missing.length > 0) {
48
- log.warn("OAuth config incomplete — missing vault keys", { missing });
49
- return {
50
- ok: false,
51
- message: `Missing vault keys: ${missing.join(", ")}. Add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in vault settings.`,
52
- };
53
- }
54
- const params = new URLSearchParams({
55
- client_id: process.env.GOOGLE_CLIENT_ID,
56
- redirect_uri: redirectUri,
57
- response_type: "code",
58
- scope: GOOGLE_SCOPES.join(" "),
59
- access_type: "offline",
60
- prompt: "consent", // Force consent to always get refresh token
61
- });
62
- log.debug("Generated OAuth authorization URL", { redirectUri });
63
- return {
64
- ok: true,
65
- url: `${GOOGLE_AUTH_URL}?${params.toString()}`,
66
- message: "Authorization URL generated",
67
- };
68
- }
69
- /**
70
- * Exchange an authorization code for access + refresh tokens.
71
- * Returns the refresh token to be stored in vault.
72
- */
73
- export async function exchangeCode(code, redirectUri) {
74
- const missing = REQUIRED_VARS.filter((v) => !process.env[v]);
75
- if (missing.length > 0) {
76
- return { ok: false, message: `Missing vault keys: ${missing.join(", ")}` };
77
- }
78
- try {
79
- log.debug("Exchanging authorization code for tokens");
80
- const params = new URLSearchParams({
81
- code,
82
- client_id: process.env.GOOGLE_CLIENT_ID,
83
- client_secret: process.env.GOOGLE_CLIENT_SECRET,
84
- redirect_uri: redirectUri,
85
- grant_type: "authorization_code",
86
- });
87
- const res = await fetch(GOOGLE_TOKEN_URL, {
88
- method: "POST",
89
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
90
- body: params.toString(),
91
- signal: AbortSignal.timeout(15_000),
92
- });
93
- if (!res.ok) {
94
- const body = await res.text();
95
- log.error("Token exchange HTTP error", { status: res.status, body });
96
- return { ok: false, message: `Google token error (${res.status}): ${body}` };
97
- }
98
- const data = (await res.json());
99
- if (!data.refresh_token) {
100
- log.warn("No refresh token in exchange response — user may need to re-consent");
101
- return { ok: false, message: "No refresh token returned — try revoking app access in Google settings and re-authorizing" };
102
- }
103
- // Cache access token
104
- cachedAccessToken = data.access_token ?? null;
105
- tokenExpiresAt = Date.now() + ((data.expires_in ?? 3600) - 60) * 1000; // 60s buffer
106
- log.info("OAuth tokens exchanged successfully", { expiresIn: data.expires_in });
107
- return {
108
- ok: true,
109
- refreshToken: data.refresh_token,
110
- accessToken: data.access_token,
111
- message: "Tokens exchanged successfully",
112
- };
113
- }
114
- catch (err) {
115
- log.error("Token exchange failed", { error: err.message });
116
- return { ok: false, message: `Token exchange failed: ${err.message}` };
117
- }
118
- }
119
- /**
120
- * Get a valid access token, auto-refreshing if expired.
121
- * Never throws — returns { ok, token?, message }.
122
- */
123
- export async function getAccessToken() {
124
- // Return cached token if still valid
125
- if (cachedAccessToken && Date.now() < tokenExpiresAt) {
126
- log.debug("Using cached access token", { expiresIn: Math.round((tokenExpiresAt - Date.now()) / 1000) });
127
- return { ok: true, token: cachedAccessToken, message: "Cached token" };
128
- }
129
- const refreshToken = process.env.GOOGLE_REFRESH_TOKEN;
130
- if (!refreshToken) {
131
- log.warn("No GOOGLE_REFRESH_TOKEN in vault — not authenticated");
132
- return { ok: false, message: "Not authenticated — no GOOGLE_REFRESH_TOKEN in vault" };
133
- }
134
- const missing = REQUIRED_VARS.filter((v) => !process.env[v]);
135
- if (missing.length > 0) {
136
- return { ok: false, message: `Missing vault keys: ${missing.join(", ")}` };
137
- }
138
- try {
139
- log.debug("Refreshing access token");
140
- const params = new URLSearchParams({
141
- client_id: process.env.GOOGLE_CLIENT_ID,
142
- client_secret: process.env.GOOGLE_CLIENT_SECRET,
143
- refresh_token: refreshToken,
144
- grant_type: "refresh_token",
145
- });
146
- const res = await fetch(GOOGLE_TOKEN_URL, {
147
- method: "POST",
148
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
149
- body: params.toString(),
150
- signal: AbortSignal.timeout(15_000),
151
- });
152
- if (!res.ok) {
153
- const body = await res.text();
154
- // Clear cached token on auth failure
155
- cachedAccessToken = null;
156
- tokenExpiresAt = 0;
157
- log.error("Token refresh HTTP error — cache cleared", { status: res.status, body });
158
- return { ok: false, message: `Token refresh failed (${res.status}): ${body}` };
159
- }
160
- const data = (await res.json());
161
- if (!data.access_token) {
162
- log.error("No access token in refresh response");
163
- return { ok: false, message: "No access token in refresh response" };
164
- }
165
- cachedAccessToken = data.access_token;
166
- tokenExpiresAt = Date.now() + ((data.expires_in ?? 3600) - 60) * 1000;
167
- log.info("Access token refreshed successfully", { expiresIn: data.expires_in });
168
- return { ok: true, token: cachedAccessToken, message: "Token refreshed" };
169
- }
170
- catch (err) {
171
- log.error("Token refresh failed", { error: err.message });
172
- return { ok: false, message: `Token refresh failed: ${err.message}` };
173
- }
174
- }
175
- /**
176
- * Make an authenticated GET request to a Google API.
177
- * Auto-refreshes token. Returns parsed JSON or error.
178
- */
179
- export async function googleGet(url, params) {
180
- const auth = await getAccessToken();
181
- if (!auth.ok)
182
- return { ok: false, message: auth.message };
183
- try {
184
- let fullUrl = url;
185
- if (params) {
186
- const qs = new URLSearchParams();
187
- for (const [key, val] of Object.entries(params)) {
188
- if (Array.isArray(val)) {
189
- for (const v of val)
190
- qs.append(key, v);
191
- }
192
- else {
193
- qs.append(key, val);
194
- }
195
- }
196
- fullUrl = `${url}?${qs.toString()}`;
197
- }
198
- const res = await fetch(fullUrl, {
199
- headers: { Authorization: `Bearer ${auth.token}` },
200
- signal: AbortSignal.timeout(15_000),
201
- });
202
- if (res.status === 401) {
203
- // Token might have been revoked — clear cache and retry once
204
- log.warn("GET received 401 — clearing token cache and retrying", { url });
205
- cachedAccessToken = null;
206
- tokenExpiresAt = 0;
207
- const retry = await getAccessToken();
208
- if (!retry.ok)
209
- return { ok: false, message: `Auth failed: ${retry.message}` };
210
- const retryRes = await fetch(fullUrl, {
211
- headers: { Authorization: `Bearer ${retry.token}` },
212
- signal: AbortSignal.timeout(15_000),
213
- });
214
- if (!retryRes.ok) {
215
- const body = await retryRes.text();
216
- log.error("GET retry failed", { url, status: retryRes.status });
217
- return { ok: false, message: `Google API error (${retryRes.status}): ${body}` };
218
- }
219
- log.debug("GET succeeded on retry", { url });
220
- return { ok: true, data: (await retryRes.json()), message: "OK (retry)" };
221
- }
222
- if (!res.ok) {
223
- const body = await res.text();
224
- log.error("GET failed", { url, status: res.status });
225
- return { ok: false, message: `Google API error (${res.status}): ${body}` };
226
- }
227
- return { ok: true, data: (await res.json()), message: "OK" };
228
- }
229
- catch (err) {
230
- log.error("GET request exception", { url, error: err.message });
231
- return { ok: false, message: `Google API request failed: ${err.message}` };
232
- }
233
- }
234
- /**
235
- * Make an authenticated POST request to a Google API.
236
- * Auto-refreshes token. Returns parsed JSON or error.
237
- */
238
- export async function googlePost(url, body) {
239
- const auth = await getAccessToken();
240
- if (!auth.ok)
241
- return { ok: false, message: auth.message };
242
- try {
243
- const res = await fetch(url, {
244
- method: "POST",
245
- headers: {
246
- Authorization: `Bearer ${auth.token}`,
247
- "Content-Type": "application/json",
248
- },
249
- body: JSON.stringify(body),
250
- signal: AbortSignal.timeout(15_000),
251
- });
252
- if (!res.ok) {
253
- const text = await res.text();
254
- log.error("POST failed", { url, status: res.status });
255
- return { ok: false, message: `Google API error (${res.status}): ${text}` };
256
- }
257
- return { ok: true, data: (await res.json()), message: "OK" };
258
- }
259
- catch (err) {
260
- log.error("POST request exception", { url, error: err.message });
261
- return { ok: false, message: `Google API request failed: ${err.message}` };
262
- }
263
- }
264
- /**
265
- * Make an authenticated PATCH request to a Google API.
266
- */
267
- export async function googlePatch(url, body) {
268
- const auth = await getAccessToken();
269
- if (!auth.ok)
270
- return { ok: false, message: auth.message };
271
- try {
272
- const res = await fetch(url, {
273
- method: "PATCH",
274
- headers: {
275
- Authorization: `Bearer ${auth.token}`,
276
- "Content-Type": "application/json",
277
- },
278
- body: JSON.stringify(body),
279
- signal: AbortSignal.timeout(15_000),
280
- });
281
- if (!res.ok) {
282
- const text = await res.text();
283
- log.error("PATCH failed", { url, status: res.status });
284
- return { ok: false, message: `Google API error (${res.status}): ${text}` };
285
- }
286
- return { ok: true, data: (await res.json()), message: "OK" };
287
- }
288
- catch (err) {
289
- log.error("PATCH request exception", { url, error: err.message });
290
- return { ok: false, message: `Google API request failed: ${err.message}` };
291
- }
292
- }
293
- /**
294
- * Make an authenticated DELETE request to a Google API.
295
- */
296
- export async function googleDelete(url) {
297
- const auth = await getAccessToken();
298
- if (!auth.ok)
299
- return { ok: false, message: auth.message };
300
- try {
301
- const res = await fetch(url, {
302
- method: "DELETE",
303
- headers: { Authorization: `Bearer ${auth.token}` },
304
- signal: AbortSignal.timeout(15_000),
305
- });
306
- if (!res.ok) {
307
- const text = await res.text();
308
- log.error("DELETE failed", { url, status: res.status });
309
- return { ok: false, message: `Google API error (${res.status}): ${text}` };
310
- }
311
- return { ok: true, message: "Deleted" };
312
- }
313
- catch (err) {
314
- log.error("DELETE request exception", { url, error: err.message });
315
- return { ok: false, message: `Google API request failed: ${err.message}` };
316
- }
317
- }
318
- /**
319
- * Clear the cached access token (e.g., when vault keys change).
320
- */
321
- export function clearTokenCache() {
322
- cachedAccessToken = null;
323
- tokenExpiresAt = 0;
324
- }
325
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/google/auth.ts"],"names":[],"mappings":"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"}
@@ -1,91 +0,0 @@
1
- /**
2
- * Background calendar polling timer.
3
- * Checks for upcoming events every 5 minutes from the local CalendarStore.
4
- * When an event is < 30 min away, pushes a notification.
5
- * Also triggers Google sync on each tick (if available).
6
- * Follows src/goals/timer.ts pattern: module-level state, idempotent start/stop.
7
- */
8
- import { getCalendarStore } from "../calendar/store.js";
9
- import { getGoogleCalendarAdapter } from "../calendar/google-adapter.js";
10
- import { pushNotification } from "../goals/notifications.js";
11
- import { logActivity } from "../activity/log.js";
12
- import { createLogger } from "../utils/logger.js";
13
- const log = createLogger("calendar");
14
- const DEFAULT_INTERVAL_MS = 5 * 60 * 1000; // 5 minutes
15
- const SOON_THRESHOLD_MS = 30 * 60 * 1000; // 30 minutes
16
- let timer = null;
17
- const notifiedEventIds = new Set(); // Avoid duplicate notifications
18
- /**
19
- * Start the calendar polling timer. Idempotent.
20
- */
21
- export function startCalendarTimer(intervalMs) {
22
- if (timer)
23
- return;
24
- const interval = intervalMs ?? DEFAULT_INTERVAL_MS;
25
- timer = setInterval(async () => {
26
- const store = getCalendarStore();
27
- if (!store)
28
- return;
29
- try {
30
- // Sync from Google on each tick (if available)
31
- const adapter = getGoogleCalendarAdapter();
32
- if (adapter.isAvailable()) {
33
- adapter.sync().catch((err) => {
34
- log.warn("Background Google Calendar sync failed", { error: err instanceof Error ? err.message : String(err) });
35
- });
36
- }
37
- // Check upcoming events from local store
38
- const events = await store.getUpcomingEvents(1); // Next hour
39
- const now = Date.now();
40
- for (const event of events) {
41
- if (notifiedEventIds.has(event.id))
42
- continue;
43
- const eventStart = new Date(event.start).getTime();
44
- const minsAway = Math.round((eventStart - now) / 60_000);
45
- if (eventStart > now && eventStart - now <= SOON_THRESHOLD_MS) {
46
- notifiedEventIds.add(event.id);
47
- const attendeeStr = event.attendees.length > 0
48
- ? ` with ${event.attendees.map((a) => a.name ?? a.email).join(", ")}`
49
- : "";
50
- const msg = `Upcoming in ${minsAway} min: ${event.title}${attendeeStr}`;
51
- pushNotification({
52
- timestamp: new Date().toISOString(),
53
- source: "calendar",
54
- message: msg,
55
- });
56
- logActivity({ source: "calendar", summary: msg });
57
- }
58
- }
59
- // Clean up old event IDs (events that have passed)
60
- for (const id of notifiedEventIds) {
61
- const event = events.find((e) => e.id === id);
62
- if (!event || new Date(event.end).getTime() < now) {
63
- notifiedEventIds.delete(id);
64
- }
65
- }
66
- }
67
- catch (err) {
68
- const msg = err instanceof Error ? err.message : String(err);
69
- logActivity({ source: "calendar", summary: `Poll error: ${msg}` });
70
- }
71
- }, interval);
72
- const mins = Math.round(interval / 60_000);
73
- log.info(`Calendar poll: every ${mins} min`);
74
- }
75
- /**
76
- * Stop the calendar polling timer.
77
- */
78
- export function stopCalendarTimer() {
79
- if (timer) {
80
- clearInterval(timer);
81
- timer = null;
82
- }
83
- notifiedEventIds.clear();
84
- }
85
- /**
86
- * Check if the calendar timer is running.
87
- */
88
- export function isCalendarTimerRunning() {
89
- return timer !== null;
90
- }
91
- //# sourceMappingURL=calendar-timer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar-timer.js","sourceRoot":"","sources":["../../src/google/calendar-timer.ts"],"names":[],"mappings":"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"}