@remnic/core 9.3.548 → 9.3.550

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/migrate/from-engram.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n chmod,\n copyFile,\n lstat,\n mkdir,\n open,\n readFile,\n readdir,\n rm,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { resolveHomeDir } from \"../runtime/env.js\";\nimport { launchProcessSync } from \"../runtime/child-process.js\";\n\nexport interface MigrationResult {\n status: \"fresh-install\" | \"already-migrated\" | \"migrated\";\n copied: string[];\n tokensRegenerated: number;\n servicesReinstalled: string[];\n rollbackCommand: string;\n}\n\ninterface RollbackManifestEntry {\n targetPath: string;\n backupPath?: string;\n createdByMigration?: boolean;\n contentHash?: string;\n}\n\ninterface RollbackManifest {\n version: 1;\n createdAt: string;\n entries: RollbackManifestEntry[];\n}\n\ninterface ValidatedRollbackManifestEntry extends RollbackManifestEntry {\n targetPath: string;\n backupPath?: string;\n contentHash?: string;\n}\n\nexport interface MigrationOptions {\n connectorConfigPaths?: string[];\n cwd?: string;\n execCommand?: (command: string, args: string[]) => void;\n homeDir?: string;\n logger?: (message: string) => void;\n platform?: NodeJS.Platform;\n quiet?: boolean;\n}\n\nexport interface RollbackResult {\n removed: string[];\n restored: string[];\n}\n\ninterface TokenEntry {\n connector: string;\n createdAt: string;\n token: string;\n}\n\ntype PersistRollbackManifest = () => Promise<void>;\n\nconst MARKER_FILE = \".migrated-from-engram\";\nconst LOCK_FILE = \".migration.lock\";\nconst ROLLBACK_MANIFEST = \".rollback.json\";\nconst BACKUP_DIR = \".backup\";\nconst LOCK_RETRY_MS = 100;\nconst LOCK_TIMEOUT_MS = 5_000;\nconst TOKEN_STORE_MODE = 0o600;\n\nfunction resolvePlatform(options?: MigrationOptions): NodeJS.Platform {\n return options?.platform ?? process.platform;\n}\n\nfunction resolveMigrationHome(options?: MigrationOptions): string {\n return options?.homeDir ?? resolveHomeDir();\n}\n\nfunction resolveLogger(options?: MigrationOptions): (message: string) => void {\n const sink = options?.logger ?? ((message: string) => console.log(message));\n return (message: string) => {\n if (!options?.quiet) sink(`[remnic] ${message}`);\n };\n}\n\nfunction resolveExec(options?: MigrationOptions): (command: string, args: string[]) => void {\n return options?.execCommand ?? ((command: string, args: string[]) => {\n const result = launchProcessSync(command, args, { stdio: \"ignore\" });\n if (result.error) {\n throw result.error;\n }\n if (result.status !== 0) {\n const reason = result.status === null\n ? `signal ${result.signal ?? \"unknown\"}`\n : `exit code ${result.status}`;\n throw new Error(`migration command failed: ${command} ${args.join(\" \")} (${reason})`);\n }\n });\n}\n\nfunction remnicRoot(homeDir: string): string {\n return path.join(homeDir, \".remnic\");\n}\n\nfunction legacyRoot(homeDir: string): string {\n return path.join(homeDir, \".engram\");\n}\n\nfunction legacyConfigPath(homeDir: string): string {\n return path.join(homeDir, \".config\", \"engram\", \"config.json\");\n}\n\nfunction remnicConfigPath(homeDir: string): string {\n return path.join(homeDir, \".config\", \"remnic\", \"config.json\");\n}\n\nfunction markerPath(homeDir: string): string {\n return path.join(remnicRoot(homeDir), MARKER_FILE);\n}\n\nfunction lockPath(homeDir: string): string {\n return path.join(remnicRoot(homeDir), LOCK_FILE);\n}\n\nfunction rollbackManifestPath(homeDir: string): string {\n return path.join(remnicRoot(homeDir), ROLLBACK_MANIFEST);\n}\n\nfunction backupRoot(homeDir: string): string {\n return path.join(remnicRoot(homeDir), BACKUP_DIR);\n}\n\nfunction defaultRollbackCommand(): string {\n return \"remnic migrate --rollback\";\n}\n\nfunction resolveMigrationCwd(options?: MigrationOptions): string {\n return path.resolve(options?.cwd ?? process.cwd());\n}\n\nfunction resolveConnectorConfigPath(candidate: string, cwd: string): string {\n return path.isAbsolute(candidate) ? path.resolve(candidate) : path.resolve(cwd, candidate);\n}\n\nasync function ensureParent(filePath: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n}\n\nasync function secureTokenFilePermissions(filePath: string): Promise<void> {\n await chmod(filePath, TOKEN_STORE_MODE);\n}\n\nasync function writeOwnerOnlyFile(filePath: string, content: string): Promise<void> {\n await writeFile(filePath, content, { encoding: \"utf8\", mode: TOKEN_STORE_MODE });\n await chmod(filePath, TOKEN_STORE_MODE);\n}\n\nasync function fileContentHash(filePath: string): Promise<string> {\n return createHash(\"sha256\").update(await readFile(filePath)).digest(\"hex\");\n}\n\nasync function writeTokenStoreFile(filePath: string, content: string): Promise<void> {\n await writeOwnerOnlyFile(filePath, content);\n}\n\nfunction isRemnicTokenStorePath(filePath: string, homeDir: string): boolean {\n return path.resolve(filePath) === path.resolve(path.join(remnicRoot(homeDir), \"tokens.json\"));\n}\n\nasync function pathExistsNoFollow(filePath: string): Promise<boolean> {\n try {\n await lstat(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function assertExistingRegularFileNoFollow(filePath: string, label: string): Promise<void> {\n const fileStat = await lstat(filePath);\n if (fileStat.isSymbolicLink()) {\n throw new Error(`${label} must not be a symlink: ${filePath}`);\n }\n if (!fileStat.isFile()) {\n throw new Error(`${label} must be a regular file: ${filePath}`);\n }\n}\n\nasync function isExistingRegularFileNoFollow(filePath: string): Promise<boolean> {\n try {\n const fileStat = await lstat(filePath);\n return fileStat.isFile() && !fileStat.isSymbolicLink();\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function copyTreeMissing(\n source: string,\n destination: string,\n copied: string[],\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n isRoot = true,\n): Promise<void> {\n if (!existsSync(source)) return;\n const sourceStat = await lstat(source);\n if (sourceStat.isSymbolicLink()) {\n if (isRoot) {\n throw new Error(`legacy migration root must not be a symlink: ${source}`);\n }\n return;\n }\n if (sourceStat.isDirectory()) {\n await mkdir(destination, { recursive: true });\n const entries = await readdir(source, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === MARKER_FILE || entry.name === LOCK_FILE || entry.name === ROLLBACK_MANIFEST) {\n continue;\n }\n await copyTreeMissing(\n path.join(source, entry.name),\n path.join(destination, entry.name),\n copied,\n manifest,\n persistManifest,\n false,\n );\n }\n return;\n }\n\n if (await pathExistsNoFollow(destination)) return;\n await ensureParent(destination);\n await copyFile(source, destination);\n await recordCreatedPath(destination, manifest, persistManifest);\n copied.push(destination);\n}\n\nfunction rewriteRemnicText(content: string): string {\n return content\n .replaceAll(\".engram/\", \".remnic/\")\n .replaceAll(\".engram\\\\\", \".remnic\\\\\")\n .replaceAll(\"ENGRAM_\", \"REMNIC_\")\n .replaceAll(\"{{ENGRAM_TOKEN}}\", \"{{REMNIC_TOKEN}}\")\n .replaceAll(\"${ENGRAM_AUTH_TOKEN}\", \"${REMNIC_AUTH_TOKEN}\")\n .replaceAll(\"ai.engram.daemon\", \"ai.remnic.daemon\")\n .replaceAll(\"engram.service\", \"remnic.service\");\n}\n\nfunction rewriteTokenValue(token: string): string {\n return token.startsWith(\"engram_\") ? `remnic_${token.slice(\"engram_\".length)}` : token;\n}\n\nfunction parseTokenEntries(raw: unknown): TokenEntry[] {\n if (typeof raw !== \"object\" || raw === null) return [];\n\n if (Array.isArray((raw as { tokens?: unknown }).tokens)) {\n return ((raw as { tokens: unknown[] }).tokens)\n .filter((entry): entry is TokenEntry => {\n if (typeof entry !== \"object\" || entry === null) return false;\n const candidate = entry as Partial<TokenEntry>;\n return typeof candidate.connector === \"string\" &&\n candidate.connector.length > 0 &&\n typeof candidate.token === \"string\" &&\n candidate.token.length > 0 &&\n typeof candidate.createdAt === \"string\" &&\n candidate.createdAt.length > 0;\n })\n .map((entry) => ({ ...entry }));\n }\n\n return Object.entries(raw)\n .filter(([key, value]) => key !== \"tokens\" && typeof value === \"string\" && value.length > 0)\n .map(([connector, token]) => ({\n connector,\n createdAt: new Date().toISOString(),\n token,\n }));\n}\n\nfunction isPlainJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseRollbackManifestEntry(raw: unknown, index: number): RollbackManifestEntry {\n if (!isPlainJsonObject(raw)) {\n throw new Error(`rollback manifest entry ${index} must be an object`);\n }\n if (typeof raw.targetPath !== \"string\" || raw.targetPath.length === 0 || !path.isAbsolute(raw.targetPath)) {\n throw new Error(`rollback manifest entry ${index} has an invalid targetPath`);\n }\n if (raw.backupPath !== undefined && (typeof raw.backupPath !== \"string\" || raw.backupPath.length === 0 || !path.isAbsolute(raw.backupPath))) {\n throw new Error(`rollback manifest entry ${index} has an invalid backupPath`);\n }\n if (raw.createdByMigration !== undefined && typeof raw.createdByMigration !== \"boolean\") {\n throw new Error(`rollback manifest entry ${index} has an invalid createdByMigration flag`);\n }\n if (raw.contentHash !== undefined && (typeof raw.contentHash !== \"string\" || !/^[a-f0-9]{64}$/u.test(raw.contentHash))) {\n throw new Error(`rollback manifest entry ${index} has an invalid contentHash`);\n }\n return {\n targetPath: raw.targetPath,\n ...(raw.backupPath === undefined ? {} : { backupPath: raw.backupPath }),\n ...(raw.createdByMigration === undefined ? {} : { createdByMigration: raw.createdByMigration }),\n ...(raw.contentHash === undefined ? {} : { contentHash: raw.contentHash }),\n };\n}\n\nfunction parseRollbackManifest(raw: unknown, manifestPath: string): RollbackManifest {\n if (!isPlainJsonObject(raw)) {\n throw new Error(`rollback manifest must be an object: ${manifestPath}`);\n }\n if (raw.version !== 1) {\n throw new Error(`rollback manifest has unsupported version: ${manifestPath}`);\n }\n if (typeof raw.createdAt !== \"string\") {\n throw new Error(`rollback manifest has an invalid createdAt: ${manifestPath}`);\n }\n if (!Array.isArray(raw.entries)) {\n throw new Error(`rollback manifest entries must be an array: ${manifestPath}`);\n }\n return {\n version: 1,\n createdAt: raw.createdAt,\n entries: raw.entries.map(parseRollbackManifestEntry),\n };\n}\n\nfunction isPathInside(parentPath: string, candidatePath: string): boolean {\n const relative = path.relative(path.resolve(parentPath), path.resolve(candidatePath));\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction isPathDescendant(parentPath: string, candidatePath: string): boolean {\n const relative = path.relative(path.resolve(parentPath), path.resolve(candidatePath));\n return relative !== \"\" && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nfunction hasConnectorConfigShape(targetPath: string, homeDir: string): boolean {\n const relative = path.relative(path.resolve(homeDir), path.resolve(targetPath));\n if (relative === \".claude.json\" || relative === path.join(\".claude\", \".mcp.json\")) {\n return true;\n }\n\n return hasRepoConnectorConfigShape(relative);\n}\n\nfunction hasRepoConnectorConfigShape(relativePath: string): boolean {\n const parts = relativePath.split(path.sep);\n const last = parts.at(-1);\n const packageName = parts.at(-2);\n const packagesDir = parts.at(-3);\n return last === \".mcp.json\" &&\n packagesDir === \"packages\" &&\n (packageName === \"plugin-claude-code\" || packageName === \"plugin-codex\");\n}\n\nfunction connectorBackupPathForTarget(targetPath: string, homeDir: string): string {\n const digest = createHash(\"sha256\").update(targetPath).digest(\"hex\").slice(0, 12);\n return path.join(backupRoot(homeDir), \"mcp\", `${digest}.json`);\n}\n\nfunction isRollbackTargetAllowed(\n entry: RollbackManifestEntry,\n targetPath: string,\n homeDir: string,\n options?: MigrationOptions,\n): boolean {\n const resolvedTarget = path.resolve(targetPath);\n if (isPathDescendant(remnicRoot(homeDir), resolvedTarget)) {\n if (entry.createdByMigration && !entry.backupPath) return true;\n return Boolean(entry.backupPath) && isRemnicTokenStorePath(resolvedTarget, homeDir);\n }\n if (isPathDescendant(path.join(homeDir, \".config\", \"remnic\"), resolvedTarget)) {\n return entry.createdByMigration === true && !entry.backupPath;\n }\n\n const serviceTargets = new Set([\n path.resolve(path.join(homeDir, \"Library\", \"LaunchAgents\", \"ai.remnic.daemon.plist\")),\n path.resolve(path.join(homeDir, \".config\", \"systemd\", \"user\", \"remnic.service\")),\n ]);\n if (serviceTargets.has(resolvedTarget)) return true;\n\n const cwd = resolveMigrationCwd(options);\n const allowedConnectorPaths = new Set(\n [\n ...defaultConnectorConfigPaths(homeDir, cwd),\n ...(options?.connectorConfigPaths ?? []),\n ].map((candidate) => resolveConnectorConfigPath(candidate, cwd)),\n );\n if (allowedConnectorPaths.has(resolvedTarget)) return true;\n\n return isPathInside(homeDir, resolvedTarget) && hasConnectorConfigShape(resolvedTarget, homeDir);\n}\n\nfunction isRollbackBackupAllowed(backupPath: string, homeDir: string): boolean {\n return isPathInside(backupRoot(homeDir), backupPath);\n}\n\nasync function assertNoSymlinkPathSegments(filePath: string, trustedRoot: string, label: string): Promise<void> {\n const resolvedPath = path.resolve(filePath);\n const resolvedRoot = path.resolve(trustedRoot);\n if (!isPathInside(resolvedRoot, resolvedPath)) {\n throw new Error(`${label} is outside the trusted rollback root: ${filePath}`);\n }\n const segments = path.relative(resolvedRoot, resolvedPath).split(path.sep).filter(Boolean);\n let current = resolvedRoot;\n\n for (const [index, segment] of segments.entries()) {\n current = path.join(current, segment);\n try {\n const currentStat = await lstat(current);\n if (currentStat.isSymbolicLink()) {\n throw new Error(`${label} must not contain symlink segments: ${filePath}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\" && index === segments.length - 1) return;\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`${label} must not contain missing parent segments: ${filePath}`);\n }\n throw error;\n }\n }\n}\n\nfunction rollbackTargetSymlinkRoot(targetPath: string, homeDir: string, options?: MigrationOptions): string {\n if (isPathInside(homeDir, targetPath)) return homeDir;\n\n const cwd = resolveMigrationCwd(options);\n if (isPathInside(cwd, targetPath)) return cwd;\n\n return path.parse(targetPath).root;\n}\n\nasync function validateRollbackManifestEntries(\n manifest: RollbackManifest,\n homeDir: string,\n options?: MigrationOptions,\n): Promise<ValidatedRollbackManifestEntry[]> {\n const validated: ValidatedRollbackManifestEntry[] = [];\n\n for (const entry of manifest.entries) {\n const targetPath = path.resolve(entry.targetPath);\n if (!isRollbackTargetAllowed(entry, targetPath, homeDir, options)) {\n throw new Error(`rollback manifest target is outside migration-owned paths: ${entry.targetPath}`);\n }\n if (entry.backupPath && entry.createdByMigration) {\n throw new Error(`rollback manifest entry cannot restore and remove the same target: ${entry.targetPath}`);\n }\n const targetExists = await pathExistsNoFollow(targetPath);\n if (!entry.createdByMigration || targetExists) {\n const targetSymlinkRoot = rollbackTargetSymlinkRoot(targetPath, homeDir, options);\n await assertNoSymlinkPathSegments(targetPath, targetSymlinkRoot, \"rollback manifest target\");\n }\n if (entry.createdByMigration && targetExists) {\n await assertCreatedRollbackTargetMatchesRecord(entry, targetPath);\n }\n\n let backupPath: string | undefined;\n if (entry.backupPath) {\n backupPath = path.resolve(entry.backupPath);\n if (!isRollbackBackupAllowed(backupPath, homeDir)) {\n throw new Error(`rollback manifest backup is outside migration backup storage: ${entry.backupPath}`);\n }\n if (await pathExistsNoFollow(backupPath)) {\n await assertNoSymlinkPathSegments(backupPath, homeDir, \"rollback manifest backup\");\n await assertExistingRegularFileNoFollow(backupPath, \"rollback manifest backup\");\n }\n if (backupPath !== connectorBackupPathForTarget(targetPath, homeDir)) {\n throw new Error(`rollback manifest backup does not match target: ${entry.targetPath}`);\n }\n }\n\n validated.push({\n targetPath,\n ...(backupPath === undefined ? {} : { backupPath }),\n ...(entry.createdByMigration === undefined ? {} : { createdByMigration: entry.createdByMigration }),\n ...(entry.contentHash === undefined ? {} : { contentHash: entry.contentHash }),\n });\n }\n\n return validated;\n}\n\nasync function assertCreatedRollbackTargetMatchesRecord(\n entry: RollbackManifestEntry,\n targetPath: string,\n): Promise<boolean> {\n const targetStat = await lstat(targetPath);\n if (targetStat.isDirectory()) {\n throw new Error(`rollback manifest created target must be a file path: ${entry.targetPath}`);\n }\n if (!targetStat.isFile() || !entry.contentHash) return false;\n if (await fileContentHash(targetPath) !== entry.contentHash) {\n throw new Error(`rollback manifest created target content does not match migration record: ${entry.targetPath}`);\n }\n return true;\n}\n\nasync function rewriteTokensIfPresent(filePath: string): Promise<number> {\n if (!existsSync(filePath)) return 0;\n await assertExistingRegularFileNoFollow(filePath, \"Remnic token store\");\n await secureTokenFilePermissions(filePath);\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(await readFile(filePath, \"utf8\")) as Record<string, unknown>;\n } catch {\n return 0;\n }\n let rewritten = 0;\n\n if (Array.isArray(raw.tokens)) {\n for (const entry of raw.tokens as Array<Record<string, unknown>>) {\n if (typeof entry.token === \"string\") {\n const next = rewriteTokenValue(entry.token);\n if (next !== entry.token) {\n entry.token = next;\n rewritten += 1;\n }\n }\n }\n } else {\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value === \"string\") {\n const next = rewriteTokenValue(value);\n if (next !== value) {\n raw[key] = next;\n rewritten += 1;\n }\n }\n }\n }\n\n if (rewritten > 0) {\n await writeTokenStoreFile(filePath, `${JSON.stringify(raw, null, 2)}\\n`);\n }\n return rewritten;\n}\n\nasync function mergeLegacyTokens(\n legacyTokensPath: string,\n remnicTokensPath: string,\n homeDir: string,\n manifest: RollbackManifest,\n backupExisting: boolean,\n persistManifest?: PersistRollbackManifest,\n): Promise<number> {\n if (existsSync(legacyTokensPath)) {\n await assertExistingRegularFileNoFollow(legacyTokensPath, \"legacy Engram token store\");\n }\n if (!existsSync(remnicTokensPath)) return 0;\n await assertExistingRegularFileNoFollow(remnicTokensPath, \"Remnic token store\");\n await secureTokenFilePermissions(remnicTokensPath);\n if (!existsSync(legacyTokensPath)) return rewriteTokensIfPresent(remnicTokensPath);\n\n let remnicRaw: unknown;\n let legacyRaw: unknown;\n const originalRemnic = await readFile(remnicTokensPath, \"utf8\");\n\n try {\n remnicRaw = JSON.parse(originalRemnic) as unknown;\n legacyRaw = JSON.parse(await readFile(legacyTokensPath, \"utf8\")) as unknown;\n } catch {\n try {\n legacyRaw = JSON.parse(await readFile(legacyTokensPath, \"utf8\")) as unknown;\n } catch {\n return rewriteTokensIfPresent(remnicTokensPath);\n }\n\n const legacyEntries = parseTokenEntries(legacyRaw);\n let rewritten = 0;\n const recoveredEntries = legacyEntries.map((entry) => {\n const nextToken = rewriteTokenValue(entry.token);\n if (nextToken !== entry.token) rewritten += 1;\n return {\n ...entry,\n token: nextToken,\n };\n });\n\n if (backupExisting) {\n await backupFile(remnicTokensPath, originalRemnic, homeDir, manifest, persistManifest);\n }\n\n await writeTokenStoreFile(\n remnicTokensPath,\n `${JSON.stringify({ tokens: recoveredEntries }, null, 2)}\\n`,\n );\n return rewritten;\n }\n\n const mergedEntries = parseTokenEntries(remnicRaw);\n const legacyEntries = parseTokenEntries(legacyRaw);\n const existingConnectors = new Set(mergedEntries.map((entry) => entry.connector));\n let rewritten = 0;\n let changed = false;\n\n for (const entry of mergedEntries) {\n const nextToken = rewriteTokenValue(entry.token);\n if (nextToken !== entry.token) {\n entry.token = nextToken;\n rewritten += 1;\n changed = true;\n }\n }\n\n for (const entry of legacyEntries) {\n const nextToken = rewriteTokenValue(entry.token);\n if (nextToken !== entry.token) {\n rewritten += 1;\n }\n if (existingConnectors.has(entry.connector)) continue;\n mergedEntries.push({ ...entry, token: nextToken });\n existingConnectors.add(entry.connector);\n changed = true;\n }\n\n if (!changed) return rewritten;\n\n if (backupExisting) {\n await backupFile(remnicTokensPath, originalRemnic, homeDir, manifest, persistManifest);\n }\n\n await writeTokenStoreFile(\n remnicTokensPath,\n `${JSON.stringify({ tokens: mergedEntries }, null, 2)}\\n`,\n );\n return rewritten;\n}\n\nasync function rewriteJsonFile(\n targetPath: string,\n homeDir: string,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<boolean> {\n if (!existsSync(targetPath)) return false;\n const targetStat = await lstat(targetPath);\n if (targetStat.isSymbolicLink()) return false;\n if (!targetStat.isFile()) {\n const error = new Error(`connector config must be a regular file: ${targetPath}`) as NodeJS.ErrnoException;\n error.code = targetStat.isDirectory() ? \"EISDIR\" : \"EINVAL\";\n throw error;\n }\n\n const original = await readFile(targetPath, \"utf8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(original) as unknown;\n } catch {\n return false;\n }\n if (!isPlainJsonObject(parsed)) return false;\n\n let changed = false;\n if (\n parsed.mcpServers &&\n typeof parsed.mcpServers === \"object\" &&\n !Array.isArray(parsed.mcpServers)\n ) {\n const servers = parsed.mcpServers as Record<string, unknown>;\n if (servers.engram && !servers.remnic) {\n servers.remnic = servers.engram;\n delete servers.engram;\n changed = true;\n }\n }\n\n const rewritten = rewriteRemnicText(JSON.stringify(parsed, null, 2));\n const next = `${rewritten}\\n`;\n if (!changed && next === original) return false;\n\n await backupFile(targetPath, original, homeDir, manifest, persistManifest);\n await writeFile(targetPath, next, \"utf8\");\n return true;\n}\n\nasync function backupFile(\n targetPath: string,\n originalContent: string,\n homeDir: string,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<void> {\n if (manifest.entries.some((entry) => entry.targetPath === targetPath && entry.backupPath)) {\n return;\n }\n const backupPath = connectorBackupPathForTarget(targetPath, homeDir);\n await ensureParent(backupPath);\n if (isRemnicTokenStorePath(targetPath, homeDir)) {\n await writeOwnerOnlyFile(backupPath, originalContent);\n } else {\n const originalMode = (await stat(targetPath)).mode & 0o777;\n await writeFile(backupPath, originalContent, { encoding: \"utf8\", mode: originalMode });\n await chmod(backupPath, originalMode);\n }\n manifest.entries.push({ targetPath, backupPath });\n await persistManifest?.();\n}\n\nasync function recordCreatedPath(\n filePath: string,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<void> {\n if (manifest.entries.some((entry) => entry.targetPath === filePath)) return;\n manifest.entries.push({\n targetPath: filePath,\n createdByMigration: true,\n contentHash: await fileContentHash(filePath),\n });\n await persistManifest?.();\n}\n\nasync function refreshCreatedPathHash(\n filePath: string,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<void> {\n const entry = manifest.entries.find((candidate) =>\n candidate.targetPath === filePath && candidate.createdByMigration\n );\n if (!entry) return;\n entry.contentHash = await fileContentHash(filePath);\n await persistManifest?.();\n}\n\nfunction defaultConnectorConfigPaths(homeDir: string, cwd: string): string[] {\n return [\n path.join(homeDir, \".claude.json\"),\n path.join(homeDir, \".claude\", \".mcp.json\"),\n path.join(cwd, \"packages\", \"plugin-claude-code\", \".mcp.json\"),\n path.join(cwd, \"packages\", \"plugin-codex\", \".mcp.json\"),\n ];\n}\n\nasync function updateConnectorConfigs(\n homeDir: string,\n cwd: string,\n options: MigrationOptions | undefined,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<string[]> {\n const updated: string[] = [];\n const candidates = options?.connectorConfigPaths ?? defaultConnectorConfigPaths(homeDir, cwd);\n for (const targetPath of candidates) {\n const resolvedTarget = resolveConnectorConfigPath(targetPath, cwd);\n if (await rewriteJsonFile(resolvedTarget, homeDir, manifest, persistManifest)) {\n updated.push(resolvedTarget);\n }\n }\n return updated;\n}\n\nasync function copyLegacyConfig(\n homeDir: string,\n copied: string[],\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<void> {\n const source = legacyConfigPath(homeDir);\n const destination = remnicConfigPath(homeDir);\n if (!existsSync(source) || existsSync(destination)) return;\n if (!(await isExistingRegularFileNoFollow(source))) return;\n await ensureParent(destination);\n const original = await readFile(source, \"utf8\");\n let next = rewriteRemnicText(original);\n try {\n const parsed = JSON.parse(next) as unknown;\n if (isPlainJsonObject(parsed) && parsed.engram && !parsed.remnic) {\n parsed.remnic = parsed.engram;\n delete parsed.engram;\n next = JSON.stringify(parsed, null, 2);\n }\n } catch {\n // Keep rewritten text when config is not JSON.\n }\n await writeFile(destination, `${next.trimEnd()}\\n`, \"utf8\");\n await recordCreatedPath(destination, manifest, persistManifest);\n copied.push(destination);\n}\n\nfunction rewriteServiceText(content: string): string {\n return rewriteRemnicText(content);\n}\n\nasync function migrateServices(\n homeDir: string,\n options: MigrationOptions | undefined,\n manifest: RollbackManifest,\n persistManifest?: PersistRollbackManifest,\n): Promise<string[]> {\n const logger = resolveLogger(options);\n const exec = resolveExec(options);\n const servicesReinstalled: string[] = [];\n const platform = resolvePlatform(options);\n\n if (platform === \"darwin\") {\n const legacyPlist = path.join(homeDir, \"Library\", \"LaunchAgents\", \"ai.engram.daemon.plist\");\n const remnicPlist = path.join(homeDir, \"Library\", \"LaunchAgents\", \"ai.remnic.daemon.plist\");\n if (existsSync(legacyPlist) && !existsSync(remnicPlist)) {\n if (!(await isExistingRegularFileNoFollow(legacyPlist))) return servicesReinstalled;\n const next = rewriteServiceText(await readFile(legacyPlist, \"utf8\"));\n await ensureParent(remnicPlist);\n await writeFile(remnicPlist, next, \"utf8\");\n await recordCreatedPath(remnicPlist, manifest, persistManifest);\n try {\n exec(\"launchctl\", [\"unload\", legacyPlist]);\n } catch {\n // Keep migration fail-open when launchd rejects unload.\n }\n try {\n exec(\"launchctl\", [\"load\", \"-w\", remnicPlist]);\n } catch {\n // Keep migration fail-open when launchd rejects load.\n }\n servicesReinstalled.push(\"ai.remnic.daemon\");\n logger(\"launchd: ai.engram.daemon unloaded, ai.remnic.daemon installed\");\n }\n return servicesReinstalled;\n }\n\n if (platform === \"linux\") {\n const legacyUnit = path.join(homeDir, \".config\", \"systemd\", \"user\", \"engram.service\");\n const remnicUnit = path.join(homeDir, \".config\", \"systemd\", \"user\", \"remnic.service\");\n if (existsSync(legacyUnit) && !existsSync(remnicUnit)) {\n if (!(await isExistingRegularFileNoFollow(legacyUnit))) return servicesReinstalled;\n const next = rewriteServiceText(await readFile(legacyUnit, \"utf8\"));\n await ensureParent(remnicUnit);\n await writeFile(remnicUnit, next, \"utf8\");\n await recordCreatedPath(remnicUnit, manifest, persistManifest);\n try {\n exec(\"systemctl\", [\"--user\", \"stop\", \"engram.service\"]);\n exec(\"systemctl\", [\"--user\", \"disable\", \"engram.service\"]);\n exec(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n exec(\"systemctl\", [\"--user\", \"enable\", \"remnic.service\"]);\n exec(\"systemctl\", [\"--user\", \"start\", \"remnic.service\"]);\n } catch {\n // Keep migration fail-open when systemd is unavailable.\n }\n servicesReinstalled.push(\"remnic.service\");\n logger(\"systemd: engram.service disabled, remnic.service installed\");\n }\n }\n\n return servicesReinstalled;\n}\n\nasync function writeRollbackManifest(homeDir: string, manifest: RollbackManifest): Promise<void> {\n await ensureParent(rollbackManifestPath(homeDir));\n await writeFile(\n rollbackManifestPath(homeDir),\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n}\n\nasync function readRollbackManifest(homeDir: string): Promise<RollbackManifest | null> {\n const target = rollbackManifestPath(homeDir);\n let targetStat: Awaited<ReturnType<typeof lstat>>;\n try {\n targetStat = await lstat(target);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n if (targetStat.isSymbolicLink()) {\n throw new Error(`rollback manifest must not be a symlink: ${target}`);\n }\n if (!targetStat.isFile()) {\n throw new Error(`rollback manifest must be a regular file: ${target}`);\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(target, \"utf8\")) as unknown;\n } catch {\n return null;\n }\n return parseRollbackManifest(parsed, target);\n}\n\nasync function acquireLock(homeDir: string): Promise<() => Promise<void>> {\n const target = lockPath(homeDir);\n await mkdir(remnicRoot(homeDir), { recursive: true });\n const started = Date.now();\n\n while (true) {\n try {\n const handle = await open(target, \"wx\");\n await handle.writeFile(`${process.pid}\\n${Date.now()}\\n`, \"utf8\");\n return async () => {\n try {\n await handle.close();\n } finally {\n await unlink(target).catch(() => undefined);\n }\n };\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") throw error;\n\n const details = await readFile(target, \"utf8\").catch(() => null);\n if (details === null) {\n if (await removeLock(target)) continue;\n } else {\n const lines = details.split(\"\\n\");\n const pid = Number.parseInt(lines[0] ?? \"\", 10);\n const createdAt = Number.parseInt(lines[1] ?? \"\", 10);\n const malformed = !Number.isSafeInteger(pid) || pid <= 0 || !Number.isFinite(createdAt);\n const deadPid = !malformed && !processIsAlive(pid);\n if (malformed || deadPid) {\n if (await removeLockIfUnchanged(target, details)) continue;\n }\n }\n if (Date.now() - started > LOCK_TIMEOUT_MS) {\n throw new Error(`timed out waiting for migration lock: ${target}`);\n }\n await new Promise((resolve) => setTimeout(resolve, LOCK_RETRY_MS));\n }\n }\n}\n\nasync function removeLockIfUnchanged(target: string, expectedContent: string): Promise<boolean> {\n const current = await readFile(target, \"utf8\").catch(() => null);\n if (current !== expectedContent) return false;\n return removeLock(target);\n}\n\nasync function removeLock(target: string): Promise<boolean> {\n try {\n await rm(target, { force: true });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EPERM\") return true;\n return false;\n }\n}\n\nexport async function rollbackFromEngramMigration(options?: MigrationOptions): Promise<RollbackResult> {\n const homeDir = resolveMigrationHome(options);\n const manifest = await readRollbackManifest(homeDir);\n const exec = resolveExec(options);\n const platform = resolvePlatform(options);\n const restored: string[] = [];\n const removed: string[] = [];\n\n if (!manifest) return { restored, removed };\n const entries = await validateRollbackManifestEntries(manifest, homeDir, options);\n\n if (platform === \"darwin\") {\n const remnicPlist = path.join(homeDir, \"Library\", \"LaunchAgents\", \"ai.remnic.daemon.plist\");\n if (existsSync(remnicPlist)) {\n try {\n exec(\"launchctl\", [\"unload\", remnicPlist]);\n } catch {\n // Ignore launchctl rollback failures.\n }\n }\n } else if (platform === \"linux\") {\n try {\n exec(\"systemctl\", [\"--user\", \"stop\", \"remnic.service\"]);\n exec(\"systemctl\", [\"--user\", \"disable\", \"remnic.service\"]);\n } catch {\n // Ignore systemd rollback failures.\n }\n }\n\n for (const entry of [...entries].reverse()) {\n if (entry.backupPath && await pathExistsNoFollow(entry.backupPath)) {\n await assertNoSymlinkPathSegments(entry.backupPath, homeDir, \"rollback manifest backup\");\n await assertExistingRegularFileNoFollow(entry.backupPath, \"rollback manifest backup\");\n await ensureParent(entry.targetPath);\n await copyFile(entry.backupPath, entry.targetPath);\n if (isRemnicTokenStorePath(entry.targetPath, homeDir)) {\n await secureTokenFilePermissions(entry.targetPath);\n }\n restored.push(entry.targetPath);\n continue;\n }\n if (entry.createdByMigration && existsSync(entry.targetPath)) {\n const targetSymlinkRoot = rollbackTargetSymlinkRoot(entry.targetPath, homeDir, options);\n await assertNoSymlinkPathSegments(entry.targetPath, targetSymlinkRoot, \"rollback manifest target\");\n if (!await assertCreatedRollbackTargetMatchesRecord(entry, entry.targetPath)) continue;\n await rm(entry.targetPath, { recursive: true, force: true });\n removed.push(entry.targetPath);\n }\n }\n\n if (platform === \"linux\") {\n try {\n exec(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n } catch {\n // Ignore systemd rollback failures after removing unit files.\n }\n }\n\n await rm(markerPath(homeDir), { force: true }).catch(() => undefined);\n await rm(rollbackManifestPath(homeDir), { force: true }).catch(() => undefined);\n return { restored, removed };\n}\n\nexport async function migrateFromEngram(options?: MigrationOptions): Promise<MigrationResult> {\n const homeDir = resolveMigrationHome(options);\n const cwd = resolveMigrationCwd(options);\n const logger = resolveLogger(options);\n const copied: string[] = [];\n let tokensRegenerated = 0;\n let servicesReinstalled: string[] = [];\n\n if (existsSync(markerPath(homeDir))) {\n return {\n status: \"already-migrated\",\n copied,\n tokensRegenerated,\n servicesReinstalled,\n rollbackCommand: defaultRollbackCommand(),\n };\n }\n\n const hasLegacyRoot = existsSync(legacyRoot(homeDir));\n const hasLegacyConfig = existsSync(legacyConfigPath(homeDir));\n if (!hasLegacyRoot && !hasLegacyConfig) {\n return {\n status: \"fresh-install\",\n copied,\n tokensRegenerated,\n servicesReinstalled,\n rollbackCommand: defaultRollbackCommand(),\n };\n }\n\n const releaseLock = await acquireLock(homeDir);\n try {\n if (existsSync(markerPath(homeDir))) {\n return {\n status: \"already-migrated\",\n copied,\n tokensRegenerated,\n servicesReinstalled,\n rollbackCommand: defaultRollbackCommand(),\n };\n }\n\n const manifest: RollbackManifest = await readRollbackManifest(homeDir) ?? {\n version: 1,\n createdAt: new Date().toISOString(),\n entries: [],\n };\n const persistManifest = () => writeRollbackManifest(homeDir, manifest);\n\n logger(\"First run after Engram -> Remnic rename. Migrating...\");\n await mkdir(remnicRoot(homeDir), { recursive: true });\n await persistManifest();\n await copyTreeMissing(legacyRoot(homeDir), remnicRoot(homeDir), copied, manifest, persistManifest);\n await copyLegacyConfig(homeDir, copied, manifest, persistManifest);\n\n const legacyTokens = path.join(legacyRoot(homeDir), \"tokens.json\");\n const remnicTokens = path.join(remnicRoot(homeDir), \"tokens.json\");\n if (copied.includes(remnicTokens)) {\n tokensRegenerated += await rewriteTokensIfPresent(remnicTokens);\n await refreshCreatedPathHash(remnicTokens, manifest, persistManifest);\n } else {\n tokensRegenerated += await mergeLegacyTokens(\n legacyTokens,\n remnicTokens,\n homeDir,\n manifest,\n true,\n persistManifest,\n );\n }\n if (existsSync(remnicTokens)) {\n logger(\"tokens copied to ~/.remnic/tokens.json (legacy prefixes rewritten)\");\n }\n\n const updatedConfigs = await updateConnectorConfigs(homeDir, cwd, options, manifest, persistManifest);\n for (const updated of updatedConfigs) {\n logger(`Updated connector config: ${updated}`);\n }\n\n servicesReinstalled = await migrateServices(homeDir, options, manifest, persistManifest);\n await writeRollbackManifest(homeDir, manifest);\n await writeFile(markerPath(homeDir), `${new Date().toISOString()}\\n`, \"utf8\");\n logger(\"Migration complete. Welcome to Remnic.\");\n\n return {\n status: \"migrated\",\n copied,\n tokensRegenerated,\n servicesReinstalled,\n rollbackCommand: defaultRollbackCommand(),\n };\n } finally {\n await releaseLock();\n }\n}\n"],"mappings":"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","names":["legacyEntries","rewritten"]}
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-BFBF3XEF.js";
10
10
  import {
11
11
  migrateFromEngram
12
- } from "./chunk-S53PKKWK.js";
12
+ } from "./chunk-KVEVLBKC.js";
13
13
  import {
14
14
  LcmEngine
15
15
  } from "./chunk-RLV3PQGH.js";
