@kodelyth/acpx 2026.5.42 → 2026.6.2

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/src/service.ts DELETED
@@ -1,630 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import fs from "node:fs/promises";
3
- import path from "node:path";
4
- import { inspect } from "node:util";
5
- import { formatErrorMessage } from "klaw/plugin-sdk/error-runtime";
6
- import type {
7
- AcpRuntime,
8
- AcpRuntimeEvent,
9
- KlawPluginService,
10
- KlawPluginServiceContext,
11
- PluginLogger,
12
- } from "../runtime-api.js";
13
- import { registerAcpRuntimeBackend, unregisterAcpRuntimeBackend } from "../runtime-api.js";
14
- import { prepareAcpxCodexAuthConfig } from "./codex-auth-bridge.js";
15
- import { DEFAULT_ACPX_TIMEOUT_SECONDS } from "./config-schema.js";
16
- import {
17
- resolveAcpxPluginConfig,
18
- toAcpMcpServers,
19
- type ResolvedAcpxPluginConfig,
20
- } from "./config.js";
21
- import { createAcpxProcessLeaseStore, type AcpxProcessLeaseStore } from "./process-lease.js";
22
- import {
23
- cleanupKlawOwnedAcpxProcessTree,
24
- reapStaleKlawOwnedAcpxOrphans,
25
- type AcpxProcessCleanupDeps,
26
- } from "./process-reaper.js";
27
-
28
- type AcpxRuntimeLike = AcpRuntime & {
29
- probeAvailability(): Promise<void>;
30
- isHealthy(): boolean;
31
- doctor?(): Promise<{
32
- ok: boolean;
33
- message: string;
34
- details?: string[];
35
- }>;
36
- };
37
- type AcpRuntimeTurnInput = Parameters<AcpRuntime["runTurn"]>[0];
38
- type AcpRuntimeTurn = ReturnType<NonNullable<AcpRuntime["startTurn"]>>;
39
- type AcpRuntimeTurnResult = Awaited<AcpRuntimeTurn["result"]>;
40
-
41
- const ENABLE_STARTUP_PROBE_ENV = "KLAW_ACPX_RUNTIME_STARTUP_PROBE";
42
- const SKIP_RUNTIME_PROBE_ENV = "KLAW_SKIP_ACPX_RUNTIME_PROBE";
43
- const ACPX_BACKEND_ID = "acpx";
44
-
45
- type AcpxRuntimeModule = typeof import("./runtime.js");
46
- let runtimeModulePromise: Promise<AcpxRuntimeModule> | null = null;
47
-
48
- type AcpxRuntimeFactoryParams = {
49
- pluginConfig: ResolvedAcpxPluginConfig;
50
- gatewayInstanceId: string;
51
- processLeaseStore: AcpxProcessLeaseStore;
52
- wrapperRoot: string;
53
- logger?: PluginLogger;
54
- };
55
-
56
- type CreateAcpxRuntimeServiceParams = {
57
- pluginConfig?: unknown;
58
- runtimeFactory?: (params: AcpxRuntimeFactoryParams) => AcpxRuntimeLike | Promise<AcpxRuntimeLike>;
59
- processCleanupDeps?: AcpxProcessCleanupDeps;
60
- };
61
-
62
- function loadRuntimeModule(): Promise<AcpxRuntimeModule> {
63
- runtimeModulePromise ??= import("./runtime.js");
64
- return runtimeModulePromise;
65
- }
66
-
67
- function createDeferredResult<T>() {
68
- let resolve!: (value: T) => void;
69
- let reject!: (error: unknown) => void;
70
- const promise = new Promise<T>((resolvePromise, rejectPromise) => {
71
- resolve = resolvePromise;
72
- reject = rejectPromise;
73
- });
74
- return { promise, resolve, reject };
75
- }
76
-
77
- class LegacyRunTurnEventQueue {
78
- private readonly items: AcpRuntimeEvent[] = [];
79
- private readonly waits: Array<{
80
- resolve: (value: AcpRuntimeEvent | null) => void;
81
- reject: (error: unknown) => void;
82
- }> = [];
83
- private closed = false;
84
- private error: unknown;
85
-
86
- push(item: AcpRuntimeEvent): void {
87
- if (this.closed) {
88
- return;
89
- }
90
- const waiter = this.waits.shift();
91
- if (waiter) {
92
- waiter.resolve(item);
93
- return;
94
- }
95
- this.items.push(item);
96
- }
97
-
98
- clear(): void {
99
- this.items.length = 0;
100
- }
101
-
102
- close(): void {
103
- if (this.closed) {
104
- return;
105
- }
106
- this.closed = true;
107
- for (const waiter of this.waits.splice(0)) {
108
- waiter.resolve(null);
109
- }
110
- }
111
-
112
- fail(error: unknown): void {
113
- if (this.closed) {
114
- return;
115
- }
116
- this.error = error;
117
- this.closed = true;
118
- for (const waiter of this.waits.splice(0)) {
119
- waiter.reject(error);
120
- }
121
- }
122
-
123
- private async next(): Promise<AcpRuntimeEvent | null> {
124
- const item = this.items.shift();
125
- if (item) {
126
- return item;
127
- }
128
- if (this.error) {
129
- throw this.error;
130
- }
131
- if (this.closed) {
132
- return null;
133
- }
134
- return await new Promise<AcpRuntimeEvent | null>((resolve, reject) => {
135
- this.waits.push({ resolve, reject });
136
- });
137
- }
138
-
139
- async *iterate(): AsyncIterable<AcpRuntimeEvent> {
140
- for (;;) {
141
- const item = await this.next();
142
- if (!item) {
143
- return;
144
- }
145
- yield item;
146
- }
147
- }
148
- }
149
-
150
- function legacyRunTurnAsStartTurn(runtime: AcpRuntime, input: AcpRuntimeTurnInput): AcpRuntimeTurn {
151
- const result = createDeferredResult<AcpRuntimeTurnResult>();
152
- result.promise.catch(() => {});
153
- const queue = new LegacyRunTurnEventQueue();
154
- let resultSettled = false;
155
- const settleResult = (next: AcpRuntimeTurnResult) => {
156
- if (resultSettled) {
157
- return;
158
- }
159
- resultSettled = true;
160
- result.resolve(next);
161
- };
162
- void (async () => {
163
- try {
164
- for await (const event of runtime.runTurn(input)) {
165
- if (event.type === "done") {
166
- settleResult({
167
- status: "completed",
168
- ...(event.stopReason ? { stopReason: event.stopReason } : {}),
169
- });
170
- continue;
171
- }
172
- if (event.type === "error") {
173
- settleResult({
174
- status: "failed",
175
- error: {
176
- message: event.message,
177
- ...(event.code ? { code: event.code } : {}),
178
- ...(event.detailCode ? { detailCode: event.detailCode } : {}),
179
- ...(event.retryable === undefined ? {} : { retryable: event.retryable }),
180
- },
181
- });
182
- continue;
183
- }
184
- queue.push(event);
185
- }
186
- settleResult({
187
- status: "failed",
188
- error: {
189
- code: "ACP_TURN_FAILED",
190
- message: "ACP turn ended without a terminal done event.",
191
- },
192
- });
193
- } catch (error) {
194
- result.reject(error);
195
- queue.fail(error);
196
- return;
197
- }
198
- queue.close();
199
- })();
200
- return {
201
- requestId: input.requestId,
202
- events: queue.iterate(),
203
- result: result.promise,
204
- async cancel(inputArgs) {
205
- await runtime.cancel({ handle: input.handle, reason: inputArgs?.reason });
206
- },
207
- async closeStream() {
208
- queue.clear();
209
- queue.close();
210
- },
211
- };
212
- }
213
-
214
- function startRuntimeTurn(runtime: AcpRuntime, input: AcpRuntimeTurnInput): AcpRuntimeTurn {
215
- return runtime.startTurn?.(input) ?? legacyRunTurnAsStartTurn(runtime, input);
216
- }
217
-
218
- function createLazyDefaultRuntime(params: AcpxRuntimeFactoryParams): AcpxRuntimeLike {
219
- let runtime: AcpxRuntimeLike | null = null;
220
- let runtimePromise: Promise<AcpxRuntimeLike> | null = null;
221
-
222
- async function resolveRuntime(): Promise<AcpxRuntimeLike> {
223
- if (runtime) {
224
- return runtime;
225
- }
226
- runtimePromise ??= loadRuntimeModule().then((module) => {
227
- runtime = new module.AcpxRuntime({
228
- cwd: params.pluginConfig.cwd,
229
- klawGatewayInstanceId: params.gatewayInstanceId,
230
- klawProcessLeaseStore: params.processLeaseStore,
231
- klawWrapperRoot: params.wrapperRoot,
232
- sessionStore: module.createFileSessionStore({
233
- stateDir: params.pluginConfig.stateDir,
234
- }),
235
- agentRegistry: module.createAgentRegistry({
236
- overrides: params.pluginConfig.agents,
237
- }),
238
- probeAgent: params.pluginConfig.probeAgent,
239
- mcpServers: toAcpMcpServers(params.pluginConfig.mcpServers),
240
- permissionMode: params.pluginConfig.permissionMode,
241
- nonInteractivePermissions: params.pluginConfig.nonInteractivePermissions,
242
- timeoutMs:
243
- params.pluginConfig.timeoutSeconds != null
244
- ? params.pluginConfig.timeoutSeconds * 1_000
245
- : undefined,
246
- }) as AcpxRuntimeLike;
247
- return runtime;
248
- });
249
- return await runtimePromise;
250
- }
251
-
252
- return {
253
- async ensureSession(input) {
254
- return await (await resolveRuntime()).ensureSession(input);
255
- },
256
- startTurn(input) {
257
- const turnPromise = resolveRuntime().then((resolved) => startRuntimeTurn(resolved, input));
258
- return {
259
- requestId: input.requestId,
260
- events: {
261
- async *[Symbol.asyncIterator]() {
262
- yield* (await turnPromise).events;
263
- },
264
- },
265
- result: turnPromise.then((turn) => turn.result),
266
- cancel(inputArgs) {
267
- return turnPromise.then((turn) => turn.cancel(inputArgs));
268
- },
269
- closeStream(inputArgs) {
270
- return turnPromise.then((turn) => turn.closeStream(inputArgs));
271
- },
272
- };
273
- },
274
- async *runTurn(input) {
275
- yield* (await resolveRuntime()).runTurn(input);
276
- },
277
- async getCapabilities(input) {
278
- return (await (await resolveRuntime()).getCapabilities?.(input)) ?? { controls: [] };
279
- },
280
- async getStatus(input) {
281
- return (await (await resolveRuntime()).getStatus?.(input)) ?? {};
282
- },
283
- async setMode(input) {
284
- await (await resolveRuntime()).setMode?.(input);
285
- },
286
- async setConfigOption(input) {
287
- await (await resolveRuntime()).setConfigOption?.(input);
288
- },
289
- async doctor() {
290
- return (await (await resolveRuntime()).doctor?.()) ?? { ok: true, message: "ok" };
291
- },
292
- async prepareFreshSession(input) {
293
- await (await resolveRuntime()).prepareFreshSession?.(input);
294
- },
295
- async cancel(input) {
296
- await (await resolveRuntime()).cancel(input);
297
- },
298
- async close(input) {
299
- await (await resolveRuntime()).close(input);
300
- },
301
- async probeAvailability() {
302
- await (await resolveRuntime()).probeAvailability();
303
- },
304
- isHealthy() {
305
- return runtime?.isHealthy() ?? false;
306
- },
307
- };
308
- }
309
-
310
- function warnOnIgnoredLegacyCompatibilityConfig(params: {
311
- pluginConfig: ResolvedAcpxPluginConfig;
312
- logger?: PluginLogger;
313
- }): void {
314
- const ignoredFields: string[] = [];
315
- if (params.pluginConfig.legacyCompatibilityConfig.queueOwnerTtlSeconds != null) {
316
- ignoredFields.push("queueOwnerTtlSeconds");
317
- }
318
- if (params.pluginConfig.legacyCompatibilityConfig.strictWindowsCmdWrapper === false) {
319
- ignoredFields.push("strictWindowsCmdWrapper=false");
320
- }
321
- if (ignoredFields.length === 0) {
322
- return;
323
- }
324
- params.logger?.warn(
325
- `embedded acpx runtime ignores legacy compatibility config: ${ignoredFields.join(", ")}`,
326
- );
327
- }
328
-
329
- function formatDoctorDetail(detail: unknown): string | null {
330
- if (!detail) {
331
- return null;
332
- }
333
- if (typeof detail === "string") {
334
- return detail.trim() || null;
335
- }
336
- if (detail instanceof Error) {
337
- return formatErrorMessage(detail);
338
- }
339
- if (typeof detail === "object") {
340
- try {
341
- return JSON.stringify(detail) ?? inspect(detail, { breakLength: Infinity, depth: 3 });
342
- } catch {
343
- return inspect(detail, { breakLength: Infinity, depth: 3 });
344
- }
345
- }
346
- if (
347
- typeof detail === "number" ||
348
- typeof detail === "boolean" ||
349
- typeof detail === "bigint" ||
350
- typeof detail === "symbol"
351
- ) {
352
- return detail.toString();
353
- }
354
- return inspect(detail, { breakLength: Infinity, depth: 3 });
355
- }
356
-
357
- function formatDoctorFailureMessage(report: { message: string; details?: unknown[] }): string {
358
- const detailText = report.details?.map(formatDoctorDetail).filter(Boolean).join("; ").trim();
359
- return detailText ? `${report.message} (${detailText})` : report.message;
360
- }
361
-
362
- function normalizeProbeAgent(value: string | undefined): string | undefined {
363
- const normalized = value?.trim().toLowerCase();
364
- return normalized ? normalized : undefined;
365
- }
366
-
367
- function resolveAllowedAgentsProbeAgent(ctx: KlawPluginServiceContext): string | undefined {
368
- for (const agent of ctx.config.acp?.allowedAgents ?? []) {
369
- const normalized = normalizeProbeAgent(agent);
370
- if (normalized) {
371
- return normalized;
372
- }
373
- }
374
- return undefined;
375
- }
376
-
377
- async function measureAcpxStartup<T>(
378
- ctx: KlawPluginServiceContext,
379
- name: string,
380
- run: () => T | Promise<T>,
381
- ): Promise<T> {
382
- return ctx.startupTrace ? await ctx.startupTrace.measure(name, run) : await run();
383
- }
384
-
385
- function detailAcpxStartup(
386
- ctx: KlawPluginServiceContext,
387
- name: string,
388
- metrics: ReadonlyArray<readonly [string, number | string]>,
389
- ): void {
390
- ctx.startupTrace?.detail?.(name, metrics);
391
- }
392
-
393
- function shouldRunStartupProbe(env: NodeJS.ProcessEnv = process.env): boolean {
394
- return env[ENABLE_STARTUP_PROBE_ENV] !== "0";
395
- }
396
-
397
- function shouldProbeRuntimeAtStartup(env: NodeJS.ProcessEnv = process.env): boolean {
398
- return shouldRunStartupProbe(env) && env[SKIP_RUNTIME_PROBE_ENV] !== "1";
399
- }
400
-
401
- async function withStartupProbeTimeout<T>(params: {
402
- promise: Promise<T>;
403
- timeoutSeconds: number;
404
- }): Promise<T> {
405
- let timeout: ReturnType<typeof setTimeout> | undefined;
406
- const timeoutMs = Math.max(1, params.timeoutSeconds * 1_000);
407
- try {
408
- return await Promise.race([
409
- params.promise,
410
- new Promise<never>((_, reject) => {
411
- timeout = setTimeout(() => {
412
- reject(
413
- new Error(
414
- `embedded acpx runtime backend startup probe timed out after ${params.timeoutSeconds}s`,
415
- ),
416
- );
417
- }, timeoutMs);
418
- (timeout as { unref?: () => void }).unref?.();
419
- }),
420
- ]);
421
- } finally {
422
- if (timeout) {
423
- clearTimeout(timeout);
424
- }
425
- }
426
- }
427
-
428
- async function resolveGatewayInstanceId(stateDir: string): Promise<string> {
429
- const filePath = path.join(stateDir, "gateway-instance-id");
430
- try {
431
- const existing = (await fs.readFile(filePath, "utf8")).trim();
432
- if (existing) {
433
- return existing;
434
- }
435
- } catch (error) {
436
- if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
437
- throw error;
438
- }
439
- }
440
- const next = randomUUID();
441
- await fs.mkdir(stateDir, { recursive: true });
442
- await fs.writeFile(filePath, `${next}\n`, { mode: 0o600 });
443
- return next;
444
- }
445
-
446
- async function reapOpenAcpxProcessLeases(params: {
447
- gatewayInstanceId: string;
448
- leaseStore: AcpxProcessLeaseStore;
449
- deps?: AcpxProcessCleanupDeps;
450
- }): Promise<{ inspectedPids: number[]; terminatedPids: number[] }> {
451
- const leases = await params.leaseStore.listOpen(params.gatewayInstanceId);
452
- const inspectedPids: number[] = [];
453
- const terminatedPids: number[] = [];
454
- const pendingLeaseRootResults = new Map<
455
- string,
456
- { inspectedPids: number[]; terminatedPids: number[] }
457
- >();
458
- for (const lease of leases) {
459
- if (lease.rootPid <= 0) {
460
- await params.leaseStore.markState(lease.leaseId, "closing");
461
- let result = pendingLeaseRootResults.get(lease.wrapperRoot);
462
- if (!result) {
463
- result = await reapStaleKlawOwnedAcpxOrphans({
464
- wrapperRoot: lease.wrapperRoot,
465
- deps: params.deps,
466
- });
467
- pendingLeaseRootResults.set(lease.wrapperRoot, result);
468
- inspectedPids.push(...result.inspectedPids);
469
- terminatedPids.push(...result.terminatedPids);
470
- }
471
- await params.leaseStore.markState(
472
- lease.leaseId,
473
- result.terminatedPids.length > 0 ? "closed" : "lost",
474
- );
475
- continue;
476
- }
477
- await params.leaseStore.markState(lease.leaseId, "closing");
478
- const result = await cleanupKlawOwnedAcpxProcessTree({
479
- rootPid: lease.rootPid,
480
- expectedLeaseId: lease.leaseId,
481
- expectedGatewayInstanceId: lease.gatewayInstanceId,
482
- wrapperRoot: lease.wrapperRoot,
483
- deps: params.deps,
484
- });
485
- inspectedPids.push(...result.inspectedPids);
486
- terminatedPids.push(...result.terminatedPids);
487
- await params.leaseStore.markState(
488
- lease.leaseId,
489
- result.terminatedPids.length > 0 ? "closed" : "lost",
490
- );
491
- }
492
- return { inspectedPids, terminatedPids };
493
- }
494
-
495
- export function createAcpxRuntimeService(
496
- params: CreateAcpxRuntimeServiceParams = {},
497
- ): KlawPluginService {
498
- let runtime: AcpxRuntimeLike | null = null;
499
- let lifecycleRevision = 0;
500
-
501
- return {
502
- id: "acpx-runtime",
503
- async start(ctx: KlawPluginServiceContext): Promise<void> {
504
- if (process.env.KLAW_SKIP_ACPX_RUNTIME === "1") {
505
- ctx.logger.info("skipping embedded acpx runtime backend (KLAW_SKIP_ACPX_RUNTIME=1)");
506
- return;
507
- }
508
-
509
- const basePluginConfig = await measureAcpxStartup(ctx, "config.resolve", () =>
510
- resolveAcpxPluginConfig({
511
- rawConfig: params.pluginConfig,
512
- workspaceDir: ctx.workspaceDir,
513
- }),
514
- );
515
- const effectiveBasePluginConfig: ResolvedAcpxPluginConfig = {
516
- ...basePluginConfig,
517
- probeAgent: basePluginConfig.probeAgent ?? resolveAllowedAgentsProbeAgent(ctx),
518
- };
519
- const pluginConfig = await measureAcpxStartup(ctx, "config.prepare-codex-auth", () =>
520
- prepareAcpxCodexAuthConfig({
521
- pluginConfig: effectiveBasePluginConfig,
522
- stateDir: ctx.stateDir,
523
- logger: ctx.logger,
524
- }),
525
- );
526
- const wrapperRoot = path.join(ctx.stateDir, "acpx");
527
- await measureAcpxStartup(ctx, "filesystem.prepare", async () => {
528
- await fs.mkdir(pluginConfig.stateDir, { recursive: true });
529
- await fs.mkdir(wrapperRoot, { recursive: true });
530
- });
531
- const gatewayInstanceId = await measureAcpxStartup(ctx, "gateway-instance-id", () =>
532
- resolveGatewayInstanceId(ctx.stateDir),
533
- );
534
- const processLeaseStore = createAcpxProcessLeaseStore({ stateDir: wrapperRoot });
535
- const startupReap = await measureAcpxStartup(ctx, "process-leases.reap", () =>
536
- reapOpenAcpxProcessLeases({
537
- gatewayInstanceId,
538
- leaseStore: processLeaseStore,
539
- deps: params.processCleanupDeps,
540
- }),
541
- );
542
- if (startupReap.terminatedPids.length > 0) {
543
- ctx.logger.info(
544
- `reaped ${startupReap.terminatedPids.length} stale Klaw-owned ACPX process${startupReap.terminatedPids.length === 1 ? "" : "es"}`,
545
- );
546
- }
547
- warnOnIgnoredLegacyCompatibilityConfig({
548
- pluginConfig,
549
- logger: ctx.logger,
550
- });
551
-
552
- const startedRuntime = await measureAcpxStartup(ctx, "runtime.create", () =>
553
- params.runtimeFactory
554
- ? params.runtimeFactory({
555
- pluginConfig,
556
- gatewayInstanceId,
557
- processLeaseStore,
558
- wrapperRoot,
559
- logger: ctx.logger,
560
- })
561
- : createLazyDefaultRuntime({
562
- pluginConfig,
563
- gatewayInstanceId,
564
- processLeaseStore,
565
- wrapperRoot,
566
- logger: ctx.logger,
567
- }),
568
- );
569
- runtime = startedRuntime;
570
-
571
- const shouldProbeRuntime = shouldProbeRuntimeAtStartup();
572
- detailAcpxStartup(ctx, "probe-policy", [
573
- ["startupProbeEnabledCount", shouldProbeRuntime ? 1 : 0],
574
- ["probeAgent", pluginConfig.probeAgent ?? "default"],
575
- ]);
576
- await measureAcpxStartup(ctx, "backend.register", () => {
577
- registerAcpRuntimeBackend({
578
- id: ACPX_BACKEND_ID,
579
- runtime: startedRuntime,
580
- ...(shouldProbeRuntime ? { healthy: () => runtime?.isHealthy() ?? false } : {}),
581
- });
582
- ctx.logger.info(`embedded acpx runtime backend registered (cwd: ${pluginConfig.cwd})`);
583
- });
584
-
585
- if (!shouldProbeRuntime) {
586
- return;
587
- }
588
-
589
- lifecycleRevision += 1;
590
- const currentRevision = lifecycleRevision;
591
- try {
592
- await measureAcpxStartup(ctx, "probe.availability", () =>
593
- withStartupProbeTimeout({
594
- promise: startedRuntime.probeAvailability(),
595
- timeoutSeconds: pluginConfig.timeoutSeconds ?? DEFAULT_ACPX_TIMEOUT_SECONDS,
596
- }),
597
- );
598
- if (currentRevision !== lifecycleRevision) {
599
- return;
600
- }
601
- if (startedRuntime.isHealthy()) {
602
- detailAcpxStartup(ctx, "probe.result", [["healthyCount", 1]]);
603
- ctx.logger.info("embedded acpx runtime backend ready");
604
- return;
605
- }
606
- const doctorReport = await measureAcpxStartup(ctx, "probe.doctor", () =>
607
- startedRuntime.doctor?.(),
608
- );
609
- if (currentRevision !== lifecycleRevision) {
610
- return;
611
- }
612
- detailAcpxStartup(ctx, "probe.result", [["healthyCount", 0]]);
613
- ctx.logger.warn(
614
- `embedded acpx runtime backend probe failed: ${doctorReport ? formatDoctorFailureMessage(doctorReport) : "backend remained unhealthy after probe"}`,
615
- );
616
- } catch (err) {
617
- if (currentRevision !== lifecycleRevision) {
618
- return;
619
- }
620
- detailAcpxStartup(ctx, "probe.result", [["healthyCount", 0]]);
621
- ctx.logger.warn(`embedded acpx runtime setup failed: ${formatErrorMessage(err)}`);
622
- }
623
- },
624
- async stop(_ctx: KlawPluginServiceContext): Promise<void> {
625
- lifecycleRevision += 1;
626
- unregisterAcpRuntimeBackend(ACPX_BACKEND_ID);
627
- runtime = null;
628
- },
629
- };
630
- }
package/tsconfig.json DELETED
@@ -1,16 +0,0 @@
1
- {
2
- "extends": "../tsconfig.package-boundary.base.json",
3
- "compilerOptions": {
4
- "rootDir": "."
5
- },
6
- "include": ["./*.ts", "./src/**/*.ts"],
7
- "exclude": [
8
- "./**/*.test.ts",
9
- "./dist/**",
10
- "./node_modules/**",
11
- "./src/test-support/**",
12
- "./src/**/*test-helpers.ts",
13
- "./src/**/*test-harness.ts",
14
- "./src/**/*test-support.ts"
15
- ]
16
- }