flavor-code 1.2.1

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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1081 -0
  3. package/dist/agent/loop.d.ts +31 -0
  4. package/dist/agent/message-queue.d.ts +19 -0
  5. package/dist/agent/planner.d.ts +28 -0
  6. package/dist/agent/subagents.d.ts +50 -0
  7. package/dist/agent/task-plan.d.ts +60 -0
  8. package/dist/agent/task-tools.d.ts +11 -0
  9. package/dist/agent/types.d.ts +117 -0
  10. package/dist/app-WC2XXGLM.js +3185 -0
  11. package/dist/app-WC2XXGLM.js.map +1 -0
  12. package/dist/auth/oauth-config.d.ts +4 -0
  13. package/dist/auth/oauth.d.ts +21 -0
  14. package/dist/auth/store.d.ts +15 -0
  15. package/dist/auth/types.d.ts +33 -0
  16. package/dist/chunk-BU64GNXE.js +15771 -0
  17. package/dist/chunk-BU64GNXE.js.map +1 -0
  18. package/dist/chunk-DM64TM4Z.js +124 -0
  19. package/dist/chunk-DM64TM4Z.js.map +1 -0
  20. package/dist/chunk-JZ322RCJ.js +40 -0
  21. package/dist/chunk-JZ322RCJ.js.map +1 -0
  22. package/dist/chunk-M744K7MK.js +246 -0
  23. package/dist/chunk-M744K7MK.js.map +1 -0
  24. package/dist/chunk-MVIMQEQT.js +692 -0
  25. package/dist/chunk-MVIMQEQT.js.map +1 -0
  26. package/dist/chunk-VOCZVFP7.js +153 -0
  27. package/dist/chunk-VOCZVFP7.js.map +1 -0
  28. package/dist/chunk-XS2JU6S3.js +35557 -0
  29. package/dist/chunk-XS2JU6S3.js.map +1 -0
  30. package/dist/claude-ink-ZL4UZMFY.js +27 -0
  31. package/dist/claude-ink-ZL4UZMFY.js.map +1 -0
  32. package/dist/cli.js +915 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/codeisland/activate.mjs +74 -0
  35. package/dist/codeisland/bridge.mjs +97 -0
  36. package/dist/codeisland/flavor-plugin.json +27 -0
  37. package/dist/config/load.d.ts +19 -0
  38. package/dist/config/protected-file.d.ts +15 -0
  39. package/dist/config/schema.d.ts +176 -0
  40. package/dist/config/secret-envelope.d.ts +8 -0
  41. package/dist/context/compaction.d.ts +44 -0
  42. package/dist/context/manager.d.ts +65 -0
  43. package/dist/context/summarizer.d.ts +15 -0
  44. package/dist/desktop/main.js +17778 -0
  45. package/dist/desktop/main.js.map +1 -0
  46. package/dist/desktop/preload.cjs +90 -0
  47. package/dist/desktop/preload.cjs.map +1 -0
  48. package/dist/desktop-renderer/assets/index-C66pDvHs.js +144 -0
  49. package/dist/desktop-renderer/assets/index-C66pDvHs.js.map +1 -0
  50. package/dist/desktop-renderer/assets/index-Cm_ktmXm.css +1 -0
  51. package/dist/desktop-renderer/index.html +16 -0
  52. package/dist/devtools-SXJBSV2N.js +3 -0
  53. package/dist/devtools-SXJBSV2N.js.map +1 -0
  54. package/dist/execution/docker.d.ts +29 -0
  55. package/dist/execution/factory.d.ts +3 -0
  56. package/dist/execution/types.d.ts +18 -0
  57. package/dist/goal/classifier.d.ts +12 -0
  58. package/dist/goal/orchestrator.d.ts +34 -0
  59. package/dist/goal/planner.d.ts +9 -0
  60. package/dist/goal/store.d.ts +9 -0
  61. package/dist/goal/types.d.ts +190 -0
  62. package/dist/hallucination/confidence.d.ts +12 -0
  63. package/dist/hallucination/evidence-ledger.d.ts +29 -0
  64. package/dist/hallucination/guard.d.ts +27 -0
  65. package/dist/hallucination/messages.d.ts +10 -0
  66. package/dist/hallucination/retry-monitor.d.ts +19 -0
  67. package/dist/hallucination/sliding-window.d.ts +13 -0
  68. package/dist/hallucination/types.d.ts +49 -0
  69. package/dist/harness/local.d.ts +54 -0
  70. package/dist/hooks/bus.d.ts +9 -0
  71. package/dist/hooks/types.d.ts +105 -0
  72. package/dist/ide/client.d.ts +35 -0
  73. package/dist/incidents/reporter.d.ts +38 -0
  74. package/dist/init/project.d.ts +25 -0
  75. package/dist/load-WQGNTCHC.js +20 -0
  76. package/dist/load-WQGNTCHC.js.map +1 -0
  77. package/dist/loop/budget.d.ts +11 -0
  78. package/dist/loop/isolation.d.ts +21 -0
  79. package/dist/loop/orchestrator.d.ts +82 -0
  80. package/dist/loop/store.d.ts +13 -0
  81. package/dist/loop/types.d.ts +142 -0
  82. package/dist/loop/verifier.d.ts +13 -0
  83. package/dist/mcp/client.d.ts +66 -0
  84. package/dist/mcp/sdk.d.ts +27 -0
  85. package/dist/memory/coordinator.d.ts +32 -0
  86. package/dist/memory/extractor.d.ts +15 -0
  87. package/dist/memory/intent.d.ts +2 -0
  88. package/dist/memory/retrieval.d.ts +13 -0
  89. package/dist/memory/review.d.ts +36 -0
  90. package/dist/memory/similarity.d.ts +5 -0
  91. package/dist/memory/store.d.ts +58 -0
  92. package/dist/memory/types.d.ts +37 -0
  93. package/dist/models/anthropic.d.ts +24 -0
  94. package/dist/models/cache-profile.d.ts +23 -0
  95. package/dist/models/openai.d.ts +24 -0
  96. package/dist/models/registry.d.ts +16 -0
  97. package/dist/models/structured.d.ts +75 -0
  98. package/dist/models/types.d.ts +93 -0
  99. package/dist/permissions/classifier.d.ts +9 -0
  100. package/dist/permissions/engine.d.ts +28 -0
  101. package/dist/plugins/host.d.ts +15 -0
  102. package/dist/plugins/types.d.ts +136 -0
  103. package/dist/production.d.ts +59 -0
  104. package/dist/prompts/system.d.ts +28 -0
  105. package/dist/rpc/schema.d.ts +61 -0
  106. package/dist/rpc/server.d.ts +54 -0
  107. package/dist/sdk/index.d.ts +19 -0
  108. package/dist/sdk/index.js +53 -0
  109. package/dist/sdk/index.js.map +1 -0
  110. package/dist/session/checkpoint.d.ts +25 -0
  111. package/dist/session/store.d.ts +154 -0
  112. package/dist/session/tree.d.ts +31 -0
  113. package/dist/skills/builtin-loop.d.ts +12 -0
  114. package/dist/skills/registry.d.ts +47 -0
  115. package/dist/skills/tool.d.ts +9 -0
  116. package/dist/sleep/organizer.d.ts +37 -0
  117. package/dist/tools/ask-user-question.d.ts +49 -0
  118. package/dist/tools/file-diff.d.ts +9 -0
  119. package/dist/tools/files.d.ts +49 -0
  120. package/dist/tools/lsp.d.ts +77 -0
  121. package/dist/tools/managed.d.ts +59 -0
  122. package/dist/tools/runtime.d.ts +58 -0
  123. package/dist/tools/search.d.ts +76 -0
  124. package/dist/tools/shell.d.ts +37 -0
  125. package/dist/tools/task-output.d.ts +53 -0
  126. package/dist/tools/todo-write.d.ts +35 -0
  127. package/dist/tools/types.d.ts +56 -0
  128. package/dist/trace/recorder.d.ts +14 -0
  129. package/dist/trace/replay.d.ts +3 -0
  130. package/dist/trace/schema.d.ts +26 -0
  131. package/dist/ui/commands.d.ts +67 -0
  132. package/dist/ui/session.d.ts +126 -0
  133. package/dist/ui/transcript.d.ts +89 -0
  134. package/dist/utils/async.d.ts +5 -0
  135. package/dist/utils/envUtils.d.ts +1 -0
  136. package/dist/utils/error.d.ts +2 -0
  137. package/dist/utils/execFileNoThrow.d.ts +13 -0
  138. package/dist/utils/intl.d.ts +18 -0
  139. package/dist/utils/json.d.ts +44 -0
  140. package/dist/utils/log.d.ts +28 -0
  141. package/dist/utils/redact.d.ts +10 -0
  142. package/dist/utils/usage-summary.d.ts +34 -0
  143. package/dist/utils/version.d.ts +6 -0
  144. package/package.json +124 -0
  145. package//346/212/200/346/234/257/346/226/271/346/241/210/346/212/245/345/221/212.md +4797 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/load.ts","../src/config/schema.ts","../src/config/protected-file.ts","../src/config/secret-envelope.ts"],"sourcesContent":["import { mkdir, readFile, writeFile } from \"node:fs/promises\";\r\nimport { join } from \"node:path\";\r\nimport { parse } from \"dotenv\";\nimport { FlavorConfigSchema, ProviderConfigSchema, type FlavorConfig, type ProviderConfig } from \"./schema.js\";\nimport { readRecoverableFile, updateProtectedFile } from \"./protected-file.js\";\nimport {\n decryptSecretFields,\n encryptSecretFields,\n hasPlainSecretFields,\n isSecretField,\n loadOrCreateConfigKey,\n} from \"./secret-envelope.js\";\n\r\ntype ConfigObject = Record<string, unknown>;\r\n\r\nexport interface LoadConfigOptions {\r\n cwd: string;\r\n home: string;\r\n cli?: ConfigObject;\r\n environment?: Record<string, string | undefined>;\r\n}\r\n\r\nexport interface LoadedConfig {\r\n config: FlavorConfig;\r\n sources: string[];\r\n}\r\n\r\ninterface ReadConfigResult { value: ConfigObject; source: string }\ninterface GlobalConfigDocument { config: ConfigObject; hasPlainSecrets: boolean }\n\nfunction parseConfigObject(path: string, raw: string): ConfigObject {\n const parsed: unknown = JSON.parse(raw);\n if (!isPlainObject(parsed)) {\n throw new Error(`Configuration file ${path} must contain a JSON object`);\n }\n return parsed;\n}\n\nasync function readJsonIfPresent(path: string): Promise<ReadConfigResult | undefined> {\n const result = await readRecoverableFile(path, (raw) => parseConfigObject(path, raw));\n return result === undefined ? undefined : { value: result.value, source: result.source };\n}\n\r\nasync function readTextIfPresent(path: string): Promise<string | undefined> {\r\n try {\r\n return await readFile(path, \"utf8\");\r\n } catch (error) {\r\n if (isMissingFileError(error)) {\r\n return undefined;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nfunction isMissingFileError(error: unknown): boolean {\r\n return (\r\n error instanceof Error &&\r\n \"code\" in error &&\r\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\r\n );\r\n}\r\n\r\nfunction isPlainObject(value: unknown): value is ConfigObject {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction mergeConfig(base: ConfigObject, override: ConfigObject): ConfigObject {\r\n const result: ConfigObject = { ...base };\r\n for (const [key, value] of Object.entries(override)) {\r\n if (value === undefined) {\r\n continue;\r\n }\r\n const current = result[key];\r\n result[key] =\r\n isPlainObject(current) && isPlainObject(value)\r\n ? mergeConfig(current, value)\r\n : value;\r\n }\r\n return result;\r\n}\r\n\r\nfunction interpolate(value: unknown, environment: Record<string, string | undefined>): unknown {\r\n if (typeof value === \"string\") {\r\n const result = value.replace(/\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g, (match, name: string) =>\r\n environment[name] === undefined ? match : environment[name],\r\n );\r\n // If the entire value is an unresolved template reference, drop it so\r\n // optional fields like baseURL fall back to their defaults instead of\r\n // failing URL validation with the literal \"${...}\" string.\r\n if (/^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(value) && result === value) {\r\n return undefined;\r\n }\r\n return result;\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map((item) => interpolate(item, environment));\r\n }\r\n if (isPlainObject(value)) {\r\n return Object.fromEntries(\r\n Object.entries(value).map(([key, item]) => [key, interpolate(item, environment)]),\r\n );\r\n }\r\n return value;\r\n}\r\n\r\nconst FLAVOR_ENV_VARS = [\r\n \"ANTHROPIC_BASE_URL\",\r\n \"ANTHROPIC_API_KEY\",\r\n \"OPENAI_API_KEY\",\r\n \"OAUTH_AUTHORIZATION_URL\",\r\n \"OAUTH_TOKEN_URL\",\r\n \"OAUTH_CALLBACK_HOST\",\r\n \"OAUTH_CLIENT_ID\",\r\n \"OAUTH_SCOPE\",\r\n] as const;\r\n\r\nasync function seedGlobalEnv(globalEnvPath: string): Promise<void> {\r\n try {\r\n // Skip if global .env already exists — never overwrite user settings.\r\n await readFile(globalEnvPath, \"utf8\");\r\n return;\r\n } catch (error) {\r\n if (!isMissingFileError(error)) return;\r\n }\r\n const lines: string[] = [];\r\n for (const key of FLAVOR_ENV_VARS) {\r\n const value = process.env[key];\r\n if (value !== undefined && value !== \"\") {\r\n lines.push(`${key}=${value}`);\r\n }\r\n }\r\n if (lines.length === 0) return;\r\n try {\r\n await mkdir(join(globalEnvPath, \"..\"), { recursive: true });\r\n await writeFile(globalEnvPath, `${lines.join(\"\\n\")}\\n`, \"utf8\");\r\n } catch {\r\n // Failing to seed the global env is not fatal.\r\n }\r\n}\r\n\r\nexport async function loadConfig(options: LoadConfigOptions): Promise<LoadedConfig> {\n const globalPath = join(options.home, \".flavor-code\", \"flavor.json\");\r\n const globalEnvPath = join(options.home, \".flavor-code\", \".env\");\r\n const envPath = join(options.cwd, \".env\");\r\n const projectPath = join(options.cwd, \".flavor\", \"flavor.json\");\r\n const sources: string[] = [];\r\n\r\n const keyDirectory = join(options.home, \".flavor-code\");\n let keyPromise: Promise<Buffer> | undefined;\n const getKey = () => keyPromise ??= loadOrCreateConfigKey(keyDirectory);\n const decodeGlobal = async (raw: string): Promise<GlobalConfigDocument> => {\n const stored = parseConfigObject(globalPath, raw);\n const hasPlainSecrets = hasPlainSecretFields(stored);\n const config = decryptSecretFields(stored, await getKey()) as ConfigObject;\n return { config, hasPlainSecrets };\n };\n const globalRead = await readRecoverableFile(globalPath, decodeGlobal);\n let globalConfig = globalRead?.value.config;\n if (globalRead?.value.hasPlainSecrets) {\n const key = await getKey();\n const protectedConfig = await updateProtectedFile<GlobalConfigDocument>({\n path: globalPath,\n decode: decodeGlobal,\n encode: (value) => `${JSON.stringify(encryptSecretFields(value.config, key), null, 2)}\\n`,\n backupEncode: (value) => `${JSON.stringify(encryptSecretFields(value.config, key), null, 2)}\\n`,\n update: (current) => current ?? { config: {}, hasPlainSecrets: false },\n });\n globalConfig = protectedConfig.config;\n }\n if (globalRead) sources.push(globalRead.source);\n\r\n // Load global .env first (lower priority), then project .env (higher priority).\r\n const globalEnvText = await readTextIfPresent(globalEnvPath);\r\n const projectEnvText = await readTextIfPresent(envPath);\r\n const projectEnvironment = {\r\n ...(globalEnvText === undefined ? {} : parse(globalEnvText)),\r\n ...(projectEnvText === undefined ? {} : parse(projectEnvText)),\r\n };\r\n if (globalEnvText !== undefined) sources.push(globalEnvPath);\r\n if (projectEnvText !== undefined) sources.push(envPath);\r\n\r\n // Populate process.env with .env values so they are visible to module-level\r\n // consumers (OAUTH_DEFAULTS, etc.). Never override an already-set env var.\r\n for (const [key, value] of Object.entries(projectEnvironment)) {\r\n if (value !== undefined && process.env[key] === undefined) {\r\n process.env[key] = value;\r\n }\r\n }\r\n\r\n // Seed global .env on first use — copy any flavor-relevant env vars from\r\n // the current environment so they are available from any project directory.\r\n await seedGlobalEnv(globalEnvPath);\r\n\r\n const projectRead = await readJsonIfPresent(projectPath);\n const projectConfig = projectRead?.value;\n if (projectRead) sources.push(projectRead.source);\n\r\n const merged = mergeConfig(\r\n mergeConfig(globalConfig ?? {}, projectConfig ?? {}),\r\n options.cli ?? {},\r\n );\r\n const interpolated = interpolate(merged, {\r\n ...(options.environment ?? process.env),\r\n ...projectEnvironment,\r\n });\r\n\r\n return {\r\n config: FlavorConfigSchema.parse(interpolated),\r\n sources,\r\n };\r\n}\r\n\r\nexport async function setProjectMcpServerDisabled(\n cwd: string,\n serverName: string,\n disabled: boolean,\n): Promise<string> {\n const directory = join(cwd, \".flavor\");\n const path = join(directory, \"flavor.json\");\n await updateProtectedFile<ConfigObject>({\n path,\n decode: (raw) => parseConfigObject(path, raw),\n encode: (value) => `${JSON.stringify(value, null, 2)}\\n`,\n update: (current) => {\n const projectConfig = { ...(current ?? {}) };\n const currentServers = projectConfig[\"mcpServers\"];\n if (currentServers !== undefined && !isPlainObject(currentServers)) {\n throw new Error(`Configuration field mcpServers in ${path} must be an object`);\n }\n const servers: ConfigObject = { ...(currentServers ?? {}) };\n const currentServer = servers[serverName];\n if (currentServer !== undefined && !isPlainObject(currentServer)) {\n throw new Error(`MCP server ${serverName} in ${path} must be an object`);\n }\n servers[serverName] = { ...(currentServer ?? {}), disabled };\n projectConfig[\"mcpServers\"] = servers;\n return projectConfig;\n },\n });\n return path;\n}\n\nexport async function setProjectSkillDisabled(\n cwd: string,\n skillName: string,\n disabled: boolean,\n inheritedDisabled: readonly string[] = [],\n): Promise<string> {\n const directory = join(cwd, \".flavor\");\n const path = join(directory, \"flavor.json\");\n await updateProtectedFile<ConfigObject>({\n path,\n decode: (raw) => parseConfigObject(path, raw),\n encode: (value) => `${JSON.stringify(value, null, 2)}\\n`,\n update: (current) => {\n const projectConfig = { ...(current ?? {}) };\n const currentSkills = projectConfig[\"skills\"];\n if (currentSkills !== undefined && !isPlainObject(currentSkills)) {\n throw new Error(`Configuration field skills in ${path} must be an object`);\n }\n const skills: ConfigObject = { ...(currentSkills ?? {}) };\n const currentDisabled = skills[\"disabled\"];\n if (currentDisabled !== undefined && (!Array.isArray(currentDisabled)\n || currentDisabled.some((name) => typeof name !== \"string\"))) {\n throw new Error(`Configuration field skills.disabled in ${path} must be a string array`);\n }\n const names = new Set((currentDisabled ?? inheritedDisabled) as string[]);\n if (disabled) names.add(skillName);\n else names.delete(skillName);\n skills[\"disabled\"] = [...names].sort();\n projectConfig[\"skills\"] = skills;\n return projectConfig;\n },\n });\n return path;\n}\n\nexport async function setGlobalProviderConfig(\n home: string,\n providerName: string,\n provider: ProviderConfig,\n): Promise<string> {\n const directory = join(home, \".flavor-code\");\n const path = join(directory, \"flavor.json\");\n const key = await loadOrCreateConfigKey(directory);\n const validatedProvider = ProviderConfigSchema.parse(provider);\n await updateProtectedFile<ConfigObject>({\n path,\n decode: (raw) => decryptSecretFields(parseConfigObject(path, raw), key) as ConfigObject,\n encode: (value) => `${JSON.stringify(encryptSecretFields(value, key), null, 2)}\\n`,\n update: (current) => {\n const globalConfig = { ...(current ?? {}) };\n const currentProviders = globalConfig[\"providers\"];\n if (currentProviders !== undefined && !isPlainObject(currentProviders)) {\n throw new Error(`Configuration field providers in ${path} must be an object`);\n }\n const providers: ConfigObject = { ...(currentProviders ?? {}) };\n const existing = providers[providerName];\n if (existing !== undefined && !isPlainObject(existing)) {\n throw new Error(`Provider ${providerName} in ${path} must be an object`);\n }\n const existingModels = isPlainObject(existing) && Array.isArray(existing[\"models\"])\n ? existing[\"models\"].filter((model): model is string => typeof model === \"string\")\n : [];\n providers[providerName] = {\n ...(existing ?? {}),\n ...validatedProvider,\n ...(validatedProvider.models === undefined\n ? {}\n : { models: [...new Set([...existingModels, ...validatedProvider.models])] }),\n };\n globalConfig[\"providers\"] = providers;\n return globalConfig;\n },\n });\n return path;\n}\n\nexport async function setProjectProviderConfig(\n cwd: string,\n providerName: string,\n provider: ProviderConfig,\n): Promise<string> {\n const directory = join(cwd, \".flavor\");\n const path = join(directory, \"flavor.json\");\n const validatedProvider = ProviderConfigSchema.parse(provider);\n const projectProvider: ProviderConfig = { ...validatedProvider };\n delete projectProvider.apiKey;\n await updateProtectedFile<ConfigObject>({\n path,\n decode: (raw) => parseConfigObject(path, raw),\n encode: (value) => `${JSON.stringify(value, null, 2)}\\n`,\n update: (current) => {\n const projectConfig = { ...(current ?? {}) };\n const currentProviders = projectConfig[\"providers\"];\n if (currentProviders !== undefined && !isPlainObject(currentProviders)) {\n throw new Error(`Configuration field providers in ${path} must be an object`);\n }\n const providers: ConfigObject = { ...(currentProviders ?? {}) };\n const existing = providers[providerName];\n if (existing !== undefined && !isPlainObject(existing)) {\n throw new Error(`Provider ${providerName} in ${path} must be an object`);\n }\n const existingModels = isPlainObject(existing) && Array.isArray(existing[\"models\"])\n ? existing[\"models\"].filter((model): model is string => typeof model === \"string\")\n : [];\n const nextProvider: ConfigObject = {\n ...(existing ?? {}),\n ...projectProvider,\n ...(projectProvider.models === undefined\n ? {}\n : { models: [...new Set([...existingModels, ...projectProvider.models])] }),\n };\n delete nextProvider[\"apiKey\"];\n providers[providerName] = nextProvider;\n projectConfig[\"providers\"] = providers;\n return projectConfig;\n },\n });\n return path;\n}\n\nexport function redactConfig(config: unknown): unknown {\n if (Array.isArray(config)) {\r\n return config.map((item) => redactConfig(item));\r\n }\r\n if (!isPlainObject(config)) {\r\n return config;\r\n }\r\n return Object.fromEntries(\r\n Object.entries(config).map(([key, value]) => [\r\n key,\r\n isSecretField(key) ? \"[redacted]\" : redactConfig(value),\n ]),\r\n );\r\n}\r\n","import { z } from \"zod\";\r\n\r\nexport const PERMISSION_MODES = [\r\n \"default\", \"acceptEdits\", \"plan\", \"bypassPermissions\", \"auto\", \"bubble\",\r\n] as const;\r\nexport type PermissionMode = (typeof PERMISSION_MODES)[number];\r\nexport type LegacyPermissionMode = \"safe\" | \"workspace\" | \"full\";\r\n\r\nexport function normalizePermissionMode(value: unknown): unknown {\r\n if (value === \"safe\" || value === \"workspace\") return \"default\";\r\n if (value === \"full\") return \"bypassPermissions\";\r\n return value;\r\n}\r\n\r\nexport const PermissionModeSchema = z.preprocess(\r\n normalizePermissionMode,\r\n z.enum(PERMISSION_MODES).default(\"default\"),\r\n);\r\n\r\nexport const ProviderConfigSchema = z.object({\r\n type: z.string(),\r\n baseURL: z.string().url().optional(),\r\n apiKey: z.string().optional(),\r\n defaultModel: z.string().min(1).optional(),\r\n cheapModel: z.string().min(1).optional(),\r\n models: z.array(z.string().min(1)).max(100).optional(),\r\n maxOutputTokens: z.number().int().positive().optional(),\r\n // OAuth PKCE fields\r\n apiType: z.enum([\"openai\", \"anthropic\"]).optional(),\r\n authorizationUrl: z.string().url().optional(),\r\n tokenUrl: z.string().url().optional(),\r\n clientId: z.string().min(1).optional(),\r\n scope: z.string().optional(),\r\n});\r\n\r\nconst McpServerCommonShape = {\r\n disabled: z.boolean().default(false),\r\n timeoutMs: z.number().int().min(100).max(30 * 60_000).default(60_000),\r\n};\r\n\r\nexport const McpStdioServerConfigSchema = z.object({\r\n command: z.string().min(1),\r\n args: z.array(z.string()).default([]),\r\n env: z.record(z.string(), z.string()).default({}),\r\n cwd: z.string().min(1).optional(),\r\n ...McpServerCommonShape,\r\n}).strict();\r\n\r\nexport const McpHttpServerConfigSchema = z.object({\r\n url: z.string().url().refine((value) => {\r\n const protocol = new URL(value).protocol;\r\n return protocol === \"http:\" || protocol === \"https:\";\r\n }, \"MCP HTTP URLs must use http or https\"),\r\n headers: z.record(z.string(), z.string()).default({}),\r\n ...McpServerCommonShape,\r\n}).strict();\r\n\r\nexport const McpServerConfigSchema = z.union([\r\n McpStdioServerConfigSchema,\r\n McpHttpServerConfigSchema,\r\n]);\r\n\r\nexport const McpServerNameSchema = z.string()\r\n .min(1)\r\n .max(32)\r\n .regex(/^[A-Za-z0-9_-]+$/, \"MCP server names may contain only letters, digits, underscores, and hyphens\");\r\n\r\nexport const SkillNameSchema = z.string()\r\n .min(1)\r\n .max(64)\r\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, \"Skill names must use lowercase letters, digits, and single hyphens\");\r\n\r\nexport const FlavorConfigSchema = z.object({\r\n sleep: z.boolean().default(false),\r\n providers: z.record(z.string(), ProviderConfigSchema).default({}),\r\n mcpServers: z.record(McpServerNameSchema, McpServerConfigSchema).default({}),\r\n skills: z.object({\r\n disabled: z.array(SkillNameSchema).max(1_000).default([]),\r\n }).prefault({}),\r\n agents: z\r\n .object({\r\n main: z.object({ model: z.string() }).optional(),\r\n subagent: z.object({ model: z.string() }).optional(),\r\n })\r\n .optional(),\r\n maxSubagents: z.number().int().min(1).max(16).default(3),\r\n maxSessions: z.number().int().min(1).max(1000).default(50),\r\n memory: z\r\n .object({\r\n enabled: z.boolean().default(true),\r\n autoExtract: z.boolean().default(true),\r\n autoExtractMinChars: z.number().int().min(200).max(100_000).default(200),\r\n scoreThreshold: z.number().int().min(0).max(12).default(9),\r\n autoStoreThreshold: z.number().int().min(0).max(12).default(11),\r\n ignoreStreakLimit: z.number().int().min(2).max(100).default(5),\r\n reviewAutoDismissSeconds: z.number().int().min(0).max(300).default(5),\r\n maxCandidatesPerTask: z.number().int().min(1).max(10).default(1),\r\n retrievalTopK: z.number().int().min(1).max(20).default(5),\r\n maxEntries: z.number().int().min(1).max(10_000).default(200),\r\n maxEntryChars: z.number().int().min(32).max(20_000).default(1_000),\r\n maxPromptChars: z.number().int().min(256).max(200_000).default(12_000),\r\n })\r\n .prefault({}),\r\n permissionMode: PermissionModeSchema,\r\n execution: z.object({\r\n mode: z.enum([\"local\", \"docker\"]).default(\"local\"),\r\n image: z.string().trim().min(1).default(\"node:24-bookworm-slim\"),\r\n network: z.boolean().default(false),\r\n memory: z.string().regex(/^[1-9][0-9]*(?:[kKmMgG])?$/).default(\"2g\"),\r\n cpus: z.number().positive().max(64).default(2),\r\n }).prefault({}),\r\n language: z\r\n .string()\r\n .regex(/^[a-z]{2}(-[A-Z]{2})?$/, \"language must be a BCP47 tag like zh-CN or en-US\")\r\n .optional(),\r\n hallucination: z\r\n .object({\r\n showWarnings: z.boolean().default(false),\r\n evaluationTimeoutMs: z.number().int().min(100).max(30_000).default(2_000),\r\n })\r\n .prefault({}),\r\n maxIterations: z\r\n .object({\r\n main: z.number().int().min(10).max(500).default(80),\r\n subagent: z.number().int().min(10).max(200).default(40),\r\n softLimitFactor: z.number().min(0.5).max(1.0).default(0.8),\r\n extendBy: z.number().int().min(5).max(100).default(20),\r\n })\r\n .prefault({}),\r\n loop: z\r\n .object({\r\n maxCycles: z.number().int().positive().max(10_000).default(20),\r\n maxTokens: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).default(500_000),\r\n isolation: z.literal(\"auto\").default(\"auto\"),\r\n })\r\n .prefault({}),\r\n context: z\r\n .object({\r\n windowTokens: z.number().int().positive().default(200_000),\r\n reservedOutputTokens: z.number().int().nonnegative().default(20_000),\r\n autoCompactBufferTokens: z.number().int().nonnegative().default(13_000),\r\n warningBufferTokens: z.number().int().nonnegative().default(20_000),\r\n blockingBufferTokens: z.number().int().nonnegative().default(3_000),\r\n microcompactKeepRecentToolResults: z.number().int().nonnegative().default(5),\r\n recentTokens: z.number().int().nonnegative().default(10_000),\r\n recentTextMessages: z.number().int().nonnegative().default(5),\r\n maxRecentTokens: z.number().int().nonnegative().default(40_000),\r\n /** @deprecated Character threshold retained for configuration compatibility. */\r\n compactAtChars: z.number().int().positive().optional(),\r\n toolOutputChars: z.number().int().positive().default(30_000),\r\n })\r\n .superRefine((context, issue) => {\r\n if (context.reservedOutputTokens >= context.windowTokens) issue.addIssue({\r\n code: \"custom\", path: [\"reservedOutputTokens\"], message: \"reservedOutputTokens must be below windowTokens\",\r\n });\r\n if (context.maxRecentTokens < context.recentTokens) issue.addIssue({\r\n code: \"custom\", path: [\"maxRecentTokens\"], message: \"maxRecentTokens must be at least recentTokens\",\r\n });\r\n })\r\n .prefault({}),\r\n incidents: z\r\n .object({\r\n enabled: z.boolean().default(false),\r\n webhookUrl: z.string().url().optional(),\r\n })\r\n .prefault({}),\r\n});\r\n\r\nexport type FlavorConfig = z.infer<typeof FlavorConfigSchema>;\r\nexport type ProviderConfig = z.infer<typeof ProviderConfigSchema>;\r\nexport type McpServerConfig = z.infer<typeof McpServerConfigSchema>;\r\nexport type McpServerConfigInput = z.input<typeof McpServerConfigSchema>;\r\nexport type McpStdioServerConfig = z.infer<typeof McpStdioServerConfigSchema>;\r\nexport type McpHttpServerConfig = z.infer<typeof McpHttpServerConfigSchema>;\r\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, stat } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nconst LOCK_WAIT_MS = 20;\nconst LOCK_TIMEOUT_MS = 2_000;\nconst STALE_LOCK_MS = 30_000;\n\nexport interface RecoverableFile<T> {\n value: T;\n source: string;\n}\n\nexport interface ProtectedFileUpdate<T> {\n path: string;\n decode(raw: string): T | Promise<T>;\n encode(value: T): string | Promise<string>;\n update(current: T | undefined): T | Promise<T>;\n backupEncode?(current: T): string | Promise<string>;\n lockTimeoutMs?: number;\n staleLockMs?: number;\n}\n\nexport async function readRecoverableFile<T>(\n path: string,\n decode: (raw: string) => T | Promise<T>,\n): Promise<RecoverableFile<T> | undefined> {\n let primaryError: unknown;\n try {\n return { value: await decode(await readFile(path, \"utf8\")), source: path };\n } catch (error) {\n if (isCode(error, \"ENOENT\")) primaryError = error;\n else primaryError = error;\n }\n\n const backup = `${path}.bak`;\n try {\n return { value: await decode(await readFile(backup, \"utf8\")), source: backup };\n } catch (backupError) {\n if (isCode(primaryError, \"ENOENT\") && isCode(backupError, \"ENOENT\")) return undefined;\n if (isCode(backupError, \"ENOENT\")) throw primaryError;\n const reason = backupError instanceof Error ? backupError.message : String(backupError);\n const primary = primaryError instanceof Error ? primaryError.message : String(primaryError);\n throw new Error(`Primary and backup files are invalid for ${path}: ${primary}; backup: ${reason}`);\n }\n}\n\nexport async function updateProtectedFile<T>(options: ProtectedFileUpdate<T>): Promise<T> {\n await mkdir(dirname(options.path), { recursive: true, mode: 0o700 });\n return withFileLock(options.path, async () => {\n const current = await readRecoverableFile(options.path, options.decode);\n const next = await options.update(current?.value);\n if (current !== undefined) {\n const backup = options.backupEncode === undefined\n ? await options.encode(current.value)\n : await options.backupEncode(current.value);\n await writeAtomic(`${options.path}.bak`, backup);\n }\n await writeAtomic(options.path, await options.encode(next));\n return next;\n }, options.lockTimeoutMs ?? LOCK_TIMEOUT_MS, options.staleLockMs ?? STALE_LOCK_MS);\n}\n\nasync function withFileLock<T>(\n path: string,\n operation: () => Promise<T>,\n lockTimeoutMs: number,\n staleLockMs: number,\n): Promise<T> {\n const lockPath = `${path}.lock`;\n const token = JSON.stringify({ pid: process.pid, nonce: randomUUID() });\n const deadline = Date.now() + lockTimeoutMs;\n let handle;\n while (handle === undefined) {\n try {\n handle = await open(lockPath, \"wx\", 0o600);\n await handle.writeFile(token, \"utf8\");\n await handle.sync();\n } catch (error) {\n await handle?.close().catch(() => undefined);\n handle = undefined;\n if (!isCode(error, \"EEXIST\")) throw error;\n await removeStaleLock(lockPath, staleLockMs);\n if (Date.now() >= deadline) throw new Error(`Timed out waiting for configuration lock ${lockPath}`);\n await delay(LOCK_WAIT_MS);\n }\n }\n\n await handle.close();\n try {\n return await operation();\n } finally {\n try {\n if ((await readFile(lockPath, \"utf8\")) === token) await rm(lockPath, { force: true });\n } catch (error) {\n if (!isCode(error, \"ENOENT\")) throw error;\n }\n }\n}\n\nasync function removeStaleLock(path: string, staleLockMs: number): Promise<void> {\n try {\n const token = await readFile(path, \"utf8\");\n const metadata = await stat(path);\n if (Date.now() - metadata.mtimeMs <= staleLockMs) return;\n const owner = parseLockOwner(token);\n if (owner !== undefined && isProcessAlive(owner)) return;\n if (await readFile(path, \"utf8\") !== token) return;\n const stale = `${path}.stale-${process.pid}-${randomUUID()}`;\n try {\n await rename(path, stale);\n await rm(stale, { force: true });\n } catch (error) {\n if (!isCode(error, \"ENOENT\")) return;\n }\n } catch (error) {\n if (!isCode(error, \"ENOENT\")) throw error;\n }\n}\n\nfunction parseLockOwner(token: string): number | undefined {\n try {\n const parsed: unknown = JSON.parse(token);\n if (typeof parsed !== \"object\" || parsed === null || !(\"pid\" in parsed)) return undefined;\n const pid = (parsed as { pid?: unknown }).pid;\n return typeof pid === \"number\" && Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;\n } catch {\n const legacy = token.match(/^(\\d+):/);\n if (legacy?.[1] === undefined) return undefined;\n const pid = Number(legacy[1]);\n return Number.isSafeInteger(pid) && pid > 0 ? pid : undefined;\n }\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return isCode(error, \"EPERM\");\n }\n}\n\nasync function writeAtomic(path: string, content: string): Promise<void> {\n const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;\n let handle;\n try {\n handle = await open(temporary, \"wx\", 0o600);\n await handle.writeFile(content, \"utf8\");\n await handle.sync();\n await handle.close();\n handle = undefined;\n await rename(temporary, path);\n } finally {\n await handle?.close().catch(() => undefined);\n await rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolvePromise) => setTimeout(resolvePromise, ms));\n}\n\nfunction isCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error\n && (error as NodeJS.ErrnoException).code === code;\n}\n","import { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\nimport { mkdir, open, readFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nconst FIELD_PREFIX = \"flavor:v1:\";\nconst FILE_PREFIX = \"flavor-file:v1:\";\nconst KEY_BYTES = 32;\n\nexport function isSecretField(key: string): boolean {\n const normalized = key.replace(/[-_.]/g, \"\").toLowerCase();\n return [\"apikey\", \"authorization\", \"token\", \"password\", \"secret\"]\n .some((suffix) => normalized.endsWith(suffix));\n}\n\nexport function hasPlainSecretFields(value: unknown): boolean {\n if (Array.isArray(value)) return value.some(hasPlainSecretFields);\n if (!isObject(value)) return false;\n return Object.entries(value).some(([key, item]) =>\n (isSecretField(key) && typeof item === \"string\" && !item.startsWith(FIELD_PREFIX))\n || hasPlainSecretFields(item),\n );\n}\n\nexport function hasEncryptedSecretFields(value: unknown): boolean {\n if (Array.isArray(value)) return value.some(hasEncryptedSecretFields);\n if (!isObject(value)) return false;\n return Object.entries(value).some(([key, item]) =>\n (isSecretField(key) && typeof item === \"string\" && item.startsWith(FIELD_PREFIX))\n || hasEncryptedSecretFields(item),\n );\n}\n\nexport function encryptSecretFields(value: unknown, key: Buffer): unknown {\n if (Array.isArray(value)) return value.map((item) => encryptSecretFields(item, key));\n if (!isObject(value)) return value;\n return Object.fromEntries(Object.entries(value).map(([name, item]) => [\n name,\n isSecretField(name) && typeof item === \"string\"\n ? (item.startsWith(FIELD_PREFIX) ? item : `${FIELD_PREFIX}${seal(item, key)}`)\n : encryptSecretFields(item, key),\n ]));\n}\n\nexport function decryptSecretFields(value: unknown, key: Buffer): unknown {\n if (Array.isArray(value)) return value.map((item) => decryptSecretFields(item, key));\n if (!isObject(value)) return value;\n return Object.fromEntries(Object.entries(value).map(([name, item]) => [\n name,\n isSecretField(name) && typeof item === \"string\" && item.startsWith(FIELD_PREFIX)\n ? openEnvelope(item.slice(FIELD_PREFIX.length), key)\n : decryptSecretFields(item, key),\n ]));\n}\n\nexport function encryptDocument(value: unknown, key: Buffer): string {\n return JSON.stringify(`${FILE_PREFIX}${seal(JSON.stringify(value), key)}`);\n}\n\nexport function decryptDocument(raw: string, key: Buffer): unknown {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed === \"string\" && parsed.startsWith(FILE_PREFIX)) {\n return JSON.parse(openEnvelope(parsed.slice(FILE_PREFIX.length), key)) as unknown;\n }\n return parsed;\n}\n\nexport async function loadOrCreateConfigKey(directory: string): Promise<Buffer> {\n const path = join(directory, \".config.key\");\n try {\n return parseKey(await readFile(path, \"utf8\"));\n } catch (error) {\n if (!isCode(error, \"ENOENT\")) throw error;\n }\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const key = randomBytes(KEY_BYTES);\n let handle;\n try {\n handle = await open(path, \"wx\", 0o600);\n await handle.writeFile(`${key.toString(\"base64\")}\\n`, \"utf8\");\n await handle.sync();\n return key;\n } catch (error) {\n if (!isCode(error, \"EEXIST\")) throw error;\n return parseKey(await readFile(path, \"utf8\"));\n } finally {\n await handle?.close().catch(() => undefined);\n }\n}\n\nfunction seal(plaintext: string, key: Buffer): string {\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const ciphertext = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n return [iv, cipher.getAuthTag(), ciphertext].map((part) => part.toString(\"base64\")).join(\":\");\n}\n\nfunction openEnvelope(envelope: string, key: Buffer): string {\n const parts = envelope.split(\":\");\n if (parts.length !== 3) throw new Error(\"Invalid encrypted value envelope\");\n const [ivText, tagText, ciphertextText] = parts as [string, string, string];\n try {\n const decipher = createDecipheriv(\"aes-256-gcm\", key, Buffer.from(ivText, \"base64\"));\n decipher.setAuthTag(Buffer.from(tagText, \"base64\"));\n return Buffer.concat([\n decipher.update(Buffer.from(ciphertextText, \"base64\")),\n decipher.final(),\n ]).toString(\"utf8\");\n } catch (error) {\n throw new Error(`Encrypted value failed authentication: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\nfunction parseKey(raw: string): Buffer {\n const key = Buffer.from(raw.trim(), \"base64\");\n if (key.length !== KEY_BYTES) throw new Error(\"Invalid Flavor configuration key\");\n return key;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isCode(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && \"code\" in error\n && (error as NodeJS.ErrnoException).code === code;\n}\n"],"mappings":"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","names":["mkdir","readFile","join","mkdir","open","readFile","dirname","readFile","isCode","mkdir","dirname","open","readFile","mkdir","join"]}
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module"; const require = createRequire(import.meta.url);
3
+
4
+ // src/utils/execFileNoThrow.ts
5
+ import { execFile } from "child_process";
6
+ function execFileNoThrow(file, args, options = {}) {
7
+ return new Promise((resolve2) => {
8
+ const child = execFile(file, args, {
9
+ timeout: options.timeout,
10
+ cwd: options.useCwd === false ? void 0 : process.cwd(),
11
+ env: options.env,
12
+ encoding: "utf8"
13
+ }, (error, stdout, stderr) => {
14
+ resolve2({
15
+ stdout,
16
+ stderr,
17
+ code: typeof error?.code === "number" ? error.code : error ? 1 : 0,
18
+ ...error === null ? {} : { error: error.message }
19
+ });
20
+ });
21
+ if (options.input !== void 0) child.stdin?.end(options.input);
22
+ });
23
+ }
24
+
25
+ // src/utils/log.ts
26
+ import { appendFile, mkdir } from "fs/promises";
27
+ import { dirname, join, resolve } from "path";
28
+ var pending = Promise.resolve();
29
+ var usagePending = Promise.resolve();
30
+ function logError(error) {
31
+ if (process.env.DEBUG) process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}
32
+ `);
33
+ }
34
+ function usageLogPath() {
35
+ return process.env.FLAVOR_USAGE_FILE ?? join(process.cwd(), ".flavor", "usage.jsonl");
36
+ }
37
+ var usageSessionId = "unknown";
38
+ var truncateOnNextAppend = false;
39
+ function setUsageSession(sessionId) {
40
+ usageSessionId = sessionId;
41
+ truncateOnNextAppend = true;
42
+ }
43
+ function currentUsageSession() {
44
+ return usageSessionId;
45
+ }
46
+ async function appendUsageLog(line) {
47
+ usagePending = usagePending.catch(() => void 0).then(async () => {
48
+ try {
49
+ const path = usageLogPath();
50
+ await mkdir(dirname(path), { recursive: true, mode: 448 });
51
+ const flag = truncateOnNextAppend ? "w" : "a";
52
+ truncateOnNextAppend = false;
53
+ await appendFile(path, `${line}
54
+ `, { encoding: "utf8", mode: 384, flag });
55
+ } catch {
56
+ }
57
+ });
58
+ return usagePending;
59
+ }
60
+ var AuditLogger = class {
61
+ #path;
62
+ #closed = false;
63
+ constructor(workspace) {
64
+ this.#path = join(resolve(workspace), ".flavor", "audit.jsonl");
65
+ }
66
+ get path() {
67
+ return this.#path;
68
+ }
69
+ async append(entry) {
70
+ if (this.#closed) return;
71
+ const line = `${JSON.stringify(entry)}
72
+ `;
73
+ pending = pending.catch(() => void 0).then(() => this.#write(line));
74
+ return pending;
75
+ }
76
+ async #write(line) {
77
+ try {
78
+ await mkdir(dirname(this.#path), { recursive: true, mode: 448 });
79
+ await appendFile(this.#path, line, { encoding: "utf8", mode: 384, flag: "a" });
80
+ } catch {
81
+ }
82
+ }
83
+ close() {
84
+ this.#closed = true;
85
+ }
86
+ };
87
+
88
+ // src/utils/intl.ts
89
+ var graphemeSegmenter;
90
+ function getGraphemeSegmenter() {
91
+ return graphemeSegmenter ??= new Intl.Segmenter(void 0, { granularity: "grapheme" });
92
+ }
93
+ function detectSystemLocale() {
94
+ try {
95
+ const locale = Intl.DateTimeFormat().resolvedOptions().locale;
96
+ if (locale && locale.length >= 2) return locale;
97
+ } catch {
98
+ }
99
+ for (const key of ["LANG", "LC_ALL", "LC_MESSAGES"]) {
100
+ const raw = process.env[key];
101
+ if (!raw || raw === "C" || raw === "POSIX") continue;
102
+ const match = raw.match(/^([a-z]{2})_([A-Z]{2})(?:[.@].*)?$/);
103
+ if (match) return `${match[1]}-${match[2]}`;
104
+ }
105
+ return "zh-CN";
106
+ }
107
+ function resolveLanguage(explicit) {
108
+ if (explicit !== void 0) return explicit;
109
+ return detectSystemLocale();
110
+ }
111
+ function languageInstruction(language) {
112
+ const label = LANG_LABELS.get(language) ?? language;
113
+ return `Always respond in ${label}. Do NOT reply in any other language unless the user explicitly asks for it.`;
114
+ }
115
+ var LANG_LABELS = /* @__PURE__ */ new Map([
116
+ ["zh-CN", "Simplified Chinese (zh-CN)"],
117
+ ["zh-TW", "Traditional Chinese (zh-TW)"],
118
+ ["zh-HK", "Traditional Chinese (zh-HK)"],
119
+ ["ja-JP", "Japanese (ja-JP)"],
120
+ ["ko-KR", "Korean (ko-KR)"],
121
+ ["en-US", "English (en-US)"],
122
+ ["en-GB", "English (en-GB)"],
123
+ ["fr-FR", "French (fr-FR)"],
124
+ ["de-DE", "German (de-DE)"],
125
+ ["es-ES", "Spanish (es-ES)"],
126
+ ["pt-BR", "Portuguese (pt-BR)"],
127
+ ["ru-RU", "Russian (ru-RU)"],
128
+ ["ar-SA", "Arabic (ar-SA)"],
129
+ ["vi-VN", "Vietnamese (vi-VN)"],
130
+ ["th-TH", "Thai (th-TH)"],
131
+ ["id-ID", "Indonesian (id-ID)"]
132
+ ]);
133
+
134
+ // src/utils/envUtils.ts
135
+ function isEnvTruthy(value) {
136
+ if (typeof value === "boolean") return value;
137
+ return value === "1" || value?.toLowerCase() === "true" || value?.toLowerCase() === "yes";
138
+ }
139
+
140
+ export {
141
+ execFileNoThrow,
142
+ isEnvTruthy,
143
+ logError,
144
+ usageLogPath,
145
+ setUsageSession,
146
+ currentUsageSession,
147
+ appendUsageLog,
148
+ AuditLogger,
149
+ getGraphemeSegmenter,
150
+ resolveLanguage,
151
+ languageInstruction
152
+ };
153
+ //# sourceMappingURL=chunk-VOCZVFP7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/execFileNoThrow.ts","../src/utils/log.ts","../src/utils/intl.ts","../src/utils/envUtils.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\n\nexport interface ExecFileNoThrowOptions {\n timeout?: number;\n useCwd?: boolean;\n env?: NodeJS.ProcessEnv;\n stdin?: \"ignore\" | \"inherit\" | \"pipe\";\n input?: string;\n}\n\nexport function execFileNoThrow(\n file: string,\n args: string[],\n options: ExecFileNoThrowOptions = {},\n): Promise<{ stdout: string; stderr: string; code: number; error?: string }> {\n return new Promise((resolve) => {\n const child = execFile(file, args, {\n timeout: options.timeout,\n cwd: options.useCwd === false ? undefined : process.cwd(),\n env: options.env,\n encoding: \"utf8\",\n }, (error, stdout, stderr) => {\n resolve({ stdout, stderr, code: typeof error?.code === \"number\" ? error.code : error ? 1 : 0,\n ...(error === null ? {} : { error: error.message }) });\n });\n if (options.input !== undefined) child.stdin?.end(options.input);\n });\n}\n","import { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\n\nlet pending: Promise<void> = Promise.resolve();\nlet usagePending: Promise<void> = Promise.resolve();\n\nexport function logError(error: unknown): void {\n if (process.env.DEBUG) process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\\n`);\n}\n\nexport function usageLogPath(): string {\n // FLAVOR_USAGE_FILE overrides the default workspace-relative location so\n // tests and embedded runtimes can direct logs elsewhere.\n return process.env.FLAVOR_USAGE_FILE ?? join(process.cwd(), \".flavor\", \"usage.jsonl\");\n}\n\nlet usageSessionId = \"unknown\";\n// Each new session overwrites the previous session's log so the file always\n// reflects the current session only.\nlet truncateOnNextAppend = false;\n\nexport function setUsageSession(sessionId: string): void {\n usageSessionId = sessionId;\n truncateOnNextAppend = true;\n}\n\nexport function currentUsageSession(): string {\n return usageSessionId;\n}\n\nexport async function appendUsageLog(line: string): Promise<void> {\n // Serialise appends so concurrent requests don't interleave.\n usagePending = usagePending.catch(() => undefined).then(async () => {\n try {\n const path = usageLogPath();\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const flag = truncateOnNextAppend ? \"w\" : \"a\";\n truncateOnNextAppend = false;\n await appendFile(path, `${line}\\n`, { encoding: \"utf8\", mode: 0o600, flag });\n } catch {\n // Usage logging must never break model streaming.\n }\n });\n return usagePending;\n}\n\nexport interface AuditEntry {\n timestamp: string;\n sessionId: string;\n event: string;\n tool?: string | undefined;\n model?: string | undefined;\n agent?: string | undefined;\n errorCode?: string | undefined;\n errorMessage?: string | undefined;\n attempt?: number | undefined;\n maxAttempts?: number | undefined;\n purpose?: string | undefined;\n repairAttempt?: number | undefined;\n repairMaxAttempts?: number | undefined;\n input?: unknown;\n}\n\nexport class AuditLogger {\n readonly #path: string;\n #closed = false;\n\n constructor(workspace: string) {\n this.#path = join(resolve(workspace), \".flavor\", \"audit.jsonl\");\n }\n\n get path(): string {\n return this.#path;\n }\n\n async append(entry: AuditEntry): Promise<void> {\n if (this.#closed) return;\n const line = `${JSON.stringify(entry)}\\n`;\n // Serialise appends so concurrent writes don't interleave.\n pending = pending.catch(() => undefined).then(() => this.#write(line));\n return pending;\n }\n\n async #write(line: string): Promise<void> {\n try {\n await mkdir(dirname(this.#path), { recursive: true, mode: 0o700 });\n await appendFile(this.#path, line, { encoding: \"utf8\", mode: 0o600, flag: \"a\" });\n } catch {\n // Audit log write failures must not crash the agent. Swallow silently.\n }\n }\n\n close(): void {\n this.#closed = true;\n }\n}\n","let graphemeSegmenter: Intl.Segmenter | undefined;\nexport function getGraphemeSegmenter(): Intl.Segmenter {\n return graphemeSegmenter ??= new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n}\n\n/**\n * Detect the system locale as a BCP47 language tag (e.g. \"zh-CN\", \"en-US\").\n * Uses Intl (available since Node 13) and falls back to POSIX locale\n * environment variables on Unix systems.\n */\nexport function detectSystemLocale(): string {\n // Primary: Intl.DateTimeFormat gives a BCP47 tag directly.\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n if (locale && locale.length >= 2) return locale;\n } catch {\n // Ignore — Intl is not available or throws.\n }\n\n // Fallback: parse POSIX-style LANG / LC_ALL on Unix.\n for (const key of [\"LANG\", \"LC_ALL\", \"LC_MESSAGES\"]) {\n const raw = process.env[key];\n if (!raw || raw === \"C\" || raw === \"POSIX\") continue;\n const match = raw.match(/^([a-z]{2})_([A-Z]{2})(?:[.@].*)?$/);\n if (match) return `${match[1]}-${match[2]}`;\n }\n\n // Ultimate fallback: Simplified Chinese.\n return \"zh-CN\";\n}\n\n/**\n * Resolve the effective language tag: explicit config wins, then system\n * detection, and finally \"en-US\" as the ultimate default.\n */\nexport function resolveLanguage(explicit: string | undefined): string {\n if (explicit !== undefined) return explicit;\n return detectSystemLocale();\n}\n\n/**\n * Build a short instruction suffix that tells the agent which language to\n * reply in. When the tag is English we still emit it so the model knows\n * the preference is explicit.\n */\nexport function languageInstruction(language: string): string {\n // Map common BCP47 tags to human-readable labels the model understands.\n const label = LANG_LABELS.get(language) ?? language;\n return `Always respond in ${label}. Do NOT reply in any other language unless the user explicitly asks for it.`;\n}\n\nconst LANG_LABELS = new Map<string, string>([\n [\"zh-CN\", \"Simplified Chinese (zh-CN)\"],\n [\"zh-TW\", \"Traditional Chinese (zh-TW)\"],\n [\"zh-HK\", \"Traditional Chinese (zh-HK)\"],\n [\"ja-JP\", \"Japanese (ja-JP)\"],\n [\"ko-KR\", \"Korean (ko-KR)\"],\n [\"en-US\", \"English (en-US)\"],\n [\"en-GB\", \"English (en-GB)\"],\n [\"fr-FR\", \"French (fr-FR)\"],\n [\"de-DE\", \"German (de-DE)\"],\n [\"es-ES\", \"Spanish (es-ES)\"],\n [\"pt-BR\", \"Portuguese (pt-BR)\"],\n [\"ru-RU\", \"Russian (ru-RU)\"],\n [\"ar-SA\", \"Arabic (ar-SA)\"],\n [\"vi-VN\", \"Vietnamese (vi-VN)\"],\n [\"th-TH\", \"Thai (th-TH)\"],\n [\"id-ID\", \"Indonesian (id-ID)\"],\n]);\n","export function isEnvTruthy(value: string | boolean | undefined): boolean {\n if (typeof value === \"boolean\") return value;\n return value === \"1\" || value?.toLowerCase() === \"true\" || value?.toLowerCase() === \"yes\";\n}\n"],"mappings":"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","names":["resolve"]}