@@ -12398,4 +12398,4 @@ export {
12398
12398
  resolvePersistedMemoryRelativePath,
12399
12399
  Orchestrator
12400
12400
  };
12401
- //# sourceMappingURL=chunk-OF46AKZC.js.map
12401
+ //# sourceMappingURL=chunk-XDMLTNIG.js.map
package/dist/index.js CHANGED
@@ -182,13 +182,13 @@ import {
182
182
  saveTaxonomy,
183
183
  validateSlug,
184
184
  validateTaxonomy
185
- } from "./chunk-OF46AKZC.js";
185
+ } from "./chunk-XDMLTNIG.js";
186
186
  import "./chunk-5RIRL3XL.js";
187
187
  import "./chunk-BFBF3XEF.js";
188
188
  import {
189
189
  migrateFromEngram,
190
190
  rollbackFromEngramMigration
191
- } from "./chunk-S53PKKWK.js";
191
+ } from "./chunk-KVEVLBKC.js";
192
192
  import "./chunk-HHLLAQGZ.js";
193
193
  import "./chunk-UWK5OXUJ.js";
194
194
  import "./chunk-RLV3PQGH.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  migrateFromEngram,
3
3
  rollbackFromEngramMigration
4
- } from "../chunk-S53PKKWK.js";
4
+ } from "../chunk-KVEVLBKC.js";
5
5
  import "../chunk-NNVTUXEB.js";
