@kraken-e2e/contracts 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/dist/driver.d.ts +106 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +28 -0
- package/dist/driver.js.map +1 -0
- package/dist/errors.d.ts +58 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +109 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/host.d.ts +36 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +37 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/reporter.d.ts +15 -0
- package/dist/reporter.d.ts.map +1 -0
- package/dist/reporter.js +5 -0
- package/dist/reporter.js.map +1 -0
- package/dist/session.d.ts +78 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +21 -0
- package/dist/session.js.map +1 -0
- package/dist/version.d.ts +22 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +20 -0
- package/dist/version.js.map +1 -0
- package/package.json +35 -0
package/dist/driver.d.ts
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The driver SPI (ADR-0001 §5.10 / ADR-0002 D2). A driver package's default
|
|
3
|
+
* export is a factory produced by defineDriver(); the brand symbol survives
|
|
4
|
+
* duplicate copies of this package in the tree, and the baked CONTRACT_VERSION
|
|
5
|
+
* is what the registry checks at load time.
|
|
6
|
+
*/
|
|
7
|
+
import type { HostContext, HostRequirements } from './host.js';
|
|
8
|
+
import type { UserSession } from './session.js';
|
|
9
|
+
import { type ContractVersion } from './version.js';
|
|
10
|
+
export declare const DRIVER_BRAND: unique symbol;
|
|
11
|
+
export interface DriverManifest {
|
|
12
|
+
readonly kind: 'kraken-driver';
|
|
13
|
+
/** Short id: 'android' | 'ios' | 'web' | custom. */
|
|
14
|
+
readonly id: string;
|
|
15
|
+
/** Platform ids actors bind to (usually [id]; web may expose more). */
|
|
16
|
+
readonly platforms: readonly string[];
|
|
17
|
+
/** The driver package's own version. */
|
|
18
|
+
readonly version: string;
|
|
19
|
+
/** Baked by defineDriver — never hand-written. */
|
|
20
|
+
readonly contract: ContractVersion;
|
|
21
|
+
/** Human label for messages: 'iOS (XCUITest via Appium 3)'. */
|
|
22
|
+
readonly platformLabel: string;
|
|
23
|
+
readonly hostRequirements?: HostRequirements;
|
|
24
|
+
/** Actionable remediation shown when the driver is host-disabled. */
|
|
25
|
+
readonly disabledFix?: string;
|
|
26
|
+
/** Printed after `kraken plugins install`. */
|
|
27
|
+
readonly setupHints?: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
/** Drivers NEVER write to stdout — they get a logger (ADR-0001 §5.11). */
|
|
30
|
+
export interface Logger {
|
|
31
|
+
debug(message: string, meta?: Readonly<Record<string, unknown>>): void;
|
|
32
|
+
info(message: string, meta?: Readonly<Record<string, unknown>>): void;
|
|
33
|
+
warn(message: string, meta?: Readonly<Record<string, unknown>>): void;
|
|
34
|
+
error(message: string, meta?: Readonly<Record<string, unknown>>): void;
|
|
35
|
+
}
|
|
36
|
+
/** The only events a driver may emit directly; core stamps the envelope. */
|
|
37
|
+
export type DriverEmission = {
|
|
38
|
+
readonly type: 'driverLog';
|
|
39
|
+
readonly level: 'debug' | 'info' | 'warn' | 'error';
|
|
40
|
+
readonly message: string;
|
|
41
|
+
} | {
|
|
42
|
+
readonly type: 'artifactCaptured';
|
|
43
|
+
readonly kind: 'screenshot' | 'log' | 'video' | 'source';
|
|
44
|
+
readonly path: string;
|
|
45
|
+
readonly actorId?: string;
|
|
46
|
+
};
|
|
47
|
+
export interface DriverServices {
|
|
48
|
+
readonly runId: string;
|
|
49
|
+
readonly logger: Logger;
|
|
50
|
+
/** Per-run scratch for videos, server logs, screenshots. */
|
|
51
|
+
readonly artifactsDir: string;
|
|
52
|
+
/** Fired on failFast teardown/SIGINT — long driver operations must honor it. */
|
|
53
|
+
readonly abort: AbortSignal;
|
|
54
|
+
emit(event: DriverEmission): void;
|
|
55
|
+
}
|
|
56
|
+
export interface ResolvedActor {
|
|
57
|
+
readonly id: string;
|
|
58
|
+
readonly platform: string;
|
|
59
|
+
/** Driver-specific actor configuration from kraken.config.ts, passed through. */
|
|
60
|
+
readonly config: Readonly<Record<string, unknown>>;
|
|
61
|
+
}
|
|
62
|
+
export type DoctorStatus = 'ok' | 'warn' | 'fail';
|
|
63
|
+
export interface DoctorCheckResult {
|
|
64
|
+
readonly status: DoctorStatus;
|
|
65
|
+
readonly detail?: string;
|
|
66
|
+
/** Actionable remediation — the whole point of kraken doctor (constraint C10). */
|
|
67
|
+
readonly fix?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface DoctorCheck {
|
|
70
|
+
/** Stable id, e.g. 'ios.xcode-version'. */
|
|
71
|
+
readonly id: string;
|
|
72
|
+
readonly title: string;
|
|
73
|
+
run(host: HostContext): Promise<DoctorCheckResult>;
|
|
74
|
+
}
|
|
75
|
+
export interface KrakenDriver<Opts = unknown> {
|
|
76
|
+
readonly [DRIVER_BRAND]: true;
|
|
77
|
+
readonly manifest: DriverManifest;
|
|
78
|
+
/** Environment checks contributed to `kraken doctor` (ADR-0002 D2). */
|
|
79
|
+
readonly doctor?: readonly DoctorCheck[];
|
|
80
|
+
/** Boot shared infra (e.g. an Appium server) once per run. */
|
|
81
|
+
start(host: HostContext, services: DriverServices): Promise<void>;
|
|
82
|
+
/** One INDEPENDENT session per actor (ADR-0001 §5.6 — never multiremote). */
|
|
83
|
+
createSession(actor: ResolvedActor, services: DriverServices): Promise<UserSession>;
|
|
84
|
+
/** Idempotent — SIGINT teardown may call it more than once. */
|
|
85
|
+
stop(): Promise<void>;
|
|
86
|
+
/** Phantom marker so Opts survives inference; never set at runtime. */
|
|
87
|
+
readonly __optionsType?: Opts;
|
|
88
|
+
}
|
|
89
|
+
/** What driver authors write; defineDriver adds the brand and bakes the contract. */
|
|
90
|
+
export interface DriverSpec {
|
|
91
|
+
readonly manifest: Omit<DriverManifest, 'kind' | 'contract'>;
|
|
92
|
+
readonly doctor?: readonly DoctorCheck[];
|
|
93
|
+
start(host: HostContext, services: DriverServices): Promise<void>;
|
|
94
|
+
createSession(actor: ResolvedActor, services: DriverServices): Promise<UserSession>;
|
|
95
|
+
stop(): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Factory-returning: kraken.config.ts calls `android({ avd: 'Pixel_8' })` and
|
|
99
|
+
* registers the VALUE — dependency injection, the hexagonal answer
|
|
100
|
+
* (ADR-0001 §5.10). The driver package's main entry must stay import-safe on
|
|
101
|
+
* every host (ADR-0001 §5.5): dynamic-import heavy deps inside start().
|
|
102
|
+
*/
|
|
103
|
+
export declare function defineDriver<Opts = void>(build: (opts: Opts) => DriverSpec): (opts?: Opts) => KrakenDriver<Opts>;
|
|
104
|
+
/** Runtime check the registry uses; works across duplicate contract copies. */
|
|
105
|
+
export declare function isKrakenDriver(value: unknown): value is KrakenDriver;
|
|
106
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/driver.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { CONTRACT_VERSION } from './version.js';
|
|
2
|
+
export const DRIVER_BRAND = Symbol.for('kraken.driver/v1');
|
|
3
|
+
/**
|
|
4
|
+
* Factory-returning: kraken.config.ts calls `android({ avd: 'Pixel_8' })` and
|
|
5
|
+
* registers the VALUE — dependency injection, the hexagonal answer
|
|
6
|
+
* (ADR-0001 §5.10). The driver package's main entry must stay import-safe on
|
|
7
|
+
* every host (ADR-0001 §5.5): dynamic-import heavy deps inside start().
|
|
8
|
+
*/
|
|
9
|
+
export function defineDriver(build) {
|
|
10
|
+
return (opts) => {
|
|
11
|
+
const spec = build(opts);
|
|
12
|
+
return {
|
|
13
|
+
[DRIVER_BRAND]: true,
|
|
14
|
+
manifest: { ...spec.manifest, kind: 'kraken-driver', contract: CONTRACT_VERSION },
|
|
15
|
+
...(spec.doctor !== undefined ? { doctor: spec.doctor } : {}),
|
|
16
|
+
start: spec.start,
|
|
17
|
+
createSession: spec.createSession,
|
|
18
|
+
stop: spec.stop,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Runtime check the registry uses; works across duplicate contract copies. */
|
|
23
|
+
export function isKrakenDriver(value) {
|
|
24
|
+
return (typeof value === 'object' &&
|
|
25
|
+
value !== null &&
|
|
26
|
+
value[DRIVER_BRAND] === true);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAkB,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAU,CAAC;AAoGnF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAiC;IAEjC,OAAO,CAAC,IAAW,EAAsB,EAAE;QACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAY,CAAC,CAAC;QACjC,OAAO;YACL,CAAC,YAAY,CAAC,EAAE,IAAa;YAC7B,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACjF,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAsC,CAAC,YAAY,CAAC,KAAK,IAAI,CAC/D,CAAC;AACJ,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error taxonomy (ADR-0001 §5.12 / ADR-0002 D6): stable KRK-* codes so CLI,
|
|
3
|
+
* doctor, reporters, and the future GUI render errors consistently.
|
|
4
|
+
* Stability rule: released codes are NEVER renamed or reused.
|
|
5
|
+
* Third-party drivers mint codes under `KRK-DRV-<ID>-*`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const KrakenErrorCodes: {
|
|
8
|
+
/** Generic host gate; driver-specific variants are composed as `KRK-HOST-<ID>-UNSUPPORTED`. */
|
|
9
|
+
readonly HOST_UNSUPPORTED: "KRK-HOST-UNSUPPORTED";
|
|
10
|
+
readonly CONFIG_INVALID: "KRK-CONFIG-INVALID";
|
|
11
|
+
readonly CONFIG_NOT_FOUND: "KRK-CONFIG-NOT-FOUND";
|
|
12
|
+
readonly PLUGIN_NOT_FOUND: "KRK-PLUGIN-NOT-FOUND";
|
|
13
|
+
readonly PLUGIN_INVALID: "KRK-PLUGIN-INVALID";
|
|
14
|
+
readonly PLUGIN_INCOMPATIBLE: "KRK-PLUGIN-INCOMPATIBLE";
|
|
15
|
+
readonly DRIVER_UNKNOWN_PLATFORM: "KRK-DRIVER-UNKNOWN-PLATFORM";
|
|
16
|
+
readonly DRIVER_START_FAILED: "KRK-DRIVER-START-FAILED";
|
|
17
|
+
readonly SESSION_CREATE_FAILED: "KRK-SESSION-CREATE-FAILED";
|
|
18
|
+
readonly SESSION_OP_UNSUPPORTED: "KRK-SESSION-OP-UNSUPPORTED";
|
|
19
|
+
readonly SESSION_ELEMENT_NOT_FOUND: "KRK-SESSION-ELEMENT-NOT-FOUND";
|
|
20
|
+
readonly SESSION_WAIT_TIMEOUT: "KRK-SESSION-WAIT-TIMEOUT";
|
|
21
|
+
readonly SIGNAL_TIMEOUT: "KRK-SIGNAL-TIMEOUT";
|
|
22
|
+
readonly STEP_UNMATCHED: "KRK-STEP-UNMATCHED";
|
|
23
|
+
readonly STEP_AMBIGUOUS: "KRK-STEP-AMBIGUOUS";
|
|
24
|
+
readonly STEP_UNKNOWN_ACTOR: "KRK-STEP-UNKNOWN-ACTOR";
|
|
25
|
+
readonly STEP_FAILED: "KRK-STEP-FAILED";
|
|
26
|
+
readonly PLAN_DEADLOCK: "KRK-PLAN-DEADLOCK";
|
|
27
|
+
readonly PLAN_UNJOINED_TASK: "KRK-PLAN-UNJOINED-TASK";
|
|
28
|
+
readonly PLAN_UNKNOWN_TASK: "KRK-PLAN-UNKNOWN-TASK";
|
|
29
|
+
readonly PLAN_DUPLICATE_TASK: "KRK-PLAN-DUPLICATE-TASK";
|
|
30
|
+
readonly TASK_JOIN_TIMEOUT: "KRK-PLAN-TASK-JOIN-TIMEOUT";
|
|
31
|
+
readonly RUN_ABORTED: "KRK-RUN-ABORTED";
|
|
32
|
+
};
|
|
33
|
+
export type KrakenErrorCode = (typeof KrakenErrorCodes)[keyof typeof KrakenErrorCodes] | `KRK-HOST-${string}-UNSUPPORTED` | `KRK-DRV-${string}`;
|
|
34
|
+
export interface SerializedKrakenError {
|
|
35
|
+
readonly code: string;
|
|
36
|
+
readonly message: string;
|
|
37
|
+
readonly fix?: string;
|
|
38
|
+
readonly data?: Readonly<Record<string, unknown>>;
|
|
39
|
+
}
|
|
40
|
+
export declare class KrakenError extends Error {
|
|
41
|
+
readonly name = "KrakenError";
|
|
42
|
+
readonly code: KrakenErrorCode;
|
|
43
|
+
/** Actionable remediation — what CLI/doctor/GUI render next to the message. */
|
|
44
|
+
readonly fix: string | undefined;
|
|
45
|
+
readonly data: Readonly<Record<string, unknown>> | undefined;
|
|
46
|
+
constructor(code: KrakenErrorCode, message: string, options?: {
|
|
47
|
+
fix?: string | undefined;
|
|
48
|
+
data?: Readonly<Record<string, unknown>> | undefined;
|
|
49
|
+
cause?: unknown;
|
|
50
|
+
});
|
|
51
|
+
toJSON(): SerializedKrakenError;
|
|
52
|
+
static is(error: unknown): error is KrakenError;
|
|
53
|
+
/** Wraps a foreign error, preserving it as `cause`. */
|
|
54
|
+
static wrap(error: unknown, code: KrakenErrorCode, message?: string): KrakenError;
|
|
55
|
+
}
|
|
56
|
+
/** Serializes any error into the event-carriable shape. */
|
|
57
|
+
export declare function serializeError(error: unknown): SerializedKrakenError;
|
|
58
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB;IAC3B,+FAA+F;;;;;;;;;;;;;;;;;;;;;;;;CAwBvF,CAAC;AAEX,MAAM,MAAM,eAAe,GACvB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,GACxD,YAAY,MAAM,cAAc,GAChC,WAAW,MAAM,EAAE,CAAC;AAExB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACnD;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAiB;IACvC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;gBAG3D,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACzB,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;QACrD,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;IAQH,MAAM,IAAI,qBAAqB;IAS/B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW;IAI/C,uDAAuD;IACvD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;CAKlF;AAED,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CAMpE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error taxonomy (ADR-0001 §5.12 / ADR-0002 D6): stable KRK-* codes so CLI,
|
|
3
|
+
* doctor, reporters, and the future GUI render errors consistently.
|
|
4
|
+
* Stability rule: released codes are NEVER renamed or reused.
|
|
5
|
+
* Third-party drivers mint codes under `KRK-DRV-<ID>-*`.
|
|
6
|
+
*/
|
|
7
|
+
export const KrakenErrorCodes = {
|
|
8
|
+
/** Generic host gate; driver-specific variants are composed as `KRK-HOST-<ID>-UNSUPPORTED`. */
|
|
9
|
+
HOST_UNSUPPORTED: 'KRK-HOST-UNSUPPORTED',
|
|
10
|
+
CONFIG_INVALID: 'KRK-CONFIG-INVALID',
|
|
11
|
+
CONFIG_NOT_FOUND: 'KRK-CONFIG-NOT-FOUND',
|
|
12
|
+
PLUGIN_NOT_FOUND: 'KRK-PLUGIN-NOT-FOUND',
|
|
13
|
+
PLUGIN_INVALID: 'KRK-PLUGIN-INVALID',
|
|
14
|
+
PLUGIN_INCOMPATIBLE: 'KRK-PLUGIN-INCOMPATIBLE',
|
|
15
|
+
DRIVER_UNKNOWN_PLATFORM: 'KRK-DRIVER-UNKNOWN-PLATFORM',
|
|
16
|
+
DRIVER_START_FAILED: 'KRK-DRIVER-START-FAILED',
|
|
17
|
+
SESSION_CREATE_FAILED: 'KRK-SESSION-CREATE-FAILED',
|
|
18
|
+
SESSION_OP_UNSUPPORTED: 'KRK-SESSION-OP-UNSUPPORTED',
|
|
19
|
+
SESSION_ELEMENT_NOT_FOUND: 'KRK-SESSION-ELEMENT-NOT-FOUND',
|
|
20
|
+
SESSION_WAIT_TIMEOUT: 'KRK-SESSION-WAIT-TIMEOUT',
|
|
21
|
+
SIGNAL_TIMEOUT: 'KRK-SIGNAL-TIMEOUT',
|
|
22
|
+
STEP_UNMATCHED: 'KRK-STEP-UNMATCHED',
|
|
23
|
+
STEP_AMBIGUOUS: 'KRK-STEP-AMBIGUOUS',
|
|
24
|
+
STEP_UNKNOWN_ACTOR: 'KRK-STEP-UNKNOWN-ACTOR',
|
|
25
|
+
STEP_FAILED: 'KRK-STEP-FAILED',
|
|
26
|
+
PLAN_DEADLOCK: 'KRK-PLAN-DEADLOCK',
|
|
27
|
+
PLAN_UNJOINED_TASK: 'KRK-PLAN-UNJOINED-TASK',
|
|
28
|
+
PLAN_UNKNOWN_TASK: 'KRK-PLAN-UNKNOWN-TASK',
|
|
29
|
+
PLAN_DUPLICATE_TASK: 'KRK-PLAN-DUPLICATE-TASK',
|
|
30
|
+
TASK_JOIN_TIMEOUT: 'KRK-PLAN-TASK-JOIN-TIMEOUT',
|
|
31
|
+
RUN_ABORTED: 'KRK-RUN-ABORTED',
|
|
32
|
+
};
|
|
33
|
+
export class KrakenError extends Error {
|
|
34
|
+
name = 'KrakenError';
|
|
35
|
+
code;
|
|
36
|
+
/** Actionable remediation — what CLI/doctor/GUI render next to the message. */
|
|
37
|
+
fix;
|
|
38
|
+
data;
|
|
39
|
+
constructor(code, message, options) {
|
|
40
|
+
super(message, options?.cause === undefined ? undefined : { cause: options.cause });
|
|
41
|
+
this.code = code;
|
|
42
|
+
this.fix = options?.fix;
|
|
43
|
+
this.data = options?.data;
|
|
44
|
+
}
|
|
45
|
+
toJSON() {
|
|
46
|
+
return {
|
|
47
|
+
code: this.code,
|
|
48
|
+
message: this.message,
|
|
49
|
+
...(this.fix !== undefined ? { fix: this.fix } : {}),
|
|
50
|
+
...(this.data !== undefined ? { data: this.data } : {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
static is(error) {
|
|
54
|
+
return error instanceof KrakenError;
|
|
55
|
+
}
|
|
56
|
+
/** Wraps a foreign error, preserving it as `cause`. */
|
|
57
|
+
static wrap(error, code, message) {
|
|
58
|
+
if (KrakenError.is(error))
|
|
59
|
+
return error;
|
|
60
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
61
|
+
return new KrakenError(code, message ? `${message}: ${detail}` : detail, { cause: error });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Serializes any error into the event-carriable shape. */
|
|
65
|
+
export function serializeError(error) {
|
|
66
|
+
if (KrakenError.is(error))
|
|
67
|
+
return error.toJSON();
|
|
68
|
+
if (error instanceof Error) {
|
|
69
|
+
return { code: 'KRK-STEP-FAILED', message: `${error.name}: ${error.message}` };
|
|
70
|
+
}
|
|
71
|
+
return { code: 'KRK-STEP-FAILED', message: String(error) };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The structured event stream (ADR-0001 §5.12 / ADR-0002 D5) — the GUI-ready
|
|
3
|
+
* spine. Envelope: { type, ts, runId, seq } with seq monotonic per run.
|
|
4
|
+
*
|
|
5
|
+
* Evolution rules (cucumber-messages model): additive-only. New OPTIONAL
|
|
6
|
+
* fields at most; a semantic change is a NEW event type; consumers MUST ignore
|
|
7
|
+
* unknown types/fields. A single `protocol: 1` literal lives in runStarted.
|
|
8
|
+
* Validation schemas (zod) live inside @kraken-e2e/core, never here.
|
|
9
|
+
*/
|
|
10
|
+
import type { SerializedKrakenError } from './errors.js';
|
|
11
|
+
export interface KrakenEventBase {
|
|
12
|
+
readonly ts: number;
|
|
13
|
+
readonly runId: string;
|
|
14
|
+
/** Monotonic per run — total ordering for any consumer without clock trust. */
|
|
15
|
+
readonly seq: number;
|
|
16
|
+
}
|
|
17
|
+
export type StepStatus = 'passed' | 'failed' | 'skipped';
|
|
18
|
+
export type RunStatus = 'passed' | 'failed';
|
|
19
|
+
export interface ActorSummary {
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly platform: string;
|
|
22
|
+
readonly driverId: string;
|
|
23
|
+
}
|
|
24
|
+
type Ev<TType extends string, TPayload> = KrakenEventBase & {
|
|
25
|
+
readonly type: TType;
|
|
26
|
+
} & Readonly<TPayload>;
|
|
27
|
+
export type KrakenEvent = Ev<'runStarted', {
|
|
28
|
+
protocol: 1;
|
|
29
|
+
scenarioCount: number;
|
|
30
|
+
}> | Ev<'runFinished', {
|
|
31
|
+
status: RunStatus;
|
|
32
|
+
durationMs: number;
|
|
33
|
+
}> | Ev<'scenarioStarted', {
|
|
34
|
+
scenarioId: string;
|
|
35
|
+
name: string;
|
|
36
|
+
featureUri?: string;
|
|
37
|
+
actors: readonly ActorSummary[];
|
|
38
|
+
}> | Ev<'scenarioFinished', {
|
|
39
|
+
scenarioId: string;
|
|
40
|
+
status: StepStatus;
|
|
41
|
+
durationMs: number;
|
|
42
|
+
error?: SerializedKrakenError;
|
|
43
|
+
}> | Ev<'stepStarted', {
|
|
44
|
+
scenarioId: string;
|
|
45
|
+
stepId: string;
|
|
46
|
+
actorId: string;
|
|
47
|
+
text: string;
|
|
48
|
+
}> | Ev<'stepFinished', {
|
|
49
|
+
scenarioId: string;
|
|
50
|
+
stepId: string;
|
|
51
|
+
actorId: string;
|
|
52
|
+
text: string;
|
|
53
|
+
status: StepStatus;
|
|
54
|
+
durationMs: number;
|
|
55
|
+
error?: SerializedKrakenError;
|
|
56
|
+
}> | Ev<'actorSessionStarted', {
|
|
57
|
+
scenarioId: string;
|
|
58
|
+
actorId: string;
|
|
59
|
+
driverId: string;
|
|
60
|
+
platformLabel: string;
|
|
61
|
+
}> | Ev<'actorSessionFinished', {
|
|
62
|
+
scenarioId: string;
|
|
63
|
+
actorId: string;
|
|
64
|
+
status: 'ok' | 'failed';
|
|
65
|
+
}> | Ev<'signalSent', {
|
|
66
|
+
scenarioId: string;
|
|
67
|
+
signal: string;
|
|
68
|
+
from: string;
|
|
69
|
+
recordSeq: number;
|
|
70
|
+
}> | Ev<'signalWaitStarted', {
|
|
71
|
+
scenarioId: string;
|
|
72
|
+
signal: string;
|
|
73
|
+
actorId: string;
|
|
74
|
+
timeoutMs: number;
|
|
75
|
+
}> | Ev<'signalReceived', {
|
|
76
|
+
scenarioId: string;
|
|
77
|
+
signal: string;
|
|
78
|
+
by: string;
|
|
79
|
+
from: string;
|
|
80
|
+
latencyMs: number;
|
|
81
|
+
}> | Ev<'signalTimedOut', {
|
|
82
|
+
scenarioId: string;
|
|
83
|
+
signal: string;
|
|
84
|
+
actorId: string;
|
|
85
|
+
timeoutMs: number;
|
|
86
|
+
}> | Ev<'driverRegistered', {
|
|
87
|
+
driverId: string;
|
|
88
|
+
version: string;
|
|
89
|
+
platforms: readonly string[];
|
|
90
|
+
}> | Ev<'driverDisabled', {
|
|
91
|
+
driverId: string;
|
|
92
|
+
code: string;
|
|
93
|
+
reason: string;
|
|
94
|
+
fix: string;
|
|
95
|
+
}> | Ev<'artifactCaptured', {
|
|
96
|
+
kind: 'screenshot' | 'log' | 'video' | 'source';
|
|
97
|
+
path: string;
|
|
98
|
+
scenarioId?: string;
|
|
99
|
+
actorId?: string;
|
|
100
|
+
}> | Ev<'driverLog', {
|
|
101
|
+
source: string;
|
|
102
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
103
|
+
message: string;
|
|
104
|
+
}>;
|
|
105
|
+
export type KrakenEventType = KrakenEvent['type'];
|
|
106
|
+
/** What the EventBus accepts: an event minus the envelope it stamps. */
|
|
107
|
+
export type KrakenEventInput = KrakenEvent extends infer E ? E extends KrakenEvent ? Omit<E, keyof KrakenEventBase> : never : never;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/events.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":""}
|
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-platform detection contracts (ADR-0001 §5.5 / constraint C4b).
|
|
3
|
+
* The single implementation reading process.platform/arch lives in
|
|
4
|
+
* @kraken-e2e/core (`systemHostProbe`); everything else receives HostInfo values.
|
|
5
|
+
*/
|
|
6
|
+
export interface HostInfo {
|
|
7
|
+
readonly platform: 'darwin' | 'linux' | 'win32' | (string & {});
|
|
8
|
+
readonly arch: 'arm64' | 'x64' | (string & {});
|
|
9
|
+
/** Without the leading 'v', e.g. '22.19.0'. */
|
|
10
|
+
readonly nodeVersion: string;
|
|
11
|
+
}
|
|
12
|
+
/** Injectable so the non-darwin branch is a plain unit test (C4b). */
|
|
13
|
+
export interface HostProbe {
|
|
14
|
+
detect(): HostInfo;
|
|
15
|
+
}
|
|
16
|
+
/** What a driver's manifest declares about the hosts it can run on. */
|
|
17
|
+
export interface HostRequirements {
|
|
18
|
+
readonly platforms?: readonly string[];
|
|
19
|
+
readonly archs?: readonly string[];
|
|
20
|
+
readonly minNodeMajor?: number;
|
|
21
|
+
}
|
|
22
|
+
/** What drivers receive at start(): host facts plus the environment. */
|
|
23
|
+
export interface HostContext extends HostInfo {
|
|
24
|
+
readonly projectRoot?: string;
|
|
25
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
26
|
+
}
|
|
27
|
+
export type HostCheckResult = {
|
|
28
|
+
readonly ok: true;
|
|
29
|
+
} | {
|
|
30
|
+
readonly ok: false;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
readonly fix: string;
|
|
33
|
+
};
|
|
34
|
+
/** Pure — trivially unit-testable with injected values (never reads process.*). */
|
|
35
|
+
export declare function checkHostRequirements(requirements: HostRequirements | undefined, host: HostInfo): HostCheckResult;
|
|
36
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC/C,+CAA+C;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,MAAM,IAAI,QAAQ,CAAC;CACpB;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,wEAAwE;AACxE,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAC1C,IAAI,EAAE,QAAQ,GACb,eAAe,CA6BjB"}
|
package/dist/host.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-platform detection contracts (ADR-0001 §5.5 / constraint C4b).
|
|
3
|
+
* The single implementation reading process.platform/arch lives in
|
|
4
|
+
* @kraken-e2e/core (`systemHostProbe`); everything else receives HostInfo values.
|
|
5
|
+
*/
|
|
6
|
+
/** Pure — trivially unit-testable with injected values (never reads process.*). */
|
|
7
|
+
export function checkHostRequirements(requirements, host) {
|
|
8
|
+
if (!requirements)
|
|
9
|
+
return { ok: true };
|
|
10
|
+
if (requirements.platforms && !requirements.platforms.includes(host.platform)) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
reason: `requires host platform ${requirements.platforms.join(' or ')}, ` +
|
|
14
|
+
`but this host is ${host.platform}/${host.arch}`,
|
|
15
|
+
fix: `Run on a supported host (${requirements.platforms.join(', ')}). Other drivers remain available on this host.`,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (requirements.archs && !requirements.archs.includes(host.arch)) {
|
|
19
|
+
return {
|
|
20
|
+
ok: false,
|
|
21
|
+
reason: `requires CPU architecture ${requirements.archs.join(' or ')}, but this host is ${host.arch}`,
|
|
22
|
+
fix: `Run on a supported architecture (${requirements.archs.join(', ')}).`,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (requirements.minNodeMajor !== undefined) {
|
|
26
|
+
const major = Number.parseInt(host.nodeVersion.split('.')[0] ?? '0', 10);
|
|
27
|
+
if (major < requirements.minNodeMajor) {
|
|
28
|
+
return {
|
|
29
|
+
ok: false,
|
|
30
|
+
reason: `requires Node >= ${requirements.minNodeMajor}, but this host runs ${host.nodeVersion}`,
|
|
31
|
+
fix: `Upgrade Node.js to ${requirements.minNodeMajor} or newer.`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { ok: true };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+BH,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CACnC,YAA0C,EAC1C,IAAc;IAEd,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,YAAY,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9E,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EACJ,0BAA0B,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;gBACjE,oBAAoB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE;YAClD,GAAG,EAAE,4BAA4B,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD;SACpH,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,6BAA6B,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE;YACrG,GAAG,EAAE,oCAAoC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,KAAK,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC;YACtC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,oBAAoB,YAAY,CAAC,YAAY,wBAAwB,IAAI,CAAC,WAAW,EAAE;gBAC/F,GAAG,EAAE,sBAAsB,YAAY,CAAC,YAAY,YAAY;aACjE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @kraken-e2e/contracts — zero-runtime-dependency SPI (ADR-0001 §5.3, ADR-0002).
|
|
3
|
+
*
|
|
4
|
+
* The hexagonal boundary every plugin compiles against: driver/reporter
|
|
5
|
+
* interfaces, the core session surface, event types, error codes, host
|
|
6
|
+
* detection contracts, and CONTRACT_VERSION. Drivers peer-depend on THIS
|
|
7
|
+
* package, never on @kraken-e2e/core, so core ships majors freely (ADR-0001 §5.10).
|
|
8
|
+
*
|
|
9
|
+
* The signal-transport SPI is owned by @kraken-e2e/signaling and re-exported here
|
|
10
|
+
* type-only (erased at runtime — this package keeps zero runtime imports).
|
|
11
|
+
*/
|
|
12
|
+
export type { SignalPayload, SignalRecord, SignalScope, SignalTransport, } from '@kraken-e2e/signaling';
|
|
13
|
+
export { type DoctorCheck, type DoctorCheckResult, type DoctorStatus, DRIVER_BRAND, type DriverEmission, type DriverManifest, type DriverServices, type DriverSpec, defineDriver, isKrakenDriver, type KrakenDriver, type Logger, type ResolvedActor, } from './driver.js';
|
|
14
|
+
export { KrakenError, type KrakenErrorCode, KrakenErrorCodes, type SerializedKrakenError, serializeError, } from './errors.js';
|
|
15
|
+
export type { ActorSummary, KrakenEvent, KrakenEventBase, KrakenEventInput, KrakenEventType, RunStatus, StepStatus, } from './events.js';
|
|
16
|
+
export { checkHostRequirements, type HostCheckResult, type HostContext, type HostInfo, type HostProbe, type HostRequirements, } from './host.js';
|
|
17
|
+
export { defineReporter, type Reporter } from './reporter.js';
|
|
18
|
+
export { type ArtifactRef, CORE_OPERATIONS, type CoreOperation, type KrakenNativeSessions, type SemanticKey, type SessionWaitOptions, type TargetLocator, type UserSession, type WaitState, } from './session.js';
|
|
19
|
+
export { CONTRACT_VERSION, type ContractVersion, isContractCompatible } from './version.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,YAAY,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,YAAY,EACZ,cAAc,EACd,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,KAAK,eAAe,EACpB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,KAAK,WAAW,EAChB,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @kraken-e2e/contracts — zero-runtime-dependency SPI (ADR-0001 §5.3, ADR-0002).
|
|
3
|
+
*
|
|
4
|
+
* The hexagonal boundary every plugin compiles against: driver/reporter
|
|
5
|
+
* interfaces, the core session surface, event types, error codes, host
|
|
6
|
+
* detection contracts, and CONTRACT_VERSION. Drivers peer-depend on THIS
|
|
7
|
+
* package, never on @kraken-e2e/core, so core ships majors freely (ADR-0001 §5.10).
|
|
8
|
+
*
|
|
9
|
+
* The signal-transport SPI is owned by @kraken-e2e/signaling and re-exported here
|
|
10
|
+
* type-only (erased at runtime — this package keeps zero runtime imports).
|
|
11
|
+
*/
|
|
12
|
+
export { DRIVER_BRAND, defineDriver, isKrakenDriver, } from './driver.js';
|
|
13
|
+
export { KrakenError, KrakenErrorCodes, serializeError, } from './errors.js';
|
|
14
|
+
export { checkHostRequirements, } from './host.js';
|
|
15
|
+
export { defineReporter } from './reporter.js';
|
|
16
|
+
export { CORE_OPERATIONS, } from './session.js';
|
|
17
|
+
export { CONTRACT_VERSION, isContractCompatible } from './version.js';
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,OAAO,EAIL,YAAY,EAKZ,YAAY,EACZ,cAAc,GAIf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EAEX,gBAAgB,EAEhB,cAAc,GACf,MAAM,aAAa,CAAC;AAUrB,OAAO,EACL,qBAAqB,GAMtB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,cAAc,EAAiB,MAAM,eAAe,CAAC;AAC9D,OAAO,EAEL,eAAe,GAQhB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAwB,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { KrakenEvent } from './events.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reporters are single-method subscribers of the serialized event stream
|
|
4
|
+
* (ADR-0001 §5.12): transport-symmetric — identical whether the subscriber is
|
|
5
|
+
* Allure in-process, a JSONL file sink, or a future GUI over WebSocket.
|
|
6
|
+
*/
|
|
7
|
+
export interface Reporter {
|
|
8
|
+
readonly id: string;
|
|
9
|
+
onEvent(event: KrakenEvent): void | Promise<void>;
|
|
10
|
+
/** Awaited at run end — drain buffers, close files. */
|
|
11
|
+
flush?(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Identity helper for symmetry with defineDriver (and future branding). */
|
|
14
|
+
export declare function defineReporter(reporter: Reporter): Reporter;
|
|
15
|
+
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,uDAAuD;IACvD,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAE3D"}
|
package/dist/reporter.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAcA,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|