@kraken-e2e/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.
Files changed (50) hide show
  1. package/LICENSE +674 -0
  2. package/dist/ctk.d.ts +57 -0
  3. package/dist/ctk.d.ts.map +1 -0
  4. package/dist/ctk.js +137 -0
  5. package/dist/ctk.js.map +1 -0
  6. package/dist/event-bus.d.ts +21 -0
  7. package/dist/event-bus.d.ts.map +1 -0
  8. package/dist/event-bus.js +55 -0
  9. package/dist/event-bus.js.map +1 -0
  10. package/dist/event-schemas.d.ts +13 -0
  11. package/dist/event-schemas.d.ts.map +1 -0
  12. package/dist/event-schemas.js +202 -0
  13. package/dist/event-schemas.js.map +1 -0
  14. package/dist/host.d.ts +10 -0
  15. package/dist/host.d.ts.map +1 -0
  16. package/dist/host.js +23 -0
  17. package/dist/host.js.map +1 -0
  18. package/dist/index.d.ts +19 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +19 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/logger.d.ts +16 -0
  23. package/dist/logger.d.ts.map +1 -0
  24. package/dist/logger.js +13 -0
  25. package/dist/logger.js.map +1 -0
  26. package/dist/registry.d.ts +50 -0
  27. package/dist/registry.d.ts.map +1 -0
  28. package/dist/registry.js +244 -0
  29. package/dist/registry.js.map +1 -0
  30. package/dist/runner.d.ts +60 -0
  31. package/dist/runner.d.ts.map +1 -0
  32. package/dist/runner.js +363 -0
  33. package/dist/runner.js.map +1 -0
  34. package/dist/scenario.d.ts +25 -0
  35. package/dist/scenario.d.ts.map +1 -0
  36. package/dist/scenario.js +85 -0
  37. package/dist/scenario.js.map +1 -0
  38. package/dist/scheduler.d.ts +87 -0
  39. package/dist/scheduler.d.ts.map +1 -0
  40. package/dist/scheduler.js +190 -0
  41. package/dist/scheduler.js.map +1 -0
  42. package/dist/testing/fake-driver.d.ts +54 -0
  43. package/dist/testing/fake-driver.d.ts.map +1 -0
  44. package/dist/testing/fake-driver.js +209 -0
  45. package/dist/testing/fake-driver.js.map +1 -0
  46. package/dist/testing/index.d.ts +2 -0
  47. package/dist/testing/index.d.ts.map +1 -0
  48. package/dist/testing/index.js +2 -0
  49. package/dist/testing/index.js.map +1 -0
  50. package/package.json +53 -0
