wakeloop 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,907 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { br as runtimeAgentControllerSettingsSchema, yr as runtimeAgentControllerLaunchContractSchema } from "./dist-JdCv_fuW.js";
4
+ import { E as resolveWakeLoopEnvPreset, c as deviceDir, f as devicePreferencesPath, g as deviceSkillsStorePath, h as deviceSkillsInstallsPath, m as deviceSkillsDir, p as deviceSkillsCustomTargetsPath, s as deviceAgentRuntimePath, v as legacyRuntimeConfigPath } from "./paths-F1dfknFj.js";
5
+ import { a as runWithHeldLock, n as isWakeLoopLockError, t as acquireLock } from "./lock-BYUpcHBF.js";
6
+ import { t as normalizeBaseUrl } from "./urls-B8ZoQgpS.js";
7
+ import { createRequire } from "node:module";
8
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
9
+ import { dirname, normalize, posix, win32 } from "node:path";
10
+ import { createHash } from "node:crypto";
11
+
12
+ //#region \0rolldown/runtime.js
13
+ var __defProp = Object.defineProperty;
14
+ var __exportAll = (all, no_symbols) => {
15
+ let target = {};
16
+ for (var name in all) {
17
+ __defProp(target, name, {
18
+ get: all[name],
19
+ enumerable: true
20
+ });
21
+ }
22
+ if (!no_symbols) {
23
+ __defProp(target, Symbol.toStringTag, { value: "Module" });
24
+ }
25
+ return target;
26
+ };
27
+
28
+ //#endregion
29
+ //#region src/config/runtime-config.ts
30
+ const DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE = "local-cli";
31
+ const DEFAULT_RUNTIME_AGENT_STREAMING_MODE = "final";
32
+ const DEFAULT_LOCAL_ADAPTER_TIMEOUT_MS = null;
33
+ const DEFAULT_RUNTIME_AGENT_RETRY = 0;
34
+ const DEFAULT_RUNTIME_AGENT_CONTEXT_MAPPING_VERSION = 1;
35
+ const DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD = "WAKELOOP_CLI_CONTEXT_ID";
36
+ const DEFAULT_RUNTIME_DAEMON_GLOBAL_CONCURRENCY = 10;
37
+ const DEFAULT_RUNTIME_DAEMON_QUEUE_MAX = 50;
38
+ const CUSTOM_TARGET_ID_PREFIX = "custom-";
39
+ const CUSTOM_TARGET_ID_LENGTH = 12;
40
+ const RUNTIME_CONFIG_LOCK_PROFILE = "__system__";
41
+ const RUNTIME_CONFIG_LOCK_KEY = "runtime-config";
42
+ const RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS = 40;
43
+ const RUNTIME_CONFIG_LOCK_RETRY_DELAY_MS = 25;
44
+ const WINDOWS_DRIVE_ONLY_RE = /^[a-zA-Z]:$/;
45
+ const WINDOWS_DRIVE_PREFIX_RE = /^[a-zA-Z]:[\\/]/;
46
+ const WINDOWS_UNC_RE = /^[/\\]{2}[^/\\]+[/\\]+[^/\\]+/;
47
+ const WINDOWS_DRIVE_ANY_RE = /^[a-zA-Z]:/;
48
+ const TRAILING_PATH_SEPARATORS_RE = /[\\/]+$/;
49
+ function resolveRuntimeSkillsCustomTargetId(input) {
50
+ const existingId = typeof input.id === "string" && input.id.trim().length > 0 ? input.id.trim() : "";
51
+ if (existingId) return existingId;
52
+ const normalizedDir = normalizeCustomTargetDir(input.dir);
53
+ return `${CUSTOM_TARGET_ID_PREFIX}${createHash("sha256").update(normalizedDir).digest("hex").slice(0, CUSTOM_TARGET_ID_LENGTH)}`;
54
+ }
55
+ function resolveDefaultAgentContextSourceField(_agentId) {
56
+ return DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD;
57
+ }
58
+ function createDefaultRuntimeAgentControllerSettings(agentId) {
59
+ return {
60
+ transportMode: DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE,
61
+ streamingMode: resolveDefaultRuntimeAgentStreamingMode(),
62
+ timeoutMs: DEFAULT_LOCAL_ADAPTER_TIMEOUT_MS,
63
+ retry: DEFAULT_RUNTIME_AGENT_RETRY,
64
+ contextIdMappingSpec: {
65
+ sourceField: resolveDefaultAgentContextSourceField(agentId),
66
+ mappingVersion: DEFAULT_RUNTIME_AGENT_CONTEXT_MAPPING_VERSION
67
+ }
68
+ };
69
+ }
70
+ const resolveDefaultRuntimeAgentStreamingMode = () => {
71
+ const preset = resolveWakeLoopEnvPreset();
72
+ if (preset === "dev-local" || preset === "canary") return "stream";
73
+ return DEFAULT_RUNTIME_AGENT_STREAMING_MODE;
74
+ };
75
+ async function getConfiguredBaseUrl() {
76
+ const config = await readRuntimeConfig();
77
+ if (!config?.baseUrl) return null;
78
+ return normalizeGatewayBaseUrl(config.baseUrl);
79
+ }
80
+ async function getConfiguredViewCustomization() {
81
+ return (await readRuntimeConfig())?.viewCustomization ?? null;
82
+ }
83
+ async function getConfiguredSkillsConfig() {
84
+ return (await readRuntimeConfig())?.skills ?? null;
85
+ }
86
+ async function getConfiguredDeviceRuntimeState() {
87
+ return (await readRuntimeConfig())?.deviceRuntimeState ?? null;
88
+ }
89
+ async function getConfiguredDaemonDispatchLimits() {
90
+ return resolveRuntimeDaemonDispatchLimits((await readRuntimeConfig())?.daemon?.dispatch);
91
+ }
92
+ async function getConfiguredOnboardingConfig() {
93
+ return (await readRuntimeConfig())?.onboarding ?? null;
94
+ }
95
+ async function getConfiguredOnboardingDisclaimerAcceptedAt() {
96
+ return (await getConfiguredOnboardingConfig())?.disclaimerAcceptedAt ?? null;
97
+ }
98
+ async function getRuntimeConfigReadHealth() {
99
+ return (await readRuntimeConfigDetailed()).health;
100
+ }
101
+ async function alignRuntimeConfigStorage() {
102
+ return await withRuntimeConfigLock(async () => {
103
+ const split = await readSplitRuntimeConfigDetailed();
104
+ const legacy = await readLegacyRuntimeConfigDetailed();
105
+ const hasLegacyConfig = await pathExists(legacyRuntimeConfigPath());
106
+ if (legacy.config && (!split.hasFiles || split.health.parseFallback)) {
107
+ await writeRuntimeConfig(legacy.config);
108
+ return {
109
+ migratedLegacyConfig: true,
110
+ removedLegacyConfig: hasLegacyConfig
111
+ };
112
+ }
113
+ if (hasLegacyConfig && split.hasFiles) {
114
+ await rm(legacyRuntimeConfigPath(), { force: true });
115
+ return {
116
+ migratedLegacyConfig: false,
117
+ removedLegacyConfig: true
118
+ };
119
+ }
120
+ return {
121
+ migratedLegacyConfig: false,
122
+ removedLegacyConfig: false
123
+ };
124
+ });
125
+ }
126
+ async function setConfiguredBaseUrl(baseUrl) {
127
+ await withRuntimeConfigLock(async () => {
128
+ const normalized = normalizeGatewayBaseUrl(baseUrl);
129
+ await writeRuntimeConfig(buildNextConfig(await readRuntimeConfig(), { baseUrl: normalized }));
130
+ });
131
+ }
132
+ async function setConfiguredSkillsConfig(skills) {
133
+ await withRuntimeConfigLock(async () => {
134
+ await writeRuntimeConfig(buildNextConfig(await readRuntimeConfig(), { skills }));
135
+ });
136
+ }
137
+ async function updateConfiguredSkillsConfig(updater) {
138
+ await withRuntimeConfigLock(async () => {
139
+ const previous = await readRuntimeConfig();
140
+ const previousSkills = previous?.skills ?? null;
141
+ const nextSkills = updater(previousSkills);
142
+ if (JSON.stringify(previousSkills) === JSON.stringify(nextSkills)) return;
143
+ await writeRuntimeConfig(buildNextConfig(previous, { skills: nextSkills }));
144
+ });
145
+ }
146
+ async function updateConfiguredDeviceRuntimeState(updater) {
147
+ await withRuntimeConfigLock(async () => {
148
+ const previous = await readRuntimeConfig();
149
+ const previousDeviceRuntimeState = previous?.deviceRuntimeState ?? null;
150
+ const nextDeviceRuntimeState = updater(previousDeviceRuntimeState);
151
+ if (JSON.stringify(previousDeviceRuntimeState) === JSON.stringify(nextDeviceRuntimeState)) return;
152
+ await writeRuntimeConfig(buildNextConfig(previous, { deviceRuntimeState: nextDeviceRuntimeState }));
153
+ });
154
+ }
155
+ async function updateConfiguredStartV1OnboardingState(updater) {
156
+ await withRuntimeConfigLock(async () => {
157
+ const previous = await readRuntimeConfig();
158
+ const previousOnboarding = previous?.onboarding ?? null;
159
+ const previousStartV1 = previousOnboarding?.startV1 ?? null;
160
+ const nextStartV1 = updater(previousStartV1);
161
+ if (JSON.stringify(previousStartV1) === JSON.stringify(nextStartV1)) return;
162
+ await writeRuntimeConfig(buildNextConfig(previous, { onboarding: nextStartV1 || previousOnboarding?.disclaimerAcceptedAt ? {
163
+ ...previousOnboarding?.disclaimerAcceptedAt ? { disclaimerAcceptedAt: previousOnboarding.disclaimerAcceptedAt } : {},
164
+ ...nextStartV1 ? { startV1: nextStartV1 } : {}
165
+ } : null }));
166
+ });
167
+ }
168
+ async function updateConfiguredOnboardingConfig(updater) {
169
+ await withRuntimeConfigLock(async () => {
170
+ const previous = await readRuntimeConfig();
171
+ const previousOnboarding = previous?.onboarding ?? null;
172
+ const nextOnboarding = updater(previousOnboarding);
173
+ if (JSON.stringify(previousOnboarding) === JSON.stringify(nextOnboarding)) return;
174
+ await writeRuntimeConfig(buildNextConfig(previous, { onboarding: nextOnboarding }));
175
+ });
176
+ }
177
+ function buildNextConfig(previous, overrides) {
178
+ const baseUrl = resolveBaseUrlOverride(previous?.baseUrl, overrides);
179
+ const viewCustomization = resolveConfigOverride("viewCustomization", previous?.viewCustomization, overrides);
180
+ const skills = resolveConfigOverride("skills", previous?.skills, overrides);
181
+ const daemon = resolveConfigOverride("daemon", previous?.daemon, overrides);
182
+ const deviceRuntimeState = resolveConfigOverride("deviceRuntimeState", previous?.deviceRuntimeState, overrides);
183
+ const onboarding = resolveConfigOverride("onboarding", previous?.onboarding, overrides);
184
+ return {
185
+ v: 1,
186
+ ...baseUrl ? { baseUrl } : {},
187
+ ...viewCustomization ? { viewCustomization } : {},
188
+ ...skills ? { skills } : {},
189
+ ...daemon ? { daemon } : {},
190
+ ...deviceRuntimeState ? { deviceRuntimeState } : {},
191
+ ...onboarding ? { onboarding } : {},
192
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
193
+ };
194
+ }
195
+ function resolveBaseUrlOverride(previous, overrides) {
196
+ if (!("baseUrl" in overrides)) return previous;
197
+ if (typeof overrides.baseUrl !== "string" || overrides.baseUrl.length === 0) return;
198
+ return overrides.baseUrl;
199
+ }
200
+ function resolveConfigOverride(key, previous, overrides) {
201
+ if (!(key in overrides)) return previous;
202
+ return overrides[key] ?? void 0;
203
+ }
204
+ async function acquireRuntimeConfigLock() {
205
+ for (let attempt = 0; attempt < RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS; attempt += 1) try {
206
+ return await acquireLock({
207
+ wakeLoopProfileId: RUNTIME_CONFIG_LOCK_PROFILE,
208
+ key: RUNTIME_CONFIG_LOCK_KEY
209
+ });
210
+ } catch (error) {
211
+ if (!isWakeLoopLockError(error) || attempt === RUNTIME_CONFIG_LOCK_MAX_ATTEMPTS - 1) throw error;
212
+ await delay(RUNTIME_CONFIG_LOCK_RETRY_DELAY_MS);
213
+ }
214
+ throw new Error("runtime config lock retries exhausted");
215
+ }
216
+ async function withRuntimeConfigLock(run) {
217
+ return await runWithHeldLock({
218
+ lock: await acquireRuntimeConfigLock(),
219
+ run,
220
+ releaseContext: {
221
+ component: "runtime_config",
222
+ lockKey: RUNTIME_CONFIG_LOCK_KEY,
223
+ wakeLoopProfileId: RUNTIME_CONFIG_LOCK_PROFILE
224
+ }
225
+ });
226
+ }
227
+ async function readRuntimeConfig() {
228
+ return (await readRuntimeConfigDetailed()).config;
229
+ }
230
+ async function readRuntimeConfigDetailed() {
231
+ const split = await readSplitRuntimeConfigDetailed();
232
+ if (split.hasFiles) return {
233
+ config: split.config,
234
+ health: split.health
235
+ };
236
+ return await readLegacyRuntimeConfigDetailed();
237
+ }
238
+ function parseConfiguredBaseUrl(value) {
239
+ if (typeof value !== "string") return;
240
+ try {
241
+ return normalizeGatewayBaseUrl(value);
242
+ } catch {
243
+ return;
244
+ }
245
+ }
246
+ function parseRuntimeViewCustomization(value) {
247
+ if (!value || typeof value !== "object") return;
248
+ const obj = value;
249
+ const messages = parseMessageCustomization(obj.messages);
250
+ const render = parseRenderCustomization(obj.render);
251
+ if (!(messages || render)) return;
252
+ return {
253
+ ...messages ? { messages } : {},
254
+ ...render ? { render } : {}
255
+ };
256
+ }
257
+ function parseRuntimeSkillsConfig(value) {
258
+ if (!value || typeof value !== "object") return;
259
+ const obj = value;
260
+ const storeDir = typeof obj.storeDir === "string" && obj.storeDir.trim().length > 0 ? obj.storeDir.trim() : void 0;
261
+ const agents = parseRuntimeSkillsAgents(obj.agents);
262
+ const installs = parseRuntimeSkillsInstallRecords(obj.installs);
263
+ const customTargets = parseRuntimeSkillsCustomTargets(obj.customTargets, buildLegacyCustomTargetIdByDir(installs));
264
+ if (!(storeDir || agents || customTargets || installs)) return;
265
+ return {
266
+ ...storeDir ? { storeDir } : {},
267
+ ...agents ? { agents } : {},
268
+ ...customTargets ? { customTargets } : {},
269
+ ...installs ? { installs } : {}
270
+ };
271
+ }
272
+ function parseRuntimeDaemonConfig(value) {
273
+ if (!value || typeof value !== "object") return;
274
+ const dispatch = parseRuntimeDaemonDispatchConfig(value.dispatch);
275
+ if (!dispatch) return;
276
+ return { dispatch };
277
+ }
278
+ function parseRuntimeDaemonDispatchConfig(value) {
279
+ if (!value || typeof value !== "object") return;
280
+ const obj = value;
281
+ const globalConcurrency = parsePositiveInteger(obj.globalConcurrency);
282
+ const queueMax = parsePositiveInteger(obj.queueMax);
283
+ if (globalConcurrency === void 0 && queueMax === void 0) return;
284
+ return {
285
+ ...globalConcurrency === void 0 ? {} : { globalConcurrency },
286
+ ...queueMax === void 0 ? {} : { queueMax }
287
+ };
288
+ }
289
+ function parseRuntimeDeviceRuntimeState(value) {
290
+ return parseRuntimeDeviceRuntimeStateObject(value);
291
+ }
292
+ function parseRuntimeDeviceRuntimeStateObject(value) {
293
+ if (!value || typeof value !== "object") return;
294
+ const controllers = parseRuntimeAgentControllerStates(value.controllers);
295
+ if (!controllers) return;
296
+ return { controllers };
297
+ }
298
+ function parseRuntimeOnboardingConfig(value) {
299
+ if (!value || typeof value !== "object") return;
300
+ const obj = value;
301
+ const disclaimerAcceptedAt = toTrimmedStringOrUndefined(obj.disclaimerAcceptedAt);
302
+ const startV1 = parseRuntimeStartV1OnboardingState(obj.startV1);
303
+ if (!(disclaimerAcceptedAt || startV1)) return;
304
+ return {
305
+ ...disclaimerAcceptedAt ? { disclaimerAcceptedAt } : {},
306
+ ...startV1 ? { startV1 } : {}
307
+ };
308
+ }
309
+ function parseRuntimeStartV1OnboardingState(value) {
310
+ if (!value || typeof value !== "object") return;
311
+ const obj = value;
312
+ const disclaimerAcceptedVersion = toTrimmedStringOrUndefined(obj.disclaimerAcceptedVersion);
313
+ const lastCompletedAt = toTrimmedStringOrUndefined(obj.lastCompletedAt);
314
+ const localAgentsSetupCompletedAt = toTrimmedStringOrUndefined(obj.localAgentsSetupCompletedAt);
315
+ if (!(disclaimerAcceptedVersion || lastCompletedAt || localAgentsSetupCompletedAt)) return;
316
+ return {
317
+ ...disclaimerAcceptedVersion ? { disclaimerAcceptedVersion } : {},
318
+ ...lastCompletedAt ? { lastCompletedAt } : {},
319
+ ...localAgentsSetupCompletedAt ? { localAgentsSetupCompletedAt } : {}
320
+ };
321
+ }
322
+ async function writeRuntimeConfig(next) {
323
+ await mkdir(deviceDir(), { recursive: true });
324
+ await mkdir(deviceSkillsDir(), { recursive: true });
325
+ const updatedAt = (/* @__PURE__ */ new Date()).toISOString();
326
+ await writeJsonFileOrRemove(devicePreferencesPath(), buildDevicePreferencesState(next, updatedAt));
327
+ await writeJsonFileOrRemove(deviceAgentRuntimePath(), buildDeviceAgentRuntimeState(next, updatedAt));
328
+ await writeJsonFileOrRemove(deviceSkillsStorePath(), buildDeviceSkillsStoreState(next, updatedAt));
329
+ await writeJsonFileOrRemove(deviceSkillsCustomTargetsPath(), buildDeviceSkillsCustomTargetsState(next, updatedAt));
330
+ await writeJsonFileOrRemove(deviceSkillsInstallsPath(), buildDeviceSkillsInstallsState(next, updatedAt));
331
+ await rm(legacyRuntimeConfigPath(), { force: true }).catch(() => void 0);
332
+ }
333
+ function delay(ms) {
334
+ return new Promise((resolve) => {
335
+ setTimeout(resolve, ms);
336
+ });
337
+ }
338
+ function parseMessageCustomization(value) {
339
+ if (!value || typeof value !== "object") return;
340
+ const obj = value;
341
+ const human = toStringMap(obj.human);
342
+ const agent = toStringMap(obj.agent);
343
+ if (!(human || agent)) return;
344
+ return {
345
+ ...human ? { human } : {},
346
+ ...agent ? { agent } : {}
347
+ };
348
+ }
349
+ function parseRenderCustomization(value) {
350
+ if (!value || typeof value !== "object") return;
351
+ const obj = value;
352
+ const humanRaw = obj.human;
353
+ const agentRaw = obj.agent;
354
+ const human = humanRaw?.dataMode === "payload" || humanRaw?.dataMode === "envelope" ? { dataMode: humanRaw.dataMode } : void 0;
355
+ const agent = agentRaw?.envelopeMode === "verbose" || agentRaw?.envelopeMode === "compact" ? { envelopeMode: agentRaw.envelopeMode } : void 0;
356
+ if (!(human || agent)) return;
357
+ return {
358
+ ...human ? { human } : {},
359
+ ...agent ? { agent } : {}
360
+ };
361
+ }
362
+ function parseRuntimeSkillsAgents(value) {
363
+ if (!value || typeof value !== "object") return;
364
+ const entries = Object.entries(value).flatMap(([agentName, agentValue]) => {
365
+ if (!agentValue || typeof agentValue !== "object") return [];
366
+ const agentObj = agentValue;
367
+ const skillsDir = typeof agentObj.skillsDir === "string" && agentObj.skillsDir.trim().length > 0 ? agentObj.skillsDir.trim() : void 0;
368
+ const globalSkillsDir = typeof agentObj.globalSkillsDir === "string" && agentObj.globalSkillsDir.trim().length > 0 ? agentObj.globalSkillsDir.trim() : void 0;
369
+ if (!(skillsDir || globalSkillsDir)) return [];
370
+ return [[agentName, {
371
+ ...skillsDir ? { skillsDir } : {},
372
+ ...globalSkillsDir ? { globalSkillsDir } : {}
373
+ }]];
374
+ });
375
+ if (entries.length === 0) return;
376
+ return Object.fromEntries(entries);
377
+ }
378
+ function parseRuntimeSkillsCustomTargets(value, legacyCustomTargetIdByDir) {
379
+ if (!Array.isArray(value)) return;
380
+ const targets = value.flatMap((item) => {
381
+ if (!item || typeof item !== "object") return [];
382
+ const obj = item;
383
+ const name = typeof obj.name === "string" && obj.name.trim().length > 0 ? obj.name.trim() : "";
384
+ const dir = typeof obj.dir === "string" && obj.dir.trim().length > 0 ? normalizeCustomTargetDir(obj.dir) : "";
385
+ if (!(name && dir)) return [];
386
+ const explicitId = toTrimmedStringOrUndefined(obj.id);
387
+ const fallbackLegacyId = legacyCustomTargetIdByDir?.get(dir);
388
+ return [{
389
+ id: resolveRuntimeSkillsCustomTargetId({
390
+ dir,
391
+ ...explicitId ? { id: explicitId } : {},
392
+ ...!explicitId && fallbackLegacyId ? { id: fallbackLegacyId } : {}
393
+ }),
394
+ name,
395
+ dir
396
+ }];
397
+ });
398
+ if (targets.length === 0) return;
399
+ return targets;
400
+ }
401
+ function parseRuntimeSkillsInstallRecords(value) {
402
+ if (!Array.isArray(value)) return;
403
+ const records = value.map((item) => parseRuntimeSkillsInstallRecord(item)).filter((record) => record !== null);
404
+ if (records.length === 0) return;
405
+ return records;
406
+ }
407
+ function buildLegacyCustomTargetIdByDir(installs) {
408
+ const byDir = /* @__PURE__ */ new Map();
409
+ for (const install of installs ?? []) {
410
+ if (!install.targetId.startsWith(CUSTOM_TARGET_ID_PREFIX)) continue;
411
+ const normalizedTargetDir = normalizeCustomTargetDir(install.targetDir);
412
+ if (!normalizedTargetDir) continue;
413
+ byDir.set(normalizedTargetDir, install.targetId);
414
+ }
415
+ return byDir;
416
+ }
417
+ function parseRuntimeSkillsInstallRecord(value) {
418
+ if (!value || typeof value !== "object") return null;
419
+ const obj = value;
420
+ const targetId = toTrimmedStringOrEmpty(obj.targetId);
421
+ const targetDir = toTrimmedStringOrEmpty(obj.targetDir);
422
+ const mode = parseSkillsInstallMode(obj.mode);
423
+ const status = parseSkillsInstallStatus(obj.status);
424
+ const skillIds = Array.isArray(obj.skillIds) ? obj.skillIds.map((skill) => typeof skill === "string" ? skill.trim() : "").filter((skill) => skill.length > 0) : [];
425
+ const updatedAt = toTrimmedStringOrEmpty(obj.updatedAt);
426
+ const reason = toTrimmedStringOrUndefined(obj.reason);
427
+ if (!(targetId && targetDir && mode && status && updatedAt)) return null;
428
+ return {
429
+ targetId,
430
+ targetDir,
431
+ mode,
432
+ status,
433
+ skillIds,
434
+ ...reason ? { reason } : {},
435
+ updatedAt
436
+ };
437
+ }
438
+ function parseRuntimeAgentControllerStates(value) {
439
+ if (!Array.isArray(value)) return;
440
+ const parsed = value.map((entry) => parseRuntimeAgentControllerState(entry)).filter((entry) => entry !== null);
441
+ if (parsed.length === 0) return;
442
+ const deduped = /* @__PURE__ */ new Map();
443
+ for (const entry of parsed) deduped.set(entry.agentId, entry);
444
+ return [...deduped.values()].sort((a, b) => a.agentId.localeCompare(b.agentId));
445
+ }
446
+ function parseRuntimeAgentControllerState(value) {
447
+ if (!value || typeof value !== "object") return null;
448
+ const obj = value;
449
+ const agentId = toTrimmedStringOrEmpty(obj.agentId);
450
+ const displayName = toTrimmedStringOrEmpty(obj.displayName);
451
+ const enabled = typeof obj.enabled === "boolean" ? obj.enabled : null;
452
+ const launchContract = parseRuntimeAgentControllerLaunchContract(obj.launchContract);
453
+ const defaults = createDefaultRuntimeAgentControllerSettings(agentId);
454
+ const controllerSettings = parseRuntimeAgentControllerSettings({
455
+ transportMode: obj.transportMode,
456
+ streamingMode: obj.streamingMode,
457
+ timeoutMs: obj.timeoutMs,
458
+ retry: obj.retry,
459
+ contextIdMappingSpec: obj.contextIdMappingSpec
460
+ }, defaults);
461
+ const registeredAt = toTrimmedStringOrEmpty(obj.registeredAt);
462
+ const updatedAt = toTrimmedStringOrEmpty(obj.updatedAt);
463
+ if (!(agentId && displayName && enabled !== null && controllerSettings && registeredAt && updatedAt)) return null;
464
+ return {
465
+ agentId,
466
+ displayName,
467
+ enabled,
468
+ ...launchContract ? { launchContract } : {},
469
+ transportMode: controllerSettings.transportMode,
470
+ streamingMode: controllerSettings.streamingMode,
471
+ timeoutMs: controllerSettings.timeoutMs,
472
+ retry: controllerSettings.retry,
473
+ contextIdMappingSpec: controllerSettings.contextIdMappingSpec,
474
+ registeredAt,
475
+ updatedAt
476
+ };
477
+ }
478
+ function parseRuntimeAgentControllerLaunchContract(value) {
479
+ if (!(value && typeof value === "object")) return;
480
+ const parsed = runtimeAgentControllerLaunchContractSchema.safeParse(value);
481
+ return parsed.success ? parsed.data : void 0;
482
+ }
483
+ function parseRuntimeAgentControllerSettings(raw, defaults) {
484
+ const normalizedStreamingMode = normalizeRuntimeStreamingMode(raw.streamingMode);
485
+ const parsed = runtimeAgentControllerSettingsSchema.safeParse({
486
+ transport_mode: raw.transportMode ?? defaults.transportMode,
487
+ streaming_mode: normalizedStreamingMode ?? defaults.streamingMode,
488
+ timeout_ms: raw.timeoutMs === void 0 ? defaults.timeoutMs : raw.timeoutMs,
489
+ retry: raw.retry ?? defaults.retry,
490
+ context_id_mapping_spec: raw.contextIdMappingSpec ?? defaults.contextIdMappingSpec
491
+ });
492
+ if (!parsed.success) return null;
493
+ return {
494
+ transportMode: parsed.data.transport_mode,
495
+ streamingMode: parsed.data.streaming_mode,
496
+ timeoutMs: normalizeRuntimeAgentTimeoutMs({
497
+ defaults,
498
+ timeoutMs: parsed.data.timeout_ms
499
+ }),
500
+ retry: parsed.data.retry,
501
+ contextIdMappingSpec: normalizeRuntimeAgentControllerConversationIdMappingSpec({
502
+ contextIdMappingSpec: parsed.data.context_id_mapping_spec,
503
+ defaults
504
+ })
505
+ };
506
+ }
507
+ function normalizeRuntimeAgentTimeoutMs(input) {
508
+ if (input.timeoutMs === 12e4) return input.defaults.timeoutMs;
509
+ return input.timeoutMs;
510
+ }
511
+ function normalizeRuntimeAgentControllerConversationIdMappingSpec(input) {
512
+ if (input.contextIdMappingSpec.sourceField !== DEFAULT_RUNTIME_AGENT_CONTEXT_SOURCE_FIELD) return input.defaults.contextIdMappingSpec;
513
+ return input.contextIdMappingSpec;
514
+ }
515
+ function resolveRuntimeDaemonDispatchLimits(config) {
516
+ return {
517
+ globalConcurrency: parsePositiveInteger(config?.globalConcurrency) ?? DEFAULT_RUNTIME_DAEMON_GLOBAL_CONCURRENCY,
518
+ queueMax: parsePositiveInteger(config?.queueMax) ?? DEFAULT_RUNTIME_DAEMON_QUEUE_MAX
519
+ };
520
+ }
521
+ function normalizeRuntimeStreamingMode(value) {
522
+ if (value === "final" || value === "stream") return value;
523
+ return null;
524
+ }
525
+ function parseSkillsInstallMode(value) {
526
+ if (value === "symlink" || value === "copy") return value;
527
+ return null;
528
+ }
529
+ function parseSkillsInstallStatus(value) {
530
+ if (value === "installed" || value === "skipped" || value === "failed") return value;
531
+ return null;
532
+ }
533
+ function parsePositiveInteger(value) {
534
+ if (!Number.isInteger(value)) return;
535
+ const numericValue = Number(value);
536
+ if (numericValue <= 0) return;
537
+ return numericValue;
538
+ }
539
+ function toTrimmedStringOrEmpty(value) {
540
+ if (typeof value !== "string") return "";
541
+ const trimmed = value.trim();
542
+ return trimmed.length > 0 ? trimmed : "";
543
+ }
544
+ function toTrimmedStringOrUndefined(value) {
545
+ if (typeof value !== "string") return;
546
+ const trimmed = value.trim();
547
+ return trimmed.length > 0 ? trimmed : void 0;
548
+ }
549
+ function normalizeCustomTargetDir(value) {
550
+ const trimmed = value.trim();
551
+ if (!trimmed) return "";
552
+ if (WINDOWS_DRIVE_ONLY_RE.test(trimmed)) return `${trimmed[0]?.toUpperCase() ?? ""}:`;
553
+ const normalizedPath = WINDOWS_DRIVE_PREFIX_RE.test(trimmed) || WINDOWS_UNC_RE.test(trimmed) ? (() => {
554
+ const normalizedWindowsPath = win32.normalize(trimmed);
555
+ if (WINDOWS_DRIVE_ANY_RE.test(normalizedWindowsPath)) return `${normalizedWindowsPath[0]?.toUpperCase() ?? ""}${normalizedWindowsPath.slice(1)}`;
556
+ return normalizedWindowsPath;
557
+ })() : normalize(trimmed);
558
+ const isPosixRoot = normalizedPath === posix.parse(normalizedPath).root;
559
+ const isWindowsRoot = normalizedPath === win32.parse(normalizedPath).root;
560
+ if (isPosixRoot || isWindowsRoot) return normalizedPath;
561
+ return normalizedPath.replace(TRAILING_PATH_SEPARATORS_RE, "");
562
+ }
563
+ function toStringMap(value) {
564
+ if (!value || typeof value !== "object") return;
565
+ const entries = Object.entries(value).filter((entry) => typeof entry[1] === "string");
566
+ if (entries.length === 0) return;
567
+ return Object.fromEntries(entries);
568
+ }
569
+ function isFileNotFoundError(error) {
570
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
571
+ }
572
+ async function readSplitRuntimeConfigDetailed() {
573
+ const [preferencesFile, agentRuntimeFile, skillsStoreFile, customTargetsFile, installsFile] = await Promise.all([
574
+ readOptionalJsonFile(devicePreferencesPath()),
575
+ readOptionalJsonFile(deviceAgentRuntimePath()),
576
+ readOptionalJsonFile(deviceSkillsStorePath()),
577
+ readOptionalJsonFile(deviceSkillsCustomTargetsPath()),
578
+ readOptionalJsonFile(deviceSkillsInstallsPath())
579
+ ]);
580
+ const files = [
581
+ preferencesFile,
582
+ agentRuntimeFile,
583
+ skillsStoreFile,
584
+ customTargetsFile,
585
+ installsFile
586
+ ];
587
+ if (!files.some((file) => file.found)) return {
588
+ config: null,
589
+ hasFiles: false,
590
+ health: { parseFallback: false }
591
+ };
592
+ const invalidFile = files.find((file) => file.error);
593
+ const preferences = parseDevicePreferencesConfig(preferencesFile.value);
594
+ const agentRuntime = parseDeviceAgentRuntimeConfig(agentRuntimeFile.value);
595
+ const skills = mergeRuntimeSkillsConfig({
596
+ store: parseDeviceSkillsStoreConfig(skillsStoreFile.value),
597
+ customTargets: parseDeviceSkillsCustomTargetsConfig(customTargetsFile.value),
598
+ installs: parseDeviceSkillsInstallsConfig(installsFile.value)
599
+ });
600
+ return {
601
+ config: buildRuntimeConfigFromParts({
602
+ baseUrl: preferences.baseUrl,
603
+ viewCustomization: preferences.viewCustomization,
604
+ daemon: preferences.daemon,
605
+ onboarding: preferences.onboarding,
606
+ deviceRuntimeState: agentRuntime,
607
+ skills
608
+ }),
609
+ hasFiles: true,
610
+ health: invalidFile ? {
611
+ parseFallback: true,
612
+ reason: invalidFile.error ?? "invalid_json"
613
+ } : { parseFallback: false }
614
+ };
615
+ }
616
+ async function readLegacyRuntimeConfigDetailed() {
617
+ let raw;
618
+ try {
619
+ raw = await readFile(legacyRuntimeConfigPath(), "utf8");
620
+ } catch (error) {
621
+ if (isFileNotFoundError(error)) return {
622
+ config: null,
623
+ health: { parseFallback: false }
624
+ };
625
+ throw error;
626
+ }
627
+ if (raw.trim().length === 0) return {
628
+ config: null,
629
+ health: { parseFallback: false }
630
+ };
631
+ let parsed;
632
+ try {
633
+ parsed = JSON.parse(raw);
634
+ } catch {
635
+ return {
636
+ config: null,
637
+ health: {
638
+ parseFallback: true,
639
+ reason: "invalid_json"
640
+ }
641
+ };
642
+ }
643
+ if (parsed.v !== 1) return {
644
+ config: null,
645
+ health: {
646
+ parseFallback: true,
647
+ reason: "invalid_version"
648
+ }
649
+ };
650
+ if (parsed.agents !== void 0) throw new Error("runtime.config.legacy_agents_unsupported: key 'agents.registrations' is no longer supported. Use 'deviceRuntimeState.controllers' or run 'wakeloop reset --yes'.");
651
+ return {
652
+ config: buildRuntimeConfigFromParts({
653
+ baseUrl: parseConfiguredBaseUrl(parsed.baseUrl),
654
+ viewCustomization: parseRuntimeViewCustomization(parsed.viewCustomization),
655
+ skills: parseRuntimeSkillsConfig(parsed.skills),
656
+ daemon: parseRuntimeDaemonConfig(parsed.daemon),
657
+ deviceRuntimeState: parseRuntimeDeviceRuntimeState(parsed.deviceRuntimeState),
658
+ onboarding: parseRuntimeOnboardingConfig(parsed.onboarding),
659
+ updatedAt: typeof parsed.updatedAt === "string" ? parsed.updatedAt : (/* @__PURE__ */ new Date()).toISOString()
660
+ }),
661
+ health: { parseFallback: false }
662
+ };
663
+ }
664
+ function buildRuntimeConfigFromParts(input) {
665
+ const updatedAt = input.updatedAt ?? (/* @__PURE__ */ new Date()).toISOString();
666
+ if (!(input.baseUrl || input.viewCustomization || input.skills || input.daemon || input.deviceRuntimeState || input.onboarding)) return null;
667
+ return {
668
+ v: 1,
669
+ ...input.baseUrl ? { baseUrl: input.baseUrl } : {},
670
+ ...input.viewCustomization ? { viewCustomization: input.viewCustomization } : {},
671
+ ...input.skills ? { skills: input.skills } : {},
672
+ ...input.daemon ? { daemon: input.daemon } : {},
673
+ ...input.deviceRuntimeState ? { deviceRuntimeState: input.deviceRuntimeState } : {},
674
+ ...input.onboarding ? { onboarding: input.onboarding } : {},
675
+ updatedAt
676
+ };
677
+ }
678
+ function parseDevicePreferencesConfig(value) {
679
+ if (!value || typeof value !== "object") return {};
680
+ const parsed = value;
681
+ if (parsed.v !== 1) return {};
682
+ return {
683
+ ...parseConfiguredBaseUrl(parsed.baseUrl) ? { baseUrl: parseConfiguredBaseUrl(parsed.baseUrl) } : {},
684
+ ...parseRuntimeViewCustomization(parsed.viewCustomization) ? { viewCustomization: parseRuntimeViewCustomization(parsed.viewCustomization) } : {},
685
+ ...parseRuntimeDaemonConfig(parsed.daemon) ? { daemon: parseRuntimeDaemonConfig(parsed.daemon) } : {},
686
+ ...parseRuntimeOnboardingConfig(parsed.onboarding) ? { onboarding: parseRuntimeOnboardingConfig(parsed.onboarding) } : {}
687
+ };
688
+ }
689
+ function parseDeviceAgentRuntimeConfig(value) {
690
+ if (!value || typeof value !== "object") return;
691
+ const parsed = value;
692
+ if (parsed.v !== 1) return;
693
+ return parseRuntimeDeviceRuntimeState(parsed.deviceRuntimeState);
694
+ }
695
+ function parseDeviceSkillsStoreConfig(value) {
696
+ if (!value || typeof value !== "object") return;
697
+ const parsed = value;
698
+ if (parsed.v !== 1) return;
699
+ const storeDir = typeof parsed.storeDir === "string" && parsed.storeDir.trim().length > 0 ? parsed.storeDir.trim() : void 0;
700
+ const agents = parseRuntimeSkillsAgents(parsed.agents);
701
+ if (!(storeDir || agents)) return;
702
+ return {
703
+ ...storeDir ? { storeDir } : {},
704
+ ...agents ? { agents } : {}
705
+ };
706
+ }
707
+ function parseDeviceSkillsCustomTargetsConfig(value) {
708
+ if (!value || typeof value !== "object") return;
709
+ const parsed = value;
710
+ if (parsed.v !== 1) return;
711
+ return parseRuntimeSkillsCustomTargets(parsed.customTargets, void 0);
712
+ }
713
+ function parseDeviceSkillsInstallsConfig(value) {
714
+ if (!value || typeof value !== "object") return;
715
+ const parsed = value;
716
+ if (parsed.v !== 1) return;
717
+ return parseRuntimeSkillsInstallRecords(parsed.installs);
718
+ }
719
+ function mergeRuntimeSkillsConfig(input) {
720
+ if (!(input.store || input.customTargets || input.installs)) return;
721
+ return {
722
+ ...input.store?.storeDir ? { storeDir: input.store.storeDir } : {},
723
+ ...input.store?.agents ? { agents: input.store.agents } : {},
724
+ ...input.customTargets ? { customTargets: input.customTargets } : {},
725
+ ...input.installs ? { installs: input.installs } : {}
726
+ };
727
+ }
728
+ function buildDevicePreferencesState(next, updatedAt) {
729
+ if (!(next.baseUrl || next.viewCustomization || next.daemon || next.onboarding)) return null;
730
+ return {
731
+ v: 1,
732
+ ...next.baseUrl ? { baseUrl: next.baseUrl } : {},
733
+ ...next.viewCustomization ? { viewCustomization: next.viewCustomization } : {},
734
+ ...next.daemon ? { daemon: next.daemon } : {},
735
+ ...next.onboarding ? { onboarding: next.onboarding } : {},
736
+ updatedAt
737
+ };
738
+ }
739
+ function buildDeviceAgentRuntimeState(next, updatedAt) {
740
+ if (!next.deviceRuntimeState) return null;
741
+ return {
742
+ v: 1,
743
+ deviceRuntimeState: next.deviceRuntimeState,
744
+ updatedAt
745
+ };
746
+ }
747
+ function buildDeviceSkillsStoreState(next, updatedAt) {
748
+ if (!(next.skills?.storeDir || next.skills?.agents)) return null;
749
+ return {
750
+ v: 1,
751
+ ...next.skills?.storeDir ? { storeDir: next.skills.storeDir } : {},
752
+ ...next.skills?.agents ? { agents: next.skills.agents } : {},
753
+ updatedAt
754
+ };
755
+ }
756
+ function buildDeviceSkillsCustomTargetsState(next, updatedAt) {
757
+ if (!(next.skills?.customTargets && next.skills.customTargets.length > 0)) return null;
758
+ return {
759
+ v: 1,
760
+ customTargets: next.skills.customTargets,
761
+ updatedAt
762
+ };
763
+ }
764
+ function buildDeviceSkillsInstallsState(next, updatedAt) {
765
+ if (!(next.skills?.installs && next.skills.installs.length > 0)) return null;
766
+ return {
767
+ v: 1,
768
+ installs: next.skills.installs,
769
+ updatedAt
770
+ };
771
+ }
772
+ async function writeJsonFileOrRemove(path, payload) {
773
+ if (!payload) {
774
+ await rm(path, { force: true }).catch(() => void 0);
775
+ return;
776
+ }
777
+ await mkdir(dirname(path), { recursive: true });
778
+ const tempPath = `${path}.tmp-${process.pid}-${Date.now()}`;
779
+ await writeFile(tempPath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
780
+ try {
781
+ await rename(tempPath, path);
782
+ } catch (error) {
783
+ await rm(tempPath, { force: true }).catch(() => void 0);
784
+ throw error;
785
+ }
786
+ }
787
+ async function readOptionalJsonFile(path) {
788
+ const raw = await readFile(path, "utf8").catch((error) => {
789
+ if (isFileNotFoundError(error)) return null;
790
+ throw error;
791
+ });
792
+ if (raw === null) return {
793
+ found: false,
794
+ value: null
795
+ };
796
+ if (raw.trim().length === 0) return {
797
+ found: true,
798
+ value: null
799
+ };
800
+ try {
801
+ return {
802
+ found: true,
803
+ value: JSON.parse(raw)
804
+ };
805
+ } catch {
806
+ return {
807
+ found: true,
808
+ value: null,
809
+ error: "invalid_json"
810
+ };
811
+ }
812
+ }
813
+ async function pathExists(path) {
814
+ return await readFile(path, "utf8").then(() => true).catch((error) => {
815
+ if (isFileNotFoundError(error)) return false;
816
+ throw error;
817
+ });
818
+ }
819
+
820
+ //#endregion
821
+ //#region src/config/base-url.ts
822
+ var base_url_exports = /* @__PURE__ */ __exportAll({
823
+ DEFAULT_GATEWAY_BASE_URL: () => DEFAULT_GATEWAY_BASE_URL,
824
+ DEV_LOCAL_GATEWAY_BASE_URL: () => DEV_LOCAL_GATEWAY_BASE_URL,
825
+ normalizeGatewayBaseUrl: () => normalizeGatewayBaseUrl,
826
+ normalizeGatewayBaseUrlOrNull: () => normalizeGatewayBaseUrlOrNull,
827
+ resolveBaseUrl: () => resolveBaseUrl,
828
+ resolveBaseUrlOrNull: () => resolveBaseUrlOrNull,
829
+ resolveDefaultGatewayBaseUrl: () => resolveDefaultGatewayBaseUrl,
830
+ resolveExplicitGatewayUrlOrThrow: () => resolveExplicitGatewayUrlOrThrow
831
+ });
832
+ const DEFAULT_GATEWAY_BASE_URL = "https://gateway.wakeloop.ai";
833
+ const DEV_LOCAL_GATEWAY_BASE_URL = "http://localhost:8080";
834
+ const AUTH_HOST_LABEL = "auth";
835
+ const AUTH_HOST_PREFIX = "auth-";
836
+ const LOCAL_AUTH_PORT = "8788";
837
+ async function resolveBaseUrl(cliValue, input = {}) {
838
+ const env = input.env ?? process.env;
839
+ const fromCli = String(cliValue ?? "").trim();
840
+ if (fromCli) return normalizeGatewayBaseUrl(fromCli);
841
+ const fromEnv = String(env.WAKELOOP_GATEWAY_URL ?? "").trim();
842
+ if (fromEnv) return normalizeGatewayBaseUrl(fromEnv);
843
+ const fromConfig = await getConfiguredBaseUrl();
844
+ if (fromConfig) return normalizeGatewayBaseUrl(fromConfig);
845
+ return normalizeGatewayBaseUrl(resolveDefaultGatewayBaseUrl({ env }));
846
+ }
847
+ async function resolveBaseUrlOrNull(cliValue) {
848
+ try {
849
+ return await resolveBaseUrl(cliValue);
850
+ } catch {
851
+ return null;
852
+ }
853
+ }
854
+ async function resolveExplicitGatewayUrlOrThrow(cliValue) {
855
+ const explicitGatewayUrl = normalizeOptionalString(cliValue);
856
+ if (!explicitGatewayUrl) return;
857
+ try {
858
+ return await Promise.resolve().then(() => normalizeGatewayBaseUrl(explicitGatewayUrl));
859
+ } catch (error) {
860
+ throw new Error(`Invalid explicit gateway URL "${explicitGatewayUrl}": ${toErrorMessage(error)}`);
861
+ }
862
+ }
863
+ function normalizeGatewayBaseUrl(gatewayUrl) {
864
+ const normalizedGatewayUrl = normalizeBaseUrl(gatewayUrl);
865
+ if (isAuthWorkerUrl(new URL(normalizedGatewayUrl))) throw new Error("gateway URL must point to the WakeLoop gateway, not the WakeLoop auth worker");
866
+ return normalizedGatewayUrl;
867
+ }
868
+ function normalizeGatewayBaseUrlOrNull(gatewayUrl) {
869
+ const normalizedGatewayUrl = normalizeOptionalString(gatewayUrl);
870
+ if (!normalizedGatewayUrl) return null;
871
+ try {
872
+ return normalizeGatewayBaseUrl(normalizedGatewayUrl);
873
+ } catch {
874
+ return null;
875
+ }
876
+ }
877
+ function normalizeOptionalString(value) {
878
+ const normalized = String(value ?? "").trim();
879
+ return normalized.length > 0 ? normalized : null;
880
+ }
881
+ function resolveDefaultGatewayBaseUrl(input = {}) {
882
+ const preset = resolveWakeLoopEnvPreset(input);
883
+ if (preset === "dev-local" || preset === "canary") return DEV_LOCAL_GATEWAY_BASE_URL;
884
+ return DEFAULT_GATEWAY_BASE_URL;
885
+ }
886
+ function isAuthWorkerUrl(url) {
887
+ if (isLoopbackHostname(url.hostname)) return resolveUrlPort(url) === LOCAL_AUTH_PORT;
888
+ const [firstLabel = ""] = url.hostname.toLowerCase().split(".");
889
+ return firstLabel === AUTH_HOST_LABEL || firstLabel.startsWith(AUTH_HOST_PREFIX);
890
+ }
891
+ function isLoopbackHostname(hostname) {
892
+ const normalizedHostname = hostname.toLowerCase();
893
+ return normalizedHostname === "localhost" || normalizedHostname === "127.0.0.1" || normalizedHostname === "::1";
894
+ }
895
+ function resolveUrlPort(url) {
896
+ if (url.port) return url.port;
897
+ if (url.protocol === "http:" || url.protocol === "ws:") return "80";
898
+ if (url.protocol === "https:" || url.protocol === "wss:") return "443";
899
+ return "";
900
+ }
901
+ function toErrorMessage(error) {
902
+ return error instanceof Error ? error.message : String(error);
903
+ }
904
+
905
+ //#endregion
906
+ export { updateConfiguredSkillsConfig as C, updateConfiguredOnboardingConfig as S, getRuntimeConfigReadHealth as _, resolveBaseUrl as a, setConfiguredSkillsConfig as b, resolveExplicitGatewayUrlOrThrow as c, createDefaultRuntimeAgentControllerSettings as d, getConfiguredDaemonDispatchLimits as f, getConfiguredViewCustomization as g, getConfiguredSkillsConfig as h, normalizeGatewayBaseUrlOrNull as i, DEFAULT_RUNTIME_AGENT_TRANSPORT_MODE as l, getConfiguredOnboardingDisclaimerAcceptedAt as m, base_url_exports as n, resolveBaseUrlOrNull as o, getConfiguredDeviceRuntimeState as p, normalizeGatewayBaseUrl as r, resolveDefaultGatewayBaseUrl as s, DEV_LOCAL_GATEWAY_BASE_URL as t, alignRuntimeConfigStorage as u, resolveRuntimeSkillsCustomTargetId as v, updateConfiguredStartV1OnboardingState as w, updateConfiguredDeviceRuntimeState as x, setConfiguredBaseUrl as y };
907
+ //# sourceMappingURL=base-url-7O9DNTTC.js.map