@pulse-compute/wasm-library-kit 0.0.0 → 1.0.0-beta.1

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.
@@ -0,0 +1,522 @@
1
+ 'use strict';
2
+
3
+ const crypto = require('node:crypto');
4
+ const fs = require('node:fs');
5
+ const os = require('node:os');
6
+ const path = require('node:path');
7
+ const { getDefaultArtifactsDir } = loadBuildSupportArtifactsDir();
8
+ const { spawnSync } = require('node:child_process');
9
+
10
+ function loadBuildSupportArtifactsDir() {
11
+ try {
12
+ return require('@pulse-compute/wasm-build-support/artifacts-dir');
13
+ } catch (error) {
14
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-build-support')) {
15
+ return require('../../../build-support/src/artifacts-dir.js');
16
+ }
17
+ throw error;
18
+ }
19
+ }
20
+
21
+ function loadBuildSupportAssemblyScriptCompile() {
22
+ try {
23
+ return require('@pulse-compute/wasm-build-support/assemblyscript-compile');
24
+ } catch (error) {
25
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-build-support')) {
26
+ return require('../../../build-support/src/assemblyscript-compile.js');
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+
32
+ const { PACKAGE_VERSION, normalizeArtifact, normalizeDiagnostic } = loadContractsDiagnostics();
33
+ const { resolveAsc } = loadBuildSupportAssemblyScriptCompile();
34
+ const {
35
+ normalizeContractModeKeys,
36
+ sortedUnique,
37
+ validateLibraryContract
38
+ } = loadContractsLibraryContracts();
39
+ const {
40
+ LIBRARY_SIDECAR_PHASE: PHASE,
41
+ LIBRARY_SIDECAR_CONSUMPTION_VERSION,
42
+ CTX_EXTENSION_SCOPE_MAP_VERSION,
43
+ LIBRARY_SIDECAR_SMOKE_VERSION,
44
+ defaultCtxExtensionContract,
45
+ validateCtxExtensions,
46
+ ctxExtensionValidationExamples
47
+ } = loadContractsLibrarySidecars();
48
+ const {
49
+ API_SURFACE_VERSION,
50
+ LIFECYCLE_ORDERING_VERSION,
51
+ buildApiSurfaceContract,
52
+ buildLifecycleOrderingContract
53
+ } = loadContractsLibraryApiSurface();
54
+
55
+
56
+ function loadContractsDiagnostics() {
57
+ try {
58
+ return require('@pulse-compute/wasm-contracts/diagnostics');
59
+ } catch (error) {
60
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
61
+ return require('../../../contracts/src/diagnostics.js');
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+
67
+ function loadContractsLibraryContracts() {
68
+ try {
69
+ return require('@pulse-compute/wasm-contracts/library/contracts');
70
+ } catch (error) {
71
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
72
+ return require('../../../contracts/src/library/contracts.js');
73
+ }
74
+ throw error;
75
+ }
76
+ }
77
+
78
+ function loadContractsLibrarySidecars() {
79
+ try {
80
+ return require('@pulse-compute/wasm-contracts/library/sidecars');
81
+ } catch (error) {
82
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
83
+ return require('../../../contracts/src/library/sidecars.js');
84
+ }
85
+ throw error;
86
+ }
87
+ }
88
+
89
+ function loadContractsLibraryApiSurface() {
90
+ try {
91
+ return require('@pulse-compute/wasm-contracts/library/api-surface');
92
+ } catch (error) {
93
+ if (error && error.code === 'MODULE_NOT_FOUND' && String(error.message).includes('@pulse-compute/wasm-contracts')) {
94
+ return require('../../../contracts/src/library/api-surface.js');
95
+ }
96
+ throw error;
97
+ }
98
+ }
99
+
100
+ function sha256Text(text) {
101
+ return crypto.createHash('sha256').update(String(text || ''), 'utf8').digest('hex');
102
+ }
103
+ function sha256Buffer(buffer) {
104
+ return crypto.createHash('sha256').update(buffer).digest('hex');
105
+ }
106
+ function makeFile(file, text) {
107
+ return { file, bytes: Buffer.byteLength(text, 'utf8'), sha256: sha256Text(text), text };
108
+ }
109
+ function stripAnsi(value) {
110
+ return String(value || '').replace(/\u001b\[[0-9;]*m/g, '');
111
+ }
112
+ function truncate(value, max = 20000) {
113
+ const text = String(value || '');
114
+ return text.length <= max ? text : `${text.slice(0, max)}\n... <truncated ${text.length - max} chars>`;
115
+ }
116
+ function parseAscWarnings(stderr) {
117
+ const text = stripAnsi(stderr);
118
+ const warnings = [];
119
+ const regex = /WARNING\s+(AS\d+):\s+([^\n]+)(?:.|\n)*?in ([^\n]+)\((\d+),(\d+)\)/g;
120
+ let match;
121
+ while ((match = regex.exec(text))) {
122
+ warnings.push({ code: match[1], message: match[2].trim(), file: match[3], line: Number(match[4]), column: Number(match[5]) });
123
+ }
124
+ if (warnings.length === 0 && /WARNING\s+AS\d+:/m.test(text)) {
125
+ warnings.push({ code: 'AS_WARNING', message: 'AssemblyScript emitted one or more warnings. Inspect stderr.' });
126
+ }
127
+ return warnings;
128
+ }
129
+ function makeDiagnostic(code, message, hint, details) {
130
+ return normalizeDiagnostic({
131
+ phase: 'library-sidecars',
132
+ severity: 'error',
133
+ code,
134
+ message,
135
+ hint,
136
+ details,
137
+ loc: { file: '<library-sidecars>' }
138
+ });
139
+ }
140
+ function fileRecord(filePath, cwd, kind) {
141
+ const buffer = fs.readFileSync(filePath);
142
+ return { file: path.relative(cwd, filePath).replace(/\\/g, '/'), kind, bytes: buffer.length, sha256: sha256Buffer(buffer) };
143
+ }
144
+
145
+ function buildApiSurface() {
146
+ return buildApiSurfaceContract({ generatedBy: PACKAGE_VERSION });
147
+ }
148
+
149
+ function buildLifecycleOrdering(executionPlan) {
150
+ return buildLifecycleOrderingContract(executionPlan, { generatedBy: PACKAGE_VERSION, phase: PHASE });
151
+ }
152
+
153
+
154
+ function buildCtxExtensionScopeMap(contract, executionPlan) {
155
+ const modes = normalizeContractModeKeys(contract.modes);
156
+ const extensions = Array.isArray(modes.wasm?.ctxExtensions) ? modes.wasm.ctxExtensions : [];
157
+ const scopes = Array.isArray(executionPlan?.scopes) ? executionPlan.scopes : [];
158
+ const entries = Array.isArray(executionPlan?.entries) ? executionPlan.entries : [];
159
+ const extension = extensions[0];
160
+ const installerName = extension?.installedBy?.tsSymbol || 'testExtension';
161
+ const installerEntries = entries.filter((entry) => entry.kind === 'use' && entry.handler && entry.handler.name === installerName);
162
+
163
+ // The fixture proves the scope metadata shape. Real route/scope proof will attach exact scope ranges later.
164
+ const installedScopes = installerEntries.length > 0
165
+ ? sortedUnique(installerEntries.map((entry) => entry.scopeId))
166
+ : [0];
167
+ const scopeExtensions = scopes.map((scope) => ({
168
+ scopeId: scope.id,
169
+ extensions: installedScopes.includes(scope.id) || scope.id === 0 ? [{ namespace: extension?.namespace || 'test', package: contract.package, installedBy: installerName }] : []
170
+ }));
171
+
172
+ return {
173
+ version: CTX_EXTENSION_SCOPE_MAP_VERSION,
174
+ generatedBy: PACKAGE_VERSION,
175
+ phase: PHASE,
176
+ status: 'ok',
177
+ policy: {
178
+ dynamicCtxMutationAllowedInTsMode: true,
179
+ compiledWasmRequiresDeclaredCtxExtension: true,
180
+ ctxExtensionAvailabilityIsScopeChecked: true,
181
+ arbitraryCtxDecorationRejected: true,
182
+ fixtureOnly: true
183
+ },
184
+ summary: {
185
+ libraries: 1,
186
+ ctxExtensions: extensions.length,
187
+ installedScopes: installedScopes.length,
188
+ methods: extensions.reduce((sum, item) => sum + (item.methods || []).length, 0),
189
+ fixture: true
190
+ },
191
+ extensions: extensions.map((item) => ({
192
+ namespace: item.namespace,
193
+ package: contract.package,
194
+ installedBy: item.installedBy,
195
+ methods: item.methods || []
196
+ })),
197
+ installedScopes,
198
+ scopeExtensions,
199
+ validationExamples: ctxExtensionValidationExamples()
200
+ };
201
+ }
202
+
203
+ function buildSidecarSource() {
204
+ return `/*
205
+ * Generated Phase 12C fixture sidecar.
206
+ * Proves generic library ctx extension linking. Do not treat as real pulse.grip.
207
+ */
208
+ let __lastMark: string = ''
209
+ let __markCount: i32 = 0
210
+
211
+ export function pulse_test_mark(ctx: usize, value: string): void {
212
+ __lastMark = value
213
+ __markCount += 1
214
+ }
215
+
216
+ export function pulse_test_last_mark(): string {
217
+ return __lastMark
218
+ }
219
+
220
+ export function pulse_test_mark_count(): i32 {
221
+ return __markCount
222
+ }
223
+ `;
224
+ }
225
+
226
+ function buildSmokeRunnerSource() {
227
+ return `/* Generated Phase 12C sidecar smoke runner. */
228
+ import {
229
+ pulse_test_mark,
230
+ pulse_test_last_mark,
231
+ pulse_test_mark_count
232
+ } from '../as/library-sidecars/test-extension.as'
233
+
234
+ export function smoke_sidecar_mark(): i32 {
235
+ pulse_test_mark(1, 'ok')
236
+ return pulse_test_last_mark() == 'ok' ? 1 : 0
237
+ }
238
+
239
+ export function smoke_sidecar_count(): i32 {
240
+ pulse_test_mark(1, 'first')
241
+ pulse_test_mark(1, 'second')
242
+ return pulse_test_mark_count() >= 3 ? 1 : 0
243
+ }
244
+ `;
245
+ }
246
+
247
+ function compileSidecarSmoke({ cwd, outDir, files }) {
248
+ const diagnostics = [];
249
+ const asc = resolveAsc(cwd);
250
+ if (!asc) {
251
+ diagnostics.push(makeDiagnostic(
252
+ 'PULSEWASM_ASSEMBLYSCRIPT_ASC_MISSING',
253
+ 'AssemblyScript compiler dependency was not found.',
254
+ 'Run npm install before library sidecar smoke.',
255
+ { dependency: 'assemblyscript' }
256
+ ));
257
+ return { diagnostics, smoke: undefined, outputs: [], warnings: [] };
258
+ }
259
+
260
+ const stagingDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pulsewasm-library-sidecars-'));
261
+ const outputDir = path.join(outDir || getDefaultArtifactsDir(cwd), 'generated', 'library-sidecars');
262
+ fs.mkdirSync(outputDir, { recursive: true });
263
+ for (const file of files) {
264
+ const abs = path.join(stagingDir, file.file);
265
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
266
+ fs.writeFileSync(abs, file.text, 'utf8');
267
+ }
268
+
269
+ const wasmFile = path.join(outputDir, 'pulsewasm-library-sidecar.wasm');
270
+ const watFile = path.join(outputDir, 'pulsewasm-library-sidecar.wat');
271
+ const entry = path.join(stagingDir, 'generated/as-smoke/library-sidecar-smoke-runner.as.ts');
272
+ const ascArgs = [asc.script, entry, '--outFile', wasmFile, '--textFile', watFile, '--runtime', 'stub', '--noAssert'];
273
+ const proc = spawnSync(asc.executable, ascArgs, { cwd, encoding: 'utf8', maxBuffer: 1024 * 1024 * 16 });
274
+ const warnings = parseAscWarnings(proc.stderr);
275
+ if (proc.error || proc.status !== 0) {
276
+ diagnostics.push(makeDiagnostic(
277
+ 'PULSEWASM_LIBRARY_SIDECAR_AS_COMPILE_FAILED',
278
+ `Library sidecar AssemblyScript smoke failed${proc.status !== undefined ? ` with exit code ${proc.status}` : ''}.`,
279
+ 'Inspect library-sidecar-smoke.json stderr/stdout.',
280
+ { stdout: truncate(proc.stdout, 8000), stderr: truncate(proc.stderr, 8000), exitCode: proc.status }
281
+ ));
282
+ }
283
+
284
+ const outputFiles = [];
285
+ if (fs.existsSync(wasmFile)) outputFiles.push(fileRecord(wasmFile, cwd, 'library-sidecar-wasm'));
286
+ if (fs.existsSync(watFile)) outputFiles.push(fileRecord(watFile, cwd, 'library-sidecar-wat'));
287
+
288
+ let smoke;
289
+ if (diagnostics.length === 0 && fs.existsSync(wasmFile)) {
290
+ const wasm = fs.readFileSync(wasmFile);
291
+ const module = new WebAssembly.Module(wasm);
292
+ const imports = WebAssembly.Module.imports(module);
293
+ const importObject = { env: { abort() { throw new Error('AssemblyScript abort'); } } };
294
+ for (const imp of imports) {
295
+ if (!importObject[imp.module]) importObject[imp.module] = {};
296
+ if (!importObject[imp.module][imp.name]) importObject[imp.module][imp.name] = () => 0;
297
+ }
298
+ const instance = new WebAssembly.Instance(module, importObject);
299
+ const checkDefs = [
300
+ ['smoke_sidecar_mark', 1],
301
+ ['smoke_sidecar_count', 1]
302
+ ];
303
+ const checks = [];
304
+ for (const [name, expected] of checkDefs) {
305
+ let actual;
306
+ let status = 'ok';
307
+ let message;
308
+ try {
309
+ const fn = instance.exports[name];
310
+ if (typeof fn !== 'function') {
311
+ status = 'error';
312
+ message = 'Missing smoke export.';
313
+ } else {
314
+ actual = fn();
315
+ if (actual !== expected) {
316
+ status = 'error';
317
+ message = `Expected ${expected}, got ${actual}.`;
318
+ }
319
+ }
320
+ } catch (error) {
321
+ status = 'error';
322
+ message = error && error.message ? error.message : String(error);
323
+ }
324
+ checks.push({ name, expected, actual, status, message });
325
+ }
326
+ smoke = {
327
+ imports,
328
+ exports: WebAssembly.Module.exports(module),
329
+ checks,
330
+ failedChecks: checks.filter((check) => check.status !== 'ok'),
331
+ wasmBytes: wasm.length
332
+ };
333
+ if (smoke.failedChecks.length > 0) {
334
+ diagnostics.push(makeDiagnostic(
335
+ 'PULSEWASM_LIBRARY_SIDECAR_SMOKE_FAILED',
336
+ 'Library sidecar smoke checks failed.',
337
+ 'Inspect library-sidecar-smoke.json checks.',
338
+ { failedChecks: smoke.failedChecks }
339
+ ));
340
+ }
341
+ }
342
+
343
+ return {
344
+ diagnostics,
345
+ warnings,
346
+ smoke,
347
+ outputFiles,
348
+ command: {
349
+ executable: asc.display,
350
+ args: ascArgs.slice(1).map((arg) => path.isAbsolute(arg) ? path.relative(cwd, arg).replace(/\\/g, '/') : arg)
351
+ },
352
+ result: { exitCode: proc.status, stdout: truncate(proc.stdout), stderr: truncate(proc.stderr) }
353
+ };
354
+ }
355
+
356
+ function markdownForSidecars(artifact, apiSurface, ctxExtensionScopeMap, lifecycleOrdering) {
357
+ const lines = [];
358
+ lines.push('# PulseWasm Phase 12C — Library Sidecar Consumption + ctx Extension Fixture');
359
+ lines.push('');
360
+ lines.push('## Status');
361
+ lines.push('Implemented as a generic compiler-side fixture. This is not a real `pulse.grip` or `pulse.assets` implementation.');
362
+ lines.push('');
363
+ lines.push('## Locked boundary');
364
+ lines.push('The PulseWasm compiler owns compatibility enforcement. Libraries own their own Wasm compatibility, sidecars, parity tests, and package-specific semantics.');
365
+ lines.push('');
366
+ lines.push('## Fixture proved');
367
+ lines.push('- `pulse.library.json` ctx extension declaration');
368
+ lines.push('- middleware-installed ctx extension scope metadata');
369
+ lines.push('- declared `ctx.<extension>.<method>` lowering surface');
370
+ lines.push('- AS sidecar linking and smoke execution');
371
+ lines.push('- unknown/unstaged ctx extension behavior remains rejectable by contract');
372
+ lines.push('');
373
+ lines.push(`## Summary`);
374
+ lines.push(`- sidecars: ${artifact.summary.sidecars}`);
375
+ lines.push(`- ctx extensions: ${artifact.summary.ctxExtensions}`);
376
+ lines.push(`- lowerings: ${artifact.summary.lowerings}`);
377
+ lines.push(`- smoke checks: ${artifact.summary.smokeChecks}`);
378
+ lines.push('');
379
+ lines.push('## API surface ledger');
380
+ for (const surface of apiSurface.surfaces) {
381
+ lines.push(`- **${surface.symbol}** — ${surface.status}; ${surface.notes || ''}`);
382
+ }
383
+ lines.push('');
384
+ lines.push('## Lifecycle ordering');
385
+ lines.push(`Default lifecycle ordering: ${lifecycleOrdering.policy.defaultOrdering}. Parallel lifecycle execution is reserved and must be explicit if ever added.`);
386
+ lines.push('');
387
+ lines.push('## Non-goals');
388
+ lines.push('- no real GRIP implementation');
389
+ lines.push('- no real assets implementation');
390
+ lines.push('- no package-specific semantics in the compiler');
391
+ lines.push('- no effect/result interceptors yet');
392
+ lines.push('- no platform target');
393
+ lines.push('');
394
+ return `${lines.join('\n')}\n`;
395
+ }
396
+
397
+ function buildLibrarySidecarConsumption({ executionPlan, handlerLibraryContracts, cwd, outDir, generatedBy } = {}) {
398
+ cwd = cwd || process.cwd();
399
+ generatedBy = generatedBy || PACKAGE_VERSION;
400
+ const contract = defaultCtxExtensionContract();
401
+ const diagnostics = [];
402
+
403
+ const baseValidation = validateLibraryContract(contract);
404
+ diagnostics.push(...(baseValidation.diagnostics || []).map((diag) => normalizeDiagnostic(diag)));
405
+ const extensionValidation = validateCtxExtensions(contract);
406
+ diagnostics.push(...extensionValidation.diagnostics);
407
+
408
+ const apiSurface = normalizeArtifact(buildApiSurface(), cwd);
409
+ const lifecycleOrdering = normalizeArtifact(buildLifecycleOrdering(executionPlan), cwd);
410
+ const ctxExtensionScopeMap = normalizeArtifact(buildCtxExtensionScopeMap(contract, executionPlan), cwd);
411
+
412
+ const sidecarSource = buildSidecarSource();
413
+ const smokeRunnerSource = buildSmokeRunnerSource();
414
+ const files = [
415
+ makeFile('generated/as/library-sidecars/test-extension.as.ts', sidecarSource),
416
+ makeFile('generated/as-smoke/library-sidecar-smoke-runner.as.ts', smokeRunnerSource)
417
+ ];
418
+
419
+ const smokeResult = compileSidecarSmoke({ cwd, outDir, files });
420
+ diagnostics.push(...(smokeResult.diagnostics || []));
421
+
422
+ const smoke = normalizeArtifact({
423
+ version: LIBRARY_SIDECAR_SMOKE_VERSION,
424
+ generatedBy,
425
+ phase: PHASE,
426
+ status: diagnostics.length === 0 ? 'ok' : 'error',
427
+ compiled: Boolean(smokeResult.smoke || (smokeResult.outputFiles || []).some((file) => file.kind === 'library-sidecar-wasm')),
428
+ executed: Boolean(smokeResult.smoke),
429
+ warnings: smokeResult.warnings || [],
430
+ command: smokeResult.command,
431
+ result: smokeResult.result,
432
+ checks: smokeResult.smoke?.checks || [],
433
+ failedChecks: smokeResult.smoke?.failedChecks || [],
434
+ outputFiles: smokeResult.outputFiles || [],
435
+ summary: {
436
+ compiled: Boolean(smokeResult.smoke || (smokeResult.outputFiles || []).some((file) => file.kind === 'library-sidecar-wasm')),
437
+ executed: Boolean(smokeResult.smoke),
438
+ checks: smokeResult.smoke?.checks?.length || 0,
439
+ failedChecks: smokeResult.smoke?.failedChecks?.length || 0,
440
+ warnings: (smokeResult.warnings || []).length,
441
+ diagnostics: diagnostics.length
442
+ }
443
+ }, cwd);
444
+
445
+ const artifact = normalizeArtifact({
446
+ version: LIBRARY_SIDECAR_CONSUMPTION_VERSION,
447
+ generatedBy,
448
+ phase: PHASE,
449
+ status: diagnostics.length === 0 ? 'ok' : 'error',
450
+ scope: {
451
+ genericCompilerMechanism: true,
452
+ fixtureOnly: true,
453
+ realGripImplemented: false,
454
+ realAssetsImplemented: false,
455
+ packageSpecificSemanticsInCompiler: false,
456
+ effectInterceptorsImplemented: false,
457
+ resultDecoratorsImplemented: false,
458
+ platformTarget: false
459
+ },
460
+ policy: {
461
+ compilerOwnsCompatibilityEnforcement: true,
462
+ librariesOwnSidecarsAndSemantics: true,
463
+ dynamicCtxDecorationInTsMode: true,
464
+ compiledWasmRequiresDeclaredCtxExtensions: true,
465
+ ctxExtensionUsageMustBeInScope: true,
466
+ lifecycleOrdering: 'serial-source-order',
467
+ noGuessedLibraryCompatibility: true
468
+ },
469
+ fixture: {
470
+ package: contract.package,
471
+ sidecar: contract.modes.wasm.sidecar,
472
+ ctxExtensions: extensionValidation.extensions.map((extension) => ({
473
+ namespace: extension.namespace,
474
+ installedBy: extension.installedBy,
475
+ methods: extension.methods || []
476
+ })),
477
+ lowerings: contract.modes.wasm.lowerings
478
+ },
479
+ summary: {
480
+ sidecars: 1,
481
+ ctxExtensions: extensionValidation.extensions.length,
482
+ lowerings: contract.modes.wasm.lowerings.length,
483
+ hostCapabilities: sortedUnique(contract.modes.wasm.hostCapabilities).length,
484
+ scopesWithExtensions: ctxExtensionScopeMap.summary.installedScopes,
485
+ apiSurfaces: apiSurface.summary.surfaces,
486
+ lifecycleSerial: true,
487
+ smokeChecks: smoke.summary.checks,
488
+ failedSmokeChecks: smoke.summary.failedChecks,
489
+ diagnostics: diagnostics.length,
490
+ readyForGripPackageAnalysis: diagnostics.length === 0,
491
+ readyForRealAssets: false
492
+ },
493
+ diagnostics: diagnostics.map((diag) => diag.code)
494
+ }, cwd);
495
+
496
+ const markdown = markdownForSidecars(artifact, apiSurface, ctxExtensionScopeMap, lifecycleOrdering);
497
+
498
+ return {
499
+ artifact,
500
+ apiSurface,
501
+ ctxExtensionScopeMap,
502
+ lifecycleOrdering,
503
+ smoke,
504
+ diagnostics,
505
+ files: [
506
+ ...files,
507
+ { file: 'generated/host/library-sidecar-consumption.md', text: markdown }
508
+ ],
509
+ outputFiles: smokeResult.outputFiles || []
510
+ };
511
+ }
512
+
513
+ module.exports = {
514
+ LIBRARY_SIDECAR_CONSUMPTION_VERSION,
515
+ CTX_EXTENSION_SCOPE_MAP_VERSION,
516
+ API_SURFACE_VERSION,
517
+ LIFECYCLE_ORDERING_VERSION,
518
+ LIBRARY_SIDECAR_SMOKE_VERSION,
519
+ defaultCtxExtensionContract,
520
+ validateCtxExtensions,
521
+ buildLibrarySidecarConsumption
522
+ };