6
6
  import "../chunk-JUC24CTX.js";
7
7
  import "../chunk-PZ5AY32C.js";
@@ -26,10 +26,10 @@ import {
26
26
  sanitizeSessionKeyForFilename,
27
27
  shouldFilterLifecycleRecallCandidate,
28
28
  summarizeGraphShadowComparison
29
- } from "./chunk-OF46AKZC.js";
29
+ } from "./chunk-XDMLTNIG.js";
30
30
  import "./chunk-5RIRL3XL.js";
31
31
  import "./chunk-BFBF3XEF.js";
32
- import "./chunk-S53PKKWK.js";
32
+ import "./chunk-KVEVLBKC.js";
33
33
  import "./chunk-HHLLAQGZ.js";
34
34
  import "./chunk-UWK5OXUJ.js";
35
35
  import "./chunk-RLV3PQGH.js";
package/dist/schemas.d.ts CHANGED
@@ -7,13 +7,13 @@ declare const MemoryActionEligibilityContextSchema: z.ZodObject<{
7
7
  importance: z.ZodNumber;
8
8
  source: z.ZodEnum<["extraction", "consolidation", "replay", "manual", "unknown"]>;
9
9
  }, "strict", z.ZodTypeAny, {
10
- source: "manual" | "extraction" | "consolidation" | "replay" | "unknown";
11
10
  confidence: number;
11
+ source: "unknown" | "manual" | "extraction" | "consolidation" | "replay";
12
12
  lifecycleState: "active" | "archived" | "candidate" | "validated" | "stale";
13
13
  importance: number;
14
14
  }, {
15
- source: "manual" | "extraction" | "consolidation" | "replay" | "unknown";
16
15
  confidence: number;
16
+ source: "unknown" | "manual" | "extraction" | "consolidation" | "replay";
17
17
  lifecycleState: "active" | "archived" | "candidate" | "validated" | "stale";
18
18
  importance: number;
19
19
  }>;
