agent-transport-system 0.7.13 → 0.7.14

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.
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { Fr as runtimeAgentControllerLaunchContractSchema, Ir as runtimeAgentControllerSettingsSchema, a as runWithHeldLock, n as isAtsLockError, t as acquireLock } from "./lock-BeL3w4ma.js";
3
+ import { Dr as runtimeAgentControllerLaunchContractSchema, Or as runtimeAgentControllerSettingsSchema, a as runWithHeldLock, n as isAtsLockError, t as acquireLock } from "./lock-BbSDV7cL.js";
4
4
  import { D as resolveAtsEnvPreset, _ as deviceSkillsInstallsPath, b as legacyRuntimeConfigPath, g as deviceSkillsDir, h as deviceSkillsCustomTargetsPath, l as deviceAgentRuntimePath, m as devicePreferencesPath, u as deviceDir, v as deviceSkillsStorePath } from "./paths-DFiopT5Y.js";
5
5
  import { dirname, normalize, posix, win32 } from "node:path";
6
6
  import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
@@ -199,20 +199,7 @@ const DEFAULT_RUNTIME_AGENT_STREAMING_MODE = "final";
199
199
  const DEFAULT_LOCAL_ADAPTER_TIMEOUT_MS = null;
200
200
  const DEFAULT_RUNTIME_AGENT_RETRY = 0;
201
201
  const DEFAULT_RUNTIME_AGENT_CONTEXT_MAPPING_VERSION = 1;
202
- const DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD = "ATS_RUNTIME_SESSION_ID";
203
- const DEPRECATED_EXTERNAL_AGENT_CONTEXT_SOURCE_FIELDS = new Set([
204
- "AGENT_SESSION_ID",
205
- "CODEX_THREAD_ID",
206
- "CODEX_SESSION_ID",
207
- "CLAUDE_SESSION_ID",
208
- "ANTHROPIC_SESSION_ID",
209
- "OPENAI_SESSION_ID",
210
- "CURSOR_SESSION_ID",
211
- "TERM_SESSION_ID",
212
- "ITERM_SESSION_ID",
213
- "TMUX_PANE",
214
- "WEZTERM_PANE"
215
- ]);
202
+ const DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD = "ATS_CLI_CONTEXT_ID";
216
203
  const DEFAULT_RUNTIME_DAEMON_GLOBAL_CONCURRENCY = 10;
217
204
  const DEFAULT_RUNTIME_DAEMON_QUEUE_MAX = 50;
218
205
  const CUSTOM_TARGET_ID_PREFIX = "custom-";
@@ -681,7 +668,7 @@ function parseRuntimeAgentControllerSettings(raw, defaults) {
681
668
  timeoutMs: parsed.data.timeout_ms
682
669
  }),
683
670
  retry: parsed.data.retry,
