@effect-x/ultimate-search 0.1.2 → 0.1.3
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.
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +3 -3
- package/src/cli.ts +21 -0
- package/src/commands/fetch.ts +95 -0
- package/src/commands/map.ts +97 -0
- package/src/commands/mcp/stdio.ts +27 -0
- package/src/commands/mcp.ts +7 -0
- package/src/commands/root.ts +10 -0
- package/src/commands/search/dual.ts +88 -0
- package/src/commands/search/grok.ts +70 -0
- package/src/commands/search/tavily.ts +99 -0
- package/src/commands/search.ts +9 -0
- package/src/config/settings.ts +261 -0
- package/src/providers/firecrawl/client.ts +75 -0
- package/src/providers/firecrawl/schema.ts +31 -0
- package/src/providers/grok/client.ts +77 -0
- package/src/providers/grok/schema.ts +107 -0
- package/src/providers/tavily/client.ts +143 -0
- package/src/providers/tavily/schema.ts +207 -0
- package/src/services/dual-search.ts +150 -0
- package/src/services/firecrawl-fetch.ts +101 -0
- package/src/services/grok-search.ts +68 -0
- package/src/services/read-only-mcp.ts +275 -0
- package/src/services/tavily-extract.ts +66 -0
- package/src/services/tavily-map.ts +38 -0
- package/src/services/tavily-search.ts +40 -0
- package/src/services/web-fetch-schema.ts +72 -0
- package/src/services/web-fetch.ts +100 -0
- package/src/shared/cli-flags.ts +25 -0
- package/src/shared/command-output.ts +21 -0
- package/src/shared/effect.ts +52 -0
- package/src/shared/errors.ts +56 -0
- package/src/shared/output.ts +210 -0
- package/src/shared/provider-http-client.ts +73 -0
- package/src/shared/render-error.ts +101 -0
- package/src/shared/schema.ts +42 -0
- package/src/shared/tracing.ts +53 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","names":["settings: UltimateSearchConfig.Methods[\"settings\"]","getGrokConfig: UltimateSearchConfig.Methods[\"getGrokConfig\"]","details: Array<string>","getTavilyConfig: UltimateSearchConfig.Methods[\"getTavilyConfig\"]","getFirecrawlConfig: UltimateSearchConfig.Methods[\"getFirecrawlConfig\"]","defaultGrokEnvironment: GrokEnvironment","defaultTavilyEnvironment: ProviderEnvironment","defaultFirecrawlEnvironment: FirecrawlEnvironment","configErrorDetails","mapDecodeError","mapDecodeError","scrape: FirecrawlProviderClient.Methods[\"scrape\"]","mapDecodeError","search: TavilyProviderClient.Methods[\"search\"]","map: TavilyProviderClient.Methods[\"map\"]","extract: TavilyProviderClient.Methods[\"extract\"]","normalizeContent","fetch: FirecrawlFetch.Methods[\"fetch\"]","extract: TavilyExtract.Methods[\"extract\"]","fetch: WebFetch.Methods[\"fetch\"]","configErrorDetails","map: TavilyMap.Methods[\"map\"]","createChatCompletion: GrokProviderClient.Methods[\"createChatCompletion\"]","search: GrokSearch.Methods[\"search\"]","payload: GrokChatCompletionRequest","search: TavilySearch.Methods[\"search\"]","search: DualSearch.Methods[\"search\"]","PackageJson.version","lines: Array<string>","options: Logger.Options<string>","PackageJson.version"],"sources":["../package.json","../src/shared/errors.ts","../src/shared/schema.ts","../src/config/settings.ts","../src/shared/provider-http-client.ts","../src/providers/firecrawl/schema.ts","../src/providers/firecrawl/client.ts","../src/providers/tavily/schema.ts","../src/providers/tavily/client.ts","../src/services/firecrawl-fetch.ts","../src/services/tavily-extract.ts","../src/services/web-fetch.ts","../src/services/web-fetch-schema.ts","../src/shared/render-error.ts","../src/shared/output.ts","../src/shared/command-output.ts","../src/commands/fetch.ts","../src/services/tavily-map.ts","../src/shared/cli-flags.ts","../src/commands/map.ts","../src/providers/grok/schema.ts","../src/providers/grok/client.ts","../src/services/grok-search.ts","../src/services/tavily-search.ts","../src/services/dual-search.ts","../src/services/read-only-mcp.ts","../src/commands/mcp/stdio.ts","../src/commands/mcp.ts","../src/commands/search/dual.ts","../src/commands/search/grok.ts","../src/commands/search/tavily.ts","../src/commands/search.ts","../src/commands/root.ts","../src/shared/tracing.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@effect-x/ultimate-search\",\n \"version\": \"0.1.2\",\n \"description\": \"CLI-first web search toolkit and read-only MCP server for agents.\",\n \"keywords\": [\n \"agent\",\n \"cli\",\n \"effect\",\n \"grok\",\n \"mcp\",\n \"search\",\n \"tavily\"\n ],\n \"homepage\": \"https://github.com/effect-anything/ultimate-search#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/effect-anything/ultimate-search/issues\"\n },\n \"license\": \"MIT\",\n \"contributors\": [\n \"xesrevinu\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/effect-anything/ultimate-search.git\"\n },\n \"bin\": {\n \"ultimate-search\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\",\n \"SKILL.md\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"prepare\": \"lefthook install\",\n \"build\": \"tsdown\",\n \"dev\": \"tsdown --watch\",\n \"lint\": \"oxlint .\",\n \"format\": \"oxfmt .\",\n \"format:check\": \"oxfmt --check .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"check\": \"bun run lint && bun run format:check && bun run typecheck && bun run test && bun run build\",\n \"changeset\": \"changeset\",\n \"version-packages\": \"changeset version\",\n \"release\": \"changeset publish --provenance\",\n \"prepack\": \"bun run build\"\n },\n \"dependencies\": {\n \"@effect/platform-node\": \"4.0.0-beta.31\",\n \"effect\": \"4.0.0-beta.31\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.29.7\",\n \"@effect/vitest\": \"4.0.0-beta.31\",\n \"@types/bun\": \"^1.3.10\",\n \"lefthook\": \"^1.11.13\",\n \"oxfmt\": \"^0.38.0\",\n \"oxlint\": \"^1.53.0\",\n \"tsdown\": \"^0.15.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n },\n \"engines\": {\n \"bun\": \">=1.3.10\",\n \"node\": \">=24\"\n },\n \"packageManager\": \"bun@1.3.10\"\n}\n","import { Schema } from \"effect\";\n\nexport const SearchProvider = Schema.Literals([\"shared\", \"grok\", \"tavily\", \"firecrawl\"]);\n\nexport class ConfigValidationError extends Schema.TaggedErrorClass<ConfigValidationError>()(\n \"ConfigValidationError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n details: Schema.optional(Schema.Array(Schema.String)),\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport class ProviderRequestError extends Schema.TaggedErrorClass<ProviderRequestError>()(\n \"ProviderRequestError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n },\n) {}\n\nexport class ProviderResponseError extends Schema.TaggedErrorClass<ProviderResponseError>()(\n \"ProviderResponseError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n status: Schema.Number,\n body: Schema.String,\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport class ProviderContentError extends Schema.TaggedErrorClass<ProviderContentError>()(\n \"ProviderContentError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n },\n) {}\n\nexport class ProviderDecodeError extends Schema.TaggedErrorClass<ProviderDecodeError>()(\n \"ProviderDecodeError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport type UltimateSearchError =\n | ConfigValidationError\n | ProviderContentError\n | ProviderRequestError\n | ProviderResponseError\n | ProviderDecodeError;\n","import { Effect, Option, Schema, SchemaIssue, SchemaTransformation } from \"effect\";\n\nconst stripTrailingSlashes = (value: string) => value.replace(/\\/+$/u, \"\");\n\nexport const trimmedNonEmptyStringSchema = (message: string) =>\n Schema.Trim.pipe(Schema.decodeTo(Schema.NonEmptyString), Schema.annotate({ message }));\n\nexport const optionalTrimmedNonEmptyStringFromStringSchema = Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.Option(Schema.NonEmptyString),\n SchemaTransformation.transform({\n decode: (value) => (value.length === 0 ? Option.none<string>() : Option.some(value)),\n encode: (value) => Option.getOrElse(value, () => \"\"),\n }),\n ),\n);\n\nexport const absoluteUrlStringSchema = (message: string) =>\n Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.String,\n SchemaTransformation.transformOrFail({\n decode: (value) =>\n Effect.try({\n try: () => stripTrailingSlashes(new URL(value).toString()),\n catch: () => new SchemaIssue.InvalidValue(Option.some(value), { message }),\n }),\n encode: (value) => Effect.succeed(value),\n }),\n ),\n );\n\nexport const optionalAbsoluteUrlStringFromStringSchema = (message: string) =>\n Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.Option(absoluteUrlStringSchema(message)),\n SchemaTransformation.transform({\n decode: (value) => (value.length === 0 ? Option.none<string>() : Option.some(value)),\n encode: (value) => Option.getOrElse(value, () => \"\"),\n }),\n ),\n );\n","import { Config, Effect, Layer, Option, ServiceMap } from \"effect\";\nimport { ConfigValidationError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport {\n optionalAbsoluteUrlStringFromStringSchema,\n optionalTrimmedNonEmptyStringFromStringSchema,\n} from \"../shared/schema\";\n\nexport interface ProviderEnvironment {\n readonly apiUrl: Option.Option<string>;\n readonly apiKey: Option.Option<string>;\n}\n\nexport interface GrokEnvironment extends ProviderEnvironment {\n readonly model: string;\n}\n\nexport interface FirecrawlEnvironment {\n readonly apiUrl: string;\n readonly apiKey: Option.Option<string>;\n}\n\nexport interface UltimateSearchSettings {\n readonly grok: GrokEnvironment;\n readonly tavily: ProviderEnvironment;\n readonly firecrawl: FirecrawlEnvironment;\n}\n\nexport interface GrokProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n readonly model: string;\n}\n\nexport interface TavilyProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n}\n\nexport interface FirecrawlProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n}\n\nexport class UltimateSearchConfig extends ServiceMap.Service<\n UltimateSearchConfig,\n {\n readonly settings: UltimateSearchSettings;\n readonly getGrokConfig: () => Effect.Effect<GrokProviderConfig, UltimateSearchError>;\n readonly getTavilyConfig: () => Effect.Effect<TavilyProviderConfig, UltimateSearchError>;\n readonly getFirecrawlConfig: () => Effect.Effect<FirecrawlProviderConfig, UltimateSearchError>;\n }\n>()(\"UltimateSearchConfig\") {\n static readonly layer = Layer.effect(\n UltimateSearchConfig,\n Effect.gen(function* () {\n const settings: UltimateSearchConfig.Methods[\"settings\"] = yield* loadSettings.pipe(\n Effect.withSpan(\"UltimateSearchConfig.settings\"),\n );\n\n const getGrokConfig: UltimateSearchConfig.Methods[\"getGrokConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getGrokConfig\",\n )(function* (): Effect.fn.Return<GrokProviderConfig, ConfigValidationError, never> {\n const grok = yield* strictConfigEffect(grokEnvironmentConfig);\n const details: Array<string> = [];\n\n if (Option.isNone(grok.apiUrl)) {\n details.push(\"Set GROK_API_URL to the grok base URL.\");\n }\n\n if (Option.isNone(grok.apiKey)) {\n details.push(\"Set GROK_API_KEY to the grok bearer token.\");\n }\n\n if (details.length > 0) {\n return yield* new ConfigValidationError({\n provider: \"grok\",\n message: \"Missing required Grok configuration.\",\n details,\n });\n }\n\n return {\n apiUrl: Option.getOrElse(grok.apiUrl, () => \"\"),\n apiKey: Option.getOrElse(grok.apiKey, () => \"\"),\n model: grok.model,\n } satisfies GrokProviderConfig;\n });\n\n const getTavilyConfig: UltimateSearchConfig.Methods[\"getTavilyConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getTavilyConfig\",\n )(function* (): Effect.fn.Return<TavilyProviderConfig, ConfigValidationError, never> {\n const tavily = yield* strictConfigEffect(tavilyEnvironmentConfig);\n const details: Array<string> = [];\n\n if (Option.isNone(tavily.apiUrl)) {\n details.push(\"Set TAVILY_API_URL to the Tavily or Tavily proxy base URL.\");\n }\n\n if (Option.isNone(tavily.apiKey)) {\n details.push(\"Set TAVILY_API_KEY to the Tavily or Tavily proxy bearer token.\");\n }\n\n if (details.length > 0) {\n return yield* new ConfigValidationError({\n provider: \"tavily\",\n message: \"Missing required Tavily configuration.\",\n details,\n });\n }\n\n return {\n apiUrl: Option.getOrElse(tavily.apiUrl, () => \"\"),\n apiKey: Option.getOrElse(tavily.apiKey, () => \"\"),\n } satisfies TavilyProviderConfig;\n });\n\n const getFirecrawlConfig: UltimateSearchConfig.Methods[\"getFirecrawlConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getFirecrawlConfig\",\n )(function* (): Effect.fn.Return<FirecrawlProviderConfig, ConfigValidationError, never> {\n const firecrawl = yield* strictConfigEffect(firecrawlEnvironmentConfig);\n\n if (Option.isNone(firecrawl.apiKey)) {\n return yield* new ConfigValidationError({\n provider: \"firecrawl\",\n message: \"Missing required FireCrawl configuration.\",\n details: [\"Set FIRECRAWL_API_KEY to the FireCrawl bearer token.\"],\n });\n }\n\n return {\n apiUrl: firecrawl.apiUrl,\n apiKey: Option.getOrElse(firecrawl.apiKey, () => \"\"),\n } satisfies FirecrawlProviderConfig;\n });\n\n return UltimateSearchConfig.of({\n settings,\n getGrokConfig,\n getTavilyConfig,\n getFirecrawlConfig,\n });\n }),\n );\n}\n\nexport declare namespace UltimateSearchConfig {\n export type Methods = ServiceMap.Service.Shape<typeof UltimateSearchConfig>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n\nconst optionalUrlConfig = (name: string) =>\n Config.schema(\n optionalAbsoluteUrlStringFromStringSchema(`${name} must be an absolute URL.`),\n name,\n ).pipe(Config.withDefault(Option.none<string>()));\n\nconst optionalSecretConfig = (name: string) =>\n Config.schema(optionalTrimmedNonEmptyStringFromStringSchema, name).pipe(\n Config.withDefault(Option.none<string>()),\n );\n\nconst requiredTextConfig = (name: string, fallback: string) =>\n Config.schema(optionalTrimmedNonEmptyStringFromStringSchema, name).pipe(\n Config.withDefault(Option.none<string>()),\n Config.map(Option.getOrElse(() => fallback)),\n );\n\nconst requiredUrlConfig = (name: string, fallback: string) =>\n Config.schema(\n optionalAbsoluteUrlStringFromStringSchema(`${name} must be an absolute URL.`),\n name,\n ).pipe(Config.withDefault(Option.none<string>()), Config.map(Option.getOrElse(() => fallback)));\n\nconst grokEnvironmentConfig = Config.all({\n apiUrl: optionalUrlConfig(\"GROK_API_URL\"),\n apiKey: optionalSecretConfig(\"GROK_API_KEY\"),\n model: requiredTextConfig(\"GROK_MODEL\", \"grok-4.1-fast\"),\n}) satisfies Config.Config<GrokEnvironment>;\n\nconst tavilyEnvironmentConfig = Config.all({\n apiUrl: optionalUrlConfig(\"TAVILY_API_URL\"),\n apiKey: optionalSecretConfig(\"TAVILY_API_KEY\"),\n}) satisfies Config.Config<ProviderEnvironment>;\n\nconst firecrawlEnvironmentConfig = Config.all({\n apiUrl: requiredUrlConfig(\"FIRECRAWL_API_URL\", \"https://api.firecrawl.dev/v2\"),\n apiKey: optionalSecretConfig(\"FIRECRAWL_API_KEY\"),\n}) satisfies Config.Config<FirecrawlEnvironment>;\n\nconst defaultGrokEnvironment: GrokEnvironment = {\n apiUrl: Option.none(),\n apiKey: Option.none(),\n model: \"grok-4.1-fast\",\n};\n\nconst defaultTavilyEnvironment: ProviderEnvironment = {\n apiUrl: Option.none(),\n apiKey: Option.none(),\n};\n\nconst defaultFirecrawlEnvironment: FirecrawlEnvironment = {\n apiUrl: \"https://api.firecrawl.dev/v2\",\n apiKey: Option.none(),\n};\n\nconst mapConfigLoadError = (error: unknown) =>\n new ConfigValidationError({\n provider: \"shared\",\n message: \"Failed to load CLI configuration.\",\n details: configErrorDetails(error),\n cause: error,\n });\n\nconst strictConfigEffect = <A>(config: Config.Config<A>) =>\n config\n .asEffect()\n .pipe(Effect.mapError(mapConfigLoadError), Effect.withSpan(\"UltimateSearchConfig.settings\"));\n\nconst bestEffortConfigEffect = <A>(config: Config.Config<A>, fallback: A) =>\n strictConfigEffect(config).pipe(Effect.catch(() => Effect.succeed(fallback)));\n\nconst loadSettings = Effect.all({\n grok: bestEffortConfigEffect(grokEnvironmentConfig, defaultGrokEnvironment),\n tavily: bestEffortConfigEffect(tavilyEnvironmentConfig, defaultTavilyEnvironment),\n firecrawl: bestEffortConfigEffect(firecrawlEnvironmentConfig, defaultFirecrawlEnvironment),\n}) satisfies Effect.Effect<UltimateSearchSettings, never, never>;\n\nconst configErrorDetails = (error: unknown): Array<string> => {\n if (error instanceof Config.ConfigError && error.message.length > 0) {\n return [error.message];\n }\n\n if (error instanceof Error && error.message.length > 0) {\n return [error.message];\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n error.message.length > 0\n ) {\n return [error.message];\n }\n\n if (typeof error === \"string\" && error.length > 0) {\n return [error];\n }\n\n if (error != null) {\n const text = String(error);\n\n if (text.length > 0 && text !== \"[object Object]\") {\n return [text];\n }\n }\n\n return [];\n};\n","import { Effect } from \"effect\";\nimport { HttpClient, HttpClientError, type HttpClientResponse } from \"effect/unstable/http\";\nimport { ProviderRequestError, ProviderResponseError } from \"./errors\";\n\nexport type ProviderHttpClientName = \"shared\" | \"grok\" | \"tavily\" | \"firecrawl\";\n\nexport const mapProviderRequestError = (\n provider: ProviderHttpClientName,\n error: unknown,\n fallback: string,\n) =>\n new ProviderRequestError({\n provider,\n message: error instanceof Error && error.message.length > 0 ? error.message : fallback,\n });\n\nexport const makeProviderHttpClient = (\n client: HttpClient.HttpClient,\n): HttpClient.HttpClient.With<HttpClientError.HttpClientError, never> =>\n client.pipe(\n HttpClient.filterStatusOk,\n HttpClient.retryTransient({\n retryOn: \"errors-and-responses\",\n times: 2,\n }),\n ) as HttpClient.HttpClient.With<HttpClientError.HttpClientError, never>;\n\nexport const catchProviderHttpError =\n (\n provider: ProviderHttpClientName,\n requestErrorMessage: string,\n responseErrorMessage: (status: number) => string,\n ) =>\n <A>(\n effect: Effect.Effect<A, HttpClientError.HttpClientError, never>,\n ): Effect.Effect<A, ProviderRequestError | ProviderResponseError, never> =>\n effect.pipe(\n Effect.catchTag(\n \"HttpClientError\",\n (error): Effect.Effect<never, ProviderRequestError | ProviderResponseError, never> => {\n const response = error.response;\n\n if (response === undefined) {\n return Effect.fail(mapProviderRequestError(provider, error, requestErrorMessage));\n }\n\n return response.text.pipe(\n Effect.catch(() => Effect.succeed(\"\")),\n Effect.flatMap((body) =>\n Effect.fail(\n new ProviderResponseError({\n provider,\n message: responseErrorMessage(response.status),\n status: response.status,\n body,\n cause: error,\n }),\n ),\n ),\n );\n },\n ),\n );\n\nexport const decodeJsonResponse = <A, E1, E2>(\n response: HttpClientResponse.HttpClientResponse,\n decode: (value: unknown) => Effect.Effect<A, E1, never>,\n mapDecodeError: (error: unknown) => E2,\n): Effect.Effect<A, E2, never> =>\n response.json.pipe(\n Effect.mapError(mapDecodeError),\n Effect.flatMap((json) => decode(json).pipe(Effect.mapError(mapDecodeError))),\n );\n","import { Schema } from \"effect\";\n\nexport const FirecrawlFormatSchema = Schema.Literals([\"markdown\"] as const);\n\nexport type FirecrawlFormat = typeof FirecrawlFormatSchema.Type;\n\nexport const FirecrawlScrapeRequestSchema = Schema.Struct({\n url: Schema.String,\n formats: Schema.NonEmptyArray(FirecrawlFormatSchema),\n});\n\nexport type FirecrawlScrapeRequest = typeof FirecrawlScrapeRequestSchema.Type;\n\nexport const FirecrawlScrapeResponseSchema = Schema.Struct({\n success: Schema.optional(Schema.Boolean),\n data: Schema.optional(\n Schema.NullOr(\n Schema.Struct({\n markdown: Schema.optional(Schema.NullOr(Schema.String)),\n content: Schema.optional(Schema.NullOr(Schema.String)),\n metadata: Schema.optional(\n Schema.Struct({\n title: Schema.optional(Schema.NullOr(Schema.String)),\n }),\n ),\n }),\n ),\n ),\n});\n\nexport type FirecrawlScrapeResponse = typeof FirecrawlScrapeResponseSchema.Type;\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type FirecrawlScrapeRequest,\n FirecrawlScrapeResponseSchema,\n type FirecrawlScrapeResponse,\n} from \"./schema\";\n\nconst decodeFirecrawlScrapeResponse = Schema.decodeUnknownEffect(FirecrawlScrapeResponseSchema);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"firecrawl\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class FirecrawlProviderClient extends ServiceMap.Service<\n FirecrawlProviderClient,\n {\n readonly scrape: (\n request: FirecrawlScrapeRequest,\n ) => Effect.Effect<FirecrawlScrapeResponse, UltimateSearchError, never>;\n }\n>()(\"FirecrawlProviderClient\") {\n static readonly layer = Layer.effect(\n FirecrawlProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const scrape: FirecrawlProviderClient.Methods[\"scrape\"] = Effect.fn(\n \"FirecrawlProviderClient.scrape\",\n )(function* (payload): FirecrawlProviderClient.Returns<\"scrape\"> {\n const firecrawl = yield* config.getFirecrawlConfig();\n const request = HttpClientRequest.post(`${firecrawl.apiUrl}/scrape`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(firecrawl.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"firecrawl\",\n \"Failed to send the FireCrawl request.\",\n (status: number) => `FireCrawl returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeFirecrawlScrapeResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the FireCrawl response payload.\"),\n );\n });\n\n return FirecrawlProviderClient.of({\n scrape,\n });\n }),\n );\n}\n\nexport declare namespace FirecrawlProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof FirecrawlProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Option, Schema } from \"effect\";\nimport { absoluteUrlStringSchema, trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nexport const TavilySearchDepthSchema = Schema.Literals([\"basic\", \"advanced\"] as const);\n\nexport type TavilySearchDepth = typeof TavilySearchDepthSchema.Type;\n\nexport const TavilyExtractDepthSchema = TavilySearchDepthSchema;\n\nexport type TavilyExtractDepth = typeof TavilyExtractDepthSchema.Type;\n\nexport const TavilySearchTopicSchema = Schema.Literals([\"general\", \"news\", \"finance\"] as const);\n\nexport type TavilySearchTopic = typeof TavilySearchTopicSchema.Type;\n\nexport const FetchContentFormatSchema = Schema.Literals([\"markdown\", \"text\"] as const);\n\nexport type FetchContentFormat = typeof FetchContentFormatSchema.Type;\n\nexport const TavilyTimeRangeSchema = Schema.Literals([\"day\", \"week\", \"month\", \"year\"] as const);\n\nexport type TavilyTimeRange = typeof TavilyTimeRangeSchema.Type;\n\nconst maxResultsSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"max-results must be an integer between 1 and 20\",\n }),\n);\n\nexport const TavilyMapDepthSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 5 })),\n Schema.annotate({\n message: \"depth must be an integer between 1 and 5\",\n }),\n);\n\nexport type TavilyMapDepth = typeof TavilyMapDepthSchema.Type;\n\nexport const TavilyMapBreadthSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 500 })),\n Schema.annotate({\n message: \"breadth must be an integer between 1 and 500\",\n }),\n);\n\nexport type TavilyMapBreadth = typeof TavilyMapBreadthSchema.Type;\n\nexport const TavilyMapLimitSchema = Schema.Int.pipe(\n Schema.check(Schema.isGreaterThanOrEqualTo(1)),\n Schema.annotate({\n message: \"limit must be an integer greater than or equal to 1\",\n }),\n);\n\nexport type TavilyMapLimit = typeof TavilyMapLimitSchema.Type;\n\nconst responseTimeSchema = Schema.Union([Schema.Number, Schema.NumberFromString]);\n\nexport const TavilySearchRequestSchema = Schema.Struct({\n query: Schema.NonEmptyString,\n search_depth: Schema.optional(TavilySearchDepthSchema),\n topic: Schema.optional(TavilySearchTopicSchema),\n time_range: Schema.optional(TavilyTimeRangeSchema),\n max_results: Schema.optional(maxResultsSchema),\n include_answer: Schema.optional(Schema.Boolean),\n});\n\nexport type TavilySearchRequest = typeof TavilySearchRequestSchema.Type;\n\nexport const TavilySearchResultItemSchema = Schema.Struct({\n title: Schema.String,\n url: Schema.String,\n content: Schema.String,\n score: Schema.Number,\n raw_content: Schema.optional(Schema.NullOr(Schema.String)),\n});\n\nexport type TavilySearchResultItem = typeof TavilySearchResultItemSchema.Type;\n\nexport const TavilySearchResponseSchema = Schema.Struct({\n query: Schema.String,\n answer: Schema.optional(Schema.NullOr(Schema.String)),\n images: Schema.optional(Schema.Array(Schema.String)),\n response_time: Schema.optional(responseTimeSchema),\n results: Schema.Array(TavilySearchResultItemSchema),\n});\n\nexport type TavilySearchResponse = typeof TavilySearchResponseSchema.Type;\n\nexport const TavilyExtractRequestSchema = Schema.Struct({\n urls: Schema.NonEmptyArray(Schema.String),\n extract_depth: Schema.optional(TavilyExtractDepthSchema),\n format: Schema.optional(FetchContentFormatSchema),\n});\n\nexport type TavilyExtractRequest = typeof TavilyExtractRequestSchema.Type;\n\nexport const TavilyExtractResultItemSchema = Schema.Struct({\n url: Schema.String,\n title: Schema.optional(Schema.NullOr(Schema.String)),\n raw_content: Schema.optional(Schema.NullOr(Schema.String)),\n});\n\nexport type TavilyExtractResultItem = typeof TavilyExtractResultItemSchema.Type;\n\nexport const TavilyExtractResponseSchema = Schema.Struct({\n results: Schema.Array(TavilyExtractResultItemSchema),\n});\n\nexport type TavilyExtractResponse = typeof TavilyExtractResponseSchema.Type;\n\nexport class TavilySearchInput extends Schema.Class<TavilySearchInput>(\"TavilySearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n searchDepth: Schema.Option(TavilySearchDepthSchema),\n topic: Schema.Option(TavilySearchTopicSchema),\n timeRange: Schema.Option(TavilyTimeRangeSchema),\n maxResults: Schema.Option(maxResultsSchema),\n includeAnswer: Schema.Boolean,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(TavilySearchInput);\n}\n\nexport const buildTavilySearchRequest = (input: TavilySearchInput): TavilySearchRequest => ({\n query: input.query,\n ...(Option.isSome(input.searchDepth) && {\n search_depth: input.searchDepth.value,\n }),\n ...(Option.isSome(input.topic) && {\n topic: input.topic.value,\n }),\n ...(Option.isSome(input.timeRange) && {\n time_range: input.timeRange.value,\n }),\n ...(Option.isSome(input.maxResults) && {\n max_results: input.maxResults.value,\n }),\n ...(input.includeAnswer ? { include_answer: true } : {}),\n});\n\nexport const TavilyMapRequestSchema = Schema.Struct({\n url: Schema.String,\n max_depth: Schema.optional(TavilyMapDepthSchema),\n max_breadth: Schema.optional(TavilyMapBreadthSchema),\n limit: Schema.optional(TavilyMapLimitSchema),\n instructions: Schema.optional(Schema.NonEmptyString),\n});\n\nexport type TavilyMapRequest = typeof TavilyMapRequestSchema.Type;\n\nexport const TavilyMapUsageSchema = Schema.Struct({\n credits_used: Schema.optional(Schema.Number),\n});\n\nexport type TavilyMapUsage = typeof TavilyMapUsageSchema.Type;\n\nexport const TavilyMapResponseSchema = Schema.Struct({\n base_url: Schema.String,\n results: Schema.Array(Schema.String),\n response_time: Schema.optional(responseTimeSchema),\n request_id: Schema.optional(Schema.String),\n usage: Schema.optional(TavilyMapUsageSchema),\n});\n\nexport type TavilyMapResponse = typeof TavilyMapResponseSchema.Type;\n\nexport class TavilyMapInput extends Schema.Class<TavilyMapInput>(\"TavilyMapInput\")({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.Option(TavilyMapDepthSchema),\n breadth: Schema.Option(TavilyMapBreadthSchema),\n limit: Schema.Option(TavilyMapLimitSchema),\n instructions: Schema.Option(\n trimmedNonEmptyStringSchema(\"instructions must be a non-empty string\"),\n ),\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(TavilyMapInput);\n}\n\nexport const buildTavilyMapRequest = (input: TavilyMapInput): TavilyMapRequest => ({\n url: input.url,\n ...(Option.isSome(input.depth) && {\n max_depth: input.depth.value,\n }),\n ...(Option.isSome(input.breadth) && {\n max_breadth: input.breadth.value,\n }),\n ...(Option.isSome(input.limit) && {\n limit: input.limit.value,\n }),\n ...(Option.isSome(input.instructions) && {\n instructions: input.instructions.value,\n }),\n});\n\nexport const buildTavilyExtractRequest = (input: {\n readonly urls: readonly [string, ...Array<string>];\n readonly depth: TavilyExtractDepth;\n readonly format: FetchContentFormat;\n}): TavilyExtractRequest => {\n const [firstUrl, ...remainingUrls] = input.urls;\n\n return {\n urls: [firstUrl, ...remainingUrls],\n extract_depth: input.depth,\n format: input.format,\n };\n};\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type TavilyMapRequest,\n TavilyMapResponseSchema,\n type TavilyMapResponse,\n type TavilyExtractRequest,\n TavilyExtractResponseSchema,\n type TavilyExtractResponse,\n type TavilySearchRequest,\n TavilySearchResponseSchema,\n type TavilySearchResponse,\n} from \"./schema\";\n\nconst decodeTavilySearchResponse = Schema.decodeUnknownEffect(TavilySearchResponseSchema);\n\nconst decodeTavilyMapResponse = Schema.decodeUnknownEffect(TavilyMapResponseSchema);\n\nconst decodeTavilyExtractResponse = Schema.decodeUnknownEffect(TavilyExtractResponseSchema);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"tavily\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class TavilyProviderClient extends ServiceMap.Service<\n TavilyProviderClient,\n {\n readonly search: (\n request: TavilySearchRequest,\n ) => Effect.Effect<TavilySearchResponse, UltimateSearchError, never>;\n readonly map: (\n request: TavilyMapRequest,\n ) => Effect.Effect<TavilyMapResponse, UltimateSearchError, never>;\n readonly extract: (\n request: TavilyExtractRequest,\n ) => Effect.Effect<TavilyExtractResponse, UltimateSearchError, never>;\n }\n>()(\"TavilyProviderClient\") {\n static readonly layer = Layer.effect(\n TavilyProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const search: TavilyProviderClient.Methods[\"search\"] = Effect.fn(\n \"TavilyProviderClient.search\",\n )(function* (payload): TavilyProviderClient.Returns<\"search\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/search`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily request.\",\n (status: number) => `Tavily returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilySearchResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily response payload.\"),\n );\n });\n\n const map: TavilyProviderClient.Methods[\"map\"] = Effect.fn(\"TavilyProviderClient.map\")(\n function* (payload): TavilyProviderClient.Returns<\"map\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/map`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily map request.\",\n (status: number) => `Tavily map returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilyMapResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily map response payload.\"),\n );\n },\n );\n\n const extract: TavilyProviderClient.Methods[\"extract\"] = Effect.fn(\n \"TavilyProviderClient.extract\",\n )(function* (payload): TavilyProviderClient.Returns<\"extract\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/extract`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily extract request.\",\n (status: number) => `Tavily returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilyExtractResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily extract payload.\"),\n );\n });\n\n return TavilyProviderClient.of({\n map,\n search,\n extract,\n });\n }),\n );\n}\n\nexport declare namespace TavilyProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, ServiceMap } from \"effect\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport type { FirecrawlScrapeResponse } from \"../providers/firecrawl/schema\";\nimport { ProviderContentError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { FetchedPage, WebFetchInput } from \"./web-fetch-schema\";\n\nconst normalizeContent = (response: FirecrawlScrapeResponse, format: WebFetchInput[\"format\"]) => {\n const data = response.data;\n\n if (data == null) {\n return null;\n }\n\n const preferred = format === \"text\" ? data.content : data.markdown;\n const fallback = format === \"text\" ? data.markdown : data.content;\n const content = (preferred ?? fallback ?? \"\").trim();\n\n return content.length > 0 ? content : null;\n};\n\nexport class FirecrawlFetch extends ServiceMap.Service<\n FirecrawlFetch,\n {\n readonly fetch: (\n input: WebFetchInput,\n ) => Effect.Effect<ReadonlyArray<FetchedPage>, UltimateSearchError, never>;\n }\n>()(\"FirecrawlFetch\") {\n static readonly layer = Layer.effect(\n FirecrawlFetch,\n Effect.gen(function* () {\n const provider = yield* FirecrawlProviderClient;\n\n const fetch: FirecrawlFetch.Methods[\"fetch\"] = Effect.fn(\"FirecrawlFetch.fetch\")(\n function* (input): FirecrawlFetch.Returns<\"fetch\"> {\n const attempts = yield* Effect.forEach(\n input.urls,\n (url) =>\n Effect.result(\n provider.scrape({\n url,\n formats: [\"markdown\"],\n }),\n ).pipe(\n Effect.map((result) => ({\n url,\n result,\n })),\n ),\n { concurrency: \"unbounded\" },\n );\n\n const successes = attempts.flatMap(({ url, result }) => {\n if (Result.isFailure(result)) {\n return [];\n }\n\n const rawContent = normalizeContent(result.success, input.format);\n\n if (rawContent === null) {\n return [];\n }\n\n return [\n {\n url,\n title: result.success.data?.metadata?.title,\n raw_content: rawContent,\n } satisfies FetchedPage,\n ];\n });\n\n if (successes.length > 0) {\n return successes;\n }\n\n const firstFailure = attempts.find(({ result }) => Result.isFailure(result));\n\n if (firstFailure != null && Result.isFailure(firstFailure.result)) {\n return yield* firstFailure.result.failure;\n }\n\n return yield* new ProviderContentError({\n provider: \"firecrawl\",\n message: \"FireCrawl returned no extractable content.\",\n });\n },\n );\n\n return FirecrawlFetch.of({\n fetch,\n });\n }),\n );\n}\n\nexport declare namespace FirecrawlFetch {\n export type Methods = ServiceMap.Service.Shape<typeof FirecrawlFetch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { buildTavilyExtractRequest } from \"../providers/tavily/schema\";\nimport { ProviderContentError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { FetchedPage, WebFetchInput } from \"./web-fetch-schema\";\n\nconst normalizeContent = (content: string | null | undefined) => {\n const text = content?.trim() ?? \"\";\n return text.length > 0 ? text : null;\n};\n\nexport class TavilyExtract extends ServiceMap.Service<\n TavilyExtract,\n {\n readonly extract: (\n input: WebFetchInput,\n ) => Effect.Effect<ReadonlyArray<FetchedPage>, UltimateSearchError, never>;\n }\n>()(\"TavilyExtract\") {\n static readonly layer = Layer.effect(\n TavilyExtract,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const extract: TavilyExtract.Methods[\"extract\"] = Effect.fn(\"TavilyExtract.extract\")(\n function* (input): TavilyExtract.Returns<\"extract\"> {\n const response = yield* provider.extract(buildTavilyExtractRequest(input));\n const results = response.results.flatMap((item) => {\n const rawContent = normalizeContent(item.raw_content);\n\n if (rawContent === null) {\n return [];\n }\n\n return [\n {\n url: item.url,\n title: item.title,\n raw_content: rawContent,\n } satisfies FetchedPage,\n ];\n });\n\n if (results.length === 0) {\n return yield* new ProviderContentError({\n provider: \"tavily\",\n message: \"Tavily returned no extractable content.\",\n });\n }\n\n return results;\n },\n );\n\n return TavilyExtract.of({\n extract,\n });\n }),\n );\n}\n\nexport declare namespace TavilyExtract {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyExtract>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, ServiceMap } from \"effect\";\nimport {\n ConfigValidationError,\n ProviderContentError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n type UltimateSearchError,\n} from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport { FirecrawlFetch } from \"./firecrawl-fetch\";\nimport type { FallbackReason, WebFetchInput, WebFetchResult } from \"./web-fetch-schema\";\nimport { TavilyExtract } from \"./tavily-extract\";\n\nconst summarizeFallbackReason = (error: UltimateSearchError): FallbackReason => {\n if (\n error instanceof ConfigValidationError ||\n error instanceof ProviderRequestError ||\n error instanceof ProviderResponseError ||\n error instanceof ProviderDecodeError ||\n error instanceof ProviderContentError\n ) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n return {\n type: \"UnknownError\",\n provider: \"shared\",\n message: String(error),\n };\n};\n\nconst resolveDoubleFailure = (\n primary: UltimateSearchError,\n fallback: UltimateSearchError,\n): UltimateSearchError =>\n fallback instanceof ConfigValidationError && !(primary instanceof ConfigValidationError)\n ? primary\n : fallback;\n\nexport class WebFetch extends ServiceMap.Service<\n WebFetch,\n {\n readonly fetch: (\n input: WebFetchInput,\n ) => Effect.Effect<WebFetchResult, UltimateSearchError, never>;\n }\n>()(\"WebFetch\") {\n static readonly layer = Layer.effect(\n WebFetch,\n Effect.gen(function* () {\n const tavilyExtract = yield* TavilyExtract;\n const firecrawlFetch = yield* FirecrawlFetch;\n\n const fetch: WebFetch.Methods[\"fetch\"] = Effect.fn(\"WebFetch.fetch\")(\n function* (input): WebFetch.Returns<\"fetch\"> {\n const tavilyAttempt = yield* Effect.result(tavilyExtract.extract(input));\n\n if (Result.isSuccess(tavilyAttempt)) {\n return {\n backend: \"tavily\",\n format: input.format,\n results: tavilyAttempt.success,\n } satisfies WebFetchResult;\n }\n\n const firecrawlAttempt = yield* Effect.result(firecrawlFetch.fetch(input));\n\n if (Result.isSuccess(firecrawlAttempt)) {\n return {\n backend: \"firecrawl\",\n format: input.format,\n results: firecrawlAttempt.success,\n fallback: {\n from: \"tavily\",\n to: \"firecrawl\",\n reason: summarizeFallbackReason(tavilyAttempt.failure),\n },\n } satisfies WebFetchResult;\n }\n\n return yield* resolveDoubleFailure(tavilyAttempt.failure, firecrawlAttempt.failure);\n },\n );\n\n return WebFetch.of({\n fetch,\n });\n }),\n );\n}\n\nexport declare namespace WebFetch {\n export type Methods = ServiceMap.Service.Shape<typeof WebFetch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Schema } from \"effect\";\nimport {\n FetchContentFormatSchema,\n TavilyExtractDepthSchema,\n type FetchContentFormat,\n} from \"../providers/tavily/schema\";\nimport { SearchProvider } from \"../shared/errors\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nexport const FetchBackendSchema = Schema.Literals([\"tavily\", \"firecrawl\"] as const);\n\nexport type FetchBackend = typeof FetchBackendSchema.Type;\n\nexport class WebFetchInput extends Schema.Class<WebFetchInput>(\"WebFetchInput\")({\n urls: Schema.NonEmptyArray(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n depth: TavilyExtractDepthSchema,\n format: FetchContentFormatSchema,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(WebFetchInput);\n}\n\nexport interface FetchedPage {\n readonly url: string;\n readonly title?: string | null | undefined;\n readonly raw_content: string;\n}\n\nexport const FetchedPageSchema = Schema.Struct({\n url: Schema.String,\n title: Schema.optional(Schema.NullOr(Schema.String)),\n raw_content: Schema.String,\n});\n\nexport interface FallbackReason {\n readonly type: string;\n readonly provider: typeof SearchProvider.Type;\n readonly message: string;\n}\n\nexport const FallbackReasonSchema = Schema.Struct({\n type: Schema.String,\n provider: SearchProvider,\n message: Schema.String,\n});\n\nexport interface FetchFallback {\n readonly from: \"tavily\";\n readonly to: \"firecrawl\";\n readonly reason: FallbackReason;\n}\n\nexport const FetchFallbackSchema = Schema.Struct({\n from: Schema.Literal(\"tavily\"),\n to: Schema.Literal(\"firecrawl\"),\n reason: FallbackReasonSchema,\n});\n\nexport interface WebFetchResult {\n readonly backend: FetchBackend;\n readonly format: FetchContentFormat;\n readonly results: ReadonlyArray<FetchedPage>;\n readonly fallback?: FetchFallback | undefined;\n}\n\nexport const WebFetchResultSchema = Schema.Struct({\n backend: FetchBackendSchema,\n format: FetchContentFormatSchema,\n results: Schema.NonEmptyArray(FetchedPageSchema),\n fallback: Schema.optional(FetchFallbackSchema),\n});\n\nexport type WebFetchFormat = FetchContentFormat;\n","import { Config } from \"effect\";\nimport { Schema } from \"effect\";\nimport {\n ConfigValidationError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n} from \"./errors\";\n\nexport interface RenderedError {\n readonly type: string;\n readonly provider?: string;\n readonly message: string;\n readonly details?: ReadonlyArray<string>;\n readonly status?: number;\n readonly body?: string;\n}\n\nexport const RenderedErrorSchema = Schema.Struct({\n type: Schema.String,\n provider: Schema.optional(Schema.String),\n message: Schema.String,\n details: Schema.optional(Schema.Array(Schema.String)),\n status: Schema.optional(Schema.Number),\n body: Schema.optional(Schema.String),\n});\n\nconst configErrorDetails = (error: ConfigValidationError): Array<string> => {\n const details = Array.isArray(error.details)\n ? error.details.filter((detail) => detail.length > 0)\n : [];\n\n if (details.length > 0) {\n return details;\n }\n\n if (error.cause instanceof Config.ConfigError && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (error.cause instanceof Error && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (typeof error.cause === \"string\" && error.cause.length > 0) {\n return [error.cause];\n }\n\n return [];\n};\n\nexport const renderStructuredError = (error: unknown): RenderedError => {\n if (error instanceof ConfigValidationError) {\n const details = configErrorDetails(error);\n\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n ...(details.length > 0 ? { details } : {}),\n };\n }\n\n if (error instanceof ProviderRequestError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n if (error instanceof ProviderResponseError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n status: error.status,\n body: error.body,\n };\n }\n\n if (error instanceof ProviderDecodeError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n return {\n type: \"UnknownError\",\n message: String(error),\n };\n};\n","import { Config, Effect, Layer, Logger, Option, Schema, ServiceMap, Console } from \"effect\";\nimport { Flag } from \"effect/unstable/cli\";\nimport {\n ConfigValidationError,\n ProviderContentError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n} from \"./errors\";\nimport { renderStructuredError } from \"./render-error\";\n\nconst stringify = (value: unknown) => JSON.stringify(value, null, 2);\nconst maxHumanErrorBodyLength = 500;\n\nexport const OutputModeSchema = Schema.Literals([\"human\", \"llm\"] as const);\nexport type OutputMode = typeof OutputModeSchema.Type;\n\nexport const outputFlag = Flag.optional(\n Flag.choice(\"output\", OutputModeSchema.literals).pipe(\n Flag.withDescription(\"Output mode: human for readable text, llm for structured JSON.\"),\n ),\n);\n\nconst trimTrailingWhitespace = (text: string) => text.trimEnd();\n\nconst truncate = (text: string, maxLength: number) =>\n text.length <= maxLength ? text : `${text.slice(0, maxLength - 1)}...`;\n\nconst configErrorDetails = (error: ConfigValidationError): Array<string> => {\n const details = Array.isArray(error.details)\n ? error.details.filter((detail) => detail.length > 0)\n : [];\n\n if (details.length > 0) {\n return details;\n }\n\n if (error.cause instanceof Error && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (typeof error.cause === \"string\" && error.cause.length > 0) {\n return [error.cause];\n }\n\n return [];\n};\n\nexport const writeJsonStdout = (value: unknown) => Console.log(stringify(value));\nexport const renderJsonText = (value: unknown) => stringify(value);\n\nconst defaultOutputModeConfig = Config.string(\"AGENT\").pipe(\n Config.withDefault(\"\"),\n Config.map((agent): OutputMode => (agent.trim().length > 0 ? \"llm\" : \"human\")),\n);\n\nexport const resolveOutputMode = (\n selected: Option.Option<OutputMode>,\n fallback: OutputMode,\n): OutputMode => Option.getOrElse(selected, () => fallback);\n\nconst makeCliOutput = (defaultMode: OutputMode) =>\n CliOutput.of({\n defaultMode,\n writeOutput: ({ human, llm }, mode = defaultMode) =>\n mode === \"llm\" ? writeJsonStdout(llm) : Console.log(human),\n logError: (error, mode = defaultMode) => logCliError(error, mode),\n });\n\nconst renderHumanError = (error: unknown) => {\n if (error instanceof ConfigValidationError) {\n const details = configErrorDetails(error);\n const lines = [`Configuration error (${error.provider})`, error.message];\n\n if (details.length > 0) {\n lines.push(\"\", \"What to fix:\");\n lines.push(...details.map((detail) => `- ${detail}`));\n }\n\n return trimTrailingWhitespace(lines.join(\"\\n\"));\n }\n\n if (error instanceof ProviderRequestError) {\n return trimTrailingWhitespace([`Request failed (${error.provider})`, error.message].join(\"\\n\"));\n }\n\n if (error instanceof ProviderContentError) {\n return trimTrailingWhitespace(\n [`Provider returned no usable content (${error.provider})`, error.message].join(\"\\n\"),\n );\n }\n\n if (error instanceof ProviderResponseError) {\n const lines = [\n `Provider response error (${error.provider})`,\n error.message,\n `HTTP status: ${error.status}`,\n ];\n const body = error.body.trim();\n\n if (body.length > 0) {\n lines.push(`Response body: ${truncate(body, maxHumanErrorBodyLength)}`);\n }\n\n return trimTrailingWhitespace(lines.join(\"\\n\"));\n }\n\n if (error instanceof ProviderDecodeError) {\n return trimTrailingWhitespace(\n [`Provider decode error (${error.provider})`, error.message].join(\"\\n\"),\n );\n }\n\n if (error instanceof Error) {\n return trimTrailingWhitespace([error.name, error.message].join(\"\\n\"));\n }\n\n return `Unknown error\\n${String(error)}`;\n};\n\nconst cliErrorLogMessageTag = \"UltimateSearchCliError\";\n\ninterface CliErrorLogMessage {\n readonly _tag: typeof cliErrorLogMessageTag;\n readonly mode: OutputMode;\n readonly error: unknown;\n}\n\nconst isCliErrorLogMessage = (value: unknown): value is CliErrorLogMessage =>\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === cliErrorLogMessageTag &&\n \"mode\" in value &&\n (value.mode === \"human\" || value.mode === \"llm\") &&\n \"error\" in value;\n\nconst normalizeLogMessage = (message: unknown): unknown =>\n Array.isArray(message) && message.length === 1 ? message[0] : message;\n\nconst renderGenericLogMessage = (message: unknown): string => {\n const normalized = normalizeLogMessage(message);\n\n if (Array.isArray(normalized)) {\n return normalized.map((item) => renderGenericLogMessage(item)).join(\" \");\n }\n\n if (typeof normalized === \"string\") {\n return normalized;\n }\n\n if (normalized instanceof Error) {\n return trimTrailingWhitespace([normalized.name, normalized.message].join(\"\\n\"));\n }\n\n try {\n return stringify(normalized);\n } catch {\n return String(normalized);\n }\n};\n\nconst formatCliLogMessage = (message: unknown): string => {\n const normalized = normalizeLogMessage(message);\n\n if (isCliErrorLogMessage(normalized)) {\n return normalized.mode === \"llm\"\n ? stringify({ error: renderStructuredError(normalized.error) })\n : renderHumanError(normalized.error);\n }\n\n return renderGenericLogMessage(normalized);\n};\n\nexport const logCliError = (error: unknown, mode: OutputMode) =>\n Effect.logError({\n _tag: cliErrorLogMessageTag,\n mode,\n error,\n } satisfies CliErrorLogMessage);\n\nconst cliConsoleLogger = Logger.withConsoleError(\n Logger.make((options) => formatCliLogMessage(options.message)),\n);\n\nexport const cliLoggerLayer = Logger.layer([cliConsoleLogger, Logger.tracerLogger]);\n\nexport class CliOutput extends ServiceMap.Service<\n CliOutput,\n {\n readonly defaultMode: OutputMode;\n readonly writeOutput: (\n output: {\n readonly human: string;\n readonly llm: unknown;\n },\n mode?: OutputMode,\n ) => Effect.Effect<void>;\n readonly logError: (error: unknown, mode?: OutputMode) => Effect.Effect<void>;\n }\n>()(\"CliOutput\") {\n static readonly layer = Layer.effect(\n CliOutput,\n Effect.map(defaultOutputModeConfig.asEffect(), makeCliOutput),\n );\n\n static layerForMode(mode: OutputMode) {\n return Layer.succeed(CliOutput, makeCliOutput(mode));\n }\n}\n","import { Effect, Option } from \"effect\";\nimport { CliOutput, type OutputMode, resolveOutputMode } from \"./output\";\n\nexport interface CommandOutput {\n readonly human: string;\n readonly llm: unknown;\n}\n\nexport const runCommandWithOutput = <E, R>(\n selectedMode: Option.Option<OutputMode>,\n buildOutput: (mode: OutputMode) => Effect.Effect<CommandOutput, E, R>,\n) =>\n Effect.gen(function* () {\n const cliOutput = yield* CliOutput;\n const mode = resolveOutputMode(selectedMode, cliOutput.defaultMode);\n const output = yield* buildOutput(mode).pipe(\n Effect.tapError((error) => cliOutput.logError(error, mode)),\n );\n\n yield* cliOutput.writeOutput(output, mode);\n });\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport { FetchContentFormatSchema, TavilyExtractDepthSchema } from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { FirecrawlFetch } from \"../services/firecrawl-fetch\";\nimport { TavilyExtract } from \"../services/tavily-extract\";\nimport { WebFetch } from \"../services/web-fetch\";\nimport { WebFetchInput, type WebFetchResult } from \"../services/web-fetch-schema\";\nimport { runCommandWithOutput } from \"../shared/command-output\";\nimport { outputFlag } from \"../shared/output\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nconst fetchCommandLayer = WebFetch.layer.pipe(\n Layer.provideMerge(FirecrawlFetch.layer),\n Layer.provideMerge(TavilyExtract.layer),\n Layer.provideMerge(FirecrawlProviderClient.layer),\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanFetchResult = (result: WebFetchResult) => {\n const lines = [`Backend: ${result.backend}`];\n\n if (result.fallback != null) {\n lines.push(\n `Fallback: ${result.fallback.from} -> ${result.fallback.to} (${result.fallback.reason.message})`,\n );\n }\n\n for (const [index, page] of result.results.entries()) {\n lines.push(\"\");\n lines.push(`URL: ${page.url}`);\n\n if (page.title != null && page.title.trim().length > 0) {\n lines.push(`Title: ${page.title.trim()}`);\n }\n\n lines.push(\"\");\n lines.push(page.raw_content);\n\n if (index < result.results.length - 1) {\n lines.push(\"\", \"---\");\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const commandFetch = Command.make(\n \"fetch\",\n {\n url: Flag.string(\"url\").pipe(\n Flag.withSchema(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n Flag.withDescription(\"Target page URL.\"),\n ),\n depth: Flag.choice(\"depth\", TavilyExtractDepthSchema.literals).pipe(\n Flag.withDefault(\"basic\"),\n Flag.withDescription(\"Optional Tavily extract depth.\"),\n ),\n format: Flag.choice(\"format\", FetchContentFormatSchema.literals).pipe(\n Flag.withDefault(\"markdown\"),\n Flag.withDescription(\"Normalized content format to return.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, (mode) =>\n Effect.gen(function* () {\n const request = yield* WebFetchInput.decodeEffect({\n urls: [input.url],\n depth: input.depth,\n format: input.format,\n });\n const webFetch = yield* WebFetch;\n const result = yield* webFetch.fetch(request);\n\n return {\n human: mode === \"human\" ? renderHumanFetchResult(result) : \"\",\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Fetch and normalize page content from a URL.\"),\n Command.withExamples([\n {\n command: 'ultimate-search fetch --url \"https://example.com\"',\n description: \"Fetch a page with Tavily first and FireCrawl as fallback.\",\n },\n ]),\n Command.provide(fetchCommandLayer),\n);\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport {\n buildTavilyMapRequest,\n TavilyMapInput,\n type TavilyMapResponse,\n} from \"../providers/tavily/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class TavilyMap extends ServiceMap.Service<\n TavilyMap,\n {\n readonly map: (\n input: TavilyMapInput,\n ) => Effect.Effect<TavilyMapResponse, UltimateSearchError, never>;\n }\n>()(\"TavilyMap\") {\n static readonly layer = Layer.effect(\n TavilyMap,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const map: TavilyMap.Methods[\"map\"] = Effect.fn(\"TavilyMap.map\")(function* (input) {\n return yield* provider.map(buildTavilyMapRequest(input));\n });\n\n return TavilyMap.of({\n map,\n });\n }),\n );\n}\n\nexport declare namespace TavilyMap {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyMap>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Option, Schema } from \"effect\";\nimport { Flag } from \"effect/unstable/cli\";\n\nexport const optionalTrimmedTextFlag = (name: string, description: string) =>\n Flag.optional(\n Flag.string(name).pipe(Flag.withSchema(Schema.Trim), Flag.withDescription(description)),\n ).pipe(Flag.map((value) => Option.filter(value, (text) => text.length > 0)));\n\nexport const optionalChoiceFlag = <A extends string>(\n name: string,\n choices: ReadonlyArray<A>,\n description: string,\n) => Flag.optional(Flag.choice(name, choices).pipe(Flag.withDescription(description)));\n\nexport const optionalIntegerFlag = (name: string, description: string) =>\n Flag.optional(Flag.integer(name).pipe(Flag.withDescription(description)));\n\nexport const optionalIntegerFlagWithSchema = <A>(\n name: string,\n schema: Schema.Codec<A, number>,\n description: string,\n) =>\n Flag.optional(\n Flag.integer(name).pipe(Flag.withSchema(schema), Flag.withDescription(description)),\n );\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport {\n TavilyMapBreadthSchema,\n TavilyMapDepthSchema,\n TavilyMapInput,\n TavilyMapLimitSchema,\n type TavilyMapResponse,\n} from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { TavilyMap } from \"../services/tavily-map\";\nimport { optionalIntegerFlagWithSchema, optionalTrimmedTextFlag } from \"../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../shared/command-output\";\nimport { outputFlag } from \"../shared/output\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nconst mapCommandLayer = TavilyMap.layer.pipe(\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanMapResult = (result: TavilyMapResponse) => {\n const lines = [`Base URL: ${result.base_url}`, `Discovered URLs: ${result.results.length}`];\n\n if (result.response_time !== undefined) {\n lines.push(`Response time: ${result.response_time}s`);\n }\n\n if (result.usage?.credits_used !== undefined) {\n lines.push(`Credits used: ${result.usage.credits_used}`);\n }\n\n if (result.results.length > 0) {\n lines.push(\"\", ...result.results.map((url) => `- ${url}`));\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const commandMap = Command.make(\n \"map\",\n {\n url: Flag.string(\"url\").pipe(\n Flag.withSchema(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n Flag.withDescription(\"Root URL to map with Tavily.\"),\n ),\n depth: optionalIntegerFlagWithSchema(\n \"depth\",\n TavilyMapDepthSchema,\n \"Optional crawl depth between 1 and 5.\",\n ),\n breadth: optionalIntegerFlagWithSchema(\n \"breadth\",\n TavilyMapBreadthSchema,\n \"Optional crawl breadth between 1 and 500.\",\n ),\n limit: optionalIntegerFlagWithSchema(\n \"limit\",\n TavilyMapLimitSchema,\n \"Optional maximum number of discovered URLs to return.\",\n ),\n instructions: optionalTrimmedTextFlag(\n \"instructions\",\n \"Optional guidance for how Tavily should explore the site.\",\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* TavilyMapInput.decodeEffect(input);\n const tavilyMap = yield* TavilyMap;\n const result = yield* tavilyMap.map(request);\n\n return {\n human: renderHumanMapResult(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Map a site's reachable URLs with Tavily.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search map --url \"https://fastapi.tiangolo.com\" --depth 2 --breadth 20 --limit 50',\n description: \"Discover reachable URLs for a site with Tavily map.\",\n },\n {\n command: 'ultimate-search map --url \"https://fastapi.tiangolo.com\" --output llm',\n description: \"Emit structured JSON for agent-driven workflows.\",\n },\n ]),\n Command.provide(mapCommandLayer),\n);\n","import { Option, Schema } from \"effect\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nexport const GrokUsageSchema = Schema.Struct({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n total_tokens: Schema.Number,\n});\n\nexport type GrokUsage = typeof GrokUsageSchema.Type;\n\nexport const GrokMessageSchema = Schema.Struct({\n role: Schema.Literals([\"system\", \"user\", \"assistant\"] as const),\n content: Schema.String,\n});\n\nexport type GrokMessage = typeof GrokMessageSchema.Type;\n\nexport const GrokChatCompletionRequestSchema = Schema.Struct({\n model: Schema.NonEmptyString,\n stream: Schema.Boolean,\n messages: Schema.NonEmptyArray(GrokMessageSchema),\n});\n\nexport type GrokChatCompletionRequest = typeof GrokChatCompletionRequestSchema.Type;\n\nexport const GrokChatCompletionResponseSchema = Schema.Struct({\n model: Schema.String,\n choices: Schema.NonEmptyArray(\n Schema.Struct({\n message: GrokMessageSchema,\n }),\n ),\n usage: GrokUsageSchema,\n});\n\nexport type GrokChatCompletionResponse = typeof GrokChatCompletionResponseSchema.Type;\n\nexport class GrokSearchInput extends Schema.Class<GrokSearchInput>(\"GrokSearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: Schema.Option(Schema.NonEmptyString),\n model: Schema.Option(Schema.NonEmptyString),\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(GrokSearchInput);\n}\n\nexport interface GrokSearchResult {\n readonly content: string;\n readonly model: string;\n readonly usage: GrokUsage;\n}\n\nexport const GrokSearchResultSchema = Schema.Struct({\n content: Schema.String,\n model: Schema.String,\n usage: GrokUsageSchema,\n});\n\nconst timeSensitivePattern =\n /今天|最新|当前|latest|recent|today|current|now|这几天|本周|本月|近期|最近/iu;\n\nexport const grokSystemPrompt = `# Core Instruction\n\n1. User needs may be vague. Think divergently, infer intent from multiple angles, and leverage full conversation context to progressively clarify their true needs.\n2. **Breadth-First Search**—Approach problems from multiple dimensions. Brainstorm 5+ perspectives and execute parallel searches for each. Consult as many high-quality sources as possible before responding.\n3. **Depth-First Search**—After broad exploration, select ≥2 most relevant perspectives for deep investigation into specialized knowledge.\n4. **Evidence-Based Reasoning & Traceable Sources**—Every claim must be followed by a citation. More credible sources strengthen arguments. If no references exist, remain silent.\n5. Before responding, ensure full execution of Steps 1–4.\n\n# Search Instruction\n\n1. Think carefully before responding—anticipate the user's true intent to ensure precision.\n2. Verify every claim rigorously to avoid misinformation.\n3. Follow problem logic—dig deeper until clues are exhaustively clear. Use multiple parallel tool calls per query and ensure answers are well-sourced.\n4. Search in English first (prioritizing English resources for volume/quality), but switch to Chinese if context demands.\n5. Prioritize authoritative sources: Wikipedia, academic databases, books, reputable media/journalism.\n6. Favor sharing in-depth, specialized knowledge over generic or common-sense content.\n\n# Output Style\n\n1. Lead with the **most probable solution** before detailed analysis.\n2. **Define every technical term** in plain language.\n3. **Respect facts and search results—use statistical rigor to discern truth**.\n4. **Every sentence must cite sources**. More references = stronger credibility.\n5. **Strictly format outputs in polished Markdown**.`;\n\nconst withCurrentTimeContext = (query: string) => {\n if (!timeSensitivePattern.test(query)) {\n return query;\n }\n\n return `[Current date and time: ${new Date().toISOString()}]\n\n${query}`;\n};\n\nexport const buildGrokUserMessage = (input: GrokSearchInput) => {\n const baseMessage = withCurrentTimeContext(input.query);\n\n return Option.match(input.platform, {\n onNone: () => baseMessage,\n onSome: (platform) =>\n `${baseMessage}\n\nYou should focus on these platform: ${platform}`,\n });\n};\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type GrokChatCompletionRequest,\n GrokChatCompletionResponseSchema,\n type GrokChatCompletionResponse,\n} from \"./schema\";\n\nconst decodeGrokChatCompletionResponse = Schema.decodeUnknownEffect(\n GrokChatCompletionResponseSchema,\n);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"grok\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class GrokProviderClient extends ServiceMap.Service<\n GrokProviderClient,\n {\n readonly createChatCompletion: (\n request: GrokChatCompletionRequest,\n ) => Effect.Effect<GrokChatCompletionResponse, UltimateSearchError, never>;\n }\n>()(\"GrokProviderClient\") {\n static readonly layer = Layer.effect(\n GrokProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const createChatCompletion: GrokProviderClient.Methods[\"createChatCompletion\"] = Effect.fn(\n \"GrokProviderClient.createChatCompletion\",\n )(function* (payload): GrokProviderClient.Returns<\"createChatCompletion\"> {\n const grok = yield* config.getGrokConfig();\n const request = HttpClientRequest.post(`${grok.apiUrl}/v1/chat/completions`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(grok.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"grok\",\n \"Failed to send the Grok request.\",\n (status: number) => `Grok returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeGrokChatCompletionResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Grok response payload.\"),\n );\n });\n\n return GrokProviderClient.of({\n createChatCompletion,\n });\n }),\n );\n}\n\nexport declare namespace GrokProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof GrokProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Option, ServiceMap } from \"effect\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { GrokProviderClient } from \"../providers/grok/client\";\nimport {\n buildGrokUserMessage,\n type GrokChatCompletionRequest,\n GrokSearchInput,\n type GrokSearchResult,\n grokSystemPrompt,\n} from \"../providers/grok/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class GrokSearch extends ServiceMap.Service<\n GrokSearch,\n {\n readonly search: (\n input: GrokSearchInput,\n ) => Effect.Effect<GrokSearchResult, UltimateSearchError, never>;\n }\n>()(\"GrokSearch\") {\n // 也可以单独定义成变量或者class上的静态方法\n static readonly layer = Layer.effect(\n GrokSearch,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const provider = yield* GrokProviderClient;\n\n const search: GrokSearch.Methods[\"search\"] = Effect.fn(\"search\")(\n function* (input): GrokSearch.Returns<\"search\"> {\n const grok = yield* config.getGrokConfig();\n const payload: GrokChatCompletionRequest = {\n model: Option.getOrElse(input.model, () => grok.model),\n stream: false,\n messages: [\n {\n role: \"system\",\n content: grokSystemPrompt,\n },\n {\n role: \"user\",\n content: buildGrokUserMessage(input),\n },\n ],\n };\n const response = yield* provider.createChatCompletion(payload);\n\n return {\n content: response.choices[0].message.content,\n model: response.model,\n usage: response.usage,\n } satisfies GrokSearchResult;\n },\n );\n\n return GrokSearch.of({\n search,\n });\n }),\n );\n\n // 也可以再定义 live = Layer.provide(xxx.layer, deps) // 无依赖的 Layer<A, E, never>\n}\n\nexport declare namespace GrokSearch {\n export type Methods = ServiceMap.Service.Shape<typeof GrokSearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport {\n buildTavilySearchRequest,\n TavilySearchInput,\n type TavilySearchResponse,\n} from \"../providers/tavily/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class TavilySearch extends ServiceMap.Service<\n TavilySearch,\n {\n readonly search: (\n input: TavilySearchInput,\n ) => Effect.Effect<TavilySearchResponse, UltimateSearchError, never>;\n }\n>()(\"TavilySearch\") {\n static readonly layer = Layer.effect(\n TavilySearch,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const search: TavilySearch.Methods[\"search\"] = Effect.fn(\"TavilySearch.search\")(\n function* (input): TavilySearch.Returns<\"search\"> {\n return yield* provider.search(buildTavilySearchRequest(input));\n },\n );\n\n return TavilySearch.of({\n search,\n });\n }),\n );\n}\n\nexport declare namespace TavilySearch {\n export type Methods = ServiceMap.Service.Shape<typeof TavilySearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, Schema, ServiceMap } from \"effect\";\nimport {\n GrokSearchInput,\n GrokSearchResultSchema,\n type GrokSearchResult,\n} from \"../providers/grok/schema\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchInput,\n TavilySearchResponseSchema,\n type TavilySearchResponse,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../providers/tavily/schema\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { RenderedError } from \"../shared/render-error\";\nimport { RenderedErrorSchema, renderStructuredError } from \"../shared/render-error\";\nimport { trimmedNonEmptyStringSchema } from \"../shared/schema\";\nimport { GrokSearch } from \"./grok-search\";\nimport { TavilySearch } from \"./tavily-search\";\n\nexport class DualSearchInput extends Schema.Class<DualSearchInput>(\"DualSearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: Schema.Option(Schema.NonEmptyString),\n model: Schema.Option(Schema.NonEmptyString),\n searchDepth: Schema.Option(TavilySearchDepthSchema),\n topic: Schema.Option(TavilySearchTopicSchema),\n timeRange: Schema.Option(TavilyTimeRangeSchema),\n maxResults: Schema.Option(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"max-results must be an integer between 1 and 20\",\n }),\n ),\n ),\n includeAnswer: Schema.Boolean,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(DualSearchInput);\n}\n\nexport interface DualSearchProviderSuccess<A> {\n readonly status: \"success\";\n readonly result: A;\n}\n\nexport interface DualSearchProviderFailure {\n readonly status: \"error\";\n readonly error: RenderedError;\n}\n\nexport type DualSearchProviderResult<A> = DualSearchProviderSuccess<A> | DualSearchProviderFailure;\n\nexport interface DualSearchResult {\n readonly grok: DualSearchProviderResult<GrokSearchResult>;\n readonly tavily: DualSearchProviderResult<TavilySearchResponse>;\n}\n\nconst dualSearchProviderSuccessSchema = <A extends Schema.Top>(resultSchema: A) =>\n Schema.Struct({\n status: Schema.Literal(\"success\"),\n result: resultSchema,\n });\n\nconst DualSearchProviderFailureSchema = Schema.Struct({\n status: Schema.Literal(\"error\"),\n error: RenderedErrorSchema,\n});\n\nexport const DualSearchResultSchema = Schema.Struct({\n grok: Schema.Union([\n dualSearchProviderSuccessSchema(GrokSearchResultSchema),\n DualSearchProviderFailureSchema,\n ]),\n tavily: Schema.Union([\n dualSearchProviderSuccessSchema(TavilySearchResponseSchema),\n DualSearchProviderFailureSchema,\n ]),\n});\n\nconst toProviderResult = <A, E>(result: Result.Result<A, E>): DualSearchProviderResult<A> =>\n Result.match(result, {\n onSuccess: (value) => ({\n status: \"success\",\n result: value,\n }),\n onFailure: (error) => ({\n status: \"error\",\n error: renderStructuredError(error),\n }),\n });\n\nexport class DualSearch extends ServiceMap.Service<\n DualSearch,\n {\n readonly search: (input: DualSearchInput) => Effect.Effect<DualSearchResult>;\n }\n>()(\"DualSearch\") {\n static readonly layer = Layer.effect(\n DualSearch,\n Effect.gen(function* () {\n const grokSearch = yield* GrokSearch;\n const tavilySearch = yield* TavilySearch;\n\n const search: DualSearch.Methods[\"search\"] = Effect.fn(\"DualSearch.search\")(\n function* (input): DualSearch.Returns<\"search\"> {\n const results = yield* Effect.all(\n {\n grok: grokSearch.search(\n yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: input.platform,\n model: input.model,\n }).pipe(Effect.orDie),\n ),\n tavily: tavilySearch.search(\n yield* TavilySearchInput.decodeEffect({\n query: input.query,\n searchDepth: input.searchDepth,\n topic: input.topic,\n timeRange: input.timeRange,\n maxResults: input.maxResults,\n includeAnswer: input.includeAnswer,\n }).pipe(Effect.orDie),\n ),\n },\n {\n concurrency: \"unbounded\",\n mode: \"result\",\n },\n );\n\n return {\n grok: toProviderResult(results.grok),\n tavily: toProviderResult(results.tavily),\n };\n },\n );\n\n return DualSearch.of({\n search,\n });\n }),\n );\n}\n\nexport declare namespace DualSearch {\n export type Methods = ServiceMap.Service.Shape<typeof DualSearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Option, Schema } from \"effect\";\nimport { McpServer, Tool, Toolkit } from \"effect/unstable/ai\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { GrokSearchInput, GrokSearchResultSchema } from \"../providers/grok/schema\";\nimport { GrokProviderClient } from \"../providers/grok/client\";\nimport {\n FetchContentFormatSchema,\n TavilyMapBreadthSchema,\n TavilyMapDepthSchema,\n TavilyMapInput,\n TavilyMapLimitSchema,\n TavilyMapResponseSchema,\n TavilySearchDepthSchema,\n TavilySearchInput,\n TavilySearchResponseSchema,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport { DualSearch, DualSearchInput, DualSearchResultSchema } from \"./dual-search\";\nimport { FirecrawlFetch } from \"./firecrawl-fetch\";\nimport { GrokSearch } from \"./grok-search\";\nimport { TavilyMap } from \"./tavily-map\";\nimport { TavilyExtract } from \"./tavily-extract\";\nimport { TavilySearch } from \"./tavily-search\";\nimport { WebFetch } from \"./web-fetch\";\nimport { WebFetchInput, WebFetchResultSchema } from \"./web-fetch-schema\";\nimport { RenderedErrorSchema, renderStructuredError } from \"../shared/render-error\";\nimport { absoluteUrlStringSchema, trimmedNonEmptyStringSchema } from \"../shared/schema\";\n\nconst optionalTrimmedTextField = (message: string) =>\n Schema.optional(trimmedNonEmptyStringSchema(message));\n\nconst toOption = <A>(value: A | undefined) =>\n value === undefined ? Option.none<A>() : Option.some(value);\n\nconst SearchGrokParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: optionalTrimmedTextField(\"platform must be a non-empty string\"),\n model: optionalTrimmedTextField(\"model must be a non-empty string\"),\n});\n\nconst SearchTavilyParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n maxResults: Schema.optional(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"maxResults must be an integer between 1 and 20\",\n }),\n ),\n ),\n topic: Schema.optional(TavilySearchTopicSchema),\n timeRange: Schema.optional(TavilyTimeRangeSchema),\n includeAnswer: Schema.optional(Schema.Boolean),\n});\n\nconst SearchDualParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: optionalTrimmedTextField(\"platform must be a non-empty string\"),\n model: optionalTrimmedTextField(\"model must be a non-empty string\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n maxResults: Schema.optional(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"maxResults must be an integer between 1 and 20\",\n }),\n ),\n ),\n topic: Schema.optional(TavilySearchTopicSchema),\n timeRange: Schema.optional(TavilyTimeRangeSchema),\n includeAnswer: Schema.optional(Schema.Boolean),\n});\n\nconst FetchParametersSchema = Schema.Struct({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n format: Schema.optional(FetchContentFormatSchema),\n});\n\nconst MapParametersSchema = Schema.Struct({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.optional(TavilyMapDepthSchema),\n breadth: Schema.optional(TavilyMapBreadthSchema),\n limit: Schema.optional(TavilyMapLimitSchema),\n instructions: optionalTrimmedTextField(\"instructions must be a non-empty string\"),\n});\n\nconst searchGrokTool = Tool.make(\"search_grok\", {\n description: \"Run the Grok-backed search flow used by the CLI.\",\n parameters: SearchGrokParametersSchema,\n success: GrokSearchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Grok\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst searchTavilyTool = Tool.make(\"search_tavily\", {\n description: \"Run the Tavily-backed search flow used by the CLI.\",\n parameters: SearchTavilyParametersSchema,\n success: TavilySearchResponseSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Tavily\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst searchDualTool = Tool.make(\"search_dual\", {\n description: \"Run Grok and Tavily concurrently with the CLI's dual-search orchestration.\",\n parameters: SearchDualParametersSchema,\n success: DualSearchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Dual\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst fetchTool = Tool.make(\"fetch\", {\n description: \"Fetch a page with Tavily-first and FireCrawl fallback, matching the CLI.\",\n parameters: FetchParametersSchema,\n success: WebFetchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Fetch\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst mapTool = Tool.make(\"map\", {\n description: \"Map a site's reachable URLs with Tavily, matching the CLI.\",\n parameters: MapParametersSchema,\n success: TavilyMapResponseSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Map\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nexport const readOnlyMcpToolkit = Toolkit.make(\n searchGrokTool,\n searchTavilyTool,\n searchDualTool,\n fetchTool,\n mapTool,\n);\n\nexport const readOnlyMcpToolNames = [\n \"search_grok\",\n \"search_tavily\",\n \"search_dual\",\n \"fetch\",\n \"map\",\n] as const;\n\nconst readOnlyMcpToolkitLayer = readOnlyMcpToolkit.toLayer(\n Effect.gen(function* () {\n const grokSearch = yield* GrokSearch;\n const tavilySearch = yield* TavilySearch;\n const dualSearch = yield* DualSearch;\n const webFetch = yield* WebFetch;\n const tavilyMap = yield* TavilyMap;\n\n return readOnlyMcpToolkit.of({\n search_grok: Effect.fn(\"ReadOnlyMcp.searchGrok\")(function* (input) {\n const request = yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: toOption(input.platform),\n model: toOption(input.model),\n }).pipe(Effect.orDie);\n\n return yield* grokSearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n search_tavily: Effect.fn(\"ReadOnlyMcp.searchTavily\")(function* (input) {\n const request = yield* TavilySearchInput.decodeEffect({\n query: input.query,\n searchDepth: toOption(input.depth),\n topic: toOption(input.topic),\n timeRange: toOption(input.timeRange),\n maxResults: toOption(input.maxResults),\n includeAnswer: input.includeAnswer ?? false,\n }).pipe(Effect.orDie);\n\n return yield* tavilySearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n search_dual: Effect.fn(\"ReadOnlyMcp.searchDual\")(function* (input) {\n const request = yield* DualSearchInput.decodeEffect({\n query: input.query,\n platform: toOption(input.platform),\n model: toOption(input.model),\n searchDepth: toOption(input.depth),\n topic: toOption(input.topic),\n timeRange: toOption(input.timeRange),\n maxResults: toOption(input.maxResults),\n includeAnswer: input.includeAnswer ?? false,\n }).pipe(Effect.orDie);\n\n return yield* dualSearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n fetch: Effect.fn(\"ReadOnlyMcp.fetch\")(function* (input) {\n const request = yield* WebFetchInput.decodeEffect({\n urls: [input.url],\n depth: input.depth ?? \"basic\",\n format: input.format ?? \"markdown\",\n }).pipe(Effect.orDie);\n\n return yield* webFetch.fetch(request).pipe(\n Effect.flatMap((result) => Schema.decodeUnknownEffect(WebFetchResultSchema)(result)),\n Effect.mapError(renderStructuredError),\n );\n }),\n map: Effect.fn(\"ReadOnlyMcp.map\")(function* (input) {\n const request = yield* TavilyMapInput.decodeEffect({\n url: input.url,\n depth: toOption(input.depth),\n breadth: toOption(input.breadth),\n limit: toOption(input.limit),\n instructions: toOption(input.instructions),\n }).pipe(Effect.orDie);\n\n return yield* tavilyMap.map(request).pipe(Effect.mapError(renderStructuredError));\n }),\n });\n }),\n);\n\nconst readOnlyProviderLayer = Layer.mergeAll(\n FirecrawlProviderClient.layer,\n GrokProviderClient.layer,\n TavilyProviderClient.layer,\n).pipe(Layer.provideMerge(UltimateSearchConfig.layer));\n\nconst grokSearchLayer = GrokSearch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilySearchLayer = TavilySearch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilyMapLayer = TavilyMap.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilyExtractLayer = TavilyExtract.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst firecrawlFetchLayer = FirecrawlFetch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst webFetchLayer = WebFetch.layer.pipe(\n Layer.provideMerge(firecrawlFetchLayer),\n Layer.provideMerge(tavilyExtractLayer),\n);\n\nconst dualSearchLayer = DualSearch.layer.pipe(\n Layer.provideMerge(grokSearchLayer),\n Layer.provideMerge(tavilySearchLayer),\n);\n\nexport const readOnlyMcpServicesLayer = Layer.mergeAll(\n grokSearchLayer,\n tavilySearchLayer,\n dualSearchLayer,\n webFetchLayer,\n tavilyMapLayer,\n);\n\nexport const readOnlyMcpRegistrationLayer = Layer.effectDiscard(\n McpServer.registerToolkit(readOnlyMcpToolkit),\n).pipe(Layer.provideMerge(readOnlyMcpToolkitLayer));\n","import { Cause, Effect, Layer } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\nimport { Command } from \"effect/unstable/cli\";\nimport PackageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n readOnlyMcpRegistrationLayer,\n readOnlyMcpServicesLayer,\n} from \"../../services/read-only-mcp\";\n\nconst mcpStdioServerLayer = readOnlyMcpRegistrationLayer.pipe(\n Layer.provideMerge(\n McpServer.layerStdio({\n name: \"ultimate-search\",\n version: PackageJson.version,\n }),\n ),\n Layer.provideMerge(readOnlyMcpServicesLayer),\n);\n\nexport const commandMcpStdio = Command.make(\"stdio\").pipe(\n Command.withDescription(\"Serve the MCP protocol over stdio.\"),\n Command.withHandler(() =>\n Layer.launch(mcpStdioServerLayer).pipe(\n Effect.catchCauseIf(Cause.hasInterruptsOnly, () => Effect.void),\n ),\n ),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandMcpStdio } from \"./mcp/stdio\";\n\nexport const commandMcp = Command.make(\"mcp\").pipe(\n Command.withDescription(\"Expose ultimate-search over MCP transports.\"),\n Command.withSubcommands([commandMcpStdio]),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport { GrokProviderClient } from \"../../providers/grok/client\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../../providers/tavily/client\";\nimport { DualSearch, DualSearchInput } from \"../../services/dual-search\";\nimport { GrokSearch } from \"../../services/grok-search\";\nimport { TavilySearch } from \"../../services/tavily-search\";\nimport {\n optionalChoiceFlag,\n optionalIntegerFlag,\n optionalTrimmedTextFlag,\n} from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag, renderJsonText } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst dualCommandLayer = DualSearch.layer.pipe(\n Layer.provideMerge(GrokSearch.layer),\n Layer.provideMerge(TavilySearch.layer),\n Layer.provideMerge(GrokProviderClient.layer),\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nexport const commandSearchDual = Command.make(\n \"dual\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to both Grok and Tavily.\"),\n ),\n platform: optionalTrimmedTextFlag(\n \"platform\",\n \"Optional platform focus for the Grok branch such as GitHub or Reddit.\",\n ),\n model: optionalTrimmedTextFlag(\"model\", \"Override the configured Grok model.\"),\n searchDepth: optionalChoiceFlag(\n \"depth\",\n TavilySearchDepthSchema.literals,\n \"Optional Tavily search depth.\",\n ),\n maxResults: optionalIntegerFlag(\"max-results\", \"Optional number of Tavily results to return.\"),\n topic: optionalChoiceFlag(\n \"topic\",\n TavilySearchTopicSchema.literals,\n \"Optional Tavily topic focus.\",\n ),\n timeRange: optionalChoiceFlag(\n \"time-range\",\n TavilyTimeRangeSchema.literals,\n \"Optional Tavily recency window.\",\n ),\n includeAnswer: Flag.boolean(\"include-answer\").pipe(\n Flag.withDescription(\"Request a synthesized Tavily answer in the response.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* DualSearchInput.decodeEffect(input);\n const dualSearch = yield* DualSearch;\n const result = yield* dualSearch.search(request);\n\n return {\n human: renderJsonText(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Grok and Tavily search concurrently.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search search dual --query \"FastAPI latest features\" --depth advanced --include-answer',\n description: \"Run both providers and merge their status-tagged results into one JSON object.\",\n },\n ]),\n Command.provide(dualCommandLayer),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport { GrokProviderClient } from \"../../providers/grok/client\";\nimport { GrokSearchInput, type GrokSearchResult } from \"../../providers/grok/schema\";\nimport { GrokSearch } from \"../../services/grok-search\";\nimport { optionalTrimmedTextFlag } from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst grokCommandLayer = GrokSearch.layer.pipe(\n Layer.provideMerge(GrokProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanGrokResult = (result: GrokSearchResult) =>\n [\n result.content.trim().length > 0 ? result.content.trim() : \"Grok returned an empty response.\",\n \"\",\n `Model: ${result.model}`,\n `Tokens: ${result.usage.total_tokens} total (${result.usage.prompt_tokens} prompt, ${result.usage.completion_tokens} completion)`,\n ].join(\"\\n\");\n\nexport const commandSearchGrok = Command.make(\n \"grok\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to Grok.\"),\n ),\n platform: optionalTrimmedTextFlag(\n \"platform\",\n \"Optional platform focus such as GitHub or Reddit.\",\n ),\n model: optionalTrimmedTextFlag(\"model\", \"Override the configured Grok model.\"),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: input.platform,\n model: input.model,\n });\n const grokSearch = yield* GrokSearch;\n const result = yield* grokSearch.search(request);\n\n return {\n human: renderHumanGrokResult(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Grok-backed search.\"),\n Command.withExamples([\n {\n command: 'ultimate-search search grok --query \"FastAPI latest features\"',\n description: \"Run a Grok-backed web search with the configured model.\",\n },\n {\n command: 'ultimate-search search grok --query \"FastAPI latest features\" --output llm',\n description: \"Emit structured JSON for agent-driven workflows.\",\n },\n ]),\n Command.provide(grokCommandLayer),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchInput,\n type TavilySearchResponse,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../../providers/tavily/client\";\nimport { TavilySearch } from \"../../services/tavily-search\";\nimport { optionalChoiceFlag, optionalIntegerFlag } from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst tavilyCommandLayer = TavilySearch.layer.pipe(\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanTavilyResult = (result: TavilySearchResponse) => {\n const lines: Array<string> = [];\n\n if (result.answer != null && result.answer.trim().length > 0) {\n lines.push(result.answer.trim(), \"\");\n }\n\n if (result.response_time != null) {\n lines.push(`Response time: ${result.response_time}s`, \"\");\n }\n\n for (const [index, item] of result.results.entries()) {\n lines.push(`${index + 1}. ${item.title}`);\n lines.push(item.url);\n lines.push(item.content.trim());\n\n if (index < result.results.length - 1) {\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\").trim();\n};\n\nexport const commandSearchTavily = Command.make(\n \"tavily\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to Tavily.\"),\n ),\n searchDepth: optionalChoiceFlag(\n \"depth\",\n TavilySearchDepthSchema.literals,\n \"Optional Tavily search depth.\",\n ),\n maxResults: optionalIntegerFlag(\"max-results\", \"Optional number of Tavily results to return.\"),\n topic: optionalChoiceFlag(\n \"topic\",\n TavilySearchTopicSchema.literals,\n \"Optional Tavily topic focus.\",\n ),\n timeRange: optionalChoiceFlag(\n \"time-range\",\n TavilyTimeRangeSchema.literals,\n \"Optional Tavily recency window.\",\n ),\n includeAnswer: Flag.boolean(\"include-answer\").pipe(\n Flag.withDescription(\"Request a synthesized Tavily answer in the response.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, (mode) =>\n Effect.gen(function* () {\n const request = yield* TavilySearchInput.decodeEffect(input);\n const tavilySearch = yield* TavilySearch;\n const result = yield* tavilySearch.search(request);\n\n return {\n human: mode === \"human\" ? renderHumanTavilyResult(result) : \"\",\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Tavily-backed search.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search search tavily --query \"FastAPI latest features\" --depth advanced --max-results 5',\n description: \"Run a Tavily-backed web search with optional search tuning.\",\n },\n ]),\n Command.provide(tavilyCommandLayer),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandSearchDual } from \"./search/dual\";\nimport { commandSearchGrok } from \"./search/grok\";\nimport { commandSearchTavily } from \"./search/tavily\";\n\nexport const commandSearch = Command.make(\"search\").pipe(\n Command.withDescription(\"Search the web with one or more providers.\"),\n Command.withSubcommands([commandSearchGrok, commandSearchTavily, commandSearchDual]),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandFetch } from \"./fetch\";\nimport { commandMap } from \"./map\";\nimport { commandMcp } from \"./mcp\";\nimport { commandSearch } from \"./search\";\n\nexport const commandRoot = Command.make(\"ultimate-search\").pipe(\n Command.withDescription(\"CLI entrypoint for search, fetch, map, and MCP workflows.\"),\n Command.withSubcommands([commandSearch, commandFetch, commandMap, commandMcp]),\n);\n","import { Cause, Duration, Effect, Fiber, Layer, Logger, LogLevel, Tracer } from \"effect\";\nimport { CurrentLoggers } from \"effect/Logger\";\nimport { MinimumLogLevel } from \"effect/References\";\n\nexport const TracingLayer = Layer.unwrap(\n Effect.gen(function* () {\n const logLevel = yield* MinimumLogLevel;\n\n if (LogLevel.isLessThan(\"Trace\", logLevel)) {\n return Layer.empty;\n }\n\n return tracerLayer;\n }),\n);\n\nconst tracerLayer = Effect.gen(function* () {\n const loggers = yield* CurrentLoggers;\n const tracer = yield* Tracer.Tracer;\n const fiber = Fiber.getCurrent()!;\n\n const log = (message: string, time: bigint) => {\n const date = new Date(Number(time / BigInt(1e6)));\n const options: Logger.Options<string> = {\n message,\n fiber,\n date,\n logLevel: \"Trace\",\n cause: Cause.empty,\n };\n\n loggers.forEach((logger) => {\n logger.log(options);\n });\n };\n\n return Tracer.make({\n span(options) {\n const span = tracer.span(options);\n log(`${options.name}: started`, options.startTime);\n const originalEnd = span.end;\n\n span.end = (endTime, cause) => {\n const duration = Duration.nanos(endTime - span.status.startTime);\n log(`${options.name}: completed. Took ${Duration.format(duration)}`, endTime);\n\n return originalEnd.call(span, endTime, cause);\n };\n\n return span;\n },\n });\n}).pipe(Layer.effect(Tracer.Tracer));\n","#!/usr/bin/env node\nimport { NodeHttpClient, NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { ConfigProvider, Effect, Layer, Logger } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\nimport PackageJson from \"../package.json\" with { type: \"json\" };\nimport { commandRoot } from \"./commands/root\";\nimport { CliOutput, cliLoggerLayer } from \"./shared/output\";\nimport { TracingLayer } from \"./shared/tracing\";\n\nconst Live = Layer.mergeAll(\n NodeServices.layer,\n NodeHttpClient.layerFetch,\n cliLoggerLayer,\n CliOutput.layer,\n Layer.succeed(Logger.LogToStderr, true),\n).pipe(Layer.provide([TracingLayer, ConfigProvider.layer(ConfigProvider.fromEnv())]));\n\nNodeRuntime.runMain(\n Command.run(commandRoot, { version: PackageJson.version }).pipe(Effect.provide(Live)),\n { disableErrorReporting: true },\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","names":["settings: UltimateSearchConfig.Methods[\"settings\"]","getGrokConfig: UltimateSearchConfig.Methods[\"getGrokConfig\"]","details: Array<string>","getTavilyConfig: UltimateSearchConfig.Methods[\"getTavilyConfig\"]","getFirecrawlConfig: UltimateSearchConfig.Methods[\"getFirecrawlConfig\"]","defaultGrokEnvironment: GrokEnvironment","defaultTavilyEnvironment: ProviderEnvironment","defaultFirecrawlEnvironment: FirecrawlEnvironment","configErrorDetails","mapDecodeError","mapDecodeError","scrape: FirecrawlProviderClient.Methods[\"scrape\"]","mapDecodeError","search: TavilyProviderClient.Methods[\"search\"]","map: TavilyProviderClient.Methods[\"map\"]","extract: TavilyProviderClient.Methods[\"extract\"]","normalizeContent","fetch: FirecrawlFetch.Methods[\"fetch\"]","extract: TavilyExtract.Methods[\"extract\"]","fetch: WebFetch.Methods[\"fetch\"]","configErrorDetails","map: TavilyMap.Methods[\"map\"]","createChatCompletion: GrokProviderClient.Methods[\"createChatCompletion\"]","search: GrokSearch.Methods[\"search\"]","payload: GrokChatCompletionRequest","search: TavilySearch.Methods[\"search\"]","search: DualSearch.Methods[\"search\"]","PackageJson.version","lines: Array<string>","options: Logger.Options<string>","PackageJson.version"],"sources":["../package.json","../src/shared/errors.ts","../src/shared/schema.ts","../src/config/settings.ts","../src/shared/provider-http-client.ts","../src/providers/firecrawl/schema.ts","../src/providers/firecrawl/client.ts","../src/providers/tavily/schema.ts","../src/providers/tavily/client.ts","../src/services/firecrawl-fetch.ts","../src/services/tavily-extract.ts","../src/services/web-fetch.ts","../src/services/web-fetch-schema.ts","../src/shared/render-error.ts","../src/shared/output.ts","../src/shared/command-output.ts","../src/commands/fetch.ts","../src/services/tavily-map.ts","../src/shared/cli-flags.ts","../src/commands/map.ts","../src/providers/grok/schema.ts","../src/providers/grok/client.ts","../src/services/grok-search.ts","../src/services/tavily-search.ts","../src/services/dual-search.ts","../src/services/read-only-mcp.ts","../src/commands/mcp/stdio.ts","../src/commands/mcp.ts","../src/commands/search/dual.ts","../src/commands/search/grok.ts","../src/commands/search/tavily.ts","../src/commands/search.ts","../src/commands/root.ts","../src/shared/tracing.ts","../src/cli.ts"],"sourcesContent":["{\n \"name\": \"@effect-x/ultimate-search\",\n \"version\": \"0.1.3\",\n \"description\": \"CLI-first web search toolkit and read-only MCP server for agents.\",\n \"keywords\": [\n \"agent\",\n \"cli\",\n \"effect\",\n \"grok\",\n \"mcp\",\n \"search\",\n \"tavily\"\n ],\n \"homepage\": \"https://github.com/effect-anything/ultimate-search#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/effect-anything/ultimate-search/issues\"\n },\n \"license\": \"MIT\",\n \"contributors\": [\n \"xesrevinu\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/effect-anything/ultimate-search.git\"\n },\n \"bin\": {\n \"ultimate-search\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"src\",\n \"README.md\",\n \"LICENSE\",\n \"SKILL.md\"\n ],\n \"type\": \"module\",\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": true\n },\n \"scripts\": {\n \"prepare\": \"lefthook install\",\n \"build\": \"tsdown\",\n \"dev\": \"tsdown --watch\",\n \"lint\": \"oxlint .\",\n \"format\": \"oxfmt .\",\n \"format:check\": \"oxfmt --check .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"check\": \"bun run lint && bun run format:check && bun run typecheck && bun run test && bun run build\",\n \"changeset\": \"changeset\",\n \"version-packages\": \"changeset version\",\n \"release\": \"changeset publish --provenance\",\n \"prepack\": \"bun run build\"\n },\n \"dependencies\": {\n \"@effect/platform-node\": \"4.0.0-beta.31\",\n \"effect\": \"4.0.0-beta.31\"\n },\n \"devDependencies\": {\n \"@changesets/cli\": \"^2.29.7\",\n \"@effect/vitest\": \"4.0.0-beta.31\",\n \"@types/bun\": \"^1.3.10\",\n \"lefthook\": \"^1.11.13\",\n \"oxfmt\": \"^0.38.0\",\n \"oxlint\": \"^1.53.0\",\n \"tsdown\": \"^0.15.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n },\n \"engines\": {\n \"bun\": \">=1.3.10\",\n \"node\": \">=24\"\n }\n}\n","import { Schema } from \"effect\";\n\nexport const SearchProvider = Schema.Literals([\"shared\", \"grok\", \"tavily\", \"firecrawl\"]);\n\nexport class ConfigValidationError extends Schema.TaggedErrorClass<ConfigValidationError>()(\n \"ConfigValidationError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n details: Schema.optional(Schema.Array(Schema.String)),\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport class ProviderRequestError extends Schema.TaggedErrorClass<ProviderRequestError>()(\n \"ProviderRequestError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n },\n) {}\n\nexport class ProviderResponseError extends Schema.TaggedErrorClass<ProviderResponseError>()(\n \"ProviderResponseError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n status: Schema.Number,\n body: Schema.String,\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport class ProviderContentError extends Schema.TaggedErrorClass<ProviderContentError>()(\n \"ProviderContentError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n },\n) {}\n\nexport class ProviderDecodeError extends Schema.TaggedErrorClass<ProviderDecodeError>()(\n \"ProviderDecodeError\",\n {\n provider: SearchProvider,\n message: Schema.String,\n cause: Schema.optional(Schema.Unknown),\n },\n) {}\n\nexport type UltimateSearchError =\n | ConfigValidationError\n | ProviderContentError\n | ProviderRequestError\n | ProviderResponseError\n | ProviderDecodeError;\n","import { Effect, Option, Schema, SchemaIssue, SchemaTransformation } from \"effect\";\n\nconst stripTrailingSlashes = (value: string) => value.replace(/\\/+$/u, \"\");\n\nexport const trimmedNonEmptyStringSchema = (message: string) =>\n Schema.Trim.pipe(Schema.decodeTo(Schema.NonEmptyString), Schema.annotate({ message }));\n\nexport const optionalTrimmedNonEmptyStringFromStringSchema = Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.Option(Schema.NonEmptyString),\n SchemaTransformation.transform({\n decode: (value) => (value.length === 0 ? Option.none<string>() : Option.some(value)),\n encode: (value) => Option.getOrElse(value, () => \"\"),\n }),\n ),\n);\n\nexport const absoluteUrlStringSchema = (message: string) =>\n Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.String,\n SchemaTransformation.transformOrFail({\n decode: (value) =>\n Effect.try({\n try: () => stripTrailingSlashes(new URL(value).toString()),\n catch: () => new SchemaIssue.InvalidValue(Option.some(value), { message }),\n }),\n encode: (value) => Effect.succeed(value),\n }),\n ),\n );\n\nexport const optionalAbsoluteUrlStringFromStringSchema = (message: string) =>\n Schema.Trim.pipe(\n Schema.decodeTo(\n Schema.Option(absoluteUrlStringSchema(message)),\n SchemaTransformation.transform({\n decode: (value) => (value.length === 0 ? Option.none<string>() : Option.some(value)),\n encode: (value) => Option.getOrElse(value, () => \"\"),\n }),\n ),\n );\n","import { Config, Effect, Layer, Option, ServiceMap } from \"effect\";\nimport { ConfigValidationError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport {\n optionalAbsoluteUrlStringFromStringSchema,\n optionalTrimmedNonEmptyStringFromStringSchema,\n} from \"../shared/schema\";\n\nexport interface ProviderEnvironment {\n readonly apiUrl: Option.Option<string>;\n readonly apiKey: Option.Option<string>;\n}\n\nexport interface GrokEnvironment extends ProviderEnvironment {\n readonly model: string;\n}\n\nexport interface FirecrawlEnvironment {\n readonly apiUrl: string;\n readonly apiKey: Option.Option<string>;\n}\n\nexport interface UltimateSearchSettings {\n readonly grok: GrokEnvironment;\n readonly tavily: ProviderEnvironment;\n readonly firecrawl: FirecrawlEnvironment;\n}\n\nexport interface GrokProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n readonly model: string;\n}\n\nexport interface TavilyProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n}\n\nexport interface FirecrawlProviderConfig {\n readonly apiUrl: string;\n readonly apiKey: string;\n}\n\nexport class UltimateSearchConfig extends ServiceMap.Service<\n UltimateSearchConfig,\n {\n readonly settings: UltimateSearchSettings;\n readonly getGrokConfig: () => Effect.Effect<GrokProviderConfig, UltimateSearchError>;\n readonly getTavilyConfig: () => Effect.Effect<TavilyProviderConfig, UltimateSearchError>;\n readonly getFirecrawlConfig: () => Effect.Effect<FirecrawlProviderConfig, UltimateSearchError>;\n }\n>()(\"UltimateSearchConfig\") {\n static readonly layer = Layer.effect(\n UltimateSearchConfig,\n Effect.gen(function* () {\n const settings: UltimateSearchConfig.Methods[\"settings\"] = yield* loadSettings.pipe(\n Effect.withSpan(\"UltimateSearchConfig.settings\"),\n );\n\n const getGrokConfig: UltimateSearchConfig.Methods[\"getGrokConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getGrokConfig\",\n )(function* (): Effect.fn.Return<GrokProviderConfig, ConfigValidationError, never> {\n const grok = yield* strictConfigEffect(grokEnvironmentConfig);\n const details: Array<string> = [];\n\n if (Option.isNone(grok.apiUrl)) {\n details.push(\"Set GROK_API_URL to the grok base URL.\");\n }\n\n if (Option.isNone(grok.apiKey)) {\n details.push(\"Set GROK_API_KEY to the grok bearer token.\");\n }\n\n if (details.length > 0) {\n return yield* new ConfigValidationError({\n provider: \"grok\",\n message: \"Missing required Grok configuration.\",\n details,\n });\n }\n\n return {\n apiUrl: Option.getOrElse(grok.apiUrl, () => \"\"),\n apiKey: Option.getOrElse(grok.apiKey, () => \"\"),\n model: grok.model,\n } satisfies GrokProviderConfig;\n });\n\n const getTavilyConfig: UltimateSearchConfig.Methods[\"getTavilyConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getTavilyConfig\",\n )(function* (): Effect.fn.Return<TavilyProviderConfig, ConfigValidationError, never> {\n const tavily = yield* strictConfigEffect(tavilyEnvironmentConfig);\n const details: Array<string> = [];\n\n if (Option.isNone(tavily.apiUrl)) {\n details.push(\"Set TAVILY_API_URL to the Tavily or Tavily proxy base URL.\");\n }\n\n if (Option.isNone(tavily.apiKey)) {\n details.push(\"Set TAVILY_API_KEY to the Tavily or Tavily proxy bearer token.\");\n }\n\n if (details.length > 0) {\n return yield* new ConfigValidationError({\n provider: \"tavily\",\n message: \"Missing required Tavily configuration.\",\n details,\n });\n }\n\n return {\n apiUrl: Option.getOrElse(tavily.apiUrl, () => \"\"),\n apiKey: Option.getOrElse(tavily.apiKey, () => \"\"),\n } satisfies TavilyProviderConfig;\n });\n\n const getFirecrawlConfig: UltimateSearchConfig.Methods[\"getFirecrawlConfig\"] = Effect.fn(\n \"UltimateSearchConfig.getFirecrawlConfig\",\n )(function* (): Effect.fn.Return<FirecrawlProviderConfig, ConfigValidationError, never> {\n const firecrawl = yield* strictConfigEffect(firecrawlEnvironmentConfig);\n\n if (Option.isNone(firecrawl.apiKey)) {\n return yield* new ConfigValidationError({\n provider: \"firecrawl\",\n message: \"Missing required FireCrawl configuration.\",\n details: [\"Set FIRECRAWL_API_KEY to the FireCrawl bearer token.\"],\n });\n }\n\n return {\n apiUrl: firecrawl.apiUrl,\n apiKey: Option.getOrElse(firecrawl.apiKey, () => \"\"),\n } satisfies FirecrawlProviderConfig;\n });\n\n return UltimateSearchConfig.of({\n settings,\n getGrokConfig,\n getTavilyConfig,\n getFirecrawlConfig,\n });\n }),\n );\n}\n\nexport declare namespace UltimateSearchConfig {\n export type Methods = ServiceMap.Service.Shape<typeof UltimateSearchConfig>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n\nconst optionalUrlConfig = (name: string) =>\n Config.schema(\n optionalAbsoluteUrlStringFromStringSchema(`${name} must be an absolute URL.`),\n name,\n ).pipe(Config.withDefault(Option.none<string>()));\n\nconst optionalSecretConfig = (name: string) =>\n Config.schema(optionalTrimmedNonEmptyStringFromStringSchema, name).pipe(\n Config.withDefault(Option.none<string>()),\n );\n\nconst requiredTextConfig = (name: string, fallback: string) =>\n Config.schema(optionalTrimmedNonEmptyStringFromStringSchema, name).pipe(\n Config.withDefault(Option.none<string>()),\n Config.map(Option.getOrElse(() => fallback)),\n );\n\nconst requiredUrlConfig = (name: string, fallback: string) =>\n Config.schema(\n optionalAbsoluteUrlStringFromStringSchema(`${name} must be an absolute URL.`),\n name,\n ).pipe(Config.withDefault(Option.none<string>()), Config.map(Option.getOrElse(() => fallback)));\n\nconst grokEnvironmentConfig = Config.all({\n apiUrl: optionalUrlConfig(\"GROK_API_URL\"),\n apiKey: optionalSecretConfig(\"GROK_API_KEY\"),\n model: requiredTextConfig(\"GROK_MODEL\", \"grok-4.1-fast\"),\n}) satisfies Config.Config<GrokEnvironment>;\n\nconst tavilyEnvironmentConfig = Config.all({\n apiUrl: optionalUrlConfig(\"TAVILY_API_URL\"),\n apiKey: optionalSecretConfig(\"TAVILY_API_KEY\"),\n}) satisfies Config.Config<ProviderEnvironment>;\n\nconst firecrawlEnvironmentConfig = Config.all({\n apiUrl: requiredUrlConfig(\"FIRECRAWL_API_URL\", \"https://api.firecrawl.dev/v2\"),\n apiKey: optionalSecretConfig(\"FIRECRAWL_API_KEY\"),\n}) satisfies Config.Config<FirecrawlEnvironment>;\n\nconst defaultGrokEnvironment: GrokEnvironment = {\n apiUrl: Option.none(),\n apiKey: Option.none(),\n model: \"grok-4.1-fast\",\n};\n\nconst defaultTavilyEnvironment: ProviderEnvironment = {\n apiUrl: Option.none(),\n apiKey: Option.none(),\n};\n\nconst defaultFirecrawlEnvironment: FirecrawlEnvironment = {\n apiUrl: \"https://api.firecrawl.dev/v2\",\n apiKey: Option.none(),\n};\n\nconst mapConfigLoadError = (error: unknown) =>\n new ConfigValidationError({\n provider: \"shared\",\n message: \"Failed to load CLI configuration.\",\n details: configErrorDetails(error),\n cause: error,\n });\n\nconst strictConfigEffect = <A>(config: Config.Config<A>) =>\n config\n .asEffect()\n .pipe(Effect.mapError(mapConfigLoadError), Effect.withSpan(\"UltimateSearchConfig.settings\"));\n\nconst bestEffortConfigEffect = <A>(config: Config.Config<A>, fallback: A) =>\n strictConfigEffect(config).pipe(Effect.catch(() => Effect.succeed(fallback)));\n\nconst loadSettings = Effect.all({\n grok: bestEffortConfigEffect(grokEnvironmentConfig, defaultGrokEnvironment),\n tavily: bestEffortConfigEffect(tavilyEnvironmentConfig, defaultTavilyEnvironment),\n firecrawl: bestEffortConfigEffect(firecrawlEnvironmentConfig, defaultFirecrawlEnvironment),\n}) satisfies Effect.Effect<UltimateSearchSettings, never, never>;\n\nconst configErrorDetails = (error: unknown): Array<string> => {\n if (error instanceof Config.ConfigError && error.message.length > 0) {\n return [error.message];\n }\n\n if (error instanceof Error && error.message.length > 0) {\n return [error.message];\n }\n\n if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n error.message.length > 0\n ) {\n return [error.message];\n }\n\n if (typeof error === \"string\" && error.length > 0) {\n return [error];\n }\n\n if (error != null) {\n const text = String(error);\n\n if (text.length > 0 && text !== \"[object Object]\") {\n return [text];\n }\n }\n\n return [];\n};\n","import { Effect } from \"effect\";\nimport { HttpClient, HttpClientError, type HttpClientResponse } from \"effect/unstable/http\";\nimport { ProviderRequestError, ProviderResponseError } from \"./errors\";\n\nexport type ProviderHttpClientName = \"shared\" | \"grok\" | \"tavily\" | \"firecrawl\";\n\nexport const mapProviderRequestError = (\n provider: ProviderHttpClientName,\n error: unknown,\n fallback: string,\n) =>\n new ProviderRequestError({\n provider,\n message: error instanceof Error && error.message.length > 0 ? error.message : fallback,\n });\n\nexport const makeProviderHttpClient = (\n client: HttpClient.HttpClient,\n): HttpClient.HttpClient.With<HttpClientError.HttpClientError, never> =>\n client.pipe(\n HttpClient.filterStatusOk,\n HttpClient.retryTransient({\n retryOn: \"errors-and-responses\",\n times: 2,\n }),\n ) as HttpClient.HttpClient.With<HttpClientError.HttpClientError, never>;\n\nexport const catchProviderHttpError =\n (\n provider: ProviderHttpClientName,\n requestErrorMessage: string,\n responseErrorMessage: (status: number) => string,\n ) =>\n <A>(\n effect: Effect.Effect<A, HttpClientError.HttpClientError, never>,\n ): Effect.Effect<A, ProviderRequestError | ProviderResponseError, never> =>\n effect.pipe(\n Effect.catchTag(\n \"HttpClientError\",\n (error): Effect.Effect<never, ProviderRequestError | ProviderResponseError, never> => {\n const response = error.response;\n\n if (response === undefined) {\n return Effect.fail(mapProviderRequestError(provider, error, requestErrorMessage));\n }\n\n return response.text.pipe(\n Effect.catch(() => Effect.succeed(\"\")),\n Effect.flatMap((body) =>\n Effect.fail(\n new ProviderResponseError({\n provider,\n message: responseErrorMessage(response.status),\n status: response.status,\n body,\n cause: error,\n }),\n ),\n ),\n );\n },\n ),\n );\n\nexport const decodeJsonResponse = <A, E1, E2>(\n response: HttpClientResponse.HttpClientResponse,\n decode: (value: unknown) => Effect.Effect<A, E1, never>,\n mapDecodeError: (error: unknown) => E2,\n): Effect.Effect<A, E2, never> =>\n response.json.pipe(\n Effect.mapError(mapDecodeError),\n Effect.flatMap((json) => decode(json).pipe(Effect.mapError(mapDecodeError))),\n );\n","import { Schema } from \"effect\";\n\nexport const FirecrawlFormatSchema = Schema.Literals([\"markdown\"] as const);\n\nexport type FirecrawlFormat = typeof FirecrawlFormatSchema.Type;\n\nexport const FirecrawlScrapeRequestSchema = Schema.Struct({\n url: Schema.String,\n formats: Schema.NonEmptyArray(FirecrawlFormatSchema),\n});\n\nexport type FirecrawlScrapeRequest = typeof FirecrawlScrapeRequestSchema.Type;\n\nexport const FirecrawlScrapeResponseSchema = Schema.Struct({\n success: Schema.optional(Schema.Boolean),\n data: Schema.optional(\n Schema.NullOr(\n Schema.Struct({\n markdown: Schema.optional(Schema.NullOr(Schema.String)),\n content: Schema.optional(Schema.NullOr(Schema.String)),\n metadata: Schema.optional(\n Schema.Struct({\n title: Schema.optional(Schema.NullOr(Schema.String)),\n }),\n ),\n }),\n ),\n ),\n});\n\nexport type FirecrawlScrapeResponse = typeof FirecrawlScrapeResponseSchema.Type;\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type FirecrawlScrapeRequest,\n FirecrawlScrapeResponseSchema,\n type FirecrawlScrapeResponse,\n} from \"./schema\";\n\nconst decodeFirecrawlScrapeResponse = Schema.decodeUnknownEffect(FirecrawlScrapeResponseSchema);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"firecrawl\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class FirecrawlProviderClient extends ServiceMap.Service<\n FirecrawlProviderClient,\n {\n readonly scrape: (\n request: FirecrawlScrapeRequest,\n ) => Effect.Effect<FirecrawlScrapeResponse, UltimateSearchError, never>;\n }\n>()(\"FirecrawlProviderClient\") {\n static readonly layer = Layer.effect(\n FirecrawlProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const scrape: FirecrawlProviderClient.Methods[\"scrape\"] = Effect.fn(\n \"FirecrawlProviderClient.scrape\",\n )(function* (payload): FirecrawlProviderClient.Returns<\"scrape\"> {\n const firecrawl = yield* config.getFirecrawlConfig();\n const request = HttpClientRequest.post(`${firecrawl.apiUrl}/scrape`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(firecrawl.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"firecrawl\",\n \"Failed to send the FireCrawl request.\",\n (status: number) => `FireCrawl returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeFirecrawlScrapeResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the FireCrawl response payload.\"),\n );\n });\n\n return FirecrawlProviderClient.of({\n scrape,\n });\n }),\n );\n}\n\nexport declare namespace FirecrawlProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof FirecrawlProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Option, Schema } from \"effect\";\nimport { absoluteUrlStringSchema, trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nexport const TavilySearchDepthSchema = Schema.Literals([\"basic\", \"advanced\"] as const);\n\nexport type TavilySearchDepth = typeof TavilySearchDepthSchema.Type;\n\nexport const TavilyExtractDepthSchema = TavilySearchDepthSchema;\n\nexport type TavilyExtractDepth = typeof TavilyExtractDepthSchema.Type;\n\nexport const TavilySearchTopicSchema = Schema.Literals([\"general\", \"news\", \"finance\"] as const);\n\nexport type TavilySearchTopic = typeof TavilySearchTopicSchema.Type;\n\nexport const FetchContentFormatSchema = Schema.Literals([\"markdown\", \"text\"] as const);\n\nexport type FetchContentFormat = typeof FetchContentFormatSchema.Type;\n\nexport const TavilyTimeRangeSchema = Schema.Literals([\"day\", \"week\", \"month\", \"year\"] as const);\n\nexport type TavilyTimeRange = typeof TavilyTimeRangeSchema.Type;\n\nconst maxResultsSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"max-results must be an integer between 1 and 20\",\n }),\n);\n\nexport const TavilyMapDepthSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 5 })),\n Schema.annotate({\n message: \"depth must be an integer between 1 and 5\",\n }),\n);\n\nexport type TavilyMapDepth = typeof TavilyMapDepthSchema.Type;\n\nexport const TavilyMapBreadthSchema = Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 500 })),\n Schema.annotate({\n message: \"breadth must be an integer between 1 and 500\",\n }),\n);\n\nexport type TavilyMapBreadth = typeof TavilyMapBreadthSchema.Type;\n\nexport const TavilyMapLimitSchema = Schema.Int.pipe(\n Schema.check(Schema.isGreaterThanOrEqualTo(1)),\n Schema.annotate({\n message: \"limit must be an integer greater than or equal to 1\",\n }),\n);\n\nexport type TavilyMapLimit = typeof TavilyMapLimitSchema.Type;\n\nconst responseTimeSchema = Schema.Union([Schema.Number, Schema.NumberFromString]);\n\nexport const TavilySearchRequestSchema = Schema.Struct({\n query: Schema.NonEmptyString,\n search_depth: Schema.optional(TavilySearchDepthSchema),\n topic: Schema.optional(TavilySearchTopicSchema),\n time_range: Schema.optional(TavilyTimeRangeSchema),\n max_results: Schema.optional(maxResultsSchema),\n include_answer: Schema.optional(Schema.Boolean),\n});\n\nexport type TavilySearchRequest = typeof TavilySearchRequestSchema.Type;\n\nexport const TavilySearchResultItemSchema = Schema.Struct({\n title: Schema.String,\n url: Schema.String,\n content: Schema.String,\n score: Schema.Number,\n raw_content: Schema.optional(Schema.NullOr(Schema.String)),\n});\n\nexport type TavilySearchResultItem = typeof TavilySearchResultItemSchema.Type;\n\nexport const TavilySearchResponseSchema = Schema.Struct({\n query: Schema.String,\n answer: Schema.optional(Schema.NullOr(Schema.String)),\n images: Schema.optional(Schema.Array(Schema.String)),\n response_time: Schema.optional(responseTimeSchema),\n results: Schema.Array(TavilySearchResultItemSchema),\n});\n\nexport type TavilySearchResponse = typeof TavilySearchResponseSchema.Type;\n\nexport const TavilyExtractRequestSchema = Schema.Struct({\n urls: Schema.NonEmptyArray(Schema.String),\n extract_depth: Schema.optional(TavilyExtractDepthSchema),\n format: Schema.optional(FetchContentFormatSchema),\n});\n\nexport type TavilyExtractRequest = typeof TavilyExtractRequestSchema.Type;\n\nexport const TavilyExtractResultItemSchema = Schema.Struct({\n url: Schema.String,\n title: Schema.optional(Schema.NullOr(Schema.String)),\n raw_content: Schema.optional(Schema.NullOr(Schema.String)),\n});\n\nexport type TavilyExtractResultItem = typeof TavilyExtractResultItemSchema.Type;\n\nexport const TavilyExtractResponseSchema = Schema.Struct({\n results: Schema.Array(TavilyExtractResultItemSchema),\n});\n\nexport type TavilyExtractResponse = typeof TavilyExtractResponseSchema.Type;\n\nexport class TavilySearchInput extends Schema.Class<TavilySearchInput>(\"TavilySearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n searchDepth: Schema.Option(TavilySearchDepthSchema),\n topic: Schema.Option(TavilySearchTopicSchema),\n timeRange: Schema.Option(TavilyTimeRangeSchema),\n maxResults: Schema.Option(maxResultsSchema),\n includeAnswer: Schema.Boolean,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(TavilySearchInput);\n}\n\nexport const buildTavilySearchRequest = (input: TavilySearchInput): TavilySearchRequest => ({\n query: input.query,\n ...(Option.isSome(input.searchDepth) && {\n search_depth: input.searchDepth.value,\n }),\n ...(Option.isSome(input.topic) && {\n topic: input.topic.value,\n }),\n ...(Option.isSome(input.timeRange) && {\n time_range: input.timeRange.value,\n }),\n ...(Option.isSome(input.maxResults) && {\n max_results: input.maxResults.value,\n }),\n ...(input.includeAnswer ? { include_answer: true } : {}),\n});\n\nexport const TavilyMapRequestSchema = Schema.Struct({\n url: Schema.String,\n max_depth: Schema.optional(TavilyMapDepthSchema),\n max_breadth: Schema.optional(TavilyMapBreadthSchema),\n limit: Schema.optional(TavilyMapLimitSchema),\n instructions: Schema.optional(Schema.NonEmptyString),\n});\n\nexport type TavilyMapRequest = typeof TavilyMapRequestSchema.Type;\n\nexport const TavilyMapUsageSchema = Schema.Struct({\n credits_used: Schema.optional(Schema.Number),\n});\n\nexport type TavilyMapUsage = typeof TavilyMapUsageSchema.Type;\n\nexport const TavilyMapResponseSchema = Schema.Struct({\n base_url: Schema.String,\n results: Schema.Array(Schema.String),\n response_time: Schema.optional(responseTimeSchema),\n request_id: Schema.optional(Schema.String),\n usage: Schema.optional(TavilyMapUsageSchema),\n});\n\nexport type TavilyMapResponse = typeof TavilyMapResponseSchema.Type;\n\nexport class TavilyMapInput extends Schema.Class<TavilyMapInput>(\"TavilyMapInput\")({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.Option(TavilyMapDepthSchema),\n breadth: Schema.Option(TavilyMapBreadthSchema),\n limit: Schema.Option(TavilyMapLimitSchema),\n instructions: Schema.Option(\n trimmedNonEmptyStringSchema(\"instructions must be a non-empty string\"),\n ),\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(TavilyMapInput);\n}\n\nexport const buildTavilyMapRequest = (input: TavilyMapInput): TavilyMapRequest => ({\n url: input.url,\n ...(Option.isSome(input.depth) && {\n max_depth: input.depth.value,\n }),\n ...(Option.isSome(input.breadth) && {\n max_breadth: input.breadth.value,\n }),\n ...(Option.isSome(input.limit) && {\n limit: input.limit.value,\n }),\n ...(Option.isSome(input.instructions) && {\n instructions: input.instructions.value,\n }),\n});\n\nexport const buildTavilyExtractRequest = (input: {\n readonly urls: readonly [string, ...Array<string>];\n readonly depth: TavilyExtractDepth;\n readonly format: FetchContentFormat;\n}): TavilyExtractRequest => {\n const [firstUrl, ...remainingUrls] = input.urls;\n\n return {\n urls: [firstUrl, ...remainingUrls],\n extract_depth: input.depth,\n format: input.format,\n };\n};\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type TavilyMapRequest,\n TavilyMapResponseSchema,\n type TavilyMapResponse,\n type TavilyExtractRequest,\n TavilyExtractResponseSchema,\n type TavilyExtractResponse,\n type TavilySearchRequest,\n TavilySearchResponseSchema,\n type TavilySearchResponse,\n} from \"./schema\";\n\nconst decodeTavilySearchResponse = Schema.decodeUnknownEffect(TavilySearchResponseSchema);\n\nconst decodeTavilyMapResponse = Schema.decodeUnknownEffect(TavilyMapResponseSchema);\n\nconst decodeTavilyExtractResponse = Schema.decodeUnknownEffect(TavilyExtractResponseSchema);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"tavily\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class TavilyProviderClient extends ServiceMap.Service<\n TavilyProviderClient,\n {\n readonly search: (\n request: TavilySearchRequest,\n ) => Effect.Effect<TavilySearchResponse, UltimateSearchError, never>;\n readonly map: (\n request: TavilyMapRequest,\n ) => Effect.Effect<TavilyMapResponse, UltimateSearchError, never>;\n readonly extract: (\n request: TavilyExtractRequest,\n ) => Effect.Effect<TavilyExtractResponse, UltimateSearchError, never>;\n }\n>()(\"TavilyProviderClient\") {\n static readonly layer = Layer.effect(\n TavilyProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const search: TavilyProviderClient.Methods[\"search\"] = Effect.fn(\n \"TavilyProviderClient.search\",\n )(function* (payload): TavilyProviderClient.Returns<\"search\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/search`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily request.\",\n (status: number) => `Tavily returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilySearchResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily response payload.\"),\n );\n });\n\n const map: TavilyProviderClient.Methods[\"map\"] = Effect.fn(\"TavilyProviderClient.map\")(\n function* (payload): TavilyProviderClient.Returns<\"map\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/map`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily map request.\",\n (status: number) => `Tavily map returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilyMapResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily map response payload.\"),\n );\n },\n );\n\n const extract: TavilyProviderClient.Methods[\"extract\"] = Effect.fn(\n \"TavilyProviderClient.extract\",\n )(function* (payload): TavilyProviderClient.Returns<\"extract\"> {\n const tavily = yield* config.getTavilyConfig();\n const request = HttpClientRequest.post(`${tavily.apiUrl}/extract`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(tavily.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"tavily\",\n \"Failed to send the Tavily extract request.\",\n (status: number) => `Tavily returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeTavilyExtractResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Tavily extract payload.\"),\n );\n });\n\n return TavilyProviderClient.of({\n map,\n search,\n extract,\n });\n }),\n );\n}\n\nexport declare namespace TavilyProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, ServiceMap } from \"effect\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport type { FirecrawlScrapeResponse } from \"../providers/firecrawl/schema\";\nimport { ProviderContentError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { FetchedPage, WebFetchInput } from \"./web-fetch-schema\";\n\nconst normalizeContent = (response: FirecrawlScrapeResponse, format: WebFetchInput[\"format\"]) => {\n const data = response.data;\n\n if (data == null) {\n return null;\n }\n\n const preferred = format === \"text\" ? data.content : data.markdown;\n const fallback = format === \"text\" ? data.markdown : data.content;\n const content = (preferred ?? fallback ?? \"\").trim();\n\n return content.length > 0 ? content : null;\n};\n\nexport class FirecrawlFetch extends ServiceMap.Service<\n FirecrawlFetch,\n {\n readonly fetch: (\n input: WebFetchInput,\n ) => Effect.Effect<ReadonlyArray<FetchedPage>, UltimateSearchError, never>;\n }\n>()(\"FirecrawlFetch\") {\n static readonly layer = Layer.effect(\n FirecrawlFetch,\n Effect.gen(function* () {\n const provider = yield* FirecrawlProviderClient;\n\n const fetch: FirecrawlFetch.Methods[\"fetch\"] = Effect.fn(\"FirecrawlFetch.fetch\")(\n function* (input): FirecrawlFetch.Returns<\"fetch\"> {\n const attempts = yield* Effect.forEach(\n input.urls,\n (url) =>\n Effect.result(\n provider.scrape({\n url,\n formats: [\"markdown\"],\n }),\n ).pipe(\n Effect.map((result) => ({\n url,\n result,\n })),\n ),\n { concurrency: \"unbounded\" },\n );\n\n const successes = attempts.flatMap(({ url, result }) => {\n if (Result.isFailure(result)) {\n return [];\n }\n\n const rawContent = normalizeContent(result.success, input.format);\n\n if (rawContent === null) {\n return [];\n }\n\n return [\n {\n url,\n title: result.success.data?.metadata?.title,\n raw_content: rawContent,\n } satisfies FetchedPage,\n ];\n });\n\n if (successes.length > 0) {\n return successes;\n }\n\n const firstFailure = attempts.find(({ result }) => Result.isFailure(result));\n\n if (firstFailure != null && Result.isFailure(firstFailure.result)) {\n return yield* firstFailure.result.failure;\n }\n\n return yield* new ProviderContentError({\n provider: \"firecrawl\",\n message: \"FireCrawl returned no extractable content.\",\n });\n },\n );\n\n return FirecrawlFetch.of({\n fetch,\n });\n }),\n );\n}\n\nexport declare namespace FirecrawlFetch {\n export type Methods = ServiceMap.Service.Shape<typeof FirecrawlFetch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { buildTavilyExtractRequest } from \"../providers/tavily/schema\";\nimport { ProviderContentError, type UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { FetchedPage, WebFetchInput } from \"./web-fetch-schema\";\n\nconst normalizeContent = (content: string | null | undefined) => {\n const text = content?.trim() ?? \"\";\n return text.length > 0 ? text : null;\n};\n\nexport class TavilyExtract extends ServiceMap.Service<\n TavilyExtract,\n {\n readonly extract: (\n input: WebFetchInput,\n ) => Effect.Effect<ReadonlyArray<FetchedPage>, UltimateSearchError, never>;\n }\n>()(\"TavilyExtract\") {\n static readonly layer = Layer.effect(\n TavilyExtract,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const extract: TavilyExtract.Methods[\"extract\"] = Effect.fn(\"TavilyExtract.extract\")(\n function* (input): TavilyExtract.Returns<\"extract\"> {\n const response = yield* provider.extract(buildTavilyExtractRequest(input));\n const results = response.results.flatMap((item) => {\n const rawContent = normalizeContent(item.raw_content);\n\n if (rawContent === null) {\n return [];\n }\n\n return [\n {\n url: item.url,\n title: item.title,\n raw_content: rawContent,\n } satisfies FetchedPage,\n ];\n });\n\n if (results.length === 0) {\n return yield* new ProviderContentError({\n provider: \"tavily\",\n message: \"Tavily returned no extractable content.\",\n });\n }\n\n return results;\n },\n );\n\n return TavilyExtract.of({\n extract,\n });\n }),\n );\n}\n\nexport declare namespace TavilyExtract {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyExtract>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, ServiceMap } from \"effect\";\nimport {\n ConfigValidationError,\n ProviderContentError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n type UltimateSearchError,\n} from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport { FirecrawlFetch } from \"./firecrawl-fetch\";\nimport type { FallbackReason, WebFetchInput, WebFetchResult } from \"./web-fetch-schema\";\nimport { TavilyExtract } from \"./tavily-extract\";\n\nconst summarizeFallbackReason = (error: UltimateSearchError): FallbackReason => {\n if (\n error instanceof ConfigValidationError ||\n error instanceof ProviderRequestError ||\n error instanceof ProviderResponseError ||\n error instanceof ProviderDecodeError ||\n error instanceof ProviderContentError\n ) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n return {\n type: \"UnknownError\",\n provider: \"shared\",\n message: String(error),\n };\n};\n\nconst resolveDoubleFailure = (\n primary: UltimateSearchError,\n fallback: UltimateSearchError,\n): UltimateSearchError =>\n fallback instanceof ConfigValidationError && !(primary instanceof ConfigValidationError)\n ? primary\n : fallback;\n\nexport class WebFetch extends ServiceMap.Service<\n WebFetch,\n {\n readonly fetch: (\n input: WebFetchInput,\n ) => Effect.Effect<WebFetchResult, UltimateSearchError, never>;\n }\n>()(\"WebFetch\") {\n static readonly layer = Layer.effect(\n WebFetch,\n Effect.gen(function* () {\n const tavilyExtract = yield* TavilyExtract;\n const firecrawlFetch = yield* FirecrawlFetch;\n\n const fetch: WebFetch.Methods[\"fetch\"] = Effect.fn(\"WebFetch.fetch\")(\n function* (input): WebFetch.Returns<\"fetch\"> {\n const tavilyAttempt = yield* Effect.result(tavilyExtract.extract(input));\n\n if (Result.isSuccess(tavilyAttempt)) {\n return {\n backend: \"tavily\",\n format: input.format,\n results: tavilyAttempt.success,\n } satisfies WebFetchResult;\n }\n\n const firecrawlAttempt = yield* Effect.result(firecrawlFetch.fetch(input));\n\n if (Result.isSuccess(firecrawlAttempt)) {\n return {\n backend: \"firecrawl\",\n format: input.format,\n results: firecrawlAttempt.success,\n fallback: {\n from: \"tavily\",\n to: \"firecrawl\",\n reason: summarizeFallbackReason(tavilyAttempt.failure),\n },\n } satisfies WebFetchResult;\n }\n\n return yield* resolveDoubleFailure(tavilyAttempt.failure, firecrawlAttempt.failure);\n },\n );\n\n return WebFetch.of({\n fetch,\n });\n }),\n );\n}\n\nexport declare namespace WebFetch {\n export type Methods = ServiceMap.Service.Shape<typeof WebFetch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Schema } from \"effect\";\nimport {\n FetchContentFormatSchema,\n TavilyExtractDepthSchema,\n type FetchContentFormat,\n} from \"../providers/tavily/schema\";\nimport { SearchProvider } from \"../shared/errors\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nexport const FetchBackendSchema = Schema.Literals([\"tavily\", \"firecrawl\"] as const);\n\nexport type FetchBackend = typeof FetchBackendSchema.Type;\n\nexport class WebFetchInput extends Schema.Class<WebFetchInput>(\"WebFetchInput\")({\n urls: Schema.NonEmptyArray(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n depth: TavilyExtractDepthSchema,\n format: FetchContentFormatSchema,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(WebFetchInput);\n}\n\nexport interface FetchedPage {\n readonly url: string;\n readonly title?: string | null | undefined;\n readonly raw_content: string;\n}\n\nexport const FetchedPageSchema = Schema.Struct({\n url: Schema.String,\n title: Schema.optional(Schema.NullOr(Schema.String)),\n raw_content: Schema.String,\n});\n\nexport interface FallbackReason {\n readonly type: string;\n readonly provider: typeof SearchProvider.Type;\n readonly message: string;\n}\n\nexport const FallbackReasonSchema = Schema.Struct({\n type: Schema.String,\n provider: SearchProvider,\n message: Schema.String,\n});\n\nexport interface FetchFallback {\n readonly from: \"tavily\";\n readonly to: \"firecrawl\";\n readonly reason: FallbackReason;\n}\n\nexport const FetchFallbackSchema = Schema.Struct({\n from: Schema.Literal(\"tavily\"),\n to: Schema.Literal(\"firecrawl\"),\n reason: FallbackReasonSchema,\n});\n\nexport interface WebFetchResult {\n readonly backend: FetchBackend;\n readonly format: FetchContentFormat;\n readonly results: ReadonlyArray<FetchedPage>;\n readonly fallback?: FetchFallback | undefined;\n}\n\nexport const WebFetchResultSchema = Schema.Struct({\n backend: FetchBackendSchema,\n format: FetchContentFormatSchema,\n results: Schema.NonEmptyArray(FetchedPageSchema),\n fallback: Schema.optional(FetchFallbackSchema),\n});\n\nexport type WebFetchFormat = FetchContentFormat;\n","import { Config } from \"effect\";\nimport { Schema } from \"effect\";\nimport {\n ConfigValidationError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n} from \"./errors\";\n\nexport interface RenderedError {\n readonly type: string;\n readonly provider?: string;\n readonly message: string;\n readonly details?: ReadonlyArray<string>;\n readonly status?: number;\n readonly body?: string;\n}\n\nexport const RenderedErrorSchema = Schema.Struct({\n type: Schema.String,\n provider: Schema.optional(Schema.String),\n message: Schema.String,\n details: Schema.optional(Schema.Array(Schema.String)),\n status: Schema.optional(Schema.Number),\n body: Schema.optional(Schema.String),\n});\n\nconst configErrorDetails = (error: ConfigValidationError): Array<string> => {\n const details = Array.isArray(error.details)\n ? error.details.filter((detail) => detail.length > 0)\n : [];\n\n if (details.length > 0) {\n return details;\n }\n\n if (error.cause instanceof Config.ConfigError && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (error.cause instanceof Error && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (typeof error.cause === \"string\" && error.cause.length > 0) {\n return [error.cause];\n }\n\n return [];\n};\n\nexport const renderStructuredError = (error: unknown): RenderedError => {\n if (error instanceof ConfigValidationError) {\n const details = configErrorDetails(error);\n\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n ...(details.length > 0 ? { details } : {}),\n };\n }\n\n if (error instanceof ProviderRequestError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n if (error instanceof ProviderResponseError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n status: error.status,\n body: error.body,\n };\n }\n\n if (error instanceof ProviderDecodeError) {\n return {\n type: error._tag,\n provider: error.provider,\n message: error.message,\n };\n }\n\n if (error instanceof Error) {\n return {\n type: error.name,\n message: error.message,\n };\n }\n\n return {\n type: \"UnknownError\",\n message: String(error),\n };\n};\n","import { Config, Effect, Layer, Logger, Option, Schema, ServiceMap, Console } from \"effect\";\nimport { Flag } from \"effect/unstable/cli\";\nimport {\n ConfigValidationError,\n ProviderContentError,\n ProviderDecodeError,\n ProviderRequestError,\n ProviderResponseError,\n} from \"./errors\";\nimport { renderStructuredError } from \"./render-error\";\n\nconst stringify = (value: unknown) => JSON.stringify(value, null, 2);\nconst maxHumanErrorBodyLength = 500;\n\nexport const OutputModeSchema = Schema.Literals([\"human\", \"llm\"] as const);\nexport type OutputMode = typeof OutputModeSchema.Type;\n\nexport const outputFlag = Flag.optional(\n Flag.choice(\"output\", OutputModeSchema.literals).pipe(\n Flag.withDescription(\"Output mode: human for readable text, llm for structured JSON.\"),\n ),\n);\n\nconst trimTrailingWhitespace = (text: string) => text.trimEnd();\n\nconst truncate = (text: string, maxLength: number) =>\n text.length <= maxLength ? text : `${text.slice(0, maxLength - 1)}...`;\n\nconst configErrorDetails = (error: ConfigValidationError): Array<string> => {\n const details = Array.isArray(error.details)\n ? error.details.filter((detail) => detail.length > 0)\n : [];\n\n if (details.length > 0) {\n return details;\n }\n\n if (error.cause instanceof Error && error.cause.message.length > 0) {\n return [error.cause.message];\n }\n\n if (typeof error.cause === \"string\" && error.cause.length > 0) {\n return [error.cause];\n }\n\n return [];\n};\n\nexport const writeJsonStdout = (value: unknown) => Console.log(stringify(value));\nexport const renderJsonText = (value: unknown) => stringify(value);\n\nconst defaultOutputModeConfig = Config.string(\"AGENT\").pipe(\n Config.withDefault(\"\"),\n Config.map((agent): OutputMode => (agent.trim().length > 0 ? \"llm\" : \"human\")),\n);\n\nexport const resolveOutputMode = (\n selected: Option.Option<OutputMode>,\n fallback: OutputMode,\n): OutputMode => Option.getOrElse(selected, () => fallback);\n\nconst makeCliOutput = (defaultMode: OutputMode) =>\n CliOutput.of({\n defaultMode,\n writeOutput: ({ human, llm }, mode = defaultMode) =>\n mode === \"llm\" ? writeJsonStdout(llm) : Console.log(human),\n logError: (error, mode = defaultMode) => logCliError(error, mode),\n });\n\nconst renderHumanError = (error: unknown) => {\n if (error instanceof ConfigValidationError) {\n const details = configErrorDetails(error);\n const lines = [`Configuration error (${error.provider})`, error.message];\n\n if (details.length > 0) {\n lines.push(\"\", \"What to fix:\");\n lines.push(...details.map((detail) => `- ${detail}`));\n }\n\n return trimTrailingWhitespace(lines.join(\"\\n\"));\n }\n\n if (error instanceof ProviderRequestError) {\n return trimTrailingWhitespace([`Request failed (${error.provider})`, error.message].join(\"\\n\"));\n }\n\n if (error instanceof ProviderContentError) {\n return trimTrailingWhitespace(\n [`Provider returned no usable content (${error.provider})`, error.message].join(\"\\n\"),\n );\n }\n\n if (error instanceof ProviderResponseError) {\n const lines = [\n `Provider response error (${error.provider})`,\n error.message,\n `HTTP status: ${error.status}`,\n ];\n const body = error.body.trim();\n\n if (body.length > 0) {\n lines.push(`Response body: ${truncate(body, maxHumanErrorBodyLength)}`);\n }\n\n return trimTrailingWhitespace(lines.join(\"\\n\"));\n }\n\n if (error instanceof ProviderDecodeError) {\n return trimTrailingWhitespace(\n [`Provider decode error (${error.provider})`, error.message].join(\"\\n\"),\n );\n }\n\n if (error instanceof Error) {\n return trimTrailingWhitespace([error.name, error.message].join(\"\\n\"));\n }\n\n return `Unknown error\\n${String(error)}`;\n};\n\nconst cliErrorLogMessageTag = \"UltimateSearchCliError\";\n\ninterface CliErrorLogMessage {\n readonly _tag: typeof cliErrorLogMessageTag;\n readonly mode: OutputMode;\n readonly error: unknown;\n}\n\nconst isCliErrorLogMessage = (value: unknown): value is CliErrorLogMessage =>\n typeof value === \"object\" &&\n value !== null &&\n \"_tag\" in value &&\n value._tag === cliErrorLogMessageTag &&\n \"mode\" in value &&\n (value.mode === \"human\" || value.mode === \"llm\") &&\n \"error\" in value;\n\nconst normalizeLogMessage = (message: unknown): unknown =>\n Array.isArray(message) && message.length === 1 ? message[0] : message;\n\nconst renderGenericLogMessage = (message: unknown): string => {\n const normalized = normalizeLogMessage(message);\n\n if (Array.isArray(normalized)) {\n return normalized.map((item) => renderGenericLogMessage(item)).join(\" \");\n }\n\n if (typeof normalized === \"string\") {\n return normalized;\n }\n\n if (normalized instanceof Error) {\n return trimTrailingWhitespace([normalized.name, normalized.message].join(\"\\n\"));\n }\n\n try {\n return stringify(normalized);\n } catch {\n return String(normalized);\n }\n};\n\nconst formatCliLogMessage = (message: unknown): string => {\n const normalized = normalizeLogMessage(message);\n\n if (isCliErrorLogMessage(normalized)) {\n return normalized.mode === \"llm\"\n ? stringify({ error: renderStructuredError(normalized.error) })\n : renderHumanError(normalized.error);\n }\n\n return renderGenericLogMessage(normalized);\n};\n\nexport const logCliError = (error: unknown, mode: OutputMode) =>\n Effect.logError({\n _tag: cliErrorLogMessageTag,\n mode,\n error,\n } satisfies CliErrorLogMessage);\n\nconst cliConsoleLogger = Logger.withConsoleError(\n Logger.make((options) => formatCliLogMessage(options.message)),\n);\n\nexport const cliLoggerLayer = Logger.layer([cliConsoleLogger, Logger.tracerLogger]);\n\nexport class CliOutput extends ServiceMap.Service<\n CliOutput,\n {\n readonly defaultMode: OutputMode;\n readonly writeOutput: (\n output: {\n readonly human: string;\n readonly llm: unknown;\n },\n mode?: OutputMode,\n ) => Effect.Effect<void>;\n readonly logError: (error: unknown, mode?: OutputMode) => Effect.Effect<void>;\n }\n>()(\"CliOutput\") {\n static readonly layer = Layer.effect(\n CliOutput,\n Effect.map(defaultOutputModeConfig.asEffect(), makeCliOutput),\n );\n\n static layerForMode(mode: OutputMode) {\n return Layer.succeed(CliOutput, makeCliOutput(mode));\n }\n}\n","import { Effect, Option } from \"effect\";\nimport { CliOutput, type OutputMode, resolveOutputMode } from \"./output\";\n\nexport interface CommandOutput {\n readonly human: string;\n readonly llm: unknown;\n}\n\nexport const runCommandWithOutput = <E, R>(\n selectedMode: Option.Option<OutputMode>,\n buildOutput: (mode: OutputMode) => Effect.Effect<CommandOutput, E, R>,\n) =>\n Effect.gen(function* () {\n const cliOutput = yield* CliOutput;\n const mode = resolveOutputMode(selectedMode, cliOutput.defaultMode);\n const output = yield* buildOutput(mode).pipe(\n Effect.tapError((error) => cliOutput.logError(error, mode)),\n );\n\n yield* cliOutput.writeOutput(output, mode);\n });\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport { FetchContentFormatSchema, TavilyExtractDepthSchema } from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { FirecrawlFetch } from \"../services/firecrawl-fetch\";\nimport { TavilyExtract } from \"../services/tavily-extract\";\nimport { WebFetch } from \"../services/web-fetch\";\nimport { WebFetchInput, type WebFetchResult } from \"../services/web-fetch-schema\";\nimport { runCommandWithOutput } from \"../shared/command-output\";\nimport { outputFlag } from \"../shared/output\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nconst fetchCommandLayer = WebFetch.layer.pipe(\n Layer.provideMerge(FirecrawlFetch.layer),\n Layer.provideMerge(TavilyExtract.layer),\n Layer.provideMerge(FirecrawlProviderClient.layer),\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanFetchResult = (result: WebFetchResult) => {\n const lines = [`Backend: ${result.backend}`];\n\n if (result.fallback != null) {\n lines.push(\n `Fallback: ${result.fallback.from} -> ${result.fallback.to} (${result.fallback.reason.message})`,\n );\n }\n\n for (const [index, page] of result.results.entries()) {\n lines.push(\"\");\n lines.push(`URL: ${page.url}`);\n\n if (page.title != null && page.title.trim().length > 0) {\n lines.push(`Title: ${page.title.trim()}`);\n }\n\n lines.push(\"\");\n lines.push(page.raw_content);\n\n if (index < result.results.length - 1) {\n lines.push(\"\", \"---\");\n }\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const commandFetch = Command.make(\n \"fetch\",\n {\n url: Flag.string(\"url\").pipe(\n Flag.withSchema(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n Flag.withDescription(\"Target page URL.\"),\n ),\n depth: Flag.choice(\"depth\", TavilyExtractDepthSchema.literals).pipe(\n Flag.withDefault(\"basic\"),\n Flag.withDescription(\"Optional Tavily extract depth.\"),\n ),\n format: Flag.choice(\"format\", FetchContentFormatSchema.literals).pipe(\n Flag.withDefault(\"markdown\"),\n Flag.withDescription(\"Normalized content format to return.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, (mode) =>\n Effect.gen(function* () {\n const request = yield* WebFetchInput.decodeEffect({\n urls: [input.url],\n depth: input.depth,\n format: input.format,\n });\n const webFetch = yield* WebFetch;\n const result = yield* webFetch.fetch(request);\n\n return {\n human: mode === \"human\" ? renderHumanFetchResult(result) : \"\",\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Fetch and normalize page content from a URL.\"),\n Command.withExamples([\n {\n command: 'ultimate-search fetch --url \"https://example.com\"',\n description: \"Fetch a page with Tavily first and FireCrawl as fallback.\",\n },\n ]),\n Command.provide(fetchCommandLayer),\n);\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport {\n buildTavilyMapRequest,\n TavilyMapInput,\n type TavilyMapResponse,\n} from \"../providers/tavily/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class TavilyMap extends ServiceMap.Service<\n TavilyMap,\n {\n readonly map: (\n input: TavilyMapInput,\n ) => Effect.Effect<TavilyMapResponse, UltimateSearchError, never>;\n }\n>()(\"TavilyMap\") {\n static readonly layer = Layer.effect(\n TavilyMap,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const map: TavilyMap.Methods[\"map\"] = Effect.fn(\"TavilyMap.map\")(function* (input) {\n return yield* provider.map(buildTavilyMapRequest(input));\n });\n\n return TavilyMap.of({\n map,\n });\n }),\n );\n}\n\nexport declare namespace TavilyMap {\n export type Methods = ServiceMap.Service.Shape<typeof TavilyMap>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Option, Schema } from \"effect\";\nimport { Flag } from \"effect/unstable/cli\";\n\nexport const optionalTrimmedTextFlag = (name: string, description: string) =>\n Flag.optional(\n Flag.string(name).pipe(Flag.withSchema(Schema.Trim), Flag.withDescription(description)),\n ).pipe(Flag.map((value) => Option.filter(value, (text) => text.length > 0)));\n\nexport const optionalChoiceFlag = <A extends string>(\n name: string,\n choices: ReadonlyArray<A>,\n description: string,\n) => Flag.optional(Flag.choice(name, choices).pipe(Flag.withDescription(description)));\n\nexport const optionalIntegerFlag = (name: string, description: string) =>\n Flag.optional(Flag.integer(name).pipe(Flag.withDescription(description)));\n\nexport const optionalIntegerFlagWithSchema = <A>(\n name: string,\n schema: Schema.Codec<A, number>,\n description: string,\n) =>\n Flag.optional(\n Flag.integer(name).pipe(Flag.withSchema(schema), Flag.withDescription(description)),\n );\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport {\n TavilyMapBreadthSchema,\n TavilyMapDepthSchema,\n TavilyMapInput,\n TavilyMapLimitSchema,\n type TavilyMapResponse,\n} from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { TavilyMap } from \"../services/tavily-map\";\nimport { optionalIntegerFlagWithSchema, optionalTrimmedTextFlag } from \"../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../shared/command-output\";\nimport { outputFlag } from \"../shared/output\";\nimport { absoluteUrlStringSchema } from \"../shared/schema\";\n\nconst mapCommandLayer = TavilyMap.layer.pipe(\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanMapResult = (result: TavilyMapResponse) => {\n const lines = [`Base URL: ${result.base_url}`, `Discovered URLs: ${result.results.length}`];\n\n if (result.response_time !== undefined) {\n lines.push(`Response time: ${result.response_time}s`);\n }\n\n if (result.usage?.credits_used !== undefined) {\n lines.push(`Credits used: ${result.usage.credits_used}`);\n }\n\n if (result.results.length > 0) {\n lines.push(\"\", ...result.results.map((url) => `- ${url}`));\n }\n\n return lines.join(\"\\n\");\n};\n\nexport const commandMap = Command.make(\n \"map\",\n {\n url: Flag.string(\"url\").pipe(\n Flag.withSchema(absoluteUrlStringSchema(\"url must be an absolute URL\")),\n Flag.withDescription(\"Root URL to map with Tavily.\"),\n ),\n depth: optionalIntegerFlagWithSchema(\n \"depth\",\n TavilyMapDepthSchema,\n \"Optional crawl depth between 1 and 5.\",\n ),\n breadth: optionalIntegerFlagWithSchema(\n \"breadth\",\n TavilyMapBreadthSchema,\n \"Optional crawl breadth between 1 and 500.\",\n ),\n limit: optionalIntegerFlagWithSchema(\n \"limit\",\n TavilyMapLimitSchema,\n \"Optional maximum number of discovered URLs to return.\",\n ),\n instructions: optionalTrimmedTextFlag(\n \"instructions\",\n \"Optional guidance for how Tavily should explore the site.\",\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* TavilyMapInput.decodeEffect(input);\n const tavilyMap = yield* TavilyMap;\n const result = yield* tavilyMap.map(request);\n\n return {\n human: renderHumanMapResult(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Map a site's reachable URLs with Tavily.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search map --url \"https://fastapi.tiangolo.com\" --depth 2 --breadth 20 --limit 50',\n description: \"Discover reachable URLs for a site with Tavily map.\",\n },\n {\n command: 'ultimate-search map --url \"https://fastapi.tiangolo.com\" --output llm',\n description: \"Emit structured JSON for agent-driven workflows.\",\n },\n ]),\n Command.provide(mapCommandLayer),\n);\n","import { Option, Schema } from \"effect\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nexport const GrokUsageSchema = Schema.Struct({\n prompt_tokens: Schema.Number,\n completion_tokens: Schema.Number,\n total_tokens: Schema.Number,\n});\n\nexport type GrokUsage = typeof GrokUsageSchema.Type;\n\nexport const GrokMessageSchema = Schema.Struct({\n role: Schema.Literals([\"system\", \"user\", \"assistant\"] as const),\n content: Schema.String,\n});\n\nexport type GrokMessage = typeof GrokMessageSchema.Type;\n\nexport const GrokChatCompletionRequestSchema = Schema.Struct({\n model: Schema.NonEmptyString,\n stream: Schema.Boolean,\n messages: Schema.NonEmptyArray(GrokMessageSchema),\n});\n\nexport type GrokChatCompletionRequest = typeof GrokChatCompletionRequestSchema.Type;\n\nexport const GrokChatCompletionResponseSchema = Schema.Struct({\n model: Schema.String,\n choices: Schema.NonEmptyArray(\n Schema.Struct({\n message: GrokMessageSchema,\n }),\n ),\n usage: GrokUsageSchema,\n});\n\nexport type GrokChatCompletionResponse = typeof GrokChatCompletionResponseSchema.Type;\n\nexport class GrokSearchInput extends Schema.Class<GrokSearchInput>(\"GrokSearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: Schema.Option(Schema.NonEmptyString),\n model: Schema.Option(Schema.NonEmptyString),\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(GrokSearchInput);\n}\n\nexport interface GrokSearchResult {\n readonly content: string;\n readonly model: string;\n readonly usage: GrokUsage;\n}\n\nexport const GrokSearchResultSchema = Schema.Struct({\n content: Schema.String,\n model: Schema.String,\n usage: GrokUsageSchema,\n});\n\nconst timeSensitivePattern =\n /今天|最新|当前|latest|recent|today|current|now|这几天|本周|本月|近期|最近/iu;\n\nexport const grokSystemPrompt = `# Core Instruction\n\n1. User needs may be vague. Think divergently, infer intent from multiple angles, and leverage full conversation context to progressively clarify their true needs.\n2. **Breadth-First Search**—Approach problems from multiple dimensions. Brainstorm 5+ perspectives and execute parallel searches for each. Consult as many high-quality sources as possible before responding.\n3. **Depth-First Search**—After broad exploration, select ≥2 most relevant perspectives for deep investigation into specialized knowledge.\n4. **Evidence-Based Reasoning & Traceable Sources**—Every claim must be followed by a citation. More credible sources strengthen arguments. If no references exist, remain silent.\n5. Before responding, ensure full execution of Steps 1–4.\n\n# Search Instruction\n\n1. Think carefully before responding—anticipate the user's true intent to ensure precision.\n2. Verify every claim rigorously to avoid misinformation.\n3. Follow problem logic—dig deeper until clues are exhaustively clear. Use multiple parallel tool calls per query and ensure answers are well-sourced.\n4. Search in English first (prioritizing English resources for volume/quality), but switch to Chinese if context demands.\n5. Prioritize authoritative sources: Wikipedia, academic databases, books, reputable media/journalism.\n6. Favor sharing in-depth, specialized knowledge over generic or common-sense content.\n\n# Output Style\n\n1. Lead with the **most probable solution** before detailed analysis.\n2. **Define every technical term** in plain language.\n3. **Respect facts and search results—use statistical rigor to discern truth**.\n4. **Every sentence must cite sources**. More references = stronger credibility.\n5. **Strictly format outputs in polished Markdown**.`;\n\nconst withCurrentTimeContext = (query: string) => {\n if (!timeSensitivePattern.test(query)) {\n return query;\n }\n\n return `[Current date and time: ${new Date().toISOString()}]\n\n${query}`;\n};\n\nexport const buildGrokUserMessage = (input: GrokSearchInput) => {\n const baseMessage = withCurrentTimeContext(input.query);\n\n return Option.match(input.platform, {\n onNone: () => baseMessage,\n onSome: (platform) =>\n `${baseMessage}\n\nYou should focus on these platform: ${platform}`,\n });\n};\n","import { Effect, Layer, Schema, ServiceMap } from \"effect\";\nimport { HttpClient, HttpClientRequest } from \"effect/unstable/http\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport type { ServicesReturns } from \"../../shared/effect\";\nimport { ProviderDecodeError, type UltimateSearchError } from \"../../shared/errors\";\nimport {\n catchProviderHttpError,\n decodeJsonResponse,\n makeProviderHttpClient,\n} from \"../../shared/provider-http-client\";\nimport {\n type GrokChatCompletionRequest,\n GrokChatCompletionResponseSchema,\n type GrokChatCompletionResponse,\n} from \"./schema\";\n\nconst decodeGrokChatCompletionResponse = Schema.decodeUnknownEffect(\n GrokChatCompletionResponseSchema,\n);\n\nconst mapDecodeError = (error: unknown, fallback: string) =>\n new ProviderDecodeError({\n provider: \"grok\",\n message: error instanceof Error ? error.message : fallback,\n cause: error,\n });\n\nexport class GrokProviderClient extends ServiceMap.Service<\n GrokProviderClient,\n {\n readonly createChatCompletion: (\n request: GrokChatCompletionRequest,\n ) => Effect.Effect<GrokChatCompletionResponse, UltimateSearchError, never>;\n }\n>()(\"GrokProviderClient\") {\n static readonly layer = Layer.effect(\n GrokProviderClient,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const http = makeProviderHttpClient(yield* HttpClient.HttpClient);\n\n const createChatCompletion: GrokProviderClient.Methods[\"createChatCompletion\"] = Effect.fn(\n \"GrokProviderClient.createChatCompletion\",\n )(function* (payload): GrokProviderClient.Returns<\"createChatCompletion\"> {\n const grok = yield* config.getGrokConfig();\n const request = HttpClientRequest.post(`${grok.apiUrl}/v1/chat/completions`).pipe(\n HttpClientRequest.acceptJson,\n HttpClientRequest.bearerToken(grok.apiKey),\n HttpClientRequest.bodyJsonUnsafe(payload),\n );\n\n const response = yield* http\n .execute(request)\n .pipe(\n catchProviderHttpError(\n \"grok\",\n \"Failed to send the Grok request.\",\n (status: number) => `Grok returned HTTP ${status}.`,\n ),\n );\n\n return yield* decodeJsonResponse(response, decodeGrokChatCompletionResponse, (error) =>\n mapDecodeError(error, \"Failed to decode the Grok response payload.\"),\n );\n });\n\n return GrokProviderClient.of({\n createChatCompletion,\n });\n }),\n );\n}\n\nexport declare namespace GrokProviderClient {\n export type Methods = ServiceMap.Service.Shape<typeof GrokProviderClient>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Option, ServiceMap } from \"effect\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { GrokProviderClient } from \"../providers/grok/client\";\nimport {\n buildGrokUserMessage,\n type GrokChatCompletionRequest,\n GrokSearchInput,\n type GrokSearchResult,\n grokSystemPrompt,\n} from \"../providers/grok/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class GrokSearch extends ServiceMap.Service<\n GrokSearch,\n {\n readonly search: (\n input: GrokSearchInput,\n ) => Effect.Effect<GrokSearchResult, UltimateSearchError, never>;\n }\n>()(\"GrokSearch\") {\n // 也可以单独定义成变量或者class上的静态方法\n static readonly layer = Layer.effect(\n GrokSearch,\n Effect.gen(function* () {\n const config = yield* UltimateSearchConfig;\n const provider = yield* GrokProviderClient;\n\n const search: GrokSearch.Methods[\"search\"] = Effect.fn(\"search\")(\n function* (input): GrokSearch.Returns<\"search\"> {\n const grok = yield* config.getGrokConfig();\n const payload: GrokChatCompletionRequest = {\n model: Option.getOrElse(input.model, () => grok.model),\n stream: false,\n messages: [\n {\n role: \"system\",\n content: grokSystemPrompt,\n },\n {\n role: \"user\",\n content: buildGrokUserMessage(input),\n },\n ],\n };\n const response = yield* provider.createChatCompletion(payload);\n\n return {\n content: response.choices[0].message.content,\n model: response.model,\n usage: response.usage,\n } satisfies GrokSearchResult;\n },\n );\n\n return GrokSearch.of({\n search,\n });\n }),\n );\n\n // 也可以再定义 live = Layer.provide(xxx.layer, deps) // 无依赖的 Layer<A, E, never>\n}\n\nexport declare namespace GrokSearch {\n export type Methods = ServiceMap.Service.Shape<typeof GrokSearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, ServiceMap } from \"effect\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport {\n buildTavilySearchRequest,\n TavilySearchInput,\n type TavilySearchResponse,\n} from \"../providers/tavily/schema\";\nimport type { UltimateSearchError } from \"../shared/errors\";\nimport type { ServicesReturns } from \"../shared/effect\";\n\nexport class TavilySearch extends ServiceMap.Service<\n TavilySearch,\n {\n readonly search: (\n input: TavilySearchInput,\n ) => Effect.Effect<TavilySearchResponse, UltimateSearchError, never>;\n }\n>()(\"TavilySearch\") {\n static readonly layer = Layer.effect(\n TavilySearch,\n Effect.gen(function* () {\n const provider = yield* TavilyProviderClient;\n\n const search: TavilySearch.Methods[\"search\"] = Effect.fn(\"TavilySearch.search\")(\n function* (input): TavilySearch.Returns<\"search\"> {\n return yield* provider.search(buildTavilySearchRequest(input));\n },\n );\n\n return TavilySearch.of({\n search,\n });\n }),\n );\n}\n\nexport declare namespace TavilySearch {\n export type Methods = ServiceMap.Service.Shape<typeof TavilySearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Result, Schema, ServiceMap } from \"effect\";\nimport {\n GrokSearchInput,\n GrokSearchResultSchema,\n type GrokSearchResult,\n} from \"../providers/grok/schema\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchInput,\n TavilySearchResponseSchema,\n type TavilySearchResponse,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../providers/tavily/schema\";\nimport type { ServicesReturns } from \"../shared/effect\";\nimport type { RenderedError } from \"../shared/render-error\";\nimport { RenderedErrorSchema, renderStructuredError } from \"../shared/render-error\";\nimport { trimmedNonEmptyStringSchema } from \"../shared/schema\";\nimport { GrokSearch } from \"./grok-search\";\nimport { TavilySearch } from \"./tavily-search\";\n\nexport class DualSearchInput extends Schema.Class<DualSearchInput>(\"DualSearchInput\")({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: Schema.Option(Schema.NonEmptyString),\n model: Schema.Option(Schema.NonEmptyString),\n searchDepth: Schema.Option(TavilySearchDepthSchema),\n topic: Schema.Option(TavilySearchTopicSchema),\n timeRange: Schema.Option(TavilyTimeRangeSchema),\n maxResults: Schema.Option(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"max-results must be an integer between 1 and 20\",\n }),\n ),\n ),\n includeAnswer: Schema.Boolean,\n}) {\n static decodeEffect = Schema.decodeUnknownEffect(DualSearchInput);\n}\n\nexport interface DualSearchProviderSuccess<A> {\n readonly status: \"success\";\n readonly result: A;\n}\n\nexport interface DualSearchProviderFailure {\n readonly status: \"error\";\n readonly error: RenderedError;\n}\n\nexport type DualSearchProviderResult<A> = DualSearchProviderSuccess<A> | DualSearchProviderFailure;\n\nexport interface DualSearchResult {\n readonly grok: DualSearchProviderResult<GrokSearchResult>;\n readonly tavily: DualSearchProviderResult<TavilySearchResponse>;\n}\n\nconst dualSearchProviderSuccessSchema = <A extends Schema.Top>(resultSchema: A) =>\n Schema.Struct({\n status: Schema.Literal(\"success\"),\n result: resultSchema,\n });\n\nconst DualSearchProviderFailureSchema = Schema.Struct({\n status: Schema.Literal(\"error\"),\n error: RenderedErrorSchema,\n});\n\nexport const DualSearchResultSchema = Schema.Struct({\n grok: Schema.Union([\n dualSearchProviderSuccessSchema(GrokSearchResultSchema),\n DualSearchProviderFailureSchema,\n ]),\n tavily: Schema.Union([\n dualSearchProviderSuccessSchema(TavilySearchResponseSchema),\n DualSearchProviderFailureSchema,\n ]),\n});\n\nconst toProviderResult = <A, E>(result: Result.Result<A, E>): DualSearchProviderResult<A> =>\n Result.match(result, {\n onSuccess: (value) => ({\n status: \"success\",\n result: value,\n }),\n onFailure: (error) => ({\n status: \"error\",\n error: renderStructuredError(error),\n }),\n });\n\nexport class DualSearch extends ServiceMap.Service<\n DualSearch,\n {\n readonly search: (input: DualSearchInput) => Effect.Effect<DualSearchResult>;\n }\n>()(\"DualSearch\") {\n static readonly layer = Layer.effect(\n DualSearch,\n Effect.gen(function* () {\n const grokSearch = yield* GrokSearch;\n const tavilySearch = yield* TavilySearch;\n\n const search: DualSearch.Methods[\"search\"] = Effect.fn(\"DualSearch.search\")(\n function* (input): DualSearch.Returns<\"search\"> {\n const results = yield* Effect.all(\n {\n grok: grokSearch.search(\n yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: input.platform,\n model: input.model,\n }).pipe(Effect.orDie),\n ),\n tavily: tavilySearch.search(\n yield* TavilySearchInput.decodeEffect({\n query: input.query,\n searchDepth: input.searchDepth,\n topic: input.topic,\n timeRange: input.timeRange,\n maxResults: input.maxResults,\n includeAnswer: input.includeAnswer,\n }).pipe(Effect.orDie),\n ),\n },\n {\n concurrency: \"unbounded\",\n mode: \"result\",\n },\n );\n\n return {\n grok: toProviderResult(results.grok),\n tavily: toProviderResult(results.tavily),\n };\n },\n );\n\n return DualSearch.of({\n search,\n });\n }),\n );\n}\n\nexport declare namespace DualSearch {\n export type Methods = ServiceMap.Service.Shape<typeof DualSearch>;\n export type Returns<key extends keyof Methods, R = never> = ServicesReturns<Methods[key], R>;\n}\n","import { Effect, Layer, Option, Schema } from \"effect\";\nimport { McpServer, Tool, Toolkit } from \"effect/unstable/ai\";\nimport { UltimateSearchConfig } from \"../config/settings\";\nimport { GrokSearchInput, GrokSearchResultSchema } from \"../providers/grok/schema\";\nimport { GrokProviderClient } from \"../providers/grok/client\";\nimport {\n FetchContentFormatSchema,\n TavilyMapBreadthSchema,\n TavilyMapDepthSchema,\n TavilyMapInput,\n TavilyMapLimitSchema,\n TavilyMapResponseSchema,\n TavilySearchDepthSchema,\n TavilySearchInput,\n TavilySearchResponseSchema,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../providers/tavily/client\";\nimport { FirecrawlProviderClient } from \"../providers/firecrawl/client\";\nimport { DualSearch, DualSearchInput, DualSearchResultSchema } from \"./dual-search\";\nimport { FirecrawlFetch } from \"./firecrawl-fetch\";\nimport { GrokSearch } from \"./grok-search\";\nimport { TavilyMap } from \"./tavily-map\";\nimport { TavilyExtract } from \"./tavily-extract\";\nimport { TavilySearch } from \"./tavily-search\";\nimport { WebFetch } from \"./web-fetch\";\nimport { WebFetchInput, WebFetchResultSchema } from \"./web-fetch-schema\";\nimport { RenderedErrorSchema, renderStructuredError } from \"../shared/render-error\";\nimport { absoluteUrlStringSchema, trimmedNonEmptyStringSchema } from \"../shared/schema\";\n\nconst optionalTrimmedTextField = (message: string) =>\n Schema.optional(trimmedNonEmptyStringSchema(message));\n\nconst toOption = <A>(value: A | undefined) =>\n value === undefined ? Option.none<A>() : Option.some(value);\n\nconst SearchGrokParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: optionalTrimmedTextField(\"platform must be a non-empty string\"),\n model: optionalTrimmedTextField(\"model must be a non-empty string\"),\n});\n\nconst SearchTavilyParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n maxResults: Schema.optional(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"maxResults must be an integer between 1 and 20\",\n }),\n ),\n ),\n topic: Schema.optional(TavilySearchTopicSchema),\n timeRange: Schema.optional(TavilyTimeRangeSchema),\n includeAnswer: Schema.optional(Schema.Boolean),\n});\n\nconst SearchDualParametersSchema = Schema.Struct({\n query: trimmedNonEmptyStringSchema(\"query must be a non-empty string\"),\n platform: optionalTrimmedTextField(\"platform must be a non-empty string\"),\n model: optionalTrimmedTextField(\"model must be a non-empty string\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n maxResults: Schema.optional(\n Schema.Int.pipe(\n Schema.check(Schema.isBetween({ minimum: 1, maximum: 20 })),\n Schema.annotate({\n message: \"maxResults must be an integer between 1 and 20\",\n }),\n ),\n ),\n topic: Schema.optional(TavilySearchTopicSchema),\n timeRange: Schema.optional(TavilyTimeRangeSchema),\n includeAnswer: Schema.optional(Schema.Boolean),\n});\n\nconst FetchParametersSchema = Schema.Struct({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.optional(TavilySearchDepthSchema),\n format: Schema.optional(FetchContentFormatSchema),\n});\n\nconst MapParametersSchema = Schema.Struct({\n url: absoluteUrlStringSchema(\"url must be an absolute URL\"),\n depth: Schema.optional(TavilyMapDepthSchema),\n breadth: Schema.optional(TavilyMapBreadthSchema),\n limit: Schema.optional(TavilyMapLimitSchema),\n instructions: optionalTrimmedTextField(\"instructions must be a non-empty string\"),\n});\n\nconst searchGrokTool = Tool.make(\"search_grok\", {\n description: \"Run the Grok-backed search flow used by the CLI.\",\n parameters: SearchGrokParametersSchema,\n success: GrokSearchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Grok\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst searchTavilyTool = Tool.make(\"search_tavily\", {\n description: \"Run the Tavily-backed search flow used by the CLI.\",\n parameters: SearchTavilyParametersSchema,\n success: TavilySearchResponseSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Tavily\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst searchDualTool = Tool.make(\"search_dual\", {\n description: \"Run Grok and Tavily concurrently with the CLI's dual-search orchestration.\",\n parameters: SearchDualParametersSchema,\n success: DualSearchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Search Dual\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst fetchTool = Tool.make(\"fetch\", {\n description: \"Fetch a page with Tavily-first and FireCrawl fallback, matching the CLI.\",\n parameters: FetchParametersSchema,\n success: WebFetchResultSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Fetch\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nconst mapTool = Tool.make(\"map\", {\n description: \"Map a site's reachable URLs with Tavily, matching the CLI.\",\n parameters: MapParametersSchema,\n success: TavilyMapResponseSchema,\n failure: RenderedErrorSchema,\n failureMode: \"return\",\n})\n .annotate(Tool.Title, \"Map\")\n .annotate(Tool.Readonly, true)\n .annotate(Tool.Destructive, false)\n .annotate(Tool.Idempotent, true);\n\nexport const readOnlyMcpToolkit = Toolkit.make(\n searchGrokTool,\n searchTavilyTool,\n searchDualTool,\n fetchTool,\n mapTool,\n);\n\nexport const readOnlyMcpToolNames = [\n \"search_grok\",\n \"search_tavily\",\n \"search_dual\",\n \"fetch\",\n \"map\",\n] as const;\n\nconst readOnlyMcpToolkitLayer = readOnlyMcpToolkit.toLayer(\n Effect.gen(function* () {\n const grokSearch = yield* GrokSearch;\n const tavilySearch = yield* TavilySearch;\n const dualSearch = yield* DualSearch;\n const webFetch = yield* WebFetch;\n const tavilyMap = yield* TavilyMap;\n\n return readOnlyMcpToolkit.of({\n search_grok: Effect.fn(\"ReadOnlyMcp.searchGrok\")(function* (input) {\n const request = yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: toOption(input.platform),\n model: toOption(input.model),\n }).pipe(Effect.orDie);\n\n return yield* grokSearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n search_tavily: Effect.fn(\"ReadOnlyMcp.searchTavily\")(function* (input) {\n const request = yield* TavilySearchInput.decodeEffect({\n query: input.query,\n searchDepth: toOption(input.depth),\n topic: toOption(input.topic),\n timeRange: toOption(input.timeRange),\n maxResults: toOption(input.maxResults),\n includeAnswer: input.includeAnswer ?? false,\n }).pipe(Effect.orDie);\n\n return yield* tavilySearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n search_dual: Effect.fn(\"ReadOnlyMcp.searchDual\")(function* (input) {\n const request = yield* DualSearchInput.decodeEffect({\n query: input.query,\n platform: toOption(input.platform),\n model: toOption(input.model),\n searchDepth: toOption(input.depth),\n topic: toOption(input.topic),\n timeRange: toOption(input.timeRange),\n maxResults: toOption(input.maxResults),\n includeAnswer: input.includeAnswer ?? false,\n }).pipe(Effect.orDie);\n\n return yield* dualSearch.search(request).pipe(Effect.mapError(renderStructuredError));\n }),\n fetch: Effect.fn(\"ReadOnlyMcp.fetch\")(function* (input) {\n const request = yield* WebFetchInput.decodeEffect({\n urls: [input.url],\n depth: input.depth ?? \"basic\",\n format: input.format ?? \"markdown\",\n }).pipe(Effect.orDie);\n\n return yield* webFetch.fetch(request).pipe(\n Effect.flatMap((result) => Schema.decodeUnknownEffect(WebFetchResultSchema)(result)),\n Effect.mapError(renderStructuredError),\n );\n }),\n map: Effect.fn(\"ReadOnlyMcp.map\")(function* (input) {\n const request = yield* TavilyMapInput.decodeEffect({\n url: input.url,\n depth: toOption(input.depth),\n breadth: toOption(input.breadth),\n limit: toOption(input.limit),\n instructions: toOption(input.instructions),\n }).pipe(Effect.orDie);\n\n return yield* tavilyMap.map(request).pipe(Effect.mapError(renderStructuredError));\n }),\n });\n }),\n);\n\nconst readOnlyProviderLayer = Layer.mergeAll(\n FirecrawlProviderClient.layer,\n GrokProviderClient.layer,\n TavilyProviderClient.layer,\n).pipe(Layer.provideMerge(UltimateSearchConfig.layer));\n\nconst grokSearchLayer = GrokSearch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilySearchLayer = TavilySearch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilyMapLayer = TavilyMap.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst tavilyExtractLayer = TavilyExtract.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst firecrawlFetchLayer = FirecrawlFetch.layer.pipe(Layer.provideMerge(readOnlyProviderLayer));\n\nconst webFetchLayer = WebFetch.layer.pipe(\n Layer.provideMerge(firecrawlFetchLayer),\n Layer.provideMerge(tavilyExtractLayer),\n);\n\nconst dualSearchLayer = DualSearch.layer.pipe(\n Layer.provideMerge(grokSearchLayer),\n Layer.provideMerge(tavilySearchLayer),\n);\n\nexport const readOnlyMcpServicesLayer = Layer.mergeAll(\n grokSearchLayer,\n tavilySearchLayer,\n dualSearchLayer,\n webFetchLayer,\n tavilyMapLayer,\n);\n\nexport const readOnlyMcpRegistrationLayer = Layer.effectDiscard(\n McpServer.registerToolkit(readOnlyMcpToolkit),\n).pipe(Layer.provideMerge(readOnlyMcpToolkitLayer));\n","import { Cause, Effect, Layer } from \"effect\";\nimport { McpServer } from \"effect/unstable/ai\";\nimport { Command } from \"effect/unstable/cli\";\nimport PackageJson from \"../../../package.json\" with { type: \"json\" };\nimport {\n readOnlyMcpRegistrationLayer,\n readOnlyMcpServicesLayer,\n} from \"../../services/read-only-mcp\";\n\nconst mcpStdioServerLayer = readOnlyMcpRegistrationLayer.pipe(\n Layer.provideMerge(\n McpServer.layerStdio({\n name: \"ultimate-search\",\n version: PackageJson.version,\n }),\n ),\n Layer.provideMerge(readOnlyMcpServicesLayer),\n);\n\nexport const commandMcpStdio = Command.make(\"stdio\").pipe(\n Command.withDescription(\"Serve the MCP protocol over stdio.\"),\n Command.withHandler(() =>\n Layer.launch(mcpStdioServerLayer).pipe(\n Effect.catchCauseIf(Cause.hasInterruptsOnly, () => Effect.void),\n ),\n ),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandMcpStdio } from \"./mcp/stdio\";\n\nexport const commandMcp = Command.make(\"mcp\").pipe(\n Command.withDescription(\"Expose ultimate-search over MCP transports.\"),\n Command.withSubcommands([commandMcpStdio]),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport { GrokProviderClient } from \"../../providers/grok/client\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../../providers/tavily/client\";\nimport { DualSearch, DualSearchInput } from \"../../services/dual-search\";\nimport { GrokSearch } from \"../../services/grok-search\";\nimport { TavilySearch } from \"../../services/tavily-search\";\nimport {\n optionalChoiceFlag,\n optionalIntegerFlag,\n optionalTrimmedTextFlag,\n} from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag, renderJsonText } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst dualCommandLayer = DualSearch.layer.pipe(\n Layer.provideMerge(GrokSearch.layer),\n Layer.provideMerge(TavilySearch.layer),\n Layer.provideMerge(GrokProviderClient.layer),\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nexport const commandSearchDual = Command.make(\n \"dual\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to both Grok and Tavily.\"),\n ),\n platform: optionalTrimmedTextFlag(\n \"platform\",\n \"Optional platform focus for the Grok branch such as GitHub or Reddit.\",\n ),\n model: optionalTrimmedTextFlag(\"model\", \"Override the configured Grok model.\"),\n searchDepth: optionalChoiceFlag(\n \"depth\",\n TavilySearchDepthSchema.literals,\n \"Optional Tavily search depth.\",\n ),\n maxResults: optionalIntegerFlag(\"max-results\", \"Optional number of Tavily results to return.\"),\n topic: optionalChoiceFlag(\n \"topic\",\n TavilySearchTopicSchema.literals,\n \"Optional Tavily topic focus.\",\n ),\n timeRange: optionalChoiceFlag(\n \"time-range\",\n TavilyTimeRangeSchema.literals,\n \"Optional Tavily recency window.\",\n ),\n includeAnswer: Flag.boolean(\"include-answer\").pipe(\n Flag.withDescription(\"Request a synthesized Tavily answer in the response.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* DualSearchInput.decodeEffect(input);\n const dualSearch = yield* DualSearch;\n const result = yield* dualSearch.search(request);\n\n return {\n human: renderJsonText(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Grok and Tavily search concurrently.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search search dual --query \"FastAPI latest features\" --depth advanced --include-answer',\n description: \"Run both providers and merge their status-tagged results into one JSON object.\",\n },\n ]),\n Command.provide(dualCommandLayer),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport { GrokProviderClient } from \"../../providers/grok/client\";\nimport { GrokSearchInput, type GrokSearchResult } from \"../../providers/grok/schema\";\nimport { GrokSearch } from \"../../services/grok-search\";\nimport { optionalTrimmedTextFlag } from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst grokCommandLayer = GrokSearch.layer.pipe(\n Layer.provideMerge(GrokProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanGrokResult = (result: GrokSearchResult) =>\n [\n result.content.trim().length > 0 ? result.content.trim() : \"Grok returned an empty response.\",\n \"\",\n `Model: ${result.model}`,\n `Tokens: ${result.usage.total_tokens} total (${result.usage.prompt_tokens} prompt, ${result.usage.completion_tokens} completion)`,\n ].join(\"\\n\");\n\nexport const commandSearchGrok = Command.make(\n \"grok\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to Grok.\"),\n ),\n platform: optionalTrimmedTextFlag(\n \"platform\",\n \"Optional platform focus such as GitHub or Reddit.\",\n ),\n model: optionalTrimmedTextFlag(\"model\", \"Override the configured Grok model.\"),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, () =>\n Effect.gen(function* () {\n const request = yield* GrokSearchInput.decodeEffect({\n query: input.query,\n platform: input.platform,\n model: input.model,\n });\n const grokSearch = yield* GrokSearch;\n const result = yield* grokSearch.search(request);\n\n return {\n human: renderHumanGrokResult(result),\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Grok-backed search.\"),\n Command.withExamples([\n {\n command: 'ultimate-search search grok --query \"FastAPI latest features\"',\n description: \"Run a Grok-backed web search with the configured model.\",\n },\n {\n command: 'ultimate-search search grok --query \"FastAPI latest features\" --output llm',\n description: \"Emit structured JSON for agent-driven workflows.\",\n },\n ]),\n Command.provide(grokCommandLayer),\n);\n","import { Effect, Layer } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { UltimateSearchConfig } from \"../../config/settings\";\nimport {\n TavilySearchDepthSchema,\n TavilySearchInput,\n type TavilySearchResponse,\n TavilySearchTopicSchema,\n TavilyTimeRangeSchema,\n} from \"../../providers/tavily/schema\";\nimport { TavilyProviderClient } from \"../../providers/tavily/client\";\nimport { TavilySearch } from \"../../services/tavily-search\";\nimport { optionalChoiceFlag, optionalIntegerFlag } from \"../../shared/cli-flags\";\nimport { runCommandWithOutput } from \"../../shared/command-output\";\nimport { outputFlag } from \"../../shared/output\";\nimport { trimmedNonEmptyStringSchema } from \"../../shared/schema\";\n\nconst tavilyCommandLayer = TavilySearch.layer.pipe(\n Layer.provideMerge(TavilyProviderClient.layer),\n Layer.provideMerge(UltimateSearchConfig.layer),\n);\n\nconst renderHumanTavilyResult = (result: TavilySearchResponse) => {\n const lines: Array<string> = [];\n\n if (result.answer != null && result.answer.trim().length > 0) {\n lines.push(result.answer.trim(), \"\");\n }\n\n if (result.response_time != null) {\n lines.push(`Response time: ${result.response_time}s`, \"\");\n }\n\n for (const [index, item] of result.results.entries()) {\n lines.push(`${index + 1}. ${item.title}`);\n lines.push(item.url);\n lines.push(item.content.trim());\n\n if (index < result.results.length - 1) {\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\").trim();\n};\n\nexport const commandSearchTavily = Command.make(\n \"tavily\",\n {\n query: Flag.string(\"query\").pipe(\n Flag.withSchema(trimmedNonEmptyStringSchema(\"query must be a non-empty string\")),\n Flag.withDescription(\"Search query to send to Tavily.\"),\n ),\n searchDepth: optionalChoiceFlag(\n \"depth\",\n TavilySearchDepthSchema.literals,\n \"Optional Tavily search depth.\",\n ),\n maxResults: optionalIntegerFlag(\"max-results\", \"Optional number of Tavily results to return.\"),\n topic: optionalChoiceFlag(\n \"topic\",\n TavilySearchTopicSchema.literals,\n \"Optional Tavily topic focus.\",\n ),\n timeRange: optionalChoiceFlag(\n \"time-range\",\n TavilyTimeRangeSchema.literals,\n \"Optional Tavily recency window.\",\n ),\n includeAnswer: Flag.boolean(\"include-answer\").pipe(\n Flag.withDescription(\"Request a synthesized Tavily answer in the response.\"),\n ),\n output: outputFlag,\n },\n Effect.fn(function* (input) {\n yield* runCommandWithOutput(input.output, (mode) =>\n Effect.gen(function* () {\n const request = yield* TavilySearchInput.decodeEffect(input);\n const tavilySearch = yield* TavilySearch;\n const result = yield* tavilySearch.search(request);\n\n return {\n human: mode === \"human\" ? renderHumanTavilyResult(result) : \"\",\n llm: result,\n };\n }),\n );\n }),\n).pipe(\n Command.withDescription(\"Run Tavily-backed search.\"),\n Command.withExamples([\n {\n command:\n 'ultimate-search search tavily --query \"FastAPI latest features\" --depth advanced --max-results 5',\n description: \"Run a Tavily-backed web search with optional search tuning.\",\n },\n ]),\n Command.provide(tavilyCommandLayer),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandSearchDual } from \"./search/dual\";\nimport { commandSearchGrok } from \"./search/grok\";\nimport { commandSearchTavily } from \"./search/tavily\";\n\nexport const commandSearch = Command.make(\"search\").pipe(\n Command.withDescription(\"Search the web with one or more providers.\"),\n Command.withSubcommands([commandSearchGrok, commandSearchTavily, commandSearchDual]),\n);\n","import { Command } from \"effect/unstable/cli\";\nimport { commandFetch } from \"./fetch\";\nimport { commandMap } from \"./map\";\nimport { commandMcp } from \"./mcp\";\nimport { commandSearch } from \"./search\";\n\nexport const commandRoot = Command.make(\"ultimate-search\").pipe(\n Command.withDescription(\"CLI entrypoint for search, fetch, map, and MCP workflows.\"),\n Command.withSubcommands([commandSearch, commandFetch, commandMap, commandMcp]),\n);\n","import { Cause, Duration, Effect, Fiber, Layer, Logger, LogLevel, Tracer } from \"effect\";\nimport { CurrentLoggers } from \"effect/Logger\";\nimport { MinimumLogLevel } from \"effect/References\";\n\nexport const TracingLayer = Layer.unwrap(\n Effect.gen(function* () {\n const logLevel = yield* MinimumLogLevel;\n\n if (LogLevel.isLessThan(\"Trace\", logLevel)) {\n return Layer.empty;\n }\n\n return tracerLayer;\n }),\n);\n\nconst tracerLayer = Effect.gen(function* () {\n const loggers = yield* CurrentLoggers;\n const tracer = yield* Tracer.Tracer;\n const fiber = Fiber.getCurrent()!;\n\n const log = (message: string, time: bigint) => {\n const date = new Date(Number(time / BigInt(1e6)));\n const options: Logger.Options<string> = {\n message,\n fiber,\n date,\n logLevel: \"Trace\",\n cause: Cause.empty,\n };\n\n loggers.forEach((logger) => {\n logger.log(options);\n });\n };\n\n return Tracer.make({\n span(options) {\n const span = tracer.span(options);\n log(`${options.name}: started`, options.startTime);\n const originalEnd = span.end;\n\n span.end = (endTime, cause) => {\n const duration = Duration.nanos(endTime - span.status.startTime);\n log(`${options.name}: completed. Took ${Duration.format(duration)}`, endTime);\n\n return originalEnd.call(span, endTime, cause);\n };\n\n return span;\n },\n });\n}).pipe(Layer.effect(Tracer.Tracer));\n","#!/usr/bin/env node\nimport { NodeHttpClient, NodeRuntime, NodeServices } from \"@effect/platform-node\";\nimport { ConfigProvider, Effect, Layer, Logger } from \"effect\";\nimport { Command } from \"effect/unstable/cli\";\nimport PackageJson from \"../package.json\" with { type: \"json\" };\nimport { commandRoot } from \"./commands/root\";\nimport { CliOutput, cliLoggerLayer } from \"./shared/output\";\nimport { TracingLayer } from \"./shared/tracing\";\n\nconst Live = Layer.mergeAll(\n NodeServices.layer,\n NodeHttpClient.layerFetch,\n cliLoggerLayer,\n CliOutput.layer,\n Layer.succeed(Logger.LogToStderr, true),\n).pipe(Layer.provide([TracingLayer, ConfigProvider.layer(ConfigProvider.fromEnv())]));\n\nNodeRuntime.runMain(\n Command.run(commandRoot, { version: PackageJson.version }).pipe(Effect.provide(Live)),\n { disableErrorReporting: true },\n);\n"],"mappings":"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"}
|