@lucern/sdk 0.2.0-alpha.1 → 0.2.0-alpha.10
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/CHANGELOG.md +13 -0
- package/README.md +691 -61
- package/dist/adminClient.d.ts +409 -0
- package/dist/adminClient.js +755 -0
- package/dist/adminClient.js.map +1 -0
- package/dist/answersClient.d.ts +23 -0
- package/dist/answersClient.js +333 -0
- package/dist/answersClient.js.map +1 -0
- package/dist/{packages/sdk/src/audiencesClient.d.ts → audiencesClient.d.ts} +30 -18
- package/dist/audiencesClient.js +472 -0
- package/dist/audiencesClient.js.map +1 -0
- package/dist/auditClient.d.ts +29 -0
- package/dist/auditClient.js +386 -0
- package/dist/auditClient.js.map +1 -0
- package/dist/beliefsClient.d.ts +242 -0
- package/dist/beliefsClient.js +616 -0
- package/dist/beliefsClient.js.map +1 -0
- package/dist/client.d.ts +2398 -0
- package/dist/client.js +6378 -0
- package/dist/client.js.map +1 -0
- package/dist/contextClient.d.ts +27 -0
- package/dist/contextClient.js +396 -0
- package/dist/contextClient.js.map +1 -0
- package/dist/contextFacade.d.ts +2 -0
- package/dist/contextFacade.js +73 -0
- package/dist/contextFacade.js.map +1 -0
- package/dist/{lucern/packages/domain-context/src/context-pack-compiler.d.ts → contextPackCompiler.d.ts} +11 -10
- package/dist/contextPackCompiler.js +1091 -0
- package/dist/contextPackCompiler.js.map +1 -0
- package/dist/contextPackPolicy.d.ts +84 -0
- package/dist/contextPackPolicy.js +347 -0
- package/dist/contextPackPolicy.js.map +1 -0
- package/dist/contextPackSchema.d.ts +7 -0
- package/dist/contextPackSchema.js +203 -0
- package/dist/contextPackSchema.js.map +1 -0
- package/dist/contextTypes.d.ts +135 -0
- package/dist/contextTypes.js +3 -0
- package/dist/contextTypes.js.map +1 -0
- package/dist/contracts/api-enums.contract.d.ts +81 -0
- package/dist/contracts/api-enums.contract.js +98 -0
- package/dist/contracts/api-enums.contract.js.map +1 -0
- package/dist/{lucern/contracts/src → contracts}/auth-session.contract.d.ts +14 -12
- package/dist/contracts/auth-session.contract.js +48 -0
- package/dist/contracts/auth-session.contract.js.map +1 -0
- package/dist/{lucern/contracts/src → contracts}/context-pack.contract.d.ts +56 -58
- package/dist/contracts/context-pack.contract.js +98 -0
- package/dist/contracts/context-pack.contract.js.map +1 -0
- package/dist/contracts/contextPack.d.ts +1 -0
- package/dist/contracts/contextPack.js +98 -0
- package/dist/contracts/contextPack.js.map +1 -0
- package/dist/contracts/index.d.ts +9 -0
- package/dist/contracts/index.js +4928 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/{lucern/contracts/src → contracts}/lens-filter.contract.d.ts +10 -8
- package/dist/contracts/lens-filter.contract.js +71 -0
- package/dist/contracts/lens-filter.contract.js.map +1 -0
- package/dist/contracts/lens-workflow.contract.d.ts +87 -0
- package/dist/contracts/lens-workflow.contract.js +123 -0
- package/dist/contracts/lens-workflow.contract.js.map +1 -0
- package/dist/contracts/lensFilter.d.ts +1 -0
- package/dist/contracts/lensFilter.js +71 -0
- package/dist/contracts/lensFilter.js.map +1 -0
- package/dist/contracts/lensWorkflow.d.ts +2 -0
- package/dist/contracts/lensWorkflow.js +123 -0
- package/dist/contracts/lensWorkflow.js.map +1 -0
- package/dist/contracts/mcp-tools.contract.d.ts +1 -0
- package/dist/contracts/mcp-tools.contract.js +3016 -0
- package/dist/contracts/mcp-tools.contract.js.map +1 -0
- package/dist/contracts/mcpTools.d.ts +1 -0
- package/dist/contracts/mcpTools.js +3016 -0
- package/dist/contracts/mcpTools.js.map +1 -0
- package/dist/contracts/prompt.contract.d.ts +26 -0
- package/dist/contracts/prompt.contract.js +12 -0
- package/dist/contracts/prompt.contract.js.map +1 -0
- package/dist/contracts/prompt.d.ts +1 -0
- package/dist/contracts/prompt.js +12 -0
- package/dist/contracts/prompt.js.map +1 -0
- package/dist/contracts/sdk-tools.contract.d.ts +2 -0
- package/dist/contracts/sdk-tools.contract.js +4164 -0
- package/dist/contracts/sdk-tools.contract.js.map +1 -0
- package/dist/contracts/sdkTools.d.ts +2 -0
- package/dist/contracts/sdkTools.js +4164 -0
- package/dist/contracts/sdkTools.js.map +1 -0
- package/dist/contracts/workflow-runtime.contract.d.ts +163 -0
- package/dist/contracts/workflow-runtime.contract.js +245 -0
- package/dist/contracts/workflow-runtime.contract.js.map +1 -0
- package/dist/contracts/workflowRuntime.d.ts +1 -0
- package/dist/contracts/workflowRuntime.js +245 -0
- package/dist/contracts/workflowRuntime.js.map +1 -0
- package/dist/{packages/sdk/src/controlObjectOwnership.d.ts → controlObjectOwnership.d.ts} +35 -18
- package/dist/controlObjectOwnership.js +215 -0
- package/dist/controlObjectOwnership.js.map +1 -0
- package/dist/{packages/sdk/src/coreClient.d.ts → coreClient.d.ts} +38 -14
- package/dist/coreClient.js +339 -0
- package/dist/coreClient.js.map +1 -0
- package/dist/customTools.d.ts +88 -0
- package/dist/customTools.js +248 -0
- package/dist/customTools.js.map +1 -0
- package/dist/decisionsClient.d.ts +111 -0
- package/dist/decisionsClient.js +522 -0
- package/dist/decisionsClient.js.map +1 -0
- package/dist/domainContext.d.ts +1 -0
- package/dist/domainContext.js +3 -0
- package/dist/domainContext.js.map +1 -0
- package/dist/events.d.ts +178 -0
- package/dist/events.js +249 -0
- package/dist/events.js.map +1 -0
- package/dist/eventsCore.d.ts +49 -0
- package/dist/eventsCore.js +429 -0
- package/dist/eventsCore.js.map +1 -0
- package/dist/evidenceClient.d.ts +119 -0
- package/dist/evidenceClient.js +350 -0
- package/dist/evidenceClient.js.map +1 -0
- package/dist/facade/context.d.ts +18 -0
- package/dist/facade/context.js +73 -0
- package/dist/facade/context.js.map +1 -0
- package/dist/gatewayFacades.d.ts +589 -0
- package/dist/gatewayFacades.js +1976 -0
- package/dist/gatewayFacades.js.map +1 -0
- package/dist/graphClient.d.ts +271 -0
- package/dist/graphClient.js +698 -0
- package/dist/graphClient.js.map +1 -0
- package/dist/{packages/sdk/src/harnessClient.d.ts → harnessClient.d.ts} +127 -35
- package/dist/harnessClient.js +607 -0
- package/dist/harnessClient.js.map +1 -0
- package/dist/identityClient.d.ts +140 -0
- package/dist/identityClient.js +497 -0
- package/dist/identityClient.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +5263 -2579
- package/dist/index.js.map +1 -1
- package/dist/learningClient.d.ts +46 -0
- package/dist/learningClient.js +409 -0
- package/dist/learningClient.js.map +1 -0
- package/dist/{packages/sdk/src/mcpParityClient.d.ts → mcpParityClient.d.ts} +11 -5
- package/dist/mcpParityClient.js +516 -0
- package/dist/mcpParityClient.js.map +1 -0
- package/dist/mcpParitySurface.d.ts +12 -0
- package/dist/mcpParitySurface.js +65 -0
- package/dist/mcpParitySurface.js.map +1 -0
- package/dist/mcpTools-DPZxowDX.d.ts +254 -0
- package/dist/{packages/sdk/src/ontologyClient.d.ts → ontologyClient.d.ts} +44 -22
- package/dist/ontologyClient.js +513 -0
- package/dist/ontologyClient.js.map +1 -0
- package/dist/packRuntime.d.ts +2 -0
- package/dist/packRuntime.js +3 -0
- package/dist/packRuntime.js.map +1 -0
- package/dist/packsClient.d.ts +131 -0
- package/dist/packsClient.js +525 -0
- package/dist/packsClient.js.map +1 -0
- package/dist/{packages/sdk/src/policyClient.d.ts → policyClient.d.ts} +113 -18
- package/dist/policyClient.js +625 -0
- package/dist/policyClient.js.map +1 -0
- package/dist/realtime/index.d.ts +29 -0
- package/dist/realtime/index.js +23 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/refs.d.ts +17 -0
- package/dist/realtime/refs.js +9 -0
- package/dist/realtime/refs.js.map +1 -0
- package/dist/reportsClient.d.ts +41 -0
- package/dist/reportsClient.js +418 -0
- package/dist/reportsClient.js.map +1 -0
- package/dist/schemaClient.d.ts +64 -0
- package/dist/schemaClient.js +434 -0
- package/dist/schemaClient.js.map +1 -0
- package/dist/sdkSurface.d.ts +61 -0
- package/dist/sdkSurface.js +112 -0
- package/dist/sdkSurface.js.map +1 -0
- package/dist/sdkTools-CwXJDACb.d.ts +150 -0
- package/dist/sourcesClient.d.ts +24 -0
- package/dist/sourcesClient.js +339 -0
- package/dist/sourcesClient.js.map +1 -0
- package/dist/topicsClient.d.ts +84 -0
- package/dist/topicsClient.js +492 -0
- package/dist/topicsClient.js.map +1 -0
- package/dist/types.d.ts +715 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/dist/workflowClient.d.ts +316 -0
- package/dist/workflowClient.js +830 -0
- package/dist/workflowClient.js.map +1 -0
- package/package.json +41 -37
- package/dist/lucern/contracts/src/lens-workflow.contract.d.ts +0 -84
- package/dist/lucern/contracts/src/mcp-tools.contract.d.ts +0 -151
- package/dist/lucern/contracts/src/workflow-runtime.contract.d.ts +0 -161
- package/dist/lucern/mcp-server/src/context-pack-policy.d.ts +0 -119
- package/dist/lucern/mcp-server/src/context-pack-schema.d.ts +0 -18
- package/dist/lucern/modules/graph-primitives/src/ontology-matching.d.ts +0 -78
- package/dist/lucern/modules/graph-primitives/src/text-matching.d.ts +0 -53
- package/dist/lucern/packages/client-core/src/beliefs.d.ts +0 -30
- package/dist/lucern/packages/client-core/src/context.d.ts +0 -29
- package/dist/lucern/packages/client-core/src/contradictions.d.ts +0 -11
- package/dist/lucern/packages/client-core/src/edges.d.ts +0 -11
- package/dist/lucern/packages/client-core/src/events.d.ts +0 -9
- package/dist/lucern/packages/client-core/src/evidence.d.ts +0 -21
- package/dist/lucern/packages/client-core/src/graph.d.ts +0 -17
- package/dist/lucern/packages/client-core/src/identity.d.ts +0 -7
- package/dist/lucern/packages/client-core/src/ids.d.ts +0 -7
- package/dist/lucern/packages/client-core/src/ontologies.d.ts +0 -13
- package/dist/lucern/packages/client-core/src/questions.d.ts +0 -39
- package/dist/lucern/packages/client-core/src/search.d.ts +0 -7
- package/dist/lucern/packages/client-core/src/tasks.d.ts +0 -13
- package/dist/lucern/packages/client-core/src/topics.d.ts +0 -17
- package/dist/lucern/packages/client-core/src/webhooks.d.ts +0 -35
- package/dist/lucern/packages/client-core/src/worktrees.d.ts +0 -17
- package/dist/lucern/packages/domain-beliefs/src/beliefs.d.ts +0 -283
- package/dist/lucern/packages/domain-beliefs/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-context/src/compile.d.ts +0 -11
- package/dist/lucern/packages/domain-context/src/index.d.ts +0 -4
- package/dist/lucern/packages/domain-context/src/ports.d.ts +0 -58
- package/dist/lucern/packages/domain-context/src/public-types.d.ts +0 -1
- package/dist/lucern/packages/domain-edges/src/contradictions.d.ts +0 -59
- package/dist/lucern/packages/domain-edges/src/edges.d.ts +0 -91
- package/dist/lucern/packages/domain-edges/src/index.d.ts +0 -2
- package/dist/lucern/packages/domain-evidence/src/evidence.d.ts +0 -115
- package/dist/lucern/packages/domain-evidence/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-graph/src/graph.d.ts +0 -150
- package/dist/lucern/packages/domain-identity/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-identity/src/whoami.d.ts +0 -13
- package/dist/lucern/packages/domain-ontologies/src/ontologies.d.ts +0 -123
- package/dist/lucern/packages/domain-questions/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-questions/src/questions.d.ts +0 -147
- package/dist/lucern/packages/domain-search/src/search.d.ts +0 -97
- package/dist/lucern/packages/domain-tasks/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-tasks/src/tasks.d.ts +0 -102
- package/dist/lucern/packages/domain-topics/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-topics/src/topics.d.ts +0 -147
- package/dist/lucern/packages/domain-worktrees/src/index.d.ts +0 -1
- package/dist/lucern/packages/domain-worktrees/src/worktrees.d.ts +0 -185
- package/dist/lucern/packages/events/src/index.d.ts +0 -4
- package/dist/lucern/packages/events/src/matching.d.ts +0 -3
- package/dist/lucern/packages/events/src/outbox.d.ts +0 -15
- package/dist/lucern/packages/events/src/types.d.ts +0 -151
- package/dist/lucern/packages/events/src/webhooks.d.ts +0 -9
- package/dist/lucern/packages/sdk-typescript/src/facade/beliefs.d.ts +0 -15
- package/dist/lucern/packages/sdk-typescript/src/facade/context.d.ts +0 -12
- package/dist/lucern/packages/sdk-typescript/src/facade/contradictions.d.ts +0 -7
- package/dist/lucern/packages/sdk-typescript/src/facade/edges.d.ts +0 -7
- package/dist/lucern/packages/sdk-typescript/src/facade/events.d.ts +0 -6
- package/dist/lucern/packages/sdk-typescript/src/facade/evidence.d.ts +0 -21
- package/dist/lucern/packages/sdk-typescript/src/facade/graph.d.ts +0 -10
- package/dist/lucern/packages/sdk-typescript/src/facade/identity.d.ts +0 -5
- package/dist/lucern/packages/sdk-typescript/src/facade/ontologies.d.ts +0 -8
- package/dist/lucern/packages/sdk-typescript/src/facade/questions.d.ts +0 -39
- package/dist/lucern/packages/sdk-typescript/src/facade/search.d.ts +0 -5
- package/dist/lucern/packages/sdk-typescript/src/facade/tasks.d.ts +0 -8
- package/dist/lucern/packages/sdk-typescript/src/facade/topics.d.ts +0 -10
- package/dist/lucern/packages/sdk-typescript/src/facade/webhooks.d.ts +0 -16
- package/dist/lucern/packages/sdk-typescript/src/facade/worktrees.d.ts +0 -10
- package/dist/lucern/packages/sdk-typescript/src/index.d.ts +0 -28
- package/dist/packages/sdk/src/adminClient.d.ts +0 -89
- package/dist/packages/sdk/src/answersClient.d.ts +0 -5
- package/dist/packages/sdk/src/auditClient.d.ts +0 -23
- package/dist/packages/sdk/src/beliefsClient.d.ts +0 -54
- package/dist/packages/sdk/src/client.d.ts +0 -1610
- package/dist/packages/sdk/src/contextClient.d.ts +0 -9
- package/dist/packages/sdk/src/contracts/api-enums.contract.d.ts +0 -58
- package/dist/packages/sdk/src/customTools.d.ts +0 -65
- package/dist/packages/sdk/src/decisionsClient.d.ts +0 -110
- package/dist/packages/sdk/src/graphClient.d.ts +0 -209
- package/dist/packages/sdk/src/identityClient.d.ts +0 -104
- package/dist/packages/sdk/src/index.d.ts +0 -28
- package/dist/packages/sdk/src/learningClient.d.ts +0 -43
- package/dist/packages/sdk/src/mcpParitySurface.d.ts +0 -8
- package/dist/packages/sdk/src/packsClient.d.ts +0 -101
- package/dist/packages/sdk/src/reportsClient.d.ts +0 -31
- package/dist/packages/sdk/src/schemaClient.d.ts +0 -54
- package/dist/packages/sdk/src/sdkSurface.d.ts +0 -56
- package/dist/packages/sdk/src/topicsClient.d.ts +0 -45
- package/dist/packages/sdk/src/types.d.ts +0 -489
- package/dist/packages/sdk/src/version.d.ts +0 -2
- package/dist/packages/sdk/src/workflowClient.d.ts +0 -274
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
declare const DOMAIN_EVENT_VERSION: "1.0";
|
|
2
|
+
declare const EVENT_RETENTION_DEFAULT_DAYS = 30;
|
|
3
|
+
declare const WEBHOOK_MAX_ATTEMPTS = 5;
|
|
4
|
+
declare const WEBHOOK_RETRY_DELAYS_MS: readonly [1000, 5000, 30000, 300000];
|
|
5
|
+
declare const DOMAIN_EVENT_TYPES: readonly ["belief.created", "belief.forked", "belief.confidence_updated", "belief.archived", "belief.refined", "belief.contract_created", "belief.contract_evaluated", "belief.lineage_queried", "evidence.created", "evidence.linked", "evidence.search_executed", "question.created", "question.answered", "question.refined", "question.status_updated", "question.archived", "edge.created", "contradiction.flagged", "worktree.created", "worktree.activated", "worktree.merged", "worktree.targets_updated", "worktree.metadata_updated", "topic.created", "topic.updated", "topic.archived", "task.created", "task.completed", "task.updated", "ontology.bound", "context.compiled", "identity.key_created", "identity.key_rotated", "identity.key_revoked", "webhook.test"];
|
|
6
|
+
type DomainEventType = (typeof DOMAIN_EVENT_TYPES)[number];
|
|
7
|
+
type DomainResourceType = "belief" | "evidence" | "question" | "edge" | "contradiction" | "worktree" | "topic" | "task" | "ontology" | "context" | "identity" | "webhook";
|
|
8
|
+
type DomainActorType = "human" | "agent" | "service";
|
|
9
|
+
type DomainEventData = Record<string, unknown>;
|
|
10
|
+
type DomainEvent = {
|
|
11
|
+
eventId: string;
|
|
12
|
+
type: DomainEventType | string;
|
|
13
|
+
version: typeof DOMAIN_EVENT_VERSION;
|
|
14
|
+
timestamp: number;
|
|
15
|
+
tenantId?: string;
|
|
16
|
+
workspaceId?: string;
|
|
17
|
+
topicId: string;
|
|
18
|
+
resourceId: string;
|
|
19
|
+
resourceType: DomainResourceType | string;
|
|
20
|
+
actorId: string;
|
|
21
|
+
actorType: DomainActorType;
|
|
22
|
+
data: DomainEventData;
|
|
23
|
+
correlationId?: string;
|
|
24
|
+
expiresAt: number;
|
|
25
|
+
};
|
|
26
|
+
type CreateDomainEventInput = {
|
|
27
|
+
eventId?: string;
|
|
28
|
+
timestamp?: number;
|
|
29
|
+
tenantId?: string;
|
|
30
|
+
workspaceId?: string;
|
|
31
|
+
topicId: string;
|
|
32
|
+
type: DomainEventType | string;
|
|
33
|
+
resourceId: string;
|
|
34
|
+
resourceType: DomainResourceType | string;
|
|
35
|
+
actorId: string;
|
|
36
|
+
actorType: DomainActorType;
|
|
37
|
+
data?: DomainEventData;
|
|
38
|
+
correlationId?: string;
|
|
39
|
+
retentionDays?: number;
|
|
40
|
+
};
|
|
41
|
+
type EventCursor = {
|
|
42
|
+
timestamp: number;
|
|
43
|
+
eventId: string;
|
|
44
|
+
};
|
|
45
|
+
type EventListQuery = {
|
|
46
|
+
topicId?: string;
|
|
47
|
+
after?: string;
|
|
48
|
+
types?: string[];
|
|
49
|
+
startTime?: number;
|
|
50
|
+
endTime?: number;
|
|
51
|
+
limit?: number;
|
|
52
|
+
};
|
|
53
|
+
type EventListResult = {
|
|
54
|
+
events: DomainEvent[];
|
|
55
|
+
nextCursor: string | null;
|
|
56
|
+
};
|
|
57
|
+
type WebhookSecretMode = "configured";
|
|
58
|
+
type WebhookRecord = {
|
|
59
|
+
id: string;
|
|
60
|
+
webhookId: string;
|
|
61
|
+
tenantId?: string;
|
|
62
|
+
workspaceId?: string;
|
|
63
|
+
topicId?: string;
|
|
64
|
+
url: string;
|
|
65
|
+
events: string[];
|
|
66
|
+
active: boolean;
|
|
67
|
+
secretConfigured: boolean;
|
|
68
|
+
createdAt: number;
|
|
69
|
+
updatedAt: number;
|
|
70
|
+
createdBy: string;
|
|
71
|
+
updatedBy: string;
|
|
72
|
+
lastDeliveryAt?: number;
|
|
73
|
+
lastSuccessfulDeliveryAt?: number;
|
|
74
|
+
};
|
|
75
|
+
type WebhookCreateInput = {
|
|
76
|
+
url: string;
|
|
77
|
+
events: string[];
|
|
78
|
+
secret: string;
|
|
79
|
+
topicId?: string;
|
|
80
|
+
active?: boolean;
|
|
81
|
+
};
|
|
82
|
+
type WebhookUpdateInput = {
|
|
83
|
+
url?: string;
|
|
84
|
+
events?: string[];
|
|
85
|
+
secret?: string;
|
|
86
|
+
topicId?: string | null;
|
|
87
|
+
active?: boolean;
|
|
88
|
+
};
|
|
89
|
+
type WebhookDeliveryStatus = "pending" | "delivering" | "succeeded" | "failed" | "dead_letter";
|
|
90
|
+
type WebhookDeliveryRecord = {
|
|
91
|
+
id: string;
|
|
92
|
+
deliveryId: string;
|
|
93
|
+
webhookId: string;
|
|
94
|
+
eventId: string;
|
|
95
|
+
eventType: string;
|
|
96
|
+
topicId: string;
|
|
97
|
+
status: WebhookDeliveryStatus;
|
|
98
|
+
attemptCount: number;
|
|
99
|
+
maxAttempts: number;
|
|
100
|
+
nextAttemptAt?: number;
|
|
101
|
+
lastAttemptAt?: number;
|
|
102
|
+
lastStatusCode?: number;
|
|
103
|
+
lastError?: string;
|
|
104
|
+
deliveredAt?: number;
|
|
105
|
+
createdAt: number;
|
|
106
|
+
updatedAt: number;
|
|
107
|
+
};
|
|
108
|
+
type WebhookDeliveryAttemptRecord = {
|
|
109
|
+
id: string;
|
|
110
|
+
attemptId: string;
|
|
111
|
+
deliveryId: string;
|
|
112
|
+
webhookId: string;
|
|
113
|
+
eventId: string;
|
|
114
|
+
eventType: string;
|
|
115
|
+
attemptNumber: number;
|
|
116
|
+
status: "succeeded" | "failed";
|
|
117
|
+
statusCode?: number;
|
|
118
|
+
error?: string;
|
|
119
|
+
responseBody?: string;
|
|
120
|
+
durationMs?: number;
|
|
121
|
+
createdAt: number;
|
|
122
|
+
};
|
|
123
|
+
type WebhookDeliveriesResult = {
|
|
124
|
+
deliveries: Array<WebhookDeliveryRecord & {
|
|
125
|
+
attempts?: WebhookDeliveryAttemptRecord[];
|
|
126
|
+
}>;
|
|
127
|
+
};
|
|
128
|
+
type WebhookHealthResult = {
|
|
129
|
+
webhookId: string;
|
|
130
|
+
totalAttempts: number;
|
|
131
|
+
successfulAttempts: number;
|
|
132
|
+
failedAttempts: number;
|
|
133
|
+
successRate: number;
|
|
134
|
+
pendingDeliveries: number;
|
|
135
|
+
deadLetterDeliveries: number;
|
|
136
|
+
lastDeliveryAt?: number;
|
|
137
|
+
lastSuccessfulDeliveryAt?: number;
|
|
138
|
+
};
|
|
139
|
+
type WebhookTestResult = {
|
|
140
|
+
webhookId: string;
|
|
141
|
+
deliveryId: string;
|
|
142
|
+
status: WebhookDeliveryStatus;
|
|
143
|
+
attempts: number;
|
|
144
|
+
};
|
|
145
|
+
type ReplayEventsInput = EventListQuery & {
|
|
146
|
+
webhookId?: string;
|
|
147
|
+
};
|
|
148
|
+
type ReplayEventsResult = EventListResult & {
|
|
149
|
+
replayedDeliveries?: number;
|
|
150
|
+
replayedWebhookId?: string;
|
|
151
|
+
};
|
|
152
|
+
declare function eventPatternToRegExp(pattern: string): RegExp;
|
|
153
|
+
declare function matchesEventPattern(eventType: string, pattern: string): boolean;
|
|
154
|
+
declare function matchesAnyEventPattern(eventType: string, patterns: readonly string[]): boolean;
|
|
155
|
+
declare function createEventId(): string;
|
|
156
|
+
declare function normalizeRetentionDays(value: number | undefined): number;
|
|
157
|
+
declare function buildDomainEvent(input: CreateDomainEventInput): DomainEvent;
|
|
158
|
+
declare function compareEventCursor(left: EventCursor, right: EventCursor): number;
|
|
159
|
+
declare function encodeEventCursor(cursor: EventCursor): string;
|
|
160
|
+
declare function decodeEventCursor(cursor: string | undefined): EventCursor | null;
|
|
161
|
+
declare function isAfterCursor(event: Pick<DomainEvent, "timestamp" | "eventId">, cursor: EventCursor | null): boolean;
|
|
162
|
+
declare function sortEventsByCursor<T extends Pick<DomainEvent, "timestamp" | "eventId">>(events: readonly T[]): T[];
|
|
163
|
+
declare function inferActorType(args: {
|
|
164
|
+
sessionType?: "agent" | "user";
|
|
165
|
+
authMode?: string;
|
|
166
|
+
principalType?: string;
|
|
167
|
+
}): DomainActorType;
|
|
168
|
+
declare function emitDomainEvent(invokeMutation: (reference: any, args: CreateDomainEventInput) => Promise<unknown>, input: CreateDomainEventInput): Promise<unknown>;
|
|
169
|
+
declare function assertValidWebhookUrl(url: string): string;
|
|
170
|
+
declare function normalizeWebhookPatterns(patterns: readonly string[]): string[];
|
|
171
|
+
declare function assertValidWebhookSecret(secret: string): string;
|
|
172
|
+
declare function computeWebhookSignature(payload: string, secret: string): Promise<string>;
|
|
173
|
+
declare function nextDeliveryAttemptAt(currentAttemptCount: number, now?: number): number | undefined;
|
|
174
|
+
declare function resolveDeliveryFailureStatus(attemptCount: number): WebhookDeliveryStatus;
|
|
175
|
+
declare function sanitizeWebhookRecord(value: Record<string, unknown>): WebhookRecord;
|
|
176
|
+
declare function truncateWebhookResponseBody(responseBody: string | undefined, maxLength?: number): string | undefined;
|
|
177
|
+
|
|
178
|
+
export { type CreateDomainEventInput, DOMAIN_EVENT_TYPES, DOMAIN_EVENT_VERSION, type DomainActorType, type DomainEvent, type DomainEventData, type DomainEventType, type DomainResourceType, EVENT_RETENTION_DEFAULT_DAYS, type EventCursor, type EventListQuery, type EventListResult, type ReplayEventsInput, type ReplayEventsResult, WEBHOOK_MAX_ATTEMPTS, WEBHOOK_RETRY_DELAYS_MS, type WebhookCreateInput, type WebhookDeliveriesResult, type WebhookDeliveryAttemptRecord, type WebhookDeliveryRecord, type WebhookDeliveryStatus, type WebhookHealthResult, type WebhookRecord, type WebhookSecretMode, type WebhookTestResult, type WebhookUpdateInput, assertValidWebhookSecret, assertValidWebhookUrl, buildDomainEvent, compareEventCursor, computeWebhookSignature, createEventId, decodeEventCursor, emitDomainEvent, encodeEventCursor, eventPatternToRegExp, inferActorType, isAfterCursor, matchesAnyEventPattern, matchesEventPattern, nextDeliveryAttemptAt, normalizeRetentionDays, normalizeWebhookPatterns, resolveDeliveryFailureStatus, sanitizeWebhookRecord, sortEventsByCursor, truncateWebhookResponseBody };
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// src/events.ts
|
|
2
|
+
var DOMAIN_EVENT_VERSION = "1.0";
|
|
3
|
+
var EVENT_RETENTION_DEFAULT_DAYS = 30;
|
|
4
|
+
var WEBHOOK_MAX_ATTEMPTS = 5;
|
|
5
|
+
var WEBHOOK_RETRY_DELAYS_MS = [1e3, 5e3, 3e4, 3e5];
|
|
6
|
+
var DOMAIN_EVENT_TYPES = [
|
|
7
|
+
"belief.created",
|
|
8
|
+
"belief.forked",
|
|
9
|
+
"belief.confidence_updated",
|
|
10
|
+
"belief.archived",
|
|
11
|
+
"belief.refined",
|
|
12
|
+
"belief.contract_created",
|
|
13
|
+
"belief.contract_evaluated",
|
|
14
|
+
"belief.lineage_queried",
|
|
15
|
+
"evidence.created",
|
|
16
|
+
"evidence.linked",
|
|
17
|
+
"evidence.search_executed",
|
|
18
|
+
"question.created",
|
|
19
|
+
"question.answered",
|
|
20
|
+
"question.refined",
|
|
21
|
+
"question.status_updated",
|
|
22
|
+
"question.archived",
|
|
23
|
+
"edge.created",
|
|
24
|
+
"contradiction.flagged",
|
|
25
|
+
"worktree.created",
|
|
26
|
+
"worktree.activated",
|
|
27
|
+
"worktree.merged",
|
|
28
|
+
"worktree.targets_updated",
|
|
29
|
+
"worktree.metadata_updated",
|
|
30
|
+
"topic.created",
|
|
31
|
+
"topic.updated",
|
|
32
|
+
"topic.archived",
|
|
33
|
+
"task.created",
|
|
34
|
+
"task.completed",
|
|
35
|
+
"task.updated",
|
|
36
|
+
"ontology.bound",
|
|
37
|
+
"context.compiled",
|
|
38
|
+
"identity.key_created",
|
|
39
|
+
"identity.key_rotated",
|
|
40
|
+
"identity.key_revoked",
|
|
41
|
+
"webhook.test"
|
|
42
|
+
];
|
|
43
|
+
function escapeRegex(value) {
|
|
44
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
45
|
+
}
|
|
46
|
+
function eventPatternToRegExp(pattern) {
|
|
47
|
+
const normalized = pattern.trim();
|
|
48
|
+
if (!normalized) {
|
|
49
|
+
return /^$/;
|
|
50
|
+
}
|
|
51
|
+
if (normalized === "*") {
|
|
52
|
+
return /^.*$/;
|
|
53
|
+
}
|
|
54
|
+
const source = escapeRegex(normalized).replace(/\\\*/g, ".*");
|
|
55
|
+
return new RegExp(`^${source}$`);
|
|
56
|
+
}
|
|
57
|
+
function matchesEventPattern(eventType, pattern) {
|
|
58
|
+
return eventPatternToRegExp(pattern).test(eventType.trim());
|
|
59
|
+
}
|
|
60
|
+
function matchesAnyEventPattern(eventType, patterns) {
|
|
61
|
+
if (patterns.length === 0) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return patterns.some((pattern) => matchesEventPattern(eventType, pattern));
|
|
65
|
+
}
|
|
66
|
+
function toBase64(value) {
|
|
67
|
+
if (typeof Buffer !== "undefined") {
|
|
68
|
+
return Buffer.from(value, "utf8").toString("base64url");
|
|
69
|
+
}
|
|
70
|
+
return btoa(unescape(encodeURIComponent(value))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
71
|
+
}
|
|
72
|
+
function fromBase64(value) {
|
|
73
|
+
if (typeof Buffer !== "undefined") {
|
|
74
|
+
return Buffer.from(value, "base64url").toString("utf8");
|
|
75
|
+
}
|
|
76
|
+
const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
|
|
77
|
+
return decodeURIComponent(escape(atob(normalized)));
|
|
78
|
+
}
|
|
79
|
+
function createEventId() {
|
|
80
|
+
const random = typeof globalThis.crypto?.randomUUID === "function" ? globalThis.crypto.randomUUID().replace(/-/g, "") : Array.from(
|
|
81
|
+
typeof globalThis.crypto?.getRandomValues === "function" ? globalThis.crypto.getRandomValues(new Uint8Array(16)) : Array.from({ length: 16 }, () => Math.floor(Math.random() * 256)),
|
|
82
|
+
(value) => value.toString(16).padStart(2, "0")
|
|
83
|
+
).join("");
|
|
84
|
+
return `evt_${random}`;
|
|
85
|
+
}
|
|
86
|
+
function normalizeRetentionDays(value) {
|
|
87
|
+
if (!Number.isFinite(value) || typeof value !== "number" || value <= 0) {
|
|
88
|
+
return EVENT_RETENTION_DEFAULT_DAYS;
|
|
89
|
+
}
|
|
90
|
+
return Math.max(1, Math.trunc(value));
|
|
91
|
+
}
|
|
92
|
+
function buildDomainEvent(input) {
|
|
93
|
+
const timestamp = input.timestamp ?? Date.now();
|
|
94
|
+
const retentionDays = normalizeRetentionDays(input.retentionDays);
|
|
95
|
+
return {
|
|
96
|
+
eventId: input.eventId?.trim() || createEventId(),
|
|
97
|
+
type: input.type.trim(),
|
|
98
|
+
version: DOMAIN_EVENT_VERSION,
|
|
99
|
+
timestamp,
|
|
100
|
+
tenantId: input.tenantId?.trim() || void 0,
|
|
101
|
+
workspaceId: input.workspaceId?.trim() || void 0,
|
|
102
|
+
topicId: input.topicId.trim(),
|
|
103
|
+
resourceId: input.resourceId.trim(),
|
|
104
|
+
resourceType: input.resourceType.trim(),
|
|
105
|
+
actorId: input.actorId.trim(),
|
|
106
|
+
actorType: input.actorType,
|
|
107
|
+
data: input.data ?? {},
|
|
108
|
+
correlationId: input.correlationId?.trim() || void 0,
|
|
109
|
+
expiresAt: timestamp + retentionDays * 24 * 60 * 60 * 1e3
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function compareEventCursor(left, right) {
|
|
113
|
+
if (left.timestamp !== right.timestamp) {
|
|
114
|
+
return left.timestamp - right.timestamp;
|
|
115
|
+
}
|
|
116
|
+
return left.eventId.localeCompare(right.eventId);
|
|
117
|
+
}
|
|
118
|
+
function encodeEventCursor(cursor) {
|
|
119
|
+
return toBase64(JSON.stringify(cursor));
|
|
120
|
+
}
|
|
121
|
+
function decodeEventCursor(cursor) {
|
|
122
|
+
if (!cursor || cursor.trim().length === 0) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const parsed = JSON.parse(fromBase64(cursor.trim()));
|
|
127
|
+
if (typeof parsed.timestamp !== "number" || !Number.isFinite(parsed.timestamp) || typeof parsed.eventId !== "string" || parsed.eventId.trim().length === 0) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
timestamp: parsed.timestamp,
|
|
132
|
+
eventId: parsed.eventId.trim()
|
|
133
|
+
};
|
|
134
|
+
} catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function isAfterCursor(event, cursor) {
|
|
139
|
+
if (!cursor) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
return compareEventCursor(event, cursor) > 0;
|
|
143
|
+
}
|
|
144
|
+
function sortEventsByCursor(events) {
|
|
145
|
+
return [...events].sort((left, right) => compareEventCursor(left, right));
|
|
146
|
+
}
|
|
147
|
+
function inferActorType(args) {
|
|
148
|
+
if (args.sessionType === "agent") {
|
|
149
|
+
return "agent";
|
|
150
|
+
}
|
|
151
|
+
if (args.authMode === "service_principal" || args.authMode === "tenant_api_key" || args.principalType === "service") {
|
|
152
|
+
return "service";
|
|
153
|
+
}
|
|
154
|
+
return "human";
|
|
155
|
+
}
|
|
156
|
+
async function emitDomainEvent(invokeMutation, input) {
|
|
157
|
+
return await invokeMutation("events:recordEvent", input);
|
|
158
|
+
}
|
|
159
|
+
var LOCALHOST_HOSTS = /* @__PURE__ */ new Set(["localhost", "127.0.0.1", "::1"]);
|
|
160
|
+
function normalizeUrl(url) {
|
|
161
|
+
try {
|
|
162
|
+
return new URL(url.trim());
|
|
163
|
+
} catch {
|
|
164
|
+
throw new Error("Webhook URL must be a valid absolute URL.");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function assertValidWebhookUrl(url) {
|
|
168
|
+
const parsed = normalizeUrl(url);
|
|
169
|
+
const hostname = parsed.hostname.trim().toLowerCase();
|
|
170
|
+
const nodeEnv = typeof process !== "undefined" ? process.env?.NODE_ENV : void 0;
|
|
171
|
+
const allowLocalHttp = nodeEnv === "test" || LOCALHOST_HOSTS.has(hostname);
|
|
172
|
+
if (parsed.protocol !== "https:" && !(allowLocalHttp && parsed.protocol === "http:")) {
|
|
173
|
+
throw new Error("Webhook URL must use HTTPS.");
|
|
174
|
+
}
|
|
175
|
+
return parsed.toString();
|
|
176
|
+
}
|
|
177
|
+
function normalizeWebhookPatterns(patterns) {
|
|
178
|
+
const normalized = Array.from(
|
|
179
|
+
new Set(
|
|
180
|
+
patterns.map((pattern) => pattern.trim()).filter((pattern) => pattern.length > 0)
|
|
181
|
+
)
|
|
182
|
+
);
|
|
183
|
+
if (normalized.length === 0) {
|
|
184
|
+
throw new Error("At least one webhook event pattern is required.");
|
|
185
|
+
}
|
|
186
|
+
return normalized;
|
|
187
|
+
}
|
|
188
|
+
function assertValidWebhookSecret(secret) {
|
|
189
|
+
const normalized = secret.trim();
|
|
190
|
+
if (normalized.length < 8) {
|
|
191
|
+
throw new Error("Webhook secret must be at least 8 characters.");
|
|
192
|
+
}
|
|
193
|
+
return normalized;
|
|
194
|
+
}
|
|
195
|
+
async function computeWebhookSignature(payload, secret) {
|
|
196
|
+
const encoder = new TextEncoder();
|
|
197
|
+
const key = await crypto.subtle.importKey(
|
|
198
|
+
"raw",
|
|
199
|
+
encoder.encode(secret),
|
|
200
|
+
{ name: "HMAC", hash: "SHA-256" },
|
|
201
|
+
false,
|
|
202
|
+
["sign"]
|
|
203
|
+
);
|
|
204
|
+
const signature = await crypto.subtle.sign("HMAC", key, encoder.encode(payload));
|
|
205
|
+
return Array.from(new Uint8Array(signature)).map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
206
|
+
}
|
|
207
|
+
function nextDeliveryAttemptAt(currentAttemptCount, now = Date.now()) {
|
|
208
|
+
if (currentAttemptCount >= WEBHOOK_MAX_ATTEMPTS) {
|
|
209
|
+
return void 0;
|
|
210
|
+
}
|
|
211
|
+
const retryIndex = currentAttemptCount - 1;
|
|
212
|
+
const delay = WEBHOOK_RETRY_DELAYS_MS[retryIndex];
|
|
213
|
+
return typeof delay === "number" ? now + delay : void 0;
|
|
214
|
+
}
|
|
215
|
+
function resolveDeliveryFailureStatus(attemptCount) {
|
|
216
|
+
return attemptCount >= WEBHOOK_MAX_ATTEMPTS ? "dead_letter" : "failed";
|
|
217
|
+
}
|
|
218
|
+
function sanitizeWebhookRecord(value) {
|
|
219
|
+
return {
|
|
220
|
+
id: String(value.id ?? value.webhookId ?? value._id ?? ""),
|
|
221
|
+
webhookId: String(value.webhookId ?? value.id ?? value._id ?? ""),
|
|
222
|
+
tenantId: typeof value.tenantId === "string" && value.tenantId.trim().length > 0 ? value.tenantId : void 0,
|
|
223
|
+
workspaceId: typeof value.workspaceId === "string" && value.workspaceId.trim().length > 0 ? value.workspaceId : void 0,
|
|
224
|
+
topicId: typeof value.topicId === "string" && value.topicId.trim().length > 0 ? value.topicId : void 0,
|
|
225
|
+
url: String(value.url ?? ""),
|
|
226
|
+
events: Array.isArray(value.events) ? value.events.map((entry) => typeof entry === "string" ? entry.trim() : "").filter(Boolean) : [],
|
|
227
|
+
active: value.active !== false,
|
|
228
|
+
secretConfigured: true,
|
|
229
|
+
createdAt: Number(value.createdAt ?? Date.now()),
|
|
230
|
+
updatedAt: Number(value.updatedAt ?? value.createdAt ?? Date.now()),
|
|
231
|
+
createdBy: String(value.createdBy ?? ""),
|
|
232
|
+
updatedBy: String(value.updatedBy ?? value.createdBy ?? ""),
|
|
233
|
+
lastDeliveryAt: typeof value.lastDeliveryAt === "number" ? value.lastDeliveryAt : void 0,
|
|
234
|
+
lastSuccessfulDeliveryAt: typeof value.lastSuccessfulDeliveryAt === "number" ? value.lastSuccessfulDeliveryAt : void 0
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function truncateWebhookResponseBody(responseBody, maxLength = 2e3) {
|
|
238
|
+
if (!responseBody) {
|
|
239
|
+
return void 0;
|
|
240
|
+
}
|
|
241
|
+
if (responseBody.length <= maxLength) {
|
|
242
|
+
return responseBody;
|
|
243
|
+
}
|
|
244
|
+
return `${responseBody.slice(0, maxLength - 3)}...`;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export { DOMAIN_EVENT_TYPES, DOMAIN_EVENT_VERSION, EVENT_RETENTION_DEFAULT_DAYS, WEBHOOK_MAX_ATTEMPTS, WEBHOOK_RETRY_DELAYS_MS, assertValidWebhookSecret, assertValidWebhookUrl, buildDomainEvent, compareEventCursor, computeWebhookSignature, createEventId, decodeEventCursor, emitDomainEvent, encodeEventCursor, eventPatternToRegExp, inferActorType, isAfterCursor, matchesAnyEventPattern, matchesEventPattern, nextDeliveryAttemptAt, normalizeRetentionDays, normalizeWebhookPatterns, resolveDeliveryFailureStatus, sanitizeWebhookRecord, sortEventsByCursor, truncateWebhookResponseBody };
|
|
248
|
+
//# sourceMappingURL=events.js.map
|
|
249
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/events.ts"],"names":[],"mappings":";AAAO,IAAM,oBAAA,GAAuB;AAC7B,IAAM,4BAAA,GAA+B;AACrC,IAAM,oBAAA,GAAuB;AAC7B,IAAM,uBAAA,GAA0B,CAAC,GAAA,EAAO,GAAA,EAAO,KAAQ,GAAO;AAE9D,IAAM,kBAAA,GAAqB;AAAA,EAChC,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,2BAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA,2BAAA;AAAA,EACA,wBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,0BAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,yBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,0BAAA;AAAA,EACA,2BAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF;AA2LA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AACpD;AAEO,SAAS,qBAAqB,OAAA,EAAyB;AAC5D,EAAA,MAAM,UAAA,GAAa,QAAQ,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,eAAe,GAAA,EAAK;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAS,WAAA,CAAY,UAAU,CAAA,CAAE,OAAA,CAAQ,SAAS,IAAI,CAAA;AAC5D,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AACjC;AAEO,SAAS,mBAAA,CACd,WACA,OAAA,EACS;AACT,EAAA,OAAO,qBAAqB,OAAO,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAC5D;AAEO,SAAS,sBAAA,CACd,WACA,QAAA,EACS;AACT,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,YAAY,mBAAA,CAAoB,SAAA,EAAW,OAAO,CAAC,CAAA;AAC3E;AAEA,SAAS,SAAS,KAAA,EAAuB;AACvC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,KAAK,QAAA,CAAS,kBAAA,CAAmB,KAAK,CAAC,CAAC,CAAA,CAC5C,OAAA,CAAQ,KAAA,EAAO,GAAG,EAClB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO,OAAO,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAC7D,EAAA,OAAO,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAC,CAAC,CAAA;AACpD;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,MAAA,GACJ,OAAO,UAAA,CAAW,MAAA,EAAQ,eAAe,UAAA,GACrC,UAAA,CAAW,MAAA,CAAO,UAAA,EAAW,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,IAC/C,KAAA,CAAM,IAAA;AAAA,IACJ,OAAO,UAAA,CAAW,MAAA,EAAQ,eAAA,KAAoB,UAAA,GAC1C,UAAA,CAAW,MAAA,CAAO,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,GACpD,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAG,EAAG,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAG,CAAC,CAAA;AAAA,IACpE,CAAC,UAAU,KAAA,CAAM,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG;AAAA,GAC/C,CAAE,KAAK,EAAE,CAAA;AACf,EAAA,OAAO,OAAO,MAAM,CAAA,CAAA;AACtB;AAEO,SAAS,uBAAuB,KAAA,EAAmC;AACxE,EAAA,IAAI,CAAC,OAAO,QAAA,CAAS,KAAK,KAAK,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,IAAS,CAAA,EAAG;AACtE,IAAA,OAAO,4BAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACtC;AAEO,SAAS,iBAAiB,KAAA,EAA4C;AAC3E,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI;AAC9C,EAAA,MAAM,aAAA,GAAgB,sBAAA,CAAuB,KAAA,CAAM,aAAa,CAAA;AAChE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,IAAA,MAAU,aAAA,EAAc;AAAA,IAChD,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK;AAAA,IACtB,OAAA,EAAS,oBAAA;AAAA,IACT,SAAA;AAAA,IACA,QAAA,EAAU,KAAA,CAAM,QAAA,EAAU,IAAA,EAAK,IAAK,MAAA;AAAA,IACpC,WAAA,EAAa,KAAA,CAAM,WAAA,EAAa,IAAA,EAAK,IAAK,MAAA;AAAA,IAC1C,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,IAC5B,UAAA,EAAY,KAAA,CAAM,UAAA,CAAW,IAAA,EAAK;AAAA,IAClC,YAAA,EAAc,KAAA,CAAM,YAAA,CAAa,IAAA,EAAK;AAAA,IACtC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,IACrB,aAAA,EAAe,KAAA,CAAM,aAAA,EAAe,IAAA,EAAK,IAAK,MAAA;AAAA,IAC9C,SAAA,EAAW,SAAA,GAAY,aAAA,GAAgB,EAAA,GAAK,KAAK,EAAA,GAAK;AAAA,GACxD;AACF;AAEO,SAAS,kBAAA,CAAmB,MAAmB,KAAA,EAA4B;AAChF,EAAA,IAAI,IAAA,CAAK,SAAA,KAAc,KAAA,CAAM,SAAA,EAAW;AACtC,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AAAA,EAChC;AACA,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,KAAA,CAAM,OAAO,CAAA;AACjD;AAEO,SAAS,kBAAkB,MAAA,EAA6B;AAC7D,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACxC;AAEO,SAAS,kBAAkB,MAAA,EAAgD;AAChF,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,WAAW,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AACnD,IAAA,IACE,OAAO,MAAA,CAAO,SAAA,KAAc,YAC5B,CAAC,MAAA,CAAO,SAAS,MAAA,CAAO,SAAS,KACjC,OAAO,MAAA,CAAO,YAAY,QAAA,IAC1B,MAAA,CAAO,QAAQ,IAAA,EAAK,CAAE,WAAW,CAAA,EACjC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO;AAAA,MACL,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,IAAA;AAAK,KAC/B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,aAAA,CACd,OACA,MAAA,EACS;AACT,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,kBAAA,CAAmB,KAAA,EAAO,MAAM,CAAA,GAAI,CAAA;AAC7C;AAEO,SAAS,mBACd,MAAA,EACK;AACL,EAAA,OAAO,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU,kBAAA,CAAmB,IAAA,EAAM,KAAK,CAAC,CAAA;AAC1E;AAEO,SAAS,eAAe,IAAA,EAIX;AAClB,EAAA,IAAI,IAAA,CAAK,gBAAgB,OAAA,EAAS;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IACE,IAAA,CAAK,aAAa,mBAAA,IAClB,IAAA,CAAK,aAAa,gBAAA,IAClB,IAAA,CAAK,kBAAkB,SAAA,EACvB;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,eAAA,CACpB,gBACA,KAAA,EACkB;AAClB,EAAA,OAAO,MAAM,cAAA,CAAe,oBAAA,EAA6B,KAAK,CAAA;AAChE;AAEA,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,WAAA,EAAa,KAAK,CAAC,CAAA;AAEjE,SAAS,aAAa,GAAA,EAAkB;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,sBAAsB,GAAA,EAAqB;AACzD,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,WAAA,EAAY;AACpD,EAAA,MAAM,UACJ,OAAO,OAAA,KAAY,WAAA,GAAc,OAAA,CAAQ,KAAK,QAAA,GAAW,MAAA;AAC3D,EAAA,MAAM,cAAA,GACJ,OAAA,KAAY,MAAA,IAAU,eAAA,CAAgB,IAAI,QAAQ,CAAA;AAEpD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,EAAE,cAAA,IAAkB,MAAA,CAAO,aAAa,OAAA,CAAA,EAAU;AACpF,IAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,OAAO,QAAA,EAAS;AACzB;AAEO,SAAS,yBAAyB,QAAA,EAAuC;AAC9E,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA;AAAA,IACvB,IAAI,GAAA;AAAA,MACF,QAAA,CACG,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,IAAA,EAAM,CAAA,CAC/B,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,CAAQ,SAAS,CAAC;AAAA;AAC3C,GACF;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,yBAAyB,MAAA,EAAwB;AAC/D,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,EAAK;AAC/B,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,UAAA;AACT;AAEA,eAAsB,uBAAA,CACpB,SACA,MAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,SAAA;AAAA,IAC9B,KAAA;AAAA,IACA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAAA,IACrB,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,KAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAC,CAAA;AAC/E,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,UAAA,CAAW,SAAS,CAAC,CAAA,CACxC,IAAI,CAAC,IAAA,KAAS,KAAK,QAAA,CAAS,EAAE,EAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAChD,KAAK,EAAE,CAAA;AACZ;AAEO,SAAS,qBAAA,CACd,mBAAA,EACA,GAAA,GAAM,IAAA,CAAK,KAAI,EACK;AACpB,EAAA,IAAI,uBAAuB,oBAAA,EAAsB;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,mBAAA,GAAsB,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,wBAAwB,UAAU,CAAA;AAChD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,GAAA,GAAM,KAAA,GAAQ,MAAA;AACnD;AAEO,SAAS,6BACd,YAAA,EACuB;AACvB,EAAA,OAAO,YAAA,IAAgB,uBAAuB,aAAA,GAAgB,QAAA;AAChE;AAEO,SAAS,sBACd,KAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,OAAO,KAAA,CAAM,EAAA,IAAM,MAAM,SAAA,IAAa,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,IACzD,SAAA,EAAW,OAAO,KAAA,CAAM,SAAA,IAAa,MAAM,EAAA,IAAM,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,IAChE,QAAA,EACE,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACjE,KAAA,CAAM,QAAA,GACN,MAAA;AAAA,IACN,WAAA,EACE,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,IAAY,KAAA,CAAM,WAAA,CAAY,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GACvE,KAAA,CAAM,WAAA,GACN,MAAA;AAAA,IACN,OAAA,EACE,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA,GAAS,CAAA,GAC/D,KAAA,CAAM,OAAA,GACN,MAAA;AAAA,IACN,GAAA,EAAK,MAAA,CAAO,KAAA,CAAM,GAAA,IAAO,EAAE,CAAA;AAAA,IAC3B,MAAA,EAAQ,MAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAC9B,KAAA,CAAM,MAAA,CACH,GAAA,CAAI,CAAC,KAAA,KAAW,OAAO,KAAA,KAAU,QAAA,GAAW,MAAM,IAAA,EAAK,GAAI,EAAG,CAAA,CAC9D,MAAA,CAAO,OAAO,CAAA,GACjB,EAAC;AAAA,IACL,MAAA,EAAQ,MAAM,MAAA,KAAW,KAAA;AAAA,IACzB,gBAAA,EAAkB,IAAA;AAAA,IAClB,WAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/C,SAAA,EAAW,OAAO,KAAA,CAAM,SAAA,IAAa,MAAM,SAAA,IAAa,IAAA,CAAK,KAAK,CAAA;AAAA,IAClE,SAAA,EAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,EAAE,CAAA;AAAA,IACvC,WAAW,MAAA,CAAO,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,aAAa,EAAE,CAAA;AAAA,IAC1D,gBACE,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,GAAW,MAAM,cAAA,GAAiB,MAAA;AAAA,IACpE,0BACE,OAAO,KAAA,CAAM,wBAAA,KAA6B,QAAA,GACtC,MAAM,wBAAA,GACN;AAAA,GACR;AACF;AAEO,SAAS,2BAAA,CACd,YAAA,EACA,SAAA,GAAY,GAAA,EACQ;AACpB,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,CAAa,UAAU,SAAA,EAAW;AACpC,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAG,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,SAAA,GAAY,CAAC,CAAC,CAAA,GAAA,CAAA;AAChD","file":"events.js","sourcesContent":["export const DOMAIN_EVENT_VERSION = \"1.0\" as const;\nexport const EVENT_RETENTION_DEFAULT_DAYS = 30;\nexport const WEBHOOK_MAX_ATTEMPTS = 5;\nexport const WEBHOOK_RETRY_DELAYS_MS = [1_000, 5_000, 30_000, 300_000] as const;\n\nexport const DOMAIN_EVENT_TYPES = [\n \"belief.created\",\n \"belief.forked\",\n \"belief.confidence_updated\",\n \"belief.archived\",\n \"belief.refined\",\n \"belief.contract_created\",\n \"belief.contract_evaluated\",\n \"belief.lineage_queried\",\n \"evidence.created\",\n \"evidence.linked\",\n \"evidence.search_executed\",\n \"question.created\",\n \"question.answered\",\n \"question.refined\",\n \"question.status_updated\",\n \"question.archived\",\n \"edge.created\",\n \"contradiction.flagged\",\n \"worktree.created\",\n \"worktree.activated\",\n \"worktree.merged\",\n \"worktree.targets_updated\",\n \"worktree.metadata_updated\",\n \"topic.created\",\n \"topic.updated\",\n \"topic.archived\",\n \"task.created\",\n \"task.completed\",\n \"task.updated\",\n \"ontology.bound\",\n \"context.compiled\",\n \"identity.key_created\",\n \"identity.key_rotated\",\n \"identity.key_revoked\",\n \"webhook.test\",\n] as const;\n\nexport type DomainEventType = (typeof DOMAIN_EVENT_TYPES)[number];\n\nexport type DomainResourceType =\n | \"belief\"\n | \"evidence\"\n | \"question\"\n | \"edge\"\n | \"contradiction\"\n | \"worktree\"\n | \"topic\"\n | \"task\"\n | \"ontology\"\n | \"context\"\n | \"identity\"\n | \"webhook\";\n\nexport type DomainActorType = \"human\" | \"agent\" | \"service\";\nexport type DomainEventData = Record<string, unknown>;\n\nexport type DomainEvent = {\n eventId: string;\n type: DomainEventType | string;\n version: typeof DOMAIN_EVENT_VERSION;\n timestamp: number;\n tenantId?: string;\n workspaceId?: string;\n topicId: string;\n resourceId: string;\n resourceType: DomainResourceType | string;\n actorId: string;\n actorType: DomainActorType;\n data: DomainEventData;\n correlationId?: string;\n expiresAt: number;\n};\n\nexport type CreateDomainEventInput = {\n eventId?: string;\n timestamp?: number;\n tenantId?: string;\n workspaceId?: string;\n topicId: string;\n type: DomainEventType | string;\n resourceId: string;\n resourceType: DomainResourceType | string;\n actorId: string;\n actorType: DomainActorType;\n data?: DomainEventData;\n correlationId?: string;\n retentionDays?: number;\n};\n\nexport type EventCursor = {\n timestamp: number;\n eventId: string;\n};\n\nexport type EventListQuery = {\n topicId?: string;\n after?: string;\n types?: string[];\n startTime?: number;\n endTime?: number;\n limit?: number;\n};\n\nexport type EventListResult = {\n events: DomainEvent[];\n nextCursor: string | null;\n};\n\nexport type WebhookSecretMode = \"configured\";\n\nexport type WebhookRecord = {\n id: string;\n webhookId: string;\n tenantId?: string;\n workspaceId?: string;\n topicId?: string;\n url: string;\n events: string[];\n active: boolean;\n secretConfigured: boolean;\n createdAt: number;\n updatedAt: number;\n createdBy: string;\n updatedBy: string;\n lastDeliveryAt?: number;\n lastSuccessfulDeliveryAt?: number;\n};\n\nexport type WebhookCreateInput = {\n url: string;\n events: string[];\n secret: string;\n topicId?: string;\n active?: boolean;\n};\n\nexport type WebhookUpdateInput = {\n url?: string;\n events?: string[];\n secret?: string;\n topicId?: string | null;\n active?: boolean;\n};\n\nexport type WebhookDeliveryStatus =\n | \"pending\"\n | \"delivering\"\n | \"succeeded\"\n | \"failed\"\n | \"dead_letter\";\n\nexport type WebhookDeliveryRecord = {\n id: string;\n deliveryId: string;\n webhookId: string;\n eventId: string;\n eventType: string;\n topicId: string;\n status: WebhookDeliveryStatus;\n attemptCount: number;\n maxAttempts: number;\n nextAttemptAt?: number;\n lastAttemptAt?: number;\n lastStatusCode?: number;\n lastError?: string;\n deliveredAt?: number;\n createdAt: number;\n updatedAt: number;\n};\n\nexport type WebhookDeliveryAttemptRecord = {\n id: string;\n attemptId: string;\n deliveryId: string;\n webhookId: string;\n eventId: string;\n eventType: string;\n attemptNumber: number;\n status: \"succeeded\" | \"failed\";\n statusCode?: number;\n error?: string;\n responseBody?: string;\n durationMs?: number;\n createdAt: number;\n};\n\nexport type WebhookDeliveriesResult = {\n deliveries: Array<\n WebhookDeliveryRecord & {\n attempts?: WebhookDeliveryAttemptRecord[];\n }\n >;\n};\n\nexport type WebhookHealthResult = {\n webhookId: string;\n totalAttempts: number;\n successfulAttempts: number;\n failedAttempts: number;\n successRate: number;\n pendingDeliveries: number;\n deadLetterDeliveries: number;\n lastDeliveryAt?: number;\n lastSuccessfulDeliveryAt?: number;\n};\n\nexport type WebhookTestResult = {\n webhookId: string;\n deliveryId: string;\n status: WebhookDeliveryStatus;\n attempts: number;\n};\n\nexport type ReplayEventsInput = EventListQuery & {\n webhookId?: string;\n};\n\nexport type ReplayEventsResult = EventListResult & {\n replayedDeliveries?: number;\n replayedWebhookId?: string;\n};\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function eventPatternToRegExp(pattern: string): RegExp {\n const normalized = pattern.trim();\n if (!normalized) {\n return /^$/;\n }\n if (normalized === \"*\") {\n return /^.*$/;\n }\n const source = escapeRegex(normalized).replace(/\\\\\\*/g, \".*\");\n return new RegExp(`^${source}$`);\n}\n\nexport function matchesEventPattern(\n eventType: string,\n pattern: string\n): boolean {\n return eventPatternToRegExp(pattern).test(eventType.trim());\n}\n\nexport function matchesAnyEventPattern(\n eventType: string,\n patterns: readonly string[]\n): boolean {\n if (patterns.length === 0) {\n return true;\n }\n return patterns.some((pattern) => matchesEventPattern(eventType, pattern));\n}\n\nfunction toBase64(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"utf8\").toString(\"base64url\");\n }\n return btoa(unescape(encodeURIComponent(value)))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction fromBase64(value: string): string {\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(value, \"base64url\").toString(\"utf8\");\n }\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n return decodeURIComponent(escape(atob(normalized)));\n}\n\nexport function createEventId(): string {\n const random =\n typeof globalThis.crypto?.randomUUID === \"function\"\n ? globalThis.crypto.randomUUID().replace(/-/g, \"\")\n : Array.from(\n typeof globalThis.crypto?.getRandomValues === \"function\"\n ? globalThis.crypto.getRandomValues(new Uint8Array(16))\n : Array.from({ length: 16 }, () => Math.floor(Math.random() * 256)),\n (value) => value.toString(16).padStart(2, \"0\")\n ).join(\"\");\n return `evt_${random}`;\n}\n\nexport function normalizeRetentionDays(value: number | undefined): number {\n if (!Number.isFinite(value) || typeof value !== \"number\" || value <= 0) {\n return EVENT_RETENTION_DEFAULT_DAYS;\n }\n return Math.max(1, Math.trunc(value));\n}\n\nexport function buildDomainEvent(input: CreateDomainEventInput): DomainEvent {\n const timestamp = input.timestamp ?? Date.now();\n const retentionDays = normalizeRetentionDays(input.retentionDays);\n return {\n eventId: input.eventId?.trim() || createEventId(),\n type: input.type.trim(),\n version: DOMAIN_EVENT_VERSION,\n timestamp,\n tenantId: input.tenantId?.trim() || undefined,\n workspaceId: input.workspaceId?.trim() || undefined,\n topicId: input.topicId.trim(),\n resourceId: input.resourceId.trim(),\n resourceType: input.resourceType.trim(),\n actorId: input.actorId.trim(),\n actorType: input.actorType,\n data: input.data ?? {},\n correlationId: input.correlationId?.trim() || undefined,\n expiresAt: timestamp + retentionDays * 24 * 60 * 60 * 1000,\n };\n}\n\nexport function compareEventCursor(left: EventCursor, right: EventCursor): number {\n if (left.timestamp !== right.timestamp) {\n return left.timestamp - right.timestamp;\n }\n return left.eventId.localeCompare(right.eventId);\n}\n\nexport function encodeEventCursor(cursor: EventCursor): string {\n return toBase64(JSON.stringify(cursor));\n}\n\nexport function decodeEventCursor(cursor: string | undefined): EventCursor | null {\n if (!cursor || cursor.trim().length === 0) {\n return null;\n }\n try {\n const parsed = JSON.parse(fromBase64(cursor.trim())) as Partial<EventCursor>;\n if (\n typeof parsed.timestamp !== \"number\" ||\n !Number.isFinite(parsed.timestamp) ||\n typeof parsed.eventId !== \"string\" ||\n parsed.eventId.trim().length === 0\n ) {\n return null;\n }\n return {\n timestamp: parsed.timestamp,\n eventId: parsed.eventId.trim(),\n };\n } catch {\n return null;\n }\n}\n\nexport function isAfterCursor(\n event: Pick<DomainEvent, \"timestamp\" | \"eventId\">,\n cursor: EventCursor | null\n): boolean {\n if (!cursor) {\n return true;\n }\n return compareEventCursor(event, cursor) > 0;\n}\n\nexport function sortEventsByCursor<T extends Pick<DomainEvent, \"timestamp\" | \"eventId\">>(\n events: readonly T[]\n): T[] {\n return [...events].sort((left, right) => compareEventCursor(left, right));\n}\n\nexport function inferActorType(args: {\n sessionType?: \"agent\" | \"user\";\n authMode?: string;\n principalType?: string;\n}): DomainActorType {\n if (args.sessionType === \"agent\") {\n return \"agent\";\n }\n if (\n args.authMode === \"service_principal\" ||\n args.authMode === \"tenant_api_key\" ||\n args.principalType === \"service\"\n ) {\n return \"service\";\n }\n return \"human\";\n}\n\nexport async function emitDomainEvent(\n invokeMutation: (reference: any, args: CreateDomainEventInput) => Promise<unknown>,\n input: CreateDomainEventInput\n): Promise<unknown> {\n return await invokeMutation(\"events:recordEvent\" as any, input);\n}\n\nconst LOCALHOST_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"::1\"]);\n\nfunction normalizeUrl(url: string): URL {\n try {\n return new URL(url.trim());\n } catch {\n throw new Error(\"Webhook URL must be a valid absolute URL.\");\n }\n}\n\nexport function assertValidWebhookUrl(url: string): string {\n const parsed = normalizeUrl(url);\n const hostname = parsed.hostname.trim().toLowerCase();\n const nodeEnv =\n typeof process !== \"undefined\" ? process.env?.NODE_ENV : undefined;\n const allowLocalHttp =\n nodeEnv === \"test\" || LOCALHOST_HOSTS.has(hostname);\n\n if (parsed.protocol !== \"https:\" && !(allowLocalHttp && parsed.protocol === \"http:\")) {\n throw new Error(\"Webhook URL must use HTTPS.\");\n }\n\n return parsed.toString();\n}\n\nexport function normalizeWebhookPatterns(patterns: readonly string[]): string[] {\n const normalized = Array.from(\n new Set(\n patterns\n .map((pattern) => pattern.trim())\n .filter((pattern) => pattern.length > 0)\n )\n );\n\n if (normalized.length === 0) {\n throw new Error(\"At least one webhook event pattern is required.\");\n }\n\n return normalized;\n}\n\nexport function assertValidWebhookSecret(secret: string): string {\n const normalized = secret.trim();\n if (normalized.length < 8) {\n throw new Error(\"Webhook secret must be at least 8 characters.\");\n }\n return normalized;\n}\n\nexport async function computeWebhookSignature(\n payload: string,\n secret: string\n): Promise<string> {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\n \"raw\",\n encoder.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(payload));\n return Array.from(new Uint8Array(signature))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nexport function nextDeliveryAttemptAt(\n currentAttemptCount: number,\n now = Date.now()\n): number | undefined {\n if (currentAttemptCount >= WEBHOOK_MAX_ATTEMPTS) {\n return undefined;\n }\n const retryIndex = currentAttemptCount - 1;\n const delay = WEBHOOK_RETRY_DELAYS_MS[retryIndex];\n return typeof delay === \"number\" ? now + delay : undefined;\n}\n\nexport function resolveDeliveryFailureStatus(\n attemptCount: number\n): WebhookDeliveryStatus {\n return attemptCount >= WEBHOOK_MAX_ATTEMPTS ? \"dead_letter\" : \"failed\";\n}\n\nexport function sanitizeWebhookRecord(\n value: Record<string, unknown>\n): WebhookRecord {\n return {\n id: String(value.id ?? value.webhookId ?? value._id ?? \"\"),\n webhookId: String(value.webhookId ?? value.id ?? value._id ?? \"\"),\n tenantId:\n typeof value.tenantId === \"string\" && value.tenantId.trim().length > 0\n ? value.tenantId\n : undefined,\n workspaceId:\n typeof value.workspaceId === \"string\" && value.workspaceId.trim().length > 0\n ? value.workspaceId\n : undefined,\n topicId:\n typeof value.topicId === \"string\" && value.topicId.trim().length > 0\n ? value.topicId\n : undefined,\n url: String(value.url ?? \"\"),\n events: Array.isArray(value.events)\n ? value.events\n .map((entry) => (typeof entry === \"string\" ? entry.trim() : \"\"))\n .filter(Boolean)\n : [],\n active: value.active !== false,\n secretConfigured: true,\n createdAt: Number(value.createdAt ?? Date.now()),\n updatedAt: Number(value.updatedAt ?? value.createdAt ?? Date.now()),\n createdBy: String(value.createdBy ?? \"\"),\n updatedBy: String(value.updatedBy ?? value.createdBy ?? \"\"),\n lastDeliveryAt:\n typeof value.lastDeliveryAt === \"number\" ? value.lastDeliveryAt : undefined,\n lastSuccessfulDeliveryAt:\n typeof value.lastSuccessfulDeliveryAt === \"number\"\n ? value.lastSuccessfulDeliveryAt\n : undefined,\n };\n}\n\nexport function truncateWebhookResponseBody(\n responseBody: string | undefined,\n maxLength = 2_000\n): string | undefined {\n if (!responseBody) {\n return undefined;\n }\n if (responseBody.length <= maxLength) {\n return responseBody;\n }\n return `${responseBody.slice(0, maxLength - 3)}...`;\n}\n"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { GatewayClientConfig, PlatformGatewaySuccess } from './coreClient.js';
|
|
2
|
+
import { EventListResult, ReplayEventsResult, WebhookRecord, WebhookTestResult, WebhookDeliveriesResult, WebhookHealthResult, EventListQuery, ReplayEventsInput, WebhookCreateInput, WebhookUpdateInput } from './events.js';
|
|
3
|
+
import './types.js';
|
|
4
|
+
import './contracts/workflow-runtime.contract.js';
|
|
5
|
+
import './contracts/lens-workflow.contract.js';
|
|
6
|
+
import './contracts/lens-filter.contract.js';
|
|
7
|
+
|
|
8
|
+
type EventsClientCoreConfig = GatewayClientConfig;
|
|
9
|
+
type EventsListResponse = PlatformGatewaySuccess<EventListResult>;
|
|
10
|
+
type EventsReplayResponse = PlatformGatewaySuccess<ReplayEventsResult>;
|
|
11
|
+
type WebhooksClientCoreConfig = GatewayClientConfig;
|
|
12
|
+
type WebhookListQuery = {
|
|
13
|
+
topicId?: string;
|
|
14
|
+
};
|
|
15
|
+
type WebhookDeliveriesQuery = {
|
|
16
|
+
limit?: number;
|
|
17
|
+
};
|
|
18
|
+
type WebhookDeleteResult = {
|
|
19
|
+
webhookId: string;
|
|
20
|
+
deleted: boolean;
|
|
21
|
+
};
|
|
22
|
+
type WebhooksCreateResponse = PlatformGatewaySuccess<WebhookRecord>;
|
|
23
|
+
type WebhooksListResponse = PlatformGatewaySuccess<{
|
|
24
|
+
webhooks: WebhookRecord[];
|
|
25
|
+
}>;
|
|
26
|
+
type WebhooksGetResponse = PlatformGatewaySuccess<WebhookRecord>;
|
|
27
|
+
type WebhooksUpdateResponse = PlatformGatewaySuccess<WebhookRecord>;
|
|
28
|
+
type WebhooksDeleteResponse = PlatformGatewaySuccess<WebhookDeleteResult>;
|
|
29
|
+
type WebhooksTestResponse = PlatformGatewaySuccess<WebhookTestResult>;
|
|
30
|
+
type WebhooksDeliveriesResponse = PlatformGatewaySuccess<WebhookDeliveriesResult>;
|
|
31
|
+
type WebhooksHealthResponse = PlatformGatewaySuccess<WebhookHealthResult>;
|
|
32
|
+
declare function createEventsClientCore(config?: EventsClientCoreConfig): {
|
|
33
|
+
list(query?: EventListQuery): Promise<EventsListResponse>;
|
|
34
|
+
replay(input: ReplayEventsInput, idempotencyKey?: string): Promise<EventsReplayResponse>;
|
|
35
|
+
};
|
|
36
|
+
declare function createWebhooksClientCore(config?: WebhooksClientCoreConfig): {
|
|
37
|
+
create(input: WebhookCreateInput, idempotencyKey?: string): Promise<WebhooksCreateResponse>;
|
|
38
|
+
list(query?: WebhookListQuery): Promise<WebhooksListResponse>;
|
|
39
|
+
get(id: string): Promise<WebhooksGetResponse>;
|
|
40
|
+
update(id: string, input: WebhookUpdateInput, idempotencyKey?: string): Promise<WebhooksUpdateResponse>;
|
|
41
|
+
delete(id: string, idempotencyKey?: string): Promise<WebhooksDeleteResponse>;
|
|
42
|
+
test(id: string, input?: {
|
|
43
|
+
topicId?: string;
|
|
44
|
+
}, idempotencyKey?: string): Promise<WebhooksTestResponse>;
|
|
45
|
+
deliveries(id: string, query?: WebhookDeliveriesQuery): Promise<WebhooksDeliveriesResponse>;
|
|
46
|
+
health(id: string): Promise<WebhooksHealthResponse>;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { type EventsClientCoreConfig, type EventsListResponse, type EventsReplayResponse, type WebhookDeleteResult, type WebhookDeliveriesQuery, type WebhookListQuery, type WebhooksClientCoreConfig, type WebhooksCreateResponse, type WebhooksDeleteResponse, type WebhooksDeliveriesResponse, type WebhooksGetResponse, type WebhooksHealthResponse, type WebhooksListResponse, type WebhooksTestResponse, type WebhooksUpdateResponse, createEventsClientCore, createWebhooksClientCore };
|