| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import type { Argv, InferredOptionTypes } from "yargs"
- import { ConfigV1 } from "@kirincode-ai/core/v1/config/config"
- import type { Config } from "@/config/config"
- import { Effect } from "effect"
- const options = {
- port: {
- type: "number" as const,
- describe: "port to listen on",
- default: 0,
- },
- hostname: {
- type: "string" as const,
- describe: "hostname to listen on",
- default: "127.0.0.1",
- },
- mdns: {
- type: "boolean" as const,
- describe: "enable mDNS service discovery (defaults hostname to 0.0.0.0)",
- default: false,
- },
- "mdns-domain": {
- type: "string" as const,
- describe: "custom domain name for mDNS service (default: kirincode.local)",
- default: "kirincode.local",
- },
- cors: {
- type: "string" as const,
- array: true,
- describe: "additional domains to allow for CORS",
- default: [] as string[],
- },
- }
- export type NetworkOptions = InferredOptionTypes<typeof options>
- export function withNetworkOptions<T>(yargs: Argv<T>) {
- return yargs.options(options)
- }
- export function hasArg(name: string) {
- return networkArgs().some((arg) => arg === name || arg.startsWith(name + "="))
- }
- function hasBooleanArg(name: string) {
- return networkArgs().some(
- (arg) => arg === name || arg === name + "=true" || arg === name + "=false" || arg === "--no-" + name.slice(2),
- )
- }
- function networkArgs() {
- const separator = process.argv.indexOf("--")
- return process.argv.slice(2, separator === -1 ? undefined : separator)
- }
- export const resolveNetworkOptions = Effect.fn("Cli.resolveNetworkOptions")(function* (args: NetworkOptions) {
- const { Config } = yield* Effect.promise(() => import("@/config/config"))
- const config = yield* Config.Service.use((cfg) => cfg.getGlobal())
- return resolveNetworkOptionsNoConfig(args, config)
- })
- export function resolveNetworkOptionsNoConfig(args: NetworkOptions, config?: ConfigV1.Info) {
- const portExplicitlySet = hasArg("--port")
- const hostnameExplicitlySet = hasArg("--hostname")
- const mdnsExplicitlySet = hasBooleanArg("--mdns")
- const mdnsDomainExplicitlySet = hasArg("--mdns-domain")
- const mdns = mdnsExplicitlySet ? args.mdns : (config?.server?.mdns ?? args.mdns)
- const mdnsDomain = mdnsDomainExplicitlySet ? args["mdns-domain"] : (config?.server?.mdnsDomain ?? args["mdns-domain"])
- const port = portExplicitlySet ? args.port : (config?.server?.port ?? args.port)
- const hostname = hostnameExplicitlySet
- ? args.hostname
- : mdns && !config?.server?.hostname
- ? "0.0.0.0"
- : (config?.server?.hostname ?? args.hostname)
- const configCors = config?.server?.cors ?? []
- const argsCors = Array.isArray(args.cors) ? args.cors : args.cors ? [args.cors] : []
- const cors = [...configCors, ...argsCors]
- return { hostname, port, mdns, mdnsDomain, cors }
- }
|