mcp-event-intelligence 0.8.2 → 0.9.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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.0] - 2026-10-05
4
+
5
+ ### Runtime-neutral observability
6
+
7
+ - add the public `mcp-event-intelligence/observability` surface for structured operational `ei.*` events;
8
+ - cover lifecycle, MCP/event-source health, trigger mutations, matches, wake delivery, retry/dead-letter and scheduler failures;
9
+ - keep observability best-effort and non-blocking so slow or failing telemetry sinks cannot change Event Intelligence execution semantics;
10
+ - defensively exclude event payloads, evidence, continuation instructions and credential-like metadata from operational events;
11
+ - keep audit and observability separate: the audit chain remains durable and tamper-evident while observability stays host-owned and ephemeral.
12
+
13
+ ### Host conformance
14
+
15
+ - add the public `mcp-event-intelligence/conformance` runner with a six-method runtime-neutral host adapter contract;
16
+ - emit machine-readable `event-intelligence.host-conformance.v1` reports;
17
+ - verify threshold/one-shot behavior, replay deduplication on persistent triggers, restart durability, bounded `maxFirings`, required observability and payload non-leakage;
18
+ - add a real embedded reference host and `npm run conformance:host`;
19
+ - document the integration contract without introducing Muffin, Artemis, OpenAI, Anthropic or logger-vendor adapters into EI core.
20
+
21
+
3
22
  ## [0.8.2] - 2026-10-05
4
23
 
