@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/webhooks/config.js
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook configuration management.
|
|
3
|
-
*
|
|
4
|
-
* Loads, validates, and resolves webhook provider configurations.
|
|
5
|
-
* Secrets can reference environment variables or be provided as literals.
|
|
6
|
-
* Configuration can be loaded from a file or constructed programmatically.
|
|
7
|
-
*/
|
|
8
|
-
import * as fs from "node:fs";
|
|
9
|
-
import * as path from "node:path";
|
|
10
|
-
import { logActivity } from "../activity/log.js";
|
|
11
|
-
import { createLogger } from "../utils/logger.js";
|
|
12
|
-
import { getProvider, listProviders } from "./registry.js";
|
|
13
|
-
const log = createLogger("webhooks.config");
|
|
14
|
-
// ── In-memory config store ───────────────────────────────────────────────────
|
|
15
|
-
let systemConfig = { providers: {} };
|
|
16
|
-
/** Get the current webhook system configuration. */
|
|
17
|
-
export function getConfig() {
|
|
18
|
-
return systemConfig;
|
|
19
|
-
}
|
|
20
|
-
/** Replace the entire system configuration. */
|
|
21
|
-
export function setConfig(config) {
|
|
22
|
-
systemConfig = config;
|
|
23
|
-
}
|
|
24
|
-
// ── Provider config CRUD ─────────────────────────────────────────────────────
|
|
25
|
-
/** Get configuration for a specific provider. */
|
|
26
|
-
export function getProviderConfig(name) {
|
|
27
|
-
return systemConfig.providers[name];
|
|
28
|
-
}
|
|
29
|
-
/** Set configuration for a specific provider. Merges with existing config. */
|
|
30
|
-
export function setProviderConfig(config) {
|
|
31
|
-
const existing = systemConfig.providers[config.name];
|
|
32
|
-
systemConfig.providers[config.name] = existing
|
|
33
|
-
? { ...existing, ...config }
|
|
34
|
-
: config;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Set multiple provider configs in one call.
|
|
38
|
-
* Avoids repeated object spread overhead when configuring all providers at startup.
|
|
39
|
-
*/
|
|
40
|
-
export function setProviderConfigs(configs) {
|
|
41
|
-
const start = performance.now();
|
|
42
|
-
for (const config of configs) {
|
|
43
|
-
setProviderConfig(config);
|
|
44
|
-
}
|
|
45
|
-
const ms = performance.now() - start;
|
|
46
|
-
// Use debug log instead of logActivity to avoid polluting the insight engine
|
|
47
|
-
// with routine startup perf data (was causing feedback loop — DASH-70)
|
|
48
|
-
if (ms > 5) {
|
|
49
|
-
log.debug(`setProviderConfigs took ${ms.toFixed(1)}ms for ${configs.length} providers`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Remove configuration for a provider. */
|
|
53
|
-
export function removeProviderConfig(name) {
|
|
54
|
-
if (!(name in systemConfig.providers))
|
|
55
|
-
return false;
|
|
56
|
-
delete systemConfig.providers[name];
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
/** List all configured provider names. */
|
|
60
|
-
export function listConfiguredProviders() {
|
|
61
|
-
return Object.keys(systemConfig.providers);
|
|
62
|
-
}
|
|
63
|
-
// ── Secret resolution ────────────────────────────────────────────────────────
|
|
64
|
-
/**
|
|
65
|
-
* Resolve a secret value. If the value looks like an environment variable
|
|
66
|
-
* name (all uppercase, underscores, digits), read from process.env.
|
|
67
|
-
* Otherwise, treat it as a literal secret.
|
|
68
|
-
*/
|
|
69
|
-
export function resolveSecret(secretRef) {
|
|
70
|
-
// Env var pattern: all uppercase letters, digits, underscores
|
|
71
|
-
if (/^[A-Z][A-Z0-9_]*$/.test(secretRef)) {
|
|
72
|
-
return process.env[secretRef];
|
|
73
|
-
}
|
|
74
|
-
return secretRef;
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Get the resolved secret for a provider.
|
|
78
|
-
* Returns undefined if no secret is configured or the env var is not set.
|
|
79
|
-
*/
|
|
80
|
-
export function getProviderSecret(name) {
|
|
81
|
-
const config = systemConfig.providers[name];
|
|
82
|
-
if (!config?.secret)
|
|
83
|
-
return undefined;
|
|
84
|
-
return resolveSecret(config.secret);
|
|
85
|
-
}
|
|
86
|
-
// ── Retry config resolution ──────────────────────────────────────────────────
|
|
87
|
-
/**
|
|
88
|
-
* Get the effective retry options for a provider.
|
|
89
|
-
* Provider-specific config overrides system defaults.
|
|
90
|
-
*/
|
|
91
|
-
export function getProviderRetryOpts(name) {
|
|
92
|
-
const defaults = systemConfig.defaults?.retry ?? {};
|
|
93
|
-
const providerOpts = systemConfig.providers[name]?.retry ?? {};
|
|
94
|
-
return { ...defaults, ...providerOpts };
|
|
95
|
-
}
|
|
96
|
-
// ── Provider status ──────────────────────────────────────────────────────────
|
|
97
|
-
/** Check if a provider is enabled in the configuration. */
|
|
98
|
-
export function isProviderEnabled(name) {
|
|
99
|
-
const config = systemConfig.providers[name];
|
|
100
|
-
if (!config)
|
|
101
|
-
return true; // Unconfigured providers default to enabled
|
|
102
|
-
return config.enabled !== false;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Validate the configuration for a specific provider.
|
|
106
|
-
* Returns a list of issues found.
|
|
107
|
-
*/
|
|
108
|
-
export function validateProviderConfig(name) {
|
|
109
|
-
const issues = [];
|
|
110
|
-
const config = systemConfig.providers[name];
|
|
111
|
-
if (!config) {
|
|
112
|
-
issues.push(`No configuration found for provider "${name}"`);
|
|
113
|
-
return issues;
|
|
114
|
-
}
|
|
115
|
-
if (config.secret) {
|
|
116
|
-
const resolved = resolveSecret(config.secret);
|
|
117
|
-
if (!resolved) {
|
|
118
|
-
issues.push(`Secret for "${name}" references env var "${config.secret}" which is not set`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (!getProvider(name)) {
|
|
122
|
-
issues.push(`Provider "${name}" is configured but not registered in the registry`);
|
|
123
|
-
}
|
|
124
|
-
return issues;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Validate the entire system configuration.
|
|
128
|
-
* Returns a map of provider name → issues.
|
|
129
|
-
*/
|
|
130
|
-
export function validateConfig() {
|
|
131
|
-
const result = {};
|
|
132
|
-
for (const name of Object.keys(systemConfig.providers)) {
|
|
133
|
-
const issues = validateProviderConfig(name);
|
|
134
|
-
if (issues.length > 0) {
|
|
135
|
-
result[name] = issues;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Check for registered providers missing configuration
|
|
139
|
-
for (const name of listProviders()) {
|
|
140
|
-
if (!systemConfig.providers[name]) {
|
|
141
|
-
result[name] = [
|
|
142
|
-
`Provider "${name}" is registered but has no configuration`,
|
|
143
|
-
];
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
return result;
|
|
147
|
-
}
|
|
148
|
-
// ── File-based config loading ────────────────────────────────────────────────
|
|
149
|
-
/**
|
|
150
|
-
* Load webhook configuration from a JSON file.
|
|
151
|
-
* Returns true if the file was loaded successfully.
|
|
152
|
-
*/
|
|
153
|
-
export function loadConfigFromFile(filePath) {
|
|
154
|
-
const start = performance.now();
|
|
155
|
-
try {
|
|
156
|
-
const resolved = path.resolve(filePath);
|
|
157
|
-
const readStart = performance.now();
|
|
158
|
-
const content = fs.readFileSync(resolved, "utf-8");
|
|
159
|
-
const readMs = performance.now() - readStart;
|
|
160
|
-
const parseStart = performance.now();
|
|
161
|
-
const parsed = JSON.parse(content);
|
|
162
|
-
const parseMs = performance.now() - parseStart;
|
|
163
|
-
if (!parsed.providers || typeof parsed.providers !== "object") {
|
|
164
|
-
logActivity({
|
|
165
|
-
source: "system",
|
|
166
|
-
summary: `Webhook config file missing "providers" object: ${filePath}`,
|
|
167
|
-
});
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
systemConfig = parsed;
|
|
171
|
-
const totalMs = performance.now() - start;
|
|
172
|
-
logActivity({
|
|
173
|
-
source: "system",
|
|
174
|
-
summary: `Loaded webhook config from ${filePath} (${Object.keys(parsed.providers).length} providers, read:${readMs.toFixed(1)}ms, parse:${parseMs.toFixed(1)}ms, total:${totalMs.toFixed(1)}ms)`,
|
|
175
|
-
});
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
catch (err) {
|
|
179
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
180
|
-
logActivity({
|
|
181
|
-
source: "system",
|
|
182
|
-
summary: `Failed to load webhook config from ${filePath}: ${msg}`,
|
|
183
|
-
});
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Save the current webhook configuration to a JSON file.
|
|
189
|
-
* Secrets that reference env vars are saved as-is (the reference, not the resolved value).
|
|
190
|
-
*/
|
|
191
|
-
export function saveConfigToFile(filePath) {
|
|
192
|
-
try {
|
|
193
|
-
const resolved = path.resolve(filePath);
|
|
194
|
-
const dir = path.dirname(resolved);
|
|
195
|
-
if (!fs.existsSync(dir)) {
|
|
196
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
197
|
-
}
|
|
198
|
-
fs.writeFileSync(resolved, JSON.stringify(systemConfig, null, 2), "utf-8");
|
|
199
|
-
logActivity({
|
|
200
|
-
source: "system",
|
|
201
|
-
summary: `Saved webhook config to ${filePath}`,
|
|
202
|
-
});
|
|
203
|
-
return true;
|
|
204
|
-
}
|
|
205
|
-
catch (err) {
|
|
206
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
207
|
-
logActivity({
|
|
208
|
-
source: "system",
|
|
209
|
-
summary: `Failed to save webhook config to ${filePath}: ${msg}`,
|
|
210
|
-
});
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/webhooks/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Webhook event log — ring buffer of recent webhook events for debugging.
|
|
3
|
-
*
|
|
4
|
-
* Tracks the last N webhook events (successes and failures) with timing data,
|
|
5
|
-
* provider info, and error details. Useful for debugging webhook integrations
|
|
6
|
-
* without needing to dig through activity logs.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* import { logWebhookEvent, getRecentEvents } from "./event-log.js";
|
|
10
|
-
* logWebhookEvent({ provider: "slack-events", eventType: "message", ... });
|
|
11
|
-
* const recent = getRecentEvents({ provider: "slack-events", limit: 10 });
|
|
12
|
-
*/
|
|
13
|
-
// ── Ring buffer ──────────────────────────────────────────────────────────────
|
|
14
|
-
const DEFAULT_MAX_SIZE = 500;
|
|
15
|
-
let maxSize = DEFAULT_MAX_SIZE;
|
|
16
|
-
let buffer = [];
|
|
17
|
-
/** Configure the maximum number of entries to keep. */
|
|
18
|
-
export function setEventLogMaxSize(size) {
|
|
19
|
-
maxSize = Math.max(10, size);
|
|
20
|
-
if (buffer.length > maxSize) {
|
|
21
|
-
buffer = buffer.slice(-maxSize);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
/** Get current max size. */
|
|
25
|
-
export function getEventLogMaxSize() {
|
|
26
|
-
return maxSize;
|
|
27
|
-
}
|
|
28
|
-
// ── Logging ──────────────────────────────────────────────────────────────────
|
|
29
|
-
/**
|
|
30
|
-
* Record a webhook event in the log.
|
|
31
|
-
* Automatically generates an ID and trims the buffer if over capacity.
|
|
32
|
-
*/
|
|
33
|
-
export function logWebhookEvent(entry) {
|
|
34
|
-
const full = {
|
|
35
|
-
...entry,
|
|
36
|
-
id: `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
37
|
-
};
|
|
38
|
-
buffer.push(full);
|
|
39
|
-
if (buffer.length > maxSize) {
|
|
40
|
-
buffer = buffer.slice(-maxSize);
|
|
41
|
-
}
|
|
42
|
-
return full;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Create a timing wrapper that records start time and returns a function
|
|
46
|
-
* to finalize the log entry with duration and result.
|
|
47
|
-
*
|
|
48
|
-
* Usage:
|
|
49
|
-
* const finish = startEventTimer("slack-events", { eventType: "message" });
|
|
50
|
-
* // ... process webhook ...
|
|
51
|
-
* finish({ success: true, message: "OK" });
|
|
52
|
-
*/
|
|
53
|
-
export function startEventTimer(provider, meta) {
|
|
54
|
-
const startTime = performance.now();
|
|
55
|
-
const receivedAt = new Date().toISOString();
|
|
56
|
-
return (result) => {
|
|
57
|
-
const durationMs = Math.round((performance.now() - startTime) * 100) / 100;
|
|
58
|
-
return logWebhookEvent({
|
|
59
|
-
provider,
|
|
60
|
-
eventType: meta?.eventType,
|
|
61
|
-
deliveryId: meta?.deliveryId,
|
|
62
|
-
signatureValid: meta?.signatureValid,
|
|
63
|
-
receivedAt,
|
|
64
|
-
durationMs,
|
|
65
|
-
...result,
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
// ── Querying ─────────────────────────────────────────────────────────────────
|
|
70
|
-
/** Get recent webhook events, most recent first. */
|
|
71
|
-
export function getRecentEvents(filter) {
|
|
72
|
-
let entries = [...buffer];
|
|
73
|
-
if (filter?.provider) {
|
|
74
|
-
entries = entries.filter((e) => e.provider === filter.provider);
|
|
75
|
-
}
|
|
76
|
-
if (filter?.success !== undefined) {
|
|
77
|
-
entries = entries.filter((e) => e.success === filter.success);
|
|
78
|
-
}
|
|
79
|
-
if (filter?.since) {
|
|
80
|
-
entries = entries.filter((e) => e.receivedAt >= filter.since);
|
|
81
|
-
}
|
|
82
|
-
// Most recent first
|
|
83
|
-
entries.reverse();
|
|
84
|
-
const limit = filter?.limit ?? 50;
|
|
85
|
-
return entries.slice(0, limit);
|
|
86
|
-
}
|
|
87
|
-
/** Get a summary of the event log. */
|
|
88
|
-
export function getEventLogSummary() {
|
|
89
|
-
const byProvider = {};
|
|
90
|
-
let totalMs = 0;
|
|
91
|
-
for (const entry of buffer) {
|
|
92
|
-
totalMs += entry.durationMs;
|
|
93
|
-
if (!byProvider[entry.provider]) {
|
|
94
|
-
byProvider[entry.provider] = { count: 0, failures: 0, totalMs: 0 };
|
|
95
|
-
}
|
|
96
|
-
byProvider[entry.provider].count++;
|
|
97
|
-
byProvider[entry.provider].totalMs += entry.durationMs;
|
|
98
|
-
if (!entry.success) {
|
|
99
|
-
byProvider[entry.provider].failures++;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
const successes = buffer.filter((e) => e.success).length;
|
|
103
|
-
const providerSummary = {};
|
|
104
|
-
for (const [name, stats] of Object.entries(byProvider)) {
|
|
105
|
-
providerSummary[name] = {
|
|
106
|
-
count: stats.count,
|
|
107
|
-
failures: stats.failures,
|
|
108
|
-
avgDurationMs: stats.count > 0 ? Math.round((stats.totalMs / stats.count) * 100) / 100 : 0,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
total: buffer.length,
|
|
113
|
-
successes,
|
|
114
|
-
failures: buffer.length - successes,
|
|
115
|
-
avgDurationMs: buffer.length > 0 ? Math.round((totalMs / buffer.length) * 100) / 100 : 0,
|
|
116
|
-
byProvider: providerSummary,
|
|
117
|
-
oldestEntry: buffer.length > 0 ? buffer[0].receivedAt : null,
|
|
118
|
-
newestEntry: buffer.length > 0 ? buffer[buffer.length - 1].receivedAt : null,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
/** Clear the event log. Optionally filter by provider. */
|
|
122
|
-
export function clearEventLog(provider) {
|
|
123
|
-
if (provider) {
|
|
124
|
-
const before = buffer.length;
|
|
125
|
-
buffer = buffer.filter((e) => e.provider !== provider);
|
|
126
|
-
return before - buffer.length;
|
|
127
|
-
}
|
|
128
|
-
const count = buffer.length;
|
|
129
|
-
buffer = [];
|
|
130
|
-
return count;
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=event-log.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-log.js","sourceRoot":"","sources":["../../src/webhooks/event-log.ts"],"names":[],"mappings":"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"}
|
package/dist/webhooks/handler.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract WebhookHandler base class.
|
|
3
|
-
*
|
|
4
|
-
* Provides a class-based API on top of the existing interface-based webhook system.
|
|
5
|
-
* Subclasses implement `verify()` and `handle()`, getting automatic registration,
|
|
6
|
-
* retry logic, safe error handling, and activity logging for free.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* class MyHandler extends WebhookHandler {
|
|
10
|
-
* constructor() {
|
|
11
|
-
* super({
|
|
12
|
-
* name: "my-service",
|
|
13
|
-
* signatureHeader: "x-my-signature",
|
|
14
|
-
* secretEnvVar: "MY_WEBHOOK_SECRET",
|
|
15
|
-
* });
|
|
16
|
-
* }
|
|
17
|
-
* verify(ctx) { ... }
|
|
18
|
-
* protected handle(payload, ctx) { ... }
|
|
19
|
-
* }
|
|
20
|
-
*/
|
|
21
|
-
import { logActivity } from "../activity/log.js";
|
|
22
|
-
import { registerProvider } from "./registry.js";
|
|
23
|
-
import { withWebhookRetry } from "./retry.js";
|
|
24
|
-
// ── Base class ───────────────────────────────────────────────────────────────
|
|
25
|
-
/**
|
|
26
|
-
* Abstract base class for webhook handlers.
|
|
27
|
-
* Implements WebhookProvider and auto-registers with the webhook registry.
|
|
28
|
-
*
|
|
29
|
-
* Subclasses must implement:
|
|
30
|
-
* - `verify(ctx)` — Validate the webhook signature
|
|
31
|
-
* - `handle(payload, ctx)` — Process the webhook payload
|
|
32
|
-
*
|
|
33
|
-
* The base class provides:
|
|
34
|
-
* - Auto-registration with the webhook registry
|
|
35
|
-
* - Safe error wrapping (process() never throws)
|
|
36
|
-
* - Optional retry logic with exponential backoff
|
|
37
|
-
* - Secret resolution from environment variables
|
|
38
|
-
* - Activity logging
|
|
39
|
-
*/
|
|
40
|
-
export class WebhookHandler {
|
|
41
|
-
name;
|
|
42
|
-
path;
|
|
43
|
-
signatureHeader;
|
|
44
|
-
timestampHeader;
|
|
45
|
-
secretEnvVar;
|
|
46
|
-
algorithm;
|
|
47
|
-
retryOpts;
|
|
48
|
-
constructor(config) {
|
|
49
|
-
this.name = config.name;
|
|
50
|
-
this.path = config.path ?? `/api/webhooks/${config.name}`;
|
|
51
|
-
this.signatureHeader = config.signatureHeader ?? "x-signature";
|
|
52
|
-
this.timestampHeader = config.timestampHeader;
|
|
53
|
-
this.secretEnvVar = config.secretEnvVar;
|
|
54
|
-
this.algorithm = config.algorithm ?? "custom";
|
|
55
|
-
this.retryOpts = config.retry ?? {};
|
|
56
|
-
if (config.autoRegister !== false) {
|
|
57
|
-
registerProvider(this);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Process a webhook payload with error handling and optional retry.
|
|
62
|
-
* This is the WebhookProvider.process() implementation — callers use this.
|
|
63
|
-
* Never throws.
|
|
64
|
-
*/
|
|
65
|
-
async process(payload, ctx) {
|
|
66
|
-
try {
|
|
67
|
-
const maxAttempts = this.retryOpts.maxAttempts ?? 1;
|
|
68
|
-
if (maxAttempts > 1) {
|
|
69
|
-
return await withWebhookRetry(() => this.handle(payload, ctx), {
|
|
70
|
-
label: this.name,
|
|
71
|
-
...this.retryOpts,
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return await this.handle(payload, ctx);
|
|
75
|
-
}
|
|
76
|
-
catch (err) {
|
|
77
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
78
|
-
logActivity({
|
|
79
|
-
source: "system",
|
|
80
|
-
summary: `Webhook handler error (${this.name}): ${msg}`,
|
|
81
|
-
});
|
|
82
|
-
return { handled: false, message: `Handler error: ${msg}` };
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Resolve the webhook secret from the configured environment variable.
|
|
87
|
-
* Returns undefined if no env var is configured or the var is not set.
|
|
88
|
-
*/
|
|
89
|
-
getSecret() {
|
|
90
|
-
if (this.secretEnvVar) {
|
|
91
|
-
return process.env[this.secretEnvVar];
|
|
92
|
-
}
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Register this handler with the webhook registry.
|
|
97
|
-
* Called automatically on construction unless autoRegister is false.
|
|
98
|
-
*/
|
|
99
|
-
register() {
|
|
100
|
-
registerProvider(this);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/webhooks/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA+B9C,gFAAgF;AAEhF;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,cAAc;IACzB,IAAI,CAAS;IACb,IAAI,CAAS;IACb,eAAe,CAAS;IACxB,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,SAAS,CAAqB;IAC9B,SAAS,CAAmB;IAErC,YAAY,MAA4B;QACtC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,aAAa,CAAC;QAC/D,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC;QAC9C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEpC,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,EAAE,CAAC;YAClC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAiBD;;;;OAIG;IACH,KAAK,CAAC,OAAO,CACX,OAAgB,EAChB,GAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,CAAC,CAAC;YAEpD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE;oBAC7D,KAAK,EAAE,IAAI,CAAC,IAAI;oBAChB,GAAG,IAAI,CAAC,SAAS;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,WAAW,CAAC;gBACV,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,0BAA0B,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE;aACxD,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,GAAG,EAAE,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF"}
|