@@ -149,10 +149,10 @@ declare const ExtractedFactSchema: z.ZodEffects<z.ZodObject<{
149
149
  observed_outcome?: string | null | undefined;
150
150
  }>>>;
151
151
  }, "strip", z.ZodTypeAny, {
152
- tags: string[];
153
- content: string;
154
152
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
153
+ content: string;
155
154
  confidence: number;
155
+ tags: string[];
156
156
  entityRef?: string | null | undefined;
157
157
  structuredAttributes?: Record<string, string> | null | undefined;
158
158
  promptedByQuestion?: string | null | undefined;
@@ -178,10 +178,10 @@ declare const ExtractedFactSchema: z.ZodEffects<z.ZodObject<{
178
178
  observed_outcome?: string | null | undefined;
179
179
  } | null | undefined;
180
180
  }, {
181
- tags: string[];
182
- content: string;
183
181
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
182
+ content: string;
184
183
  confidence: number;
184
+ tags: string[];
185
185
  entityRef?: string | null | undefined;
186
186
  structuredAttributes?: Record<string, string> | null | undefined;
187
187
  promptedByQuestion?: string | null | undefined;
@@ -207,10 +207,10 @@ declare const ExtractedFactSchema: z.ZodEffects<z.ZodObject<{
207
207
  observed_outcome?: string | null | undefined;
208
208
  } | null | undefined;
209
209
  }>, {
210
- tags: string[];
211
- content: string;
212
210
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
211
+ content: string;
213
212
  confidence: number;
213
+ tags: string[];
214
214
  entityRef?: string | null | undefined;
215
215
  structuredAttributes?: Record<string, string> | null | undefined;
216
216
  promptedByQuestion?: string | null | undefined;
@@ -236,10 +236,10 @@ declare const ExtractedFactSchema: z.ZodEffects<z.ZodObject<{
236
236
  observed_outcome?: string | null | undefined;
237
237
  } | null | undefined;
238
238
  }, {
239
- tags: string[];
240
- content: string;
241
239
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
240
+ content: string;
242
241
  confidence: number;
242
+ tags: string[];
243
243
  entityRef?: string | null | undefined;
244
244
  structuredAttributes?: Record<string, string> | null | undefined;
245
245
  promptedByQuestion?: string | null | undefined;
@@ -457,10 +457,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
457
457
  observed_outcome?: string | null | undefined;
458
458
  }>>>;
