@ai-ecoverse/slicc-agent 7.8.6 → 7.8.7
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/freezer/v6.js +1 -1
- package/dist/freezer/v6.js.map +2 -2
- package/package.json +3 -3
package/dist/freezer/v6.js
CHANGED
|
@@ -357,7 +357,7 @@ async function verify(opened, writer, stage, show) {
|
|
|
357
357
|
writer.check();
|
|
358
358
|
const bytes = await opened.read(file.path);
|
|
359
359
|
if (await sha256(bytes) !== file.sha256.toLowerCase())
|
|
360
|
-
throw new ImportError(`${file.path} doesn't match
|
|
360
|
+
throw new ImportError(`${file.path} looks damaged (its checksum doesn't match)`);
|
|
361
361
|
const where = whereOf(opened.manifest, file.path);
|
|
362
362
|
if (where.kind === "data") data.set(file.path, bytes);
|
|
363
363
|
else if (where.kind !== "skip" && stage && !opened.dir)
|
package/dist/freezer/v6.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/freezer/v6.ts"],
|
|
4
|
-
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Message, ToolCall } from '@earendil-works/pi-ai';\nimport { configure, type EntryDraft, type ModelRef, type Tx } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, type AgentsState, freeFolder, type ScoopRecord, scoopId } from '../agents.ts';\nimport { homeOf } from '../kernel/accounts.ts';\nimport { quote } from '../kernel/env.ts';\nimport type { KernelUsers } from '../kernel/users.ts';\nimport type { Layout } from '../layout.ts';\nimport { opfsFile } from '../opfs-pool.ts';\nimport { TITLE_TURNS } from '../titles/extension.ts';\nimport { IMPORTS_DIR } from './paths.ts';\nimport { Journal, sweep, type Undoing } from './v6-journal.ts';\nimport { type Notes, place, reportOf } from './v6-place.ts';\nimport {\n checkLicks,\n checkManifest,\n checkTranscript,\n DIRECTORY_ROOT,\n type Licks,\n type Manifest,\n type Transcript,\n type V6Conversation,\n type V6Message,\n} from './v6-schema.ts';\nimport { Writer } from './v6-write.ts';\nimport {\n blobSource,\n bytesSource,\n ImportError,\n isLink,\n readEntry,\n type ZipEntry,\n type ZipSource,\n zipEntries,\n} from './zip.ts';\n\nexport const V6_KIND = 'slicc.v6';\nconst MiB = 1024 ** 2;\nexport const LIMITS = {\n archive: 2048 * MiB,\n entries: 60_000,\n file: 256 * MiB,\n transcript: 64 * MiB,\n total: 4096 * MiB,\n ratio: 200,\n};\n\nexport type ImportProgress = {\n phase: 'idle' | 'checking' | 'writing' | 'done' | 'failed';\n done: number;\n total: number;\n text: string;\n};\n\nexport interface ImportPreview {\n exportId: string;\n origin: string;\n createdAt: string;\n cones: number;\n scoops: number;\n frozen: number;\n bytes: number;\n skills: string[];\n crons: number;\n webhooks: number;\n flagged: string[];\n providers: string[];\n mounts: string[];\n already: number | null;\n text: string;\n line: string;\n}\n\nexport interface ImportResult {\n done: boolean;\n preview: ImportPreview | null;\n cones: string[];\n report: string | null;\n text: string;\n line: string;\n error: string | null;\n}\n\ntype ReadSource = { path: string } | { bytes: Uint8Array };\n\nexport type ImportSource = ReadSource | { upload: string } | { inPlace: string };\n\nconst UPLOAD = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const uploadPath = (id: string) => `${IMPORTS_DIR}/upload-${id}.zip`;\n\nfunction uploaded(source: ImportSource): { path: string } | undefined {\n if (!('upload' in source)) return undefined;\n if (!UPLOAD.test(source.upload)) throw new ImportError(\"that upload isn't one of the agent's\");\n return { path: uploadPath(source.upload) };\n}\n\nexport interface ImportDeps {\n agents: Agents;\n env: ExecutionEnv;\n layout: Layout;\n memoryHome: string;\n providers?: readonly Account[];\n catalog?: { getModel(provider: string, id: string): { name: string } | undefined };\n users?: Pick<KernelUsers, 'add' | 'remove'>;\n envOf?: (cone: string) => Promise<ExecutionEnv | undefined>;\n opfs?: () => Promise<FileSystemDirectoryHandle>;\n room?: () => Promise<number | undefined>;\n now?: () => number;\n}\n\nexport type Opened = {\n manifest: Manifest;\n key: string;\n read(name: string): Promise<Uint8Array>;\n dir: string | null;\n sources: Map<string, string>;\n};\n\nexport type Where =\n | { kind: 'data' | 'skip' | 'attachment' }\n | { kind: 'cone' | 'scoop' | 'home-user' | 'skill' | 'sprinkle'; folder: string; rest: string };\n\nexport type Scoop = {\n name: string;\n six: string | null;\n folder: string;\n conversation?: V6Conversation;\n};\n\nexport type Unit = {\n key: string;\n name: string;\n title: string;\n six: string | null;\n memory: string | null;\n doc?: Transcript;\n main?: V6Conversation;\n scoops: Scoop[];\n frozenAt: number;\n tail: string;\n cone: string;\n fresh: boolean;\n record: boolean;\n suffix: string;\n home: string;\n roots: Set<string>;\n files: Map<string, string>;\n};\n\nexport type Parsed = { data: Map<string, Uint8Array>; licks: Licks; units: Unit[] };\n\nexport const day = (at: number | string) => new Date(at).toISOString().slice(0, 10);\nconst plural = (count: number, word: string) => `${count} ${word}${count === 1 ? '' : 's'}`;\nconst decoder = new TextDecoder('utf-8', { fatal: true });\n\nexport function textOf(bytes: Uint8Array, name: string): string {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new ImportError(`${name} is not UTF-8 text`);\n }\n}\n\nfunction json(bytes: Uint8Array, name: string): unknown {\n const text = textOf(bytes, name);\n try {\n return JSON.parse(text);\n } catch {\n throw new ImportError(`${name} is not JSON`);\n }\n}\n\nconst safe = (name: string) =>\n !/^\\/|^[A-Za-z]:|\\\\|\\0/.test(name) &&\n name.split('/').every((part) => part !== '' && part !== '.' && part !== '..');\n\nconst HOOKS = /(^|\\/)\\.git\\/hooks\\//;\n\nexport function whereOf(manifest: Manifest, name: string): Where {\n const where = placeOf(manifest, name);\n const tree = where.kind === 'cone' || where.kind === 'scoop' || where.kind === 'home-user';\n return tree && HOOKS.test(name) ? { kind: 'skip' } : where;\n}\n\nfunction placeOf(manifest: Manifest, name: string): Where {\n const [top = '', second = '', ...more] = name.split('/');\n const rest = more.join('/');\n if (\n ['transcripts', 'frozen', 'memory'].includes(top) ||\n [manifest.licks, manifest.gitconfig].includes(name)\n )\n return { kind: 'data' };\n if (top === 'attachments' && /^[0-9a-f]{64}$/.test(second) && !rest)\n return { kind: 'attachment' };\n if (top === 'files' && second === 'home-user' && rest)\n return { kind: 'home-user', folder: '', rest };\n const folder = more[0] as string;\n const inner = more.slice(1).join('/');\n if (\n top === 'files' &&\n second === 'cones' &&\n inner &&\n manifest.cones.some((cone) => cone.folder === folder)\n )\n return { kind: 'cone', folder, rest: inner };\n const scoops = manifest.cones.flatMap((cone) => cone.scoops);\n if (\n top === 'files' &&\n second === 'scoops' &&\n inner &&\n scoops.some((scoop) => scoop.folder === folder)\n )\n return { kind: 'scoop', folder, rest: inner };\n const listed = top === 'skills' ? manifest.skills : top === 'sprinkles' ? manifest.sprinkles : [];\n if (rest && listed.some((item) => item.name === second))\n return { kind: top === 'skills' ? 'skill' : 'sprinkle', folder: second, rest };\n throw new ImportError(`${name} has no place in a SLICC 6 profile`);\n}\n\nfunction scan(list: readonly ZipEntry[], archive: number): Map<string, ZipEntry> {\n const entries = new Map<string, ZipEntry>();\n let total = 0;\n for (const entry of list) {\n if (!safe(entry.name))\n throw new ImportError(`refused the entry name ${JSON.stringify(entry.name)}`);\n if (isLink(entry)) throw new ImportError(`${entry.name} is a symlink`);\n if (entries.has(entry.name)) throw new ImportError(`${entry.name} is in the zip twice`);\n const big = entry === list[0] || /^(transcripts|frozen)\\//.test(entry.name);\n const cap = big ? LIMITS.transcript : LIMITS.file;\n if (entry.size > cap) throw new ImportError(`${entry.name} is over ${cap / MiB} MiB`);\n total += entry.size;\n entries.set(entry.name, entry);\n }\n if (total > LIMITS.total) throw new ImportError('the files add up to over 4 GiB');\n if (total > LIMITS.ratio * archive)\n throw new ImportError('the zip expands over 200:1, like a zip bomb');\n return entries;\n}\n\nexport async function openProfile(source: ZipSource): Promise<Opened> {\n if (source.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const list = await zipEntries(source);\n if (list.length > LIMITS.entries)\n throw new ImportError(`the zip has over ${LIMITS.entries} entries`);\n if (list[0]?.name !== 'manifest.json')\n throw new ImportError('manifest.json must be the first entry');\n const entries = scan(list, source.size);\n const manifest = checkManifest(json(await readEntry(source, list[0]), 'manifest.json'));\n const listed = new Set<string>();\n for (const file of manifest.files) {\n if (entries.get(file.path)?.size !== file.size || file.path === 'manifest.json')\n throw new ImportError(\n `${file.path} is in the manifest but not in the zip, or not at that size`\n );\n listed.add(file.path);\n }\n for (const name of entries.keys()) {\n if (name === 'manifest.json') continue;\n if (!listed.has(name)) throw new ImportError(`${name} is not listed in the manifest`);\n whereOf(manifest, name);\n }\n const { exportId, part } = manifest;\n return {\n manifest,\n key: part ? `${exportId}#${part.index}` : exportId,\n read: (name) => {\n const entry = entries.get(name);\n if (!entry) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n return readEntry(source, entry);\n },\n dir: null,\n sources: new Map(),\n };\n}\n\nconst DIRECTORY = new RegExp(\n `^${DIRECTORY_ROOT}/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$`\n);\n\nasync function infoOf(deps: ImportDeps, path: string, context: Context) {\n const real = await deps.env.canonicalPath(path, context);\n if (!real.ok) throw new ImportError(`${path} is missing`);\n if (real.value !== path) throw new ImportError(`${path} leads through a symlink`);\n const info = await deps.env.fileInfo(path, context);\n if (!info.ok) throw new ImportError(`${path} is missing`);\n return info.value;\n}\n\nasync function walk(\n deps: ImportDeps,\n dir: string,\n context: Context,\n rel = '',\n found = new Map<string, number>()\n) {\n const listed = await deps.env.listDir(rel ? `${dir}/${rel}` : dir, context);\n if (!listed.ok) throw new ImportError(`can't read ${dir}: ${listed.error.message}`);\n for (const item of listed.value) {\n const name = rel ? `${rel}/${item.name}` : item.name;\n if (item.kind === 'directory') await walk(deps, dir, context, name, found);\n else if (item.kind === 'file') found.set(name, item.size);\n else throw new ImportError(`${name} is a symlink`);\n if (found.size > LIMITS.entries)\n throw new ImportError(`${dir} has over ${LIMITS.entries} entries`);\n }\n return found;\n}\n\nasync function sourcesOf(\n deps: ImportDeps,\n dir: string,\n manifest: Manifest,\n found: Map<string, number>,\n context: Context\n) {\n if (manifest.files.length > LIMITS.entries)\n throw new ImportError(`the manifest lists over ${LIMITS.entries} files`);\n if (manifest.files.reduce((sum, file) => sum + file.size, 0) > LIMITS.total)\n throw new ImportError('the files add up to over 4 GiB');\n const sources = new Map<string, string>();\n for (const file of manifest.files) {\n if (!safe(file.path))\n throw new ImportError(`refused the entry name ${JSON.stringify(file.path)}`);\n whereOf(manifest, file.path);\n const cap = /^(transcripts|frozen)\\//.test(file.path) ? LIMITS.transcript : LIMITS.file;\n if (file.size > cap) throw new ImportError(`${file.path} is over ${cap / MiB} MiB`);\n if (file.source === undefined) {\n if (found.get(file.path) !== file.size)\n throw new ImportError(\n `${file.path} is in the manifest but not in ${dir}, or not at that size`\n );\n continue;\n }\n if (found.has(file.path))\n throw new ImportError(`${file.path} is both in ${dir} and left at ${file.source}`);\n const info = await infoOf(deps, file.source, context);\n if (info.kind !== 'file' || info.size !== file.size)\n throw new ImportError(\n `${file.source} isn't the file ${file.path} names, or not at that size`\n );\n sources.set(file.path, file.source);\n }\n return sources;\n}\n\nexport async function openDirectory(\n deps: ImportDeps,\n dir: string,\n context: Context\n): Promise<Opened> {\n const id = DIRECTORY.exec(dir)?.[1];\n if (!id) throw new ImportError(`${dir} isn't a SLICC 6 upgrade in ${DIRECTORY_ROOT}`);\n await infoOf(deps, dir, context);\n const found = await walk(deps, dir, context);\n const head = found.get('manifest.json');\n if (head === undefined) throw new ImportError(`${dir} has no manifest.json`);\n if (head > LIMITS.transcript) throw new ImportError('manifest.json is over 64 MiB');\n const read = async (path: string, name: string) => {\n const got = await deps.env.readBinaryFile(path, context);\n if (!got.ok) throw new ImportError(`can't read ${name}: ${got.error.message}`);\n return got.value;\n };\n const manifest = checkManifest(\n json(await read(`${dir}/manifest.json`, 'manifest.json'), 'manifest.json'),\n 2\n );\n if (manifest.exportId !== id)\n throw new ImportError(`${dir} holds the export ${manifest.exportId}`);\n const sources = await sourcesOf(deps, dir, manifest, found, context);\n const listed = new Set(manifest.files.map((file) => file.path));\n for (const name of found.keys())\n if (name !== 'manifest.json' && !listed.has(name))\n throw new ImportError(`${name} is not listed in the manifest`);\n return {\n manifest,\n key: manifest.exportId,\n read: (name) => read(sources.get(name) ?? `${dir}/${name}`, name),\n dir,\n sources,\n };\n}\n\nconst noLicks: Licks = { crontasks: [], tasks: [], webhooks: [] };\n\nasync function licksIn(opened: Opened, data?: Map<string, Uint8Array>): Promise<Licks> {\n const name = opened.manifest.licks;\n if (!name) return noLicks;\n return checkLicks(json(data?.get(name) ?? (await opened.read(name)), name));\n}\n\nconst ACCOUNTS: Record<string, string> = {\n 'bedrock-camp': 'amazon-bedrock',\n bedrock: 'amazon-bedrock',\n};\n\nexport function accountsOf(providers: readonly string[]): string[] {\n return [...new Set(providers.map((name) => ACCOUNTS[name] ?? name))];\n}\n\nconst UNITS = [\n [1024 ** 3, 'GB'],\n [1024 ** 2, 'MB'],\n [1024, 'KB'],\n] as const;\n\nexport type Account = { readonly id: string; readonly name?: string | undefined };\n\nconst NAMES: Record<string, string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n 'github-copilot': 'GitHub Copilot',\n google: 'Google',\n azure: 'Azure',\n 'azure-openai': 'Azure OpenAI',\n 'azure-ai-foundry': 'Azure AI Foundry',\n 'amazon-bedrock': 'Amazon Bedrock',\n adobe: 'Adobe',\n openrouter: 'OpenRouter',\n mistral: 'Mistral',\n groq: 'Groq',\n xai: 'xAI',\n deepseek: 'DeepSeek',\n 'local-llm': 'Local LLM',\n};\n\nexport function listed(names: readonly string[]): string {\n return names.length > 1 ? `${names.slice(0, -1).join(', ')} and ${names.at(-1)}` : names.join('');\n}\n\nexport function accountsSplit(providers: readonly string[], known?: readonly Account[]) {\n const accounts = accountsOf(providers);\n const ids = new Map((known ?? []).map((account) => [account.id, account.name]));\n const again = known ? accounts.filter((id) => ids.has(id)) : accounts;\n const missing = accounts.filter((id) => !again.includes(id));\n const nameOf = (id: string) => ids.get(id) || NAMES[id] || id;\n const lacking = missing.length\n ? `SLICC 7 has no accounts for ${listed(missing.map(nameOf))}.`\n : '';\n const settings = again.length ? `Re-enter in Settings: ${listed(again.map(nameOf))}.` : '';\n const signIn = again.length\n ? `Sign in to ${listed(again.map(nameOf))} again before you thaw them.`\n : '';\n return { again, missing, nameOf, lacking, settings, signIn };\n}\n\nconst said = (...parts: string[]) => parts.filter(Boolean).join(' ');\n\nconst words = (at: string) =>\n new Date(at).toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n timeZone: 'UTC',\n });\n\nconst hostOf = (origin: string) => (URL.canParse(origin) ? new URL(origin).host : origin);\n\nexport async function previewOf(\n opened: Opened,\n state: Readonly<AgentsState>,\n known?: readonly Account[]\n): Promise<ImportPreview> {\n const { manifest } = opened;\n const licks = await licksIn(opened);\n const bytes = manifest.files\n .filter((file) => file.path.startsWith('files/'))\n .reduce((sum, file) => sum + file.size, 0);\n const scoops = manifest.cones.reduce((sum, cone) => sum + cone.scoops.length, 0);\n const mounts = manifest.skipped\n .filter((item) => item.reason === 'mount')\n .map((item) => item.path.replace(/^\\/mnt\\//, ''));\n const crons =\n licks.crontasks.length + licks.tasks.filter((task) => task.scheduleType === 'cron').length;\n const host = hostOf(manifest.producer.origin);\n const split = accountsSplit(manifest.providers, known);\n const [at, unit] = UNITS.find(([at]) => bytes >= at) ?? (UNITS[2] as (typeof UNITS)[2]);\n const size = `${(bytes / at).toFixed(1)} ${unit}`;\n const parts = [\n plural(manifest.cones.length, 'cone'),\n plural(scoops, 'scoop'),\n plural(manifest.frozen.length, 'frozen session'),\n `${size} of files`,\n `${plural(manifest.skills.length, 'skill')} (for every agent)`,\n `${plural(crons, 'cron')} (imported off)`,\n `${plural(licks.webhooks.length, 'webhook')} (new URLs needed)`,\n `${plural(manifest.flagged.length, 'credential-like file')} to review`,\n ];\n return {\n exportId: manifest.exportId,\n origin: manifest.producer.origin,\n createdAt: manifest.createdAt,\n cones: manifest.cones.length,\n scoops,\n frozen: manifest.frozen.length,\n bytes,\n skills: manifest.skills.map((skill) => skill.name),\n crons,\n webhooks: licks.webhooks.length,\n flagged: manifest.flagged.map((item) => item.path),\n providers: split.again,\n mounts,\n already: state.imports?.[opened.key]?.at ?? null,\n text: said(\n `SLICC 6 profile from ${host}, exported ${words(manifest.createdAt)}.`,\n split.lacking\n ),\n line: said(\n `SLICC 6 profile from ${host}, exported ${day(manifest.createdAt)}: ${parts.join(', ')}.`,\n split.settings,\n split.lacking,\n `Not imported: ${plural(mounts.length, 'mount')}.`\n ),\n };\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\ntype Show = (phase: ImportProgress['phase'], done: number, total: number) => void;\n\nexport async function settled(\n opened: Opened,\n at: ReadonlyMap<string, string>,\n writer: Writer\n): Promise<void> {\n for (const file of opened.manifest.files) {\n const from = opened.sources.get(file.path);\n const path = at.get(file.path);\n if (!from || !path || path === from) continue;\n const read = await writer.env.readBinaryFile(path, writer.context);\n const kept =\n read.ok &&\n read.value.length === file.size &&\n (await sha256(read.value)) === file.sha256.toLowerCase();\n writer.check();\n if (!kept)\n throw new ImportError(\n `${from} changed while it moved, so a SLICC 6 tab may still be writing; close every SLICC 6 tab and import again`\n );\n }\n}\n\nasync function verify(opened: Opened, writer: Writer, stage: string | null, show: Show) {\n const data = new Map<string, Uint8Array>();\n const { files } = opened.manifest;\n for (const [at, file] of files.entries()) {\n writer.check();\n const bytes = await opened.read(file.path);\n if ((await sha256(bytes)) !== file.sha256.toLowerCase())\n throw new ImportError(`${file.path} doesn't match its sha256`);\n const where = whereOf(opened.manifest, file.path);\n if (where.kind === 'data') data.set(file.path, bytes);\n else if (where.kind !== 'skip' && stage && !opened.dir)\n await writer.put(`${stage}/${file.path}`, bytes, true);\n show('checking', at + 1, files.length);\n }\n return data;\n}\n\nfunction transcriptIn(data: Map<string, Uint8Array>, name: string | null): Transcript | undefined {\n if (!name) return undefined;\n const bytes = data.get(name);\n if (!bytes) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n const value = json(bytes, name);\n try {\n return checkTranscript(value);\n } catch (error) {\n throw new ImportError(`${name}: ${(error as Error).message}`);\n }\n}\n\nfunction draft(\n fields: Pick<Unit, 'key' | 'name' | 'title' | 'six' | 'memory' | 'scoops'> & {\n doc?: Transcript;\n main?: V6Conversation;\n },\n when: (string | null | undefined)[],\n created: string\n): Unit {\n const last = fields.main?.messages.at(-1)?.timestamp;\n const frozenAt = [...when, last, created]\n .map((value) => Date.parse(value ?? ''))\n .find((at) => !Number.isNaN(at)) as number;\n const tail = (fields.doc?.conversations ?? [])\n .map((item) => item.messages.at(-1)?.id ?? '')\n .join(',');\n return {\n ...fields,\n frozenAt,\n tail,\n cone: '',\n fresh: true,\n record: true,\n suffix: '',\n home: '',\n roots: new Set(),\n files: new Map(),\n };\n}\n\nexport function unitsOf(manifest: Manifest, data: Map<string, Uint8Array>): Unit[] {\n const cones = manifest.cones.map((cone) => {\n const doc = transcriptIn(data, cone.transcript);\n const all = doc?.conversations ?? [];\n const main =\n all.find((item) => item.id === cone.conversation) ?? all.find((item) => item.kind === 'cone');\n const scoops = cone.scoops.map((scoop) => ({\n name: scoop.name,\n six: scoop.folder,\n folder: '',\n conversation:\n all.find((item) => item.id === scoop.conversation) ??\n all.find((item) => item.kind === 'scoop' && item.folder === scoop.folder),\n }));\n const title = doc?.session.title || cone.name;\n return draft(\n {\n key: cone.key,\n name: cone.name,\n title,\n six: cone.folder,\n memory: cone.memory,\n doc,\n main,\n scoops,\n },\n [doc?.session.updatedAt],\n manifest.createdAt\n );\n });\n const frozen = manifest.frozen.map((item) => {\n const doc = transcriptIn(data, item.transcript) as Transcript;\n const [main, ...rest] = [...doc.conversations].sort(\n (a, b) => Number(b.kind === 'cone') - Number(a.kind === 'cone')\n );\n const title = item.title || doc.session.title;\n const scoops = rest.map((conversation) => ({\n name: conversation.name,\n six: null,\n folder: '',\n conversation,\n }));\n const when = [item.frozenAt, doc.session.frozenAt, doc.session.updatedAt];\n return draft(\n { key: `frozen:${item.id}`, name: title, title, six: null, memory: null, doc, main, scoops },\n when,\n manifest.createdAt\n );\n });\n return [...cones, ...frozen];\n}\n\nfunction present(data: Map<string, Uint8Array>, name: string | null | undefined) {\n if (name && !data.has(name))\n throw new ImportError(`${name} is named in the manifest but not in the zip`);\n}\n\nfunction attached(manifest: Manifest, name: string, doc: Transcript) {\n const files = new Map(manifest.files.map((file) => [file.path, file]));\n for (const item of doc.attachments) {\n const file = files.get(item.path);\n const same =\n file !== undefined &&\n file.size === item.byteLength &&\n file.sha256.toLowerCase() === item.sha256.toLowerCase();\n if (item.present && !(item.path.startsWith('attachments/') && same))\n throw new ImportError(`${name}: attachment ${item.id} doesn't match ${item.path}`);\n }\n}\n\nfunction related(manifest: Manifest, data: Map<string, Uint8Array>) {\n const transcripts = [\n ...manifest.cones.map((cone) => cone.transcript),\n ...manifest.frozen.map((item) => item.transcript),\n ].filter((name): name is string => name !== null);\n const twice = transcripts.find((name, at) => transcripts.indexOf(name) !== at);\n if (twice) throw new ImportError(`${twice} is named twice in the manifest`);\n for (const name of [...manifest.cones.map((cone) => cone.memory), manifest.gitconfig])\n present(data, name);\n for (const [kind, items] of [\n ['skills', manifest.skills],\n ['sprinkles', manifest.sprinkles],\n ] as const)\n for (const item of items)\n if (\n item.path !== `${kind}/${item.name}/` ||\n !manifest.files.some((file) => file.path.startsWith(item.path))\n )\n throw new ImportError(`${item.path} is named in the manifest but has no files`);\n for (const cone of manifest.cones) {\n const doc = transcriptIn(data, cone.transcript);\n const ids = new Set(doc?.conversations.map((item) => item.id));\n for (const id of [cone.conversation, ...cone.scoops.map((scoop) => scoop.conversation)])\n if (id !== null && !ids.has(id))\n throw new ImportError(`${cone.transcript ?? cone.folder} has no conversation ${id}`);\n }\n for (const name of transcripts) attached(manifest, name, transcriptIn(data, name) as Transcript);\n}\n\nasync function parse(opened: Opened, data: Map<string, Uint8Array>): Promise<Parsed> {\n for (const [name, bytes] of data)\n if (name.startsWith('memory/') || name === opened.manifest.gitconfig) textOf(bytes, name);\n related(opened.manifest, data);\n return { data, licks: await licksIn(opened, data), units: unitsOf(opened.manifest, data) };\n}\n\nfunction prior(state: Readonly<AgentsState>, origin: string, key: string) {\n const known = new Set([\n ...Object.keys(state.cones),\n ...Object.values(state.frozen ?? {}).map((item) => item.cone),\n ]);\n return Object.values(state.imports ?? {})\n .filter((item) => item.origin === origin && known.has(item.cones[key] as string))\n .sort((a, b) => b.at - a.at)\n .map((item) => ({ cone: item.cones[key] as string, tail: item.tails[key] as string }))[0];\n}\n\nasync function assign(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n again: boolean,\n date: string,\n context: Context\n) {\n const { agents } = deps;\n const origin = opened.manifest.producer.origin;\n let fresh = 0;\n for (const unit of units) {\n const before = again ? undefined : prior(agents.state(), origin, unit.key);\n if (!before) fresh += 1;\n if (!before) continue;\n unit.cone = before.cone;\n unit.fresh = false;\n unit.record = before.tail !== unit.tail;\n if (unit.record) unit.title = `${unit.title} (updated)`;\n if (agents.state().cones[before.cone]) unit.suffix = `.v6-${date}`;\n }\n const first = fresh\n ? await agents.update((_tx, doc) => {\n doc.next += fresh;\n return doc.next - fresh;\n }, context)\n : 0;\n const taken: Record<string, ScoopRecord> = { ...agents.state().scoops };\n let next = first;\n for (const unit of units) {\n if (unit.fresh) unit.cone = `cone-${next++}`;\n unit.home = homeOf(unit.cone);\n for (const scoop of unit.scoops) {\n scoop.folder = freeFolder({ scoops: taken }, scoop.name);\n taken[scoopId(scoop.folder)] = {} as ScoopRecord;\n }\n }\n}\n\nconst ZERO = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nfunction piMessage(\n message: V6Message,\n names: Map<string, string>,\n files: Map<string, string>\n): Message {\n const timestamp = Date.parse(message.timestamp);\n const texts = message.content.flatMap((part) => {\n if (part.type === 'text') return [{ type: 'text' as const, text: part.text }];\n if (part.type === 'tool-call') return [];\n const file = files.get(part.attachmentId);\n return [\n {\n type: 'text' as const,\n text: file ? `[Attached file: ${file}]` : '[An attachment SLICC 6 did not export]',\n },\n ];\n });\n if (message.role === 'user') return { role: 'user', content: texts, timestamp };\n const id = message.toolCallId as string;\n if (message.role === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: id,\n toolName: names.get(id) ?? 'tool',\n content: texts,\n isError: message.isError === true,\n timestamp,\n };\n const calls = message.content.flatMap((part) => {\n if (part.type !== 'tool-call') return [];\n names.set(part.id, part.name);\n const input = part.input;\n const object = typeof input === 'object' && input !== null && !Array.isArray(input);\n return [\n {\n type: 'toolCall' as const,\n id: part.id,\n name: part.name,\n arguments: (object ? input : { input }) as ToolCall['arguments'],\n },\n ];\n });\n const assistant: AssistantMessage = {\n role: 'assistant',\n content: [...texts, ...calls],\n api: message.model?.api ?? 'slicc-6',\n provider: message.model?.provider ?? 'slicc-6',\n model: message.model?.id ?? 'unknown',\n usage: (message.usage as typeof ZERO | undefined) ?? ZERO,\n stopReason: calls.length ? 'toolUse' : 'stop',\n timestamp,\n };\n return assistant;\n}\n\nexport function entriesOf(\n conversation: V6Conversation | undefined,\n files: Map<string, string>\n): EntryDraft[] {\n const names = new Map<string, string>();\n return (conversation?.messages ?? []).map((message) => ({\n kind: V6_KIND,\n data: { id: message.id },\n model: [piMessage(message, names, files)],\n }));\n}\n\nasync function conversationIn(\n tx: Tx,\n conversation: V6Conversation | undefined,\n unit: Unit,\n model: ModelRef | undefined\n) {\n const record = await tx.createConversation({ ownership: { kind: 'ownerless' } });\n if (model) await configure(tx, record.id, { model });\n for (const entry of entriesOf(conversation, unit.files)) await tx.appendEntry(record.id, entry);\n return record.id as number;\n}\n\nfunction modelOf(deps: ImportDeps, conversation: V6Conversation | undefined): string {\n const model = conversation?.messages.findLast((message) => message.model)?.model;\n if (!model) return '';\n return deps.catalog?.getModel(model.provider, model.id)?.name ?? `${model.provider}/${model.id}`;\n}\n\nasync function commit(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n at: number,\n context: Context\n) {\n const model = (await deps.agents.cone().agent(context)).model;\n const origin = opened.manifest.producer.origin;\n const last = TITLE_TURNS.at(-1) as number;\n return deps.agents.update(async (tx, doc) => {\n const made: string[] = [];\n for (const unit of units.filter((item) => item.record)) {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n const scoops: string[] = [];\n for (const scoop of unit.scoops) {\n const id = scoopId(scoop.folder);\n if (doc.scoops[id])\n throw new ImportError(`the scoop folder ${scoop.folder} was taken during the import`);\n const conversation = await conversationIn(tx, scoop.conversation, unit, model);\n doc.scoops[id] = {\n name: scoop.name,\n folder: scoop.folder,\n cone: unit.cone,\n conversation,\n anchor: 0,\n role: null,\n kind: 'async',\n parent: unit.cone,\n depth: 1,\n roots: null,\n created: null,\n dropped: null,\n gone: true,\n frozen: frozenId,\n title: scoop.name,\n titled: last,\n };\n scoops.push(id);\n }\n doc.frozen ??= {};\n doc.frozen[frozenId] = {\n cone: unit.cone,\n name: unit.name,\n conversation: await conversationIn(tx, unit.main, unit, model),\n title: unit.title,\n model: modelOf(deps, unit.main),\n messages: (unit.main?.messages ?? []).filter((message) => message.role !== 'tool-result')\n .length,\n frozenAt: unit.frozenAt,\n scoops,\n v6: { origin, key: unit.key, ...(unit.suffix ? { suffix: unit.suffix } : {}) },\n };\n made.push(frozenId);\n }\n doc.imports ??= {};\n doc.imports[opened.key] = {\n at,\n origin,\n cones: Object.fromEntries(units.map((unit) => [unit.key, unit.cone])),\n tails: Object.fromEntries(units.map((unit) => [unit.key, unit.tail])),\n };\n return made;\n }, context);\n}\n\nasync function storageRoom(): Promise<number | undefined> {\n const estimate = await globalThis.navigator?.storage?.estimate?.().catch(() => undefined);\n return estimate?.quota === undefined ? undefined : estimate.quota - (estimate.usage ?? 0);\n}\n\nasync function importOpened(\n deps: ImportDeps,\n opened: Opened,\n options: { again: boolean; signal: AbortSignal; show: Show },\n context: Context\n): Promise<ImportResult> {\n const now = (deps.now ?? Date.now)();\n const date = day(now);\n const { dir } = opened;\n const own = `${IMPORTS_DIR}/${opened.key.replace('#', '-part')}`;\n const stage = dir ?? own;\n const journal = new Journal(undoing(deps), own);\n const writer = new Writer(deps.env, context, options.signal, journal);\n const total = opened.manifest.files\n .filter((file) => !opened.sources.has(file.path))\n .reduce((sum, file) => sum + file.size, 0);\n const room = await (deps.room ?? storageRoom)();\n if (room !== undefined && room < (dir ? 1 : 2) * total)\n throw new ImportError('there is not enough free storage for this import');\n let keep = false;\n try {\n await writer.sh(\n `mkdir -p ${IMPORTS_DIR} && chmod 700 ${IMPORTS_DIR} && rm -rf ${quote(own)} && mkdir -p ${quote(own)}`\n );\n const data = await verify(opened, writer, stage, options.show);\n const parsed = await parse(opened, data);\n await assign(deps, opened, parsed.units, options.again, date, context);\n const cones = parsed.units.filter((unit) => unit.fresh).map((unit) => unit.cone);\n await journal.open({ key: opened.key, at: now, cones, source: dir }, context);\n const notes: Notes = {\n lines: [],\n skipped: [],\n shadowed: [],\n tasks: [],\n sprinkles: new Map(),\n crons: [],\n webhooks: [],\n placed: new Map(),\n };\n const run = {\n deps,\n opened,\n parsed,\n writer,\n stage,\n date,\n notes,\n show: options.show,\n fresh: new Map(),\n ready: new Set<Unit>(),\n at: new Map(opened.sources),\n };\n let made: string[];\n try {\n if (dir) await writer.remember([...opened.sources.values()]);\n await place(run);\n await settled(opened, run.at, writer);\n made = await commit(deps, opened, parsed.units, now, context);\n } catch (error) {\n keep = !(await writer.rollback());\n throw error;\n }\n keep =\n dir !== null &&\n !(await deps.env.remove(dir, { recursive: true, force: true }, BACKGROUND_CONTEXT)).ok;\n if (!keep) await journal.close().catch(() => undefined);\n const report = await reportOf(run, made).catch((error: Error) => `nowhere (${error.message})`);\n const split = accountsSplit(opened.manifest.providers, deps.providers);\n const { origin } = opened.manifest.producer;\n const settings = said(split.settings, split.lacking);\n return {\n done: true,\n preview: null,\n cones: made,\n report,\n text: said(`From ${hostOf(origin)}.`, split.signIn),\n line: `Imported ${plural(made.length, 'frozen cone')} from ${origin}${made.length ? `: ${made.join(', ')}` : ''}.\\n${settings ? `${settings}\\n` : ''}The report is ${report}.\\n`,\n error: null,\n };\n } finally {\n if (!keep) await deps.env.remove(own, { recursive: true, force: true }, BACKGROUND_CONTEXT);\n }\n}\n\nasync function sourceOf(\n deps: ImportDeps,\n source: ReadSource,\n context: Context\n): Promise<ZipSource> {\n if ('bytes' in source) return bytesSource(source.bytes);\n const { env } = deps;\n const real = await env.canonicalPath(source.path, context);\n const info = real.ok ? await env.fileInfo(real.value, context) : real;\n if (!info.ok) throw new ImportError(`can't read ${source.path}: ${info.error.message}`);\n if (info.value.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const file = await opfsFile(info.value.path, deps.opfs);\n if (file?.size === info.value.size) return blobSource(file);\n if (info.value.size > LIMITS.file)\n throw new ImportError(`${source.path} isn't on seven's own disk; copy the zip to /tmp first`);\n const read = await env.readBinaryFile(info.value.path, context);\n if (!read.ok) throw new ImportError(`can't read ${source.path}: ${read.error.message}`);\n return bytesSource(read.value);\n}\n\nfunction undoing(deps: ImportDeps): Undoing {\n return { env: deps.env, users: deps.users, state: () => deps.agents.state() };\n}\n\nexport interface Importer {\n readonly progress: ReplicatedState<ImportProgress>;\n readonly swept: Promise<void>;\n run(\n source: ImportSource,\n options: { again?: boolean; preview?: boolean },\n context: Context\n ): Promise<ImportResult>;\n cancel(): void;\n}\n\nexport const IDLE: ImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nexport function createImporter(deps: ImportDeps): Importer {\n const progress = replicatedState<ImportProgress>(IDLE);\n let sweeping = sweep(undoing(deps)).catch(() => [IMPORTS_DIR]);\n const swept = sweeping.then(() => undefined);\n let running: AbortController | undefined;\n const result = (fields: Partial<ImportResult>): ImportResult => ({\n done: false,\n preview: null,\n cones: [],\n report: null,\n text: '',\n line: '',\n error: null,\n ...fields,\n });\n return {\n progress,\n swept,\n cancel: () => running?.abort(),\n async run(source, options, context) {\n if (running) return result({ error: 'an import is already running' });\n const controller = new AbortController();\n running = controller;\n sweeping = sweeping.then(() => sweep(undoing(deps))).catch(() => [IMPORTS_DIR]);\n const kept = await sweeping;\n const moving = 'inPlace' in source;\n const writing = moving ? 'Moving' : 'Importing';\n const show: Show = (phase, done, total) =>\n progress.replace(BACKGROUND_CONTEXT, {\n phase,\n done,\n total,\n text: `${phase === 'checking' ? 'Checking' : writing} ${done} of ${total}`,\n });\n let upload: { path: string } | undefined;\n try {\n upload = uploaded(source);\n const opened = moving\n ? await openDirectory(deps, source.inPlace, context)\n : await openProfile(await sourceOf(deps, upload ?? (source as ReadSource), context));\n const preview = await previewOf(opened, deps.agents.state(), deps.providers);\n if (options.preview) {\n const journal = new Journal(undoing(deps), IMPORTS_DIR);\n const writer = new Writer(deps.env, context, controller.signal, journal);\n await parse(opened, await verify(opened, writer, null, show));\n progress.replace(BACKGROUND_CONTEXT, IDLE);\n return result({ preview, text: preview.text, line: `${preview.line}\\n` });\n }\n if (preview.already !== null && !options.again)\n return result({\n preview,\n text: `Already imported on ${day(preview.already)}.`,\n line: `Already imported on ${day(preview.already)}; freezer import --again makes fresh copies.\\n`,\n });\n if (kept.length)\n throw new ImportError(\n `an earlier import couldn't be rolled back completely; its journal is in ${kept.join(', ')}`\n );\n const done = await importOpened(\n deps,\n opened,\n { again: options.again === true, signal: controller.signal, show },\n context\n );\n progress.replace(BACKGROUND_CONTEXT, { ...progress.value, phase: 'done', text: done.text });\n return { ...done, preview };\n } catch (error) {\n const message =\n error instanceof ImportError\n ? error.message\n : `the import failed: ${(error as Error).message}`;\n progress.replace(BACKGROUND_CONTEXT, { phase: 'failed', done: 0, total: 0, text: message });\n return result({ error: message });\n } finally {\n running = undefined;\n if (upload) await deps.env.remove(upload.path, { force: true }, BACKGROUND_CONTEXT);\n }\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { type Context, type ReplicatedState, replicatedState } from '@earendil-works/chord';\nimport { BACKGROUND_CONTEXT } from '@earendil-works/chord/context';\nimport type { AssistantMessage, Message, ToolCall } from '@earendil-works/pi-ai';\nimport { configure, type EntryDraft, type ModelRef, type Tx } from '@earendil-works/pi-durable';\nimport type { ExecutionEnv } from '@earendil-works/pi-durable/env';\nimport { type Agents, type AgentsState, freeFolder, type ScoopRecord, scoopId } from '../agents.ts';\nimport { homeOf } from '../kernel/accounts.ts';\nimport { quote } from '../kernel/env.ts';\nimport type { KernelUsers } from '../kernel/users.ts';\nimport type { Layout } from '../layout.ts';\nimport { opfsFile } from '../opfs-pool.ts';\nimport { TITLE_TURNS } from '../titles/extension.ts';\nimport { IMPORTS_DIR } from './paths.ts';\nimport { Journal, sweep, type Undoing } from './v6-journal.ts';\nimport { type Notes, place, reportOf } from './v6-place.ts';\nimport {\n checkLicks,\n checkManifest,\n checkTranscript,\n DIRECTORY_ROOT,\n type Licks,\n type Manifest,\n type Transcript,\n type V6Conversation,\n type V6Message,\n} from './v6-schema.ts';\nimport { Writer } from './v6-write.ts';\nimport {\n blobSource,\n bytesSource,\n ImportError,\n isLink,\n readEntry,\n type ZipEntry,\n type ZipSource,\n zipEntries,\n} from './zip.ts';\n\nexport const V6_KIND = 'slicc.v6';\nconst MiB = 1024 ** 2;\nexport const LIMITS = {\n archive: 2048 * MiB,\n entries: 60_000,\n file: 256 * MiB,\n transcript: 64 * MiB,\n total: 4096 * MiB,\n ratio: 200,\n};\n\nexport type ImportProgress = {\n phase: 'idle' | 'checking' | 'writing' | 'done' | 'failed';\n done: number;\n total: number;\n text: string;\n};\n\nexport interface ImportPreview {\n exportId: string;\n origin: string;\n createdAt: string;\n cones: number;\n scoops: number;\n frozen: number;\n bytes: number;\n skills: string[];\n crons: number;\n webhooks: number;\n flagged: string[];\n providers: string[];\n mounts: string[];\n already: number | null;\n text: string;\n line: string;\n}\n\nexport interface ImportResult {\n done: boolean;\n preview: ImportPreview | null;\n cones: string[];\n report: string | null;\n text: string;\n line: string;\n error: string | null;\n}\n\ntype ReadSource = { path: string } | { bytes: Uint8Array };\n\nexport type ImportSource = ReadSource | { upload: string } | { inPlace: string };\n\nconst UPLOAD = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const uploadPath = (id: string) => `${IMPORTS_DIR}/upload-${id}.zip`;\n\nfunction uploaded(source: ImportSource): { path: string } | undefined {\n if (!('upload' in source)) return undefined;\n if (!UPLOAD.test(source.upload)) throw new ImportError(\"that upload isn't one of the agent's\");\n return { path: uploadPath(source.upload) };\n}\n\nexport interface ImportDeps {\n agents: Agents;\n env: ExecutionEnv;\n layout: Layout;\n memoryHome: string;\n providers?: readonly Account[];\n catalog?: { getModel(provider: string, id: string): { name: string } | undefined };\n users?: Pick<KernelUsers, 'add' | 'remove'>;\n envOf?: (cone: string) => Promise<ExecutionEnv | undefined>;\n opfs?: () => Promise<FileSystemDirectoryHandle>;\n room?: () => Promise<number | undefined>;\n now?: () => number;\n}\n\nexport type Opened = {\n manifest: Manifest;\n key: string;\n read(name: string): Promise<Uint8Array>;\n dir: string | null;\n sources: Map<string, string>;\n};\n\nexport type Where =\n | { kind: 'data' | 'skip' | 'attachment' }\n | { kind: 'cone' | 'scoop' | 'home-user' | 'skill' | 'sprinkle'; folder: string; rest: string };\n\nexport type Scoop = {\n name: string;\n six: string | null;\n folder: string;\n conversation?: V6Conversation;\n};\n\nexport type Unit = {\n key: string;\n name: string;\n title: string;\n six: string | null;\n memory: string | null;\n doc?: Transcript;\n main?: V6Conversation;\n scoops: Scoop[];\n frozenAt: number;\n tail: string;\n cone: string;\n fresh: boolean;\n record: boolean;\n suffix: string;\n home: string;\n roots: Set<string>;\n files: Map<string, string>;\n};\n\nexport type Parsed = { data: Map<string, Uint8Array>; licks: Licks; units: Unit[] };\n\nexport const day = (at: number | string) => new Date(at).toISOString().slice(0, 10);\nconst plural = (count: number, word: string) => `${count} ${word}${count === 1 ? '' : 's'}`;\nconst decoder = new TextDecoder('utf-8', { fatal: true });\n\nexport function textOf(bytes: Uint8Array, name: string): string {\n try {\n return decoder.decode(bytes);\n } catch {\n throw new ImportError(`${name} is not UTF-8 text`);\n }\n}\n\nfunction json(bytes: Uint8Array, name: string): unknown {\n const text = textOf(bytes, name);\n try {\n return JSON.parse(text);\n } catch {\n throw new ImportError(`${name} is not JSON`);\n }\n}\n\nconst safe = (name: string) =>\n !/^\\/|^[A-Za-z]:|\\\\|\\0/.test(name) &&\n name.split('/').every((part) => part !== '' && part !== '.' && part !== '..');\n\nconst HOOKS = /(^|\\/)\\.git\\/hooks\\//;\n\nexport function whereOf(manifest: Manifest, name: string): Where {\n const where = placeOf(manifest, name);\n const tree = where.kind === 'cone' || where.kind === 'scoop' || where.kind === 'home-user';\n return tree && HOOKS.test(name) ? { kind: 'skip' } : where;\n}\n\nfunction placeOf(manifest: Manifest, name: string): Where {\n const [top = '', second = '', ...more] = name.split('/');\n const rest = more.join('/');\n if (\n ['transcripts', 'frozen', 'memory'].includes(top) ||\n [manifest.licks, manifest.gitconfig].includes(name)\n )\n return { kind: 'data' };\n if (top === 'attachments' && /^[0-9a-f]{64}$/.test(second) && !rest)\n return { kind: 'attachment' };\n if (top === 'files' && second === 'home-user' && rest)\n return { kind: 'home-user', folder: '', rest };\n const folder = more[0] as string;\n const inner = more.slice(1).join('/');\n if (\n top === 'files' &&\n second === 'cones' &&\n inner &&\n manifest.cones.some((cone) => cone.folder === folder)\n )\n return { kind: 'cone', folder, rest: inner };\n const scoops = manifest.cones.flatMap((cone) => cone.scoops);\n if (\n top === 'files' &&\n second === 'scoops' &&\n inner &&\n scoops.some((scoop) => scoop.folder === folder)\n )\n return { kind: 'scoop', folder, rest: inner };\n const listed = top === 'skills' ? manifest.skills : top === 'sprinkles' ? manifest.sprinkles : [];\n if (rest && listed.some((item) => item.name === second))\n return { kind: top === 'skills' ? 'skill' : 'sprinkle', folder: second, rest };\n throw new ImportError(`${name} has no place in a SLICC 6 profile`);\n}\n\nfunction scan(list: readonly ZipEntry[], archive: number): Map<string, ZipEntry> {\n const entries = new Map<string, ZipEntry>();\n let total = 0;\n for (const entry of list) {\n if (!safe(entry.name))\n throw new ImportError(`refused the entry name ${JSON.stringify(entry.name)}`);\n if (isLink(entry)) throw new ImportError(`${entry.name} is a symlink`);\n if (entries.has(entry.name)) throw new ImportError(`${entry.name} is in the zip twice`);\n const big = entry === list[0] || /^(transcripts|frozen)\\//.test(entry.name);\n const cap = big ? LIMITS.transcript : LIMITS.file;\n if (entry.size > cap) throw new ImportError(`${entry.name} is over ${cap / MiB} MiB`);\n total += entry.size;\n entries.set(entry.name, entry);\n }\n if (total > LIMITS.total) throw new ImportError('the files add up to over 4 GiB');\n if (total > LIMITS.ratio * archive)\n throw new ImportError('the zip expands over 200:1, like a zip bomb');\n return entries;\n}\n\nexport async function openProfile(source: ZipSource): Promise<Opened> {\n if (source.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const list = await zipEntries(source);\n if (list.length > LIMITS.entries)\n throw new ImportError(`the zip has over ${LIMITS.entries} entries`);\n if (list[0]?.name !== 'manifest.json')\n throw new ImportError('manifest.json must be the first entry');\n const entries = scan(list, source.size);\n const manifest = checkManifest(json(await readEntry(source, list[0]), 'manifest.json'));\n const listed = new Set<string>();\n for (const file of manifest.files) {\n if (entries.get(file.path)?.size !== file.size || file.path === 'manifest.json')\n throw new ImportError(\n `${file.path} is in the manifest but not in the zip, or not at that size`\n );\n listed.add(file.path);\n }\n for (const name of entries.keys()) {\n if (name === 'manifest.json') continue;\n if (!listed.has(name)) throw new ImportError(`${name} is not listed in the manifest`);\n whereOf(manifest, name);\n }\n const { exportId, part } = manifest;\n return {\n manifest,\n key: part ? `${exportId}#${part.index}` : exportId,\n read: (name) => {\n const entry = entries.get(name);\n if (!entry) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n return readEntry(source, entry);\n },\n dir: null,\n sources: new Map(),\n };\n}\n\nconst DIRECTORY = new RegExp(\n `^${DIRECTORY_ROOT}/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$`\n);\n\nasync function infoOf(deps: ImportDeps, path: string, context: Context) {\n const real = await deps.env.canonicalPath(path, context);\n if (!real.ok) throw new ImportError(`${path} is missing`);\n if (real.value !== path) throw new ImportError(`${path} leads through a symlink`);\n const info = await deps.env.fileInfo(path, context);\n if (!info.ok) throw new ImportError(`${path} is missing`);\n return info.value;\n}\n\nasync function walk(\n deps: ImportDeps,\n dir: string,\n context: Context,\n rel = '',\n found = new Map<string, number>()\n) {\n const listed = await deps.env.listDir(rel ? `${dir}/${rel}` : dir, context);\n if (!listed.ok) throw new ImportError(`can't read ${dir}: ${listed.error.message}`);\n for (const item of listed.value) {\n const name = rel ? `${rel}/${item.name}` : item.name;\n if (item.kind === 'directory') await walk(deps, dir, context, name, found);\n else if (item.kind === 'file') found.set(name, item.size);\n else throw new ImportError(`${name} is a symlink`);\n if (found.size > LIMITS.entries)\n throw new ImportError(`${dir} has over ${LIMITS.entries} entries`);\n }\n return found;\n}\n\nasync function sourcesOf(\n deps: ImportDeps,\n dir: string,\n manifest: Manifest,\n found: Map<string, number>,\n context: Context\n) {\n if (manifest.files.length > LIMITS.entries)\n throw new ImportError(`the manifest lists over ${LIMITS.entries} files`);\n if (manifest.files.reduce((sum, file) => sum + file.size, 0) > LIMITS.total)\n throw new ImportError('the files add up to over 4 GiB');\n const sources = new Map<string, string>();\n for (const file of manifest.files) {\n if (!safe(file.path))\n throw new ImportError(`refused the entry name ${JSON.stringify(file.path)}`);\n whereOf(manifest, file.path);\n const cap = /^(transcripts|frozen)\\//.test(file.path) ? LIMITS.transcript : LIMITS.file;\n if (file.size > cap) throw new ImportError(`${file.path} is over ${cap / MiB} MiB`);\n if (file.source === undefined) {\n if (found.get(file.path) !== file.size)\n throw new ImportError(\n `${file.path} is in the manifest but not in ${dir}, or not at that size`\n );\n continue;\n }\n if (found.has(file.path))\n throw new ImportError(`${file.path} is both in ${dir} and left at ${file.source}`);\n const info = await infoOf(deps, file.source, context);\n if (info.kind !== 'file' || info.size !== file.size)\n throw new ImportError(\n `${file.source} isn't the file ${file.path} names, or not at that size`\n );\n sources.set(file.path, file.source);\n }\n return sources;\n}\n\nexport async function openDirectory(\n deps: ImportDeps,\n dir: string,\n context: Context\n): Promise<Opened> {\n const id = DIRECTORY.exec(dir)?.[1];\n if (!id) throw new ImportError(`${dir} isn't a SLICC 6 upgrade in ${DIRECTORY_ROOT}`);\n await infoOf(deps, dir, context);\n const found = await walk(deps, dir, context);\n const head = found.get('manifest.json');\n if (head === undefined) throw new ImportError(`${dir} has no manifest.json`);\n if (head > LIMITS.transcript) throw new ImportError('manifest.json is over 64 MiB');\n const read = async (path: string, name: string) => {\n const got = await deps.env.readBinaryFile(path, context);\n if (!got.ok) throw new ImportError(`can't read ${name}: ${got.error.message}`);\n return got.value;\n };\n const manifest = checkManifest(\n json(await read(`${dir}/manifest.json`, 'manifest.json'), 'manifest.json'),\n 2\n );\n if (manifest.exportId !== id)\n throw new ImportError(`${dir} holds the export ${manifest.exportId}`);\n const sources = await sourcesOf(deps, dir, manifest, found, context);\n const listed = new Set(manifest.files.map((file) => file.path));\n for (const name of found.keys())\n if (name !== 'manifest.json' && !listed.has(name))\n throw new ImportError(`${name} is not listed in the manifest`);\n return {\n manifest,\n key: manifest.exportId,\n read: (name) => read(sources.get(name) ?? `${dir}/${name}`, name),\n dir,\n sources,\n };\n}\n\nconst noLicks: Licks = { crontasks: [], tasks: [], webhooks: [] };\n\nasync function licksIn(opened: Opened, data?: Map<string, Uint8Array>): Promise<Licks> {\n const name = opened.manifest.licks;\n if (!name) return noLicks;\n return checkLicks(json(data?.get(name) ?? (await opened.read(name)), name));\n}\n\nconst ACCOUNTS: Record<string, string> = {\n 'bedrock-camp': 'amazon-bedrock',\n bedrock: 'amazon-bedrock',\n};\n\nexport function accountsOf(providers: readonly string[]): string[] {\n return [...new Set(providers.map((name) => ACCOUNTS[name] ?? name))];\n}\n\nconst UNITS = [\n [1024 ** 3, 'GB'],\n [1024 ** 2, 'MB'],\n [1024, 'KB'],\n] as const;\n\nexport type Account = { readonly id: string; readonly name?: string | undefined };\n\nconst NAMES: Record<string, string> = {\n anthropic: 'Anthropic',\n openai: 'OpenAI',\n 'github-copilot': 'GitHub Copilot',\n google: 'Google',\n azure: 'Azure',\n 'azure-openai': 'Azure OpenAI',\n 'azure-ai-foundry': 'Azure AI Foundry',\n 'amazon-bedrock': 'Amazon Bedrock',\n adobe: 'Adobe',\n openrouter: 'OpenRouter',\n mistral: 'Mistral',\n groq: 'Groq',\n xai: 'xAI',\n deepseek: 'DeepSeek',\n 'local-llm': 'Local LLM',\n};\n\nexport function listed(names: readonly string[]): string {\n return names.length > 1 ? `${names.slice(0, -1).join(', ')} and ${names.at(-1)}` : names.join('');\n}\n\nexport function accountsSplit(providers: readonly string[], known?: readonly Account[]) {\n const accounts = accountsOf(providers);\n const ids = new Map((known ?? []).map((account) => [account.id, account.name]));\n const again = known ? accounts.filter((id) => ids.has(id)) : accounts;\n const missing = accounts.filter((id) => !again.includes(id));\n const nameOf = (id: string) => ids.get(id) || NAMES[id] || id;\n const lacking = missing.length\n ? `SLICC 7 has no accounts for ${listed(missing.map(nameOf))}.`\n : '';\n const settings = again.length ? `Re-enter in Settings: ${listed(again.map(nameOf))}.` : '';\n const signIn = again.length\n ? `Sign in to ${listed(again.map(nameOf))} again before you thaw them.`\n : '';\n return { again, missing, nameOf, lacking, settings, signIn };\n}\n\nconst said = (...parts: string[]) => parts.filter(Boolean).join(' ');\n\nconst words = (at: string) =>\n new Date(at).toLocaleDateString('en-GB', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n timeZone: 'UTC',\n });\n\nconst hostOf = (origin: string) => (URL.canParse(origin) ? new URL(origin).host : origin);\n\nexport async function previewOf(\n opened: Opened,\n state: Readonly<AgentsState>,\n known?: readonly Account[]\n): Promise<ImportPreview> {\n const { manifest } = opened;\n const licks = await licksIn(opened);\n const bytes = manifest.files\n .filter((file) => file.path.startsWith('files/'))\n .reduce((sum, file) => sum + file.size, 0);\n const scoops = manifest.cones.reduce((sum, cone) => sum + cone.scoops.length, 0);\n const mounts = manifest.skipped\n .filter((item) => item.reason === 'mount')\n .map((item) => item.path.replace(/^\\/mnt\\//, ''));\n const crons =\n licks.crontasks.length + licks.tasks.filter((task) => task.scheduleType === 'cron').length;\n const host = hostOf(manifest.producer.origin);\n const split = accountsSplit(manifest.providers, known);\n const [at, unit] = UNITS.find(([at]) => bytes >= at) ?? (UNITS[2] as (typeof UNITS)[2]);\n const size = `${(bytes / at).toFixed(1)} ${unit}`;\n const parts = [\n plural(manifest.cones.length, 'cone'),\n plural(scoops, 'scoop'),\n plural(manifest.frozen.length, 'frozen session'),\n `${size} of files`,\n `${plural(manifest.skills.length, 'skill')} (for every agent)`,\n `${plural(crons, 'cron')} (imported off)`,\n `${plural(licks.webhooks.length, 'webhook')} (new URLs needed)`,\n `${plural(manifest.flagged.length, 'credential-like file')} to review`,\n ];\n return {\n exportId: manifest.exportId,\n origin: manifest.producer.origin,\n createdAt: manifest.createdAt,\n cones: manifest.cones.length,\n scoops,\n frozen: manifest.frozen.length,\n bytes,\n skills: manifest.skills.map((skill) => skill.name),\n crons,\n webhooks: licks.webhooks.length,\n flagged: manifest.flagged.map((item) => item.path),\n providers: split.again,\n mounts,\n already: state.imports?.[opened.key]?.at ?? null,\n text: said(\n `SLICC 6 profile from ${host}, exported ${words(manifest.createdAt)}.`,\n split.lacking\n ),\n line: said(\n `SLICC 6 profile from ${host}, exported ${day(manifest.createdAt)}: ${parts.join(', ')}.`,\n split.settings,\n split.lacking,\n `Not imported: ${plural(mounts.length, 'mount')}.`\n ),\n };\n}\n\nasync function sha256(bytes: Uint8Array): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n}\n\ntype Show = (phase: ImportProgress['phase'], done: number, total: number) => void;\n\nexport async function settled(\n opened: Opened,\n at: ReadonlyMap<string, string>,\n writer: Writer\n): Promise<void> {\n for (const file of opened.manifest.files) {\n const from = opened.sources.get(file.path);\n const path = at.get(file.path);\n if (!from || !path || path === from) continue;\n const read = await writer.env.readBinaryFile(path, writer.context);\n const kept =\n read.ok &&\n read.value.length === file.size &&\n (await sha256(read.value)) === file.sha256.toLowerCase();\n writer.check();\n if (!kept)\n throw new ImportError(\n `${from} changed while it moved, so a SLICC 6 tab may still be writing; close every SLICC 6 tab and import again`\n );\n }\n}\n\nasync function verify(opened: Opened, writer: Writer, stage: string | null, show: Show) {\n const data = new Map<string, Uint8Array>();\n const { files } = opened.manifest;\n for (const [at, file] of files.entries()) {\n writer.check();\n const bytes = await opened.read(file.path);\n if ((await sha256(bytes)) !== file.sha256.toLowerCase())\n throw new ImportError(`${file.path} looks damaged (its checksum doesn't match)`);\n const where = whereOf(opened.manifest, file.path);\n if (where.kind === 'data') data.set(file.path, bytes);\n else if (where.kind !== 'skip' && stage && !opened.dir)\n await writer.put(`${stage}/${file.path}`, bytes, true);\n show('checking', at + 1, files.length);\n }\n return data;\n}\n\nfunction transcriptIn(data: Map<string, Uint8Array>, name: string | null): Transcript | undefined {\n if (!name) return undefined;\n const bytes = data.get(name);\n if (!bytes) throw new ImportError(`${name} is named in the manifest but not in the zip`);\n const value = json(bytes, name);\n try {\n return checkTranscript(value);\n } catch (error) {\n throw new ImportError(`${name}: ${(error as Error).message}`);\n }\n}\n\nfunction draft(\n fields: Pick<Unit, 'key' | 'name' | 'title' | 'six' | 'memory' | 'scoops'> & {\n doc?: Transcript;\n main?: V6Conversation;\n },\n when: (string | null | undefined)[],\n created: string\n): Unit {\n const last = fields.main?.messages.at(-1)?.timestamp;\n const frozenAt = [...when, last, created]\n .map((value) => Date.parse(value ?? ''))\n .find((at) => !Number.isNaN(at)) as number;\n const tail = (fields.doc?.conversations ?? [])\n .map((item) => item.messages.at(-1)?.id ?? '')\n .join(',');\n return {\n ...fields,\n frozenAt,\n tail,\n cone: '',\n fresh: true,\n record: true,\n suffix: '',\n home: '',\n roots: new Set(),\n files: new Map(),\n };\n}\n\nexport function unitsOf(manifest: Manifest, data: Map<string, Uint8Array>): Unit[] {\n const cones = manifest.cones.map((cone) => {\n const doc = transcriptIn(data, cone.transcript);\n const all = doc?.conversations ?? [];\n const main =\n all.find((item) => item.id === cone.conversation) ?? all.find((item) => item.kind === 'cone');\n const scoops = cone.scoops.map((scoop) => ({\n name: scoop.name,\n six: scoop.folder,\n folder: '',\n conversation:\n all.find((item) => item.id === scoop.conversation) ??\n all.find((item) => item.kind === 'scoop' && item.folder === scoop.folder),\n }));\n const title = doc?.session.title || cone.name;\n return draft(\n {\n key: cone.key,\n name: cone.name,\n title,\n six: cone.folder,\n memory: cone.memory,\n doc,\n main,\n scoops,\n },\n [doc?.session.updatedAt],\n manifest.createdAt\n );\n });\n const frozen = manifest.frozen.map((item) => {\n const doc = transcriptIn(data, item.transcript) as Transcript;\n const [main, ...rest] = [...doc.conversations].sort(\n (a, b) => Number(b.kind === 'cone') - Number(a.kind === 'cone')\n );\n const title = item.title || doc.session.title;\n const scoops = rest.map((conversation) => ({\n name: conversation.name,\n six: null,\n folder: '',\n conversation,\n }));\n const when = [item.frozenAt, doc.session.frozenAt, doc.session.updatedAt];\n return draft(\n { key: `frozen:${item.id}`, name: title, title, six: null, memory: null, doc, main, scoops },\n when,\n manifest.createdAt\n );\n });\n return [...cones, ...frozen];\n}\n\nfunction present(data: Map<string, Uint8Array>, name: string | null | undefined) {\n if (name && !data.has(name))\n throw new ImportError(`${name} is named in the manifest but not in the zip`);\n}\n\nfunction attached(manifest: Manifest, name: string, doc: Transcript) {\n const files = new Map(manifest.files.map((file) => [file.path, file]));\n for (const item of doc.attachments) {\n const file = files.get(item.path);\n const same =\n file !== undefined &&\n file.size === item.byteLength &&\n file.sha256.toLowerCase() === item.sha256.toLowerCase();\n if (item.present && !(item.path.startsWith('attachments/') && same))\n throw new ImportError(`${name}: attachment ${item.id} doesn't match ${item.path}`);\n }\n}\n\nfunction related(manifest: Manifest, data: Map<string, Uint8Array>) {\n const transcripts = [\n ...manifest.cones.map((cone) => cone.transcript),\n ...manifest.frozen.map((item) => item.transcript),\n ].filter((name): name is string => name !== null);\n const twice = transcripts.find((name, at) => transcripts.indexOf(name) !== at);\n if (twice) throw new ImportError(`${twice} is named twice in the manifest`);\n for (const name of [...manifest.cones.map((cone) => cone.memory), manifest.gitconfig])\n present(data, name);\n for (const [kind, items] of [\n ['skills', manifest.skills],\n ['sprinkles', manifest.sprinkles],\n ] as const)\n for (const item of items)\n if (\n item.path !== `${kind}/${item.name}/` ||\n !manifest.files.some((file) => file.path.startsWith(item.path))\n )\n throw new ImportError(`${item.path} is named in the manifest but has no files`);\n for (const cone of manifest.cones) {\n const doc = transcriptIn(data, cone.transcript);\n const ids = new Set(doc?.conversations.map((item) => item.id));\n for (const id of [cone.conversation, ...cone.scoops.map((scoop) => scoop.conversation)])\n if (id !== null && !ids.has(id))\n throw new ImportError(`${cone.transcript ?? cone.folder} has no conversation ${id}`);\n }\n for (const name of transcripts) attached(manifest, name, transcriptIn(data, name) as Transcript);\n}\n\nasync function parse(opened: Opened, data: Map<string, Uint8Array>): Promise<Parsed> {\n for (const [name, bytes] of data)\n if (name.startsWith('memory/') || name === opened.manifest.gitconfig) textOf(bytes, name);\n related(opened.manifest, data);\n return { data, licks: await licksIn(opened, data), units: unitsOf(opened.manifest, data) };\n}\n\nfunction prior(state: Readonly<AgentsState>, origin: string, key: string) {\n const known = new Set([\n ...Object.keys(state.cones),\n ...Object.values(state.frozen ?? {}).map((item) => item.cone),\n ]);\n return Object.values(state.imports ?? {})\n .filter((item) => item.origin === origin && known.has(item.cones[key] as string))\n .sort((a, b) => b.at - a.at)\n .map((item) => ({ cone: item.cones[key] as string, tail: item.tails[key] as string }))[0];\n}\n\nasync function assign(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n again: boolean,\n date: string,\n context: Context\n) {\n const { agents } = deps;\n const origin = opened.manifest.producer.origin;\n let fresh = 0;\n for (const unit of units) {\n const before = again ? undefined : prior(agents.state(), origin, unit.key);\n if (!before) fresh += 1;\n if (!before) continue;\n unit.cone = before.cone;\n unit.fresh = false;\n unit.record = before.tail !== unit.tail;\n if (unit.record) unit.title = `${unit.title} (updated)`;\n if (agents.state().cones[before.cone]) unit.suffix = `.v6-${date}`;\n }\n const first = fresh\n ? await agents.update((_tx, doc) => {\n doc.next += fresh;\n return doc.next - fresh;\n }, context)\n : 0;\n const taken: Record<string, ScoopRecord> = { ...agents.state().scoops };\n let next = first;\n for (const unit of units) {\n if (unit.fresh) unit.cone = `cone-${next++}`;\n unit.home = homeOf(unit.cone);\n for (const scoop of unit.scoops) {\n scoop.folder = freeFolder({ scoops: taken }, scoop.name);\n taken[scoopId(scoop.folder)] = {} as ScoopRecord;\n }\n }\n}\n\nconst ZERO = {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n};\n\nfunction piMessage(\n message: V6Message,\n names: Map<string, string>,\n files: Map<string, string>\n): Message {\n const timestamp = Date.parse(message.timestamp);\n const texts = message.content.flatMap((part) => {\n if (part.type === 'text') return [{ type: 'text' as const, text: part.text }];\n if (part.type === 'tool-call') return [];\n const file = files.get(part.attachmentId);\n return [\n {\n type: 'text' as const,\n text: file ? `[Attached file: ${file}]` : '[An attachment SLICC 6 did not export]',\n },\n ];\n });\n if (message.role === 'user') return { role: 'user', content: texts, timestamp };\n const id = message.toolCallId as string;\n if (message.role === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: id,\n toolName: names.get(id) ?? 'tool',\n content: texts,\n isError: message.isError === true,\n timestamp,\n };\n const calls = message.content.flatMap((part) => {\n if (part.type !== 'tool-call') return [];\n names.set(part.id, part.name);\n const input = part.input;\n const object = typeof input === 'object' && input !== null && !Array.isArray(input);\n return [\n {\n type: 'toolCall' as const,\n id: part.id,\n name: part.name,\n arguments: (object ? input : { input }) as ToolCall['arguments'],\n },\n ];\n });\n const assistant: AssistantMessage = {\n role: 'assistant',\n content: [...texts, ...calls],\n api: message.model?.api ?? 'slicc-6',\n provider: message.model?.provider ?? 'slicc-6',\n model: message.model?.id ?? 'unknown',\n usage: (message.usage as typeof ZERO | undefined) ?? ZERO,\n stopReason: calls.length ? 'toolUse' : 'stop',\n timestamp,\n };\n return assistant;\n}\n\nexport function entriesOf(\n conversation: V6Conversation | undefined,\n files: Map<string, string>\n): EntryDraft[] {\n const names = new Map<string, string>();\n return (conversation?.messages ?? []).map((message) => ({\n kind: V6_KIND,\n data: { id: message.id },\n model: [piMessage(message, names, files)],\n }));\n}\n\nasync function conversationIn(\n tx: Tx,\n conversation: V6Conversation | undefined,\n unit: Unit,\n model: ModelRef | undefined\n) {\n const record = await tx.createConversation({ ownership: { kind: 'ownerless' } });\n if (model) await configure(tx, record.id, { model });\n for (const entry of entriesOf(conversation, unit.files)) await tx.appendEntry(record.id, entry);\n return record.id as number;\n}\n\nfunction modelOf(deps: ImportDeps, conversation: V6Conversation | undefined): string {\n const model = conversation?.messages.findLast((message) => message.model)?.model;\n if (!model) return '';\n return deps.catalog?.getModel(model.provider, model.id)?.name ?? `${model.provider}/${model.id}`;\n}\n\nasync function commit(\n deps: ImportDeps,\n opened: Opened,\n units: Unit[],\n at: number,\n context: Context\n) {\n const model = (await deps.agents.cone().agent(context)).model;\n const origin = opened.manifest.producer.origin;\n const last = TITLE_TURNS.at(-1) as number;\n return deps.agents.update(async (tx, doc) => {\n const made: string[] = [];\n for (const unit of units.filter((item) => item.record)) {\n const frozenId = `frozen-${doc.frozenNext ?? 1}`;\n doc.frozenNext = (doc.frozenNext ?? 1) + 1;\n const scoops: string[] = [];\n for (const scoop of unit.scoops) {\n const id = scoopId(scoop.folder);\n if (doc.scoops[id])\n throw new ImportError(`the scoop folder ${scoop.folder} was taken during the import`);\n const conversation = await conversationIn(tx, scoop.conversation, unit, model);\n doc.scoops[id] = {\n name: scoop.name,\n folder: scoop.folder,\n cone: unit.cone,\n conversation,\n anchor: 0,\n role: null,\n kind: 'async',\n parent: unit.cone,\n depth: 1,\n roots: null,\n created: null,\n dropped: null,\n gone: true,\n frozen: frozenId,\n title: scoop.name,\n titled: last,\n };\n scoops.push(id);\n }\n doc.frozen ??= {};\n doc.frozen[frozenId] = {\n cone: unit.cone,\n name: unit.name,\n conversation: await conversationIn(tx, unit.main, unit, model),\n title: unit.title,\n model: modelOf(deps, unit.main),\n messages: (unit.main?.messages ?? []).filter((message) => message.role !== 'tool-result')\n .length,\n frozenAt: unit.frozenAt,\n scoops,\n v6: { origin, key: unit.key, ...(unit.suffix ? { suffix: unit.suffix } : {}) },\n };\n made.push(frozenId);\n }\n doc.imports ??= {};\n doc.imports[opened.key] = {\n at,\n origin,\n cones: Object.fromEntries(units.map((unit) => [unit.key, unit.cone])),\n tails: Object.fromEntries(units.map((unit) => [unit.key, unit.tail])),\n };\n return made;\n }, context);\n}\n\nasync function storageRoom(): Promise<number | undefined> {\n const estimate = await globalThis.navigator?.storage?.estimate?.().catch(() => undefined);\n return estimate?.quota === undefined ? undefined : estimate.quota - (estimate.usage ?? 0);\n}\n\nasync function importOpened(\n deps: ImportDeps,\n opened: Opened,\n options: { again: boolean; signal: AbortSignal; show: Show },\n context: Context\n): Promise<ImportResult> {\n const now = (deps.now ?? Date.now)();\n const date = day(now);\n const { dir } = opened;\n const own = `${IMPORTS_DIR}/${opened.key.replace('#', '-part')}`;\n const stage = dir ?? own;\n const journal = new Journal(undoing(deps), own);\n const writer = new Writer(deps.env, context, options.signal, journal);\n const total = opened.manifest.files\n .filter((file) => !opened.sources.has(file.path))\n .reduce((sum, file) => sum + file.size, 0);\n const room = await (deps.room ?? storageRoom)();\n if (room !== undefined && room < (dir ? 1 : 2) * total)\n throw new ImportError('there is not enough free storage for this import');\n let keep = false;\n try {\n await writer.sh(\n `mkdir -p ${IMPORTS_DIR} && chmod 700 ${IMPORTS_DIR} && rm -rf ${quote(own)} && mkdir -p ${quote(own)}`\n );\n const data = await verify(opened, writer, stage, options.show);\n const parsed = await parse(opened, data);\n await assign(deps, opened, parsed.units, options.again, date, context);\n const cones = parsed.units.filter((unit) => unit.fresh).map((unit) => unit.cone);\n await journal.open({ key: opened.key, at: now, cones, source: dir }, context);\n const notes: Notes = {\n lines: [],\n skipped: [],\n shadowed: [],\n tasks: [],\n sprinkles: new Map(),\n crons: [],\n webhooks: [],\n placed: new Map(),\n };\n const run = {\n deps,\n opened,\n parsed,\n writer,\n stage,\n date,\n notes,\n show: options.show,\n fresh: new Map(),\n ready: new Set<Unit>(),\n at: new Map(opened.sources),\n };\n let made: string[];\n try {\n if (dir) await writer.remember([...opened.sources.values()]);\n await place(run);\n await settled(opened, run.at, writer);\n made = await commit(deps, opened, parsed.units, now, context);\n } catch (error) {\n keep = !(await writer.rollback());\n throw error;\n }\n keep =\n dir !== null &&\n !(await deps.env.remove(dir, { recursive: true, force: true }, BACKGROUND_CONTEXT)).ok;\n if (!keep) await journal.close().catch(() => undefined);\n const report = await reportOf(run, made).catch((error: Error) => `nowhere (${error.message})`);\n const split = accountsSplit(opened.manifest.providers, deps.providers);\n const { origin } = opened.manifest.producer;\n const settings = said(split.settings, split.lacking);\n return {\n done: true,\n preview: null,\n cones: made,\n report,\n text: said(`From ${hostOf(origin)}.`, split.signIn),\n line: `Imported ${plural(made.length, 'frozen cone')} from ${origin}${made.length ? `: ${made.join(', ')}` : ''}.\\n${settings ? `${settings}\\n` : ''}The report is ${report}.\\n`,\n error: null,\n };\n } finally {\n if (!keep) await deps.env.remove(own, { recursive: true, force: true }, BACKGROUND_CONTEXT);\n }\n}\n\nasync function sourceOf(\n deps: ImportDeps,\n source: ReadSource,\n context: Context\n): Promise<ZipSource> {\n if ('bytes' in source) return bytesSource(source.bytes);\n const { env } = deps;\n const real = await env.canonicalPath(source.path, context);\n const info = real.ok ? await env.fileInfo(real.value, context) : real;\n if (!info.ok) throw new ImportError(`can't read ${source.path}: ${info.error.message}`);\n if (info.value.size > LIMITS.archive) throw new ImportError('the zip is over 2 GiB');\n const file = await opfsFile(info.value.path, deps.opfs);\n if (file?.size === info.value.size) return blobSource(file);\n if (info.value.size > LIMITS.file)\n throw new ImportError(`${source.path} isn't on seven's own disk; copy the zip to /tmp first`);\n const read = await env.readBinaryFile(info.value.path, context);\n if (!read.ok) throw new ImportError(`can't read ${source.path}: ${read.error.message}`);\n return bytesSource(read.value);\n}\n\nfunction undoing(deps: ImportDeps): Undoing {\n return { env: deps.env, users: deps.users, state: () => deps.agents.state() };\n}\n\nexport interface Importer {\n readonly progress: ReplicatedState<ImportProgress>;\n readonly swept: Promise<void>;\n run(\n source: ImportSource,\n options: { again?: boolean; preview?: boolean },\n context: Context\n ): Promise<ImportResult>;\n cancel(): void;\n}\n\nexport const IDLE: ImportProgress = { phase: 'idle', done: 0, total: 0, text: '' };\n\nexport function createImporter(deps: ImportDeps): Importer {\n const progress = replicatedState<ImportProgress>(IDLE);\n let sweeping = sweep(undoing(deps)).catch(() => [IMPORTS_DIR]);\n const swept = sweeping.then(() => undefined);\n let running: AbortController | undefined;\n const result = (fields: Partial<ImportResult>): ImportResult => ({\n done: false,\n preview: null,\n cones: [],\n report: null,\n text: '',\n line: '',\n error: null,\n ...fields,\n });\n return {\n progress,\n swept,\n cancel: () => running?.abort(),\n async run(source, options, context) {\n if (running) return result({ error: 'an import is already running' });\n const controller = new AbortController();\n running = controller;\n sweeping = sweeping.then(() => sweep(undoing(deps))).catch(() => [IMPORTS_DIR]);\n const kept = await sweeping;\n const moving = 'inPlace' in source;\n const writing = moving ? 'Moving' : 'Importing';\n const show: Show = (phase, done, total) =>\n progress.replace(BACKGROUND_CONTEXT, {\n phase,\n done,\n total,\n text: `${phase === 'checking' ? 'Checking' : writing} ${done} of ${total}`,\n });\n let upload: { path: string } | undefined;\n try {\n upload = uploaded(source);\n const opened = moving\n ? await openDirectory(deps, source.inPlace, context)\n : await openProfile(await sourceOf(deps, upload ?? (source as ReadSource), context));\n const preview = await previewOf(opened, deps.agents.state(), deps.providers);\n if (options.preview) {\n const journal = new Journal(undoing(deps), IMPORTS_DIR);\n const writer = new Writer(deps.env, context, controller.signal, journal);\n await parse(opened, await verify(opened, writer, null, show));\n progress.replace(BACKGROUND_CONTEXT, IDLE);\n return result({ preview, text: preview.text, line: `${preview.line}\\n` });\n }\n if (preview.already !== null && !options.again)\n return result({\n preview,\n text: `Already imported on ${day(preview.already)}.`,\n line: `Already imported on ${day(preview.already)}; freezer import --again makes fresh copies.\\n`,\n });\n if (kept.length)\n throw new ImportError(\n `an earlier import couldn't be rolled back completely; its journal is in ${kept.join(', ')}`\n );\n const done = await importOpened(\n deps,\n opened,\n { again: options.again === true, signal: controller.signal, show },\n context\n );\n progress.replace(BACKGROUND_CONTEXT, { ...progress.value, phase: 'done', text: done.text });\n return { ...done, preview };\n } catch (error) {\n const message =\n error instanceof ImportError\n ? error.message\n : `the import failed: ${(error as Error).message}`;\n progress.replace(BACKGROUND_CONTEXT, { phase: 'failed', done: 0, total: 0, text: message });\n return result({ error: message });\n } finally {\n running = undefined;\n if (upload) await deps.env.remove(upload.path, { force: true }, BACKGROUND_CONTEXT);\n }\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["listed", "at"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-ecoverse/slicc-agent",
|
|
3
|
-
"version": "7.8.
|
|
3
|
+
"version": "7.8.7",
|
|
4
4
|
"description": "SLICC's agent core on pi durable: an agent worker, session storage, remoting and pi extensions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -65,9 +65,9 @@
|
|
|
65
65
|
"release": "semantic-release"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
|
-
"@ai-ecoverse/slicc-kernel": "1.
|
|
68
|
+
"@ai-ecoverse/slicc-kernel": "1.166.0",
|
|
69
69
|
"@ai-ecoverse/slicc-scrub": "1.1.0",
|
|
70
|
-
"@ai-ecoverse/slicc-shared-web": "2.12.
|
|
70
|
+
"@ai-ecoverse/slicc-shared-web": "2.12.3",
|
|
71
71
|
"@ai-ecoverse/slicc-spectrum": "1.107.1",
|
|
72
72
|
"@ai-ecoverse/wasi-fnox": "1.40.0-1",
|
|
73
73
|
"@ai-ecoverse/wasm-bash": "5.3.0-23",
|