runtime-flags.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { Config, ConfigProvider, Context, Effect, Layer, Option } from "effect"
  2. import { ConfigService } from "@/effect/config-service"
  3. const bool = (name: string) => Config.boolean(name).pipe(Config.withDefault(false))
  4. const positiveInteger = (name: string) =>
  5. Config.number(name).pipe(
  6. Config.map((value) => (Number.isInteger(value) && value > 0 ? value : undefined)),
  7. Config.orElse(() => Config.succeed(undefined)),
  8. )
  9. const experimental = bool("KIRINCODE_EXPERIMENTAL")
  10. const enabledByExperimental = (name: string) =>
  11. Config.all({ experimental, enabled: Config.boolean(name).pipe(Config.option) }).pipe(
  12. Config.map((flags) => Option.getOrElse(flags.enabled, () => flags.experimental)),
  13. )
  14. export class Service extends ConfigService.Service<Service>()("@kirincode/RuntimeFlags", {
  15. autoShare: bool("KIRINCODE_AUTO_SHARE"),
  16. pure: bool("KIRINCODE_PURE"),
  17. disableDefaultPlugins: bool("KIRINCODE_DISABLE_DEFAULT_PLUGINS"),
  18. disableEmbeddedWebUi: bool("KIRINCODE_DISABLE_EMBEDDED_WEB_UI"),
  19. disableExternalSkills: bool("KIRINCODE_DISABLE_EXTERNAL_SKILLS"),
  20. disableLspDownload: bool("KIRINCODE_DISABLE_LSP_DOWNLOAD"),
  21. disableClaudeCodePrompt: Config.all({
  22. broad: bool("KIRINCODE_DISABLE_CLAUDE_CODE"),
  23. direct: bool("KIRINCODE_DISABLE_CLAUDE_CODE_PROMPT"),
  24. }).pipe(Config.map((flags) => flags.broad || flags.direct)),
  25. disableClaudeCodeSkills: Config.all({
  26. broad: bool("KIRINCODE_DISABLE_CLAUDE_CODE"),
  27. direct: bool("KIRINCODE_DISABLE_CLAUDE_CODE_SKILLS"),
  28. }).pipe(Config.map((flags) => flags.broad || flags.direct)),
  29. enableExa: Config.all({
  30. experimental,
  31. enabled: bool("KIRINCODE_ENABLE_EXA"),
  32. legacy: bool("KIRINCODE_EXPERIMENTAL_EXA"),
  33. }).pipe(Config.map((flags) => flags.experimental || flags.enabled || flags.legacy)),
  34. enableParallel: Config.all({
  35. enabled: bool("KIRINCODE_ENABLE_PARALLEL"),
  36. legacy: bool("KIRINCODE_EXPERIMENTAL_PARALLEL"),
  37. }).pipe(Config.map((flags) => flags.enabled || flags.legacy)),
  38. enableExperimentalModels: bool("KIRINCODE_ENABLE_EXPERIMENTAL_MODELS"),
  39. enableQuestionTool: bool("KIRINCODE_ENABLE_QUESTION_TOOL"),
  40. experimentalReferences: enabledByExperimental("KIRINCODE_EXPERIMENTAL_REFERENCES"),
  41. experimentalBackgroundSubagents: enabledByExperimental("KIRINCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS"),
  42. experimentalLspTy: bool("KIRINCODE_EXPERIMENTAL_LSP_TY"),
  43. experimentalLspTool: enabledByExperimental("KIRINCODE_EXPERIMENTAL_LSP_TOOL"),
  44. experimentalOxfmt: enabledByExperimental("KIRINCODE_EXPERIMENTAL_OXFMT"),
  45. experimentalPlanMode: enabledByExperimental("KIRINCODE_EXPERIMENTAL_PLAN_MODE"),
  46. experimentalCodeMode: enabledByExperimental("KIRINCODE_EXPERIMENTAL_CODE_MODE"),
  47. experimentalEventSystem: enabledByExperimental("KIRINCODE_EXPERIMENTAL_EVENT_SYSTEM"),
  48. experimentalWorkspaces: enabledByExperimental("KIRINCODE_EXPERIMENTAL_WORKSPACES"),
  49. experimentalIconDiscovery: enabledByExperimental("KIRINCODE_EXPERIMENTAL_ICON_DISCOVERY"),
  50. outputTokenMax: positiveInteger("KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"),
  51. bashDefaultTimeoutMs: positiveInteger("KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS"),
  52. experimentalNativeLlm: bool("KIRINCODE_EXPERIMENTAL_NATIVE_LLM"),
  53. experimentalWebSockets: bool("KIRINCODE_EXPERIMENTAL_WEBSOCKETS"),
  54. client: Config.string("KIRINCODE_CLIENT").pipe(Config.withDefault("cli")),
  55. }) {}
  56. export type Info = Context.Service.Shape<typeof Service>
  57. const emptyConfigLayer = Service.layer.pipe(
  58. Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown({}))),
  59. Layer.orDie,
  60. )
  61. export const layer = (overrides: Partial<Info> = {}) =>
  62. Layer.effect(
  63. Service,
  64. Effect.gen(function* () {
  65. const flags = yield* Service
  66. return Service.of({ ...flags, ...overrides })
  67. }),
  68. ).pipe(Layer.provide(emptyConfigLayer))
  69. export const node = LayerNode.make({ service: Service, layer: Service.layer.pipe(Layer.orDie), deps: [] })
  70. export * as RuntimeFlags from "./runtime-flags"
  71. import { LayerNode } from "@kirincode-ai/core/effect/layer-node"