@runeya/runeya 2.0.121 → 2.0.123
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/{agent-manager-4HBMLHXU.js → agent-manager-2G55ZFCL.js} +3 -3
- package/{chat-VL6BIVO5.js → chat-MOAVENBI.js} +6 -6
- package/{chunk-HJUFIZ7H.js → chunk-DUHCY3JU.js} +128 -158
- package/chunk-DUHCY3JU.js.map +1 -0
- package/chunk-HK5QNU6P.js +117 -0
- package/chunk-HK5QNU6P.js.map +1 -0
- package/{chunk-CNTL6NVU.js → chunk-MSLFR2EN.js} +118 -58
- package/chunk-MSLFR2EN.js.map +1 -0
- package/{chunk-3N55WR7F.js → chunk-N3ZI35SC.js} +7 -16
- package/chunk-N3ZI35SC.js.map +1 -0
- package/{chunk-OVV52N5F.js → chunk-TNJFDWJX.js} +78 -74
- package/chunk-TNJFDWJX.js.map +1 -0
- package/{companion-AUMA6RGX.js → companion-7VOV4W3T.js} +4 -4
- package/index.js +3 -3
- package/package.json +1 -1
- package/{settings-manager-ROWQ5GC2.js → settings-manager-MAVD4GAS.js} +3 -3
- package/{src-JIS3X4OU.js → src-DN2IGASI.js} +297 -110
- package/src-DN2IGASI.js.map +1 -0
- package/chunk-3N55WR7F.js.map +0 -1
- package/chunk-CNTL6NVU.js.map +0 -1
- package/chunk-HJUFIZ7H.js.map +0 -1
- package/chunk-OVV52N5F.js.map +0 -1
- package/chunk-YZU5FNXR.js +0 -43
- package/chunk-YZU5FNXR.js.map +0 -1
- package/src-JIS3X4OU.js.map +0 -1
- /package/{agent-manager-4HBMLHXU.js.map → agent-manager-2G55ZFCL.js.map} +0 -0
- /package/{chat-VL6BIVO5.js.map → chat-MOAVENBI.js.map} +0 -0
- /package/{companion-AUMA6RGX.js.map → companion-7VOV4W3T.js.map} +0 -0
- /package/{settings-manager-ROWQ5GC2.js.map → settings-manager-MAVD4GAS.js.map} +0 -0
package/chunk-3N55WR7F.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/services/settings-manager.ts"],"sourcesContent":["import { readFile, writeFile, rename, mkdir, chmod } from 'node:fs/promises';\nimport { env } from '../config/env.js';\nimport { join } from 'node:path';\nimport { machineFilePath, legacyMachineFilePath, machineRoot, orgVaultRoot } from './vault-resolver.js';\nimport { SettingsSchema, SchemaVersionSchema, SettingsPrivateSchema } from '@runeya/packages-shared';\nimport type { Settings, SchemaVersion, SettingsPrivate } from '@runeya/packages-shared';\nimport { rememberFile, hasChangedSinceRead, wasRead } from './disk-freshness.js';\n\nconst SETTINGS_FILE = 'settings.json';\nconst SETTINGS_PRIVATE_FILE = 'settings.private.json';\nconst SCHEMA_VERSION_FILE = 'schema-version.json';\nconst CURRENT_SCHEMA_VERSION = 4;\n\n/**\n * Les réglages vivent dans le coffre de ce qu'ils configurent.\n *\n * Ils étaient au niveau machine — un fichier pour tout le poste — alors qu'ils\n * décrivent des choses qui appartiennent à des organisations différentes : les\n * fournisseurs d'IA qui paient le travail d'une équipe, les scénarios qui\n * décrivent ses services. Un réglage global obligeait donc à partager la clé\n * machine pour partager un secret d'organisation.\n *\n * `vault` désigne le coffre : l'identifiant d'une organisation, ou l'absence\n * pour le répertoire de lancement — celui d'un projet local, qui n'appartient à\n * personne d'autre. Rien ne reste au niveau machine sinon la session cloud,\n * irréductible puisque c'est elle qui donne accès aux organisations.\n */\nclass SettingsManager {\n private settings = new Map<string, Settings>();\n private settingsPrivate = new Map<string, SettingsPrivate>();\n private schemaVersion: SchemaVersion | null = null;\n\n /**\n * Le coffre visé, sous forme de racine sur le disque.\n *\n * Sans organisation, la racine machine — pas le répertoire de lancement. Ce\n * n'est pas un reste de l'ancien monde : y écrire forcerait un `.runeya` à\n * exister chez quelqu'un qui ne travaille que sur des projets cloud, ce que\n * les coffres ont justement supprimé (et ce qu'un test garde).\n */\n private rootOf(vault?: string): string {\n return vault ? orgVaultRoot(vault) : machineRoot();\n }\n\n private cacheKey(vault?: string): string {\n return vault ?? '';\n }\n\n private async atomicWrite(filename: string, data: unknown, vault?: string): Promise<void> {\n const root = this.rootOf(vault);\n await mkdir(root, { recursive: true });\n const filePath = join(root, filename);\n const tmpPath = filePath + '.tmp';\n await writeFile(tmpPath, JSON.stringify(data, null, 2), 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n // Notre propre écriture devient la référence : sans elle, la lecture\n // suivante prendrait ce fichier pour l'œuvre d'une autre instance et\n // relirait pour rien.\n await rememberFile(filePath);\n }\n\n /**\n * Le cache de ce coffre fait-il encore foi ?\n *\n * Plusieurs Runeya partagent la racine machine — l'application installée et\n * celle qu'on développe, couramment — et écrivent donc le même fichier. Un\n * cache peuplé une fois et jamais revu rend l'état du démarrage pour\n * toujours, et la sauvegarde suivante le réinstalle sur le disque : ce que\n * l'autre instance avait écrit entre-temps disparaît. Les réglages sont\n * l'endroit où cela coûte le plus cher, parce qu'un coffre n'a qu'un fichier\n * pour toute l'organisation — un projet, lui, a le sien.\n *\n * Un fichier jamais lu n'est pas périmé : c'est un coffre neuf, dont les\n * défauts viennent d'être écrits.\n */\n private async isStale(filename: string, vault?: string): Promise<boolean> {\n const path = join(this.rootOf(vault), filename);\n return wasRead(path) && await hasChangedSinceRead(path);\n }\n\n /**\n * Lire le fichier de CE coffre, et rien d'autre.\n *\n * Pas de repli sur un autre emplacement : un réglage lu ailleurs que là où il\n * est écrit fait deux vérités pour un même fait, et l'accord entre les deux\n * devient une chose de plus à tenir. Ce que les versions précédentes ont\n * écrit ailleurs est déplacé une fois pour toutes par\n * `migrateSettingsIntoVaults`, pas relu indéfiniment.\n */\n private async readJson<T>(filename: string, vault?: string): Promise<T | null> {\n const path = join(this.rootOf(vault), filename);\n try {\n const parsed = JSON.parse(await readFile(path, 'utf-8')) as T;\n // Repère pris après coup : c'est cette lecture-là que le cache reflète.\n await rememberFile(path);\n return parsed;\n } catch {\n return null;\n }\n }\n\n /** Vide les caches — après un déplacement de fichiers sous nos pieds. */\n forget(): void {\n this.settings.clear();\n this.settingsPrivate.clear();\n }\n\n /** Un fichier qui appartient au poste, pas à un coffre. */\n private async readMachineJson<T>(filename: string): Promise<T | null> {\n for (const path of [machineFilePath(filename), legacyMachineFilePath(filename)]) {\n try {\n return JSON.parse(await readFile(path, 'utf-8')) as T;\n } catch {\n // Try the next location.\n }\n }\n return null;\n }\n\n async getSettings(vault?: string): Promise<Settings> {\n const key = this.cacheKey(vault);\n let current = this.settings.get(key);\n if (current && await this.isStale(SETTINGS_FILE, vault)) current = undefined;\n if (!current) {\n const raw = await this.readJson<unknown>(SETTINGS_FILE, vault);\n const parsed = raw ? SettingsSchema.safeParse(raw) : null;\n if (parsed?.success) {\n current = parsed.data;\n this.settings.set(key, current);\n } else {\n current = SettingsSchema.parse({ mode: env.MODE, cloudUrl: env.CLOUD_URL ?? null });\n await this.saveSettings(current, vault);\n }\n }\n return current;\n }\n\n async saveSettings(settings: Settings, vault?: string): Promise<void> {\n this.settings.set(this.cacheKey(vault), settings);\n await this.atomicWrite(SETTINGS_FILE, settings, vault);\n }\n\n async getPrivateSettings(vault?: string): Promise<SettingsPrivate> {\n const key = this.cacheKey(vault);\n let current = this.settingsPrivate.get(key);\n if (current && await this.isStale(SETTINGS_PRIVATE_FILE, vault)) current = undefined;\n if (!current) {\n const raw = await this.readJson<unknown>(SETTINGS_PRIVATE_FILE, vault);\n const parsed = raw ? SettingsPrivateSchema.safeParse(raw) : null;\n if (parsed?.success) {\n current = parsed.data;\n this.settingsPrivate.set(key, current);\n } else {\n current = SettingsPrivateSchema.parse({});\n await this.savePrivateSettings(current, vault);\n }\n }\n return current;\n }\n\n async savePrivateSettings(settings: SettingsPrivate, vault?: string): Promise<void> {\n this.settingsPrivate.set(this.cacheKey(vault), settings);\n await this.atomicWrite(SETTINGS_PRIVATE_FILE, settings, vault);\n }\n\n /**\n * La version de schéma reste au niveau machine, et ce n'est pas un oubli :\n * elle ne configure rien, elle date les migrations des données de ce poste.\n */\n async getSchemaVersion(): Promise<SchemaVersion> {\n if (!this.schemaVersion) {\n const raw = await this.readMachineJson<unknown>(SCHEMA_VERSION_FILE);\n const parsed = raw ? SchemaVersionSchema.safeParse(raw) : null;\n if (parsed?.success) {\n this.schemaVersion = parsed.data;\n } else {\n this.schemaVersion = { version: CURRENT_SCHEMA_VERSION, migratedAt: new Date() };\n await this.saveSchemaVersion(this.schemaVersion);\n }\n }\n return this.schemaVersion;\n }\n\n async saveSchemaVersion(sv: SchemaVersion): Promise<void> {\n this.schemaVersion = sv;\n await mkdir(machineRoot(), { recursive: true });\n const filePath = machineFilePath(SCHEMA_VERSION_FILE);\n const tmpPath = filePath + '.tmp';\n await writeFile(tmpPath, JSON.stringify(sv, null, 2), 'utf-8');\n await rename(tmpPath, filePath);\n await chmod(filePath, 0o600);\n }\n\n getCurrentSchemaVersion(): number {\n return CURRENT_SCHEMA_VERSION;\n }\n}\n\nexport const settingsManager = new SettingsManager();\n"],"mappings":"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","names":[]}
|