459
459
  }, "strip", z.ZodTypeAny, {
460
- tags: string[];
461
- content: string;
462
460
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
461
+ content: string;
463
462
  confidence: number;
463
+ tags: string[];
464
464
  entityRef?: string | null | undefined;
465
465
  structuredAttributes?: Record<string, string> | null | undefined;
466
466
  promptedByQuestion?: string | null | undefined;
@@ -486,10 +486,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
486
486
  observed_outcome?: string | null | undefined;
487
487
  } | null | undefined;
488
488
  }, {
489
- tags: string[];
490
- content: string;
491
489
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
490
+ content: string;
492
491
  confidence: number;
492
+ tags: string[];
493
493
  entityRef?: string | null | undefined;
494
494
  structuredAttributes?: Record<string, string> | null | undefined;
495
495
  promptedByQuestion?: string | null | undefined;
@@ -515,10 +515,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
515
515
  observed_outcome?: string | null | undefined;
516
516
  } | null | undefined;
517
517
  }>, {
518
- tags: string[];
519
- content: string;
520
518
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
519
+ content: string;
521
520
  confidence: number;
521
+ tags: string[];
522
522
  entityRef?: string | null | undefined;
523
523
  structuredAttributes?: Record<string, string> | null | undefined;
524
524
  promptedByQuestion?: string | null | undefined;
@@ -544,10 +544,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
544
544
  observed_outcome?: string | null | undefined;
545
545
  } | null | undefined;
