@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.
- package/dictionary.json +2 -2
- package/dist/activity/log.js +2 -2
- package/dist/activity/log.js.map +1 -1
- package/dist/agents/governed-spawn.d.ts.map +1 -1
- package/dist/cli.js +101 -11
- package/dist/cli.js.map +1 -1
- package/dist/extensions/cache.d.ts +57 -0
- package/dist/extensions/cache.d.ts.map +1 -0
- package/dist/extensions/cache.js +173 -0
- package/dist/extensions/cache.js.map +1 -0
- package/dist/extensions/client.d.ts +55 -0
- package/dist/extensions/client.d.ts.map +1 -0
- package/dist/extensions/client.js +120 -0
- package/dist/extensions/client.js.map +1 -0
- package/dist/extensions/index.d.ts +13 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +12 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/loader.d.ts +50 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +166 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/extensions/manifest.d.ts +38 -0
- package/dist/extensions/manifest.d.ts.map +1 -0
- package/dist/extensions/manifest.js +17 -0
- package/dist/extensions/manifest.js.map +1 -0
- package/dist/extensions/stubs.d.ts +27 -0
- package/dist/extensions/stubs.d.ts.map +1 -0
- package/dist/extensions/stubs.js +45 -0
- package/dist/extensions/stubs.js.map +1 -0
- package/dist/lib/audit.js +2 -2
- package/dist/lib/audit.js.map +1 -1
- package/dist/lib/brain-migrate.d.ts +21 -0
- package/dist/lib/brain-migrate.d.ts.map +1 -0
- package/dist/lib/brain-migrate.js +137 -0
- package/dist/lib/brain-migrate.js.map +1 -0
- package/dist/lib/paths.d.ts +27 -0
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +65 -0
- package/dist/lib/paths.js.map +1 -1
- package/dist/llm/call-log.d.ts +40 -0
- package/dist/llm/call-log.d.ts.map +1 -0
- package/dist/llm/call-log.js +35 -0
- package/dist/llm/call-log.js.map +1 -0
- package/dist/llm/complete.d.ts +6 -0
- package/dist/llm/complete.d.ts.map +1 -1
- package/dist/llm/complete.js +27 -0
- package/dist/llm/complete.js.map +1 -1
- package/dist/mcp-server.js +118 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/memory/file-backed.d.ts +4 -0
- package/dist/memory/file-backed.d.ts.map +1 -1
- package/dist/memory/file-backed.js +4 -0
- package/dist/memory/file-backed.js.map +1 -1
- package/dist/memory/vector-index.d.ts +4 -12
- package/dist/memory/vector-index.d.ts.map +1 -1
- package/dist/memory/vector-index.js +11 -93
- package/dist/memory/vector-index.js.map +1 -1
- package/dist/search/brain-docs.d.ts +17 -7
- package/dist/search/brain-docs.d.ts.map +1 -1
- package/dist/search/brain-docs.js +170 -52
- package/dist/search/brain-docs.js.map +1 -1
- package/dist/search/brain-rag.d.ts +45 -0
- package/dist/search/brain-rag.d.ts.map +1 -0
- package/dist/search/brain-rag.js +275 -0
- package/dist/search/brain-rag.js.map +1 -0
- package/dist/search/chunker.d.ts +24 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +95 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/embedder.d.ts +16 -0
- package/dist/search/embedder.d.ts.map +1 -0
- package/dist/search/embedder.js +108 -0
- package/dist/search/embedder.js.map +1 -0
- package/dist/search/file-watcher.d.ts +11 -0
- package/dist/search/file-watcher.d.ts.map +1 -0
- package/dist/search/file-watcher.js +86 -0
- package/dist/search/file-watcher.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +814 -472
- package/dist/server.js.map +1 -1
- package/dist/sessions/store.d.ts +9 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js.map +1 -1
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +78 -2
- package/dist/settings.js.map +1 -1
- package/dist/tracing/init.d.ts +1 -1
- package/dist/tracing/init.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils/logger.js.map +1 -1
- package/module-tiers.json +164 -0
- package/package.json +9 -13
- package/public/avatar/cache/1184385ec5522b57.mp4 +0 -0
- package/public/avatar/cache/1f15f6a1ebd7e439.mp4 +0 -0
- package/public/avatar/cache/2c7e47ff0bdeb8d1.mp4 +0 -0
- package/public/avatar/cache/5f308566f7abb8f2.mp4 +0 -0
- package/public/avatar/cache/62f9cfba848d724e.mp4 +0 -0
- package/public/avatar/cache/6d64e657e6bf2aab.mp4 +0 -0
- package/public/avatar/cache/763ad0349e0b6f26.mp4 +0 -0
- package/public/avatar/cache/81a516cfd461b2b9.mp4 +0 -0
- package/public/avatar/cache/9366de15fd6910ca.mp4 +0 -0
- package/public/avatar/cache/ade41a846b283895.mp4 +0 -0
- package/public/avatar/cache/b6066e5c65383eec.mp4 +0 -0
- package/public/avatar/cache/edadb75d37891fc7.mp4 +0 -0
- package/public/avatar/cache/f0ae159640621dd9.mp4 +0 -0
- package/public/avatar/cache/fc2e5419adf29d96.mp4 +0 -0
- package/public/index.html +379 -59
- package/dist/agents/autonomous.js +0 -749
- package/dist/agents/autonomous.js.map +0 -1
- package/dist/agents/commit.js +0 -113
- package/dist/agents/commit.js.map +0 -1
- package/dist/agents/continue.js +0 -158
- package/dist/agents/continue.js.map +0 -1
- package/dist/agents/cooldown.js +0 -397
- package/dist/agents/cooldown.js.map +0 -1
- package/dist/agents/dedup-guard.js +0 -131
- package/dist/agents/dedup-guard.js.map +0 -1
- package/dist/agents/feed.js +0 -176
- package/dist/agents/feed.js.map +0 -1
- package/dist/agents/governance.js +0 -292
- package/dist/agents/governance.js.map +0 -1
- package/dist/agents/governed-spawn.js +0 -192
- package/dist/agents/governed-spawn.js.map +0 -1
- package/dist/agents/heartbeat.js +0 -324
- package/dist/agents/heartbeat.js.map +0 -1
- package/dist/agents/instance-manager.js +0 -850
- package/dist/agents/instance-manager.js.map +0 -1
- package/dist/agents/issue-reporter.js +0 -123
- package/dist/agents/issue-reporter.js.map +0 -1
- package/dist/agents/issues.js +0 -141
- package/dist/agents/issues.js.map +0 -1
- package/dist/agents/locks.js +0 -234
- package/dist/agents/locks.js.map +0 -1
- package/dist/agents/memory.js +0 -93
- package/dist/agents/memory.js.map +0 -1
- package/dist/agents/monitor.js +0 -235
- package/dist/agents/monitor.js.map +0 -1
- package/dist/agents/orchestration.js +0 -715
- package/dist/agents/orchestration.js.map +0 -1
- package/dist/agents/recover.js +0 -166
- package/dist/agents/recover.js.map +0 -1
- package/dist/agents/reflection.js +0 -199
- package/dist/agents/reflection.js.map +0 -1
- package/dist/agents/runtime/bus.js +0 -174
- package/dist/agents/runtime/bus.js.map +0 -1
- package/dist/agents/runtime/config.js +0 -101
- package/dist/agents/runtime/config.js.map +0 -1
- package/dist/agents/runtime/driver.js +0 -214
- package/dist/agents/runtime/driver.js.map +0 -1
- package/dist/agents/runtime/errors.js +0 -40
- package/dist/agents/runtime/errors.js.map +0 -1
- package/dist/agents/runtime/index.js +0 -54
- package/dist/agents/runtime/index.js.map +0 -1
- package/dist/agents/runtime/lifecycle.js +0 -116
- package/dist/agents/runtime/lifecycle.js.map +0 -1
- package/dist/agents/runtime/manager.js +0 -948
- package/dist/agents/runtime/manager.js.map +0 -1
- package/dist/agents/runtime/registry.js +0 -195
- package/dist/agents/runtime/registry.js.map +0 -1
- package/dist/agents/runtime/resources.js +0 -146
- package/dist/agents/runtime/resources.js.map +0 -1
- package/dist/agents/runtime/types.js +0 -24
- package/dist/agents/runtime/types.js.map +0 -1
- package/dist/agents/spawn-policy.js +0 -202
- package/dist/agents/spawn-policy.js.map +0 -1
- package/dist/agents/spawn.js +0 -970
- package/dist/agents/spawn.js.map +0 -1
- package/dist/agents/triage.js +0 -81
- package/dist/agents/triage.js.map +0 -1
- package/dist/agents/workflow.js +0 -543
- package/dist/agents/workflow.js.map +0 -1
- package/dist/avatar/client.js +0 -172
- package/dist/avatar/client.js.map +0 -1
- package/dist/avatar/sidecar.js +0 -125
- package/dist/avatar/sidecar.js.map +0 -1
- package/dist/browser/sessions.js +0 -122
- package/dist/browser/sessions.js.map +0 -1
- package/dist/capabilities/definitions/browser.js +0 -242
- package/dist/capabilities/definitions/browser.js.map +0 -1
- package/dist/channels/whatsapp.js +0 -200
- package/dist/channels/whatsapp.js.map +0 -1
- package/dist/credentials/store.js +0 -189
- package/dist/credentials/store.js.map +0 -1
- package/dist/files/deep-index.js +0 -337
- package/dist/files/deep-index.js.map +0 -1
- package/dist/files/extract.js +0 -33
- package/dist/files/extract.js.map +0 -1
- package/dist/files/gdrive.js +0 -246
- package/dist/files/gdrive.js.map +0 -1
- package/dist/github/client.js +0 -408
- package/dist/github/client.js.map +0 -1
- package/dist/github/commit-analysis.js +0 -276
- package/dist/github/commit-analysis.js.map +0 -1
- package/dist/github/contributor-stats.js +0 -119
- package/dist/github/contributor-stats.js.map +0 -1
- package/dist/github/issue-sla.js +0 -220
- package/dist/github/issue-sla.js.map +0 -1
- package/dist/github/issue-triage.js +0 -286
- package/dist/github/issue-triage.js.map +0 -1
- package/dist/github/pr-readiness.js +0 -197
- package/dist/github/pr-readiness.js.map +0 -1
- package/dist/github/pr-review.js +0 -410
- package/dist/github/pr-review.js.map +0 -1
- package/dist/github/release-notes.js +0 -227
- package/dist/github/release-notes.js.map +0 -1
- package/dist/github/repo-health.js +0 -303
- package/dist/github/repo-health.js.map +0 -1
- package/dist/github/retry.js +0 -117
- package/dist/github/retry.js.map +0 -1
- package/dist/github/types.js +0 -8
- package/dist/github/types.js.map +0 -1
- package/dist/github/webhooks.js +0 -153
- package/dist/github/webhooks.js.map +0 -1
- package/dist/google/auth.js +0 -325
- package/dist/google/auth.js.map +0 -1
- package/dist/google/calendar-timer.js +0 -91
- package/dist/google/calendar-timer.js.map +0 -1
- package/dist/google/calendar.js +0 -270
- package/dist/google/calendar.js.map +0 -1
- package/dist/google/docs.js +0 -309
- package/dist/google/docs.js.map +0 -1
- package/dist/google/gmail-send.js +0 -219
- package/dist/google/gmail-send.js.map +0 -1
- package/dist/google/gmail-timer.js +0 -223
- package/dist/google/gmail-timer.js.map +0 -1
- package/dist/google/gmail.js +0 -470
- package/dist/google/gmail.js.map +0 -1
- package/dist/google/plugin.js +0 -169
- package/dist/google/plugin.js.map +0 -1
- package/dist/google/tasks-timer.js +0 -107
- package/dist/google/tasks-timer.js.map +0 -1
- package/dist/google/tasks.js +0 -331
- package/dist/google/tasks.js.map +0 -1
- package/dist/google/temporal.js +0 -176
- package/dist/google/temporal.js.map +0 -1
- package/dist/integrations/gate.js +0 -100
- package/dist/integrations/gate.js.map +0 -1
- package/dist/integrations/github.js +0 -331
- package/dist/integrations/github.js.map +0 -1
- package/dist/integrations/google-tasks.js +0 -432
- package/dist/integrations/google-tasks.js.map +0 -1
- package/dist/mdns.js +0 -110
- package/dist/mdns.js.map +0 -1
- package/dist/notifications/channel.js +0 -83
- package/dist/notifications/channel.js.map +0 -1
- package/dist/notifications/channels/adapter.js +0 -55
- package/dist/notifications/channels/adapter.js.map +0 -1
- package/dist/notifications/channels/index.js +0 -6
- package/dist/notifications/channels/index.js.map +0 -1
- package/dist/notifications/channels/log.js +0 -29
- package/dist/notifications/channels/log.js.map +0 -1
- package/dist/notifications/email.js +0 -72
- package/dist/notifications/email.js.map +0 -1
- package/dist/notifications/engine.js +0 -198
- package/dist/notifications/engine.js.map +0 -1
- package/dist/notifications/index.js +0 -24
- package/dist/notifications/index.js.map +0 -1
- package/dist/notifications/phone.js +0 -48
- package/dist/notifications/phone.js.map +0 -1
- package/dist/notifications/sms.js +0 -65
- package/dist/notifications/sms.js.map +0 -1
- package/dist/notifications/types.js +0 -14
- package/dist/notifications/types.js.map +0 -1
- package/dist/notifications/webhook.js +0 -65
- package/dist/notifications/webhook.js.map +0 -1
- package/dist/resend/inbox.js +0 -199
- package/dist/resend/inbox.js.map +0 -1
- package/dist/resend/webhooks.js +0 -244
- package/dist/resend/webhooks.js.map +0 -1
- package/dist/search/browse.js +0 -225
- package/dist/search/browse.js.map +0 -1
- package/dist/search/perplexity.js +0 -41
- package/dist/search/perplexity.js.map +0 -1
- package/dist/slack/channels.js +0 -277
- package/dist/slack/channels.js.map +0 -1
- package/dist/slack/client.js +0 -468
- package/dist/slack/client.js.map +0 -1
- package/dist/slack/retry.js +0 -100
- package/dist/slack/retry.js.map +0 -1
- package/dist/slack/types.js +0 -52
- package/dist/slack/types.js.map +0 -1
- package/dist/slack/webhooks.js +0 -285
- package/dist/slack/webhooks.js.map +0 -1
- package/dist/stt/client.js +0 -66
- package/dist/stt/client.js.map +0 -1
- package/dist/stt/sidecar.js +0 -115
- package/dist/stt/sidecar.js.map +0 -1
- package/dist/tracing/bridge.js +0 -70
- package/dist/tracing/bridge.js.map +0 -1
- package/dist/tracing/correlation.js +0 -49
- package/dist/tracing/correlation.js.map +0 -1
- package/dist/tracing/index.js +0 -18
- package/dist/tracing/index.js.map +0 -1
- package/dist/tracing/init.js +0 -81
- package/dist/tracing/init.js.map +0 -1
- package/dist/tracing/instrument.js +0 -145
- package/dist/tracing/instrument.js.map +0 -1
- package/dist/tracing/middleware.js +0 -69
- package/dist/tracing/middleware.js.map +0 -1
- package/dist/tracing/tracer.js +0 -327
- package/dist/tracing/tracer.js.map +0 -1
- package/dist/tts/client.js +0 -48
- package/dist/tts/client.js.map +0 -1
- package/dist/tts/sidecar.js +0 -148
- package/dist/tts/sidecar.js.map +0 -1
- package/dist/twilio/call.js +0 -79
- package/dist/twilio/call.js.map +0 -1
- package/dist/vault/matcher.js +0 -197
- package/dist/vault/matcher.js.map +0 -1
- package/dist/vault/personal.js +0 -163
- package/dist/vault/personal.js.map +0 -1
- package/dist/vault/policy.js +0 -159
- package/dist/vault/policy.js.map +0 -1
- package/dist/vault/store.js +0 -122
- package/dist/vault/store.js.map +0 -1
- package/dist/vault/transfer.js +0 -188
- package/dist/vault/transfer.js.map +0 -1
- package/dist/volumes/index.js +0 -2
- package/dist/volumes/index.js.map +0 -1
- package/dist/volumes/manager.js +0 -462
- package/dist/volumes/manager.js.map +0 -1
- package/dist/volumes/types.js +0 -8
- package/dist/volumes/types.js.map +0 -1
- package/dist/webhooks/config.js +0 -214
- package/dist/webhooks/config.js.map +0 -1
- package/dist/webhooks/event-log.js +0 -132
- package/dist/webhooks/event-log.js.map +0 -1
- package/dist/webhooks/handler.js +0 -103
- package/dist/webhooks/handler.js.map +0 -1
- package/dist/webhooks/handlers.js +0 -231
- package/dist/webhooks/handlers.js.map +0 -1
- package/dist/webhooks/index.js +0 -33
- package/dist/webhooks/index.js.map +0 -1
- package/dist/webhooks/mount.js +0 -400
- package/dist/webhooks/mount.js.map +0 -1
- package/dist/webhooks/registry.js +0 -143
- package/dist/webhooks/registry.js.map +0 -1
- package/dist/webhooks/relay.js +0 -53
- package/dist/webhooks/relay.js.map +0 -1
- package/dist/webhooks/retry.js +0 -270
- package/dist/webhooks/retry.js.map +0 -1
- package/dist/webhooks/router.js +0 -290
- package/dist/webhooks/router.js.map +0 -1
- package/dist/webhooks/twilio.js +0 -129
- package/dist/webhooks/twilio.js.map +0 -1
- package/dist/webhooks/types.js +0 -8
- package/dist/webhooks/types.js.map +0 -1
- package/dist/webhooks/verify.js +0 -154
- package/dist/webhooks/verify.js.map +0 -1
package/dist/google/auth.js
DELETED
|
@@ -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
|
package/dist/google/auth.js.map
DELETED
|
@@ -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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"}
|