5
24
  ### Embedded integration
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![CI](https://github.com/sarooo17/event-intelligence/actions/workflows/ci.yml/badge.svg)](https://github.com/sarooo17/event-intelligence/actions/workflows/ci.yml)
6
6
  [![npm](https://img.shields.io/npm/v/mcp-event-intelligence.svg)](https://www.npmjs.com/package/mcp-event-intelligence)
7
- [![MCP Registry](https://img.shields.io/badge/MCP%20Registry-v0.8.2-5b5bd6)](https://registry.modelcontextprotocol.io/?q=io.github.sarooo17%2Fevent-intelligence)
7
+ [![MCP Registry](https://img.shields.io/badge/MCP%20Registry-v0.9.0-5b5bd6)](https://registry.modelcontextprotocol.io/?q=io.github.sarooo17%2Fevent-intelligence)
8
8
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](LICENSE)
9
9
 
10
10
  MCP Event Intelligence is an experimental event runtime for agents that need to react to **future conditions over multiple event sources** without keeping an LLM or agent loop alive.
@@ -0,0 +1,59 @@
1
+ # Host conformance
2
+
3
+ Event Intelligence ships two separate conformance layers.
4
+
5
+ ## Runtime contract conformance
6
+
7
+ The existing fixtures and regression suite validate EI's own protocol, Pattern,
8
+ storage, audit and MCP Events boundaries.
9
+
10
+ A conforming EI adapter must preserve canonical schemas, stable event identity,
11
+ source evidence, lifecycle correctness, replay deduplication, hash-linked audit
12
+ history and the rule that external event data is evidence rather than
13
+ authorization.
14
+
15
+ Run the full internal suite with:
16
+
17
+ ```bash
18
+ npm run check
19
+ ```
20
+
21
+ ## Embedded host conformance
22
+
23
+ The public `mcp-event-intelligence/conformance` entry point validates an
24
+ embedding runtime without teaching EI about that runtime.
25
+
26
+ Implement `createHarness({ observability })` and return six operations:
27
+
28
+ - `createTrigger()`
29
+ - `emitEvent()`
30
+ - `deliveries()`
31
+ - `restart()`
32
+ - `inspectTrigger()`
33
+ - `close()`
34
+
35
+ Then run:
36
+
37
+ ```js
38
+ import { runHostConformance } from 'mcp-event-intelligence/conformance';
39
+
40
+ const report = await runHostConformance(myRuntimeAdapter, {
41
+ throwOnFailure: true,
42
+ });
43
+ ```
44
+
45
+ Core v1 checks cover one-shot delivery, replay deduplication, restart
46
+ persistence, bounded `maxFirings`, and required structured observability
47
+ (`ei.trigger.created`, `ei.match.matched`, `ei.wake.delivered`).
48
+
49
+ The scenarios are intentionally isolated and synthetic. Do not point the
50
+ conformance harness at production continuations or production event sources.
51
+
52
+ The repository reference adapter can be run with:
53
+
54
+ ```bash
55
+ npm run conformance:host
56
+ ```
57
+
58
+ The MCP Events draft remains upstream and experimental. These checks certify
59
+ Event Intelligence host behavior, not official MCP conformance.
@@ -0,0 +1,70 @@
1
+ {
2
+ "protocolVersion": "0.2.0",
3
+ "schemaVersion": "trigger.v0.2",
4
+ "triggerId": "issue-and-pippo-mail",
5
+ "version": "1",
6
+ "description": "Wake only when an issue exists and Pippo sends a related email.",
7
+ "clauses": [
8
+ {
9
+ "id": "issue",
10
+ "event": "github.issue.opened",
11
+ "where": [
12
+ {
13
+ "path": "repository",
14
+ "op": "eq",
15
+ "value": "acme/app"
16
+ }
17
+ ]
18
+ },
19
+ {
20
+ "id": "mail",
21
+ "event": "email.received",
22
+ "where": [
23
+ {
24
+ "path": "from",
25
+ "op": "eq",
26
+ "value": "pippo@example.com"
27
+ }
28
+ ]
29
+ }
30
+ ],
31
+ "pattern": {
32
+ "version": "2",
33
+ "root": {
34
+ "kind": "semantic",
35
+ "id": "same-problem",
36
+ "refs": [
37
+ "issue",
38
+ "mail"
39
+ ],
40
+ "instruction": "The email concerns the GitHub issue.",
41
+ "input": [
42
+ "issue.title",
43
+ "mail.subject",
44
+ "mail.bodyPreview"
45
+ ],
46
+ "matchThreshold": 0.8,
47
+ "rejectThreshold": 0.2,
48
+ "uncertain": "escalate",
49
+ "child": {
50
+ "kind": "allOf",
51
+ "children": [
52
+ {
53
+ "kind": "event",
54
+ "ref": "issue"
55
+ },
56
+ {
57
+ "kind": "event",
58
+ "ref": "mail"
59
+ }
60
+ ]
61
+ }
62
+ }
63
+ },
64
+ "withinMs": 86400000,
65
+ "target": {
66
+ "runtime": "runtime-probe",
67
+ "kind": "task",
68
+ "id": "issue-report"
69
+ }
70
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "protocol": "mcp-event-intelligence",
3
+ "protocolVersion": "0.1.0",
4
+ "schemaVersion": "ei.v0.1",
5
+ "traceId": "trace_fixture_001",
6
+ "environmentId": "env_test",
7
+ "subscriptionId": "sub_fixture",
8
+ "sourceEventId": "evt_fixture",
9
+ "observedAt": "2026-09-18T06:30:00.000Z",
10
+ "source": {
11
+ "serverId": "github-mcp",
12
+ "transport": "webhook",
13
+ "provider": "github",
14
+ "cursor": null
15
+ },
16
+ "target": {
17
+ "runtime": "openai-agents",
18
+ "kind": "session",
19
+ "id": "session_fixture"
20
+ },
21
+ "event": {
22
+ "name": "issue.opened",
23
+ "occurredAt": "2026-09-18T06:29:59.000Z",
24
+ "payloadHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
25
+ }
26
+ }
@@ -0,0 +1,145 @@
1
+ import { mkdtemp, rm } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { createEventIntelligenceHost } from '../scripts/host-integration.mjs';
5
+ import { runHostConformance } from '../scripts/host-conformance.mjs';
6
+
7
+ export const referenceHostAdapter = {
8
+ name: 'event-intelligence-reference-host',
9
+
10
+ async createHarness({ observability }) {
11
+ const dataDir = await mkdtemp(path.join(os.tmpdir(), 'ei-host-conformance-'));
12
+ const externalDeliveries = [];
13
+ let host = null;
14
+
15
+ const start = async () => {
16
+ host = await createEventIntelligenceHost({
17
+ dataDir,
18
+ observability,
19
+ env: {
20
+ TYPESAFE_API_KEY: '',
21
+ RUNTIME_WAKE_TARGETS_JSON: '{}',
22
+ TEMPORAL_TICK_MS: '100000',
23
+ WAKE_RETRY_TICK_MS: '100000',
24
+ },
25
+ wake: async (packet, activation) => {
26
+ const runtimeReceiptId = `conformance:${packet.wake_id}`;
27
+ externalDeliveries.push({
28
+ triggerId: activation.trigger.triggerId,
29
+ wakeId: packet.wake_id,
30
+ runtimeReceiptId,
31
+ });
32
+ return { runtimeReceiptId };
33
+ },
34
+ });
35
+ };
36
+
37
+ await start();
38
+
39
+ await host.triggerControl.registerEventSource({
40
+ sourceId: 'conformance:value-changed',
41
+ connectionId: 'conformance-connection',
42
+ serverId: 'conformance',
43
+ eventName: 'conformance.value.changed',
44
+ delivery: ['poll'],
45
+ payloadSchema: {
46
+ type: 'object',
47
+ additionalProperties: false,
48
+ required: ['value'],
49
+ properties: {
50
+ value: { type: 'number' },
51
+ secretProbe: { type: 'string' },
52
+ },
53
+ },
54
+ enabled: true,
55
+ }, {
56
+ type: 'system',
57
+ principal_id: 'host-conformance',
58
+ });
59
+
60
+ return {
61
+ async createTrigger({
62
+ triggerId,
63
+ threshold,
64
+ oneShot,
65
+ maxFirings,
66
+ }) {
67
+ const planned = await host.planTrigger({
68
+ triggerId,
69
+ events: [{
70
+ id: 'value',
71
+ event: 'conformance.value.changed',
72
+ serverId: 'conformance',
73
+ where: [{
74
+ path: 'value',
75
+ op: 'gt',
76
+ value: threshold,
77
+ }],
78
+ }],
79
+ lifecycle: {
80
+ oneShot,
81
+ ...(maxFirings === undefined ? {} : { maxFirings }),
82
+ },
83
+ target: {
84
+ runtime: 'conformance-host',
85
+ kind: 'task',
86
+ id: triggerId,
87
+ },
88
+ continuation: {
89
+ instruction: 'Continue the isolated Event Intelligence conformance scenario.',
90
+ },
91
+ });
92
+
93
+ await host.triggerControl.createTrigger({
94
+ definition: planned.definition,
95
+ connectionIds: planned.connectionIds,
96
+ actor: { type: 'user', principal_id: 'host-conformance-user' },
97
+ owner: { type: 'user', principal_id: 'host-conformance-user' },
98
+ });
99
+ },
100
+
101
+ async emitEvent({ eventId, value, secretProbe }) {
102
+ await host.runtime.compositeEventConsumer.ingestCorrelatable({
103
+ traceId: `conformance:${eventId}`,
104
+ sourceEventId: eventId,
105
+ name: 'conformance.value.changed',
106
+ serverId: 'conformance',
107
+ provider: 'conformance',
108
+ occurredAt: new Date().toISOString(),
109
+ data: {
110
+ value,
111
+ ...(secretProbe ? { secretProbe } : {}),
112
+ },
113
+ });
114
+ },
115
+
116
+ deliveries() {
117
+ return [...externalDeliveries];
118
+ },
119
+
120
+ async restart() {
121
+ await host.close();
122
+ await start();
123
+ },
124
+
125
+ async inspectTrigger(triggerId) {
126
+ const rows = await host.triggerControl.listTriggers();
127
+ const entry = rows.find(
128
+ (candidate) => candidate.definition.triggerId === triggerId,
129
+ );
130
+ return entry?.state ?? null;
131
+ },
132
+
133
+ async close() {
134
+ await host?.close();
135
+ await rm(dataDir, { recursive: true, force: true });
136
+ },
137
+ };
138
+ },
139
+ };
140
+
141
+ if (import.meta.url === `file://${process.argv[1]}`) {
142
+ const report = await runHostConformance(referenceHostAdapter);
143
+ console.log(JSON.stringify(report, null, 2));
144
+ if (!report.passed) process.exitCode = 1;
145
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-event-intelligence",
3
- "version": "0.8.2",
3
+ "version": "0.9.0",
4
4
  "description": "MCP-native complex event processing for durable agent workflows: event-time patterns, semantic predicates, derived events, and targeted wakeups.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -26,6 +26,14 @@
26
26
  "./embedded": {
27
27
  "types": "./scripts/embedded-host-kit.d.mts",
28
28
  "import": "./scripts/embedded-host-kit.mjs"
29
+ },
30
+ "./observability": {
31
+ "types": "./scripts/lib/observability.d.mts",
32
+ "import": "./scripts/lib/observability.mjs"
33
+ },
34
+ "./conformance": {
35
+ "types": "./scripts/host-conformance.d.mts",
36
+ "import": "./scripts/host-conformance.mjs"
29
37
  }
30
38
  },
31
39
  "bin": {
@@ -47,7 +55,10 @@
47
55
  "scripts/host-integration.d.mts",
48
56
  "scripts/run-tests.mjs",
49
57
  "scripts/embedded-host-kit.mjs",
50
- "scripts/embedded-host-kit.d.mts"
58
+ "scripts/embedded-host-kit.d.mts",
59
+ "scripts/host-conformance.mjs",
60
+ "scripts/host-conformance.d.mts",
61
+ "conformance/"
51
62
  ],
52
63
  "scripts": {
53
64
  "build": "tsc -p tsconfig.json",
@@ -64,7 +75,8 @@
64
75
  "conformance:pattern-v2": "npm run build && node scripts/evidence/pattern-v2-conformance.mjs",
65
76
  "bench:pattern-v2": "npm run build && node scripts/evidence/pattern-v2-benchmark.mjs --profile quick",
66
77
  "evidence:pattern-v2": "npm run build && node scripts/evidence/pattern-v2-conformance.mjs && node scripts/evidence/pattern-v2-benchmark.mjs --profile quick",
67
- "prepare": "npm run build"
78
+ "prepare": "npm run build",
79
+ "conformance:host": "npm run build && node conformance/reference-host.mjs"
68
80
  },
69
81
  "keywords": [
70
82
  "mcp",
@@ -903,6 +903,7 @@ export async function createEmbeddedEventIntelligence({
903
903
  mcp,
904
904
  mcpClients = [],
905
905
  semanticEvaluator,
906
+ observability,
906
907
  activation,
907
908
  wake,
908
909
  wakeHandlers = {},
@@ -932,6 +933,7 @@ export async function createEmbeddedEventIntelligence({
932
933
  mcpRegistry: registry,
933
934
  mcpClients,
934
935
  semanticEvaluator,
936
+ observability,
935
937
  ...(wakeHandler ? { wake: wakeHandler } : {}),
936
938
  wakeHandlers,
937
939
  });
@@ -983,6 +985,7 @@ export async function createEmbeddedRuntimeIntegration({
983
985
  eventSources,
984
986
  mcpClients = [],
985
987
  semanticEvaluator,
988
+ observability,
986
989
  activation,
987
990
  wake,
988
991
  wakeHandlers = {},
@@ -1042,6 +1045,7 @@ export async function createEmbeddedRuntimeIntegration({
1042
1045
  : {}),
1043
1046
  mcpClients,
1044
1047
  semanticEvaluator,
1048
+ observability,
1045
1049
  activation,
1046
1050
  wake,
1047
1051
  wakeHandlers,
@@ -0,0 +1,75 @@
1
+ import type {
2
+ EventIntelligenceObservabilityEvent,
3
+ } from './lib/observability.d.mts';
4
+
5
+ export interface HostConformanceTriggerInput {
6
+ triggerId: string;
7
+ threshold: number;
8
+ oneShot: boolean;
9
+ maxFirings?: number;
10
+ }
11
+
12
+ export interface HostConformanceEventInput {
13
+ eventId: string;
14
+ value: number;
15
+ secretProbe?: string;
16
+ }
17
+
18
+ export interface HostConformanceDelivery {
19
+ triggerId: string;
20
+ wakeId?: string;
21
+ runtimeReceiptId?: string;
22
+ [key: string]: unknown;
23
+ }
24
+
25
+ export interface HostConformanceHarness {
26
+ createTrigger(input: HostConformanceTriggerInput): Promise<void>;
27
+ emitEvent(input: HostConformanceEventInput): Promise<void>;
28
+ deliveries(): Promise<readonly HostConformanceDelivery[]> | readonly HostConformanceDelivery[];
29
+ restart(): Promise<void>;
30
+ inspectTrigger(triggerId: string): Promise<{
31
+ status?: string;
32
+ fireCount?: number;
33
+ [key: string]: unknown;
34
+ } | null>;
35
+ close(): Promise<void>;
36
+ }
37
+
38
+ export interface HostConformanceAdapter {
39
+ name?: string;
40
+ createHarness(input: {
41
+ observability(event: EventIntelligenceObservabilityEvent): void;
42
+ }): Promise<HostConformanceHarness> | HostConformanceHarness;
43
+ }
44
+
45
+ export interface HostConformanceResult {
46
+ id: string;
47
+ status: 'pass' | 'fail';
48
+ durationMs: number;
49
+ detail?: unknown;
50
+ error?: string;
51
+ }
52
+
53
+ export interface HostConformanceReport {
54
+ schema: 'event-intelligence.host-conformance.v1' | string;
55
+ adapter: string;
56
+ passed: boolean;
57
+ summary: {
58
+ total: number;
59
+ passed: number;
60
+ failed: number;
61
+ };
62
+ results: readonly HostConformanceResult[];
63
+ observability: {
64
+ captured: number;
65
+ eventNames: readonly string[];
66
+ };
67
+ }
68
+
69
+ export const HOST_CONFORMANCE_REPORT_SCHEMA:
70
+ 'event-intelligence.host-conformance.v1';
71
+
72
+ export function runHostConformance(
73
+ adapter: HostConformanceAdapter,
74
+ options?: { throwOnFailure?: boolean },
75
+ ): Promise<HostConformanceReport>;