684
- contextIdMappingSpec: normalizeRuntimeAgentContextIdMappingSpec({
671
+ contextIdMappingSpec: normalizeRuntimeAgentControllerConversationIdMappingSpec({
685
672
  contextIdMappingSpec: parsed.data.context_id_mapping_spec,
686
673
  defaults
687
674
  })
@@ -691,8 +678,8 @@ function normalizeRuntimeAgentTimeoutMs(input) {
691
678
  if (input.timeoutMs === 12e4) return input.defaults.timeoutMs;
692
679
  return input.timeoutMs;
693
680
  }
694
- function normalizeRuntimeAgentContextIdMappingSpec(input) {
695
- if (DEPRECATED_EXTERNAL_AGENT_CONTEXT_SOURCE_FIELDS.has(input.contextIdMappingSpec.sourceField)) return input.defaults.contextIdMappingSpec;
681
+ function normalizeRuntimeAgentControllerConversationIdMappingSpec(input) {
682
+ if (input.contextIdMappingSpec.sourceField !== DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD) return input.defaults.contextIdMappingSpec;
696
683
  return input.contextIdMappingSpec;
697
684
  }
698
685
  function resolveRuntimeDaemonDispatchLimits(config) {
@@ -1002,4 +989,4 @@ async function pathExists(path) {
1002
989
 
1003
990
  //#endregion
1004
991
  export { toSpaceCursorUrl as A, toSpaceSignalsUrl as B, resolveDefaultGatewayBaseUrl as C, toDaemonRouteObservationUrl as D, toClaimExecutionDiagnosticsUrl as E, toSpaceMembersUrl as F, toSpaceWsUrl as H, toSpaceMetaUrl as I, toSpacePasswordUrl as L, toSpaceDispatchLookupUrl as M, toSpaceDispatchTraceUrl as N, toSpaceContractUrl as O, toSpaceLeaveUrl as P, toSpaceRemoveMembersUrl as R, resolveBaseUrlOrNull as S, normalizeBaseUrl as T, toSpaceUpdatesUrl as V, updateConfiguredStartV1OnboardingState as _, getConfiguredDeviceRuntimeState as a, normalizeGatewayBaseUrlOrNull as b, getConfiguredStartV1OnboardingState as c, resolveRuntimeSkillsCustomTargetId as d, setConfiguredBaseUrl as f, updateConfiguredSkillsConfig as g, updateConfiguredOnboardingConfig as h, getConfiguredDaemonDispatchLimits as i, toSpaceDeleteUrl as j, toSpaceCreateUrl as k, getConfiguredViewCustomization as l, updateConfiguredDeviceRuntimeState as m, alignRuntimeConfigStorage as n, getConfiguredOnboardingDisclaimerAcceptedAt as o, setConfiguredSkillsConfig as p, createDefaultRuntimeAgentControllerSettings as r, getConfiguredSkillsConfig as s, DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE as t, getRuntimeConfigReadHealth as u, DEV_LOCAL_GATEWAY_BASE_URL as v, resolveExplicitGatewayUrlOrThrow as w, resolveBaseUrl as x, normalizeGatewayBaseUrl as y, toSpaceResultUrl as z };
1005
- //# sourceMappingURL=runtime-config-BmPPPJcT.js.map
992
+ //# sourceMappingURL=runtime-config-CudFeMaG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-config-CudFeMaG.js","names":[],"sources":["../src/protocol/urls.ts","../src/config/base-url.ts","../src/config/runtime-config.ts"],"sourcesContent":["const TRAILING_SLASHES_REGEX = /\\/+$/;\nconst ROOT_PATH_REGEX = /^\\/+$/;\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n const url = new URL(baseUrl);\n if (!ROOT_PATH_REGEX.test(url.pathname)) {\n throw new Error(\"baseUrl must be origin-only (no path prefix)\");\n }\n if (url.search || url.hash) {\n throw new Error(\"baseUrl must be origin-only (no query or hash)\");\n }\n url.pathname = \"\";\n url.search = \"\";\n url.hash = \"\";\n return url.toString().replace(TRAILING_SLASHES_REGEX, \"\");\n}\n\nexport function toSpaceSignalsUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/signals`;\n return url.toString();\n}\n\nexport function toSpaceCreateUrl(baseUrl: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = \"/v1/spaces\";\n return url.toString();\n}\n\nexport function toSpaceDeleteUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}`;\n return url.toString();\n}\n\nexport function toSpaceMetaUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/meta`;\n return url.toString();\n}\n\nexport function toSpaceContractUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/contract`;\n return url.toString();\n}\n\nexport function toSpaceUpdatesUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/updates`;\n return url.toString();\n}\n\nexport function toSpaceStatusUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/status`;\n return url.toString();\n}\n\nexport function toSpaceResultUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/result`;\n return url.toString();\n}\n\nexport function toSpaceMembersUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/members`;\n return url.toString();\n}\n\nexport function toSpaceRemoveMembersUrl(\n baseUrl: string,\n space: string\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/members/remove`;\n return url.toString();\n}\n\nexport function toSpaceLeaveUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/leave`;\n return url.toString();\n}\n\nexport function toSpaceDispatchTraceUrl(\n baseUrl: string,\n space: string,\n dispatchId: string\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/dispatches/${encodeURIComponent(dispatchId)}/trace`;\n return url.toString();\n}\n\nexport function toClaimExecutionDiagnosticsUrl(\n baseUrl: string,\n input: {\n claimLeaseId?: string;\n dispatchId?: string;\n sourceClientMessageId?: string;\n spaceId?: string;\n targetProfileId?: string;\n }\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = \"/v1/diagnostics/claim-execution\";\n appendSearchParam(url.searchParams, \"claimLeaseId\", input.claimLeaseId);\n appendSearchParam(url.searchParams, \"dispatchId\", input.dispatchId);\n appendSearchParam(\n url.searchParams,\n \"sourceClientMessageId\",\n input.sourceClientMessageId\n );\n appendSearchParam(url.searchParams, \"spaceId\", input.spaceId);\n appendSearchParam(url.searchParams, \"targetProfileId\", input.targetProfileId);\n return url.toString();\n}\n\nexport function toSpaceDispatchLookupUrl(\n baseUrl: string,\n space: string\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/dispatches/lookup`;\n return url.toString();\n}\n\nfunction appendSearchParam(\n searchParams: URLSearchParams,\n name: string,\n value: string | undefined\n): void {\n if (value === undefined) {\n return;\n }\n searchParams.set(name, value);\n}\n\nexport function toDaemonRouteObservationUrl(\n baseUrl: string,\n profileId: string\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/daemon/routes/${encodeURIComponent(profileId)}`;\n return url.toString();\n}\n\nexport function toSpacePasswordUrl(baseUrl: string, space: string): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/password`;\n return url.toString();\n}\n\nexport function toSpaceCursorUrl(\n baseUrl: string,\n space: string,\n profileId: string\n): string {\n const url = new URL(normalizeBaseUrl(baseUrl));\n url.pathname = `/v1/spaces/${encodeURIComponent(space)}/cursors/${encodeURIComponent(profileId)}`;\n return url.toString();\n}\n\nexport function toSpaceWsUrl(baseUrl: string, space: string): string {\n const http = new URL(normalizeBaseUrl(baseUrl));\n let wsScheme: \"ws:\" | \"wss:\";\n if (http.protocol === \"http:\") {\n wsScheme = \"ws:\";\n } else if (http.protocol === \"https:\") {\n wsScheme = \"wss:\";\n } else if (http.protocol === \"ws:\" || http.protocol === \"wss:\") {\n wsScheme = http.protocol;\n } else {\n throw new Error(\n `unsupported baseUrl protocol for websocket URL: ${http.protocol}`\n );\n }\n return `${wsScheme}//${http.host}/v1/spaces/${encodeURIComponent(space)}/stream`;\n}\n","import { normalizeBaseUrl } from \"../protocol/urls\";\nimport { resolveAtsEnvPreset } from \"./paths\";\nimport { getConfiguredBaseUrl } from \"./runtime-config\";\n\nexport const DEFAULT_GATEWAY_BASE_URL = \"https://gateway.ats.sh\";\nexport const DEV_LOCAL_GATEWAY_BASE_URL = \"http://localhost:8080\";\nconst AUTH_HOST_LABEL = \"auth\";\nconst AUTH_HOST_PREFIX = \"auth-\";\nconst LOCAL_AUTH_PORT = \"8788\";\n\nexport async function resolveBaseUrl(\n cliValue?: string,\n input: { env?: NodeJS.ProcessEnv } = {}\n): Promise<string> {\n const env = input.env ?? process.env;\n const fromCli = String(cliValue ?? \"\").trim();\n if (fromCli) {\n return normalizeGatewayBaseUrl(fromCli);\n }\n\n // False-positive guard: ATS_BASE_URL fallback is intentionally removed.\n // We only support ATS_GATEWAY_URL to avoid ambiguous env precedence.\n const fromEnv = String(env.ATS_GATEWAY_URL ?? \"\").trim();\n if (fromEnv) {\n return normalizeGatewayBaseUrl(fromEnv);\n }\n\n const fromConfig = await getConfiguredBaseUrl();\n if (fromConfig) {\n return normalizeGatewayBaseUrl(fromConfig);\n }\n\n return normalizeGatewayBaseUrl(resolveDefaultGatewayBaseUrl({ env }));\n}\n\nexport async function resolveBaseUrlOrNull(\n cliValue?: string\n): Promise<string | null> {\n try {\n return await resolveBaseUrl(cliValue);\n } catch {\n return null;\n }\n}\n\nexport async function resolveExplicitGatewayUrlOrThrow(\n cliValue?: string\n): Promise<string | undefined> {\n const explicitGatewayUrl = normalizeOptionalString(cliValue);\n if (!explicitGatewayUrl) {\n return undefined;\n }\n\n try {\n return await Promise.resolve().then(() =>\n normalizeGatewayBaseUrl(explicitGatewayUrl)\n );\n } catch (error) {\n throw new Error(\n `Invalid explicit gateway URL \"${explicitGatewayUrl}\": ${toErrorMessage(error)}`\n );\n }\n}\n\nexport function normalizeGatewayBaseUrl(gatewayUrl: string): string {\n const normalizedGatewayUrl = normalizeBaseUrl(gatewayUrl);\n const parsedGatewayUrl = new URL(normalizedGatewayUrl);\n if (isAuthWorkerUrl(parsedGatewayUrl)) {\n throw new Error(\n \"gateway URL must point to the ATS gateway, not the ATS auth worker\"\n );\n }\n return normalizedGatewayUrl;\n}\n\nexport function normalizeGatewayBaseUrlOrNull(\n gatewayUrl?: string | null\n): string | null {\n const normalizedGatewayUrl = normalizeOptionalString(gatewayUrl);\n if (!normalizedGatewayUrl) {\n return null;\n }\n try {\n return normalizeGatewayBaseUrl(normalizedGatewayUrl);\n } catch {\n return null;\n }\n}\n\nfunction normalizeOptionalString(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nexport function resolveDefaultGatewayBaseUrl(\n input: { env?: NodeJS.ProcessEnv } = {}\n): string {\n const preset = resolveAtsEnvPreset(input);\n if (preset === \"dev-local\" || preset === \"canary\") {\n return DEV_LOCAL_GATEWAY_BASE_URL;\n }\n return DEFAULT_GATEWAY_BASE_URL;\n}\n\nfunction isAuthWorkerUrl(url: URL): boolean {\n if (isLoopbackHostname(url.hostname)) {\n return resolveUrlPort(url) === LOCAL_AUTH_PORT;\n }\n\n const [firstLabel = \"\"] = url.hostname.toLowerCase().split(\".\");\n return (\n firstLabel === AUTH_HOST_LABEL || firstLabel.startsWith(AUTH_HOST_PREFIX)\n );\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n const normalizedHostname = hostname.toLowerCase();\n return (\n normalizedHostname === \"localhost\" ||\n normalizedHostname === \"127.0.0.1\" ||\n normalizedHostname === \"::1\"\n );\n}\n\nfunction resolveUrlPort(url: URL): string {\n if (url.port) {\n return url.port;\n }\n if (url.protocol === \"http:\" || url.protocol === \"ws:\") {\n return \"80\";\n }\n if (url.protocol === \"https:\" || url.protocol === \"wss:\") {\n return \"443\";\n }\n return \"\";\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, normalize, posix, win32 } from \"node:path\";\nimport {\n runtimeAgentControllerLaunchContractSchema,\n runtimeAgentControllerSettingsSchema,\n} from \"@agent-transport-system/schemas\";\nimport type { RuntimeAgentControllerLaunchContract } from \"@agent-transport-system/schemas/types\";\nimport { normalizeGatewayBaseUrl } from \"./base-url\";\nimport {\n type AtsLock,\n acquireLock,\n isAtsLockError,\n runWithHeldLock,\n} from \"./lock\";\nimport {\n deviceAgentRuntimePath,\n deviceDir,\n devicePreferencesPath,\n deviceSkillsCustomTargetsPath,\n deviceSkillsDir,\n deviceSkillsInstallsPath,\n deviceSkillsStorePath,\n legacyRuntimeConfigPath,\n resolveAtsEnvPreset,\n} from \"./paths\";\n\nexport type RuntimeViewCustomization = {\n messages?: {\n human?: Record<string, string>;\n agent?: Record<string, string>;\n };\n render?: {\n human?: {\n dataMode?: \"payload\" | \"envelope\";\n };\n agent?: {\n envelopeMode?: \"verbose\" | \"compact\";\n };\n };\n};\n\nexport type RuntimeSkillsAgentConfig = {\n skillsDir?: string;\n globalSkillsDir?: string;\n};\n\nexport type RuntimeSkillsCustomTarget = {\n id?: string;\n name: string;\n dir: string;\n};\n\nexport type RuntimeSkillsInstallRecord = {\n targetId: string;\n targetDir: string;\n mode: \"symlink\" | \"copy\";\n status: \"installed\" | \"skipped\" | \"failed\";\n skillIds: string[];\n reason?: string;\n updatedAt: string;\n};\n\nexport type RuntimeSkillsConfig = {\n storeDir?: string;\n agents?: Record<string, RuntimeSkillsAgentConfig>;\n customTargets?: RuntimeSkillsCustomTarget[];\n installs?: RuntimeSkillsInstallRecord[];\n};\n\nexport type RuntimeDaemonDispatchConfig = {\n globalConcurrency?: number;\n queueMax?: number;\n};\n\nexport type RuntimeDaemonConfig = {\n dispatch?: RuntimeDaemonDispatchConfig;\n};\n\nexport type RuntimeDaemonDispatchLimits = {\n globalConcurrency: number;\n queueMax: number;\n};\n\nexport type RuntimeAgentTransportMode = \"local-cli\";\nexport type RuntimeAgentStreamingMode = \"final\" | \"stream\";\n\nexport type RuntimeAgentControllerConversationIdMappingSpec = {\n sourceField: string;\n mappingVersion: number;\n};\n\nexport type RuntimeAgentControllerSettings = {\n transportMode: RuntimeAgentTransportMode;\n streamingMode: RuntimeAgentStreamingMode;\n timeoutMs: number | null;\n retry: number;\n contextIdMappingSpec: RuntimeAgentControllerConversationIdMappingSpec;\n};\n\nexport const DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE: RuntimeAgentTransportMode =\n \"local-cli\";\nexport const DEFAULT_RUNTIME_AGENT_STREAMING_MODE: RuntimeAgentStreamingMode =\n \"final\";\n// Normal Agent execution has no fixed wall-clock timeout. Long-running tasks\n// should end by explicit result, failure, cancellation, or stale-progress\n// policy, not by a hard-coded elapsed-time cutoff.\nexport const DEFAULT_LOCAL_ADAPTER_TIMEOUT_MS = null as number | null;\nexport const DEFAULT_RUNTIME_AGENT_RETRY = 0;\nexport const DEFAULT_RUNTIME_AGENT_CONTEXT_MAPPING_VERSION = 1;\nexport const DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD = \"ATS_CLI_CONTEXT_ID\";\nexport const DEFAULT_RUNTIME_DAEMON_GLOBAL_CONCURRENCY = 10;\nexport const DEFAULT_RUNTIME_DAEMON_QUEUE_MAX = 50;\n\nexport type RuntimeAgentControllerState = {\n agentId: string;\n displayName: string;\n enabled: boolean;\n launchContract?: RuntimeAgentControllerLaunchContract;\n transportMode?: RuntimeAgentTransportMode;\n streamingMode?: RuntimeAgentStreamingMode;\n timeoutMs?: number | null;\n retry?: number;\n contextIdMappingSpec?: RuntimeAgentControllerConversationIdMappingSpec;\n registeredAt: string;\n updatedAt: string;\n};\n\nexport type RuntimeDeviceRuntimeState = {\n controllers?: RuntimeAgentControllerState[];\n};\n\nexport type RuntimeStartV1OnboardingState = {\n disclaimerAcceptedVersion?: string;\n lastCompletedAt?: string;\n localAgentsSetupCompletedAt?: string;\n};\n\nexport type RuntimeOnboardingConfig = {\n disclaimerAcceptedAt?: string;\n startV1?: RuntimeStartV1OnboardingState;\n};\n\nexport type RuntimeConfigFallbackReason = \"invalid_json\" | \"invalid_version\";\n\nexport type RuntimeConfigReadHealth = {\n parseFallback: boolean;\n reason?: RuntimeConfigFallbackReason;\n};\n\ntype RuntimeConfigV1 = {\n v: 1;\n baseUrl?: string;\n viewCustomization?: RuntimeViewCustomization;\n skills?: RuntimeSkillsConfig;\n daemon?: RuntimeDaemonConfig;\n deviceRuntimeState?: RuntimeDeviceRuntimeState;\n onboarding?: RuntimeOnboardingConfig;\n updatedAt: string;\n};\n\ntype DevicePreferencesV1 = {\n v: 1;\n baseUrl?: string;\n viewCustomization?: RuntimeViewCustomization;\n daemon?: RuntimeDaemonConfig;\n onboarding?: RuntimeOnboardingConfig;\n updatedAt: string;\n};\n\ntype DeviceAgentRuntimeV1 = {\n v: 1;\n deviceRuntimeState?: RuntimeDeviceRuntimeState;\n updatedAt: string;\n};\n\ntype DeviceSkillsStoreV1 = {\n v: 1;\n storeDir?: string;\n agents?: Record<string, RuntimeSkillsAgentConfig>;\n updatedAt: string;\n};\n\ntype DeviceSkillsCustomTargetsV1 = {\n v: 1;\n customTargets: RuntimeSkillsCustomTarget[];\n updatedAt: string;\n};\n\ntype DeviceSkillsInstallsV1 = {\n v: 1;\n installs: RuntimeSkillsInstallRecord[];\n updatedAt: string;\n};\n\ntype RuntimeMessageCustomization = RuntimeViewCustomization[\"messages\"];\ntype RuntimeRenderCustomization = RuntimeViewCustomization[\"render\"];\ntype RuntimeHumanRender = NonNullable<RuntimeRenderCustomization>[\"human\"];\ntype RuntimeAgentRender = NonNullable<RuntimeRenderCustomization>[\"agent\"];\ntype RuntimeConfigOverrides = {\n baseUrl?: string | null;\n viewCustomization?: RuntimeViewCustomization | null;\n skills?: RuntimeSkillsConfig | null;\n daemon?: RuntimeDaemonConfig | null;\n deviceRuntimeState?: RuntimeDeviceRuntimeState | null;\n onboarding?: RuntimeOnboardingConfig | null;\n};\nconst CUSTOM_TARGET_ID_PREFIX = \"custom-\";\nconst CUSTOM_TARGET_ID_LENGTH = 12;\nconst RUNTIME_CONFIG_LOCK_PROFILE = \"__system__\";\nconst RUNTIME_CONFIG_LOCK_KEY = \"runtime-config\";\nconst RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS = 40;\nconst RUNTIME_CONFIG_LOCK_RETRY_DELAY_MS = 25;\nconst WINDOWS_DRIVE_ONLY_RE = /^[a-zA-Z]:$/;\nconst WINDOWS_DRIVE_PREFIX_RE = /^[a-zA-Z]:[\\\\/]/;\nconst WINDOWS_UNC_RE = /^[/\\\\]{2}[^/\\\\]+[/\\\\]+[^/\\\\]+/;\nconst WINDOWS_DRIVE_ANY_RE = /^[a-zA-Z]:/;\nconst TRAILING_PATH_SEPARATORS_RE = /[\\\\/]+$/;\n\nexport function resolveRuntimeSkillsCustomTargetId(input: {\n dir: string;\n id?: string;\n}): string {\n const existingId =\n typeof input.id === \"string\" && input.id.trim().length > 0\n ? input.id.trim()\n : \"\";\n if (existingId) {\n return existingId;\n }\n const normalizedDir = normalizeCustomTargetDir(input.dir);\n const digest = createHash(\"sha256\").update(normalizedDir).digest(\"hex\");\n return `${CUSTOM_TARGET_ID_PREFIX}${digest.slice(0, CUSTOM_TARGET_ID_LENGTH)}`;\n}\n\nexport function resolveDefaultAgentContextSourceField(\n _agentId: string\n): string {\n return DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD;\n}\n\nexport function createDefaultRuntimeAgentControllerSettings(\n agentId: string\n): RuntimeAgentControllerSettings {\n return {\n transportMode: DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,\n streamingMode: resolveDefaultRuntimeAgentStreamingMode(),\n timeoutMs: DEFAULT_LOCAL_ADAPTER_TIMEOUT_MS,\n retry: DEFAULT_RUNTIME_AGENT_RETRY,\n contextIdMappingSpec: {\n sourceField: resolveDefaultAgentContextSourceField(agentId),\n mappingVersion: DEFAULT_RUNTIME_AGENT_CONTEXT_MAPPING_VERSION,\n },\n };\n}\n\nconst resolveDefaultRuntimeAgentStreamingMode =\n (): RuntimeAgentStreamingMode => {\n const preset = resolveAtsEnvPreset();\n if (preset === \"dev-local\" || preset === \"canary\") {\n return \"stream\";\n }\n return DEFAULT_RUNTIME_AGENT_STREAMING_MODE;\n };\n\nexport async function getConfiguredBaseUrl(): Promise<string | null> {\n const config = await readRuntimeConfig();\n if (!config?.baseUrl) {\n return null;\n }\n return normalizeGatewayBaseUrl(config.baseUrl);\n}\n\nexport async function getConfiguredViewCustomization(): Promise<RuntimeViewCustomization | null> {\n const config = await readRuntimeConfig();\n return config?.viewCustomization ?? null;\n}\n\nexport async function getConfiguredSkillsConfig(): Promise<RuntimeSkillsConfig | null> {\n const config = await readRuntimeConfig();\n return config?.skills ?? null;\n}\n\nexport async function getConfiguredDeviceRuntimeState(): Promise<RuntimeDeviceRuntimeState | null> {\n const config = await readRuntimeConfig();\n return config?.deviceRuntimeState ?? null;\n}\n\nexport async function getConfiguredDaemonDispatchLimits(): Promise<RuntimeDaemonDispatchLimits> {\n const config = await readRuntimeConfig();\n return resolveRuntimeDaemonDispatchLimits(config?.daemon?.dispatch);\n}\n\nexport async function getConfiguredOnboardingConfig(): Promise<RuntimeOnboardingConfig | null> {\n const config = await readRuntimeConfig();\n return config?.onboarding ?? null;\n}\n\nexport async function getConfiguredOnboardingDisclaimerAcceptedAt(): Promise<\n string | null\n> {\n const onboarding = await getConfiguredOnboardingConfig();\n return onboarding?.disclaimerAcceptedAt ?? null;\n}\n\nexport async function getConfiguredStartV1OnboardingState(): Promise<RuntimeStartV1OnboardingState | null> {\n const onboarding = await getConfiguredOnboardingConfig();\n return onboarding?.startV1 ?? null;\n}\n\nexport async function getRuntimeConfigReadHealth(): Promise<RuntimeConfigReadHealth> {\n const result = await readRuntimeConfigDetailed();\n return result.health;\n}\n\nexport async function alignRuntimeConfigStorage(): Promise<{\n migratedLegacyConfig: boolean;\n removedLegacyConfig: boolean;\n}> {\n return await withRuntimeConfigLock(async () => {\n const split = await readSplitRuntimeConfigDetailed();\n const legacy = await readLegacyRuntimeConfigDetailed();\n const hasLegacyConfig = await pathExists(legacyRuntimeConfigPath());\n\n if (legacy.config && (!split.hasFiles || split.health.parseFallback)) {\n await writeRuntimeConfig(legacy.config);\n return {\n migratedLegacyConfig: true,\n removedLegacyConfig: hasLegacyConfig,\n };\n }\n\n if (hasLegacyConfig && split.hasFiles) {\n await rm(legacyRuntimeConfigPath(), { force: true });\n return {\n migratedLegacyConfig: false,\n removedLegacyConfig: true,\n };\n }\n\n return {\n migratedLegacyConfig: false,\n removedLegacyConfig: false,\n };\n });\n}\n\nexport async function setConfiguredBaseUrl(baseUrl: string): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const normalized = normalizeGatewayBaseUrl(baseUrl);\n const previous = await readRuntimeConfig();\n const next = buildNextConfig(previous, { baseUrl: normalized });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function setConfiguredSkillsConfig(\n skills: RuntimeSkillsConfig\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const next = buildNextConfig(previous, { skills });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function updateConfiguredSkillsConfig(\n updater: (current: RuntimeSkillsConfig | null) => RuntimeSkillsConfig | null\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const previousSkills = previous?.skills ?? null;\n const nextSkills = updater(previousSkills);\n\n const previousComparable = JSON.stringify(previousSkills);\n const nextComparable = JSON.stringify(nextSkills);\n if (previousComparable === nextComparable) {\n return;\n }\n\n const next = buildNextConfig(previous, { skills: nextSkills });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function setConfiguredDeviceRuntimeState(\n deviceRuntimeState: RuntimeDeviceRuntimeState\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const next = buildNextConfig(previous, { deviceRuntimeState });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function updateConfiguredDeviceRuntimeState(\n updater: (\n current: RuntimeDeviceRuntimeState | null\n ) => RuntimeDeviceRuntimeState | null\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const previousDeviceRuntimeState = previous?.deviceRuntimeState ?? null;\n const nextDeviceRuntimeState = updater(previousDeviceRuntimeState);\n\n const previousComparable = JSON.stringify(previousDeviceRuntimeState);\n const nextComparable = JSON.stringify(nextDeviceRuntimeState);\n if (previousComparable === nextComparable) {\n return;\n }\n\n const next = buildNextConfig(previous, {\n deviceRuntimeState: nextDeviceRuntimeState,\n });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function updateConfiguredStartV1OnboardingState(\n updater: (\n current: RuntimeStartV1OnboardingState | null\n ) => RuntimeStartV1OnboardingState | null\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const previousOnboarding = previous?.onboarding ?? null;\n const previousStartV1 = previousOnboarding?.startV1 ?? null;\n const nextStartV1 = updater(previousStartV1);\n\n const previousComparable = JSON.stringify(previousStartV1);\n const nextComparable = JSON.stringify(nextStartV1);\n if (previousComparable === nextComparable) {\n return;\n }\n\n const nextOnboarding =\n nextStartV1 || previousOnboarding?.disclaimerAcceptedAt\n ? {\n ...(previousOnboarding?.disclaimerAcceptedAt\n ? {\n disclaimerAcceptedAt: previousOnboarding.disclaimerAcceptedAt,\n }\n : {}),\n ...(nextStartV1 ? { startV1: nextStartV1 } : {}),\n }\n : null;\n const next = buildNextConfig(previous, {\n onboarding: nextOnboarding,\n });\n\n await writeRuntimeConfig(next);\n });\n}\n\nexport async function updateConfiguredOnboardingConfig(\n updater: (\n current: RuntimeOnboardingConfig | null\n ) => RuntimeOnboardingConfig | null\n): Promise<void> {\n await withRuntimeConfigLock(async () => {\n const previous = await readRuntimeConfig();\n const previousOnboarding = previous?.onboarding ?? null;\n const nextOnboarding = updater(previousOnboarding);\n\n const previousComparable = JSON.stringify(previousOnboarding);\n const nextComparable = JSON.stringify(nextOnboarding);\n if (previousComparable === nextComparable) {\n return;\n }\n\n const next = buildNextConfig(previous, {\n onboarding: nextOnboarding,\n });\n\n await writeRuntimeConfig(next);\n });\n}\n\nfunction buildNextConfig(\n previous: RuntimeConfigV1 | null,\n overrides: RuntimeConfigOverrides\n): RuntimeConfigV1 {\n const baseUrl = resolveBaseUrlOverride(previous?.baseUrl, overrides);\n const viewCustomization = resolveConfigOverride(\n \"viewCustomization\",\n previous?.viewCustomization,\n overrides\n );\n const skills = resolveConfigOverride(\"skills\", previous?.skills, overrides);\n const daemon = resolveConfigOverride(\"daemon\", previous?.daemon, overrides);\n const deviceRuntimeState = resolveConfigOverride(\n \"deviceRuntimeState\",\n previous?.deviceRuntimeState,\n overrides\n );\n const onboarding = resolveConfigOverride(\n \"onboarding\",\n previous?.onboarding,\n overrides\n );\n\n return {\n v: 1,\n ...(baseUrl ? { baseUrl } : {}),\n ...(viewCustomization ? { viewCustomization } : {}),\n ...(skills ? { skills } : {}),\n ...(daemon ? { daemon } : {}),\n ...(deviceRuntimeState ? { deviceRuntimeState } : {}),\n ...(onboarding ? { onboarding } : {}),\n updatedAt: new Date().toISOString(),\n };\n}\n\nfunction resolveBaseUrlOverride(\n previous: string | undefined,\n overrides: RuntimeConfigOverrides\n): string | undefined {\n if (!(\"baseUrl\" in overrides)) {\n return previous;\n }\n if (typeof overrides.baseUrl !== \"string\" || overrides.baseUrl.length === 0) {\n return undefined;\n }\n return overrides.baseUrl;\n}\n\nfunction resolveConfigOverride<T>(\n key:\n | \"viewCustomization\"\n | \"skills\"\n | \"daemon\"\n | \"deviceRuntimeState\"\n | \"onboarding\",\n previous: T | undefined,\n overrides: RuntimeConfigOverrides\n): T | undefined {\n if (!(key in overrides)) {\n return previous;\n }\n const value = overrides[key] as T | null | undefined;\n return value ?? undefined;\n}\n\nasync function acquireRuntimeConfigLock(): Promise<AtsLock> {\n for (\n let attempt = 0;\n attempt < RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS;\n attempt += 1\n ) {\n try {\n return await acquireLock({\n atsProfileId: RUNTIME_CONFIG_LOCK_PROFILE,\n key: RUNTIME_CONFIG_LOCK_KEY,\n });\n } catch (error) {\n if (\n !isAtsLockError(error) ||\n attempt === RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS - 1\n ) {\n throw error;\n }\n await delay(RUNTIME_CONFIG_LOCK_RETRY_DELAY_MS);\n }\n }\n\n throw new Error(\"runtime config lock retries exhausted\");\n}\n\nasync function withRuntimeConfigLock<T>(run: () => Promise<T>): Promise<T> {\n const lock = await acquireRuntimeConfigLock();\n return await runWithHeldLock({\n lock,\n run,\n releaseContext: {\n component: \"runtime_config\",\n lockKey: RUNTIME_CONFIG_LOCK_KEY,\n atsProfileId: RUNTIME_CONFIG_LOCK_PROFILE,\n },\n });\n}\n\nasync function readRuntimeConfig(): Promise<RuntimeConfigV1 | null> {\n const result = await readRuntimeConfigDetailed();\n return result.config;\n}\n\nasync function readRuntimeConfigDetailed(): Promise<{\n config: RuntimeConfigV1 | null;\n health: RuntimeConfigReadHealth;\n}> {\n const split = await readSplitRuntimeConfigDetailed();\n if (split.hasFiles) {\n return {\n config: split.config,\n health: split.health,\n };\n }\n return await readLegacyRuntimeConfigDetailed();\n}\n\nfunction parseConfiguredBaseUrl(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n try {\n return normalizeGatewayBaseUrl(value);\n } catch {\n return undefined;\n }\n}\n\nfunction parseRuntimeViewCustomization(\n value: unknown\n): RuntimeViewCustomization | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const obj = value as {\n messages?: unknown;\n render?: unknown;\n };\n\n const messages = parseMessageCustomization(obj.messages);\n const render = parseRenderCustomization(obj.render);\n\n if (!(messages || render)) {\n return undefined;\n }\n\n return {\n ...(messages ? { messages } : {}),\n ...(render ? { render } : {}),\n };\n}\n\nfunction parseRuntimeSkillsConfig(\n value: unknown\n): RuntimeSkillsConfig | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const obj = value as {\n storeDir?: unknown;\n agents?: unknown;\n customTargets?: unknown;\n installs?: unknown;\n };\n\n const storeDir =\n typeof obj.storeDir === \"string\" && obj.storeDir.trim().length > 0\n ? obj.storeDir.trim()\n : undefined;\n const agents = parseRuntimeSkillsAgents(obj.agents);\n const installs = parseRuntimeSkillsInstallRecords(obj.installs);\n const customTargets = parseRuntimeSkillsCustomTargets(\n obj.customTargets,\n buildLegacyCustomTargetIdByDir(installs)\n );\n\n if (!(storeDir || agents || customTargets || installs)) {\n return undefined;\n }\n\n return {\n ...(storeDir ? { storeDir } : {}),\n ...(agents ? { agents } : {}),\n ...(customTargets ? { customTargets } : {}),\n ...(installs ? { installs } : {}),\n };\n}\n\nfunction parseRuntimeDaemonConfig(\n value: unknown\n): RuntimeDaemonConfig | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const obj = value as {\n dispatch?: unknown;\n };\n const dispatch = parseRuntimeDaemonDispatchConfig(obj.dispatch);\n if (!dispatch) {\n return undefined;\n }\n return { dispatch };\n}\n\nfunction parseRuntimeDaemonDispatchConfig(\n value: unknown\n): RuntimeDaemonDispatchConfig | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const obj = value as {\n globalConcurrency?: unknown;\n queueMax?: unknown;\n };\n const globalConcurrency = parsePositiveInteger(obj.globalConcurrency);\n const queueMax = parsePositiveInteger(obj.queueMax);\n if (globalConcurrency === undefined && queueMax === undefined) {\n return undefined;\n }\n return {\n ...(globalConcurrency === undefined ? {} : { globalConcurrency }),\n ...(queueMax === undefined ? {} : { queueMax }),\n };\n}\n\nfunction parseRuntimeDeviceRuntimeState(\n value: unknown\n): RuntimeDeviceRuntimeState | undefined {\n const fromDeviceRuntimeState = parseRuntimeDeviceRuntimeStateObject(value);\n return fromDeviceRuntimeState;\n}\n\nfunction parseRuntimeDeviceRuntimeStateObject(\n value: unknown\n): RuntimeDeviceRuntimeState | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const obj = value as {\n controllers?: unknown;\n };\n const controllers = parseRuntimeAgentControllerStates(obj.controllers);\n if (!controllers) {\n return undefined;\n }\n\n return {\n controllers,\n };\n}\n\nfunction parseRuntimeOnboardingConfig(\n value: unknown\n): RuntimeOnboardingConfig | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const obj = value as {\n disclaimerAcceptedAt?: unknown;\n startV1?: unknown;\n };\n const disclaimerAcceptedAt = toTrimmedStringOrUndefined(\n obj.disclaimerAcceptedAt\n );\n const startV1 = parseRuntimeStartV1OnboardingState(obj.startV1);\n if (!(disclaimerAcceptedAt || startV1)) {\n return undefined;\n }\n return {\n ...(disclaimerAcceptedAt ? { disclaimerAcceptedAt } : {}),\n ...(startV1 ? { startV1 } : {}),\n };\n}\n\nfunction parseRuntimeStartV1OnboardingState(\n value: unknown\n): RuntimeStartV1OnboardingState | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const obj = value as {\n disclaimerAcceptedVersion?: unknown;\n lastCompletedAt?: unknown;\n localAgentsSetupCompletedAt?: unknown;\n };\n const disclaimerAcceptedVersion = toTrimmedStringOrUndefined(\n obj.disclaimerAcceptedVersion\n );\n const lastCompletedAt = toTrimmedStringOrUndefined(obj.lastCompletedAt);\n const localAgentsSetupCompletedAt = toTrimmedStringOrUndefined(\n obj.localAgentsSetupCompletedAt\n );\n if (\n !(\n disclaimerAcceptedVersion ||\n lastCompletedAt ||\n localAgentsSetupCompletedAt\n )\n ) {\n return undefined;\n }\n return {\n ...(disclaimerAcceptedVersion ? { disclaimerAcceptedVersion } : {}),\n ...(lastCompletedAt ? { lastCompletedAt } : {}),\n ...(localAgentsSetupCompletedAt ? { localAgentsSetupCompletedAt } : {}),\n };\n}\n\nasync function writeRuntimeConfig(next: RuntimeConfigV1): Promise<void> {\n await mkdir(deviceDir(), { recursive: true });\n await mkdir(deviceSkillsDir(), { recursive: true });\n\n const updatedAt = new Date().toISOString();\n await writeJsonFileOrRemove(\n devicePreferencesPath(),\n buildDevicePreferencesState(next, updatedAt)\n );\n await writeJsonFileOrRemove(\n deviceAgentRuntimePath(),\n buildDeviceAgentRuntimeState(next, updatedAt)\n );\n await writeJsonFileOrRemove(\n deviceSkillsStorePath(),\n buildDeviceSkillsStoreState(next, updatedAt)\n );\n await writeJsonFileOrRemove(\n deviceSkillsCustomTargetsPath(),\n buildDeviceSkillsCustomTargetsState(next, updatedAt)\n );\n await writeJsonFileOrRemove(\n deviceSkillsInstallsPath(),\n buildDeviceSkillsInstallsState(next, updatedAt)\n );\n await rm(legacyRuntimeConfigPath(), { force: true }).catch(() => undefined);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction parseMessageCustomization(\n value: unknown\n): RuntimeMessageCustomization | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const obj = value as {\n human?: unknown;\n agent?: unknown;\n };\n\n const human = toStringMap(obj.human);\n const agent = toStringMap(obj.agent);\n\n if (!(human || agent)) {\n return undefined;\n }\n\n return {\n ...(human ? { human } : {}),\n ...(agent ? { agent } : {}),\n };\n}\n\nfunction parseRenderCustomization(\n value: unknown\n): RuntimeRenderCustomization | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const obj = value as {\n human?: unknown;\n agent?: unknown;\n };\n\n const humanRaw = obj.human as { dataMode?: unknown } | undefined;\n const agentRaw = obj.agent as { envelopeMode?: unknown } | undefined;\n\n const human: RuntimeHumanRender | undefined =\n humanRaw?.dataMode === \"payload\" || humanRaw?.dataMode === \"envelope\"\n ? { dataMode: humanRaw.dataMode }\n : undefined;\n\n const agent: RuntimeAgentRender | undefined =\n agentRaw?.envelopeMode === \"verbose\" || agentRaw?.envelopeMode === \"compact\"\n ? { envelopeMode: agentRaw.envelopeMode }\n : undefined;\n\n if (!(human || agent)) {\n return undefined;\n }\n\n return {\n ...(human ? { human } : {}),\n ...(agent ? { agent } : {}),\n };\n}\n\nfunction parseRuntimeSkillsAgents(\n value: unknown\n): Record<string, RuntimeSkillsAgentConfig> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value).flatMap(([agentName, agentValue]) => {\n if (!agentValue || typeof agentValue !== \"object\") {\n return [];\n }\n const agentObj = agentValue as {\n skillsDir?: unknown;\n globalSkillsDir?: unknown;\n };\n const skillsDir =\n typeof agentObj.skillsDir === \"string\" &&\n agentObj.skillsDir.trim().length > 0\n ? agentObj.skillsDir.trim()\n : undefined;\n const globalSkillsDir =\n typeof agentObj.globalSkillsDir === \"string\" &&\n agentObj.globalSkillsDir.trim().length > 0\n ? agentObj.globalSkillsDir.trim()\n : undefined;\n if (!(skillsDir || globalSkillsDir)) {\n return [];\n }\n return [\n [\n agentName,\n {\n ...(skillsDir ? { skillsDir } : {}),\n ...(globalSkillsDir ? { globalSkillsDir } : {}),\n },\n ] as [string, RuntimeSkillsAgentConfig],\n ];\n });\n\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nfunction parseRuntimeSkillsCustomTargets(\n value: unknown,\n legacyCustomTargetIdByDir?: Map<string, string>\n): RuntimeSkillsCustomTarget[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const targets = value.flatMap((item) => {\n if (!item || typeof item !== \"object\") {\n return [];\n }\n const obj = item as { id?: unknown; name?: unknown; dir?: unknown };\n const name =\n typeof obj.name === \"string\" && obj.name.trim().length > 0\n ? obj.name.trim()\n : \"\";\n const dir =\n typeof obj.dir === \"string\" && obj.dir.trim().length > 0\n ? normalizeCustomTargetDir(obj.dir)\n : \"\";\n if (!(name && dir)) {\n return [];\n }\n const explicitId = toTrimmedStringOrUndefined(obj.id);\n const fallbackLegacyId = legacyCustomTargetIdByDir?.get(dir);\n const id = resolveRuntimeSkillsCustomTargetId({\n dir,\n ...(explicitId ? { id: explicitId } : {}),\n ...(!explicitId && fallbackLegacyId ? { id: fallbackLegacyId } : {}),\n });\n return [{ id, name, dir }];\n });\n\n if (targets.length === 0) {\n return undefined;\n }\n\n return targets;\n}\n\nfunction parseRuntimeSkillsInstallRecords(\n value: unknown\n): RuntimeSkillsInstallRecord[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const records = value\n .map((item) => parseRuntimeSkillsInstallRecord(item))\n .filter((record): record is RuntimeSkillsInstallRecord => record !== null);\n\n if (records.length === 0) {\n return undefined;\n }\n\n return records;\n}\n\nfunction buildLegacyCustomTargetIdByDir(\n installs: RuntimeSkillsInstallRecord[] | undefined\n): Map<string, string> {\n const byDir = new Map<string, string>();\n for (const install of installs ?? []) {\n if (!install.targetId.startsWith(CUSTOM_TARGET_ID_PREFIX)) {\n continue;\n }\n const normalizedTargetDir = normalizeCustomTargetDir(install.targetDir);\n if (!normalizedTargetDir) {\n continue;\n }\n byDir.set(normalizedTargetDir, install.targetId);\n }\n return byDir;\n}\n\nfunction parseRuntimeSkillsInstallRecord(\n value: unknown\n): RuntimeSkillsInstallRecord | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const obj = value as {\n targetId?: unknown;\n targetDir?: unknown;\n mode?: unknown;\n status?: unknown;\n skillIds?: unknown;\n reason?: unknown;\n updatedAt?: unknown;\n };\n const targetId = toTrimmedStringOrEmpty(obj.targetId);\n const rawTargetDir = toTrimmedStringOrEmpty(obj.targetDir);\n const targetDir = rawTargetDir;\n const mode = parseSkillsInstallMode(obj.mode);\n const status = parseSkillsInstallStatus(obj.status);\n const skillIds = Array.isArray(obj.skillIds)\n ? obj.skillIds\n .map((skill) => (typeof skill === \"string\" ? skill.trim() : \"\"))\n .filter((skill): skill is string => skill.length > 0)\n : [];\n const updatedAt = toTrimmedStringOrEmpty(obj.updatedAt);\n const reason = toTrimmedStringOrUndefined(obj.reason);\n\n if (!(targetId && targetDir && mode && status && updatedAt)) {\n return null;\n }\n\n return {\n targetId,\n targetDir,\n mode,\n status,\n skillIds,\n ...(reason ? { reason } : {}),\n updatedAt,\n };\n}\n\nfunction parseRuntimeAgentControllerStates(\n value: unknown\n): RuntimeAgentControllerState[] | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n\n const parsed = value\n .map((entry) => parseRuntimeAgentControllerState(entry))\n .filter((entry): entry is RuntimeAgentControllerState => entry !== null);\n\n if (parsed.length === 0) {\n return undefined;\n }\n\n const deduped = new Map<string, RuntimeAgentControllerState>();\n for (const entry of parsed) {\n deduped.set(entry.agentId, entry);\n }\n\n return [...deduped.values()].sort((a, b) =>\n a.agentId.localeCompare(b.agentId)\n );\n}\n\nfunction parseRuntimeAgentControllerState(\n value: unknown\n): RuntimeAgentControllerState | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const obj = value as {\n agentId?: unknown;\n displayName?: unknown;\n enabled?: unknown;\n launchContract?: unknown;\n transportMode?: unknown;\n streamingMode?: unknown;\n timeoutMs?: unknown;\n retry?: unknown;\n contextIdMappingSpec?: unknown;\n registeredAt?: unknown;\n updatedAt?: unknown;\n };\n const agentId = toTrimmedStringOrEmpty(obj.agentId);\n const displayName = toTrimmedStringOrEmpty(obj.displayName);\n const enabled = typeof obj.enabled === \"boolean\" ? obj.enabled : null;\n const launchContract = parseRuntimeAgentControllerLaunchContract(\n obj.launchContract\n );\n const defaults = createDefaultRuntimeAgentControllerSettings(agentId);\n const controllerSettings = parseRuntimeAgentControllerSettings(\n {\n transportMode: obj.transportMode,\n streamingMode: obj.streamingMode,\n timeoutMs: obj.timeoutMs,\n retry: obj.retry,\n contextIdMappingSpec: obj.contextIdMappingSpec,\n },\n defaults\n );\n const registeredAt = toTrimmedStringOrEmpty(obj.registeredAt);\n const updatedAt = toTrimmedStringOrEmpty(obj.updatedAt);\n\n if (\n !(\n agentId &&\n displayName &&\n enabled !== null &&\n controllerSettings &&\n registeredAt &&\n updatedAt\n )\n ) {\n return null;\n }\n\n return {\n agentId,\n displayName,\n enabled,\n ...(launchContract ? { launchContract } : {}),\n transportMode: controllerSettings.transportMode,\n streamingMode: controllerSettings.streamingMode,\n timeoutMs: controllerSettings.timeoutMs,\n retry: controllerSettings.retry,\n contextIdMappingSpec: controllerSettings.contextIdMappingSpec,\n registeredAt,\n updatedAt,\n };\n}\n\nfunction parseRuntimeAgentControllerLaunchContract(\n value: unknown\n): RuntimeAgentControllerLaunchContract | undefined {\n if (!(value && typeof value === \"object\")) {\n return undefined;\n }\n const parsed = runtimeAgentControllerLaunchContractSchema.safeParse(value);\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction parseRuntimeAgentControllerSettings(\n raw: {\n transportMode: unknown;\n streamingMode: unknown;\n timeoutMs: unknown;\n retry: unknown;\n contextIdMappingSpec: unknown;\n },\n defaults: RuntimeAgentControllerSettings\n): RuntimeAgentControllerSettings | null {\n const normalizedStreamingMode = normalizeRuntimeStreamingMode(\n raw.streamingMode\n );\n const parsed = runtimeAgentControllerSettingsSchema.safeParse({\n transport_mode: raw.transportMode ?? defaults.transportMode,\n streaming_mode: normalizedStreamingMode ?? defaults.streamingMode,\n timeout_ms:\n raw.timeoutMs === undefined ? defaults.timeoutMs : raw.timeoutMs,\n retry: raw.retry ?? defaults.retry,\n context_id_mapping_spec:\n raw.contextIdMappingSpec ?? defaults.contextIdMappingSpec,\n });\n if (!parsed.success) {\n return null;\n }\n\n return {\n transportMode: parsed.data.transport_mode,\n streamingMode: parsed.data.streaming_mode,\n timeoutMs: normalizeRuntimeAgentTimeoutMs({\n defaults,\n timeoutMs: parsed.data.timeout_ms,\n }),\n retry: parsed.data.retry,\n contextIdMappingSpec:\n normalizeRuntimeAgentControllerConversationIdMappingSpec({\n contextIdMappingSpec: parsed.data.context_id_mapping_spec,\n defaults,\n }),\n };\n}\n\nfunction normalizeRuntimeAgentTimeoutMs(input: {\n defaults: RuntimeAgentControllerSettings;\n timeoutMs: number | null;\n}): number | null {\n // 120s was an old persisted default. Normal Agent execution must not inherit\n // it as a fixed wall-clock cutoff.\n if (input.timeoutMs === 120_000) {\n return input.defaults.timeoutMs;\n }\n return input.timeoutMs;\n}\n\nfunction normalizeRuntimeAgentControllerConversationIdMappingSpec(input: {\n contextIdMappingSpec: RuntimeAgentControllerConversationIdMappingSpec;\n defaults: RuntimeAgentControllerSettings;\n}): RuntimeAgentControllerConversationIdMappingSpec {\n if (\n input.contextIdMappingSpec.sourceField !==\n DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD\n ) {\n return input.defaults.contextIdMappingSpec;\n }\n return input.contextIdMappingSpec;\n}\n\nfunction resolveRuntimeDaemonDispatchLimits(\n config?: RuntimeDaemonDispatchConfig\n): RuntimeDaemonDispatchLimits {\n return {\n globalConcurrency:\n parsePositiveInteger(config?.globalConcurrency) ??\n DEFAULT_RUNTIME_DAEMON_GLOBAL_CONCURRENCY,\n queueMax:\n parsePositiveInteger(config?.queueMax) ??\n DEFAULT_RUNTIME_DAEMON_QUEUE_MAX,\n };\n}\n\nfunction normalizeRuntimeStreamingMode(\n value: unknown\n): RuntimeAgentStreamingMode | null {\n if (value === \"final\" || value === \"stream\") {\n return value;\n }\n return null;\n}\n\nfunction parseSkillsInstallMode(\n value: unknown\n): RuntimeSkillsInstallRecord[\"mode\"] | null {\n if (value === \"symlink\" || value === \"copy\") {\n return value;\n }\n return null;\n}\n\nfunction parseSkillsInstallStatus(\n value: unknown\n): RuntimeSkillsInstallRecord[\"status\"] | null {\n if (value === \"installed\" || value === \"skipped\" || value === \"failed\") {\n return value;\n }\n return null;\n}\n\nfunction parsePositiveInteger(value: unknown): number | undefined {\n if (!Number.isInteger(value)) {\n return undefined;\n }\n const numericValue = Number(value);\n if (numericValue <= 0) {\n return undefined;\n }\n return numericValue;\n}\n\nfunction toTrimmedStringOrEmpty(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : \"\";\n}\n\nfunction toTrimmedStringOrUndefined(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction normalizeCustomTargetDir(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) {\n return \"\";\n }\n if (WINDOWS_DRIVE_ONLY_RE.test(trimmed)) {\n return `${trimmed[0]?.toUpperCase() ?? \"\"}:`;\n }\n const windowsLike =\n WINDOWS_DRIVE_PREFIX_RE.test(trimmed) || WINDOWS_UNC_RE.test(trimmed);\n const normalizedPath = windowsLike\n ? (() => {\n const normalizedWindowsPath = win32.normalize(trimmed);\n if (WINDOWS_DRIVE_ANY_RE.test(normalizedWindowsPath)) {\n return `${normalizedWindowsPath[0]?.toUpperCase() ?? \"\"}${normalizedWindowsPath.slice(1)}`;\n }\n return normalizedWindowsPath;\n })()\n : normalize(trimmed);\n const isPosixRoot = normalizedPath === posix.parse(normalizedPath).root;\n const isWindowsRoot = normalizedPath === win32.parse(normalizedPath).root;\n if (isPosixRoot || isWindowsRoot) {\n return normalizedPath;\n }\n return normalizedPath.replace(TRAILING_PATH_SEPARATORS_RE, \"\");\n}\n\nfunction toStringMap(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\"\n );\n if (entries.length === 0) {\n return undefined;\n }\n\n return Object.fromEntries(entries);\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: string }).code === \"ENOENT\"\n );\n}\n\nasync function readSplitRuntimeConfigDetailed(): Promise<{\n config: RuntimeConfigV1 | null;\n hasFiles: boolean;\n health: RuntimeConfigReadHealth;\n}> {\n const [\n preferencesFile,\n agentRuntimeFile,\n skillsStoreFile,\n customTargetsFile,\n installsFile,\n ] = await Promise.all([\n readOptionalJsonFile(devicePreferencesPath()),\n readOptionalJsonFile(deviceAgentRuntimePath()),\n readOptionalJsonFile(deviceSkillsStorePath()),\n readOptionalJsonFile(deviceSkillsCustomTargetsPath()),\n readOptionalJsonFile(deviceSkillsInstallsPath()),\n ]);\n\n const files = [\n preferencesFile,\n agentRuntimeFile,\n skillsStoreFile,\n customTargetsFile,\n installsFile,\n ];\n const hasFiles = files.some((file) => file.found);\n if (!hasFiles) {\n return {\n config: null,\n hasFiles: false,\n health: {\n parseFallback: false,\n },\n };\n }\n\n const invalidFile = files.find((file) => file.error);\n const preferences = parseDevicePreferencesConfig(preferencesFile.value);\n const agentRuntime = parseDeviceAgentRuntimeConfig(agentRuntimeFile.value);\n const skillsStore = parseDeviceSkillsStoreConfig(skillsStoreFile.value);\n const customTargets = parseDeviceSkillsCustomTargetsConfig(\n customTargetsFile.value\n );\n const installs = parseDeviceSkillsInstallsConfig(installsFile.value);\n\n const skills = mergeRuntimeSkillsConfig({\n store: skillsStore,\n customTargets,\n installs,\n });\n const config = buildRuntimeConfigFromParts({\n baseUrl: preferences.baseUrl,\n viewCustomization: preferences.viewCustomization,\n daemon: preferences.daemon,\n onboarding: preferences.onboarding,\n deviceRuntimeState: agentRuntime,\n skills,\n });\n\n return {\n config,\n hasFiles: true,\n health: invalidFile\n ? {\n parseFallback: true,\n reason: invalidFile.error ?? \"invalid_json\",\n }\n : {\n parseFallback: false,\n },\n };\n}\n\nasync function readLegacyRuntimeConfigDetailed(): Promise<{\n config: RuntimeConfigV1 | null;\n health: RuntimeConfigReadHealth;\n}> {\n let raw: string;\n try {\n raw = await readFile(legacyRuntimeConfigPath(), \"utf8\");\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return {\n config: null,\n health: {\n parseFallback: false,\n },\n };\n }\n throw error;\n }\n\n if (raw.trim().length === 0) {\n return {\n config: null,\n health: {\n parseFallback: false,\n },\n };\n }\n\n let parsed: Partial<RuntimeConfigV1> & {\n agents?: unknown;\n daemon?: unknown;\n onboarding?: unknown;\n };\n try {\n parsed = JSON.parse(raw) as Partial<RuntimeConfigV1> & {\n agents?: unknown;\n daemon?: unknown;\n onboarding?: unknown;\n };\n } catch {\n return {\n config: null,\n health: {\n parseFallback: true,\n reason: \"invalid_json\",\n },\n };\n }\n\n if (parsed.v !== 1) {\n return {\n config: null,\n health: {\n parseFallback: true,\n reason: \"invalid_version\",\n },\n };\n }\n\n if (parsed.agents !== undefined) {\n throw new Error(\n \"runtime.config.legacy_agents_unsupported: key 'agents.registrations' is no longer supported. Use 'deviceRuntimeState.controllers' or run 'ats reset --yes'.\"\n );\n }\n\n return {\n config: buildRuntimeConfigFromParts({\n baseUrl: parseConfiguredBaseUrl(parsed.baseUrl),\n viewCustomization: parseRuntimeViewCustomization(\n parsed.viewCustomization\n ),\n skills: parseRuntimeSkillsConfig(parsed.skills),\n daemon: parseRuntimeDaemonConfig(parsed.daemon),\n deviceRuntimeState: parseRuntimeDeviceRuntimeState(\n parsed.deviceRuntimeState\n ),\n onboarding: parseRuntimeOnboardingConfig(parsed.onboarding),\n updatedAt:\n typeof parsed.updatedAt === \"string\"\n ? parsed.updatedAt\n : new Date().toISOString(),\n }),\n health: {\n parseFallback: false,\n },\n };\n}\n\nfunction buildRuntimeConfigFromParts(input: {\n baseUrl?: string;\n viewCustomization?: RuntimeViewCustomization;\n skills?: RuntimeSkillsConfig;\n daemon?: RuntimeDaemonConfig;\n deviceRuntimeState?: RuntimeDeviceRuntimeState;\n onboarding?: RuntimeOnboardingConfig;\n updatedAt?: string;\n}): RuntimeConfigV1 | null {\n const updatedAt = input.updatedAt ?? new Date().toISOString();\n if (\n !(\n input.baseUrl ||\n input.viewCustomization ||\n input.skills ||\n input.daemon ||\n input.deviceRuntimeState ||\n input.onboarding\n )\n ) {\n return null;\n }\n\n return {\n v: 1,\n ...(input.baseUrl ? { baseUrl: input.baseUrl } : {}),\n ...(input.viewCustomization\n ? { viewCustomization: input.viewCustomization }\n : {}),\n ...(input.skills ? { skills: input.skills } : {}),\n ...(input.daemon ? { daemon: input.daemon } : {}),\n ...(input.deviceRuntimeState\n ? { deviceRuntimeState: input.deviceRuntimeState }\n : {}),\n ...(input.onboarding ? { onboarding: input.onboarding } : {}),\n updatedAt,\n };\n}\n\nfunction parseDevicePreferencesConfig(\n value: unknown\n): Pick<\n RuntimeConfigV1,\n \"baseUrl\" | \"viewCustomization\" | \"daemon\" | \"onboarding\"\n> {\n if (!value || typeof value !== \"object\") {\n return {};\n }\n const parsed = value as Partial<DevicePreferencesV1>;\n if (parsed.v !== 1) {\n return {};\n }\n return {\n ...(parseConfiguredBaseUrl(parsed.baseUrl)\n ? { baseUrl: parseConfiguredBaseUrl(parsed.baseUrl) }\n : {}),\n ...(parseRuntimeViewCustomization(parsed.viewCustomization)\n ? {\n viewCustomization: parseRuntimeViewCustomization(\n parsed.viewCustomization\n ),\n }\n : {}),\n ...(parseRuntimeDaemonConfig(parsed.daemon)\n ? { daemon: parseRuntimeDaemonConfig(parsed.daemon) }\n : {}),\n ...(parseRuntimeOnboardingConfig(parsed.onboarding)\n ? { onboarding: parseRuntimeOnboardingConfig(parsed.onboarding) }\n : {}),\n };\n}\n\nfunction parseDeviceAgentRuntimeConfig(\n value: unknown\n): RuntimeDeviceRuntimeState | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const parsed = value as Partial<DeviceAgentRuntimeV1>;\n if (parsed.v !== 1) {\n return undefined;\n }\n return parseRuntimeDeviceRuntimeState(parsed.deviceRuntimeState);\n}\n\nfunction parseDeviceSkillsStoreConfig(\n value: unknown\n): Pick<RuntimeSkillsConfig, \"storeDir\" | \"agents\"> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const parsed = value as Partial<DeviceSkillsStoreV1>;\n if (parsed.v !== 1) {\n return undefined;\n }\n const storeDir =\n typeof parsed.storeDir === \"string\" && parsed.storeDir.trim().length > 0\n ? parsed.storeDir.trim()\n : undefined;\n const agents = parseRuntimeSkillsAgents(parsed.agents);\n if (!(storeDir || agents)) {\n return undefined;\n }\n return {\n ...(storeDir ? { storeDir } : {}),\n ...(agents ? { agents } : {}),\n };\n}\n\nfunction parseDeviceSkillsCustomTargetsConfig(\n value: unknown\n): RuntimeSkillsCustomTarget[] | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const parsed = value as Partial<DeviceSkillsCustomTargetsV1>;\n if (parsed.v !== 1) {\n return undefined;\n }\n return parseRuntimeSkillsCustomTargets(parsed.customTargets, undefined);\n}\n\nfunction parseDeviceSkillsInstallsConfig(\n value: unknown\n): RuntimeSkillsInstallRecord[] | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const parsed = value as Partial<DeviceSkillsInstallsV1>;\n if (parsed.v !== 1) {\n return undefined;\n }\n return parseRuntimeSkillsInstallRecords(parsed.installs);\n}\n\nfunction mergeRuntimeSkillsConfig(input: {\n store?: Pick<RuntimeSkillsConfig, \"storeDir\" | \"agents\">;\n customTargets?: RuntimeSkillsCustomTarget[];\n installs?: RuntimeSkillsInstallRecord[];\n}): RuntimeSkillsConfig | undefined {\n if (!(input.store || input.customTargets || input.installs)) {\n return undefined;\n }\n return {\n ...(input.store?.storeDir ? { storeDir: input.store.storeDir } : {}),\n ...(input.store?.agents ? { agents: input.store.agents } : {}),\n ...(input.customTargets ? { customTargets: input.customTargets } : {}),\n ...(input.installs ? { installs: input.installs } : {}),\n };\n}\n\nfunction buildDevicePreferencesState(\n next: RuntimeConfigV1,\n updatedAt: string\n): DevicePreferencesV1 | null {\n if (\n !(next.baseUrl || next.viewCustomization || next.daemon || next.onboarding)\n ) {\n return null;\n }\n return {\n v: 1,\n ...(next.baseUrl ? { baseUrl: next.baseUrl } : {}),\n ...(next.viewCustomization\n ? { viewCustomization: next.viewCustomization }\n : {}),\n ...(next.daemon ? { daemon: next.daemon } : {}),\n ...(next.onboarding ? { onboarding: next.onboarding } : {}),\n updatedAt,\n };\n}\n\nfunction buildDeviceAgentRuntimeState(\n next: RuntimeConfigV1,\n updatedAt: string\n): DeviceAgentRuntimeV1 | null {\n if (!next.deviceRuntimeState) {\n return null;\n }\n return {\n v: 1,\n deviceRuntimeState: next.deviceRuntimeState,\n updatedAt,\n };\n}\n\nfunction buildDeviceSkillsStoreState(\n next: RuntimeConfigV1,\n updatedAt: string\n): DeviceSkillsStoreV1 | null {\n if (!(next.skills?.storeDir || next.skills?.agents)) {\n return null;\n }\n return {\n v: 1,\n ...(next.skills?.storeDir ? { storeDir: next.skills.storeDir } : {}),\n ...(next.skills?.agents ? { agents: next.skills.agents } : {}),\n updatedAt,\n };\n}\n\nfunction buildDeviceSkillsCustomTargetsState(\n next: RuntimeConfigV1,\n updatedAt: string\n): DeviceSkillsCustomTargetsV1 | null {\n if (!(next.skills?.customTargets && next.skills.customTargets.length > 0)) {\n return null;\n }\n return {\n v: 1,\n customTargets: next.skills.customTargets,\n updatedAt,\n };\n}\n\nfunction buildDeviceSkillsInstallsState(\n next: RuntimeConfigV1,\n updatedAt: string\n): DeviceSkillsInstallsV1 | null {\n if (!(next.skills?.installs && next.skills.installs.length > 0)) {\n return null;\n }\n return {\n v: 1,\n installs: next.skills.installs,\n updatedAt,\n };\n}\n\nasync function writeJsonFileOrRemove(\n path: string,\n payload: object | null\n): Promise<void> {\n if (!payload) {\n await rm(path, { force: true }).catch(() => undefined);\n return;\n }\n\n await mkdir(dirname(path), { recursive: true });\n const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;\n await writeFile(tempPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n try {\n await rename(tempPath, path);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function readOptionalJsonFile(path: string): Promise<{\n found: boolean;\n value: unknown;\n error?: RuntimeConfigFallbackReason;\n}> {\n const raw = await readFile(path, \"utf8\").catch((error) => {\n if (isFileNotFoundError(error)) {\n return null;\n }\n throw error;\n });\n if (raw === null) {\n return {\n found: false,\n value: null,\n };\n }\n if (raw.trim().length === 0) {\n return {\n found: true,\n value: null,\n };\n }\n try {\n return {\n found: true,\n value: JSON.parse(raw),\n };\n } catch {\n return {\n found: true,\n value: null,\n error: \"invalid_json\",\n };\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n return await readFile(path, \"utf8\")\n .then(() => true)\n .catch((error) => {\n if (isFileNotFoundError(error)) {\n return false;\n }\n throw error;\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://www.schemastore.org/package.json",
3
3
  "name": "agent-transport-system",
4
- "version": "0.7.13",
5
- "atsReleaseDate": "2026-06-01",
4
+ "version": "0.7.14",
5
+ "atsReleaseDate": "2026-06-02",
6
6
  "description": "Agent Transport System CLI - https://ats.sh",
7
7
  "license": "MIT",
8
8
  "type": "module",
@@ -158,7 +158,30 @@ ats profiles create "Codex Agent" --kind agent --view agent
158
158
  Create a new Agent Profile and explicitly bind it to local Codex from the CLI:
159
159
 
160
160
  ```bash
161
- ats profiles create "Codex Agent" --kind agent --controller-kind builtin --controller-ref codex --view agent
161
+ ats profiles create "Codex Agent" --kind agent --agent-controller builtin:codex --view agent
162
+ ```
163
+
164
+ Create a new Agent Profile from an existing private local agent conversation:
165
+
166
+ ```bash
167
+ ats profiles create "Codex Agent" --kind agent --agent-controller builtin:codex --agent-controller-conversation-id <current-agent-controller-conversation-id> --view agent
168
+ ```
169
+
170
+ `--agent-controller-conversation-id` is the private conversation ID for the
171
+ Agent Controller behind this Agent Profile. For Codex this is the Codex thread
172
+ ID. It is profile-scoped continuity, not a Space ID, Space thread, ATS Service
173
+ Runtime ID, terminal session ID, or CLI context ID.
174
+
175
+ Update an existing Agent Profile's local agent binding:
176
+
177
+ ```bash
178
+ ats profiles update <agent-profile-id> --agent-controller builtin:codex --agent-controller-conversation-id <agent-controller-conversation-id> --view agent
179
+ ```
180
+
181
+ Show the current binding for one profile:
182
+
183
+ ```bash
184
+ ats profiles show <agent-profile-id> --json
162
185
  ```
163
186
 
164
187
  Use an existing Agent Profile during setup:
@@ -318,6 +341,18 @@ Add your own Agent Profile to a Space:
318
341
  ats space add-members <space-id> --member <agent-profile-id> --profile <human-profile-id>
319
342
  ```
320
343
 
344
+ Create a new Agent Profile and invite it to a Space in one step:
345
+
346
+ ```bash
347
+ ats invite <space-id> --agent-profile-name "Codex Agent" --agent-controller builtin:codex --agent-controller-conversation-id <agent-controller-conversation-id> --profile <human-profile-id> --view agent
348
+ ```
349
+
350
+ Invite existing profiles without changing their Profile settings:
351
+
352
+ ```bash
353
+ ats invite <space-id> --member <profile-id> --profile <human-profile-id> --view agent
354
+ ```
355
+
321
356
  Interactive Space controls:
322
357
 
323
358
  - `Enter` sends.
@@ -118,7 +118,7 @@ ats setup --view agent
118
118
  normal recovery path for Web setup, Agent-led setup, or local component drift.
119
119
 
120
120
  Treat setup as local infrastructure alignment: sign-in, ATS Service, detected
121
- local agents, capability reporting, and ATS-managed skills. It does not prove
121
+ local agents, agent controller reporting, and ATS-managed skills. It does not prove
122
122
  that a future Space Wake will succeed.
123
123
 
124
124
  If ATS says this computer cannot handle Wake for the Agent Profile yet, run:
@@ -88,6 +88,16 @@ ats login --view human
88
88
  ats login --method ott --ott <token> --view agent
89
89
  ```
90
90
 
91
+ ### `ats invite`
92
+
93
+ Invite existing Agent Profiles or create and invite a new Agent Profile to a
94
+ Space.
95
+
96
+ ```bash
97
+ ats invite <space-id> --member <agent-profile-id> --profile <human-profile-id> --view agent
98
+ ats invite <space-id> --agent-profile-name "Codex Agent" --agent-controller builtin:codex --agent-controller-conversation-id <agent-controller-conversation-id> --profile <human-profile-id> --view agent
99
+ ```
100
+
91
101
  ### `ats whoami`
92
102
 
93
103
  Show sign-in and selected profile.