@geminixiang/mikan 1.0.0-beta.84 → 1.0.0-beta.85
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/CHANGELOG.md +21 -0
- package/README.md +2 -2
- package/dist/adapters/slack/bot.d.ts +1 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +8 -2
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +2 -2
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/cli/boot.d.ts.map +1 -1
- package/dist/cli/boot.js +4 -6
- package/dist/cli/boot.js.map +1 -1
- package/dist/cli/migrate.d.ts +3 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +75 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/office.d.ts.map +1 -1
- package/dist/cli/office.js +8 -129
- package/dist/cli/office.js.map +1 -1
- package/dist/cli/onboard.d.ts.map +1 -1
- package/dist/cli/onboard.js +3 -0
- package/dist/cli/onboard.js.map +1 -1
- package/dist/cli/types.d.ts +2 -3
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/types.js.map +1 -1
- package/dist/events/index.d.ts +2 -13
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -58
- package/dist/events/index.js.map +1 -1
- package/dist/harness/budget-stop.d.ts +3 -0
- package/dist/harness/budget-stop.d.ts.map +1 -0
- package/dist/harness/budget-stop.js +36 -0
- package/dist/harness/budget-stop.js.map +1 -0
- package/dist/harness/execution-resolver.d.ts.map +1 -1
- package/dist/harness/execution-resolver.js +5 -9
- package/dist/harness/execution-resolver.js.map +1 -1
- package/dist/harness/open-connector.d.ts +0 -9
- package/dist/harness/open-connector.d.ts.map +1 -1
- package/dist/harness/open-connector.js +1 -62
- package/dist/harness/open-connector.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +31 -2
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.js +1 -1
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/run-events.d.ts.map +1 -1
- package/dist/harness/run-events.js +6 -1
- package/dist/harness/run-events.js.map +1 -1
- package/dist/harness/types.d.ts +16 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +8 -50
- package/dist/main.js.map +1 -1
- package/dist/migrations/actor-vaults.d.ts +3 -0
- package/dist/migrations/actor-vaults.d.ts.map +1 -0
- package/dist/migrations/actor-vaults.js +43 -0
- package/dist/migrations/actor-vaults.js.map +1 -0
- package/dist/migrations/conversation-settings.d.ts +3 -0
- package/dist/migrations/conversation-settings.d.ts.map +1 -0
- package/dist/migrations/conversation-settings.js +31 -0
- package/dist/migrations/conversation-settings.js.map +1 -0
- package/dist/migrations/index.d.ts +14 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +97 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/models-json.d.ts +3 -0
- package/dist/migrations/models-json.d.ts.map +1 -0
- package/dist/migrations/models-json.js +18 -0
- package/dist/migrations/models-json.js.map +1 -0
- package/dist/migrations/office-layout.d.ts +4 -0
- package/dist/migrations/office-layout.d.ts.map +1 -0
- package/dist/migrations/office-layout.js +94 -0
- package/dist/migrations/office-layout.js.map +1 -0
- package/dist/migrations/sandbox-containers.d.ts +3 -0
- package/dist/migrations/sandbox-containers.d.ts.map +1 -0
- package/dist/migrations/sandbox-containers.js +36 -0
- package/dist/migrations/sandbox-containers.js.map +1 -0
- package/dist/{sessions/migrate-common.d.ts → migrations/session-files.d.ts} +1 -2
- package/dist/migrations/session-files.d.ts.map +1 -0
- package/dist/{sessions/migrate-common.js → migrations/session-files.js} +2 -2
- package/dist/migrations/session-files.js.map +1 -0
- package/dist/{sessions/migrate-v3.d.ts → migrations/sessions-v3.d.ts} +4 -3
- package/dist/migrations/sessions-v3.d.ts.map +1 -0
- package/dist/{sessions/migrate-v3.js → migrations/sessions-v3.js} +14 -4
- package/dist/migrations/sessions-v3.js.map +1 -0
- package/dist/migrations/types.d.ts +30 -0
- package/dist/migrations/types.d.ts.map +1 -0
- package/dist/migrations/types.js +2 -0
- package/dist/migrations/types.js.map +1 -0
- package/dist/migrations/workspace-events.d.ts +3 -0
- package/dist/migrations/workspace-events.d.ts.map +1 -0
- package/dist/migrations/workspace-events.js +43 -0
- package/dist/migrations/workspace-events.js.map +1 -0
- package/dist/office/index.d.ts +2 -23
- package/dist/office/index.d.ts.map +1 -1
- package/dist/office/index.js +12 -574
- package/dist/office/index.js.map +1 -1
- package/dist/office/types.d.ts +0 -10
- package/dist/office/types.d.ts.map +1 -1
- package/dist/office/types.js.map +1 -1
- package/dist/sandbox/identity.d.ts +2 -3
- package/dist/sandbox/identity.d.ts.map +1 -1
- package/dist/sandbox/identity.js +6 -13
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/sandbox/layout.d.ts +0 -2
- package/dist/sandbox/layout.d.ts.map +1 -1
- package/dist/sandbox/layout.js +2 -2
- package/dist/sandbox/layout.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +3 -37
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +13 -452
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +1 -8
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/types.d.ts +0 -10
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings/index.d.ts +0 -48
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +6 -37
- package/dist/settings/index.js.map +1 -1
- package/dist/types.d.ts +0 -28
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.d.ts +0 -7
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +1 -36
- package/dist/vault/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cli/sandbox.d.ts +0 -3
- package/dist/cli/sandbox.d.ts.map +0 -1
- package/dist/cli/sandbox.js +0 -80
- package/dist/cli/sandbox.js.map +0 -1
- package/dist/cli/sessions.d.ts +0 -2
- package/dist/cli/sessions.d.ts.map +0 -1
- package/dist/cli/sessions.js +0 -78
- package/dist/cli/sessions.js.map +0 -1
- package/dist/sessions/migrate-common.d.ts.map +0 -1
- package/dist/sessions/migrate-common.js.map +0 -1
- package/dist/sessions/migrate-pi-084.d.ts +0 -7
- package/dist/sessions/migrate-pi-084.d.ts.map +0 -1
- package/dist/sessions/migrate-pi-084.js +0 -293
- package/dist/sessions/migrate-pi-084.js.map +0 -1
- package/dist/sessions/migrate-v3.d.ts.map +0 -1
- package/dist/sessions/migrate-v3.js.map +0 -1
- package/dist/settings/migrate.d.ts +0 -16
- package/dist/settings/migrate.d.ts.map +0 -1
- package/dist/settings/migrate.js +0 -70
- package/dist/settings/migrate.js.map +0 -1
package/dist/vault/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Dirent } from \"node:fs\";\nimport {\n chmodSync,\n copyFileSync,\n existsSync,\n mkdirSync,\n readdirSync,\n renameSync,\n rmSync,\n} from \"node:fs\";\nimport { dirname, isAbsolute, join, normalize, sep } from \"node:path\";\nimport { officeKey } from \"../office/index.js\";\nimport { legacyConversationCredentialKey } from \"../sandbox/identity.js\";\nimport { guestHomePath } from \"../sandbox/layout.js\";\nimport type { OfficeAddress } from \"../types.js\";\nimport { atomicWritePrivateFile, readTextFileIfExists } from \"../file-guards.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nimport type { SandboxConfig, SandboxCredentialCapabilities } from \"../sandbox/types.js\";\nimport type { PlatformTrustModel } from \"../types.js\";\n\nconst PRIVATE_DIR_MODE = 0o700;\nconst SHARED_VAULT_DIR = \"shared\";\nconst LEGACY_MOUNT_TARGETS_FILE = \".mount-targets.json\";\nconst MOUNT_TARGETS_DIR = \"vault-mount-targets\";\nconst RESERVED_VAULT_DIRS = new Set([SHARED_VAULT_DIR, \"extensions\"]);\n\nexport function normalizeSharedVaultName(name: string): string | undefined {\n const trimmed = name.trim();\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(trimmed)) return undefined;\n return trimmed;\n}\n\nexport function sharedVaultKey(name: string): string | undefined {\n const normalized = normalizeSharedVaultName(name);\n return normalized ? `${SHARED_VAULT_DIR}/${normalized}` : undefined;\n}\n\nimport type { ResolvedVault, ResolvedVaultMount, VaultManager } from \"./types.js\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const line of content.split(/\\r\\n|\\r|\\n/)) {\n const entry = parseEnvLine(line);\n if (entry) env[entry[0]] = entry[1];\n }\n return env;\n}\n\nfunction parseEnvLine(line: string): [string, string] | undefined {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) return undefined;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) return undefined;\n\n const key = trimmed.slice(0, eqIndex).trim();\n if (!key) return undefined;\n return [key, unquoteEnvValue(trimmed.slice(eqIndex + 1))];\n}\n\nfunction unquoteEnvValue(value: string): string {\n const quote = value[0];\n if ((quote === '\"' || quote === \"'\") && value.endsWith(quote)) return value.slice(1, -1);\n return value;\n}\n\nexport class FileVaultManager implements VaultManager {\n private readonly vaultsDir: string;\n private readonly mountTargetsDir: string;\n\n constructor(stateDir: string) {\n this.vaultsDir = join(stateDir, \"vaults\");\n this.mountTargetsDir = join(stateDir, MOUNT_TARGETS_DIR);\n }\n\n isEnabled(): boolean {\n return existsSync(this.vaultsDir);\n }\n\n hasEntry(key: string): boolean {\n if (!isSafeVaultKey(key)) return false;\n return existsSync(join(this.vaultsDir, key));\n }\n\n listSharedVaults(): string[] {\n const sharedDir = join(this.vaultsDir, SHARED_VAULT_DIR);\n if (!existsSync(sharedDir)) return [];\n return readdirSync(sharedDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && normalizeSharedVaultName(entry.name) === entry.name)\n .map((entry) => entry.name)\n .toSorted((left, right) => left.localeCompare(right));\n }\n\n deleteSharedVault(name: string): boolean {\n const key = sharedVaultKey(name);\n if (!key) throw new Error(`vault: invalid shared login name: ${name}`);\n const dir = join(this.vaultsDir, key);\n const existed = existsSync(dir);\n rmSync(dir, { recursive: true, force: true });\n rmSync(this.mountTargetsPath(key), { force: true });\n return existed;\n }\n\n copySharedVaultTo(\n name: string,\n targetKey: string,\n ): { filesCopied: number; envKeysCopied: number } {\n if (!isSafeVaultKey(targetKey)) throw new Error(`vault: invalid vault key: ${targetKey}`);\n const sourceKey = sharedVaultKey(name);\n if (!sourceKey) throw new Error(`vault: invalid shared login name: ${name}`);\n const sourceDir = join(this.vaultsDir, sourceKey);\n if (!existsSync(sourceDir)) throw new Error(`vault: shared login \"${name}\" does not exist`);\n\n const targetDir = join(this.vaultsDir, targetKey);\n assertNoLegacyMountTargetsCollision(sourceDir);\n assertNoLegacyMountTargetsCollision(targetDir);\n const sourceTargets = readMountTargets(this.mountTargetsPath(sourceKey));\n const targetTargets = readMountTargets(this.mountTargetsPath(targetKey));\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(targetDir);\n const result = copyVaultDir(sourceDir, targetDir);\n writeMountTargets(this.mountTargetsPath(targetKey), {\n ...targetTargets,\n ...sourceTargets,\n });\n return result;\n }\n\n resolve(userId: string): ResolvedVault | undefined {\n if (!isSafeVaultKey(userId)) return undefined;\n const dir = join(this.vaultsDir, userId);\n if (!existsSync(dir)) return undefined;\n return this.buildResolved(userId);\n }\n\n list(): ResolvedVault[] {\n if (!existsSync(this.vaultsDir)) return [];\n const keys = new Set<string>();\n for (const entry of readdirSync(this.vaultsDir, { withFileTypes: true })) {\n if (\n entry.isDirectory() &&\n !RESERVED_VAULT_DIRS.has(entry.name) &&\n isSafeVaultKey(entry.name)\n ) {\n keys.add(entry.name);\n }\n }\n return Array.from(keys, (key) => this.buildResolved(key));\n }\n\n upsertEnv(key: string, env: Record<string, string>): void {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const dir = join(this.vaultsDir, key);\n const envPath = join(dir, \"env\");\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(dir);\n const existingContent = readTextFileIfExists(envPath);\n const existing = existingContent ? parseEnvFile(existingContent) : {};\n const merged = { ...existing, ...env };\n const content =\n Object.entries(merged)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([envKey, value]) => `${envKey}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(envPath, content);\n }\n\n deleteEnvKey(key: string, envKey: string): boolean {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const envPath = join(this.vaultsDir, key, \"env\");\n const existingContent = readTextFileIfExists(envPath);\n if (existingContent === undefined) return false;\n const existing = parseEnvFile(existingContent);\n if (!(envKey in existing)) return false;\n delete existing[envKey];\n const content =\n Object.entries(existing)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => `${name}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(envPath, content);\n return true;\n }\n\n upsertFile(key: string, relativePath: string, content: string, targetPath?: string): void {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const normalizedPath = normalizeVaultRelativePath(relativePath);\n const normalizedTarget = normalizeVaultTargetPath(targetPath);\n if (\n !normalizedPath ||\n normalizedPath === LEGACY_MOUNT_TARGETS_FILE ||\n (targetPath !== undefined && !normalizedTarget)\n ) {\n throw new Error(`vault: invalid relative secret file path for \"${key}\": ${relativePath}`);\n }\n\n const dir = join(this.vaultsDir, key);\n const filePath = join(dir, normalizedPath);\n assertNoLegacyMountTargetsCollision(dir);\n\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(dir);\n const parentDir = dirname(filePath);\n if (parentDir !== dir) ensurePrivateDir(parentDir);\n atomicWritePrivateFile(filePath, content);\n updateMountTarget(this.mountTargetsPath(key), normalizedPath, normalizedTarget);\n }\n\n private buildResolved(key: string): ResolvedVault {\n const dir = join(this.vaultsDir, key);\n assertNoLegacyMountTargetsCollision(dir);\n const mounts = resolveMountsFromDir(dir, readMountTargets(this.mountTargetsPath(key)));\n\n const envContent = readTextFileIfExists(join(dir, \"env\"));\n const env = envContent === undefined ? {} : parseEnvFile(envContent);\n\n return {\n userId: key,\n displayName: key,\n dir,\n mounts,\n env,\n };\n }\n\n private mountTargetsPath(key: string): string {\n return join(this.mountTargetsDir, `${key}.json`);\n }\n}\n\nfunction resolveMountsFromDir(\n dir: string,\n explicitTargets: Record<string, string>,\n): ResolvedVaultMount[] {\n if (!existsSync(dir)) return [];\n\n const mounts: ResolvedVaultMount[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"env\") continue;\n const source = join(dir, entry.name);\n const inferredTarget = inferredVaultTargetPath(entry.name);\n if (!inferredTarget) continue;\n\n const explicitTarget = Object.hasOwn(explicitTargets, entry.name)\n ? explicitTargets[entry.name]\n : undefined;\n if (explicitTarget) {\n mounts.push({ source, target: explicitTarget });\n continue;\n }\n\n const nestedPrefix = `${entry.name}/`;\n const hasExplicitDescendant = Object.keys(explicitTargets).some((relativePath) =>\n relativePath.startsWith(nestedPrefix),\n );\n if (!entry.isDirectory() || !hasExplicitDescendant) {\n mounts.push({ source, target: inferredTarget });\n continue;\n }\n mounts.push(...resolveNestedMounts(dir, entry.name, inferredTarget, explicitTargets));\n }\n return mounts;\n}\n\nfunction resolveNestedMounts(\n rootDir: string,\n relativeDir: string,\n targetDir: string,\n explicitTargets: Record<string, string>,\n): ResolvedVaultMount[] {\n const mounts: ResolvedVaultMount[] = [];\n for (const entry of readdirSync(join(rootDir, relativeDir), { withFileTypes: true })) {\n const relativePath = `${relativeDir}/${entry.name}`;\n const source = join(rootDir, relativePath);\n const inferredTarget = `${targetDir}/${entry.name}`;\n const explicitTarget = Object.hasOwn(explicitTargets, relativePath)\n ? explicitTargets[relativePath]\n : undefined;\n if (explicitTarget) {\n mounts.push({ source, target: explicitTarget });\n continue;\n }\n\n const nestedPrefix = `${relativePath}/`;\n const hasExplicitDescendant = Object.keys(explicitTargets).some((candidate) =>\n candidate.startsWith(nestedPrefix),\n );\n if (!entry.isDirectory() || !hasExplicitDescendant) {\n mounts.push({ source, target: inferredTarget });\n continue;\n }\n mounts.push(...resolveNestedMounts(rootDir, relativePath, inferredTarget, explicitTargets));\n }\n return mounts;\n}\n\nfunction assertNoLegacyMountTargetsCollision(dir: string): void {\n const path = join(dir, LEGACY_MOUNT_TARGETS_FILE);\n if (existsSync(path)) {\n throw new Error(`vault: reserved mount metadata filename collision: ${path}`);\n }\n}\n\nfunction readMountTargets(path: string): Record<string, string> {\n const raw = readTextFileIfExists(path);\n if (raw === undefined) return Object.create(null) as Record<string, string>;\n\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (error) {\n throw new Error(`vault: invalid mount target metadata: ${path}`, { cause: error });\n }\n if (!isRecord(value)) throw new Error(`vault: invalid mount target metadata: ${path}`);\n\n const targets = Object.create(null) as Record<string, string>;\n for (const [relativePath, targetPath] of Object.entries(value)) {\n const normalizedPath = normalizeVaultRelativePath(relativePath);\n const normalizedTarget =\n typeof targetPath === \"string\" ? normalizeVaultTargetPath(targetPath) : undefined;\n if (normalizedPath !== relativePath || !normalizedTarget || normalizedTarget !== targetPath) {\n throw new Error(`vault: invalid mount target metadata: ${path}`);\n }\n targets[relativePath] = targetPath;\n }\n return targets;\n}\n\nfunction updateMountTarget(path: string, relativePath: string, targetPath?: string): void {\n const targets = readMountTargets(path);\n if (targetPath === undefined) delete targets[relativePath];\n else targets[relativePath] = targetPath;\n writeMountTargets(path, targets);\n}\n\nfunction writeMountTargets(path: string, targets: Record<string, string>): void {\n if (Object.keys(targets).length === 0) {\n rmSync(path, { force: true });\n return;\n }\n ensurePrivateDir(dirname(path));\n atomicWritePrivateFile(path, `${JSON.stringify(targets, null, 2)}\\n`);\n}\n\nfunction ensurePrivateDir(path: string): void {\n mkdirSync(path, { recursive: true, mode: PRIVATE_DIR_MODE });\n chmodSync(path, PRIVATE_DIR_MODE);\n}\n\ninterface VaultCopyCounts {\n filesCopied: number;\n envKeysCopied: number;\n}\n\nfunction copyVaultDir(sourceDir: string, targetDir: string): VaultCopyCounts {\n const total: VaultCopyCounts = { filesCopied: 0, envKeysCopied: 0 };\n for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {\n const counts = copyVaultEntry(sourceDir, targetDir, entry);\n total.filesCopied += counts.filesCopied;\n total.envKeysCopied += counts.envKeysCopied;\n }\n return total;\n}\n\nfunction copyVaultEntry(sourceDir: string, targetDir: string, entry: Dirent): VaultCopyCounts {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.name === \"env\" && entry.isFile()) {\n return { filesCopied: 0, envKeysCopied: mergeVaultEnvFile(sourcePath, targetPath) };\n }\n if (entry.isDirectory()) {\n ensurePrivateDir(targetPath);\n return copyVaultDir(sourcePath, targetPath);\n }\n if (!entry.isFile()) return { filesCopied: 0, envKeysCopied: 0 };\n\n copyFileSync(sourcePath, targetPath);\n chmodSync(targetPath, 0o600);\n return { filesCopied: 1, envKeysCopied: 0 };\n}\n\nfunction mergeVaultEnvFile(sourcePath: string, targetPath: string): number {\n const sourceEnv = parseEnvFile(readTextFileIfExists(sourcePath) ?? \"\");\n const targetEnv = parseEnvFile(readTextFileIfExists(targetPath) ?? \"\");\n const merged = { ...targetEnv, ...sourceEnv };\n const content =\n Object.entries(merged)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([envKey, value]) => `${envKey}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(targetPath, content);\n return Object.keys(sourceEnv).length;\n}\n\nfunction isSafeVaultKey(key: unknown): key is string {\n if (typeof key !== \"string\" || !key || isAbsolute(key)) return false;\n if (/^[A-Za-z]:[\\\\/]/.test(key)) return false;\n\n return key.split(/[\\\\/]/).every((segment) => {\n return (\n segment !== \"\" && segment !== \".\" && segment !== \"..\" && !hasUnsafeControlCharacter(segment)\n );\n });\n}\n\nfunction hasUnsafeControlCharacter(value: string): boolean {\n return Array.from(value).some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return (code >= 0 && code <= 31) || (code >= 127 && code <= 159);\n });\n}\n\nfunction normalizeVaultRelativePath(relativePath: string): string | undefined {\n const trimmed = relativePath.trim();\n if (!trimmed || isAbsolute(trimmed)) return undefined;\n\n const normalized = normalize(trimmed).split(sep).join(\"/\");\n if (!normalized || normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"../\")) {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeVaultTargetPath(targetPath?: string): string | undefined {\n if (targetPath === undefined) return undefined;\n\n const trimmed = targetPath.trim();\n if (!trimmed || !trimmed.startsWith(\"/\")) return undefined;\n\n const normalized = normalize(trimmed).split(sep).join(\"/\");\n return normalized.startsWith(\"/\") ? normalized : undefined;\n}\n\nexport const GOOGLE_VAULT_CREDENTIAL_FILES = Object.freeze({\n workspaceCli: Object.freeze({\n relativePath: \"gws.json\",\n targetPath: guestHomePath(\".config/gws/credentials.json\"),\n }),\n cloudSdk: Object.freeze({\n relativePath: \"gcloud-adc.json\",\n targetPath: guestHomePath(\".config/gcloud/application_default_credentials.json\"),\n }),\n});\n\nexport function defaultVaultTargetPath(relativePath: string): string {\n const normalized = normalizeVaultRelativePath(relativePath) ?? relativePath.replace(/^\\/+/, \"\");\n return guestHomePath(normalized);\n}\n\nfunction inferredVaultTargetPath(relativePath: string): string | undefined {\n const normalized = normalizeVaultRelativePath(relativePath);\n if (!normalized) return undefined;\n\n for (const file of Object.values(GOOGLE_VAULT_CREDENTIAL_FILES)) {\n if (normalized === file.relativePath) return file.targetPath;\n }\n if (normalized === \".ssh\" || normalized.startsWith(\".ssh/\")) {\n return guestHomePath(\".ssh\");\n }\n if (normalized === \".kube\" || normalized.startsWith(\".kube/\")) {\n return guestHomePath(\".kube\");\n }\n if (normalized === \".config/gh\" || normalized.startsWith(\".config/gh/\")) {\n return guestHomePath(\".config/gh\");\n }\n\n return defaultVaultTargetPath(normalized);\n}\n\nexport function migrateConversationVaultKeys(options: {\n stateDir: string;\n offices: readonly OfficeAddress[];\n}): { migrated: string[]; conflicts: string[] } {\n const vaultsDir = join(options.stateDir, \"vaults\");\n const migrated: string[] = [];\n const conflicts: string[] = [];\n if (!existsSync(vaultsDir)) return { migrated, conflicts };\n\n const officesByConversationId = new Map<string, OfficeAddress[]>();\n for (const office of options.offices) {\n const offices = officesByConversationId.get(office.conversationId) ?? [];\n offices.push(office);\n officesByConversationId.set(office.conversationId, offices);\n }\n for (const [conversationId, offices] of officesByConversationId) {\n const legacyDir = join(vaultsDir, legacyConversationCredentialKey(conversationId));\n if (!existsSync(legacyDir)) continue;\n if (offices.length !== 1) {\n conflicts.push(conversationId);\n continue;\n }\n\n const office = offices[0];\n if (!office) throw new Error(`vault: missing office owner for ${conversationId}`);\n const targetDir = join(vaultsDir, officeKey(office));\n if (existsSync(targetDir)) {\n conflicts.push(conversationId);\n continue;\n }\n renameSync(legacyDir, targetDir);\n migrated.push(conversationId);\n }\n return { migrated, conflicts };\n}\n\nexport function allowsAmbientDefaultSharedVault(options: {\n trustModel?: PlatformTrustModel;\n sandboxType: SandboxConfig[\"type\"];\n}): boolean {\n const trustModel = options.trustModel ?? \"membership\";\n if (trustModel === \"open-trigger\") return false;\n return options.sandboxType === \"image\" || options.sandboxType === \"cloudflare\";\n}\n\nimport type { VaultInjection } from \"./types.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\nfunction resolveExistingMounts(\n vault: ResolvedVault | undefined,\n sandboxType: SandboxConfig[\"type\"],\n address: OfficeAddress,\n): ResolvedVaultMount[] {\n const mounts: ResolvedVaultMount[] = [];\n for (const mount of vault?.mounts ?? []) {\n if (!existsSync(mount.source)) {\n reportUserFacingError(new Error(\"Vault mount source is missing\"), {\n domain: \"sandbox\",\n surface: \"vault_injection\",\n operation: \"resolve_mounts\",\n severity: \"warning\",\n context: {\n sandboxType,\n conversationId: address.conversationId,\n target: mount.target,\n hasVault: Boolean(vault),\n },\n });\n continue;\n }\n mounts.push({ source: mount.source, target: mount.target });\n }\n return mounts;\n}\n\nexport function resolveVaultInjection(options: {\n vault: ResolvedVault | undefined;\n capabilities: SandboxCredentialCapabilities;\n sandboxType: SandboxConfig[\"type\"];\n address: OfficeAddress;\n}): VaultInjection {\n const { vault, capabilities, sandboxType, address } = options;\n if (vault && vault.mounts.length > 0 && !capabilities.fileMounts) {\n throw new Error(`Sandbox type \"${sandboxType}\" does not support vault file mounts`);\n }\n\n const mounts = resolveExistingMounts(vault, sandboxType, address);\n\n const env =\n capabilities.env && vault && Object.keys(vault.env).length > 0 ? vault.env : undefined;\n return { env, mounts };\n}\n\nexport const disabledVaultManager: VaultManager = {\n isEnabled: () => false,\n hasEntry: () => false,\n resolve: () => undefined,\n list: () => [],\n listSharedVaults: () => [],\n deleteSharedVault: () => false,\n copySharedVaultTo: () => ({ filesCopied: 0, envKeysCopied: 0 }),\n upsertEnv: () => {\n throw new Error(\"Vault not configured\");\n },\n deleteEnvKey: () => {\n throw new Error(\"Vault not configured\");\n },\n upsertFile: () => {\n throw new Error(\"Vault not configured\");\n },\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Dirent } from \"node:fs\";\nimport { chmodSync, copyFileSync, existsSync, mkdirSync, readdirSync, rmSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, normalize, sep } from \"node:path\";\nimport { guestHomePath } from \"../sandbox/layout.js\";\nimport type { OfficeAddress } from \"../types.js\";\nimport { atomicWritePrivateFile, readTextFileIfExists } from \"../file-guards.js\";\nimport { reportUserFacingError } from \"../observability/index.js\";\nimport type { SandboxConfig, SandboxCredentialCapabilities } from \"../sandbox/types.js\";\nimport type { PlatformTrustModel } from \"../types.js\";\n\nconst PRIVATE_DIR_MODE = 0o700;\nconst SHARED_VAULT_DIR = \"shared\";\nconst LEGACY_MOUNT_TARGETS_FILE = \".mount-targets.json\";\nconst MOUNT_TARGETS_DIR = \"vault-mount-targets\";\nconst RESERVED_VAULT_DIRS = new Set([SHARED_VAULT_DIR, \"extensions\"]);\n\nexport function normalizeSharedVaultName(name: string): string | undefined {\n const trimmed = name.trim();\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(trimmed)) return undefined;\n return trimmed;\n}\n\nexport function sharedVaultKey(name: string): string | undefined {\n const normalized = normalizeSharedVaultName(name);\n return normalized ? `${SHARED_VAULT_DIR}/${normalized}` : undefined;\n}\n\nimport type { ResolvedVault, ResolvedVaultMount, VaultManager } from \"./types.js\";\n\nexport function parseEnvFile(content: string): Record<string, string> {\n const env: Record<string, string> = {};\n for (const line of content.split(/\\r\\n|\\r|\\n/)) {\n const entry = parseEnvLine(line);\n if (entry) env[entry[0]] = entry[1];\n }\n return env;\n}\n\nfunction parseEnvLine(line: string): [string, string] | undefined {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) return undefined;\n\n const eqIndex = trimmed.indexOf(\"=\");\n if (eqIndex === -1) return undefined;\n\n const key = trimmed.slice(0, eqIndex).trim();\n if (!key) return undefined;\n return [key, unquoteEnvValue(trimmed.slice(eqIndex + 1))];\n}\n\nfunction unquoteEnvValue(value: string): string {\n const quote = value[0];\n if ((quote === '\"' || quote === \"'\") && value.endsWith(quote)) return value.slice(1, -1);\n return value;\n}\n\nexport class FileVaultManager implements VaultManager {\n private readonly vaultsDir: string;\n private readonly mountTargetsDir: string;\n\n constructor(stateDir: string) {\n this.vaultsDir = join(stateDir, \"vaults\");\n this.mountTargetsDir = join(stateDir, MOUNT_TARGETS_DIR);\n }\n\n isEnabled(): boolean {\n return existsSync(this.vaultsDir);\n }\n\n hasEntry(key: string): boolean {\n if (!isSafeVaultKey(key)) return false;\n return existsSync(join(this.vaultsDir, key));\n }\n\n listSharedVaults(): string[] {\n const sharedDir = join(this.vaultsDir, SHARED_VAULT_DIR);\n if (!existsSync(sharedDir)) return [];\n return readdirSync(sharedDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory() && normalizeSharedVaultName(entry.name) === entry.name)\n .map((entry) => entry.name)\n .toSorted((left, right) => left.localeCompare(right));\n }\n\n deleteSharedVault(name: string): boolean {\n const key = sharedVaultKey(name);\n if (!key) throw new Error(`vault: invalid shared login name: ${name}`);\n const dir = join(this.vaultsDir, key);\n const existed = existsSync(dir);\n rmSync(dir, { recursive: true, force: true });\n rmSync(this.mountTargetsPath(key), { force: true });\n return existed;\n }\n\n copySharedVaultTo(\n name: string,\n targetKey: string,\n ): { filesCopied: number; envKeysCopied: number } {\n if (!isSafeVaultKey(targetKey)) throw new Error(`vault: invalid vault key: ${targetKey}`);\n const sourceKey = sharedVaultKey(name);\n if (!sourceKey) throw new Error(`vault: invalid shared login name: ${name}`);\n const sourceDir = join(this.vaultsDir, sourceKey);\n if (!existsSync(sourceDir)) throw new Error(`vault: shared login \"${name}\" does not exist`);\n\n const targetDir = join(this.vaultsDir, targetKey);\n assertNoLegacyMountTargetsCollision(sourceDir);\n assertNoLegacyMountTargetsCollision(targetDir);\n const sourceTargets = readMountTargets(this.mountTargetsPath(sourceKey));\n const targetTargets = readMountTargets(this.mountTargetsPath(targetKey));\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(targetDir);\n const result = copyVaultDir(sourceDir, targetDir);\n writeMountTargets(this.mountTargetsPath(targetKey), {\n ...targetTargets,\n ...sourceTargets,\n });\n return result;\n }\n\n resolve(userId: string): ResolvedVault | undefined {\n if (!isSafeVaultKey(userId)) return undefined;\n const dir = join(this.vaultsDir, userId);\n if (!existsSync(dir)) return undefined;\n return this.buildResolved(userId);\n }\n\n list(): ResolvedVault[] {\n if (!existsSync(this.vaultsDir)) return [];\n const keys = new Set<string>();\n for (const entry of readdirSync(this.vaultsDir, { withFileTypes: true })) {\n if (\n entry.isDirectory() &&\n !RESERVED_VAULT_DIRS.has(entry.name) &&\n isSafeVaultKey(entry.name)\n ) {\n keys.add(entry.name);\n }\n }\n return Array.from(keys, (key) => this.buildResolved(key));\n }\n\n upsertEnv(key: string, env: Record<string, string>): void {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const dir = join(this.vaultsDir, key);\n const envPath = join(dir, \"env\");\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(dir);\n const existingContent = readTextFileIfExists(envPath);\n const existing = existingContent ? parseEnvFile(existingContent) : {};\n const merged = { ...existing, ...env };\n const content =\n Object.entries(merged)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([envKey, value]) => `${envKey}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(envPath, content);\n }\n\n deleteEnvKey(key: string, envKey: string): boolean {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const envPath = join(this.vaultsDir, key, \"env\");\n const existingContent = readTextFileIfExists(envPath);\n if (existingContent === undefined) return false;\n const existing = parseEnvFile(existingContent);\n if (!(envKey in existing)) return false;\n delete existing[envKey];\n const content =\n Object.entries(existing)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => `${name}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(envPath, content);\n return true;\n }\n\n upsertFile(key: string, relativePath: string, content: string, targetPath?: string): void {\n if (!isSafeVaultKey(key)) throw new Error(`vault: invalid vault key: ${key}`);\n const normalizedPath = normalizeVaultRelativePath(relativePath);\n const normalizedTarget = normalizeVaultTargetPath(targetPath);\n if (\n !normalizedPath ||\n normalizedPath === LEGACY_MOUNT_TARGETS_FILE ||\n (targetPath !== undefined && !normalizedTarget)\n ) {\n throw new Error(`vault: invalid relative secret file path for \"${key}\": ${relativePath}`);\n }\n\n const dir = join(this.vaultsDir, key);\n const filePath = join(dir, normalizedPath);\n assertNoLegacyMountTargetsCollision(dir);\n\n ensurePrivateDir(this.vaultsDir);\n ensurePrivateDir(dir);\n const parentDir = dirname(filePath);\n if (parentDir !== dir) ensurePrivateDir(parentDir);\n atomicWritePrivateFile(filePath, content);\n updateMountTarget(this.mountTargetsPath(key), normalizedPath, normalizedTarget);\n }\n\n private buildResolved(key: string): ResolvedVault {\n const dir = join(this.vaultsDir, key);\n assertNoLegacyMountTargetsCollision(dir);\n const mounts = resolveMountsFromDir(dir, readMountTargets(this.mountTargetsPath(key)));\n\n const envContent = readTextFileIfExists(join(dir, \"env\"));\n const env = envContent === undefined ? {} : parseEnvFile(envContent);\n\n return {\n userId: key,\n displayName: key,\n dir,\n mounts,\n env,\n };\n }\n\n private mountTargetsPath(key: string): string {\n return join(this.mountTargetsDir, `${key}.json`);\n }\n}\n\nfunction resolveMountsFromDir(\n dir: string,\n explicitTargets: Record<string, string>,\n): ResolvedVaultMount[] {\n if (!existsSync(dir)) return [];\n\n const mounts: ResolvedVaultMount[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"env\") continue;\n const source = join(dir, entry.name);\n const inferredTarget = inferredVaultTargetPath(entry.name);\n if (!inferredTarget) continue;\n\n const explicitTarget = Object.hasOwn(explicitTargets, entry.name)\n ? explicitTargets[entry.name]\n : undefined;\n if (explicitTarget) {\n mounts.push({ source, target: explicitTarget });\n continue;\n }\n\n const nestedPrefix = `${entry.name}/`;\n const hasExplicitDescendant = Object.keys(explicitTargets).some((relativePath) =>\n relativePath.startsWith(nestedPrefix),\n );\n if (!entry.isDirectory() || !hasExplicitDescendant) {\n mounts.push({ source, target: inferredTarget });\n continue;\n }\n mounts.push(...resolveNestedMounts(dir, entry.name, inferredTarget, explicitTargets));\n }\n return mounts;\n}\n\nfunction resolveNestedMounts(\n rootDir: string,\n relativeDir: string,\n targetDir: string,\n explicitTargets: Record<string, string>,\n): ResolvedVaultMount[] {\n const mounts: ResolvedVaultMount[] = [];\n for (const entry of readdirSync(join(rootDir, relativeDir), { withFileTypes: true })) {\n const relativePath = `${relativeDir}/${entry.name}`;\n const source = join(rootDir, relativePath);\n const inferredTarget = `${targetDir}/${entry.name}`;\n const explicitTarget = Object.hasOwn(explicitTargets, relativePath)\n ? explicitTargets[relativePath]\n : undefined;\n if (explicitTarget) {\n mounts.push({ source, target: explicitTarget });\n continue;\n }\n\n const nestedPrefix = `${relativePath}/`;\n const hasExplicitDescendant = Object.keys(explicitTargets).some((candidate) =>\n candidate.startsWith(nestedPrefix),\n );\n if (!entry.isDirectory() || !hasExplicitDescendant) {\n mounts.push({ source, target: inferredTarget });\n continue;\n }\n mounts.push(...resolveNestedMounts(rootDir, relativePath, inferredTarget, explicitTargets));\n }\n return mounts;\n}\n\nfunction assertNoLegacyMountTargetsCollision(dir: string): void {\n const path = join(dir, LEGACY_MOUNT_TARGETS_FILE);\n if (existsSync(path)) {\n throw new Error(`vault: reserved mount metadata filename collision: ${path}`);\n }\n}\n\nfunction readMountTargets(path: string): Record<string, string> {\n const raw = readTextFileIfExists(path);\n if (raw === undefined) return Object.create(null) as Record<string, string>;\n\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch (error) {\n throw new Error(`vault: invalid mount target metadata: ${path}`, { cause: error });\n }\n if (!isRecord(value)) throw new Error(`vault: invalid mount target metadata: ${path}`);\n\n const targets = Object.create(null) as Record<string, string>;\n for (const [relativePath, targetPath] of Object.entries(value)) {\n const normalizedPath = normalizeVaultRelativePath(relativePath);\n const normalizedTarget =\n typeof targetPath === \"string\" ? normalizeVaultTargetPath(targetPath) : undefined;\n if (normalizedPath !== relativePath || !normalizedTarget || normalizedTarget !== targetPath) {\n throw new Error(`vault: invalid mount target metadata: ${path}`);\n }\n targets[relativePath] = targetPath;\n }\n return targets;\n}\n\nfunction updateMountTarget(path: string, relativePath: string, targetPath?: string): void {\n const targets = readMountTargets(path);\n if (targetPath === undefined) delete targets[relativePath];\n else targets[relativePath] = targetPath;\n writeMountTargets(path, targets);\n}\n\nfunction writeMountTargets(path: string, targets: Record<string, string>): void {\n if (Object.keys(targets).length === 0) {\n rmSync(path, { force: true });\n return;\n }\n ensurePrivateDir(dirname(path));\n atomicWritePrivateFile(path, `${JSON.stringify(targets, null, 2)}\\n`);\n}\n\nfunction ensurePrivateDir(path: string): void {\n mkdirSync(path, { recursive: true, mode: PRIVATE_DIR_MODE });\n chmodSync(path, PRIVATE_DIR_MODE);\n}\n\ninterface VaultCopyCounts {\n filesCopied: number;\n envKeysCopied: number;\n}\n\nfunction copyVaultDir(sourceDir: string, targetDir: string): VaultCopyCounts {\n const total: VaultCopyCounts = { filesCopied: 0, envKeysCopied: 0 };\n for (const entry of readdirSync(sourceDir, { withFileTypes: true })) {\n const counts = copyVaultEntry(sourceDir, targetDir, entry);\n total.filesCopied += counts.filesCopied;\n total.envKeysCopied += counts.envKeysCopied;\n }\n return total;\n}\n\nfunction copyVaultEntry(sourceDir: string, targetDir: string, entry: Dirent): VaultCopyCounts {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.name === \"env\" && entry.isFile()) {\n return { filesCopied: 0, envKeysCopied: mergeVaultEnvFile(sourcePath, targetPath) };\n }\n if (entry.isDirectory()) {\n ensurePrivateDir(targetPath);\n return copyVaultDir(sourcePath, targetPath);\n }\n if (!entry.isFile()) return { filesCopied: 0, envKeysCopied: 0 };\n\n copyFileSync(sourcePath, targetPath);\n chmodSync(targetPath, 0o600);\n return { filesCopied: 1, envKeysCopied: 0 };\n}\n\nfunction mergeVaultEnvFile(sourcePath: string, targetPath: string): number {\n const sourceEnv = parseEnvFile(readTextFileIfExists(sourcePath) ?? \"\");\n const targetEnv = parseEnvFile(readTextFileIfExists(targetPath) ?? \"\");\n const merged = { ...targetEnv, ...sourceEnv };\n const content =\n Object.entries(merged)\n .toSorted(([left], [right]) => left.localeCompare(right))\n .map(([envKey, value]) => `${envKey}=${value}`)\n .join(\"\\n\") + \"\\n\";\n atomicWritePrivateFile(targetPath, content);\n return Object.keys(sourceEnv).length;\n}\n\nfunction isSafeVaultKey(key: unknown): key is string {\n if (typeof key !== \"string\" || !key || isAbsolute(key)) return false;\n if (/^[A-Za-z]:[\\\\/]/.test(key)) return false;\n\n return key.split(/[\\\\/]/).every((segment) => {\n return (\n segment !== \"\" && segment !== \".\" && segment !== \"..\" && !hasUnsafeControlCharacter(segment)\n );\n });\n}\n\nfunction hasUnsafeControlCharacter(value: string): boolean {\n return Array.from(value).some((character) => {\n const code = character.codePointAt(0) ?? 0;\n return (code >= 0 && code <= 31) || (code >= 127 && code <= 159);\n });\n}\n\nfunction normalizeVaultRelativePath(relativePath: string): string | undefined {\n const trimmed = relativePath.trim();\n if (!trimmed || isAbsolute(trimmed)) return undefined;\n\n const normalized = normalize(trimmed).split(sep).join(\"/\");\n if (!normalized || normalized === \".\" || normalized === \"..\" || normalized.startsWith(\"../\")) {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeVaultTargetPath(targetPath?: string): string | undefined {\n if (targetPath === undefined) return undefined;\n\n const trimmed = targetPath.trim();\n if (!trimmed || !trimmed.startsWith(\"/\")) return undefined;\n\n const normalized = normalize(trimmed).split(sep).join(\"/\");\n return normalized.startsWith(\"/\") ? normalized : undefined;\n}\n\nexport const GOOGLE_VAULT_CREDENTIAL_FILES = Object.freeze({\n workspaceCli: Object.freeze({\n relativePath: \"gws.json\",\n targetPath: guestHomePath(\".config/gws/credentials.json\"),\n }),\n cloudSdk: Object.freeze({\n relativePath: \"gcloud-adc.json\",\n targetPath: guestHomePath(\".config/gcloud/application_default_credentials.json\"),\n }),\n});\n\nexport function defaultVaultTargetPath(relativePath: string): string {\n const normalized = normalizeVaultRelativePath(relativePath) ?? relativePath.replace(/^\\/+/, \"\");\n return guestHomePath(normalized);\n}\n\nfunction inferredVaultTargetPath(relativePath: string): string | undefined {\n const normalized = normalizeVaultRelativePath(relativePath);\n if (!normalized) return undefined;\n\n for (const file of Object.values(GOOGLE_VAULT_CREDENTIAL_FILES)) {\n if (normalized === file.relativePath) return file.targetPath;\n }\n if (normalized === \".ssh\" || normalized.startsWith(\".ssh/\")) {\n return guestHomePath(\".ssh\");\n }\n if (normalized === \".kube\" || normalized.startsWith(\".kube/\")) {\n return guestHomePath(\".kube\");\n }\n if (normalized === \".config/gh\" || normalized.startsWith(\".config/gh/\")) {\n return guestHomePath(\".config/gh\");\n }\n\n return defaultVaultTargetPath(normalized);\n}\n\nexport function allowsAmbientDefaultSharedVault(options: {\n trustModel?: PlatformTrustModel;\n sandboxType: SandboxConfig[\"type\"];\n}): boolean {\n const trustModel = options.trustModel ?? \"membership\";\n if (trustModel === \"open-trigger\") return false;\n return options.sandboxType === \"image\" || options.sandboxType === \"cloudflare\";\n}\n\nimport type { VaultInjection } from \"./types.js\";\nimport { isRecord } from \"../unknown-values.js\";\n\nfunction resolveExistingMounts(\n vault: ResolvedVault | undefined,\n sandboxType: SandboxConfig[\"type\"],\n address: OfficeAddress,\n): ResolvedVaultMount[] {\n const mounts: ResolvedVaultMount[] = [];\n for (const mount of vault?.mounts ?? []) {\n if (!existsSync(mount.source)) {\n reportUserFacingError(new Error(\"Vault mount source is missing\"), {\n domain: \"sandbox\",\n surface: \"vault_injection\",\n operation: \"resolve_mounts\",\n severity: \"warning\",\n context: {\n sandboxType,\n conversationId: address.conversationId,\n target: mount.target,\n hasVault: Boolean(vault),\n },\n });\n continue;\n }\n mounts.push({ source: mount.source, target: mount.target });\n }\n return mounts;\n}\n\nexport function resolveVaultInjection(options: {\n vault: ResolvedVault | undefined;\n capabilities: SandboxCredentialCapabilities;\n sandboxType: SandboxConfig[\"type\"];\n address: OfficeAddress;\n}): VaultInjection {\n const { vault, capabilities, sandboxType, address } = options;\n if (vault && vault.mounts.length > 0 && !capabilities.fileMounts) {\n throw new Error(`Sandbox type \"${sandboxType}\" does not support vault file mounts`);\n }\n\n const mounts = resolveExistingMounts(vault, sandboxType, address);\n\n const env =\n capabilities.env && vault && Object.keys(vault.env).length > 0 ? vault.env : undefined;\n return { env, mounts };\n}\n\nexport const disabledVaultManager: VaultManager = {\n isEnabled: () => false,\n hasEntry: () => false,\n resolve: () => undefined,\n list: () => [],\n listSharedVaults: () => [],\n deleteSharedVault: () => false,\n copySharedVaultTo: () => ({ filesCopied: 0, envKeysCopied: 0 }),\n upsertEnv: () => {\n throw new Error(\"Vault not configured\");\n },\n deleteEnvKey: () => {\n throw new Error(\"Vault not configured\");\n },\n upsertFile: () => {\n throw new Error(\"Vault not configured\");\n },\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geminixiang/mikan",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.85",
|
|
4
4
|
"description": "Self-hosted AI coding agent for organizations: every Slack channel and DM gets its own sandboxed workspace, credentials, and memory.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|
package/dist/cli/sandbox.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/cli/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAQnE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,sBACC,GAClC,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
|
package/dist/cli/sandbox.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { DockerContainerManager } from "../sandbox/provisioner.js";
|
|
2
|
-
import { cliCommand, commandExitCode, nonEmptyValue } from "./arg-grammar.js";
|
|
3
|
-
import { errorMessage } from "../unknown-values.js";
|
|
4
|
-
export async function runSandboxCommand(argv, createManager = (image) => new DockerContainerManager(image)) {
|
|
5
|
-
const command = cliCommand("mikan sandbox")
|
|
6
|
-
.description("Inspect and upgrade managed image:* sandbox containers")
|
|
7
|
-
.requiredOption("--image <image>", "The image the daemon runs with (image:<image>)", nonEmptyValue);
|
|
8
|
-
let result = 1;
|
|
9
|
-
const manager = () => createManager(command.opts().image ?? "");
|
|
10
|
-
command
|
|
11
|
-
.command("status")
|
|
12
|
-
.description("List managed containers with home-volume and image-drift state")
|
|
13
|
-
.action(async () => {
|
|
14
|
-
result = await printStatus(manager());
|
|
15
|
-
});
|
|
16
|
-
command
|
|
17
|
-
.command("diff <containerKey>")
|
|
18
|
-
.description("Show system changes outside /root that an upgrade will discard")
|
|
19
|
-
.action(async (containerKey) => {
|
|
20
|
-
result = await printSystemChanges(manager(), containerKey);
|
|
21
|
-
});
|
|
22
|
-
command
|
|
23
|
-
.command("migrate <containerKeys...>")
|
|
24
|
-
.description("Move legacy containers onto a home volume and the current image")
|
|
25
|
-
.action(async (containerKeys) => {
|
|
26
|
-
result = await migrateContainers(manager(), containerKeys);
|
|
27
|
-
});
|
|
28
|
-
try {
|
|
29
|
-
await command.parseAsync(argv, { from: "user" });
|
|
30
|
-
return result;
|
|
31
|
-
}
|
|
32
|
-
catch (error) {
|
|
33
|
-
return commandExitCode(error, command);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
async function printStatus(manager) {
|
|
37
|
-
const entries = await manager.inventory();
|
|
38
|
-
if (entries.length === 0) {
|
|
39
|
-
console.log("No managed sandbox containers.");
|
|
40
|
-
return 0;
|
|
41
|
-
}
|
|
42
|
-
for (const entry of entries) {
|
|
43
|
-
const state = entry.running ? "running" : "stopped";
|
|
44
|
-
const layout = entry.homeVolume ? "home-volume" : "legacy";
|
|
45
|
-
const image = entry.imageStale ? "stale-image" : "current-image";
|
|
46
|
-
console.log(`${entry.containerKey ?? entry.containerName}\t${state}\t${layout}\t${image}`);
|
|
47
|
-
}
|
|
48
|
-
const legacy = entries.filter((entry) => !entry.homeVolume).length;
|
|
49
|
-
const stale = entries.filter((entry) => entry.homeVolume && entry.imageStale).length;
|
|
50
|
-
console.log(`${entries.length} container(s): ${legacy} legacy (run \`mikan sandbox migrate\`), ${stale} home-volume on a stale image (replaced on next start after idle stop).`);
|
|
51
|
-
return 0;
|
|
52
|
-
}
|
|
53
|
-
async function printSystemChanges(manager, containerKey) {
|
|
54
|
-
const changes = await manager.systemChanges(DockerContainerManager.containerName(containerKey));
|
|
55
|
-
if (changes.length === 0) {
|
|
56
|
-
console.log("No system changes outside /root and /workspace.");
|
|
57
|
-
return 0;
|
|
58
|
-
}
|
|
59
|
-
for (const line of changes)
|
|
60
|
-
console.log(line);
|
|
61
|
-
console.log(`${changes.length} path(s) outside /root will be discarded by an upgrade.`);
|
|
62
|
-
return 0;
|
|
63
|
-
}
|
|
64
|
-
async function migrateContainers(manager, containerKeys) {
|
|
65
|
-
let failed = 0;
|
|
66
|
-
for (const containerKey of containerKeys) {
|
|
67
|
-
try {
|
|
68
|
-
const outcome = await manager.migrateToHomeVolume(containerKey);
|
|
69
|
-
console.log(`${containerKey}\t${outcome}`);
|
|
70
|
-
if (outcome === "missing")
|
|
71
|
-
failed++;
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
failed++;
|
|
75
|
-
console.error(`${containerKey}\tfailed\t${errorMessage(error)}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return failed === 0 ? 0 : 1;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=sandbox.js.map
|
package/dist/cli/sandbox.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/cli/sandbox.ts"],"names":[],"mappings":"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","sourcesContent":["import { DockerContainerManager } from \"../sandbox/provisioner.js\";\nimport { cliCommand, commandExitCode, nonEmptyValue } from \"./arg-grammar.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ninterface SandboxCommandOptions {\n image?: string;\n}\n\nexport async function runSandboxCommand(\n argv: string[],\n createManager: (image: string) => DockerContainerManager = (image) =>\n new DockerContainerManager(image),\n): Promise<number> {\n const command = cliCommand(\"mikan sandbox\")\n .description(\"Inspect and upgrade managed image:* sandbox containers\")\n .requiredOption(\n \"--image <image>\",\n \"The image the daemon runs with (image:<image>)\",\n nonEmptyValue,\n );\n let result = 1;\n const manager = (): DockerContainerManager =>\n createManager(command.opts<SandboxCommandOptions>().image ?? \"\");\n command\n .command(\"status\")\n .description(\"List managed containers with home-volume and image-drift state\")\n .action(async () => {\n result = await printStatus(manager());\n });\n command\n .command(\"diff <containerKey>\")\n .description(\"Show system changes outside /root that an upgrade will discard\")\n .action(async (containerKey: string) => {\n result = await printSystemChanges(manager(), containerKey);\n });\n command\n .command(\"migrate <containerKeys...>\")\n .description(\"Move legacy containers onto a home volume and the current image\")\n .action(async (containerKeys: string[]) => {\n result = await migrateContainers(manager(), containerKeys);\n });\n try {\n await command.parseAsync(argv, { from: \"user\" });\n return result;\n } catch (error) {\n return commandExitCode(error, command);\n }\n}\n\nasync function printStatus(manager: DockerContainerManager): Promise<number> {\n const entries = await manager.inventory();\n if (entries.length === 0) {\n console.log(\"No managed sandbox containers.\");\n return 0;\n }\n for (const entry of entries) {\n const state = entry.running ? \"running\" : \"stopped\";\n const layout = entry.homeVolume ? \"home-volume\" : \"legacy\";\n const image = entry.imageStale ? \"stale-image\" : \"current-image\";\n console.log(`${entry.containerKey ?? entry.containerName}\\t${state}\\t${layout}\\t${image}`);\n }\n const legacy = entries.filter((entry) => !entry.homeVolume).length;\n const stale = entries.filter((entry) => entry.homeVolume && entry.imageStale).length;\n console.log(\n `${entries.length} container(s): ${legacy} legacy (run \\`mikan sandbox migrate\\`), ${stale} home-volume on a stale image (replaced on next start after idle stop).`,\n );\n return 0;\n}\n\nasync function printSystemChanges(\n manager: DockerContainerManager,\n containerKey: string,\n): Promise<number> {\n const changes = await manager.systemChanges(DockerContainerManager.containerName(containerKey));\n if (changes.length === 0) {\n console.log(\"No system changes outside /root and /workspace.\");\n return 0;\n }\n for (const line of changes) console.log(line);\n console.log(`${changes.length} path(s) outside /root will be discarded by an upgrade.`);\n return 0;\n}\n\nasync function migrateContainers(\n manager: DockerContainerManager,\n containerKeys: readonly string[],\n): Promise<number> {\n let failed = 0;\n for (const containerKey of containerKeys) {\n try {\n const outcome = await manager.migrateToHomeVolume(containerKey);\n console.log(`${containerKey}\\t${outcome}`);\n if (outcome === \"missing\") failed++;\n } catch (error) {\n failed++;\n console.error(`${containerKey}\\tfailed\\t${errorMessage(error)}`);\n }\n }\n return failed === 0 ? 0 : 1;\n}\n"]}
|
package/dist/cli/sessions.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBxE"}
|
package/dist/cli/sessions.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { join, resolve } from "node:path";
|
|
2
|
-
import { findPi084SessionFiles, migratePi084SessionFile } from "../sessions/migrate-pi-084.js";
|
|
3
|
-
import { findV3SessionFiles, migrateSessionFile } from "../sessions/migrate-v3.js";
|
|
4
|
-
import { cliCommand, commandExitCode, nonEmptyValue, resolveStateDir } from "./arg-grammar.js";
|
|
5
|
-
import { errorMessage } from "../unknown-values.js";
|
|
6
|
-
export async function runSessionsCommand(argv) {
|
|
7
|
-
const command = cliCommand("mikan sessions")
|
|
8
|
-
.description("Session-file maintenance (stop the daemon first)")
|
|
9
|
-
.option("--state-dir <dir>", "State directory", nonEmptyValue)
|
|
10
|
-
.option("--workspace <dir>", "Workspace directory", nonEmptyValue);
|
|
11
|
-
let result = 1;
|
|
12
|
-
command
|
|
13
|
-
.command("migrate")
|
|
14
|
-
.description("Migrate legacy sessions, preserving backups")
|
|
15
|
-
.option("--dry-run", "Preview migration without writing")
|
|
16
|
-
.action(async (options) => {
|
|
17
|
-
const { workspace } = command.opts();
|
|
18
|
-
const workspaceRoot = workspace
|
|
19
|
-
? resolve(workspace)
|
|
20
|
-
: join(resolveStateDir(argv), "workspace");
|
|
21
|
-
result = await migrateWorkspace(workspaceRoot, options.dryRun ?? false);
|
|
22
|
-
});
|
|
23
|
-
try {
|
|
24
|
-
await command.parseAsync(argv, { from: "user" });
|
|
25
|
-
return result;
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
return commandExitCode(error, command);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
async function migrateWorkspace(workspaceRoot, dryRun) {
|
|
32
|
-
const candidates = findCandidates(workspaceRoot);
|
|
33
|
-
if (candidates.length === 0) {
|
|
34
|
-
console.log(`No legacy session files found under ${workspaceRoot}`);
|
|
35
|
-
return 0;
|
|
36
|
-
}
|
|
37
|
-
console.log(`Found ${candidates.length} legacy session file(s) under ${workspaceRoot}`);
|
|
38
|
-
const { migrated, failed } = await migrateCandidates(candidates, dryRun);
|
|
39
|
-
console.log(dryRun
|
|
40
|
-
? `Dry run: ${migrated} file(s) would be migrated, ${failed} failed to read.`
|
|
41
|
-
: `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak or *.pi-084.bak.`);
|
|
42
|
-
return failed === 0 ? 0 : 1;
|
|
43
|
-
}
|
|
44
|
-
function findCandidates(workspaceRoot) {
|
|
45
|
-
return [
|
|
46
|
-
...findV3SessionFiles(workspaceRoot).map((file) => ({ file, format: "v3" })),
|
|
47
|
-
...findPi084SessionFiles(workspaceRoot).map((file) => ({ file, format: "pi-084" })),
|
|
48
|
-
].toSorted((left, right) => left.file.localeCompare(right.file));
|
|
49
|
-
}
|
|
50
|
-
async function migrateCandidates(candidates, dryRun) {
|
|
51
|
-
let migrated = 0;
|
|
52
|
-
let failed = 0;
|
|
53
|
-
for (const candidate of candidates) {
|
|
54
|
-
const outcome = await migrateCandidate(candidate, dryRun);
|
|
55
|
-
if (outcome === "migrated")
|
|
56
|
-
migrated++;
|
|
57
|
-
if (outcome === "failed")
|
|
58
|
-
failed++;
|
|
59
|
-
}
|
|
60
|
-
return { migrated, failed };
|
|
61
|
-
}
|
|
62
|
-
async function migrateCandidate({ file, format }, dryRun) {
|
|
63
|
-
try {
|
|
64
|
-
const result = format === "v3"
|
|
65
|
-
? await migrateSessionFile(file, { dryRun })
|
|
66
|
-
: await migratePi084SessionFile(file, { dryRun });
|
|
67
|
-
if (result.status !== "migrated")
|
|
68
|
-
return "skipped";
|
|
69
|
-
console.log(`${dryRun ? "would migrate" : "migrated"} ${file}`);
|
|
70
|
-
return "migrated";
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
const cause = error instanceof Error && error.cause ? ` (${String(error.cause)})` : "";
|
|
74
|
-
console.error(`FAILED ${file}: ${errorMessage(error)}${cause}`);
|
|
75
|
-
return "failed";
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=sessions.js.map
|
package/dist/cli/sessions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/cli/sessions.ts"],"names":[],"mappings":"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","sourcesContent":["import { join, resolve } from \"node:path\";\nimport { findPi084SessionFiles, migratePi084SessionFile } from \"../sessions/migrate-pi-084.js\";\nimport { findV3SessionFiles, migrateSessionFile } from \"../sessions/migrate-v3.js\";\nimport { cliCommand, commandExitCode, nonEmptyValue, resolveStateDir } from \"./arg-grammar.js\";\nimport { errorMessage } from \"../unknown-values.js\";\n\ninterface Candidate {\n file: string;\n format: \"v3\" | \"pi-084\";\n}\n\nexport async function runSessionsCommand(argv: string[]): Promise<number> {\n const command = cliCommand(\"mikan sessions\")\n .description(\"Session-file maintenance (stop the daemon first)\")\n .option(\"--state-dir <dir>\", \"State directory\", nonEmptyValue)\n .option(\"--workspace <dir>\", \"Workspace directory\", nonEmptyValue);\n let result = 1;\n command\n .command(\"migrate\")\n .description(\"Migrate legacy sessions, preserving backups\")\n .option(\"--dry-run\", \"Preview migration without writing\")\n .action(async (options: { dryRun?: boolean }) => {\n const { workspace } = command.opts<{ workspace?: string }>();\n const workspaceRoot = workspace\n ? resolve(workspace)\n : join(resolveStateDir(argv), \"workspace\");\n result = await migrateWorkspace(workspaceRoot, options.dryRun ?? false);\n });\n try {\n await command.parseAsync(argv, { from: \"user\" });\n return result;\n } catch (error) {\n return commandExitCode(error, command);\n }\n}\n\nasync function migrateWorkspace(workspaceRoot: string, dryRun: boolean): Promise<number> {\n const candidates = findCandidates(workspaceRoot);\n if (candidates.length === 0) {\n console.log(`No legacy session files found under ${workspaceRoot}`);\n return 0;\n }\n\n console.log(`Found ${candidates.length} legacy session file(s) under ${workspaceRoot}`);\n const { migrated, failed } = await migrateCandidates(candidates, dryRun);\n console.log(\n dryRun\n ? `Dry run: ${migrated} file(s) would be migrated, ${failed} failed to read.`\n : `Migrated ${migrated} file(s), ${failed} failure(s). Originals kept as *.v3.bak or *.pi-084.bak.`,\n );\n return failed === 0 ? 0 : 1;\n}\n\nfunction findCandidates(workspaceRoot: string): Candidate[] {\n return [\n ...findV3SessionFiles(workspaceRoot).map((file) => ({ file, format: \"v3\" as const })),\n ...findPi084SessionFiles(workspaceRoot).map((file) => ({ file, format: \"pi-084\" as const })),\n ].toSorted((left, right) => left.file.localeCompare(right.file));\n}\n\nasync function migrateCandidates(\n candidates: readonly Candidate[],\n dryRun: boolean,\n): Promise<{ migrated: number; failed: number }> {\n let migrated = 0;\n let failed = 0;\n for (const candidate of candidates) {\n const outcome = await migrateCandidate(candidate, dryRun);\n if (outcome === \"migrated\") migrated++;\n if (outcome === \"failed\") failed++;\n }\n return { migrated, failed };\n}\n\nasync function migrateCandidate(\n { file, format }: Candidate,\n dryRun: boolean,\n): Promise<\"migrated\" | \"skipped\" | \"failed\"> {\n try {\n const result =\n format === \"v3\"\n ? await migrateSessionFile(file, { dryRun })\n : await migratePi084SessionFile(file, { dryRun });\n if (result.status !== \"migrated\") return \"skipped\";\n console.log(`${dryRun ? \"would migrate\" : \"migrated\"} ${file}`);\n return \"migrated\";\n } catch (error) {\n const cause = error instanceof Error && error.cause ? ` (${String(error.cause)})` : \"\";\n console.error(`FAILED ${file}: ${errorMessage(error)}${cause}`);\n return \"failed\";\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-common.d.ts","sourceRoot":"","sources":["../../src/sessions/migrate-common.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,IAAI,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAEnD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG;IACnF,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf,CAKA;AAED,qBAAa,YAAY;;IAIvB,YAAY,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE1C;IAED,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1B;IAED,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAExD;IAED,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE3D;IAMD,QAAQ,IAAI,MAAM,CAEjB;CACF;AAeD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,EAAE,CAK/F;AAUD,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD,GAAG,OAAO,CAAC,IAAI,CAAC,CAehB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-common.js","sourceRoot":"","sources":["../../src/sessions/migrate-common.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n existsSync,\n linkSync,\n readFileSync,\n readdirSync,\n renameSync,\n rmSync,\n statSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Entry as PiEntry, JsonValue } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { atomicWritePrivateFile } from \"../file-guards.js\";\n\nexport function jsonValue(value: unknown): JsonValue {\n return JSON.parse(JSON.stringify(value)) as JsonValue;\n}\n\nexport function optionalAnnotations(source: { details?: unknown; usage?: unknown }): {\n details?: JsonValue;\n usage?: Usage;\n} {\n return {\n details: source.details !== undefined ? jsonValue(source.details) : undefined,\n usage: source.usage as Usage | undefined,\n };\n}\n\nexport class V4FileWriter {\n readonly #lines: string[];\n #seq = 0;\n\n constructor(header: Record<string, unknown>) {\n this.#lines = [JSON.stringify(header)];\n }\n\n entry(entry: PiEntry): void {\n this.#lines.push(JSON.stringify({ kind: \"entry\", ...entry, seq: ++this.#seq }));\n }\n\n set(namespace: string, key: string, value: unknown): void {\n this.#write(\"value\", \"set\", namespace, key, value);\n }\n\n append(namespace: string, key: string, value: unknown): void {\n this.#write(\"list\", \"append\", namespace, key, value);\n }\n\n #write(kind: string, op: string, namespace: string, key: string, value: unknown): void {\n this.#lines.push(JSON.stringify({ kind, op, seq: ++this.#seq, namespace, key, value }));\n }\n\n toString(): string {\n return `${this.#lines.join(\"\\n\")}\\n`;\n }\n}\n\nfunction collectSessionFiles(\n dir: string,\n isCandidate: (path: string) => boolean,\n found: string[],\n): void {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, entry.name);\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) collectSessionFiles(path, isCandidate, found);\n else if (entry.name.endsWith(\".jsonl\") && isCandidate(path)) found.push(path);\n }\n}\n\nexport function findSessionFiles(root: string, isCandidate: (path: string) => boolean): string[] {\n if (!existsSync(root)) return [];\n const found: string[] = [];\n collectSessionFiles(root, isCandidate, found);\n return found;\n}\n\nfunction backupAlreadyLinked(sourcePath: string, backupPath: string): boolean {\n if (!existsSync(backupPath)) return false;\n const source = statSync(sourcePath);\n const backup = statSync(backupPath);\n if (source.dev === backup.dev && source.ino === backup.ino) return true;\n throw new Error(`Backup already exists: ${backupPath}`);\n}\n\nexport async function commitMigration(options: {\n filePath: string;\n sourceBytes: Buffer;\n encoded: string;\n tempPath: string;\n backupPath: string;\n verify: (candidatePath: string) => Promise<void>;\n}): Promise<void> {\n const { filePath, tempPath, backupPath } = options;\n const backupLinked = backupAlreadyLinked(filePath, backupPath);\n atomicWritePrivateFile(tempPath, options.encoded);\n try {\n await options.verify(tempPath);\n if (!readFileSync(filePath).equals(options.sourceBytes)) {\n throw new Error(\"source changed during migration\");\n }\n if (!backupLinked) linkSync(filePath, backupPath);\n renameSync(tempPath, filePath);\n } catch (error) {\n rmSync(tempPath, { force: true });\n throw new Error(`Migration failed for ${filePath}`, { cause: error });\n }\n}\n"]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Pi084MigrationResult } from "./types.js";
|
|
2
|
-
export declare function isPi084SessionFile(filePath: string): boolean;
|
|
3
|
-
export declare function migratePi084SessionFile(filePath: string, options?: {
|
|
4
|
-
dryRun?: boolean;
|
|
5
|
-
}): Promise<Pi084MigrationResult>;
|
|
6
|
-
export declare function findPi084SessionFiles(root: string): string[];
|
|
7
|
-
//# sourceMappingURL=migrate-pi-084.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-pi-084.d.ts","sourceRoot":"","sources":["../../src/sessions/migrate-pi-084.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAsDvD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO5D;AAuPD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE5D"}
|