@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
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration gate — central kill switch for token flow.
|
|
3
|
-
*
|
|
4
|
-
* Controls which secrets get hydrated into process.env at startup.
|
|
5
|
-
* Master switch (`integrations.enabled`) kills ALL external token flow.
|
|
6
|
-
* Per-service toggles (`integrations.services.<name>`) disable individual integrations.
|
|
7
|
-
*
|
|
8
|
-
* Keys with no matching prefix (e.g. CORE_PORT, SAFE_WORD) always pass through.
|
|
9
|
-
*/
|
|
10
|
-
import { getSettings } from "../settings.js";
|
|
11
|
-
import { createLogger } from "../utils/logger.js";
|
|
12
|
-
const log = createLogger("integrations.gate");
|
|
13
|
-
/** Maps env var prefixes to integration service names. */
|
|
14
|
-
const ENV_PREFIX_MAP = {
|
|
15
|
-
GOOGLE_: "google",
|
|
16
|
-
GMAIL_: "google",
|
|
17
|
-
GITHUB_: "github",
|
|
18
|
-
SLACK_: "slack",
|
|
19
|
-
TWILIO_: "twilio",
|
|
20
|
-
RESEND_: "resend",
|
|
21
|
-
RELAY_: "resend",
|
|
22
|
-
OPENAI_: "openai",
|
|
23
|
-
ANTHROPIC_: "anthropic",
|
|
24
|
-
OPENROUTER_: "openrouter",
|
|
25
|
-
PERPLEXITY_: "perplexity",
|
|
26
|
-
BRIEFING_: "twilio",
|
|
27
|
-
};
|
|
28
|
-
// Sorted longest-first so OPENROUTER_ matches before OPEN* would (if added)
|
|
29
|
-
const SORTED_PREFIXES = Object.keys(ENV_PREFIX_MAP).sort((a, b) => b.length - a.length);
|
|
30
|
-
/**
|
|
31
|
-
* Resolve which service an env var belongs to, or null if it's not an integration key.
|
|
32
|
-
*/
|
|
33
|
-
export function resolveService(envVarName) {
|
|
34
|
-
for (const prefix of SORTED_PREFIXES) {
|
|
35
|
-
if (envVarName.startsWith(prefix)) {
|
|
36
|
-
return ENV_PREFIX_MAP[prefix];
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Check if a specific integration service is enabled.
|
|
43
|
-
* Returns false if the master switch is off or the service is explicitly disabled.
|
|
44
|
-
*/
|
|
45
|
-
export function isIntegrationEnabled(service) {
|
|
46
|
-
const settings = getSettings();
|
|
47
|
-
// privateMode → all integrations disabled (network isolation)
|
|
48
|
-
if (settings.privateMode)
|
|
49
|
-
return false;
|
|
50
|
-
const integrations = settings.integrations;
|
|
51
|
-
// No integrations block at all → everything enabled (backwards compat)
|
|
52
|
-
if (!integrations)
|
|
53
|
-
return true;
|
|
54
|
-
// Master kill switch
|
|
55
|
-
if (integrations.enabled === false)
|
|
56
|
-
return false;
|
|
57
|
-
// Per-service toggle (default: enabled if not listed)
|
|
58
|
-
const services = integrations.services;
|
|
59
|
-
if (!services)
|
|
60
|
-
return true;
|
|
61
|
-
return services[service] !== false;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Should this env var be hydrated into process.env?
|
|
65
|
-
* Non-integration keys (no matching prefix) always pass through.
|
|
66
|
-
* Integration keys are checked against the gate.
|
|
67
|
-
*/
|
|
68
|
-
export function shouldHydrateKey(envVarName) {
|
|
69
|
-
const service = resolveService(envVarName);
|
|
70
|
-
// Not an integration key → always hydrate
|
|
71
|
-
if (!service)
|
|
72
|
-
return true;
|
|
73
|
-
return isIntegrationEnabled(service);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Returns list of all known service names and their enabled status.
|
|
77
|
-
*/
|
|
78
|
-
export function getIntegrationStatus() {
|
|
79
|
-
const allServices = [...new Set(Object.values(ENV_PREFIX_MAP))].sort();
|
|
80
|
-
return allServices.map((service) => ({
|
|
81
|
-
service,
|
|
82
|
-
enabled: isIntegrationEnabled(service),
|
|
83
|
-
}));
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Returns only enabled service names.
|
|
87
|
-
*/
|
|
88
|
-
export function getEnabledServices() {
|
|
89
|
-
return getIntegrationStatus()
|
|
90
|
-
.filter((s) => s.enabled)
|
|
91
|
-
.map((s) => s.service);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Check if the master integration switch is off (air-gap mode).
|
|
95
|
-
*/
|
|
96
|
-
export function isAirGapped() {
|
|
97
|
-
const settings = getSettings();
|
|
98
|
-
return settings.integrations?.enabled === false;
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/integrations/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub integration facade — single entry point for all GitHub functionality.
|
|
3
|
-
*
|
|
4
|
-
* Consolidates: API client, webhook handling, PR review, issue triage,
|
|
5
|
-
* commit analysis, and repo health monitoring into one module.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* import { initGitHub, getGitHubStatus } from "./integrations/github.js";
|
|
9
|
-
* // At startup:
|
|
10
|
-
* initGitHub();
|
|
11
|
-
* // In routes:
|
|
12
|
-
* const status = await getGitHubStatus();
|
|
13
|
-
*/
|
|
14
|
-
import { createLogger } from "../utils/logger.js";
|
|
15
|
-
import { logActivity } from "../activity/log.js";
|
|
16
|
-
import * as ghClient from "../github/client.js";
|
|
17
|
-
import { processWebhook, verifyWebhookSignature, onGitHubEvent, } from "../github/webhooks.js";
|
|
18
|
-
import { reviewPR, reviewAndComment } from "../github/pr-review.js";
|
|
19
|
-
import { triageIssue, triageAndLabel, triageOpenIssues, setTriageConfig, getTriageConfig, findDuplicates, titleSimilarity } from "../github/issue-triage.js";
|
|
20
|
-
import { analyzeCommit, analyzeRecentCommits, analyzeCommitData, getQualityTrend } from "../github/commit-analysis.js";
|
|
21
|
-
import { getRepoHealth, formatHealthReport } from "../github/repo-health.js";
|
|
22
|
-
import { checkPRReadiness, formatReadinessReport } from "../github/pr-readiness.js";
|
|
23
|
-
import { generateReleaseNotes, generateReleaseNotesFromLatestTag, generateReleaseNotesFromCommits } from "../github/release-notes.js";
|
|
24
|
-
import { getContributorStats, formatContributorStats } from "../github/contributor-stats.js";
|
|
25
|
-
import { getSLAReport, formatSLAReport, setSLAConfig, getSLAConfig } from "../github/issue-sla.js";
|
|
26
|
-
import { triageFromIssue } from "../github/issue-triage.js";
|
|
27
|
-
const log = createLogger("github");
|
|
28
|
-
// ── State ────────────────────────────────────────────────────────────────────
|
|
29
|
-
let initialized = false;
|
|
30
|
-
let features = {};
|
|
31
|
-
let defaultRepo = null;
|
|
32
|
-
// ── Lifecycle ────────────────────────────────────────────────────────────────
|
|
33
|
-
/**
|
|
34
|
-
* Initialize the GitHub integration.
|
|
35
|
-
* Registers webhook provider configuration and sets up event handlers.
|
|
36
|
-
*/
|
|
37
|
-
export function initGitHub(config) {
|
|
38
|
-
if (initialized)
|
|
39
|
-
return;
|
|
40
|
-
initialized = true;
|
|
41
|
-
features = config?.features ?? {};
|
|
42
|
-
// Parse default repo
|
|
43
|
-
if (config?.defaultRepo) {
|
|
44
|
-
const [owner, repo] = config.defaultRepo.split("/");
|
|
45
|
-
if (owner && repo) {
|
|
46
|
-
defaultRepo = { owner, repo };
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// Set API base URL if provided
|
|
50
|
-
if (config?.apiBaseUrl) {
|
|
51
|
-
ghClient.setApiBase(config.apiBaseUrl);
|
|
52
|
-
}
|
|
53
|
-
// Note: webhook provider config is registered in server.ts via setProviderConfigs().
|
|
54
|
-
// Only set it here if initGitHub() is called standalone (e.g., tests).
|
|
55
|
-
// server.ts already handles: registerProviders([githubProvider, ...]) + setProviderConfigs([...])
|
|
56
|
-
// Wire up auto-triage on new issues (if enabled)
|
|
57
|
-
if (features.issueTriage !== false) {
|
|
58
|
-
onGitHubEvent("issues", async (payload) => {
|
|
59
|
-
const p = payload;
|
|
60
|
-
if (p.action !== "opened")
|
|
61
|
-
return { handled: true, message: "Skipped non-open action" };
|
|
62
|
-
const triage = triageFromIssue(p.repository.owner.login, p.repository.name, p.issue);
|
|
63
|
-
log.info(`Auto-triaged ${p.repository.full_name}#${p.issue.number}: ${triage.category} (${triage.priority})`);
|
|
64
|
-
return { handled: true, message: `Triaged as ${triage.category}` };
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
// Wire up auto-review on PR opened/synchronized (if enabled)
|
|
68
|
-
if (features.prReview !== false) {
|
|
69
|
-
onGitHubEvent("pull_request", async (payload) => {
|
|
70
|
-
const p = payload;
|
|
71
|
-
if (p.action !== "opened" && p.action !== "synchronize") {
|
|
72
|
-
return { handled: true, message: `Skipped PR action: ${p.action}` };
|
|
73
|
-
}
|
|
74
|
-
// Skip drafts
|
|
75
|
-
if (p.pull_request.draft) {
|
|
76
|
-
return { handled: true, message: "Skipped draft PR" };
|
|
77
|
-
}
|
|
78
|
-
const result = await reviewPR(p.repository.owner.login, p.repository.name, p.pull_request.number);
|
|
79
|
-
if (result) {
|
|
80
|
-
log.info(`Auto-reviewed PR ${p.repository.full_name}#${p.pull_request.number}: ${result.recommendation}`);
|
|
81
|
-
}
|
|
82
|
-
return { handled: true, message: `Auto-reviewed PR #${p.pull_request.number}` };
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
// Wire up commit analysis on push (if enabled)
|
|
86
|
-
if (features.commitAnalysis !== false) {
|
|
87
|
-
onGitHubEvent("push", async (payload) => {
|
|
88
|
-
const p = payload;
|
|
89
|
-
for (const c of p.commits) {
|
|
90
|
-
analyzeCommitData(p.repository.owner.login, p.repository.name, c.id, c.message, 0, 0);
|
|
91
|
-
}
|
|
92
|
-
return { handled: true, message: `Analyzed ${p.commits.length} commits` };
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
logActivity({ source: "board", summary: "GitHub integration initialized" });
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Shut down the GitHub integration.
|
|
99
|
-
*/
|
|
100
|
-
export function shutdownGitHub() {
|
|
101
|
-
initialized = false;
|
|
102
|
-
features = {};
|
|
103
|
-
defaultRepo = null;
|
|
104
|
-
// Clear auth caches
|
|
105
|
-
cachedUser = null;
|
|
106
|
-
userCachedAt = 0;
|
|
107
|
-
authFailedAt = 0;
|
|
108
|
-
authFailureError = null;
|
|
109
|
-
pendingAuthCheck = null;
|
|
110
|
-
logActivity({ source: "board", summary: "GitHub integration shut down" });
|
|
111
|
-
}
|
|
112
|
-
let cachedUser = null;
|
|
113
|
-
let userCachedAt = 0;
|
|
114
|
-
const USER_CACHE_TTL_MS = 30 * 60 * 1000;
|
|
115
|
-
// Circuit breaker: cache auth failures to avoid re-trying with a bad token.
|
|
116
|
-
// After a failure, wait AUTH_FAILURE_COOLDOWN_MS before retrying.
|
|
117
|
-
let authFailedAt = 0;
|
|
118
|
-
let authFailureError = null;
|
|
119
|
-
const AUTH_FAILURE_COOLDOWN_MS = 60 * 1000; // 1 minute cooldown after auth failure
|
|
120
|
-
// Dedup: prevent multiple simultaneous auth validations.
|
|
121
|
-
let pendingAuthCheck = null;
|
|
122
|
-
export async function getGitHubStatus() {
|
|
123
|
-
const repoStr = defaultRepo ? `${defaultRepo.owner}/${defaultRepo.repo}` : null;
|
|
124
|
-
const available = ghClient.isAvailable();
|
|
125
|
-
if (!available) {
|
|
126
|
-
return {
|
|
127
|
-
available: false,
|
|
128
|
-
authenticated: false,
|
|
129
|
-
user: null,
|
|
130
|
-
features,
|
|
131
|
-
defaultRepo: repoStr,
|
|
132
|
-
error: "GITHUB_TOKEN not set",
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
const now = Date.now();
|
|
136
|
-
// Return cached user if still fresh
|
|
137
|
-
if (cachedUser && now - userCachedAt < USER_CACHE_TTL_MS) {
|
|
138
|
-
return {
|
|
139
|
-
available: true,
|
|
140
|
-
authenticated: true,
|
|
141
|
-
user: { login: cachedUser.login, name: cachedUser.name },
|
|
142
|
-
features,
|
|
143
|
-
defaultRepo: repoStr,
|
|
144
|
-
error: null,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
// Circuit breaker: if auth failed recently, return cached failure without retrying
|
|
148
|
-
if (authFailedAt && now - authFailedAt < AUTH_FAILURE_COOLDOWN_MS) {
|
|
149
|
-
return {
|
|
150
|
-
available: true,
|
|
151
|
-
authenticated: false,
|
|
152
|
-
user: null,
|
|
153
|
-
features,
|
|
154
|
-
defaultRepo: repoStr,
|
|
155
|
-
error: authFailureError ?? "Authentication failed (cooldown)",
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
// Dedup concurrent auth checks — if one is already in flight, join it
|
|
159
|
-
if (!pendingAuthCheck) {
|
|
160
|
-
pendingAuthCheck = ghClient.getAuthenticatedUser().finally(() => {
|
|
161
|
-
pendingAuthCheck = null;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
const user = await pendingAuthCheck;
|
|
165
|
-
if (user) {
|
|
166
|
-
cachedUser = user;
|
|
167
|
-
userCachedAt = now;
|
|
168
|
-
authFailedAt = 0;
|
|
169
|
-
authFailureError = null;
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
authFailedAt = now;
|
|
173
|
-
authFailureError = "Authentication failed — check GITHUB_TOKEN";
|
|
174
|
-
log.warn(`GitHub auth validation failed, cooldown for ${AUTH_FAILURE_COOLDOWN_MS / 1000}s`);
|
|
175
|
-
}
|
|
176
|
-
return {
|
|
177
|
-
available: true,
|
|
178
|
-
authenticated: !!user,
|
|
179
|
-
user: user ? { login: user.login, name: user.name } : null,
|
|
180
|
-
features,
|
|
181
|
-
defaultRepo: repoStr,
|
|
182
|
-
error: user ? null : authFailureError,
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
export function isGitHubAvailable() {
|
|
186
|
-
return ghClient.isAvailable();
|
|
187
|
-
}
|
|
188
|
-
// ── Helper: resolve owner/repo ───────────────────────────────────────────────
|
|
189
|
-
function resolveRepo(repoStr) {
|
|
190
|
-
if (repoStr) {
|
|
191
|
-
const [owner, repo] = repoStr.split("/");
|
|
192
|
-
if (owner && repo)
|
|
193
|
-
return { owner, repo };
|
|
194
|
-
}
|
|
195
|
-
return defaultRepo;
|
|
196
|
-
}
|
|
197
|
-
// ── PR Review ────────────────────────────────────────────────────────────────
|
|
198
|
-
export async function reviewPullRequest(prNumber, repoStr) {
|
|
199
|
-
if (features.prReview === false)
|
|
200
|
-
return null;
|
|
201
|
-
const r = resolveRepo(repoStr);
|
|
202
|
-
if (!r) {
|
|
203
|
-
log.warn("No repo specified and no default repo configured");
|
|
204
|
-
return null;
|
|
205
|
-
}
|
|
206
|
-
return reviewPR(r.owner, r.repo, prNumber);
|
|
207
|
-
}
|
|
208
|
-
export async function reviewAndCommentPR(prNumber, repoStr) {
|
|
209
|
-
if (features.prReview === false)
|
|
210
|
-
return null;
|
|
211
|
-
const r = resolveRepo(repoStr);
|
|
212
|
-
if (!r)
|
|
213
|
-
return null;
|
|
214
|
-
return reviewAndComment(r.owner, r.repo, prNumber);
|
|
215
|
-
}
|
|
216
|
-
// ── Issue Triage ─────────────────────────────────────────────────────────────
|
|
217
|
-
export async function triageGitHubIssue(issueNumber, repoStr) {
|
|
218
|
-
if (features.issueTriage === false)
|
|
219
|
-
return null;
|
|
220
|
-
const r = resolveRepo(repoStr);
|
|
221
|
-
if (!r)
|
|
222
|
-
return null;
|
|
223
|
-
return triageIssue(r.owner, r.repo, issueNumber);
|
|
224
|
-
}
|
|
225
|
-
export async function triageAndLabelIssue(issueNumber, repoStr) {
|
|
226
|
-
if (features.issueTriage === false)
|
|
227
|
-
return null;
|
|
228
|
-
const r = resolveRepo(repoStr);
|
|
229
|
-
if (!r)
|
|
230
|
-
return null;
|
|
231
|
-
return triageAndLabel(r.owner, r.repo, issueNumber);
|
|
232
|
-
}
|
|
233
|
-
export async function batchTriageIssues(repoStr, opts) {
|
|
234
|
-
if (features.issueTriage === false)
|
|
235
|
-
return [];
|
|
236
|
-
const r = resolveRepo(repoStr);
|
|
237
|
-
if (!r)
|
|
238
|
-
return [];
|
|
239
|
-
return triageOpenIssues(r.owner, r.repo, opts);
|
|
240
|
-
}
|
|
241
|
-
// ── Duplicate Detection ──────────────────────────────────────────────────────
|
|
242
|
-
export async function findDuplicateIssues(issueNumber, repoStr, opts) {
|
|
243
|
-
if (features.issueTriage === false)
|
|
244
|
-
return [];
|
|
245
|
-
const r = resolveRepo(repoStr);
|
|
246
|
-
if (!r)
|
|
247
|
-
return [];
|
|
248
|
-
return findDuplicates(r.owner, r.repo, issueNumber, opts);
|
|
249
|
-
}
|
|
250
|
-
// ── Commit Analysis ──────────────────────────────────────────────────────────
|
|
251
|
-
export async function analyzeGitHubCommit(sha, repoStr) {
|
|
252
|
-
if (features.commitAnalysis === false)
|
|
253
|
-
return null;
|
|
254
|
-
const r = resolveRepo(repoStr);
|
|
255
|
-
if (!r)
|
|
256
|
-
return null;
|
|
257
|
-
return analyzeCommit(r.owner, r.repo, sha);
|
|
258
|
-
}
|
|
259
|
-
export async function analyzeRecentGitHubCommits(repoStr, opts) {
|
|
260
|
-
if (features.commitAnalysis === false)
|
|
261
|
-
return [];
|
|
262
|
-
const r = resolveRepo(repoStr);
|
|
263
|
-
if (!r)
|
|
264
|
-
return [];
|
|
265
|
-
return analyzeRecentCommits(r.owner, r.repo, opts);
|
|
266
|
-
}
|
|
267
|
-
// ── Commit Quality Trends ────────────────────────────────────────────────────
|
|
268
|
-
export async function getCommitQualityTrend(repoStr, opts) {
|
|
269
|
-
if (features.commitAnalysis === false)
|
|
270
|
-
return null;
|
|
271
|
-
const r = resolveRepo(repoStr);
|
|
272
|
-
if (!r)
|
|
273
|
-
return null;
|
|
274
|
-
return getQualityTrend(r.owner, r.repo, opts);
|
|
275
|
-
}
|
|
276
|
-
// ── Repo Health ──────────────────────────────────────────────────────────────
|
|
277
|
-
export async function getGitHubRepoHealth(repoStr) {
|
|
278
|
-
if (features.repoHealth === false)
|
|
279
|
-
return null;
|
|
280
|
-
const r = resolveRepo(repoStr);
|
|
281
|
-
if (!r)
|
|
282
|
-
return null;
|
|
283
|
-
return getRepoHealth(r.owner, r.repo);
|
|
284
|
-
}
|
|
285
|
-
// ── PR Merge Readiness ────────────────────────────────────────────────────────
|
|
286
|
-
export async function checkPRMergeReadiness(prNumber, repoStr) {
|
|
287
|
-
if (features.prReadiness === false)
|
|
288
|
-
return null;
|
|
289
|
-
const r = resolveRepo(repoStr);
|
|
290
|
-
if (!r)
|
|
291
|
-
return null;
|
|
292
|
-
return checkPRReadiness(r.owner, r.repo, prNumber);
|
|
293
|
-
}
|
|
294
|
-
// ── Release Notes ─────────────────────────────────────────────────────────────
|
|
295
|
-
export async function generateGitHubReleaseNotes(opts, repoStr) {
|
|
296
|
-
if (features.releaseNotes === false)
|
|
297
|
-
return null;
|
|
298
|
-
const r = resolveRepo(repoStr);
|
|
299
|
-
if (!r)
|
|
300
|
-
return null;
|
|
301
|
-
return generateReleaseNotes(r.owner, r.repo, opts);
|
|
302
|
-
}
|
|
303
|
-
export async function generateReleaseNotesFromTag(repoStr, opts) {
|
|
304
|
-
if (features.releaseNotes === false)
|
|
305
|
-
return null;
|
|
306
|
-
const r = resolveRepo(repoStr);
|
|
307
|
-
if (!r)
|
|
308
|
-
return null;
|
|
309
|
-
return generateReleaseNotesFromLatestTag(r.owner, r.repo, opts);
|
|
310
|
-
}
|
|
311
|
-
// ── Contributor Stats ─────────────────────────────────────────────────────────
|
|
312
|
-
export async function getGitHubContributorStats(repoStr, opts) {
|
|
313
|
-
if (features.contributorStats === false)
|
|
314
|
-
return null;
|
|
315
|
-
const r = resolveRepo(repoStr);
|
|
316
|
-
if (!r)
|
|
317
|
-
return null;
|
|
318
|
-
return getContributorStats(r.owner, r.repo, opts);
|
|
319
|
-
}
|
|
320
|
-
// ── Issue SLA ─────────────────────────────────────────────────────────────────
|
|
321
|
-
export async function getGitHubSLAReport(repoStr, opts) {
|
|
322
|
-
if (features.issueSLA === false)
|
|
323
|
-
return null;
|
|
324
|
-
const r = resolveRepo(repoStr);
|
|
325
|
-
if (!r)
|
|
326
|
-
return null;
|
|
327
|
-
return getSLAReport(r.owner, r.repo, opts);
|
|
328
|
-
}
|
|
329
|
-
// ── Re-exports ───────────────────────────────────────────────────────────────
|
|
330
|
-
export { verifyWebhookSignature, processWebhook, onGitHubEvent, setTriageConfig, getTriageConfig, formatHealthReport, formatReadinessReport, formatContributorStats, formatSLAReport, generateReleaseNotesFromCommits, analyzeCommitData, titleSimilarity, setSLAConfig, getSLAConfig, };
|
|
331
|
-
//# sourceMappingURL=github.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/integrations/github.ts"],"names":[],"mappings":"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"}
|