@moda-labs/bobi-events-core 0.1.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/LICENSE +201 -0
- package/README.md +32 -0
- package/dist/adapters/chat-sdk-slack.d.ts +18 -0
- package/dist/adapters/chat-sdk-slack.d.ts.map +1 -0
- package/dist/adapters/chat-sdk-slack.js +201 -0
- package/dist/adapters/chat-sdk-slack.js.map +1 -0
- package/dist/adapters/github.d.ts +3 -0
- package/dist/adapters/github.d.ts.map +1 -0
- package/dist/adapters/github.js +114 -0
- package/dist/adapters/github.js.map +1 -0
- package/dist/adapters/linear.d.ts +3 -0
- package/dist/adapters/linear.d.ts.map +1 -0
- package/dist/adapters/linear.js +47 -0
- package/dist/adapters/linear.js.map +1 -0
- package/dist/adapters/whatsapp.d.ts +25 -0
- package/dist/adapters/whatsapp.d.ts.map +1 -0
- package/dist/adapters/whatsapp.js +96 -0
- package/dist/adapters/whatsapp.js.map +1 -0
- package/dist/channels.d.ts +80 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +499 -0
- package/dist/channels.js.map +1 -0
- package/dist/circuit-breaker.d.ts +79 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +288 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/conversation.d.ts +29 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +86 -0
- package/dist/conversation.js.map +1 -0
- package/dist/core.d.ts +254 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +1775 -0
- package/dist/core.js.map +1 -0
- package/package.json +40 -0
- package/src/adapters/chat-sdk-slack.ts +209 -0
- package/src/adapters/github.ts +111 -0
- package/src/adapters/linear.ts +53 -0
- package/src/adapters/whatsapp.ts +120 -0
- package/src/channels.ts +600 -0
- package/src/circuit-breaker.ts +337 -0
- package/src/conversation.ts +96 -0
- package/src/core.ts +2413 -0
package/dist/core.d.ts
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
export interface NormalizedEvent {
|
|
2
|
+
v: 2;
|
|
3
|
+
id: string;
|
|
4
|
+
source: string;
|
|
5
|
+
type: string;
|
|
6
|
+
timestamp: string;
|
|
7
|
+
topics: string[];
|
|
8
|
+
delivery: "chat" | "bulk";
|
|
9
|
+
text: string;
|
|
10
|
+
conversation?: string;
|
|
11
|
+
fields?: Record<string, string | number | boolean>;
|
|
12
|
+
run_key?: string;
|
|
13
|
+
payload: Record<string, unknown>;
|
|
14
|
+
bubble_id?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SlackNormalizationResult {
|
|
17
|
+
event: NormalizedEvent | null;
|
|
18
|
+
challenge?: string;
|
|
19
|
+
skip: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface DeploymentRecord {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
api_key: string;
|
|
25
|
+
bubble_id: string;
|
|
26
|
+
subscriptions: string[];
|
|
27
|
+
created_at?: string;
|
|
28
|
+
identities?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export interface BubbleRecord {
|
|
31
|
+
id: string;
|
|
32
|
+
key: string;
|
|
33
|
+
created_at?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ResourceGrant {
|
|
36
|
+
id: string;
|
|
37
|
+
account_id: string | null;
|
|
38
|
+
bubble_id: string;
|
|
39
|
+
service: "github" | "linear" | "slack" | "whatsapp";
|
|
40
|
+
resource: string;
|
|
41
|
+
granted_by: "upstream_token_verification" | "test_seed";
|
|
42
|
+
organization_id?: string | null;
|
|
43
|
+
created_at: string;
|
|
44
|
+
expires_at: string | null;
|
|
45
|
+
}
|
|
46
|
+
export interface IngestTokenRecord {
|
|
47
|
+
id: string;
|
|
48
|
+
bubble_id: string;
|
|
49
|
+
topic: string;
|
|
50
|
+
token_hash: string;
|
|
51
|
+
name?: string;
|
|
52
|
+
env_managed?: boolean;
|
|
53
|
+
created_at: string;
|
|
54
|
+
}
|
|
55
|
+
export interface WebhookDeliveryRecord {
|
|
56
|
+
source: string;
|
|
57
|
+
delivery_id: string;
|
|
58
|
+
delivery_key: string;
|
|
59
|
+
received_at: string;
|
|
60
|
+
}
|
|
61
|
+
export interface SlackBotRecord {
|
|
62
|
+
bot_token: string;
|
|
63
|
+
bot_id?: string;
|
|
64
|
+
bot_user_id?: string;
|
|
65
|
+
/** App-level signing secret — inbound events from this app are verified with it. */
|
|
66
|
+
signing_secret?: string;
|
|
67
|
+
/** Slack api_app_id; the map key, repeated here for convenience. */
|
|
68
|
+
app_id?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface SlackWorkspaceRecord {
|
|
71
|
+
bot_token?: string;
|
|
72
|
+
bot_id?: string;
|
|
73
|
+
bots?: Record<string, SlackBotRecord>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the per-bot record for an inbound event's api_app_id, with
|
|
77
|
+
* read-migration so pre-multi-bot single-bot records still resolve.
|
|
78
|
+
*/
|
|
79
|
+
export declare function getSlackBotForApp(ws: SlackWorkspaceRecord | null | undefined, apiAppId: string): SlackBotRecord | null;
|
|
80
|
+
/**
|
|
81
|
+
* Every bot id we own in this workspace, across ALL registered apps (+ legacy).
|
|
82
|
+
* The self-reply filter skips a message authored by ANY of these — not just the
|
|
83
|
+
* RECEIVING app's bot. When two of our apps share a channel, Slack delivers each
|
|
84
|
+
* app's events to BOTH apps' webhooks, so one bot's message arrives via the
|
|
85
|
+
* other bot's webhook (a different api_app_id); keying "self" to the receiving
|
|
86
|
+
* app alone let that message through and it looped.
|
|
87
|
+
*/
|
|
88
|
+
export declare function workspaceBotIds(ws: SlackWorkspaceRecord | null | undefined): Set<string>;
|
|
89
|
+
/**
|
|
90
|
+
* Slack user ids for bot users belonging to the receiving app. Slack emits a
|
|
91
|
+
* channel mention as both app_mention and message.*, and only the app_mention
|
|
92
|
+
* should reach chat delivery; otherwise the drain posts two placeholders for
|
|
93
|
+
* one ts. Self-authorship filtering is workspace-wide; mention dedupe must stay
|
|
94
|
+
* app-scoped so one bot does not swallow thread replies mentioning another.
|
|
95
|
+
*/
|
|
96
|
+
export declare function workspaceBotUserIds(ws: SlackWorkspaceRecord | null | undefined, apiAppId: string): Set<string>;
|
|
97
|
+
/**
|
|
98
|
+
* The signing secret to verify an inbound Slack webhook with: the authoring
|
|
99
|
+
* app's per-app secret if registered, else the global fallback (legacy
|
|
100
|
+
* single-app deployments). Keeps single-app working without a redeploy.
|
|
101
|
+
*/
|
|
102
|
+
export declare function resolveSlackSigningSecret(ws: SlackWorkspaceRecord | null | undefined, payload: Record<string, unknown>, fallback: string): string;
|
|
103
|
+
/** Storage-aware convenience: load the workspace then resolve the signing secret. */
|
|
104
|
+
export declare function slackSigningSecretFor(storage: StorageAdapter, payload: Record<string, unknown>, fallback: string): Promise<string>;
|
|
105
|
+
export interface StorageAdapter {
|
|
106
|
+
getDeploymentByApiKey(apiKey: string): Promise<DeploymentRecord | null>;
|
|
107
|
+
getDeploymentByName(name: string, bubbleId: string): Promise<DeploymentRecord | null>;
|
|
108
|
+
putDeployment(deployment: DeploymentRecord): Promise<void>;
|
|
109
|
+
removeDeployment(deployment: DeploymentRecord): Promise<void>;
|
|
110
|
+
addSubscription(key: string, deploymentId: string): Promise<void>;
|
|
111
|
+
removeSubscription(key: string, deploymentId: string): Promise<void>;
|
|
112
|
+
deliver(event: NormalizedEvent): Promise<number>;
|
|
113
|
+
getBubble(bubbleId: string): Promise<BubbleRecord | null>;
|
|
114
|
+
putBubble(bubble: BubbleRecord): Promise<void>;
|
|
115
|
+
getSlackWorkspace(workspaceId: string): Promise<SlackWorkspaceRecord | null>;
|
|
116
|
+
putSlackWorkspace(workspaceId: string, record: SlackWorkspaceRecord): Promise<void>;
|
|
117
|
+
initDeploymentSession(deploymentId: string, subscriptions: string[]): Promise<void>;
|
|
118
|
+
putResourceGrant(grant: ResourceGrant): Promise<void>;
|
|
119
|
+
hasResourceGrant(service: string, resource: string, bubbleId: string): Promise<boolean>;
|
|
120
|
+
getDeploymentById(id: string): Promise<DeploymentRecord | null>;
|
|
121
|
+
getChannelState(key: string): Promise<Record<string, unknown> | null>;
|
|
122
|
+
putChannelState(key: string, value: Record<string, unknown>): Promise<void>;
|
|
123
|
+
putIngestToken(record: IngestTokenRecord): Promise<void>;
|
|
124
|
+
getIngestTokenByHash(hash: string): Promise<IngestTokenRecord | null>;
|
|
125
|
+
listIngestTokens(bubbleId: string): Promise<IngestTokenRecord[]>;
|
|
126
|
+
deleteIngestToken(record: IngestTokenRecord): Promise<void>;
|
|
127
|
+
getWebhookDelivery(source: string, deliveryKey: string): Promise<WebhookDeliveryRecord | null>;
|
|
128
|
+
putWebhookDelivery(record: WebhookDeliveryRecord): Promise<void>;
|
|
129
|
+
}
|
|
130
|
+
export interface HandlerResult {
|
|
131
|
+
status: number;
|
|
132
|
+
body: unknown;
|
|
133
|
+
}
|
|
134
|
+
export declare function sourceQualifiedTopics(topic: string, source?: string): string[];
|
|
135
|
+
export declare function createTopicEvent(topic: string, body: Record<string, unknown>, bubbleId?: string): NormalizedEvent;
|
|
136
|
+
export { normalizeGitHubWebhook as normalizeGitHubPayload } from "./adapters/github.js";
|
|
137
|
+
export { normalizeLinearWebhook as normalizeLinearPayload } from "./adapters/linear.js";
|
|
138
|
+
export declare function isGlobalTopic(key: string): boolean;
|
|
139
|
+
export declare function normalizeResource(service: string, resource: string): string;
|
|
140
|
+
export declare function parseGlobalTopic(key: string): {
|
|
141
|
+
service: string;
|
|
142
|
+
resource: string;
|
|
143
|
+
} | null;
|
|
144
|
+
export declare function namespaceSubKey(bubbleId: string | undefined, key: string): string;
|
|
145
|
+
export declare function subscriptionKeysForEvent(event: NormalizedEvent): string[];
|
|
146
|
+
export declare function sha256Hex(data: string): Promise<string>;
|
|
147
|
+
export declare function constantTimeEqual(a: string, b: string): boolean;
|
|
148
|
+
export declare function bubbleCanonicalString(timestamp: string, nonce: string, method: string, path: string, body: string): string;
|
|
149
|
+
export declare function buildBubbleSignature(secret: string, timestamp: string, nonce: string, method: string, path: string, body: string): Promise<string>;
|
|
150
|
+
export interface BubbleSignatureInput {
|
|
151
|
+
secret: string;
|
|
152
|
+
algo: string;
|
|
153
|
+
timestamp: string;
|
|
154
|
+
nonce: string;
|
|
155
|
+
method: string;
|
|
156
|
+
path: string;
|
|
157
|
+
body: string;
|
|
158
|
+
signature: string;
|
|
159
|
+
}
|
|
160
|
+
export declare function verifyBubbleSignature(input: BubbleSignatureInput): Promise<boolean>;
|
|
161
|
+
export declare function verifySlackSignature(secret: string, timestamp: string, body: string, signature: string): Promise<boolean>;
|
|
162
|
+
export declare function verifyGitHubSignature(secret: string, body: Uint8Array, signatureHeader: string): Promise<boolean>;
|
|
163
|
+
export declare function verifyLinearSignature(secret: string, body: string, signatureHeader: string, webhookTimestamp: unknown): Promise<boolean>;
|
|
164
|
+
export interface BubbleAuthContext {
|
|
165
|
+
bubbleId: string;
|
|
166
|
+
algo: string;
|
|
167
|
+
timestamp: string;
|
|
168
|
+
nonce: string;
|
|
169
|
+
signature: string;
|
|
170
|
+
method: string;
|
|
171
|
+
path: string;
|
|
172
|
+
rawBody: string;
|
|
173
|
+
}
|
|
174
|
+
export declare function readBubbleAuthHeaders(get: (name: string) => string | null | undefined, method: string, path: string, rawBody: string): BubbleAuthContext;
|
|
175
|
+
export declare function hasBubbleSignature(ctx: BubbleAuthContext): boolean;
|
|
176
|
+
export declare function hasPartialBubbleSignature(ctx: BubbleAuthContext): boolean;
|
|
177
|
+
export interface AuthRejectionCounters {
|
|
178
|
+
bad_signature: number;
|
|
179
|
+
stale_timestamp: number;
|
|
180
|
+
unknown_bubble: number;
|
|
181
|
+
webhook_unverified: number;
|
|
182
|
+
webhook_bad_signature: number;
|
|
183
|
+
}
|
|
184
|
+
export declare function getAuthRejectionCounters(): AuthRejectionCounters;
|
|
185
|
+
export declare function resetAuthRejectionCounters(): void;
|
|
186
|
+
export declare function authenticateBubble(storage: StorageAdapter, ctx: BubbleAuthContext): Promise<BubbleRecord | null>;
|
|
187
|
+
export declare function authenticateDeployment(storage: StorageAdapter, apiKey: string, deploymentId: string): Promise<DeploymentRecord | null>;
|
|
188
|
+
export declare function handleGitHubWebhook(storage: StorageAdapter, eventHeader: string, deliveryId: string, payload: Record<string, unknown>): Promise<HandlerResult>;
|
|
189
|
+
export declare function handleLinearWebhook(storage: StorageAdapter, payload: Record<string, unknown>, deliveryId?: string, waitUntil?: (promise: Promise<unknown>) => void): Promise<HandlerResult>;
|
|
190
|
+
export declare function handleSlackWebhook(storage: StorageAdapter, body: string, payload: Record<string, unknown>): Promise<HandlerResult>;
|
|
191
|
+
export interface InboundWebhookRequest {
|
|
192
|
+
rawBody: string;
|
|
193
|
+
header(name: string): string;
|
|
194
|
+
subpath: string;
|
|
195
|
+
}
|
|
196
|
+
export interface WebhookSecrets {
|
|
197
|
+
github?: string;
|
|
198
|
+
slack?: string;
|
|
199
|
+
linear?: string;
|
|
200
|
+
/** Meta app secret - verifies X-Hub-Signature-256 on POSTed events. */
|
|
201
|
+
whatsapp?: string;
|
|
202
|
+
/** Operator-chosen token echoed back in Meta's GET subscribe handshake. */
|
|
203
|
+
whatsappVerifyToken?: string;
|
|
204
|
+
}
|
|
205
|
+
export interface WebhookRequestContext {
|
|
206
|
+
ingestToken?: IngestTokenRecord;
|
|
207
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
208
|
+
}
|
|
209
|
+
export interface WebhookRequestOptions {
|
|
210
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
211
|
+
}
|
|
212
|
+
export declare const INGEST_MAX_BODY_BYTES: number;
|
|
213
|
+
export declare const INGEST_RATE_LIMIT = 60;
|
|
214
|
+
export declare const INGEST_RATE_WINDOW_MS = 60000;
|
|
215
|
+
export declare function resetIngestRateLimiter(): void;
|
|
216
|
+
export declare function createIngestEvent(topic: string, body: Record<string, unknown>, bubbleId: string): NormalizedEvent;
|
|
217
|
+
export interface WebhookHandshakeResult {
|
|
218
|
+
status: number;
|
|
219
|
+
text: string;
|
|
220
|
+
}
|
|
221
|
+
export declare function handleWebhookHandshake(source: string, query: (name: string) => string, secrets: WebhookSecrets): WebhookHandshakeResult | null;
|
|
222
|
+
export declare function channelWindowKey(source: string, scope: string, chatId: string): string;
|
|
223
|
+
export declare function handleWhatsAppWebhook(storage: StorageAdapter, payload: Record<string, unknown>): Promise<HandlerResult>;
|
|
224
|
+
export interface WebhookRouteMatch {
|
|
225
|
+
source: string;
|
|
226
|
+
subpath: string;
|
|
227
|
+
}
|
|
228
|
+
export declare function matchWebhookSource(path: string): WebhookRouteMatch | null;
|
|
229
|
+
export declare function handleWebhookRequest(storage: StorageAdapter, source: string, req: InboundWebhookRequest, secrets: WebhookSecrets, options?: WebhookRequestOptions): Promise<HandlerResult | null>;
|
|
230
|
+
export declare function handleRegisterDeployment(storage: StorageAdapter, body: Record<string, unknown>, ctx: BubbleAuthContext): Promise<HandlerResult>;
|
|
231
|
+
export declare function handleUpdateSubscriptions(storage: StorageAdapter, deploymentId: string, apiKey: string, body: Record<string, unknown>): Promise<HandlerResult>;
|
|
232
|
+
export declare function handleDeregisterDeployment(storage: StorageAdapter, deploymentId: string, apiKey: string): Promise<HandlerResult>;
|
|
233
|
+
export declare function handleTopicEvent(storage: StorageAdapter, topic: string, body: Record<string, unknown>, ctx: BubbleAuthContext): Promise<HandlerResult>;
|
|
234
|
+
export declare function validateIngestTopic(topic: string): string | null;
|
|
235
|
+
export declare function envIngestTokenRecords(envValue: string, bubbleId: string, now?: string): Promise<IngestTokenRecord[]>;
|
|
236
|
+
export declare function handleIngestTokenCreate(storage: StorageAdapter, body: Record<string, unknown>, bubbleId: string): Promise<HandlerResult>;
|
|
237
|
+
export declare function handleIngestTokenList(storage: StorageAdapter, bubbleId: string): Promise<HandlerResult>;
|
|
238
|
+
export declare function handleIngestTokenRevoke(storage: StorageAdapter, tokenId: string, bubbleId: string): Promise<HandlerResult>;
|
|
239
|
+
export interface VerifyResult {
|
|
240
|
+
ok: boolean;
|
|
241
|
+
organizationId?: string | null;
|
|
242
|
+
}
|
|
243
|
+
export declare function handleAuthorizeResource(storage: StorageAdapter, body: Record<string, unknown>, bubbleId: string): Promise<HandlerResult>;
|
|
244
|
+
export declare function handleTestSeedResourceGrants(storage: StorageAdapter, body: Record<string, unknown>, bubbleId: string): Promise<HandlerResult>;
|
|
245
|
+
export declare function unauthorizedGlobalTopics(storage: StorageAdapter, bubbleId: string, subs: string[]): Promise<string[]>;
|
|
246
|
+
export declare function admittedDeploymentIds(storage: StorageAdapter, event: NormalizedEvent, subscribersForKey: (key: string) => Promise<Iterable<string>>): Promise<Set<string>>;
|
|
247
|
+
export declare function bubbleScopedWorkspaceKey(bubbleId: string, workspaceId: string): string;
|
|
248
|
+
export declare function whatsappNumberKey(bubbleId: string, phoneNumberId: string): string;
|
|
249
|
+
export declare function handleWhatsAppNumberRegister(storage: StorageAdapter, body: Record<string, unknown>, bubbleId?: string): Promise<HandlerResult>;
|
|
250
|
+
export declare function handleChannelsSend(storage: StorageAdapter, body: Record<string, unknown>, bubbleId: string): Promise<HandlerResult>;
|
|
251
|
+
export declare function handleChannelsTyping(storage: StorageAdapter, body: Record<string, unknown>, bubbleId: string): Promise<HandlerResult>;
|
|
252
|
+
export declare function handleChannelsHistory(storage: StorageAdapter, conversationRef: string, limit: number, bubbleId: string): Promise<HandlerResult>;
|
|
253
|
+
export declare function handleSlackWorkspaceRegister(storage: StorageAdapter, body: Record<string, unknown>, bubbleId?: string): Promise<HandlerResult>;
|
|
254
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|