websearch.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. export * as WebSearch from "./websearch.js"
  2. import { Schema } from "effect"
  3. import { ephemeral, inventory } from "./event.js"
  4. import { optional } from "./schema.js"
  5. export const ID = Schema.String.pipe(Schema.brand("WebSearch.ID"))
  6. export type ID = typeof ID.Type
  7. export interface Provider extends Schema.Schema.Type<typeof Provider> {}
  8. export const Provider = Schema.Struct({
  9. id: ID,
  10. name: Schema.String,
  11. }).annotate({ identifier: "WebSearch.Provider" })
  12. export interface Input extends Schema.Schema.Type<typeof Input> {}
  13. export const Input = Schema.Struct({
  14. query: Schema.String,
  15. providerID: ID.pipe(optional),
  16. }).annotate({ identifier: "WebSearch.Input" })
  17. export type ProviderInput = Pick<Input, "query">
  18. export interface Result extends Schema.Schema.Type<typeof Result> {}
  19. export const Result = Schema.Struct({
  20. url: Schema.String,
  21. title: Schema.String.pipe(optional),
  22. content: Schema.String.pipe(optional),
  23. time: Schema.Struct({
  24. published: Schema.Finite.pipe(optional),
  25. }),
  26. }).annotate({ identifier: "WebSearch.Result" })
  27. export class Response extends Schema.Class<Response>("WebSearch.Response")({
  28. providerID: ID,
  29. results: Schema.Array(Result),
  30. }) {}
  31. const Updated = ephemeral({
  32. type: "websearch.updated",
  33. schema: {},
  34. })
  35. export const Event = { Updated, Definitions: inventory(Updated) }