wakeloop 0.1.0 → 0.2.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.
- package/dist/{add-me-membership-Dh1vHFLA.js → add-me-membership-ClvZxLF8.js} +3 -3
- package/dist/{add-me-membership-Dh1vHFLA.js.map → add-me-membership-ClvZxLF8.js.map} +1 -1
- package/dist/api-client-foundation-BmaHLmWr.js +6 -0
- package/dist/auth-session-Bi8Vzyml.js +6 -0
- package/dist/{base-url-7O9DNTTC.js → base-url-Bp-avdIi.js} +6 -6
- package/dist/{base-url-7O9DNTTC.js.map → base-url-Bp-avdIi.js.map} +1 -1
- package/dist/daemon-runtime-lease-DcbNGfne.js +6 -0
- package/dist/dist-DtyWoaXC.js +6 -0
- package/dist/{dist-JdCv_fuW.js → dist-gbpVUIxv.js} +638 -395
- package/dist/dist-gbpVUIxv.js.map +1 -0
- package/dist/{lock-BYUpcHBF.js → lock-BnMoxq4l.js} +4 -4
- package/dist/{lock-BYUpcHBF.js.map → lock-BnMoxq4l.js.map} +1 -1
- package/dist/{paths-F1dfknFj.js → paths-CI0MoSDY.js} +1 -1
- package/dist/{paths-F1dfknFj.js.map → paths-CI0MoSDY.js.map} +1 -1
- package/dist/{urls-B8ZoQgpS.js → urls-RVvjm5ga.js} +1 -1
- package/dist/{urls-B8ZoQgpS.js.map → urls-RVvjm5ga.js.map} +1 -1
- package/dist/wakeloop-dev.js +2 -2
- package/dist/wakeloop.js +25771 -23345
- package/dist/wakeloop.js.map +1 -1
- package/package.json +4 -3
- package/skills/wakeloop-cli/SKILL.md +1 -1
- package/skills/wakeloop-cli/playbooks/space-ops.md +1 -1
- package/skills/wakeloop-cli/references/commands.md +36 -1
- package/dist/api-client-foundation-Bw60iEgQ.js +0 -6
- package/dist/auth-session-CYafUSmo.js +0 -6
- package/dist/daemon-runtime-lease-BdIKGl39.js +0 -6
- package/dist/dist-BqpHxhFh.js +0 -6
- package/dist/dist-JdCv_fuW.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { A as sessionsDir, x as normalizeWakeLoopProfileId, y as locksDir } from "./paths-
|
|
4
|
-
import
|
|
3
|
+
import { A as sessionsDir, x as normalizeWakeLoopProfileId, y as locksDir } from "./paths-CI0MoSDY.js";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
5
|
import { mkdir, open, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
6
6
|
import { join } from "node:path";
|
|
7
|
-
import
|
|
7
|
+
import process$1 from "node:process";
|
|
8
8
|
|
|
9
9
|
//#region src/config/session-profile.ts
|
|
10
10
|
const WAKELOOP_CLI_CONTEXT_ENV_KEY = "WAKELOOP_CLI_CONTEXT_ID";
|
|
@@ -382,4 +382,4 @@ function toErrorMessage(error) {
|
|
|
382
382
|
|
|
383
383
|
//#endregion
|
|
384
384
|
export { runWithHeldLock as a, WAKELOOP_CLI_CONTEXT_ENV_KEY as c, resolveCliContext as d, resolveCliContextId as f, releaseLock as i, listCliContextStates as l, isWakeLoopLockError as n, tryCleanupStaleLock as o, writeCliContextState as p, readLockMeta as r, LEGACY_WAKELOOP_CLI_CONTEXT_ENV_KEY as s, acquireLock as t, readCliContextState as u };
|
|
385
|
-
//# sourceMappingURL=lock-
|
|
385
|
+
//# sourceMappingURL=lock-BnMoxq4l.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock-BYUpcHBF.js","names":["resolveLocksDir","process"],"sources":["../src/config/session-profile.ts","../src/config/lock.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, open, readdir, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n normalizeWakeLoopProfileId,\n sessionsDir,\n type WakeLoopProfileId,\n} from \"./paths\";\n\nexport const WAKELOOP_CLI_CONTEXT_ENV_KEY = \"WAKELOOP_CLI_CONTEXT_ID\";\nexport const LEGACY_WAKELOOP_CLI_CONTEXT_ENV_KEY = \"WAKELOOP_AGENT_SESSION_ID\";\n\nexport const CLI_CONTEXT_ENV_KEYS = [\n WAKELOOP_CLI_CONTEXT_ENV_KEY,\n LEGACY_WAKELOOP_CLI_CONTEXT_ENV_KEY,\n] as const;\n\nconst SESSION_FILE_MAX_LENGTH = 128;\nconst SESSION_FILE_HASH_LENGTH = 8;\n\nexport type CliContextResolution = {\n cliContextId: string;\n source: string;\n};\n\nexport type CliContextStateV1 = {\n v: 1;\n sessionId: string;\n updatedAt: string;\n cliContextSource?: string;\n wakeLoopProfileId?: string;\n selectedWakeLoopProfileId?: string;\n};\n\nexport function resolveCliContext(\n profileIdInput?: string\n): CliContextResolution | null {\n const explicit = normalizeSessionId(profileIdInput);\n if (explicit) {\n return {\n cliContextId: explicit,\n source: \"manual\",\n };\n }\n\n for (const key of CLI_CONTEXT_ENV_KEYS) {\n const sessionId = normalizeSessionId(process.env[key]);\n if (sessionId) {\n return {\n cliContextId: sessionId,\n source: `environment:${key}`,\n };\n }\n }\n\n return resolveTerminalSessionId();\n}\n\nexport function resolveCliContextId(profileIdInput?: string): string | null {\n return resolveCliContext(profileIdInput)?.cliContextId ?? null;\n}\n\nexport function buildSessionProfilePayload(\n session: CliContextResolution,\n wakeLoopProfileId: WakeLoopProfileId\n): CliContextStateV1 {\n return {\n v: 1,\n sessionId: session.cliContextId,\n cliContextSource: session.source,\n wakeLoopProfileId: normalizeWakeLoopProfileId(wakeLoopProfileId),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function formatCliContextSource(source: string): string {\n if (source === \"manual\") {\n return \"manual\";\n }\n if (source.startsWith(\"environment:\")) {\n return `environment:${source.slice(\"environment:\".length)}`;\n }\n if (source.startsWith(\"terminal:\")) {\n return \"terminal-fingerprint\";\n }\n return source;\n}\n\nexport function normalizeCliContextResolution(\n value: unknown\n): CliContextResolution | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const maybe = value as {\n cliContextId?: unknown;\n source?: unknown;\n };\n const cliContextId = normalizeSessionId(maybe.cliContextId);\n const source = normalizeSessionSource(maybe.source);\n if (!(cliContextId && source)) {\n return null;\n }\n\n return { cliContextId, source };\n}\n\nfunction normalizeSessionSource(raw: unknown): string | null {\n const value = String(raw ?? \"\").trim();\n if (!value) {\n return null;\n }\n return value;\n}\n\nexport async function setSessionWakeLoopProfileId(\n wakeLoopProfileId: WakeLoopProfileId\n): Promise<boolean> {\n return await writeCliContextState({\n wakeLoopProfileId,\n });\n}\n\nexport async function getSessionWakeLoopProfileId(): Promise<WakeLoopProfileId | null> {\n return (await readCliContextState())?.wakeLoopProfileId ?? null;\n}\n\nexport async function clearSessionWakeLoopProfileId(): Promise<boolean> {\n return await writeCliContextState({\n wakeLoopProfileId: null,\n });\n}\n\nexport async function readCliContextState(input?: {\n sessionId?: string;\n}): Promise<CliContextStateV1 | null> {\n const cliContextId = resolveSessionStateId(input?.sessionId);\n if (!cliContextId) {\n return null;\n }\n\n const raw = await readFile(cliContextStatePath(cliContextId), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n return null;\n }\n\n return parseCliContextState(raw);\n}\n\nexport async function listCliContextStates(): Promise<CliContextStateV1[]> {\n const entryNames = await readdir(sessionsDir()).catch(() => []);\n const states: CliContextStateV1[] = [];\n for (const entryName of entryNames) {\n if (!entryName.endsWith(\".json\")) {\n continue;\n }\n const raw = await readFile(join(sessionsDir(), entryName), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n continue;\n }\n const parsed = parseCliContextState(raw);\n if (!parsed) {\n continue;\n }\n states.push(parsed);\n }\n return states.sort((left, right) =>\n left.sessionId.localeCompare(right.sessionId)\n );\n}\n\nexport async function writeCliContextState(input: {\n sessionId?: string;\n sessionSource?: string;\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n}): Promise<boolean> {\n const cliContext = resolveCliContextStateInput(input) ?? resolveCliContext();\n if (!cliContext) {\n return false;\n }\n\n await mkdir(sessionsDir(), { recursive: true });\n const existing = await readCliContextState({\n sessionId: cliContext.cliContextId,\n });\n const nextWakeLoopProfileId = resolveNextSessionWakeLoopProfileId(\n existing,\n input\n );\n const nextSelectedWakeLoopProfileId = resolveNextSelectedWakeLoopProfileId(\n existing,\n input\n );\n const outputPath = cliContextStatePath(cliContext.cliContextId);\n\n if (!(nextWakeLoopProfileId || nextSelectedWakeLoopProfileId)) {\n await rm(outputPath, { force: true });\n return true;\n }\n\n const payload: CliContextStateV1 = {\n v: 1,\n sessionId: cliContext.cliContextId,\n cliContextSource:\n cliContext.source ?? existing?.cliContextSource ?? \"manual\",\n ...(nextWakeLoopProfileId\n ? { wakeLoopProfileId: nextWakeLoopProfileId }\n : {}),\n ...(nextSelectedWakeLoopProfileId\n ? { selectedWakeLoopProfileId: nextSelectedWakeLoopProfileId }\n : {}),\n updatedAt: new Date().toISOString(),\n };\n\n await writeCliContextStateFile(outputPath, payload);\n return true;\n}\n\nexport function cliContextStatePath(sessionId: string): string {\n return join(sessionsDir(), `${toSafeSessionFile(sessionId)}.json`);\n}\n\nfunction toSafeSessionFile(value: string): string {\n const hash = createHash(\"sha1\")\n .update(value, \"utf8\")\n .digest(\"hex\")\n .slice(0, SESSION_FILE_HASH_LENGTH);\n const safeBaseRaw = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const safeBase = safeBaseRaw.length > 0 ? safeBaseRaw : \"session\";\n const maxBaseLength = Math.max(\n 1,\n SESSION_FILE_MAX_LENGTH - SESSION_FILE_HASH_LENGTH - 1\n );\n const truncatedBase = safeBase.slice(0, maxBaseLength);\n return `${truncatedBase}-${hash}`;\n}\n\nfunction resolveCliContextStateInput(input: {\n sessionId?: string;\n sessionSource?: string;\n}): CliContextResolution | null {\n const sessionId = normalizeSessionId(input.sessionId);\n if (!sessionId) {\n return null;\n }\n return {\n cliContextId: sessionId,\n source: normalizeSessionSource(input.sessionSource) ?? \"manual\",\n };\n}\n\nfunction resolveSessionStateId(sessionId?: string): string | null {\n const explicit = normalizeSessionId(sessionId);\n if (explicit) {\n return explicit;\n }\n return resolveCliContext()?.cliContextId ?? null;\n}\n\nfunction parseCliContextState(raw: string): CliContextStateV1 | null {\n let parsed: Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n try {\n parsed = JSON.parse(raw) as Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n } catch {\n return null;\n }\n\n if (parsed.v !== 1) {\n return null;\n }\n const sessionId = normalizeSessionId(parsed.sessionId);\n if (!sessionId) {\n return null;\n }\n const wakeLoopProfileId = resolveStoredSessionWakeLoopProfileId(parsed);\n const selectedWakeLoopProfileId =\n resolveStoredSelectedWakeLoopProfileId(parsed);\n if (!(wakeLoopProfileId || selectedWakeLoopProfileId)) {\n return null;\n }\n const cliContextSource = normalizeSessionSource(parsed.cliContextSource);\n return {\n v: 1,\n sessionId,\n ...(cliContextSource ? { cliContextSource } : {}),\n ...(wakeLoopProfileId ? { wakeLoopProfileId } : {}),\n ...(selectedWakeLoopProfileId ? { selectedWakeLoopProfileId } : {}),\n updatedAt:\n typeof parsed.updatedAt === \"string\" && parsed.updatedAt.trim().length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString(),\n };\n}\n\nfunction resolveNextSessionWakeLoopProfileId(\n existing: CliContextStateV1 | null,\n input: {\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"wakeLoopProfileId\" in input)) {\n return existing?.wakeLoopProfileId;\n }\n return (\n normalizeOptionalWakeLoopProfileId(input.wakeLoopProfileId) ?? undefined\n );\n}\n\nfunction resolveNextSelectedWakeLoopProfileId(\n existing: CliContextStateV1 | null,\n input: {\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"selectedWakeLoopProfileId\" in input)) {\n return existing?.selectedWakeLoopProfileId;\n }\n return (\n normalizeOptionalWakeLoopProfileId(input.selectedWakeLoopProfileId) ??\n undefined\n );\n}\n\nasync function writeCliContextStateFile(\n outputPath: string,\n payload: CliContextStateV1\n): Promise<void> {\n const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}`;\n const file = await open(tempPath, \"w\");\n let writeFailure: unknown = null;\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } catch (error) {\n writeFailure = error;\n }\n try {\n await file.close();\n } catch (error) {\n if (!writeFailure) {\n writeFailure = error;\n }\n }\n if (writeFailure) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw writeFailure;\n }\n\n try {\n await rename(tempPath, outputPath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction normalizeSessionId(value: unknown): string | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n return raw.slice(0, 256);\n}\n\nfunction resolveTerminalSessionId(): CliContextResolution | null {\n if (!(process.stdin.isTTY || process.stdout.isTTY)) {\n return null;\n }\n\n const parentPid = Number(process.ppid);\n if (!Number.isInteger(parentPid) || parentPid <= 1) {\n return null;\n }\n\n return {\n cliContextId: `terminal-ppid-${parentPid}`,\n source: `terminal:ppid-${parentPid}`,\n };\n}\n\nfunction resolveStoredSessionWakeLoopProfileId(input: {\n wakeLoopProfileId?: unknown;\n profile?: unknown;\n}): WakeLoopProfileId | null {\n const wakeLoopProfileId = normalizeOptionalWakeLoopProfileId(\n input.wakeLoopProfileId\n );\n const legacyProfile = normalizeOptionalWakeLoopProfileId(input.profile);\n if (\n wakeLoopProfileId &&\n legacyProfile &&\n wakeLoopProfileId !== legacyProfile\n ) {\n throw new Error(\n `conflicting stored WakeLoop profile identity: wakeLoopProfileId=${wakeLoopProfileId}, profile=${legacyProfile}. Remove or reconcile the legacy profile field so it matches wakeLoopProfileId.`\n );\n }\n return wakeLoopProfileId ?? legacyProfile;\n}\n\nfunction resolveStoredSelectedWakeLoopProfileId(input: {\n selectedWakeLoopProfileId?: unknown;\n}): WakeLoopProfileId | null {\n return normalizeOptionalWakeLoopProfileId(input.selectedWakeLoopProfileId);\n}\n\nfunction normalizeOptionalWakeLoopProfileId(\n value: unknown\n): WakeLoopProfileId | null {\n if (typeof value !== \"string\") {\n return null;\n }\n try {\n return normalizeWakeLoopProfileId(value);\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n normalizeWakeLoopProfileId,\n locksDir as resolveLocksDir,\n} from \"./paths\";\nimport { resolveCliContextId } from \"./session-profile\";\n\nexport type WakeLoopLock = {\n path: string;\n};\n\nexport type WakeLoopLockMeta = Record<string, unknown>;\ntype HeldLockReleaseContext = Record<string, unknown>;\n\nexport class WakeLoopLockError extends Error {\n readonly code = \"wakeloop.locked\";\n readonly lockPath: string;\n readonly lockKey: string;\n readonly metaRaw: string | null;\n readonly meta: WakeLoopLockMeta | null;\n\n constructor(input: { path: string; key: string; metaRaw?: string }) {\n const normalizedMetaRaw = normalizeMetaRaw(input.metaRaw);\n super(buildWakeLoopLockErrorMessage(input.path, normalizedMetaRaw));\n this.name = \"WakeLoopLockError\";\n this.lockPath = input.path;\n this.lockKey = input.key;\n this.metaRaw = normalizedMetaRaw;\n this.meta = parseWakeLoopLockMeta(normalizedMetaRaw);\n }\n}\n\nexport function isWakeLoopLockError(\n error: unknown\n): error is WakeLoopLockError {\n return error instanceof WakeLoopLockError;\n}\n\nexport async function acquireLock(input: {\n wakeLoopProfileId: string;\n key: string;\n meta?: WakeLoopLockMeta;\n}): Promise<WakeLoopLock> {\n const wakeLoopProfileId = normalizeWakeLoopProfileId(input.wakeLoopProfileId);\n const sessionId = resolveCliContextId();\n const dir = resolveLocksDir(wakeLoopProfileId);\n await mkdir(dir, { recursive: true });\n\n const path = resolveLockPath({\n wakeLoopProfileId,\n key: input.key,\n });\n\n // Exclusive create, with basic stale-lock recovery.\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n await writeFile(\n path,\n `${JSON.stringify({\n pid: process.pid,\n wakeLoopProfileId,\n ...(sessionId ? { sessionId } : {}),\n at: new Date().toISOString(),\n ...(input.meta ? { ...input.meta } : {}),\n })}\\n`,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n }\n );\n return { path };\n } catch {\n const existingLock = await readLockSnapshot(path);\n\n if (await tryCleanupStaleLockPath(path, existingLock)) {\n continue;\n }\n\n throw new WakeLoopLockError({\n path,\n key: input.key,\n metaRaw: existingLock.metaRaw ?? undefined,\n });\n }\n }\n\n throw new WakeLoopLockError({\n path,\n key: input.key,\n });\n}\n\nexport async function releaseLock(lock: WakeLoopLock): Promise<void> {\n await rm(lock.path, { force: true });\n}\n\nexport async function runWithCleanupPreservingRunError<T>(input: {\n run: () => Promise<T>;\n cleanup: () => Promise<void>;\n onCleanupErrorAfterRunFailure?: (cleanupError: unknown) => void;\n}): Promise<T> {\n let runResult: T | undefined;\n let runSucceeded = false;\n let runError: unknown;\n\n try {\n runResult = await input.run();\n runSucceeded = true;\n } catch (error) {\n runError = error;\n }\n\n try {\n await input.cleanup();\n } catch (cleanupError) {\n if (!runSucceeded) {\n input.onCleanupErrorAfterRunFailure?.(cleanupError);\n throw runError;\n }\n throw cleanupError;\n }\n\n if (!runSucceeded) {\n throw runError;\n }\n\n return runResult as T;\n}\n\nexport async function runWithHeldLock<T>(input: {\n lock: WakeLoopLock;\n run: () => Promise<T>;\n releaseContext?: HeldLockReleaseContext;\n}): Promise<T> {\n return await runWithCleanupPreservingRunError({\n run: input.run,\n cleanup: () => releaseLock(input.lock),\n onCleanupErrorAfterRunFailure: (releaseError) => {\n warnLockReleaseFailure({\n error: releaseError,\n lock: input.lock,\n releaseContext: input.releaseContext,\n });\n },\n });\n}\n\nexport async function readLockMeta(input: {\n wakeLoopProfileId: string;\n key: string;\n}): Promise<WakeLoopLockMeta | null> {\n const existingLock = await readLockSnapshot(\n resolveLockPath({\n wakeLoopProfileId: input.wakeLoopProfileId,\n key: input.key,\n })\n );\n return existingLock.meta;\n}\n\nexport async function tryCleanupStaleLock(input: {\n wakeLoopProfileId: string;\n key: string;\n}): Promise<boolean> {\n return await tryCleanupStaleLockPath(\n resolveLockPath({\n wakeLoopProfileId: input.wakeLoopProfileId,\n key: input.key,\n })\n );\n}\n\ntype LockSnapshot = {\n metaRaw: string | null;\n meta: WakeLoopLockMeta | null;\n pid: number | null;\n hasStalePid: boolean;\n};\n\nfunction resolveLockPath(input: {\n wakeLoopProfileId: string;\n key: string;\n}): string {\n const wakeLoopProfileId = normalizeWakeLoopProfileId(input.wakeLoopProfileId);\n return join(\n resolveLocksDir(wakeLoopProfileId),\n `${sanitizeFilename(input.key)}.lock`\n );\n}\n\nfunction sanitizeFilename(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n}\n\nfunction safeParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction normalizeMetaRaw(metaRaw: string | undefined): string | null {\n if (typeof metaRaw !== \"string\") {\n return null;\n }\n const normalized = metaRaw.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction parseWakeLoopLockMeta(\n metaRaw: string | null\n): WakeLoopLockMeta | null {\n if (!metaRaw) {\n return null;\n }\n const parsed = safeParse(metaRaw);\n if (!parsed || typeof parsed !== \"object\") {\n return null;\n }\n return parsed as WakeLoopLockMeta;\n}\n\nfunction buildWakeLoopLockErrorMessage(\n path: string,\n metaRaw: string | null\n): string {\n if (!metaRaw) {\n return `space is locked (${path})`;\n }\n return `space is locked (${path}). Meta: ${metaRaw}`;\n}\n\nfunction getPidFromMeta(meta: unknown): number | null {\n if (!meta || typeof meta !== \"object\") {\n return null;\n }\n const pid = (meta as Record<string, unknown>).pid;\n return typeof pid === \"number\" ? pid : null;\n}\n\nasync function readLockSnapshot(path: string): Promise<LockSnapshot> {\n const metaRaw = await readFile(path, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw ?? undefined);\n if (normalizedMetaRaw === null) {\n return {\n metaRaw: null,\n meta: null,\n pid: null,\n hasStalePid: false,\n };\n }\n\n const meta = parseWakeLoopLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStalePid: pid !== null && !isPidAlive(pid),\n };\n}\n\nasync function tryCleanupStaleLockPath(\n path: string,\n initialSnapshot?: LockSnapshot\n): Promise<boolean> {\n const firstSnapshot = initialSnapshot ?? (await readLockSnapshot(path));\n\n if (\n firstSnapshot.metaRaw === null ||\n firstSnapshot.pid === null ||\n !firstSnapshot.hasStalePid\n ) {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (\n confirmedSnapshot.metaRaw !== firstSnapshot.metaRaw ||\n confirmedSnapshot.pid !== firstSnapshot.pid ||\n !confirmedSnapshot.hasStalePid\n ) {\n return false;\n }\n\n await rm(path, { force: true });\n return true;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n if (getErrorCode(err) === \"ESRCH\") {\n return false;\n }\n return true;\n }\n}\n\nfunction getErrorCode(err: unknown): string | undefined {\n if (!err || typeof err !== \"object\") {\n return undefined;\n }\n const code = (err as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nfunction warnLockReleaseFailure(input: {\n error: unknown;\n lock: WakeLoopLock;\n releaseContext?: HeldLockReleaseContext;\n}): void {\n console.warn(\"[wakeloop.lock.release.warning]\", {\n lockPath: input.lock.path,\n releaseError: toErrorMessage(input.error),\n releaseContext: input.releaseContext ?? {},\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lock-BnMoxq4l.js","names":["resolveLocksDir","process"],"sources":["../src/config/session-profile.ts","../src/config/lock.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, open, readdir, readFile, rename, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n normalizeWakeLoopProfileId,\n sessionsDir,\n type WakeLoopProfileId,\n} from \"./paths\";\n\nexport const WAKELOOP_CLI_CONTEXT_ENV_KEY = \"WAKELOOP_CLI_CONTEXT_ID\";\nexport const LEGACY_WAKELOOP_CLI_CONTEXT_ENV_KEY = \"WAKELOOP_AGENT_SESSION_ID\";\n\nexport const CLI_CONTEXT_ENV_KEYS = [\n WAKELOOP_CLI_CONTEXT_ENV_KEY,\n LEGACY_WAKELOOP_CLI_CONTEXT_ENV_KEY,\n] as const;\n\nconst SESSION_FILE_MAX_LENGTH = 128;\nconst SESSION_FILE_HASH_LENGTH = 8;\n\nexport type CliContextResolution = {\n cliContextId: string;\n source: string;\n};\n\nexport type CliContextStateV1 = {\n v: 1;\n sessionId: string;\n updatedAt: string;\n cliContextSource?: string;\n wakeLoopProfileId?: string;\n selectedWakeLoopProfileId?: string;\n};\n\nexport function resolveCliContext(\n profileIdInput?: string\n): CliContextResolution | null {\n const explicit = normalizeSessionId(profileIdInput);\n if (explicit) {\n return {\n cliContextId: explicit,\n source: \"manual\",\n };\n }\n\n for (const key of CLI_CONTEXT_ENV_KEYS) {\n const sessionId = normalizeSessionId(process.env[key]);\n if (sessionId) {\n return {\n cliContextId: sessionId,\n source: `environment:${key}`,\n };\n }\n }\n\n return resolveTerminalSessionId();\n}\n\nexport function resolveCliContextId(profileIdInput?: string): string | null {\n return resolveCliContext(profileIdInput)?.cliContextId ?? null;\n}\n\nexport function buildSessionProfilePayload(\n session: CliContextResolution,\n wakeLoopProfileId: WakeLoopProfileId\n): CliContextStateV1 {\n return {\n v: 1,\n sessionId: session.cliContextId,\n cliContextSource: session.source,\n wakeLoopProfileId: normalizeWakeLoopProfileId(wakeLoopProfileId),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function formatCliContextSource(source: string): string {\n if (source === \"manual\") {\n return \"manual\";\n }\n if (source.startsWith(\"environment:\")) {\n return `environment:${source.slice(\"environment:\".length)}`;\n }\n if (source.startsWith(\"terminal:\")) {\n return \"terminal-fingerprint\";\n }\n return source;\n}\n\nexport function normalizeCliContextResolution(\n value: unknown\n): CliContextResolution | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const maybe = value as {\n cliContextId?: unknown;\n source?: unknown;\n };\n const cliContextId = normalizeSessionId(maybe.cliContextId);\n const source = normalizeSessionSource(maybe.source);\n if (!(cliContextId && source)) {\n return null;\n }\n\n return { cliContextId, source };\n}\n\nfunction normalizeSessionSource(raw: unknown): string | null {\n const value = String(raw ?? \"\").trim();\n if (!value) {\n return null;\n }\n return value;\n}\n\nexport async function setSessionWakeLoopProfileId(\n wakeLoopProfileId: WakeLoopProfileId\n): Promise<boolean> {\n return await writeCliContextState({\n wakeLoopProfileId,\n });\n}\n\nexport async function getSessionWakeLoopProfileId(): Promise<WakeLoopProfileId | null> {\n return (await readCliContextState())?.wakeLoopProfileId ?? null;\n}\n\nexport async function clearSessionWakeLoopProfileId(): Promise<boolean> {\n return await writeCliContextState({\n wakeLoopProfileId: null,\n });\n}\n\nexport async function readCliContextState(input?: {\n sessionId?: string;\n}): Promise<CliContextStateV1 | null> {\n const cliContextId = resolveSessionStateId(input?.sessionId);\n if (!cliContextId) {\n return null;\n }\n\n const raw = await readFile(cliContextStatePath(cliContextId), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n return null;\n }\n\n return parseCliContextState(raw);\n}\n\nexport async function listCliContextStates(): Promise<CliContextStateV1[]> {\n const entryNames = await readdir(sessionsDir()).catch(() => []);\n const states: CliContextStateV1[] = [];\n for (const entryName of entryNames) {\n if (!entryName.endsWith(\".json\")) {\n continue;\n }\n const raw = await readFile(join(sessionsDir(), entryName), \"utf8\").catch(\n () => null\n );\n if (!raw) {\n continue;\n }\n const parsed = parseCliContextState(raw);\n if (!parsed) {\n continue;\n }\n states.push(parsed);\n }\n return states.sort((left, right) =>\n left.sessionId.localeCompare(right.sessionId)\n );\n}\n\nexport async function writeCliContextState(input: {\n sessionId?: string;\n sessionSource?: string;\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n}): Promise<boolean> {\n const cliContext = resolveCliContextStateInput(input) ?? resolveCliContext();\n if (!cliContext) {\n return false;\n }\n\n await mkdir(sessionsDir(), { recursive: true });\n const existing = await readCliContextState({\n sessionId: cliContext.cliContextId,\n });\n const nextWakeLoopProfileId = resolveNextSessionWakeLoopProfileId(\n existing,\n input\n );\n const nextSelectedWakeLoopProfileId = resolveNextSelectedWakeLoopProfileId(\n existing,\n input\n );\n const outputPath = cliContextStatePath(cliContext.cliContextId);\n\n if (!(nextWakeLoopProfileId || nextSelectedWakeLoopProfileId)) {\n await rm(outputPath, { force: true });\n return true;\n }\n\n const payload: CliContextStateV1 = {\n v: 1,\n sessionId: cliContext.cliContextId,\n cliContextSource:\n cliContext.source ?? existing?.cliContextSource ?? \"manual\",\n ...(nextWakeLoopProfileId\n ? { wakeLoopProfileId: nextWakeLoopProfileId }\n : {}),\n ...(nextSelectedWakeLoopProfileId\n ? { selectedWakeLoopProfileId: nextSelectedWakeLoopProfileId }\n : {}),\n updatedAt: new Date().toISOString(),\n };\n\n await writeCliContextStateFile(outputPath, payload);\n return true;\n}\n\nexport function cliContextStatePath(sessionId: string): string {\n return join(sessionsDir(), `${toSafeSessionFile(sessionId)}.json`);\n}\n\nfunction toSafeSessionFile(value: string): string {\n const hash = createHash(\"sha1\")\n .update(value, \"utf8\")\n .digest(\"hex\")\n .slice(0, SESSION_FILE_HASH_LENGTH);\n const safeBaseRaw = value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const safeBase = safeBaseRaw.length > 0 ? safeBaseRaw : \"session\";\n const maxBaseLength = Math.max(\n 1,\n SESSION_FILE_MAX_LENGTH - SESSION_FILE_HASH_LENGTH - 1\n );\n const truncatedBase = safeBase.slice(0, maxBaseLength);\n return `${truncatedBase}-${hash}`;\n}\n\nfunction resolveCliContextStateInput(input: {\n sessionId?: string;\n sessionSource?: string;\n}): CliContextResolution | null {\n const sessionId = normalizeSessionId(input.sessionId);\n if (!sessionId) {\n return null;\n }\n return {\n cliContextId: sessionId,\n source: normalizeSessionSource(input.sessionSource) ?? \"manual\",\n };\n}\n\nfunction resolveSessionStateId(sessionId?: string): string | null {\n const explicit = normalizeSessionId(sessionId);\n if (explicit) {\n return explicit;\n }\n return resolveCliContext()?.cliContextId ?? null;\n}\n\nfunction parseCliContextState(raw: string): CliContextStateV1 | null {\n let parsed: Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n try {\n parsed = JSON.parse(raw) as Partial<CliContextStateV1> & {\n profile?: unknown;\n };\n } catch {\n return null;\n }\n\n if (parsed.v !== 1) {\n return null;\n }\n const sessionId = normalizeSessionId(parsed.sessionId);\n if (!sessionId) {\n return null;\n }\n const wakeLoopProfileId = resolveStoredSessionWakeLoopProfileId(parsed);\n const selectedWakeLoopProfileId =\n resolveStoredSelectedWakeLoopProfileId(parsed);\n if (!(wakeLoopProfileId || selectedWakeLoopProfileId)) {\n return null;\n }\n const cliContextSource = normalizeSessionSource(parsed.cliContextSource);\n return {\n v: 1,\n sessionId,\n ...(cliContextSource ? { cliContextSource } : {}),\n ...(wakeLoopProfileId ? { wakeLoopProfileId } : {}),\n ...(selectedWakeLoopProfileId ? { selectedWakeLoopProfileId } : {}),\n updatedAt:\n typeof parsed.updatedAt === \"string\" && parsed.updatedAt.trim().length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString(),\n };\n}\n\nfunction resolveNextSessionWakeLoopProfileId(\n existing: CliContextStateV1 | null,\n input: {\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"wakeLoopProfileId\" in input)) {\n return existing?.wakeLoopProfileId;\n }\n return (\n normalizeOptionalWakeLoopProfileId(input.wakeLoopProfileId) ?? undefined\n );\n}\n\nfunction resolveNextSelectedWakeLoopProfileId(\n existing: CliContextStateV1 | null,\n input: {\n wakeLoopProfileId?: string | null;\n selectedWakeLoopProfileId?: string | null;\n }\n): string | undefined {\n if (!(\"selectedWakeLoopProfileId\" in input)) {\n return existing?.selectedWakeLoopProfileId;\n }\n return (\n normalizeOptionalWakeLoopProfileId(input.selectedWakeLoopProfileId) ??\n undefined\n );\n}\n\nasync function writeCliContextStateFile(\n outputPath: string,\n payload: CliContextStateV1\n): Promise<void> {\n const tempPath = `${outputPath}.tmp-${process.pid}-${Date.now()}`;\n const file = await open(tempPath, \"w\");\n let writeFailure: unknown = null;\n try {\n await file.writeFile(`${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n await file.sync();\n } catch (error) {\n writeFailure = error;\n }\n try {\n await file.close();\n } catch (error) {\n if (!writeFailure) {\n writeFailure = error;\n }\n }\n if (writeFailure) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw writeFailure;\n }\n\n try {\n await rename(tempPath, outputPath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nfunction normalizeSessionId(value: unknown): string | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n return raw.slice(0, 256);\n}\n\nfunction resolveTerminalSessionId(): CliContextResolution | null {\n if (!(process.stdin.isTTY || process.stdout.isTTY)) {\n return null;\n }\n\n const parentPid = Number(process.ppid);\n if (!Number.isInteger(parentPid) || parentPid <= 1) {\n return null;\n }\n\n return {\n cliContextId: `terminal-ppid-${parentPid}`,\n source: `terminal:ppid-${parentPid}`,\n };\n}\n\nfunction resolveStoredSessionWakeLoopProfileId(input: {\n wakeLoopProfileId?: unknown;\n profile?: unknown;\n}): WakeLoopProfileId | null {\n const wakeLoopProfileId = normalizeOptionalWakeLoopProfileId(\n input.wakeLoopProfileId\n );\n const legacyProfile = normalizeOptionalWakeLoopProfileId(input.profile);\n if (\n wakeLoopProfileId &&\n legacyProfile &&\n wakeLoopProfileId !== legacyProfile\n ) {\n throw new Error(\n `conflicting stored WakeLoop profile identity: wakeLoopProfileId=${wakeLoopProfileId}, profile=${legacyProfile}. Remove or reconcile the legacy profile field so it matches wakeLoopProfileId.`\n );\n }\n return wakeLoopProfileId ?? legacyProfile;\n}\n\nfunction resolveStoredSelectedWakeLoopProfileId(input: {\n selectedWakeLoopProfileId?: unknown;\n}): WakeLoopProfileId | null {\n return normalizeOptionalWakeLoopProfileId(input.selectedWakeLoopProfileId);\n}\n\nfunction normalizeOptionalWakeLoopProfileId(\n value: unknown\n): WakeLoopProfileId | null {\n if (typeof value !== \"string\") {\n return null;\n }\n try {\n return normalizeWakeLoopProfileId(value);\n } catch {\n return null;\n }\n}\n","import { mkdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\nimport {\n normalizeWakeLoopProfileId,\n locksDir as resolveLocksDir,\n} from \"./paths\";\nimport { resolveCliContextId } from \"./session-profile\";\n\nexport type WakeLoopLock = {\n path: string;\n};\n\nexport type WakeLoopLockMeta = Record<string, unknown>;\ntype HeldLockReleaseContext = Record<string, unknown>;\n\nexport class WakeLoopLockError extends Error {\n readonly code = \"wakeloop.locked\";\n readonly lockPath: string;\n readonly lockKey: string;\n readonly metaRaw: string | null;\n readonly meta: WakeLoopLockMeta | null;\n\n constructor(input: { path: string; key: string; metaRaw?: string }) {\n const normalizedMetaRaw = normalizeMetaRaw(input.metaRaw);\n super(buildWakeLoopLockErrorMessage(input.path, normalizedMetaRaw));\n this.name = \"WakeLoopLockError\";\n this.lockPath = input.path;\n this.lockKey = input.key;\n this.metaRaw = normalizedMetaRaw;\n this.meta = parseWakeLoopLockMeta(normalizedMetaRaw);\n }\n}\n\nexport function isWakeLoopLockError(\n error: unknown\n): error is WakeLoopLockError {\n return error instanceof WakeLoopLockError;\n}\n\nexport async function acquireLock(input: {\n wakeLoopProfileId: string;\n key: string;\n meta?: WakeLoopLockMeta;\n}): Promise<WakeLoopLock> {\n const wakeLoopProfileId = normalizeWakeLoopProfileId(input.wakeLoopProfileId);\n const sessionId = resolveCliContextId();\n const dir = resolveLocksDir(wakeLoopProfileId);\n await mkdir(dir, { recursive: true });\n\n const path = resolveLockPath({\n wakeLoopProfileId,\n key: input.key,\n });\n\n // Exclusive create, with basic stale-lock recovery.\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n await writeFile(\n path,\n `${JSON.stringify({\n pid: process.pid,\n wakeLoopProfileId,\n ...(sessionId ? { sessionId } : {}),\n at: new Date().toISOString(),\n ...(input.meta ? { ...input.meta } : {}),\n })}\\n`,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n }\n );\n return { path };\n } catch {\n const existingLock = await readLockSnapshot(path);\n\n if (await tryCleanupStaleLockPath(path, existingLock)) {\n continue;\n }\n\n throw new WakeLoopLockError({\n path,\n key: input.key,\n metaRaw: existingLock.metaRaw ?? undefined,\n });\n }\n }\n\n throw new WakeLoopLockError({\n path,\n key: input.key,\n });\n}\n\nexport async function releaseLock(lock: WakeLoopLock): Promise<void> {\n await rm(lock.path, { force: true });\n}\n\nexport async function runWithCleanupPreservingRunError<T>(input: {\n run: () => Promise<T>;\n cleanup: () => Promise<void>;\n onCleanupErrorAfterRunFailure?: (cleanupError: unknown) => void;\n}): Promise<T> {\n let runResult: T | undefined;\n let runSucceeded = false;\n let runError: unknown;\n\n try {\n runResult = await input.run();\n runSucceeded = true;\n } catch (error) {\n runError = error;\n }\n\n try {\n await input.cleanup();\n } catch (cleanupError) {\n if (!runSucceeded) {\n input.onCleanupErrorAfterRunFailure?.(cleanupError);\n throw runError;\n }\n throw cleanupError;\n }\n\n if (!runSucceeded) {\n throw runError;\n }\n\n return runResult as T;\n}\n\nexport async function runWithHeldLock<T>(input: {\n lock: WakeLoopLock;\n run: () => Promise<T>;\n releaseContext?: HeldLockReleaseContext;\n}): Promise<T> {\n return await runWithCleanupPreservingRunError({\n run: input.run,\n cleanup: () => releaseLock(input.lock),\n onCleanupErrorAfterRunFailure: (releaseError) => {\n warnLockReleaseFailure({\n error: releaseError,\n lock: input.lock,\n releaseContext: input.releaseContext,\n });\n },\n });\n}\n\nexport async function readLockMeta(input: {\n wakeLoopProfileId: string;\n key: string;\n}): Promise<WakeLoopLockMeta | null> {\n const existingLock = await readLockSnapshot(\n resolveLockPath({\n wakeLoopProfileId: input.wakeLoopProfileId,\n key: input.key,\n })\n );\n return existingLock.meta;\n}\n\nexport async function tryCleanupStaleLock(input: {\n wakeLoopProfileId: string;\n key: string;\n}): Promise<boolean> {\n return await tryCleanupStaleLockPath(\n resolveLockPath({\n wakeLoopProfileId: input.wakeLoopProfileId,\n key: input.key,\n })\n );\n}\n\ntype LockSnapshot = {\n metaRaw: string | null;\n meta: WakeLoopLockMeta | null;\n pid: number | null;\n hasStalePid: boolean;\n};\n\nfunction resolveLockPath(input: {\n wakeLoopProfileId: string;\n key: string;\n}): string {\n const wakeLoopProfileId = normalizeWakeLoopProfileId(input.wakeLoopProfileId);\n return join(\n resolveLocksDir(wakeLoopProfileId),\n `${sanitizeFilename(input.key)}.lock`\n );\n}\n\nfunction sanitizeFilename(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n}\n\nfunction safeParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction normalizeMetaRaw(metaRaw: string | undefined): string | null {\n if (typeof metaRaw !== \"string\") {\n return null;\n }\n const normalized = metaRaw.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction parseWakeLoopLockMeta(\n metaRaw: string | null\n): WakeLoopLockMeta | null {\n if (!metaRaw) {\n return null;\n }\n const parsed = safeParse(metaRaw);\n if (!parsed || typeof parsed !== \"object\") {\n return null;\n }\n return parsed as WakeLoopLockMeta;\n}\n\nfunction buildWakeLoopLockErrorMessage(\n path: string,\n metaRaw: string | null\n): string {\n if (!metaRaw) {\n return `space is locked (${path})`;\n }\n return `space is locked (${path}). Meta: ${metaRaw}`;\n}\n\nfunction getPidFromMeta(meta: unknown): number | null {\n if (!meta || typeof meta !== \"object\") {\n return null;\n }\n const pid = (meta as Record<string, unknown>).pid;\n return typeof pid === \"number\" ? pid : null;\n}\n\nasync function readLockSnapshot(path: string): Promise<LockSnapshot> {\n const metaRaw = await readFile(path, \"utf8\").catch((error) => {\n if (getErrorCode(error) === \"ENOENT\") {\n return null;\n }\n throw error;\n });\n const normalizedMetaRaw = normalizeMetaRaw(metaRaw ?? undefined);\n if (normalizedMetaRaw === null) {\n return {\n metaRaw: null,\n meta: null,\n pid: null,\n hasStalePid: false,\n };\n }\n\n const meta = parseWakeLoopLockMeta(normalizedMetaRaw);\n const pid = getPidFromMeta(meta);\n return {\n metaRaw: normalizedMetaRaw,\n meta,\n pid,\n hasStalePid: pid !== null && !isPidAlive(pid),\n };\n}\n\nasync function tryCleanupStaleLockPath(\n path: string,\n initialSnapshot?: LockSnapshot\n): Promise<boolean> {\n const firstSnapshot = initialSnapshot ?? (await readLockSnapshot(path));\n\n if (\n firstSnapshot.metaRaw === null ||\n firstSnapshot.pid === null ||\n !firstSnapshot.hasStalePid\n ) {\n return false;\n }\n\n const confirmedSnapshot = await readLockSnapshot(path);\n if (\n confirmedSnapshot.metaRaw !== firstSnapshot.metaRaw ||\n confirmedSnapshot.pid !== firstSnapshot.pid ||\n !confirmedSnapshot.hasStalePid\n ) {\n return false;\n }\n\n await rm(path, { force: true });\n return true;\n}\n\nfunction isPidAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n if (getErrorCode(err) === \"ESRCH\") {\n return false;\n }\n return true;\n }\n}\n\nfunction getErrorCode(err: unknown): string | undefined {\n if (!err || typeof err !== \"object\") {\n return undefined;\n }\n const code = (err as { code?: unknown }).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\nfunction warnLockReleaseFailure(input: {\n error: unknown;\n lock: WakeLoopLock;\n releaseContext?: HeldLockReleaseContext;\n}): void {\n console.warn(\"[wakeloop.lock.release.warning]\", {\n lockPath: input.lock.path,\n releaseError: toErrorMessage(input.error),\n releaseContext: input.releaseContext ?? {},\n });\n}\n\nfunction toErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"],"mappings":"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"}
|
|
@@ -207,4 +207,4 @@ function resolveHomeDirectory(input) {
|
|
|
207
207
|
|
|
208
208
|
//#endregion
|
|
209
209
|
export { sessionsDir as A, profileViewPath as C, resolveWakeLoopRootDir as D, resolveWakeLoopEnvPreset as E, wakeLoopRootDir as F, spacesDir as M, systemDir as N, runtimeDir as O, wakeLoopBackupsDir as P, profileDir as S, resolveWakeLoopCliEntryNameFromArgv as T, legacyAccountProfileSpacesDir as _, accountProfileWorkspacePath as a, normalizeAccountKey as b, deviceDir as c, deviceOpenClawProfileWorkspaceDir as d, devicePreferencesPath as f, deviceSkillsStorePath as g, deviceSkillsInstallsPath as h, accountProfileViewPath as i, skillsDir as j, runtimeLogsDir as k, deviceOpenClawProfileBootstrapPath as l, deviceSkillsDir as m, accountProfileLocalMetaPath as n, accountsDir as o, deviceSkillsCustomTargetsPath as p, accountProfileSpaceCacheDir as r, deviceAgentRuntimePath as s, WAKELOOP_HOME_ENV_KEY as t, deviceOpenClawProfileDir as u, legacyRuntimeConfigPath as v, resolveDefaultWakeLoopHomeDirname as w, normalizeWakeLoopProfileId as x, locksDir as y };
|
|
210
|
-
//# sourceMappingURL=paths-
|
|
210
|
+
//# sourceMappingURL=paths-CI0MoSDY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths-F1dfknFj.js","names":[],"sources":["../src/config/paths.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { basename, dirname, join, parse } from \"node:path\";\n\nexport type WakeLoopProfileId = string;\nexport type WakeLoopAccountKey = {\n hostKey: string;\n userKey: string;\n};\nexport type WakeLoopEnvPreset = \"prod\" | \"dev-local\" | \"canary\";\ntype WakeLoopPathResolutionInput = {\n env?: NodeJS.ProcessEnv;\n argv?: string[];\n homeDir?: string;\n};\n\nexport type { WakeLoopPathResolutionInput };\n\nconst MAX_ACCOUNT_PATH_SEGMENT_LENGTH = 128;\nconst FALLBACK_ACCOUNT_HOST_KEY = \"unauthenticated\";\nconst FALLBACK_ACCOUNT_USER_KEY = \"local\";\nexport const WAKELOOP_HOME_ENV_KEY = \"WAKELOOP_HOME\";\nconst WAKELOOP_ENV_PRESET_ENV_KEY = \"WAKELOOP_ENV_PRESET\";\nconst DEFAULT_WAKELOOP_ENV_PRESET: WakeLoopEnvPreset = \"prod\";\nconst WAKELOOP_DEFAULT_HOME_DIR_BY_PRESET = {\n prod: \".wakeloop\",\n \"dev-local\": \".wakeloop-dev\",\n canary: \".wakeloop-canary\",\n} as const satisfies Record<WakeLoopEnvPreset, string>;\nconst WAKELOOP_ENV_PRESET_BY_ENTRY_NAME = {\n wakeloop: \"prod\",\n \"wakeloop-dev\": \"dev-local\",\n \"wakeloop-canary\": \"canary\",\n} as const satisfies Record<string, WakeLoopEnvPreset>;\nexport type WakeLoopCliEntryName =\n keyof typeof WAKELOOP_ENV_PRESET_BY_ENTRY_NAME;\n\nexport function normalizeWakeLoopProfileId(value: unknown): WakeLoopProfileId {\n const raw = String(value ?? \"\").trim();\n if (raw.length === 0) {\n throw new Error(\"wakeLoopProfileId is required\");\n }\n // Keep filenames stable and safe.\n const safe = raw.replace(/[^a-zA-Z0-9._-]+/g, \"_\").toLowerCase();\n if (!safe || safe === \".\" || safe === \"..\") {\n throw new Error(\"wakeLoopProfileId is invalid\");\n }\n if (safe.length > MAX_ACCOUNT_PATH_SEGMENT_LENGTH) {\n throw new Error(\"wakeLoopProfileId is too long\");\n }\n return safe;\n}\n\nexport function resolveWakeLoopEnvPreset(\n input: WakeLoopPathResolutionInput = {}\n): WakeLoopEnvPreset {\n const env = input.env ?? process.env;\n const fromEnv = normalizeWakeLoopEnvPreset(env[WAKELOOP_ENV_PRESET_ENV_KEY]);\n if (fromEnv) {\n return fromEnv;\n }\n return resolveWakeLoopEnvPresetFromArgv(input.argv ?? process.argv);\n}\n\nexport function resolveDefaultWakeLoopHomeDirname(\n preset: WakeLoopEnvPreset\n): string {\n return WAKELOOP_DEFAULT_HOME_DIR_BY_PRESET[preset];\n}\n\nexport function resolveWakeLoopRootDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n const env = input.env ?? process.env;\n const fromEnv = String(env[WAKELOOP_HOME_ENV_KEY] ?? \"\").trim();\n if (fromEnv) {\n return fromEnv;\n }\n const preset = resolveWakeLoopEnvPreset(input);\n return join(\n resolveHomeDirectory(input),\n resolveDefaultWakeLoopHomeDirname(preset)\n );\n}\n\nexport function wakeLoopRootDir(): string {\n return resolveWakeLoopRootDir();\n}\n\nexport function wakeLoopBackupsDir(): string {\n const root = wakeLoopRootDir();\n return join(dirname(root), `${basename(root)}-backups`);\n}\n\nexport function accountsDir(): string {\n return join(wakeLoopRootDir(), \"accounts\");\n}\n\nexport function deviceDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"device\");\n}\n\nexport function deviceDaemonDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"daemon\");\n}\n\nexport function deviceSkillsDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"skills\");\n}\n\nexport function devicePreferencesPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"preferences.json\");\n}\n\nexport function deviceAgentRuntimePath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"agent-runtime.json\");\n}\n\nexport function deviceProvidersDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"providers\");\n}\n\nexport function deviceProviderDir(\n providerId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(\n deviceProvidersDir(input),\n normalizePathSegment(providerId, \"unknown\")\n );\n}\n\nexport function deviceProviderProfilesDir(\n providerId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceProviderDir(providerId, input), \"profiles\");\n}\n\nexport function deviceProviderProfileDir(\n providerId: string,\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(\n deviceProviderProfilesDir(providerId, input),\n normalizePathSegment(profileId, \"unknown\")\n );\n}\n\nexport function deviceOpenClawProfilesDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return deviceProviderProfilesDir(\"openclaw\", input);\n}\n\nexport function deviceOpenClawProfileDir(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return deviceProviderProfileDir(\"openclaw\", profileId, input);\n}\n\nexport function deviceOpenClawProfileWorkspaceDir(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceOpenClawProfileDir(profileId, input), \"workspace\");\n}\n\nexport function deviceOpenClawProfileBootstrapPath(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceOpenClawProfileDir(profileId, input), \"bootstrap.json\");\n}\n\nexport function deviceSkillsStorePath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"store.json\");\n}\n\nexport function deviceSkillsCustomTargetsPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"custom-targets.json\");\n}\n\nexport function deviceSkillsInstallsPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"installs.json\");\n}\n\nexport function legacyRuntimeConfigPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(resolveWakeLoopRootDir(input), \"config.json\");\n}\n\nexport function normalizeAccountHostKey(value: unknown): string {\n return normalizePathSegment(value, FALLBACK_ACCOUNT_HOST_KEY);\n}\n\nexport function normalizeAccountUserKey(value: unknown): string {\n return normalizePathSegment(value, FALLBACK_ACCOUNT_USER_KEY);\n}\n\nexport function normalizeAccountKey(\n input: Partial<WakeLoopAccountKey>\n): WakeLoopAccountKey {\n return {\n hostKey: normalizeAccountHostKey(input.hostKey),\n userKey: normalizeAccountUserKey(input.userKey),\n };\n}\n\nexport function accountDir(account: WakeLoopAccountKey): string {\n const normalized = normalizeAccountKey(account);\n return join(accountsDir(), normalized.hostKey, normalized.userKey);\n}\n\nexport function accountProfilesDir(account: WakeLoopAccountKey): string {\n // TODO(v-next): optional `index/profiles.json` for write-through + read-through\n // refresh cache when profile listing becomes a local performance bottleneck.\n return join(accountDir(account), \"profiles\");\n}\n\nexport function accountProfileDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n // `local-meta.json` is the profile-local device envelope; workspace is one\n // section within it.\n return join(\n accountProfilesDir(account),\n normalizeWakeLoopProfileId(wakeLoopProfileId)\n );\n}\n\nexport function accountProfileViewPath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"view.json\");\n}\n\nexport function accountProfileLocalMetaPath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"local-meta.json\");\n}\n\nexport function accountProfileWorkspacePath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"workspace\");\n}\n\nexport function accountProfileSpaceCacheDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"space-cache\");\n}\n\nexport function legacyAccountProfileSpacesDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"spaces\");\n}\n\nexport function profileDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(wakeLoopRootDir(), \"profiles\", wakeLoopProfileId);\n}\n\nexport function runtimeDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"runtime\");\n}\n\nexport function runtimeLogsDir(): string {\n return join(runtimeDir(), \"logs\");\n}\n\nexport function sessionsDir(): string {\n return join(runtimeDir(), \"sessions\");\n}\n\nexport function systemDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"system\");\n}\n\nexport function skillsDir(): string {\n return join(wakeLoopRootDir(), \"skills\");\n}\n\nexport function profileIdentityPath(\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(profileDir(wakeLoopProfileId), \"profile.json\");\n}\n\nexport function spacesDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(profileDir(wakeLoopProfileId), \"spaces\");\n}\n\nexport function locksDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(runtimeDir(), \"locks\", wakeLoopProfileId);\n}\n\nexport function profileViewPath(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(profileDir(wakeLoopProfileId), \"view.json\");\n}\n\nfunction normalizePathSegment(value: unknown, fallback: string): string {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (!normalized) {\n return fallback;\n }\n\n const safe = normalized.replace(/[^a-z0-9._-]+/g, \"_\");\n if (!safe) {\n return fallback;\n }\n\n if (safe === \".\" || safe === \"..\") {\n return fallback;\n }\n\n return safe.slice(0, MAX_ACCOUNT_PATH_SEGMENT_LENGTH);\n}\n\nfunction resolveWakeLoopEnvPresetFromArgv(argv: string[]): WakeLoopEnvPreset {\n return (\n resolveKnownWakeLoopEnvPresetFromArgv(argv) ?? DEFAULT_WAKELOOP_ENV_PRESET\n );\n}\n\nexport function resolveKnownWakeLoopEnvPresetFromArgv(\n argv: string[]\n): WakeLoopEnvPreset | null {\n const entryName = resolveWakeLoopCliEntryNameFromArgv(argv);\n if (!entryName) {\n return null;\n }\n return WAKELOOP_ENV_PRESET_BY_ENTRY_NAME[entryName] ?? null;\n}\n\nexport function resolveWakeLoopCliEntryNameFromArgv(\n argv: string[]\n): WakeLoopCliEntryName | null {\n return resolveCliEntryName(argv[1]);\n}\n\nfunction resolveCliEntryName(\n value: string | undefined\n): WakeLoopCliEntryName | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n const parsed = parse(raw);\n const normalizedName = parsed.name.trim().toLowerCase();\n if (!normalizedName) {\n return null;\n }\n if (!isWakeLoopCliEntryName(normalizedName)) {\n return null;\n }\n return normalizedName;\n}\n\nfunction isWakeLoopCliEntryName(value: string): value is WakeLoopCliEntryName {\n return value in WAKELOOP_ENV_PRESET_BY_ENTRY_NAME;\n}\n\nfunction normalizeWakeLoopEnvPreset(\n value: string | undefined\n): WakeLoopEnvPreset | null {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (\n normalized === \"prod\" ||\n normalized === \"dev-local\" ||\n normalized === \"canary\"\n ) {\n return normalized;\n }\n return null;\n}\n\nfunction resolveHomeDirectory(input: WakeLoopPathResolutionInput): string {\n if (input.homeDir) {\n return input.homeDir;\n }\n const env = input.env ?? process.env;\n const fromEnv = String(env.HOME ?? \"\").trim();\n if (fromEnv) {\n return fromEnv;\n }\n return homedir();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paths-CI0MoSDY.js","names":[],"sources":["../src/config/paths.ts"],"sourcesContent":["import { homedir } from \"node:os\";\nimport { basename, dirname, join, parse } from \"node:path\";\n\nexport type WakeLoopProfileId = string;\nexport type WakeLoopAccountKey = {\n hostKey: string;\n userKey: string;\n};\nexport type WakeLoopEnvPreset = \"prod\" | \"dev-local\" | \"canary\";\ntype WakeLoopPathResolutionInput = {\n env?: NodeJS.ProcessEnv;\n argv?: string[];\n homeDir?: string;\n};\n\nexport type { WakeLoopPathResolutionInput };\n\nconst MAX_ACCOUNT_PATH_SEGMENT_LENGTH = 128;\nconst FALLBACK_ACCOUNT_HOST_KEY = \"unauthenticated\";\nconst FALLBACK_ACCOUNT_USER_KEY = \"local\";\nexport const WAKELOOP_HOME_ENV_KEY = \"WAKELOOP_HOME\";\nconst WAKELOOP_ENV_PRESET_ENV_KEY = \"WAKELOOP_ENV_PRESET\";\nconst DEFAULT_WAKELOOP_ENV_PRESET: WakeLoopEnvPreset = \"prod\";\nconst WAKELOOP_DEFAULT_HOME_DIR_BY_PRESET = {\n prod: \".wakeloop\",\n \"dev-local\": \".wakeloop-dev\",\n canary: \".wakeloop-canary\",\n} as const satisfies Record<WakeLoopEnvPreset, string>;\nconst WAKELOOP_ENV_PRESET_BY_ENTRY_NAME = {\n wakeloop: \"prod\",\n \"wakeloop-dev\": \"dev-local\",\n \"wakeloop-canary\": \"canary\",\n} as const satisfies Record<string, WakeLoopEnvPreset>;\nexport type WakeLoopCliEntryName =\n keyof typeof WAKELOOP_ENV_PRESET_BY_ENTRY_NAME;\n\nexport function normalizeWakeLoopProfileId(value: unknown): WakeLoopProfileId {\n const raw = String(value ?? \"\").trim();\n if (raw.length === 0) {\n throw new Error(\"wakeLoopProfileId is required\");\n }\n // Keep filenames stable and safe.\n const safe = raw.replace(/[^a-zA-Z0-9._-]+/g, \"_\").toLowerCase();\n if (!safe || safe === \".\" || safe === \"..\") {\n throw new Error(\"wakeLoopProfileId is invalid\");\n }\n if (safe.length > MAX_ACCOUNT_PATH_SEGMENT_LENGTH) {\n throw new Error(\"wakeLoopProfileId is too long\");\n }\n return safe;\n}\n\nexport function resolveWakeLoopEnvPreset(\n input: WakeLoopPathResolutionInput = {}\n): WakeLoopEnvPreset {\n const env = input.env ?? process.env;\n const fromEnv = normalizeWakeLoopEnvPreset(env[WAKELOOP_ENV_PRESET_ENV_KEY]);\n if (fromEnv) {\n return fromEnv;\n }\n return resolveWakeLoopEnvPresetFromArgv(input.argv ?? process.argv);\n}\n\nexport function resolveDefaultWakeLoopHomeDirname(\n preset: WakeLoopEnvPreset\n): string {\n return WAKELOOP_DEFAULT_HOME_DIR_BY_PRESET[preset];\n}\n\nexport function resolveWakeLoopRootDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n const env = input.env ?? process.env;\n const fromEnv = String(env[WAKELOOP_HOME_ENV_KEY] ?? \"\").trim();\n if (fromEnv) {\n return fromEnv;\n }\n const preset = resolveWakeLoopEnvPreset(input);\n return join(\n resolveHomeDirectory(input),\n resolveDefaultWakeLoopHomeDirname(preset)\n );\n}\n\nexport function wakeLoopRootDir(): string {\n return resolveWakeLoopRootDir();\n}\n\nexport function wakeLoopBackupsDir(): string {\n const root = wakeLoopRootDir();\n return join(dirname(root), `${basename(root)}-backups`);\n}\n\nexport function accountsDir(): string {\n return join(wakeLoopRootDir(), \"accounts\");\n}\n\nexport function deviceDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"device\");\n}\n\nexport function deviceDaemonDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"daemon\");\n}\n\nexport function deviceSkillsDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"skills\");\n}\n\nexport function devicePreferencesPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"preferences.json\");\n}\n\nexport function deviceAgentRuntimePath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"agent-runtime.json\");\n}\n\nexport function deviceProvidersDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceDir(input), \"providers\");\n}\n\nexport function deviceProviderDir(\n providerId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(\n deviceProvidersDir(input),\n normalizePathSegment(providerId, \"unknown\")\n );\n}\n\nexport function deviceProviderProfilesDir(\n providerId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceProviderDir(providerId, input), \"profiles\");\n}\n\nexport function deviceProviderProfileDir(\n providerId: string,\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(\n deviceProviderProfilesDir(providerId, input),\n normalizePathSegment(profileId, \"unknown\")\n );\n}\n\nexport function deviceOpenClawProfilesDir(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return deviceProviderProfilesDir(\"openclaw\", input);\n}\n\nexport function deviceOpenClawProfileDir(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return deviceProviderProfileDir(\"openclaw\", profileId, input);\n}\n\nexport function deviceOpenClawProfileWorkspaceDir(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceOpenClawProfileDir(profileId, input), \"workspace\");\n}\n\nexport function deviceOpenClawProfileBootstrapPath(\n profileId: string,\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceOpenClawProfileDir(profileId, input), \"bootstrap.json\");\n}\n\nexport function deviceSkillsStorePath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"store.json\");\n}\n\nexport function deviceSkillsCustomTargetsPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"custom-targets.json\");\n}\n\nexport function deviceSkillsInstallsPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(deviceSkillsDir(input), \"installs.json\");\n}\n\nexport function legacyRuntimeConfigPath(\n input: WakeLoopPathResolutionInput = {}\n): string {\n return join(resolveWakeLoopRootDir(input), \"config.json\");\n}\n\nexport function normalizeAccountHostKey(value: unknown): string {\n return normalizePathSegment(value, FALLBACK_ACCOUNT_HOST_KEY);\n}\n\nexport function normalizeAccountUserKey(value: unknown): string {\n return normalizePathSegment(value, FALLBACK_ACCOUNT_USER_KEY);\n}\n\nexport function normalizeAccountKey(\n input: Partial<WakeLoopAccountKey>\n): WakeLoopAccountKey {\n return {\n hostKey: normalizeAccountHostKey(input.hostKey),\n userKey: normalizeAccountUserKey(input.userKey),\n };\n}\n\nexport function accountDir(account: WakeLoopAccountKey): string {\n const normalized = normalizeAccountKey(account);\n return join(accountsDir(), normalized.hostKey, normalized.userKey);\n}\n\nexport function accountProfilesDir(account: WakeLoopAccountKey): string {\n // TODO(v-next): optional `index/profiles.json` for write-through + read-through\n // refresh cache when profile listing becomes a local performance bottleneck.\n return join(accountDir(account), \"profiles\");\n}\n\nexport function accountProfileDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n // `local-meta.json` is the profile-local device envelope; workspace is one\n // section within it.\n return join(\n accountProfilesDir(account),\n normalizeWakeLoopProfileId(wakeLoopProfileId)\n );\n}\n\nexport function accountProfileViewPath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"view.json\");\n}\n\nexport function accountProfileLocalMetaPath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"local-meta.json\");\n}\n\nexport function accountProfileWorkspacePath(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"workspace\");\n}\n\nexport function accountProfileSpaceCacheDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"space-cache\");\n}\n\nexport function legacyAccountProfileSpacesDir(\n account: WakeLoopAccountKey,\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(accountProfileDir(account, wakeLoopProfileId), \"spaces\");\n}\n\nexport function profileDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(wakeLoopRootDir(), \"profiles\", wakeLoopProfileId);\n}\n\nexport function runtimeDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"runtime\");\n}\n\nexport function runtimeLogsDir(): string {\n return join(runtimeDir(), \"logs\");\n}\n\nexport function sessionsDir(): string {\n return join(runtimeDir(), \"sessions\");\n}\n\nexport function systemDir(input: WakeLoopPathResolutionInput = {}): string {\n return join(resolveWakeLoopRootDir(input), \"system\");\n}\n\nexport function skillsDir(): string {\n return join(wakeLoopRootDir(), \"skills\");\n}\n\nexport function profileIdentityPath(\n wakeLoopProfileId: WakeLoopProfileId\n): string {\n return join(profileDir(wakeLoopProfileId), \"profile.json\");\n}\n\nexport function spacesDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(profileDir(wakeLoopProfileId), \"spaces\");\n}\n\nexport function locksDir(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(runtimeDir(), \"locks\", wakeLoopProfileId);\n}\n\nexport function profileViewPath(wakeLoopProfileId: WakeLoopProfileId): string {\n return join(profileDir(wakeLoopProfileId), \"view.json\");\n}\n\nfunction normalizePathSegment(value: unknown, fallback: string): string {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (!normalized) {\n return fallback;\n }\n\n const safe = normalized.replace(/[^a-z0-9._-]+/g, \"_\");\n if (!safe) {\n return fallback;\n }\n\n if (safe === \".\" || safe === \"..\") {\n return fallback;\n }\n\n return safe.slice(0, MAX_ACCOUNT_PATH_SEGMENT_LENGTH);\n}\n\nfunction resolveWakeLoopEnvPresetFromArgv(argv: string[]): WakeLoopEnvPreset {\n return (\n resolveKnownWakeLoopEnvPresetFromArgv(argv) ?? DEFAULT_WAKELOOP_ENV_PRESET\n );\n}\n\nexport function resolveKnownWakeLoopEnvPresetFromArgv(\n argv: string[]\n): WakeLoopEnvPreset | null {\n const entryName = resolveWakeLoopCliEntryNameFromArgv(argv);\n if (!entryName) {\n return null;\n }\n return WAKELOOP_ENV_PRESET_BY_ENTRY_NAME[entryName] ?? null;\n}\n\nexport function resolveWakeLoopCliEntryNameFromArgv(\n argv: string[]\n): WakeLoopCliEntryName | null {\n return resolveCliEntryName(argv[1]);\n}\n\nfunction resolveCliEntryName(\n value: string | undefined\n): WakeLoopCliEntryName | null {\n const raw = String(value ?? \"\").trim();\n if (!raw) {\n return null;\n }\n const parsed = parse(raw);\n const normalizedName = parsed.name.trim().toLowerCase();\n if (!normalizedName) {\n return null;\n }\n if (!isWakeLoopCliEntryName(normalizedName)) {\n return null;\n }\n return normalizedName;\n}\n\nfunction isWakeLoopCliEntryName(value: string): value is WakeLoopCliEntryName {\n return value in WAKELOOP_ENV_PRESET_BY_ENTRY_NAME;\n}\n\nfunction normalizeWakeLoopEnvPreset(\n value: string | undefined\n): WakeLoopEnvPreset | null {\n const normalized = String(value ?? \"\")\n .trim()\n .toLowerCase();\n if (\n normalized === \"prod\" ||\n normalized === \"dev-local\" ||\n normalized === \"canary\"\n ) {\n return normalized;\n }\n return null;\n}\n\nfunction resolveHomeDirectory(input: WakeLoopPathResolutionInput): string {\n if (input.homeDir) {\n return input.homeDir;\n }\n const env = input.env ?? process.env;\n const fromEnv = String(env.HOME ?? \"\").trim();\n if (fromEnv) {\n return fromEnv;\n }\n return homedir();\n}\n"],"mappings":"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"}
|
|
@@ -99,4 +99,4 @@ function toSpaceWsUrl(baseUrl, space) {
|
|
|
99
99
|
|
|
100
100
|
//#endregion
|
|
101
101
|
export { toSpaceWsUrl as _, toSpaceCursorUrl as a, toSpaceDispatchTraceUrl as c, toSpaceMetaUrl as d, toSpacePasswordUrl as f, toSpaceUpdatesUrl as g, toSpaceSignalsUrl as h, toSpaceCreateUrl as i, toSpaceLeaveUrl as l, toSpaceResultUrl as m, toDaemonRouteObservationUrl as n, toSpaceDeleteUrl as o, toSpaceRemoveMembersUrl as p, toSpaceContractUrl as r, toSpaceDispatchLookupUrl as s, normalizeBaseUrl as t, toSpaceMembersUrl as u };
|
|
102
|
-
//# sourceMappingURL=urls-
|
|
102
|
+
//# sourceMappingURL=urls-RVvjm5ga.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urls-
|
|
1
|
+
{"version":3,"file":"urls-RVvjm5ga.js","names":[],"sources":["../src/protocol/urls.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 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\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"],"mappings":";;;AAAA,MAAM,yBAAyB;AAC/B,MAAM,kBAAkB;AAExB,SAAgB,iBAAiB,SAAyB;CACxD,MAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,KAAI,CAAC,gBAAgB,KAAK,IAAI,SAAS,CACrC,OAAM,IAAI,MAAM,+CAA+C;AAEjE,KAAI,IAAI,UAAU,IAAI,KACpB,OAAM,IAAI,MAAM,iDAAiD;AAEnE,KAAI,WAAW;AACf,KAAI,SAAS;AACb,KAAI,OAAO;AACX,QAAO,IAAI,UAAU,CAAC,QAAQ,wBAAwB,GAAG;;AAG3D,SAAgB,kBAAkB,SAAiB,OAAuB;CACxE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,iBAAiB,SAAyB;CACxD,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW;AACf,QAAO,IAAI,UAAU;;AAGvB,SAAgB,iBAAiB,SAAiB,OAAuB;CACvE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM;AACtD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,eAAe,SAAiB,OAAuB;CACrE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,mBAAmB,SAAiB,OAAuB;CACzE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,kBAAkB,SAAiB,OAAuB;CACxE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AASvB,SAAgB,iBAAiB,SAAiB,OAAuB;CACvE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,kBAAkB,SAAiB,OAAuB;CACxE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,wBACd,SACA,OACQ;CACR,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,gBAAgB,SAAiB,OAAuB;CACtE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,wBACd,SACA,OACA,YACQ;CACR,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC,cAAc,mBAAmB,WAAW,CAAC;AACpG,QAAO,IAAI,UAAU;;AAGvB,SAAgB,yBACd,SACA,OACQ;CACR,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,4BACd,SACA,WACQ;CACR,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,qBAAqB,mBAAmB,UAAU;AACjE,QAAO,IAAI,UAAU;;AAGvB,SAAgB,mBAAmB,SAAiB,OAAuB;CACzE,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC;AACvD,QAAO,IAAI,UAAU;;AAGvB,SAAgB,iBACd,SACA,OACA,WACQ;CACR,MAAM,MAAM,IAAI,IAAI,iBAAiB,QAAQ,CAAC;AAC9C,KAAI,WAAW,cAAc,mBAAmB,MAAM,CAAC,WAAW,mBAAmB,UAAU;AAC/F,QAAO,IAAI,UAAU;;AAGvB,SAAgB,aAAa,SAAiB,OAAuB;CACnE,MAAM,OAAO,IAAI,IAAI,iBAAiB,QAAQ,CAAC;CAC/C,IAAI;AACJ,KAAI,KAAK,aAAa,QACpB,YAAW;UACF,KAAK,aAAa,SAC3B,YAAW;UACF,KAAK,aAAa,SAAS,KAAK,aAAa,OACtD,YAAW,KAAK;KAEhB,OAAM,IAAI,MACR,mDAAmD,KAAK,WACzD;AAEH,QAAO,GAAG,SAAS,IAAI,KAAK,KAAK,aAAa,mBAAmB,MAAM,CAAC"}
|
package/dist/wakeloop-dev.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { t as DEV_LOCAL_GATEWAY_BASE_URL } from "./base-url-
|
|
4
|
-
import "./dist-
|
|
3
|
+
import { t as DEV_LOCAL_GATEWAY_BASE_URL } from "./base-url-Bp-avdIi.js";
|
|
4
|
+
import "./dist-gbpVUIxv.js";
|
|
5
5
|
|
|
6
6
|
//#region src/wakeloop-dev.ts
|
|
7
7
|
const LOCAL_GATEWAY_URL = DEV_LOCAL_GATEWAY_BASE_URL;
|