| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- import { describe, expect } from "bun:test"
- import { ConfigProvider, Effect, Layer } from "effect"
- import { AppNodeBuilder } from "@kirincode-ai/core/effect/app-node-builder"
- import { RuntimeFlags } from "../../src/effect/runtime-flags"
- import { it } from "../lib/effect"
- const fromConfig = (input: Record<string, unknown>) =>
- AppNodeBuilder.build(RuntimeFlags.node).pipe(Layer.provide(ConfigProvider.layer(ConfigProvider.fromUnknown(input))))
- const readFlags = RuntimeFlags.Service.useSync((flags) => flags)
- describe("RuntimeFlags", () => {
- it.effect("layer defaults autoShare to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.autoShare).toBe(false)
- }),
- )
- it.effect("layer parses plugin flags from the active ConfigProvider", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(
- fromConfig({
- KIRINCODE_PURE: "true",
- KIRINCODE_DISABLE_DEFAULT_PLUGINS: "true",
- KIRINCODE_AUTO_SHARE: "true",
- KIRINCODE_DISABLE_EMBEDDED_WEB_UI: "true",
- KIRINCODE_DISABLE_EXTERNAL_SKILLS: "true",
- KIRINCODE_DISABLE_LSP_DOWNLOAD: "true",
- KIRINCODE_EXPERIMENTAL: "true",
- KIRINCODE_ENABLE_EXA: "true",
- KIRINCODE_ENABLE_PARALLEL: "true",
- KIRINCODE_ENABLE_EXPERIMENTAL_MODELS: "true",
- KIRINCODE_ENABLE_QUESTION_TOOL: "true",
- KIRINCODE_CLIENT: "desktop",
- }),
- ),
- )
- expect(flags.pure).toBe(true)
- expect(flags.autoShare).toBe(true)
- expect(flags.disableDefaultPlugins).toBe(true)
- expect(flags.disableEmbeddedWebUi).toBe(true)
- expect(flags.disableExternalSkills).toBe(true)
- expect(flags.disableLspDownload).toBe(true)
- expect(flags.disableClaudeCodePrompt).toBe(false)
- expect(flags.enableExa).toBe(true)
- expect(flags.enableParallel).toBe(true)
- expect(flags.enableExperimentalModels).toBe(true)
- expect(flags.enableQuestionTool).toBe(true)
- expect(flags.experimentalReferences).toBe(true)
- expect(flags.experimentalBackgroundSubagents).toBe(true)
- expect(flags.experimentalLspTy).toBe(false)
- expect(flags.experimentalLspTool).toBe(true)
- expect(flags.experimentalOxfmt).toBe(true)
- expect(flags.experimentalPlanMode).toBe(true)
- expect(flags.experimentalEventSystem).toBe(true)
- expect(flags.experimentalWorkspaces).toBe(true)
- expect(flags.experimentalIconDiscovery).toBe(true)
- expect(flags.experimentalNativeLlm).toBe(false)
- expect(flags.experimentalWebSockets).toBe(false)
- expect(flags.client).toBe("desktop")
- }),
- )
- it.effect("layer parses KIRINCODE_EXPERIMENTAL_LSP_TY", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(
- fromConfig({
- KIRINCODE_EXPERIMENTAL_LSP_TY: "true",
- }),
- ),
- )
- expect(flags.experimentalLspTy).toBe(true)
- }),
- )
- it.effect("enables native LLM via dedicated flag only", () =>
- Effect.gen(function* () {
- const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL_NATIVE_LLM: "true" })))
- const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL: "true" })))
- expect(explicit.experimentalNativeLlm).toBe(true)
- expect(umbrella.experimentalNativeLlm).toBe(false)
- }),
- )
- it.effect("enables WebSockets via dedicated flag only", () =>
- Effect.gen(function* () {
- const explicit = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL_WEBSOCKETS: "true" })))
- const umbrella = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL: "true" })))
- expect(explicit.experimentalWebSockets).toBe(true)
- expect(umbrella.experimentalWebSockets).toBe(false)
- }),
- )
- it.effect("layer accepts partial test overrides and fills defaults from Config definitions", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(RuntimeFlags.layer({ disableDefaultPlugins: true, bashDefaultTimeoutMs: 1_000 })),
- )
- expect(flags.pure).toBe(false)
- expect(flags.autoShare).toBe(false)
- expect(flags.disableDefaultPlugins).toBe(true)
- expect(flags.disableEmbeddedWebUi).toBe(false)
- expect(flags.disableExternalSkills).toBe(false)
- expect(flags.disableLspDownload).toBe(false)
- expect(flags.disableClaudeCodePrompt).toBe(false)
- expect(flags.disableClaudeCodeSkills).toBe(false)
- expect(flags.enableExa).toBe(false)
- expect(flags.experimentalIconDiscovery).toBe(false)
- expect(flags.experimentalOxfmt).toBe(false)
- expect(flags.outputTokenMax).toBeUndefined()
- expect(flags.bashDefaultTimeoutMs).toBe(1_000)
- expect(flags.enableExperimentalModels).toBe(false)
- expect(flags.client).toBe("cli")
- }),
- )
- it.effect("experimentalIconDiscovery defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.experimentalIconDiscovery).toBe(false)
- }),
- )
- it.effect("disableExternalSkills defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.disableExternalSkills).toBe(false)
- }),
- )
- it.effect("disableExternalSkills reads KIRINCODE_DISABLE_EXTERNAL_SKILLS", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_EXTERNAL_SKILLS: "true" })))
- expect(flags.disableExternalSkills).toBe(true)
- }),
- )
- it.effect("disableLspDownload defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.disableLspDownload).toBe(false)
- }),
- )
- it.effect("disableLspDownload reads KIRINCODE_DISABLE_LSP_DOWNLOAD", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_LSP_DOWNLOAD: "true" })))
- expect(flags.disableLspDownload).toBe(true)
- }),
- )
- it.effect("disableClaudeCodePrompt defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.disableClaudeCodePrompt).toBe(false)
- }),
- )
- it.effect("disableClaudeCodePrompt reads KIRINCODE_DISABLE_CLAUDE_CODE_PROMPT", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_CLAUDE_CODE_PROMPT: "true" })))
- expect(flags.disableClaudeCodePrompt).toBe(true)
- }),
- )
- it.effect("disableClaudeCodePrompt inherits KIRINCODE_DISABLE_CLAUDE_CODE", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_CLAUDE_CODE: "true" })))
- expect(flags.disableClaudeCodePrompt).toBe(true)
- }),
- )
- it.effect("experimentalIconDiscovery reads KIRINCODE_EXPERIMENTAL_ICON_DISCOVERY", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL_ICON_DISCOVERY: "true" })))
- expect(flags.experimentalIconDiscovery).toBe(true)
- }),
- )
- it.effect("experimentalIconDiscovery inherits KIRINCODE_EXPERIMENTAL", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_EXPERIMENTAL: "true" })))
- expect(flags.experimentalIconDiscovery).toBe(true)
- }),
- )
- it.effect("specific experimental flags override KIRINCODE_EXPERIMENTAL", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(
- fromConfig({
- KIRINCODE_EXPERIMENTAL: "true",
- KIRINCODE_EXPERIMENTAL_ICON_DISCOVERY: "false",
- }),
- ),
- )
- expect(flags.experimentalIconDiscovery).toBe(false)
- }),
- )
- it.effect("experimentalOxfmt defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.experimentalOxfmt).toBe(false)
- }),
- )
- it.effect("experimentalOxfmt is enabled by KIRINCODE_EXPERIMENTAL_OXFMT", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(
- fromConfig({
- KIRINCODE_EXPERIMENTAL_OXFMT: "true",
- }),
- ),
- )
- expect(flags.experimentalOxfmt).toBe(true)
- }),
- )
- it.effect("experimentalOxfmt inherits KIRINCODE_EXPERIMENTAL", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(
- fromConfig({
- KIRINCODE_EXPERIMENTAL: "true",
- }),
- ),
- )
- expect(flags.experimentalOxfmt).toBe(true)
- }),
- )
- for (const input of [
- { name: "absent", config: {}, expected: undefined },
- {
- name: "valid positive integer",
- config: { KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234" },
- expected: 1234,
- },
- {
- name: "invalid string",
- config: { KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "nope" },
- expected: undefined,
- },
- { name: "zero", config: { KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "0" }, expected: undefined },
- { name: "negative", config: { KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "-1" }, expected: undefined },
- {
- name: "non-integer",
- config: { KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1.5" },
- expected: undefined,
- },
- ]) {
- it.effect(`parses bashDefaultTimeoutMs from config: ${input.name}`, () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig(input.config)))
- expect(flags.bashDefaultTimeoutMs).toBe(input.expected)
- }),
- )
- }
- for (const input of [
- { name: "absent", config: {}, expected: undefined },
- {
- name: "valid positive integer",
- config: { KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1234" },
- expected: 1234,
- },
- {
- name: "invalid string",
- config: { KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "nope" },
- expected: undefined,
- },
- { name: "zero", config: { KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "0" }, expected: undefined },
- { name: "negative", config: { KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "-1" }, expected: undefined },
- {
- name: "non-integer",
- config: { KIRINCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX: "1.5" },
- expected: undefined,
- },
- ]) {
- it.effect(`parses outputTokenMax from config: ${input.name}`, () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig(input.config)))
- expect(flags.outputTokenMax).toBe(input.expected)
- }),
- )
- }
- it.effect("layer ignores the active ConfigProvider for omitted test overrides", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(
- Effect.provide(RuntimeFlags.layer()),
- Effect.provide(
- ConfigProvider.layer(
- ConfigProvider.fromUnknown({
- KIRINCODE_PURE: "true",
- KIRINCODE_DISABLE_DEFAULT_PLUGINS: "true",
- KIRINCODE_DISABLE_EXTERNAL_SKILLS: "true",
- KIRINCODE_DISABLE_LSP_DOWNLOAD: "true",
- KIRINCODE_EXPERIMENTAL: "true",
- KIRINCODE_ENABLE_EXA: "true",
- KIRINCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS: "1234",
- KIRINCODE_CLIENT: "desktop",
- }),
- ),
- ),
- )
- expect(flags.pure).toBe(false)
- expect(flags.disableDefaultPlugins).toBe(false)
- expect(flags.disableEmbeddedWebUi).toBe(false)
- expect(flags.disableExternalSkills).toBe(false)
- expect(flags.disableLspDownload).toBe(false)
- expect(flags.disableClaudeCodePrompt).toBe(false)
- expect(flags.disableClaudeCodeSkills).toBe(false)
- expect(flags.enableExa).toBe(false)
- expect(flags.experimentalIconDiscovery).toBe(false)
- expect(flags.experimentalOxfmt).toBe(false)
- expect(flags.outputTokenMax).toBeUndefined()
- expect(flags.bashDefaultTimeoutMs).toBeUndefined()
- expect(flags.client).toBe("cli")
- }),
- )
- it.effect("disableClaudeCodeSkills defaults to false", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({})))
- expect(flags.disableClaudeCodeSkills).toBe(false)
- }),
- )
- it.effect("disableClaudeCodeSkills reads KIRINCODE_DISABLE_CLAUDE_CODE_SKILLS", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_CLAUDE_CODE_SKILLS: "true" })))
- expect(flags.disableClaudeCodeSkills).toBe(true)
- }),
- )
- it.effect("disableClaudeCodeSkills inherits KIRINCODE_DISABLE_CLAUDE_CODE", () =>
- Effect.gen(function* () {
- const flags = yield* readFlags.pipe(Effect.provide(fromConfig({ KIRINCODE_DISABLE_CLAUDE_CODE: "true" })))
- expect(flags.disableClaudeCodeSkills).toBe(true)
- }),
- )
- })
|