agent-transport-system 0.4.93 → 0.4.94
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/dist/ats.js +191 -10
- package/dist/ats.js.map +1 -1
- package/package.json +1 -1
package/dist/ats.js
CHANGED
|
@@ -27,7 +27,7 @@ import wrapAnsi from "wrap-ansi";
|
|
|
27
27
|
import { Box, Container, Editor, Key, ProcessTerminal, TUI, Text, getEditorKeybindings, matchesKey } from "@mariozechner/pi-tui";
|
|
28
28
|
|
|
29
29
|
//#region package.json
|
|
30
|
-
var version = "0.4.
|
|
30
|
+
var version = "0.4.94";
|
|
31
31
|
var package_default = {
|
|
32
32
|
$schema: "https://www.schemastore.org/package.json",
|
|
33
33
|
name: "agent-transport-system",
|
|
@@ -8304,7 +8304,7 @@ async function findDaemonDependencyPackageRoot(resolvedEntryPath) {
|
|
|
8304
8304
|
throw new Error(`ATS could not determine the package root for background service dependency entry ${resolvedEntryPath}.`);
|
|
8305
8305
|
}
|
|
8306
8306
|
function buildDaemonServiceLauncherSource() {
|
|
8307
|
-
return `import { readFile } from "node:fs/promises";
|
|
8307
|
+
return `import { access, readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
8308
8308
|
import { join } from "node:path";
|
|
8309
8309
|
import process from "node:process";
|
|
8310
8310
|
import { spawn } from "node:child_process";
|
|
@@ -8329,6 +8329,18 @@ async function readJsonFile(path) {
|
|
|
8329
8329
|
}
|
|
8330
8330
|
}
|
|
8331
8331
|
|
|
8332
|
+
async function pathExists(path) {
|
|
8333
|
+
try {
|
|
8334
|
+
await access(path);
|
|
8335
|
+
return true;
|
|
8336
|
+
} catch (error) {
|
|
8337
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
8338
|
+
return false;
|
|
8339
|
+
}
|
|
8340
|
+
throw error;
|
|
8341
|
+
}
|
|
8342
|
+
}
|
|
8343
|
+
|
|
8332
8344
|
function normalizeInstallState(parsed) {
|
|
8333
8345
|
if (!parsed || parsed.schema !== INSTALL_STATE_SCHEMA || typeof parsed.daemonVersion !== "string" || parsed.daemonVersion.length === 0) {
|
|
8334
8346
|
return null;
|
|
@@ -8372,6 +8384,94 @@ function normalizeBundleState(parsed) {
|
|
|
8372
8384
|
return null;
|
|
8373
8385
|
}
|
|
8374
8386
|
|
|
8387
|
+
function normalizeBundlePackageManifest(parsed) {
|
|
8388
|
+
if (!parsed || typeof parsed.version !== "string" || parsed.version.length === 0) {
|
|
8389
|
+
return null;
|
|
8390
|
+
}
|
|
8391
|
+
return {
|
|
8392
|
+
version: parsed.version,
|
|
8393
|
+
};
|
|
8394
|
+
}
|
|
8395
|
+
|
|
8396
|
+
function uniqueNonEmptyStrings(values) {
|
|
8397
|
+
return [...new Set(values.filter((value) => typeof value === "string" && value.length > 0))];
|
|
8398
|
+
}
|
|
8399
|
+
|
|
8400
|
+
async function findFallbackSelfContainedBundle(input) {
|
|
8401
|
+
const directories = await readdir(BUNDLE_ROOT_PATH, { withFileTypes: true }).catch((error) => {
|
|
8402
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
8403
|
+
return [];
|
|
8404
|
+
}
|
|
8405
|
+
throw error;
|
|
8406
|
+
});
|
|
8407
|
+
const entryScriptRelativePaths = uniqueNonEmptyStrings([
|
|
8408
|
+
input.preferredEntryScriptRelativePath,
|
|
8409
|
+
"dist/ats.js",
|
|
8410
|
+
"dist/ats-dev.js",
|
|
8411
|
+
]);
|
|
8412
|
+
const candidates = [];
|
|
8413
|
+
for (const directory of directories) {
|
|
8414
|
+
if (!directory.isDirectory()) {
|
|
8415
|
+
continue;
|
|
8416
|
+
}
|
|
8417
|
+
const bundleId = directory.name;
|
|
8418
|
+
const bundlePath = join(BUNDLE_ROOT_PATH, bundleId);
|
|
8419
|
+
const manifest = normalizeBundlePackageManifest(
|
|
8420
|
+
await readJsonFile(join(bundlePath, "package.json"))
|
|
8421
|
+
);
|
|
8422
|
+
if (manifest?.version !== input.installState.daemonVersion) {
|
|
8423
|
+
continue;
|
|
8424
|
+
}
|
|
8425
|
+
for (const entryScriptRelativePath of entryScriptRelativePaths) {
|
|
8426
|
+
const entryPath = join(bundlePath, entryScriptRelativePath);
|
|
8427
|
+
if (!(await pathExists(entryPath))) {
|
|
8428
|
+
continue;
|
|
8429
|
+
}
|
|
8430
|
+
const entryStat = await stat(entryPath).catch(() => null);
|
|
8431
|
+
candidates.push({
|
|
8432
|
+
bundleId,
|
|
8433
|
+
entryPath,
|
|
8434
|
+
entryScriptRelativePath,
|
|
8435
|
+
mtimeMs: entryStat?.mtimeMs ?? 0,
|
|
8436
|
+
});
|
|
8437
|
+
break;
|
|
8438
|
+
}
|
|
8439
|
+
}
|
|
8440
|
+
candidates.sort((a, b) => {
|
|
8441
|
+
if (b.mtimeMs !== a.mtimeMs) {
|
|
8442
|
+
return b.mtimeMs - a.mtimeMs;
|
|
8443
|
+
}
|
|
8444
|
+
return b.bundleId.localeCompare(a.bundleId);
|
|
8445
|
+
});
|
|
8446
|
+
return candidates[0] ?? null;
|
|
8447
|
+
}
|
|
8448
|
+
|
|
8449
|
+
async function persistFallbackActiveBundleState(input) {
|
|
8450
|
+
const now = new Date().toISOString();
|
|
8451
|
+
const bundleRootPath = join(BUNDLE_ROOT_PATH, input.bundleId);
|
|
8452
|
+
const nextState = {
|
|
8453
|
+
v: 2,
|
|
8454
|
+
schema: ACTIVE_BUNDLE_SCHEMA,
|
|
8455
|
+
bundleId: input.bundleId,
|
|
8456
|
+
daemonVersion: input.installState.daemonVersion,
|
|
8457
|
+
entryScriptRelativePath: input.entryScriptRelativePath,
|
|
8458
|
+
bundleFormat: "self_contained_v1",
|
|
8459
|
+
sourceEntryScriptPath: input.entryPath,
|
|
8460
|
+
sourcePackageRootPath: bundleRootPath,
|
|
8461
|
+
sourceDistRootPath: join(bundleRootPath, "dist"),
|
|
8462
|
+
sourceDistFingerprint: null,
|
|
8463
|
+
sourceKind: "package_install",
|
|
8464
|
+
createdAt: input.previousBundleState?.createdAt ?? now,
|
|
8465
|
+
updatedAt: now,
|
|
8466
|
+
};
|
|
8467
|
+
await writeFile(ACTIVE_BUNDLE_PATH, \`\${JSON.stringify(nextState, null, 2)}\\n\`, {
|
|
8468
|
+
encoding: "utf8",
|
|
8469
|
+
mode: 0o600,
|
|
8470
|
+
}).catch((error) => {
|
|
8471
|
+
console.error(\`ATS Service launcher recovered a matching bundle but could not update active bundle state: \${String(error)}\`);
|
|
8472
|
+
});
|
|
8473
|
+
}
|
|
8474
|
+
|
|
8375
8475
|
async function resolveEntryPath() {
|
|
8376
8476
|
const installState = normalizeInstallState(await readJsonFile(INSTALL_STATE_PATH));
|
|
8377
8477
|
const bundleState = normalizeBundleState(await readJsonFile(ACTIVE_BUNDLE_PATH));
|
|
@@ -8379,18 +8479,87 @@ async function resolveEntryPath() {
|
|
|
8379
8479
|
throw new Error("ATS Service launcher could not read a valid install state.");
|
|
8380
8480
|
}
|
|
8381
8481
|
if (!bundleState) {
|
|
8382
|
-
|
|
8482
|
+
const fallback = await findFallbackSelfContainedBundle({
|
|
8483
|
+
installState,
|
|
8484
|
+
preferredEntryScriptRelativePath: null,
|
|
8485
|
+
});
|
|
8486
|
+
if (!fallback) {
|
|
8487
|
+
throw new Error("ATS Service launcher could not read a valid active bundle state.");
|
|
8488
|
+
}
|
|
8489
|
+
await persistFallbackActiveBundleState({
|
|
8490
|
+
...fallback,
|
|
8491
|
+
installState,
|
|
8492
|
+
previousBundleState: null,
|
|
8493
|
+
});
|
|
8494
|
+
console.error(\`ATS Service launcher recovered bundle \${fallback.bundleId} because active bundle state was missing or invalid.\`);
|
|
8495
|
+
return fallback.entryPath;
|
|
8383
8496
|
}
|
|
8384
8497
|
if (bundleState.bundleFormat !== "self_contained_v1") {
|
|
8385
|
-
|
|
8498
|
+
const fallback = await findFallbackSelfContainedBundle({
|
|
8499
|
+
installState,
|
|
8500
|
+
preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,
|
|
8501
|
+
});
|
|
8502
|
+
if (!fallback) {
|
|
8503
|
+
throw new Error(\`ATS Service launcher refused to start legacy bundle format \${String(bundleState.bundleFormat)}.\`);
|
|
8504
|
+
}
|
|
8505
|
+
await persistFallbackActiveBundleState({
|
|
8506
|
+
...fallback,
|
|
8507
|
+
installState,
|
|
8508
|
+
previousBundleState: bundleState,
|
|
8509
|
+
});
|
|
8510
|
+
console.error(\`ATS Service launcher recovered bundle \${fallback.bundleId} because active bundle state used legacy bundle format \${String(bundleState.bundleFormat)}.\`);
|
|
8511
|
+
return fallback.entryPath;
|
|
8386
8512
|
}
|
|
8387
8513
|
if (bundleState.sourceKind === "workspace" && !ALLOW_WORKSPACE_BUNDLE_SOURCE) {
|
|
8388
|
-
|
|
8514
|
+
const fallback = await findFallbackSelfContainedBundle({
|
|
8515
|
+
installState,
|
|
8516
|
+
preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,
|
|
8517
|
+
});
|
|
8518
|
+
if (!fallback) {
|
|
8519
|
+
throw new Error("ATS Service launcher refused to start a repo-local workspace bundle in this lane. Repo-local service bundles are only allowed through \`ats-dev\`.");
|
|
8520
|
+
}
|
|
8521
|
+
await persistFallbackActiveBundleState({
|
|
8522
|
+
...fallback,
|
|
8523
|
+
installState,
|
|
8524
|
+
previousBundleState: bundleState,
|
|
8525
|
+
});
|
|
8526
|
+
console.error(\`ATS Service launcher recovered bundle \${fallback.bundleId} because active bundle state pointed at a repo-local workspace bundle in this lane.\`);
|
|
8527
|
+
return fallback.entryPath;
|
|
8389
8528
|
}
|
|
8390
8529
|
if (bundleState.daemonVersion !== installState.daemonVersion) {
|
|
8391
|
-
|
|
8530
|
+
const fallback = await findFallbackSelfContainedBundle({
|
|
8531
|
+
installState,
|
|
8532
|
+
preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,
|
|
8533
|
+
});
|
|
8534
|
+
if (!fallback) {
|
|
8535
|
+
throw new Error(\`ATS Service launcher detected bundle version drift: bundle v\${String(bundleState.daemonVersion)} != install v\${String(installState.daemonVersion)}.\`);
|
|
8536
|
+
}
|
|
8537
|
+
await persistFallbackActiveBundleState({
|
|
8538
|
+
...fallback,
|
|
8539
|
+
installState,
|
|
8540
|
+
previousBundleState: bundleState,
|
|
8541
|
+
});
|
|
8542
|
+
console.error(\`ATS Service launcher recovered bundle \${fallback.bundleId} because active bundle state had version drift.\`);
|
|
8543
|
+
return fallback.entryPath;
|
|
8544
|
+
}
|
|
8545
|
+
const entryPath = join(BUNDLE_ROOT_PATH, bundleState.bundleId, bundleState.entryScriptRelativePath);
|
|
8546
|
+
if (await pathExists(entryPath)) {
|
|
8547
|
+
return entryPath;
|
|
8392
8548
|
}
|
|
8393
|
-
|
|
8549
|
+
const fallback = await findFallbackSelfContainedBundle({
|
|
8550
|
+
installState,
|
|
8551
|
+
preferredEntryScriptRelativePath: bundleState.entryScriptRelativePath,
|
|
8552
|
+
});
|
|
8553
|
+
if (!fallback) {
|
|
8554
|
+
throw new Error(\`ATS Service launcher could not find active bundle entry \${entryPath}.\`);
|
|
8555
|
+
}
|
|
8556
|
+
await persistFallbackActiveBundleState({
|
|
8557
|
+
...fallback,
|
|
8558
|
+
installState,
|
|
8559
|
+
previousBundleState: bundleState,
|
|
8560
|
+
});
|
|
8561
|
+
console.error(\`ATS Service launcher recovered bundle \${fallback.bundleId} because active bundle entry was missing.\`);
|
|
8562
|
+
return fallback.entryPath;
|
|
8394
8563
|
}
|
|
8395
8564
|
|
|
8396
8565
|
async function main() {
|
|
@@ -15688,8 +15857,9 @@ function resolvePrimaryAction(input) {
|
|
|
15688
15857
|
if (!input.profile.active || input.profile.source === "unavailable") return "check_status";
|
|
15689
15858
|
if (!input.binding.routable) return input.binding.source === "unavailable" || input.binding.source === "not_checked" ? "check_status" : "reconnect_binding";
|
|
15690
15859
|
if (!input.service.executionCompatible || hasServiceUpdateRequiredReason(input.service.reasonCodes)) return "update_service";
|
|
15691
|
-
if (!(input.localService.reachable || input.route.online)) return "run_prepare";
|
|
15692
15860
|
if (hasServiceUpdateRequiredReason(input.runtime.reasonCodes)) return "update_service";
|
|
15861
|
+
if (hasBindingReconnectReason(input.localService.reasonCodes) || input.claim.executionBlocked && hasBindingReconnectReason(input.claim.reasonCodes)) return "reconnect_binding";
|
|
15862
|
+
if (!(input.localService.reachable || input.route.online)) return "run_prepare";
|
|
15693
15863
|
if (!input.runtime.ready) return resolveRuntimeNotReadyPrimaryAction({
|
|
15694
15864
|
localService: input.localService,
|
|
15695
15865
|
runtime: input.runtime
|
|
@@ -15711,9 +15881,15 @@ function resolveBlockedClaimPrimaryAction(input) {
|
|
|
15711
15881
|
];
|
|
15712
15882
|
if (hasServiceUpdateRequiredReason(claimAndRuntimeReasonCodes)) return "update_service";
|
|
15713
15883
|
if (hasRuntimeCapabilityReportRefreshReason(claimAndRuntimeReasonCodes) && input.localService.refreshable) return "check_status";
|
|
15884
|
+
if (hasBindingReconnectReason(input.claim.reasonCodes)) return "reconnect_binding";
|
|
15714
15885
|
if (hasSetupRepairReason(input.claim.reasonCodes)) return "run_prepare";
|
|
15715
15886
|
return "run_prepare";
|
|
15716
15887
|
}
|
|
15888
|
+
function hasBindingReconnectReason(reasonCodes) {
|
|
15889
|
+
return reasonCodes.some((reasonCode) => {
|
|
15890
|
+
return reasonCode === "claim_eligibility.binding_capability_mismatch" || reasonCode === "claim_eligibility.binding_owner_mismatch" || reasonCode === "claim_eligibility.binding_runtime_mismatch" || reasonCode === "claim_eligibility.owner_mismatch" || reasonCode === "claim_eligibility.runtime_id_mismatch" || reasonCode === "local_service.identity_mismatch";
|
|
15891
|
+
});
|
|
15892
|
+
}
|
|
15717
15893
|
function resolveRuntimeNotReadyPrimaryAction(input) {
|
|
15718
15894
|
if (hasRuntimeCapabilityReportRefreshReason(input.runtime.reasonCodes) && input.localService.refreshable) return "check_status";
|
|
15719
15895
|
return "run_prepare";
|
|
@@ -52336,8 +52512,9 @@ async function stopRegisteredDaemonServiceManager(input) {
|
|
|
52336
52512
|
runtimeStatus: input.ownerSnapshot.runtimeStatus
|
|
52337
52513
|
});
|
|
52338
52514
|
}
|
|
52515
|
+
let residualCleanupResult;
|
|
52339
52516
|
try {
|
|
52340
|
-
await stopResidualDaemonProcessesAfterManagerStop({
|
|
52517
|
+
residualCleanupResult = await stopResidualDaemonProcessesAfterManagerStop({
|
|
52341
52518
|
force: input.force,
|
|
52342
52519
|
mode: input.mode,
|
|
52343
52520
|
runtimeStatus: input.ownerSnapshot.runtimeStatus
|
|
@@ -52350,7 +52527,7 @@ async function stopRegisteredDaemonServiceManager(input) {
|
|
|
52350
52527
|
errorMessage: toErrorMessage$12(error)
|
|
52351
52528
|
});
|
|
52352
52529
|
}
|
|
52353
|
-
const finalOwnerSnapshot = await readCurrentDaemonOwnerSnapshot();
|
|
52530
|
+
const finalOwnerSnapshot = residualCleanupResult.shouldRefresh ? await readCurrentDaemonOwnerSnapshot() : residualCleanupResult.ownerSnapshot;
|
|
52354
52531
|
if (hasActiveDaemonOwners(finalOwnerSnapshot) || finalOwnerSnapshot.serviceManagerStatus?.enabled === true) return buildDaemonStopWarningResult({
|
|
52355
52532
|
reason: "stop_failed",
|
|
52356
52533
|
runtimeStatus: finalOwnerSnapshot.runtimeStatus,
|
|
@@ -52387,6 +52564,10 @@ async function stopResidualDaemonProcessesAfterManagerStop(input) {
|
|
|
52387
52564
|
throw new Error(`Residual ATS-owned process pid=${String(processInfo.pid)} did not exit after ${signal}.`);
|
|
52388
52565
|
}
|
|
52389
52566
|
}
|
|
52567
|
+
return {
|
|
52568
|
+
ownerSnapshot: residualOwnerSnapshot,
|
|
52569
|
+
shouldRefresh: residualOwnerSnapshot.ownedProcesses.length > 0
|
|
52570
|
+
};
|
|
52390
52571
|
}
|
|
52391
52572
|
async function stopCurrentLaneDaemonProcess(input) {
|
|
52392
52573
|
const daemonPid = input.runtimeStatus.pid;
|