@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.
- package/LICENSE +674 -0
- package/dist/ctk.d.ts +57 -0
- package/dist/ctk.d.ts.map +1 -0
- package/dist/ctk.js +137 -0
- package/dist/ctk.js.map +1 -0
- package/dist/event-bus.d.ts +21 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +55 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/event-schemas.d.ts +13 -0
- package/dist/event-schemas.d.ts.map +1 -0
- package/dist/event-schemas.js +202 -0
- package/dist/event-schemas.js.map +1 -0
- package/dist/host.d.ts +10 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +23 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +13 -0
- package/dist/logger.js.map +1 -0
- package/dist/registry.d.ts +50 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +244 -0
- package/dist/registry.js.map +1 -0
- package/dist/runner.d.ts +60 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +363 -0
- package/dist/runner.js.map +1 -0
- package/dist/scenario.d.ts +25 -0
- package/dist/scenario.d.ts.map +1 -0
- package/dist/scenario.js +85 -0
- package/dist/scenario.js.map +1 -0
- package/dist/scheduler.d.ts +87 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +190 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/testing/fake-driver.d.ts +54 -0
- package/dist/testing/fake-driver.d.ts.map +1 -0
- package/dist/testing/fake-driver.js +209 -0
- package/dist/testing/fake-driver.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +53 -0
package/dist/logger.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loggers are sink-based: core never writes to stdout itself (ADR-0001 §5.11
|
|
3
|
+
* stdout discipline). The CLI wires the sink to its renderer; tests wire it to
|
|
4
|
+
* an array.
|
|
5
|
+
*/
|
|
6
|
+
export function createLogger(scope, sink) {
|
|
7
|
+
const log = (level) => (message, meta) => {
|
|
8
|
+
sink({ level, scope, message, ...(meta !== undefined ? { meta } : {}) });
|
|
9
|
+
};
|
|
10
|
+
return { debug: log('debug'), info: log('info'), warn: log('warn'), error: log('error') };
|
|
11
|
+
}
|
|
12
|
+
export const silentLogger = createLogger('silent', () => { });
|
|
13
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAA6B;IACvE,MAAM,GAAG,GACP,CAAC,KAAe,EAAE,EAAE,CACpB,CAAC,OAAe,EAAE,IAAwC,EAAQ,EAAE;QAClE,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC,CAAC;IACJ,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAW,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type ContractVersion, type DriverManifest, type HostInfo, type KrakenDriver } from '@kraken-e2e/contracts';
|
|
2
|
+
import type { EventSink } from './event-bus.js';
|
|
3
|
+
/** Config-facing registration forms (ADR-0001 §5.10): values, names, or tuples. */
|
|
4
|
+
export type DriverRegistration = KrakenDriver | string | readonly [packageName: string, options?: unknown];
|
|
5
|
+
export type DriverStatus = {
|
|
6
|
+
readonly state: 'ready';
|
|
7
|
+
readonly driver: KrakenDriver;
|
|
8
|
+
} | {
|
|
9
|
+
readonly state: 'unavailable-on-host';
|
|
10
|
+
readonly manifest: DriverManifest;
|
|
11
|
+
readonly code: `KRK-HOST-${string}-UNSUPPORTED`;
|
|
12
|
+
readonly reason: string;
|
|
13
|
+
readonly fix: string;
|
|
14
|
+
} | {
|
|
15
|
+
readonly state: 'incompatible';
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly platforms: readonly string[];
|
|
18
|
+
readonly found: ContractVersion;
|
|
19
|
+
readonly supported: ContractVersion;
|
|
20
|
+
readonly fix: string;
|
|
21
|
+
} | {
|
|
22
|
+
readonly state: 'invalid';
|
|
23
|
+
readonly ref: string;
|
|
24
|
+
readonly problems: readonly string[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Loads, validates, version-checks, and host-gates drivers (ADR-0002 D3/D4).
|
|
28
|
+
* Check order per driver: brand → manifest shape → contract compatibility →
|
|
29
|
+
* host requirements. Every failure is a status with remediation, surfaced via
|
|
30
|
+
* events and `kraken doctor` — never a bare stack trace.
|
|
31
|
+
*/
|
|
32
|
+
export declare class DriverRegistry {
|
|
33
|
+
#private;
|
|
34
|
+
private constructor();
|
|
35
|
+
static create(options: {
|
|
36
|
+
registrations: readonly DriverRegistration[];
|
|
37
|
+
host: HostInfo;
|
|
38
|
+
events?: EventSink;
|
|
39
|
+
/** Required for string-form registrations (resolution anchor — pnpm-safe). */
|
|
40
|
+
projectRoot?: string;
|
|
41
|
+
}): Promise<DriverRegistry>;
|
|
42
|
+
statuses(): readonly DriverStatus[];
|
|
43
|
+
readyDrivers(): readonly KrakenDriver[];
|
|
44
|
+
/**
|
|
45
|
+
* Fails FAST and explicitly (constraint C4b): binding an actor to a
|
|
46
|
+
* host-disabled platform is an error before any session boots.
|
|
47
|
+
*/
|
|
48
|
+
driverFor(platform: string): KrakenDriver;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,cAAc,EACnB,KAAK,QAAQ,EAGb,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,mFAAmF;AACnF,MAAM,MAAM,kBAAkB,GAC1B,YAAY,GACZ,MAAM,GACN,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAC1D;IACE,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,MAAM,cAAc,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,GACD;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AA6B9F;;;;;GAKG;AACH,qBAAa,cAAc;;IAIzB,OAAO;WAEM,MAAM,CAAC,OAAO,EAAE;QAC3B,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;QAC7C,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,CAAC,EAAE,SAAS,CAAC;QACnB,8EAA8E;QAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,cAAc,CAAC;IAyL3B,QAAQ,IAAI,SAAS,YAAY,EAAE;IAInC,YAAY,IAAI,SAAS,YAAY,EAAE;IAIvC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;CAoC1C"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
import { CONTRACT_VERSION, checkHostRequirements, isContractCompatible, isKrakenDriver, KrakenError, } from '@kraken-e2e/contracts';
|
|
5
|
+
function manifestProblems(manifest) {
|
|
6
|
+
const problems = [];
|
|
7
|
+
if (typeof manifest !== 'object' || manifest === null) {
|
|
8
|
+
return ['manifest is not an object'];
|
|
9
|
+
}
|
|
10
|
+
const m = manifest;
|
|
11
|
+
if (m.kind !== 'kraken-driver')
|
|
12
|
+
problems.push(`manifest.kind must be 'kraken-driver'`);
|
|
13
|
+
if (typeof m.id !== 'string' || m.id.length === 0)
|
|
14
|
+
problems.push('manifest.id must be a non-empty string');
|
|
15
|
+
if (!Array.isArray(m.platforms) || m.platforms.length === 0)
|
|
16
|
+
problems.push('manifest.platforms must be a non-empty array');
|
|
17
|
+
if (typeof m.version !== 'string')
|
|
18
|
+
problems.push('manifest.version must be a string');
|
|
19
|
+
if (typeof m.platformLabel !== 'string')
|
|
20
|
+
problems.push('manifest.platformLabel must be a string');
|
|
21
|
+
const contract = m.contract;
|
|
22
|
+
if (typeof contract !== 'object' ||
|
|
23
|
+
contract === null ||
|
|
24
|
+
typeof contract.major !== 'number' ||
|
|
25
|
+
typeof contract.minor !== 'number') {
|
|
26
|
+
problems.push('manifest.contract must be { major, minor } (use defineDriver — never hand-write it)');
|
|
27
|
+
}
|
|
28
|
+
return problems;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Loads, validates, version-checks, and host-gates drivers (ADR-0002 D3/D4).
|
|
32
|
+
* Check order per driver: brand → manifest shape → contract compatibility →
|
|
33
|
+
* host requirements. Every failure is a status with remediation, surfaced via
|
|
34
|
+
* events and `kraken doctor` — never a bare stack trace.
|
|
35
|
+
*/
|
|
36
|
+
export class DriverRegistry {
|
|
37
|
+
#statuses = [];
|
|
38
|
+
#byPlatform = new Map();
|
|
39
|
+
constructor() { }
|
|
40
|
+
static async create(options) {
|
|
41
|
+
const registry = new DriverRegistry();
|
|
42
|
+
for (const registration of options.registrations) {
|
|
43
|
+
const status = await registry.#load(registration, options);
|
|
44
|
+
registry.#statuses.push(status);
|
|
45
|
+
registry.#index(status);
|
|
46
|
+
registry.#announce(status, options.events);
|
|
47
|
+
}
|
|
48
|
+
return registry;
|
|
49
|
+
}
|
|
50
|
+
async #load(registration, options) {
|
|
51
|
+
if (typeof registration === 'string' || Array.isArray(registration)) {
|
|
52
|
+
const [packageName, driverOptions] = typeof registration === 'string'
|
|
53
|
+
? [registration, undefined]
|
|
54
|
+
: registration;
|
|
55
|
+
return this.#loadFromPackage(packageName, driverOptions, options);
|
|
56
|
+
}
|
|
57
|
+
return this.#validate(registration, options.host, '(value registration)');
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* String form: import `<pkg>/manifest` (zero heavy imports) and host-gate
|
|
61
|
+
* BEFORE importing the main entry (ADR-0001 §5.5) — importing driver-ios on
|
|
62
|
+
* Linux must never crash on missing native deps before a friendly error.
|
|
63
|
+
*/
|
|
64
|
+
async #loadFromPackage(packageName, driverOptions, options) {
|
|
65
|
+
if (!options.projectRoot) {
|
|
66
|
+
return {
|
|
67
|
+
state: 'invalid',
|
|
68
|
+
ref: packageName,
|
|
69
|
+
problems: [
|
|
70
|
+
'string-form driver registration requires a projectRoot to resolve from ' +
|
|
71
|
+
'(pass registered driver VALUES instead, or provide projectRoot)',
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const resolve = createRequire(join(options.projectRoot, 'package.json')).resolve;
|
|
76
|
+
let manifest;
|
|
77
|
+
try {
|
|
78
|
+
const manifestPath = resolve(`${packageName}/manifest`);
|
|
79
|
+
const manifestModule = (await import(pathToFileURL(manifestPath).href));
|
|
80
|
+
const candidate = manifestModule.default ?? manifestModule.manifest;
|
|
81
|
+
if (!candidate) {
|
|
82
|
+
return {
|
|
83
|
+
state: 'invalid',
|
|
84
|
+
ref: packageName,
|
|
85
|
+
problems: [`${packageName}/manifest has no default (or named 'manifest') export`],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
manifest = candidate;
|
|
89
|
+
}
|
|
90
|
+
catch (cause) {
|
|
91
|
+
return {
|
|
92
|
+
state: 'invalid',
|
|
93
|
+
ref: packageName,
|
|
94
|
+
problems: [
|
|
95
|
+
`could not resolve ${packageName}/manifest from ${options.projectRoot}: ` +
|
|
96
|
+
`${cause instanceof Error ? cause.message : String(cause)}`,
|
|
97
|
+
`Is the driver installed? Try: kraken plugins install ${packageName}`,
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const problems = manifestProblems(manifest);
|
|
102
|
+
if (problems.length > 0)
|
|
103
|
+
return { state: 'invalid', ref: packageName, problems };
|
|
104
|
+
const gate = checkHostRequirements(manifest.hostRequirements, options.host);
|
|
105
|
+
if (!gate.ok)
|
|
106
|
+
return this.#disabled(manifest, gate.reason, gate.fix);
|
|
107
|
+
// Host OK — now (and only now) import the real entry and build the driver.
|
|
108
|
+
try {
|
|
109
|
+
const entryPath = resolve(packageName);
|
|
110
|
+
const entryModule = (await import(pathToFileURL(entryPath).href));
|
|
111
|
+
if (typeof entryModule.default !== 'function') {
|
|
112
|
+
return {
|
|
113
|
+
state: 'invalid',
|
|
114
|
+
ref: packageName,
|
|
115
|
+
problems: [`${packageName} default export is not a defineDriver() factory`],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return this.#validate(entryModule.default(driverOptions), options.host, packageName);
|
|
119
|
+
}
|
|
120
|
+
catch (cause) {
|
|
121
|
+
return {
|
|
122
|
+
state: 'invalid',
|
|
123
|
+
ref: packageName,
|
|
124
|
+
problems: [
|
|
125
|
+
`failed to load ${packageName}: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
126
|
+
],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
#validate(candidate, host, ref) {
|
|
131
|
+
if (!isKrakenDriver(candidate)) {
|
|
132
|
+
return {
|
|
133
|
+
state: 'invalid',
|
|
134
|
+
ref,
|
|
135
|
+
problems: [
|
|
136
|
+
'value is not a Kraken driver (missing brand). Drivers must be created with ' +
|
|
137
|
+
"defineDriver() from '@kraken-e2e/contracts'.",
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const problems = manifestProblems(candidate.manifest);
|
|
142
|
+
if (problems.length > 0)
|
|
143
|
+
return { state: 'invalid', ref, problems };
|
|
144
|
+
const manifest = candidate.manifest;
|
|
145
|
+
if (!isContractCompatible(manifest.contract, CONTRACT_VERSION)) {
|
|
146
|
+
return {
|
|
147
|
+
state: 'incompatible',
|
|
148
|
+
id: manifest.id,
|
|
149
|
+
platforms: manifest.platforms,
|
|
150
|
+
found: manifest.contract,
|
|
151
|
+
supported: CONTRACT_VERSION,
|
|
152
|
+
fix: manifest.contract.major === CONTRACT_VERSION.major
|
|
153
|
+
? `The driver was built against contract ${manifest.contract.major}.${manifest.contract.minor}, newer than this core supports (${CONTRACT_VERSION.major}.${CONTRACT_VERSION.minor}). Upgrade @kraken-e2e/core.`
|
|
154
|
+
: `Contract majors differ (driver ${manifest.contract.major}.x vs core ${CONTRACT_VERSION.major}.x). Align the driver and @kraken-e2e/core major versions.`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
const gate = checkHostRequirements(manifest.hostRequirements, host);
|
|
158
|
+
if (!gate.ok)
|
|
159
|
+
return this.#disabled(manifest, gate.reason, gate.fix);
|
|
160
|
+
return { state: 'ready', driver: candidate };
|
|
161
|
+
}
|
|
162
|
+
#disabled(manifest, reason, fallbackFix) {
|
|
163
|
+
return {
|
|
164
|
+
state: 'unavailable-on-host',
|
|
165
|
+
manifest,
|
|
166
|
+
code: `KRK-HOST-${manifest.id.toUpperCase()}-UNSUPPORTED`,
|
|
167
|
+
reason: `${manifest.platformLabel} ${reason}`,
|
|
168
|
+
fix: manifest.disabledFix ?? fallbackFix,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
#index(status) {
|
|
172
|
+
const platforms = status.state === 'ready'
|
|
173
|
+
? status.driver.manifest.platforms
|
|
174
|
+
: status.state === 'unavailable-on-host'
|
|
175
|
+
? status.manifest.platforms
|
|
176
|
+
: status.state === 'incompatible'
|
|
177
|
+
? status.platforms
|
|
178
|
+
: [];
|
|
179
|
+
for (const platform of platforms) {
|
|
180
|
+
if (!this.#byPlatform.has(platform))
|
|
181
|
+
this.#byPlatform.set(platform, status);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
#announce(status, events) {
|
|
185
|
+
if (!events)
|
|
186
|
+
return;
|
|
187
|
+
if (status.state === 'ready') {
|
|
188
|
+
events.emit({
|
|
189
|
+
type: 'driverRegistered',
|
|
190
|
+
driverId: status.driver.manifest.id,
|
|
191
|
+
version: status.driver.manifest.version,
|
|
192
|
+
platforms: status.driver.manifest.platforms,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (status.state === 'unavailable-on-host') {
|
|
196
|
+
events.emit({
|
|
197
|
+
type: 'driverDisabled',
|
|
198
|
+
driverId: status.manifest.id,
|
|
199
|
+
code: status.code,
|
|
200
|
+
reason: status.reason,
|
|
201
|
+
fix: status.fix,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
statuses() {
|
|
206
|
+
return this.#statuses;
|
|
207
|
+
}
|
|
208
|
+
readyDrivers() {
|
|
209
|
+
return this.#statuses.flatMap((status) => (status.state === 'ready' ? [status.driver] : []));
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Fails FAST and explicitly (constraint C4b): binding an actor to a
|
|
213
|
+
* host-disabled platform is an error before any session boots.
|
|
214
|
+
*/
|
|
215
|
+
driverFor(platform) {
|
|
216
|
+
const status = this.#byPlatform.get(platform);
|
|
217
|
+
if (!status) {
|
|
218
|
+
const known = [...this.#byPlatform.keys()];
|
|
219
|
+
throw new KrakenError('KRK-DRIVER-UNKNOWN-PLATFORM', `No registered driver provides platform "${platform}".` +
|
|
220
|
+
(known.length > 0
|
|
221
|
+
? ` Known platforms: ${known.join(', ')}.`
|
|
222
|
+
: ' No drivers are registered.'), { fix: 'Register the driver in kraken.config.ts (drivers: [...]).' });
|
|
223
|
+
}
|
|
224
|
+
if (status.state === 'unavailable-on-host') {
|
|
225
|
+
throw new KrakenError(status.code, status.reason, {
|
|
226
|
+
fix: status.fix,
|
|
227
|
+
data: { driverId: status.manifest.id, platform },
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (status.state === 'incompatible') {
|
|
231
|
+
throw new KrakenError('KRK-PLUGIN-INCOMPATIBLE', `Driver "${status.id}" was built against contract ` +
|
|
232
|
+
`${status.found.major}.${status.found.minor}; this core supports ` +
|
|
233
|
+
`${status.supported.major}.${status.supported.minor}.`, { fix: status.fix });
|
|
234
|
+
}
|
|
235
|
+
if (status.state === 'invalid') {
|
|
236
|
+
throw new KrakenError('KRK-PLUGIN-INVALID', `Driver "${status.ref}" failed validation.`, {
|
|
237
|
+
data: { problems: status.problems },
|
|
238
|
+
fix: status.problems.join(' | '),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return status.driver;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { HostContext, Logger, Reporter } from '@kraken-e2e/contracts';
|
|
2
|
+
import { type SignalBus } from '@kraken-e2e/signaling';
|
|
3
|
+
import { EventBus } from './event-bus.js';
|
|
4
|
+
import { type LogLine } from './logger.js';
|
|
5
|
+
import type { DriverRegistry } from './registry.js';
|
|
6
|
+
import { type ScenarioPlan } from './scheduler.js';
|
|
7
|
+
export interface ScenarioResult {
|
|
8
|
+
readonly scenarioId: string;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly status: 'passed' | 'failed';
|
|
11
|
+
readonly durationMs: number;
|
|
12
|
+
readonly error?: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface RunnerDependencies {
|
|
15
|
+
readonly registry: DriverRegistry;
|
|
16
|
+
readonly signalBus: SignalBus;
|
|
17
|
+
readonly events: EventBus;
|
|
18
|
+
readonly hostContext: HostContext;
|
|
19
|
+
readonly artifactsDir: string;
|
|
20
|
+
readonly logger?: Logger;
|
|
21
|
+
readonly logSink?: (line: LogLine) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Runs one scenario end to end (ADR-0002 D7): boot all actor sessions
|
|
25
|
+
* (allSettled + rollback — never leak a booted device), open the signal scope,
|
|
26
|
+
* execute the plan, capture artifacts from ALL actors on failure, and tear
|
|
27
|
+
* everything down in finally with timeout guards.
|
|
28
|
+
*/
|
|
29
|
+
export declare class ScenarioRunner {
|
|
30
|
+
#private;
|
|
31
|
+
private readonly deps;
|
|
32
|
+
constructor(deps: RunnerDependencies);
|
|
33
|
+
run(plan: ScenarioPlan): Promise<ScenarioResult>;
|
|
34
|
+
}
|
|
35
|
+
export interface RunOptions {
|
|
36
|
+
readonly plans: readonly ScenarioPlan[];
|
|
37
|
+
readonly registry: DriverRegistry;
|
|
38
|
+
readonly signalBus: SignalBus;
|
|
39
|
+
readonly hostContext: HostContext;
|
|
40
|
+
readonly reporters?: readonly Reporter[];
|
|
41
|
+
readonly artifactsDir?: string;
|
|
42
|
+
readonly runId?: string;
|
|
43
|
+
readonly logSink?: (line: LogLine) => void;
|
|
44
|
+
readonly onReporterError?: (reporterId: string, error: unknown) => void;
|
|
45
|
+
}
|
|
46
|
+
export interface RunResult {
|
|
47
|
+
readonly runId: string;
|
|
48
|
+
readonly status: 'passed' | 'failed';
|
|
49
|
+
readonly scenarios: readonly ScenarioResult[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The run coordinator: starts each involved driver once, runs scenarios
|
|
53
|
+
* sequentially, stops drivers and flushes reporters in finally
|
|
54
|
+
* (ADR-0002 D7; Phase 1 runs scenarios serially — parallel scenario
|
|
55
|
+
* scheduling is a later concern).
|
|
56
|
+
*/
|
|
57
|
+
export declare function runScenarios(options: RunOptions): Promise<RunResult>;
|
|
58
|
+
/** Boot-failure sessions and similar cleanup share this constant. */
|
|
59
|
+
export declare const SESSION_DISPOSE_TIMEOUT_MS = 15000;
|
|
60
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,WAAW,EAEX,MAAM,EACN,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAgB,KAAK,OAAO,EAAgB,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA0FnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;AAqDD;;;;;GAKG;AACH,qBAAa,cAAc;;IACb,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,kBAAkB;IAE/C,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;CAuLvD;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACzE;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;CAC/C;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CA8E1E;AAED,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,QAAqB,CAAC"}
|