@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.
- 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 +168 -20
- 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/gmail.js
DELETED
|
@@ -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
|
package/dist/google/gmail.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gmail.js","sourceRoot":"","sources":["../../src/google/gmail.ts"],"names":[],"mappings":"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"}
|
package/dist/google/plugin.js
DELETED
|
@@ -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
|