546
546
  }, {
547
- tags: string[];
548
- content: string;
549
547
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
548
+ content: string;
550
549
  confidence: number;
550
+ tags: string[];
551
551
  entityRef?: string | null | undefined;
552
552
  structuredAttributes?: Record<string, string> | null | undefined;
553
553
  promptedByQuestion?: string | null | undefined;
@@ -631,10 +631,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
631
631
  }>, "many">>>;
632
632
  }, "strip", z.ZodTypeAny, {
633
633
  facts: {
634
- tags: string[];
635
- content: string;
636
634
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
635
+ content: string;
637
636
  confidence: number;
637
+ tags: string[];
638
638
  entityRef?: string | null | undefined;
639
639
  structuredAttributes?: Record<string, string> | null | undefined;
640
640
  promptedByQuestion?: string | null | undefined;
@@ -680,10 +680,10 @@ declare const ProactiveExtractionResultSchema: z.ZodObject<{
680
680
  }[] | null | undefined;
681
681
  }, {
682
682
  facts: {
683
- tags: string[];
684
- content: string;
685
683
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
684
+ content: string;
686
685
  confidence: number;
686
+ tags: string[];
687
687
  entityRef?: string | null | undefined;
688
688
  structuredAttributes?: Record<string, string> | null | undefined;
689
689
  promptedByQuestion?: string | null | undefined;
@@ -825,10 +825,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
825
825
  observed_outcome?: string | null | undefined;
826
826
  }>>>;
827
827
  }, "strip", z.ZodTypeAny, {
828
- tags: string[];
829
- content: string;
830
828
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
829
+ content: string;
831
830
  confidence: number;
831
+ tags: string[];
832
832
  entityRef?: string | null | undefined;
833
833
  structuredAttributes?: Record<string, string> | null | undefined;
834
834
  promptedByQuestion?: string | null | undefined;
@@ -854,10 +854,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
854
854
  observed_outcome?: string | null | undefined;
855
855
  } | null | undefined;
856
856
  }, {
857
- tags: string[];
858
- content: string;
859
857
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
858
+ content: string;
860
859
  confidence: number;
860
+ tags: string[];
861
861
  entityRef?: string | null | undefined;
862
862
  structuredAttributes?: Record<string, string> | null | undefined;
863
863
  promptedByQuestion?: string | null | undefined;
@@ -883,10 +883,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
883
883
  observed_outcome?: string | null | undefined;
884
884
  } | null | undefined;