package/dist/ctk.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ import { type CoreOperation, type TargetLocator, type UserSession } from '@kraken-e2e/contracts';
2
+ export interface CtkFixture {
3
+ /** An element that can be tapped without navigating away. */
4
+ readonly tappable: TargetLocator;
5
+ /** A text input to type into. */
6
+ readonly typable: TargetLocator;
7
+ /**
8
+ * Where the typed value can be read back. Defaults to `typable`; real apps
9
+ * often mirror input into a label (platforms differ on reading TextField
10
+ * values directly — e.g. native-demo-app's '~input-text-result').
11
+ */
12
+ readonly typableEcho?: TargetLocator;
13
+ /** A visible element with known text. */
14
+ readonly readable: {
15
+ readonly target: TargetLocator;
16
+ readonly expected: string;
17
+ };
18
+ /** Destination for navigate() (URL / deep link / fake route). */
19
+ readonly navigateTo?: string;
20
+ }
21
+ export type CtkOperationOutcome = {
22
+ readonly status: 'supported';
23
+ } | {
24
+ readonly status: 'unsupported';
25
+ readonly reason: string;
26
+ } | {
27
+ readonly status: 'failing';
28
+ readonly error: string;
29
+ };
30
+ export interface ParityReport {
31
+ readonly driver: string;
32
+ readonly generatedAt: string;
33
+ readonly operations: Readonly<Record<CoreOperation, CtkOperationOutcome>>;
34
+ }
35
+ export interface CtkOptions {
36
+ readonly name: string;
37
+ /** Fresh session per operation; the CTK disposes it. */
38
+ readonly createSession: () => Promise<UserSession>;
39
+ readonly fixture: CtkFixture;
40
+ /** Where parity-report.json is written (the C3 artifact). */
41
+ readonly reportPath: string;
42
+ /** Reasons for ops the driver declares unsupported (rendered in the report). */
43
+ readonly unsupportedReasons?: Partial<Record<CoreOperation, string>>;
44
+ /**
45
+ * Runs after each createSession, before the operation is exercised — e.g.
46
+ * navigate to the screen holding the fixture elements ('tap the Forms tab').
47
+ */
48
+ readonly prepare?: (session: UserSession) => Promise<void>;
49
+ }
50
+ export declare function describeDriverConformance(options: CtkOptions): void;
51
+ /**
52
+ * The M1 exit-gate comparison (ADR-0001 §5.4): zero failing entries on both
53
+ * sides and an empty diff between supported-op sets. Returns human-readable
54
+ * problems; empty array = parity.
55
+ */
56
+ export declare function compareParityReports(a: ParityReport, b: ParityReport): readonly string[];
57
+ //# sourceMappingURL=ctk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctk.d.ts","sourceRoot":"","sources":["../src/ctk.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,aAAa,EAClB,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;IACrC,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACjF,iEAAiE;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;IACrE;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAoDD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAyDnE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAqBxF"}
package/dist/ctk.js ADDED
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Conformance Test Kit (ADR-0001 §5.4 guardrail 2, ADR-0002 D8): exercises
3
+ * every core operation against a driver + fixture and emits parity-report.json.
4
+ * Parity is a GENERATED artifact: M1 closes only with zero `failing` entries
5
+ * on both mobile platforms AND an empty diff between their supported-op sets
6
+ * (symmetric unsupported(reason) allowed; asymmetric needs recorded sign-off).
7
+ *
8
+ * Uses vitest (optional peer — same pattern as @kraken-e2e/signaling/conformance).
9
+ */
10
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
11
+ import { dirname } from 'node:path';
12
+ import { CORE_OPERATIONS, KrakenError, } from '@kraken-e2e/contracts';
13
+ import { afterAll, describe, expect, it } from 'vitest';
14
+ async function exercise(op, session, fixture) {
15
+ switch (op) {
16
+ case 'tap':
17
+ return session.tap(fixture.tappable);
18
+ case 'typeText': {
19
+ await session.typeText(fixture.typable, 'kraken-ctk');
20
+ const echoed = await session.readText(fixture.typableEcho ?? fixture.typable);
21
+ expect(echoed).toBe('kraken-ctk');
22
+ return;
23
+ }
24
+ case 'readText': {
25
+ const text = await session.readText(fixture.readable.target);
26
+ expect(text).toBe(fixture.readable.expected);
27
+ return;
28
+ }
29
+ case 'waitFor':
30
+ return session.waitFor(fixture.readable.target, 'visible', { timeoutMs: 5_000 });
31
+ case 'isDisplayed': {
32
+ expect(await session.isDisplayed(fixture.readable.target)).toBe(true);
33
+ return;
34
+ }
35
+ case 'scrollIntoView':
36
+ return session.scrollIntoView(fixture.readable.target);
37
+ case 'pressKey':
38
+ return session.pressKey('enter');
39
+ case 'navigate':
40
+ return session.navigate(fixture.navigateTo ?? 'ctk://noop');
41
+ case 'screenshot': {
42
+ const artifact = await session.screenshot();
43
+ expect(artifact.kind).toBe('screenshot');
44
+ expect(existsSync(artifact.path)).toBe(true);
45
+ return;
46
+ }
47
+ case 'source': {
48
+ const source = await session.source();
49
+ expect(source.length).toBeGreaterThan(0);
50
+ return;
51
+ }
52
+ case 'dispose': {
53
+ await session.dispose();
54
+ await session.dispose(); // idempotency is part of the contract
55
+ return;
56
+ }
57
+ }
58
+ }
59
+ export function describeDriverConformance(options) {
60
+ const outcomes = new Map();
61
+ describe(`Driver conformance (CTK): ${options.name}`, () => {
62
+ for (const op of CORE_OPERATIONS) {
63
+ it(`operation: ${op}`, async () => {
64
+ const session = await options.createSession();
65
+ try {
66
+ await options.prepare?.(session);
67
+ if (session.capabilities[op] === 'unsupported') {
68
+ // A declared-unsupported op must throw the canonical error — visible
69
+ // parity, never silent absence (ADR-0001 §5.4).
70
+ const reason = options.unsupportedReasons?.[op] ?? 'declared unsupported (no reason given)';
71
+ if (op !== 'dispose') {
72
+ await expect(exercise(op, session, options.fixture)).rejects.toSatisfy((error) => KrakenError.is(error) && error.code === 'KRK-SESSION-OP-UNSUPPORTED');
73
+ }
74
+ outcomes.set(op, { status: 'unsupported', reason });
75
+ return;
76
+ }
77
+ await exercise(op, session, options.fixture);
78
+ outcomes.set(op, { status: 'supported' });
79
+ }
80
+ catch (error) {
81
+ outcomes.set(op, {
82
+ status: 'failing',
83
+ error: error instanceof Error ? error.message : String(error),
84
+ });
85
+ throw error; // an op must pass OR be declared unsupported — never fail silently
86
+ }
87
+ finally {
88
+ try {
89
+ await session.dispose();
90
+ }
91
+ catch {
92
+ // dispose problems surface in the dispose op's own test
93
+ }
94
+ }
95
+ });
96
+ }
97
+ afterAll(() => {
98
+ const operations = Object.fromEntries(CORE_OPERATIONS.map((op) => [
99
+ op,
100
+ outcomes.get(op) ?? { status: 'failing', error: 'not exercised' },
101
+ ]));
102
+ const report = {
103
+ driver: options.name,
104
+ generatedAt: new Date().toISOString(),
105
+ operations,
106
+ };
107
+ mkdirSync(dirname(options.reportPath), { recursive: true });
108
+ writeFileSync(options.reportPath, `${JSON.stringify(report, null, 2)}\n`);
109
+ });
110
+ });
111
+ }
112
+ /**
113
+ * The M1 exit-gate comparison (ADR-0001 §5.4): zero failing entries on both
114
+ * sides and an empty diff between supported-op sets. Returns human-readable
115
+ * problems; empty array = parity.
116
+ */
117
+ export function compareParityReports(a, b) {
118
+ const problems = [];
119
+ for (const op of CORE_OPERATIONS) {
120
+ const left = a.operations[op];
121
+ const right = b.operations[op];
122
+ if (left.status === 'failing')
123
+ problems.push(`${a.driver}: ${op} is failing (${left.error})`);
124
+ if (right.status === 'failing')
125
+ problems.push(`${b.driver}: ${op} is failing (${right.error})`);
126
+ const leftSupported = left.status === 'supported';
127
+ const rightSupported = right.status === 'supported';
128
+ if (leftSupported !== rightSupported &&
129
+ left.status !== 'failing' &&
130
+ right.status !== 'failing') {
131
+ problems.push(`asymmetric support for ${op}: ${a.driver}=${left.status}, ${b.driver}=${right.status} ` +
132
+ '(requires recorded human sign-off — ADR-0001 §5.4)');
133
+ }
134
+ }
135
+ return problems;
136
+ }
137
+ //# sourceMappingURL=ctk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ctk.js","sourceRoot":"","sources":["../src/ctk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { KrakenEvent, KrakenEventInput, Reporter } from '@kraken-e2e/contracts';
2
+ export interface EventSink {
3
+ emit(input: KrakenEventInput): KrakenEvent;
4
+ }
5
+ /**
6
+ * Stamps the envelope ({ts, runId, seq} — seq monotonic per run) and fans out
7
+ * to reporters (ADR-0002 D5). Reporter errors are contained: reported once via
8
+ * onReporterError, never allowed to fail the run.
9
+ */
10
+ export declare class EventBus implements EventSink {
11
+ #private;
12
+ readonly runId: string;
13
+ constructor(runId: string, options?: {
14
+ onReporterError?: (reporterId: string, error: unknown) => void;
15
+ });
16
+ subscribe(reporter: Reporter): void;
17
+ emit(input: KrakenEventInput): KrakenEvent;
18
+ /** Awaits every reporter's chain and flush() — call once at run end. */
19
+ flush(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIrF,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW,CAAC;CAC5C;AAQD;;;;GAIG;AACH,qBAAa,QAAS,YAAW,SAAS;;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAOrB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;KAAO;IAMlF,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAInC,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,WAAW;IAuB1C,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B"}
@@ -0,0 +1,55 @@
1
+ import { validateEvent } from './event-schemas.js';
2
+ /**
3
+ * Stamps the envelope ({ts, runId, seq} — seq monotonic per run) and fans out
4
+ * to reporters (ADR-0002 D5). Reporter errors are contained: reported once via
5
+ * onReporterError, never allowed to fail the run.
6
+ */
7
+ export class EventBus {
8
+ runId;
9
+ #seq = 0;
10
+ #subscriptions = [];
11
+ #onReporterError;
12
+ #failed = new Set();
13
+ constructor(runId, options = {}) {
14
+ this.runId = runId;
15
+ this.#onReporterError = options.onReporterError ?? (() => { });
16
+ }
17
+ subscribe(reporter) {
18
+ this.#subscriptions.push({ reporter, chain: Promise.resolve() });
19
+ }
20
+ emit(input) {
21
+ this.#seq += 1;
22
+ const event = {
23
+ ...input,
24
+ ts: Date.now(),
25
+ runId: this.runId,
26
+ seq: this.#seq,
27
+ };
28
+ validateEvent(event);
29
+ for (const subscription of this.#subscriptions) {
30
+ subscription.chain = subscription.chain
31
+ .then(() => subscription.reporter.onEvent(event))
32
+ .catch((error) => {
33
+ // Report each reporter's first failure once; keep the stream flowing.
34
+ if (!this.#failed.has(subscription.reporter.id)) {
35
+ this.#failed.add(subscription.reporter.id);
36
+ this.#onReporterError(subscription.reporter.id, error);
37
+ }
38
+ });
39
+ }
40
+ return event;
41
+ }
42
+ /** Awaits every reporter's chain and flush() — call once at run end. */
43
+ async flush() {
44
+ await Promise.all(this.#subscriptions.map((subscription) => subscription.chain));
45
+ await Promise.all(this.#subscriptions.map(async (subscription) => {
46
+ try {
47
+ await subscription.reporter.flush?.();
48
+ }
49
+ catch (error) {
50
+ this.#onReporterError(subscription.reporter.id, error);
51
+ }
52
+ }));
53
+ }
54
+ }
55
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYnD;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IACV,KAAK,CAAS;IACvB,IAAI,GAAG,CAAC,CAAC;IACA,cAAc,GAAmB,EAAE,CAAC;IACpC,gBAAgB,CAA+C;IAC/D,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,YACE,KAAa,EACb,UAA8E,EAAE;QAEhF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,CAAC,QAAkB;QAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,KAAuB;QAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QACf,MAAM,KAAK,GAAG;YACZ,GAAG,KAAK;YACR,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,IAAI;SACA,CAAC;QACjB,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/C,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK;iBACpC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAChD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,sEAAsE;gBACtE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,KAAK;QACT,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;YAC7C,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Runtime validation of the KrakenEvent stream (ADR-0002 D5). zod lives HERE,
3
+ * inside core, and never appears in any public .d.ts (ADR-0001 §5.3): the
4
+ * public surface is the plain TS types in @kraken-e2e/contracts plus the generated
5
+ * JSON Schema. The committed JSON-Schema snapshot test is the additive-only
6
+ * evolution guard (ADR-0001 §5.12).
7
+ */
8
+ import { type KrakenEvent } from '@kraken-e2e/contracts';
9
+ /** Throws with a precise message when core emits a malformed event (a core bug). */
10
+ export declare function validateEvent(event: KrakenEvent): void;
11
+ /** The public, consumer-facing schema (future GUI, external tooling). */
12
+ export declare function krakenEventJsonSchema(): Record<string, unknown>;
13
+ //# sourceMappingURL=event-schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-schemas.d.ts","sourceRoot":"","sources":["../src/event-schemas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA8LtE,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAStD;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/D"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Runtime validation of the KrakenEvent stream (ADR-0002 D5). zod lives HERE,
3
+ * inside core, and never appears in any public .d.ts (ADR-0001 §5.3): the
4
+ * public surface is the plain TS types in @kraken-e2e/contracts plus the generated
5
+ * JSON Schema. The committed JSON-Schema snapshot test is the additive-only
6
+ * evolution guard (ADR-0001 §5.12).
7
+ */
8
+ import { KrakenError } from '@kraken-e2e/contracts';
9
+ import { z } from 'zod';
10
+ const base = {
11
+ ts: z.number(),
12
+ runId: z.string().min(1),
13
+ seq: z.number().int().positive(),
14
+ };
15
+ const serializedError = z
16
+ .object({
17
+ code: z.string(),
18
+ message: z.string(),
19
+ fix: z.string().optional(),
20
+ data: z.record(z.string(), z.unknown()).optional(),
21
+ })
22
+ .strict();
23
+ const stepStatus = z.enum(['passed', 'failed', 'skipped']);
24
+ const actorSummary = z
25
+ .object({ id: z.string(), platform: z.string(), driverId: z.string() })
26
+ .strict();
27
+ const artifactKind = z.enum(['screenshot', 'log', 'video', 'source']);
28
+ const logLevel = z.enum(['debug', 'info', 'warn', 'error']);
29
+ // One schema per event type. Additive-only: new OPTIONAL fields at most; a
30
+ // semantic change is a NEW event type (cucumber-messages model).
31
+ // Module-private: zod must never leak into a public surface (ADR-0001 §5.3).
32
+ const krakenEventSchema = z.discriminatedUnion('type', [
33
+ z
34
+ .object({
35
+ type: z.literal('runStarted'),
36
+ ...base,
37
+ protocol: z.literal(1),
38
+ scenarioCount: z.number().int().nonnegative(),
39
+ })
40
+ .strict(),
41
+ z
42
+ .object({
43
+ type: z.literal('runFinished'),
44
+ ...base,
45
+ status: z.enum(['passed', 'failed']),
46
+ durationMs: z.number().nonnegative(),
47
+ })
48
+ .strict(),
49
+ z
50
+ .object({
51
+ type: z.literal('scenarioStarted'),
52
+ ...base,
53
+ scenarioId: z.string(),
54
+ name: z.string(),
55
+ featureUri: z.string().optional(),
56
+ actors: z.array(actorSummary),
57
+ })
58
+ .strict(),
59
+ z
60
+ .object({
61
+ type: z.literal('scenarioFinished'),
62
+ ...base,
63
+ scenarioId: z.string(),
64
+ status: stepStatus,
65
+ durationMs: z.number().nonnegative(),
66
+ error: serializedError.optional(),
67
+ })
68
+ .strict(),
69
+ z
70
+ .object({
71
+ type: z.literal('stepStarted'),
72
+ ...base,
73
+ scenarioId: z.string(),
74
+ stepId: z.string(),
75
+ actorId: z.string(),
76
+ text: z.string(),
77
+ })
78
+ .strict(),
79
+ z
80
+ .object({
81
+ type: z.literal('stepFinished'),
82
+ ...base,
83
+ scenarioId: z.string(),
84
+ stepId: z.string(),
85
+ actorId: z.string(),
86
+ text: z.string(),
87
+ status: stepStatus,
88
+ durationMs: z.number().nonnegative(),
89
+ error: serializedError.optional(),
90
+ })
91
+ .strict(),
92
+ z
93
+ .object({
94
+ type: z.literal('actorSessionStarted'),
95
+ ...base,
96
+ scenarioId: z.string(),
97
+ actorId: z.string(),
98
+ driverId: z.string(),
99
+ platformLabel: z.string(),
100
+ })
101
+ .strict(),
102
+ z
103
+ .object({
104
+ type: z.literal('actorSessionFinished'),
105
+ ...base,
106
+ scenarioId: z.string(),
107
+ actorId: z.string(),
108
+ status: z.enum(['ok', 'failed']),
109
+ })
110
+ .strict(),
111
+ z
112
+ .object({
113
+ type: z.literal('signalSent'),
114
+ ...base,
115
+ scenarioId: z.string(),
116
+ signal: z.string(),
117
+ from: z.string(),
118
+ recordSeq: z.number().int().positive(),
119
+ })
120
+ .strict(),
121
+ z
122
+ .object({
123
+ type: z.literal('signalWaitStarted'),
124
+ ...base,
125
+ scenarioId: z.string(),
126
+ signal: z.string(),
127
+ actorId: z.string(),
128
+ timeoutMs: z.number().positive(),
129
+ })
130
+ .strict(),
131
+ z
132
+ .object({
133
+ type: z.literal('signalReceived'),
134
+ ...base,
135
+ scenarioId: z.string(),
136
+ signal: z.string(),
137
+ by: z.string(),
138
+ from: z.string(),
139
+ latencyMs: z.number().nonnegative(),
140
+ })
141
+ .strict(),
142
+ z
143
+ .object({
144
+ type: z.literal('signalTimedOut'),
145
+ ...base,
146
+ scenarioId: z.string(),
147
+ signal: z.string(),
148
+ actorId: z.string(),
149
+ timeoutMs: z.number().positive(),
150
+ })
151
+ .strict(),
152
+ z
153
+ .object({
154
+ type: z.literal('driverRegistered'),
155
+ ...base,
156
+ driverId: z.string(),
157
+ version: z.string(),
158
+ platforms: z.array(z.string()),
159
+ })
160
+ .strict(),
161
+ z
162
+ .object({
163
+ type: z.literal('driverDisabled'),
164
+ ...base,
165
+ driverId: z.string(),
166
+ code: z.string(),
167
+ reason: z.string(),
168
+ fix: z.string(),
169
+ })
170
+ .strict(),
171
+ z
172
+ .object({
173
+ type: z.literal('artifactCaptured'),
174
+ ...base,
175
+ kind: artifactKind,
176
+ path: z.string(),
177
+ scenarioId: z.string().optional(),
178
+ actorId: z.string().optional(),
179
+ })
180
+ .strict(),
181
+ z
182
+ .object({
183
+ type: z.literal('driverLog'),
184
+ ...base,
185
+ source: z.string(),
186
+ level: logLevel,
187
+ message: z.string(),
188
+ })
189
+ .strict(),
190
+ ]);
191
+ /** Throws with a precise message when core emits a malformed event (a core bug). */
192
+ export function validateEvent(event) {
193
+ const result = krakenEventSchema.safeParse(event);
194
+ if (!result.success) {
195
+ throw new KrakenError('KRK-RUN-ABORTED', `Internal error: core emitted a malformed "${event.type}" event: ${result.error.message}`, { data: { issues: JSON.parse(JSON.stringify(result.error.issues)) } });
196
+ }
197
+ }
198
+ /** The public, consumer-facing schema (future GUI, external tooling). */
199
+ export function krakenEventJsonSchema() {
200
+ return z.toJSONSchema(krakenEventSchema);
201
+ }
202
+ //# sourceMappingURL=event-schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-schemas.js","sourceRoot":"","sources":["../src/event-schemas.ts"],"names":[],"mappings":"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"}
package/dist/host.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { HostContext, HostInfo, HostProbe } from '@kraken-e2e/contracts';
2
+ /**
3
+ * THE single place in the entire codebase that reads process.platform/arch
4
+ * (ADR-0001 §5.5 / constraint C4b). Everything downstream receives injected
5
+ * HostInfo values, which is what makes the non-darwin branch unit-testable.
6
+ */
7
+ export declare const systemHostProbe: HostProbe;
8
+ /** What drivers receive at start(): host facts plus environment access. */
9
+ export declare function createHostContext(host: HostInfo, projectRoot?: string): HostContext;
10
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE9E;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,SAQ7B,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAMnF"}
package/dist/host.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * THE single place in the entire codebase that reads process.platform/arch
3
+ * (ADR-0001 §5.5 / constraint C4b). Everything downstream receives injected
4
+ * HostInfo values, which is what makes the non-darwin branch unit-testable.
5
+ */
6
+ export const systemHostProbe = {
7
+ detect() {
8
+ return {
9
+ platform: process.platform,
10
+ arch: process.arch,
11
+ nodeVersion: process.versions.node,
12
+ };
13
+ },
14
+ };
15
+ /** What drivers receive at start(): host facts plus environment access. */
16
+ export function createHostContext(host, projectRoot) {
17
+ return {
18
+ ...host,
19
+ ...(projectRoot !== undefined ? { projectRoot } : {}),
20
+ env: process.env,
21
+ };
22
+ }
23
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAc;IACxC,MAAM;QACJ,OAAO;YACL,QAAQ,EAAE,OAAO,CAAC,QAAgC;YAClD,IAAI,EAAE,OAAO,CAAC,IAAwB;YACtC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;SACnC,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,IAAc,EAAE,WAAoB;IACpE,OAAO;QACL,GAAG,IAAI;QACP,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @kraken-e2e/core — orchestrator (ADR-0001 §5.3, ADR-0002).
3
+ *
4
+ * Session manager, DAG step scheduler, plugin registry, host detection, and
5
+ * the event bus. Knows NOTHING about Appium/WDIO/ADB/browsers (constraint C2):
6
+ * platform knowledge arrives exclusively through @kraken-e2e/contracts drivers.
7
+ *
8
+ * Subpaths: `@kraken-e2e/core/ctk` (driver Conformance Test Kit) and
9
+ * `@kraken-e2e/core/testing` (FakeDriver + FakeAppWorld).
10
+ */
11
+ export { EventBus, type EventSink } from './event-bus.js';
12
+ export { krakenEventJsonSchema } from './event-schemas.js';
13
+ export { createHostContext, systemHostProbe } from './host.js';
14
+ export { createLogger, type LogLevel, type LogLine, silentLogger } from './logger.js';
15
+ export { type DriverRegistration, DriverRegistry, type DriverStatus } from './registry.js';
16
+ export { type RunnerDependencies, type RunOptions, type RunResult, runScenarios, type ScenarioResult, ScenarioRunner, SESSION_DISPOSE_TIMEOUT_MS, } from './runner.js';
17
+ export { ScenarioBuilder, scenario } from './scenario.js';
18
+ export { type ActorRuntime, executePlan, type PlanExecutionResult, type PlanNode, type PlanNodeKind, type ScenarioPlan, type StepRunContext, TaskRegistry, } from './scheduler.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,KAAK,kBAAkB,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,YAAY,EACZ,KAAK,cAAc,EACnB,cAAc,EACd,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,KAAK,YAAY,EACjB,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,YAAY,GACb,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @kraken-e2e/core — orchestrator (ADR-0001 §5.3, ADR-0002).
3
+ *
4
+ * Session manager, DAG step scheduler, plugin registry, host detection, and
5
+ * the event bus. Knows NOTHING about Appium/WDIO/ADB/browsers (constraint C2):
6
+ * platform knowledge arrives exclusively through @kraken-e2e/contracts drivers.
7
+ *
8
+ * Subpaths: `@kraken-e2e/core/ctk` (driver Conformance Test Kit) and
9
+ * `@kraken-e2e/core/testing` (FakeDriver + FakeAppWorld).
10
+ */
11
+ export { EventBus } from './event-bus.js';
12
+ export { krakenEventJsonSchema } from './event-schemas.js';
13
+ export { createHostContext, systemHostProbe } from './host.js';
14
+ export { createLogger, silentLogger } from './logger.js';
15
+ export { DriverRegistry } from './registry.js';
16
+ export { runScenarios, ScenarioRunner, SESSION_DISPOSE_TIMEOUT_MS, } from './runner.js';
17
+ export { ScenarioBuilder, scenario } from './scenario.js';
18
+ export { executePlan, TaskRegistry, } from './scheduler.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,YAAY,EAA+B,YAAY,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAA2B,cAAc,EAAqB,MAAM,eAAe,CAAC;AAC3F,OAAO,EAIL,YAAY,EAEZ,cAAc,EACd,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAEL,WAAW,EAMX,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Logger } from '@kraken-e2e/contracts';
2
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
3
+ export interface LogLine {
4
+ readonly level: LogLevel;
5
+ readonly scope: string;
6
+ readonly message: string;
7
+ readonly meta?: Readonly<Record<string, unknown>> | undefined;
8
+ }
9
+ /**
10
+ * Loggers are sink-based: core never writes to stdout itself (ADR-0001 §5.11
11
+ * stdout discipline). The CLI wires the sink to its renderer; tests wire it to
12
+ * an array.
13
+ */
14
+ export declare function createLogger(scope: string, sink: (line: LogLine) => void): Logger;
15
+ export declare const silentLogger: Logger;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,CAOjF;AAED,eAAO,MAAM,YAAY,EAAE,MAAyC,CAAC"}