flag.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import { Config } from "effect"
  2. import { InstallationChannel } from "../installation/version"
  3. function truthy(key: string) {
  4. const value = process.env[key]?.toLowerCase()
  5. return value === "true" || value === "1"
  6. }
  7. function falsy(key: string) {
  8. const value = process.env[key]?.toLowerCase()
  9. return value === "false" || value === "0"
  10. }
  11. // Channels that default to the new effect-httpapi server backend. The legacy
  12. // hono backend remains the default for stable (`prod`/`latest`) installs.
  13. const HTTPAPI_DEFAULT_ON_CHANNELS = new Set(["dev", "beta", "local"])
  14. function number(key: string) {
  15. const value = process.env[key]
  16. if (!value) return undefined
  17. const parsed = Number(value)
  18. return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined
  19. }
  20. const OPENCODE_EXPERIMENTAL = truthy("OPENCODE_EXPERIMENTAL")
  21. const OPENCODE_DISABLE_CLAUDE_CODE = truthy("OPENCODE_DISABLE_CLAUDE_CODE")
  22. const OPENCODE_DISABLE_CLAUDE_CODE_SKILLS =
  23. OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_SKILLS")
  24. const copy = process.env["OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"]
  25. export const Flag = {
  26. OTEL_EXPORTER_OTLP_ENDPOINT: process.env["OTEL_EXPORTER_OTLP_ENDPOINT"],
  27. OTEL_EXPORTER_OTLP_HEADERS: process.env["OTEL_EXPORTER_OTLP_HEADERS"],
  28. OPENCODE_AUTO_SHARE: truthy("OPENCODE_AUTO_SHARE"),
  29. OPENCODE_AUTO_HEAP_SNAPSHOT: truthy("OPENCODE_AUTO_HEAP_SNAPSHOT"),
  30. OPENCODE_GIT_BASH_PATH: process.env["OPENCODE_GIT_BASH_PATH"],
  31. OPENCODE_CONFIG: process.env["OPENCODE_CONFIG"],
  32. OPENCODE_CONFIG_CONTENT: process.env["OPENCODE_CONFIG_CONTENT"],
  33. OPENCODE_DISABLE_AUTOUPDATE: truthy("OPENCODE_DISABLE_AUTOUPDATE"),
  34. OPENCODE_ALWAYS_NOTIFY_UPDATE: truthy("OPENCODE_ALWAYS_NOTIFY_UPDATE"),
  35. OPENCODE_DISABLE_PRUNE: truthy("OPENCODE_DISABLE_PRUNE"),
  36. OPENCODE_DISABLE_TERMINAL_TITLE: truthy("OPENCODE_DISABLE_TERMINAL_TITLE"),
  37. OPENCODE_SHOW_TTFD: truthy("OPENCODE_SHOW_TTFD"),
  38. OPENCODE_PERMISSION: process.env["OPENCODE_PERMISSION"],
  39. OPENCODE_DISABLE_DEFAULT_PLUGINS: truthy("OPENCODE_DISABLE_DEFAULT_PLUGINS"),
  40. OPENCODE_DISABLE_LSP_DOWNLOAD: truthy("OPENCODE_DISABLE_LSP_DOWNLOAD"),
  41. OPENCODE_ENABLE_EXPERIMENTAL_MODELS: truthy("OPENCODE_ENABLE_EXPERIMENTAL_MODELS"),
  42. OPENCODE_DISABLE_AUTOCOMPACT: truthy("OPENCODE_DISABLE_AUTOCOMPACT"),
  43. OPENCODE_DISABLE_MODELS_FETCH: truthy("OPENCODE_DISABLE_MODELS_FETCH"),
  44. OPENCODE_DISABLE_MOUSE: truthy("OPENCODE_DISABLE_MOUSE"),
  45. OPENCODE_DISABLE_CLAUDE_CODE,
  46. OPENCODE_DISABLE_CLAUDE_CODE_PROMPT: OPENCODE_DISABLE_CLAUDE_CODE || truthy("OPENCODE_DISABLE_CLAUDE_CODE_PROMPT"),
  47. OPENCODE_DISABLE_CLAUDE_CODE_SKILLS,
  48. OPENCODE_DISABLE_EXTERNAL_SKILLS: truthy("OPENCODE_DISABLE_EXTERNAL_SKILLS"),
  49. OPENCODE_FAKE_VCS: process.env["OPENCODE_FAKE_VCS"],
  50. OPENCODE_SERVER_PASSWORD: process.env["OPENCODE_SERVER_PASSWORD"],
  51. OPENCODE_SERVER_USERNAME: process.env["OPENCODE_SERVER_USERNAME"],
  52. OPENCODE_ENABLE_QUESTION_TOOL: truthy("OPENCODE_ENABLE_QUESTION_TOOL"),
  53. // Experimental
  54. OPENCODE_EXPERIMENTAL,
  55. OPENCODE_EXPERIMENTAL_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_FILEWATCHER").pipe(
  56. Config.withDefault(false),
  57. ),
  58. OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER: Config.boolean("OPENCODE_EXPERIMENTAL_DISABLE_FILEWATCHER").pipe(
  59. Config.withDefault(false),
  60. ),
  61. OPENCODE_EXPERIMENTAL_ICON_DISCOVERY: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_ICON_DISCOVERY"),
  62. OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT:
  63. copy === undefined ? process.platform === "win32" : truthy("OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT"),
  64. OPENCODE_ENABLE_EXA: truthy("OPENCODE_ENABLE_EXA") || OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EXA"),
  65. OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: number("OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"),
  66. OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: number("OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"),
  67. OPENCODE_EXPERIMENTAL_OXFMT: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_OXFMT"),
  68. OPENCODE_EXPERIMENTAL_LSP_TY: truthy("OPENCODE_EXPERIMENTAL_LSP_TY"),
  69. OPENCODE_EXPERIMENTAL_LSP_TOOL: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_LSP_TOOL"),
  70. OPENCODE_EXPERIMENTAL_PLAN_MODE: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_PLAN_MODE"),
  71. OPENCODE_EXPERIMENTAL_MARKDOWN: !falsy("OPENCODE_EXPERIMENTAL_MARKDOWN"),
  72. OPENCODE_MODELS_URL: process.env["OPENCODE_MODELS_URL"],
  73. OPENCODE_MODELS_PATH: process.env["OPENCODE_MODELS_PATH"],
  74. OPENCODE_DISABLE_EMBEDDED_WEB_UI: truthy("OPENCODE_DISABLE_EMBEDDED_WEB_UI"),
  75. OPENCODE_DB: process.env["OPENCODE_DB"],
  76. OPENCODE_DISABLE_CHANNEL_DB: truthy("OPENCODE_DISABLE_CHANNEL_DB"),
  77. OPENCODE_SKIP_MIGRATIONS: truthy("OPENCODE_SKIP_MIGRATIONS"),
  78. OPENCODE_STRICT_CONFIG_DEPS: truthy("OPENCODE_STRICT_CONFIG_DEPS"),
  79. OPENCODE_WORKSPACE_ID: process.env["OPENCODE_WORKSPACE_ID"],
  80. // Defaults to true on dev/beta/local channels so internal users exercise the
  81. // new effect-httpapi server backend. Stable (`prod`/`latest`) installs stay
  82. // on the legacy hono backend until the rollout is complete. An explicit env
  83. // var ("true"/"1" or "false"/"0") always wins, providing an opt-in for
  84. // stable users and an escape hatch for dev/beta users.
  85. OPENCODE_EXPERIMENTAL_HTTPAPI:
  86. truthy("OPENCODE_EXPERIMENTAL_HTTPAPI") ||
  87. (!falsy("OPENCODE_EXPERIMENTAL_HTTPAPI") && HTTPAPI_DEFAULT_ON_CHANNELS.has(InstallationChannel)),
  88. OPENCODE_EXPERIMENTAL_WORKSPACES: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_WORKSPACES"),
  89. OPENCODE_EXPERIMENTAL_EVENT_SYSTEM: OPENCODE_EXPERIMENTAL || truthy("OPENCODE_EXPERIMENTAL_EVENT_SYSTEM"),
  90. // Evaluated at access time (not module load) because tests, the CLI, and
  91. // external tooling set these env vars at runtime.
  92. get OPENCODE_DISABLE_PROJECT_CONFIG() {
  93. return truthy("OPENCODE_DISABLE_PROJECT_CONFIG")
  94. },
  95. get OPENCODE_TUI_CONFIG() {
  96. return process.env["OPENCODE_TUI_CONFIG"]
  97. },
  98. get OPENCODE_CONFIG_DIR() {
  99. return process.env["OPENCODE_CONFIG_DIR"]
  100. },
  101. get OPENCODE_PURE() {
  102. return truthy("OPENCODE_PURE")
  103. },
  104. get OPENCODE_PLUGIN_META_FILE() {
  105. return process.env["OPENCODE_PLUGIN_META_FILE"]
  106. },
  107. get OPENCODE_CLIENT() {
  108. return process.env["OPENCODE_CLIENT"] ?? "cli"
  109. },
  110. }