885
885
  }>, {
886
- tags: string[];
887
- content: string;
888
886
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
887
+ content: string;
889
888
  confidence: number;
889
+ tags: string[];
890
890
  entityRef?: string | null | undefined;
891
891
  structuredAttributes?: Record<string, string> | null | undefined;
892
892
  promptedByQuestion?: string | null | undefined;
@@ -912,10 +912,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
912
912
  observed_outcome?: string | null | undefined;
913
913
  } | null | undefined;
914
914
  }, {
915
- tags: string[];
916
- content: string;
917
915
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
916
+ content: string;
918
917
  confidence: number;
918
+ tags: string[];
919
919
  entityRef?: string | null | undefined;
920
920
  structuredAttributes?: Record<string, string> | null | undefined;
921
921
  promptedByQuestion?: string | null | undefined;
@@ -1013,10 +1013,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
1013
1013
  }>, "many">>>;
1014
1014
  }, "strip", z.ZodTypeAny, {
1015
1015
  facts: {
1016
- tags: string[];
1017
- content: string;
1018
1016
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
1017
+ content: string;
1019
1018
  confidence: number;
1019
+ tags: string[];
1020
1020
  entityRef?: string | null | undefined;
1021
1021
  structuredAttributes?: Record<string, string> | null | undefined;
1022
1022
  promptedByQuestion?: string | null | undefined;
@@ -1068,10 +1068,10 @@ declare const ExtractionResultSchema: z.ZodObject<{
1068
1068
  identityReflection?: string | null | undefined;
1069
1069
  }, {
1070
1070
  facts: {
1071
- tags: string[];
1072
- content: string;
1073
1071
  category: "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
1072
+ content: string;
1074
1073
  confidence: number;
1074
+ tags: string[];
1075
1075
  entityRef?: string | null | undefined;
1076
1076
  structuredAttributes?: Record<string, string> | null | undefined;
1077
1077
  promptedByQuestion?: string | null | undefined;
@@ -1285,13 +1285,13 @@ declare const ContradictionVerificationSchema: z.ZodObject<{
1285
1285
  reasoning: z.ZodString;
1286
1286
  whichIsNewer: z.ZodEnum<["first", "second", "unclear"]>;
1287
1287
  }, "strip", z.ZodTypeAny, {
1288
- reasoning: string;
1289
1288
  confidence: number;
1289
+ reasoning: string;
1290
1290
  isContradiction: boolean;
1291
1291
  whichIsNewer: "first" | "second" | "unclear";
1292
1292
  }, {
1293
- reasoning: string;
1294
1293
  confidence: number;
1294
+ reasoning: string;
1295
1295
  isContradiction: boolean;
1296
1296
  whichIsNewer: "first" | "second" | "unclear";
1297
1297
  }>;
@@ -1386,8 +1386,8 @@ declare const BehaviorLoopAdjustmentSchema: z.ZodObject<{
1386
1386
  reason: z.ZodString;
1387
1387
  appliedAt: z.ZodString;
1388
1388
  }, "strip", z.ZodTypeAny, {
1389
- reason: string;
1390
1389
  confidence: number;
1390
+ reason: string;
1391
1391
  parameter: string;
1392
1392
  previousValue: number;
1393
1393
  nextValue: number;
@@ -1395,8 +1395,8 @@ declare const BehaviorLoopAdjustmentSchema: z.ZodObject<{
1395
1395
  evidenceCount: number;
1396
1396
  appliedAt: string;
1397
1397
  }, {
1398
- reason: string;
1399
1398
  confidence: number;
1399
+ reason: string;
1400
1400
  parameter: string;
1401
1401
  previousValue: number;
1402
1402
  nextValue: number;
@@ -1420,8 +1420,8 @@ declare const BehaviorLoopPolicyStateSchema: z.ZodObject<{
1420
1420
  reason: z.ZodString;
1421
1421
  appliedAt: z.ZodString;
1422
1422
  }, "strip", z.ZodTypeAny, {
1423
- reason: string;
1424
1423
  confidence: number;
1424
+ reason: string;
1425
1425
  parameter: string;
1426
1426
  previousValue: number;
1427
1427
  nextValue: number;
@@ -1429,8 +1429,8 @@ declare const BehaviorLoopPolicyStateSchema: z.ZodObject<{
1429
1429
  evidenceCount: number;
1430
1430
  appliedAt: string;
1431
1431
  }, {
1432
- reason: string;
1433
1432
  confidence: number;
1433
+ reason: string;
1434
1434
  parameter: string;
1435
1435
  previousValue: number;
1436
1436
  nextValue: number;
@@ -1447,8 +1447,8 @@ declare const BehaviorLoopPolicyStateSchema: z.ZodObject<{
1447
1447
  maxDeltaPerCycle: number;
1448
1448
  protectedParams: string[];
1449
1449
  adjustments: {
1450
- reason: string;
1451
1450
  confidence: number;
1451
+ reason: string;
1452
1452
  parameter: string;
1453
1453
  previousValue: number;
1454
1454
  nextValue: number;
@@ -1464,8 +1464,8 @@ declare const BehaviorLoopPolicyStateSchema: z.ZodObject<{
1464
1464
  maxDeltaPerCycle: number;
1465
1465
  protectedParams: string[];
1466
1466
  adjustments: {
1467
- reason: string;
1468
1467
  confidence: number;
1468
+ reason: string;
1469
1469
  parameter: string;
1470
1470
  previousValue: number;
1471
1471
  nextValue: number;
@@ -22,9 +22,9 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
22
22
  agent: string;
23
23
  date: string;
24
24
  reason: string;
25
+ confidence?: number | undefined;
25
26
  workflow?: string | undefined;
26
27
  tags?: string[] | undefined;
27
- confidence?: number | undefined;
28
28
  severity?: "low" | "medium" | "high" | undefined;
29
29
  outcome?: string | undefined;
30
30
  refs?: string[] | undefined;
@@ -36,9 +36,9 @@ declare const SharedFeedbackEntrySchema: z.ZodObject<{
36
36
  agent: string;
37
37
  date: string;
38
38
  reason: string;
39
+ confidence?: number | undefined;
39
40
  workflow?: string | undefined;
40
41
  tags?: string[] | undefined;
41
- confidence?: number | undefined;
42
42
  severity?: "low" | "medium" | "high" | undefined;
43
43
  outcome?: string | undefined;
44
44
  refs?: string[] | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.3.548",
3
+ "version": "9.3.550",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",