{"version":3,"sources":["../src/index.ts","../src/chat.ts","../src/utils/streaming.ts","../src/content.ts","../src/cortex.ts","../src/document.ts","../src/catalog.ts","../src/indexers/local/json-indexer.ts","../src/indexers/local/directory-indexer.ts","../src/indexers/local/tsv-indexer.ts","../src/indexers/local/shopify-indexer.ts","../src/org.ts","../src/api-client.ts","../package.json","../src/indexers/hosted/indexer.ts","../src/client.ts"],"sourcesContent":["export * from \"./client\";\nexport * from \"./api-client\";\nexport * from \"./org\";\nexport * from \"./catalog\";\nexport * from \"./cortex\";\nexport * from \"./chat\";\nexport * from \"./content\";\nexport * from \"./document\";\nexport * from \"./indexers/local/directory-indexer\";\nexport * from \"./indexers/local/json-indexer\";\nexport * from \"./indexers/local/tsv-indexer\";\nexport * from \"./indexers/local/shopify-indexer\";\nexport * from \"./indexers/hosted/indexer\";\n","import { Cortex } from \"./cortex\";\nimport { CortexApiClient } from \"./api-client\";\nimport { Readable } from \"stream\";\nimport { processStream } from \"./utils/streaming\";\n\nexport interface CreateChatOptsBase {\n  client: CortexApiClient;\n  cortex: Cortex;\n  message: string;\n  stream?: boolean;\n  statusStream?: Readable;\n  externalUserId?: string;\n}\n\nexport interface CreateChatOptsStreaming extends CreateChatOptsBase {\n  stream?: true;\n}\n\nexport interface CreateChatOptsSync extends CreateChatOptsBase {\n  stream?: false;\n}\n\nexport type StreamingChatResult = {\n  readonly responseStream: Readable;\n  readonly chat: Promise<Chat>;\n};\n\nexport interface RespondChatOptsBase {\n  message: string;\n  cortex?: Cortex;\n  stream?: boolean;\n  statusStream?: Readable;\n}\n\nexport interface RespondChatOptsStreaming extends RespondChatOptsBase {\n  stream?: true;\n}\n\nexport interface RespondChatOptsSync extends RespondChatOptsBase {\n  stream?: false;\n}\n\nexport interface ChatListItem {\n  title: string;\n  id: string;\n  messageCount: number;\n  userEmail?: string;\n  cortexName: string;\n  createdAt: string;\n  externalUserId?: string;\n  Chat(): Promise<Chat>;\n}\nexport interface ChatListResult {\n  chats: ChatListItem[];\n  nextPage: () => Promise<ChatListResult>;\n}\nexport interface ChatListOpts {\n  cursor?: string;\n  pageSize?: number;\n  userEmail?: string | null;\n  externalUserId?: string;\n  cortexName?: string;\n}\n\nexport type Message = {\n  role: \"user\" | \"cortex\";\n  message: string;\n};\n\nexport class Chat {\n  private constructor(\n    private apiClient: CortexApiClient,\n    readonly id: string,\n    readonly title: string,\n    readonly messages: Message[],\n    readonly createdAt: string,\n    readonly userEmail?: string,\n    readonly externalUserId?: string,\n  ) {}\n\n  static async create(opts: CreateChatOptsSync): Promise<Chat>;\n  static async create(\n    opts: CreateChatOptsStreaming,\n  ): Promise<StreamingChatResult>;\n  static async create(\n    opts: CreateChatOptsSync | CreateChatOptsStreaming,\n  ): Promise<Chat | StreamingChatResult> {\n    if (isCreateChatOptsSync(opts)) {\n      return this.createContentSync(opts);\n    } else {\n      return this.createContentStreaming(opts);\n    }\n  }\n\n  private static async createContentSync(\n    opts: CreateChatOptsSync,\n  ): Promise<Chat> {\n    const { client, cortex, message, externalUserId } = opts;\n    const res = await client.POST(`/chats`, {\n      cortex: cortex.name,\n      message,\n      externalUserId,\n    });\n    const body = await res.json();\n    const messages: Message[] = [\n      {\n        role: \"user\",\n        message,\n      },\n      {\n        role: \"cortex\",\n        message: body.response,\n      },\n    ];\n    return new Chat(\n      client,\n      body.id,\n      body.title,\n      messages,\n      body.createdAt,\n      body.userEmail,\n      body.externalUserId,\n    );\n  }\n\n  private static async createContentStreaming(\n    opts: CreateChatOptsStreaming,\n  ): Promise<StreamingChatResult> {\n    const { client, cortex, message, externalUserId } = opts;\n    const res = await client.POST(`/chats`, {\n      cortex: cortex.name,\n      message,\n      stream: true,\n      externalUserId,\n    });\n    const reader = res.body!.getReader();\n    const decoder = new TextDecoder(\"utf-8\");\n\n    const id: string = res.headers.get(\"id\") || \"\";\n    const title: string = res.headers.get(\"title\") || \"\";\n    const createdAt: string = res.headers.get(\"createdAt\") || \"\";\n    const userEmail = res.headers.get(\"userEmail\") || undefined;\n\n    const readableStream = new Readable({\n      read() {},\n    });\n\n    const chatPromise = processStream(\n      reader,\n      decoder,\n      readableStream,\n      opts.statusStream,\n    ).then(([content]) => {\n      const messages: Message[] = [\n        {\n          role: \"user\",\n          message,\n        },\n        {\n          role: \"cortex\",\n          message: content,\n        },\n      ];\n      return new Chat(\n        client,\n        id,\n        title,\n        messages,\n        createdAt,\n        userEmail,\n        externalUserId,\n      );\n    });\n\n    return { responseStream: readableStream, chat: chatPromise };\n  }\n\n  static async get(client: CortexApiClient, id: string): Promise<Chat> {\n    const res = await client.GET(`/chats/${id}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to get chat: ${res.statusText}`);\n    }\n    const body = await res.json();\n    return new Chat(\n      client,\n      id,\n      body.title,\n      body.messages,\n      body.createdAt,\n      body.userEmail,\n      body.externalUserId,\n    );\n  }\n\n  static async list(\n    client: CortexApiClient,\n    opts?: ChatListOpts,\n  ): Promise<ChatListResult> {\n    const chats: ChatListItem[] = [];\n\n    const query = new URLSearchParams();\n    if (opts?.cursor) {\n      query.set(\"cursor\", opts.cursor);\n    }\n    if (opts?.userEmail) {\n      query.set(\"userEmail\", opts.userEmail);\n    } else if (opts?.userEmail === null) {\n      query.set(\"userEmail\", \"null\");\n    }\n    if (opts?.cortexName) {\n      query.set(\"cortexName\", opts.cortexName);\n    }\n    if (opts?.externalUserId) {\n      query.set(\"externalUserId\", opts.externalUserId);\n    }\n    query.set(\"pageSize\", (opts?.pageSize || 50).toString());\n    const res = await client.GET(`/chats?${query.toString()}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to list chats: ${res.statusText}`);\n    }\n    const body = await res.json();\n    for (const chat of body.chats) {\n      chats.push({\n        title: chat.title,\n        id: chat.chatId,\n        messageCount: chat.messageCount,\n        userEmail: chat.userEmail,\n        cortexName: chat.cortexName,\n        createdAt: chat.createdAt,\n        externalUserId: chat.externalUserId,\n        Chat: () => {\n          return Chat.get(client, chat.chatId);\n        },\n      });\n    }\n\n    const newCursor = body.cursor;\n    return {\n      chats,\n      nextPage: async () => Chat.list(client, { ...opts, cursor: newCursor }),\n    };\n  }\n\n  async respond(opts: RespondChatOptsSync): Promise<string>;\n  async respond(opts: RespondChatOptsStreaming): Promise<StreamingChatResult>;\n  async respond(\n    opts: RespondChatOptsSync | RespondChatOptsStreaming,\n  ): Promise<string | StreamingChatResult> {\n    if (isRespondChatOptsSync(opts)) {\n      return this.respondChatSync(opts);\n    } else {\n      return this.respondChatStreaming(opts);\n    }\n  }\n\n  private async respondChatSync(opts: RespondChatOptsSync): Promise<string> {\n    const { message, cortex } = opts;\n    const res = await this.apiClient.POST(`/chats/${this.id}`, {\n      message,\n      cortex,\n    });\n    const body = await res.json();\n    this.messages.push(\n      {\n        role: \"user\",\n        message,\n      },\n      {\n        role: \"cortex\",\n        message: body.response,\n      },\n    );\n\n    return body.response;\n  }\n\n  private async respondChatStreaming(\n    opts: RespondChatOptsStreaming,\n  ): Promise<StreamingChatResult> {\n    const { message, cortex } = opts;\n    const res = await this.apiClient.POST(`/chats/${this.id}`, {\n      message,\n      cortex,\n      stream: true,\n    });\n    const reader = res.body!.getReader();\n    const decoder = new TextDecoder(\"utf-8\");\n\n    const readableStream = new Readable({\n      read() {},\n    });\n\n    const chatPromise = processStream(\n      reader,\n      decoder,\n      readableStream,\n      opts.statusStream,\n    ).then(([content]) => {\n      this.messages.push(\n        {\n          role: \"user\",\n          message,\n        },\n        {\n          role: \"cortex\",\n          message: content,\n        },\n      );\n      return this;\n    });\n\n    return { responseStream: readableStream, chat: chatPromise };\n  }\n}\n\nfunction isCreateChatOptsSync(\n  opts: CreateChatOptsSync | CreateChatOptsStreaming,\n): opts is CreateChatOptsSync {\n  return opts.stream === false || opts.stream === undefined;\n}\n\nfunction isRespondChatOptsSync(\n  opts: RespondChatOptsSync | RespondChatOptsStreaming,\n): opts is RespondChatOptsSync {\n  return opts.stream === false || opts.stream === undefined;\n}\n","import { Readable } from \"stream\";\n\nexport async function processStream<Metadata extends Record<string, unknown>>(\n  reader: ReadableStreamDefaultReader<Uint8Array>,\n  decoder: TextDecoder,\n  contentStream: Readable,\n  statusStream?: Readable,\n): Promise<[string, Metadata | undefined]> {\n  let buffer = \"\";\n  let fullContent = \"\";\n  let isStatusStreamOpen = true;\n\n  let metadata: Metadata | undefined = undefined;\n\n  const processNextChunk = async (): Promise<void> => {\n    const { done, value } = await reader.read();\n    if (done) {\n      contentStream.push(null);\n      statusStream?.push(null);\n      isStatusStreamOpen = false;\n      return;\n    }\n\n    buffer += decoder.decode(value, { stream: true });\n    const lines = buffer.split(\"\\n\");\n\n    buffer = lines.pop() || \"\";\n\n    for (const line of lines) {\n      if (line.trim()) {\n        try {\n          const json = JSON.parse(line);\n          // t is an abbreviation for \"type\"\n          // t:c = content\n          if (json.messageType === \"content\") {\n            if (isStatusStreamOpen) {\n              statusStream?.push(null);\n              isStatusStreamOpen = false;\n            }\n\n            // m is the message\n            contentStream.push(json.message);\n            fullContent += json.message;\n          }\n          // t:s = status message\n          else if (json.messageType === \"status\" && statusStream) {\n            statusStream.push(line + \"\\n\");\n          } else if (json.messageType === \"metadata\") {\n            metadata = json.data;\n          }\n        } catch (e) {\n          console.error(\"Error parsing JSON:\", e);\n        }\n      }\n    }\n\n    await processNextChunk();\n  };\n\n  await processNextChunk().catch((error) => {\n    contentStream.emit(\"error\", error);\n  });\n\n  return [fullContent, metadata];\n}\n","import { Readable } from \"stream\";\nimport { CortexApiClient } from \"./api-client\";\nimport { Cortex } from \"./cortex\";\nimport { processStream } from \"./utils/streaming\";\n\nexport type ContentCommandType =\n  | \"ai-generate\"\n  | \"ai-refine\"\n  | \"ai-regenerate\"\n  | \"user-edit\"\n  | \"revert\";\n\nexport const ContentStatus = {\n  Draft: \"DRAFT\" as const,\n  InReview: \"IN_REVIEW\" as const,\n  Approved: \"APPROVED\" as const,\n  Published: \"PUBLISHED\" as const,\n};\nexport type ContentStatus = (typeof ContentStatus)[keyof typeof ContentStatus];\nexport type SettableContentStatus = \"DRAFT\" | \"IN_REVIEW\" | \"APPROVED\";\n\nexport interface CreateContentOptsBase {\n  client: CortexApiClient;\n  cortex: Cortex;\n  title: string;\n  prompt: string;\n  stream?: boolean;\n  statusStream?: Readable;\n}\n\nexport interface CreateContentOptsStreaming extends CreateContentOptsBase {\n  stream?: true;\n}\n\nexport interface CreateContentOptsSync extends CreateContentOptsBase {\n  stream?: false;\n}\n\nexport interface RefineContentOptsBase {\n  prompt: string;\n  stream?: boolean;\n  statusStream?: Readable;\n}\n\nexport interface RefineContentOptsStreaming extends RefineContentOptsBase {\n  stream?: true;\n}\n\nexport interface RefineContentOptsSync extends RefineContentOptsBase {\n  stream?: false;\n}\n\nexport type StreamingContentResult = {\n  readonly contentStream: Readable;\n  readonly content: Promise<Content>;\n};\n\ntype ContentCommand = {\n  commandType: ContentCommandType;\n  command?: string;\n  version: number;\n};\n\nexport type EditContentOpts = {\n  title?: string;\n  content?: string;\n};\n\nexport type ContentListItem = {\n  title: string;\n  latestVersion: number;\n  id: string;\n  userEmail?: string;\n  cortexName: string;\n  createdAt: string;\n  status: ContentStatus;\n  publishedVersion?: number;\n  Content(): Promise<Content>;\n};\n\nexport type ContentListResult = {\n  nextPage: () => Promise<ContentListResult>;\n  content: ContentListItem[];\n};\nexport type ContentListOptions = {\n  cursor?: string;\n  pageSize?: number;\n  userEmail?: string | null;\n  cortexName?: string;\n  status?: ContentStatus;\n};\n\nexport type ContentMetadata = {\n  id: string;\n  title: string;\n  version: number;\n  commands: ContentCommand[];\n  cortex: string;\n  createdAt: string;\n  userEmail: string;\n  status: ContentStatus;\n  publishedVersion: number | null;\n};\n\nexport type ContentPublishTarget = {\n  id: string;\n  name: string;\n  type: \"github_repo\";\n};\n\nexport type ContentFulfilledPublishTarget =\n  | {\n      id: string;\n      name: string;\n      type: \"github_repo\";\n      path: string;\n    }\n  | { id: \"none\"; type: \"none\" };\n\nexport class Content {\n  get id() {\n    return this._id;\n  }\n\n  get title() {\n    return this._title;\n  }\n\n  get content() {\n    return this._content;\n  }\n\n  get commands() {\n    return this._commands;\n  }\n\n  get version() {\n    return this._version;\n  }\n\n  get cortex() {\n    return this._cortex;\n  }\n\n  get userEmail() {\n    return this._userEmail;\n  }\n\n  get createdAt() {\n    return this._createdAt;\n  }\n\n  get status(): ContentStatus {\n    return this._status;\n  }\n\n  get publishedVersion(): number | undefined {\n    return this._publishedVersion;\n  }\n\n  private constructor(\n    private apiClient: CortexApiClient,\n    private _id: string,\n    private _title: string,\n    private _content: string,\n    private _commands: ContentCommand[],\n    private _version: number,\n    private _createdAt: string,\n    private _status: ContentStatus = \"DRAFT\",\n    private _cortex?: string,\n    private _userEmail?: string,\n    private _publishedVersion?: number,\n  ) {}\n\n  static async create(opts: CreateContentOptsSync): Promise<Content>;\n  static async create(\n    opts: CreateContentOptsStreaming,\n  ): Promise<StreamingContentResult>;\n  static async create(\n    opts: CreateContentOptsSync | CreateContentOptsStreaming,\n  ): Promise<Content | StreamingContentResult> {\n    // note: this if statement is annoying but is necessary to appropriately narrow the return type\n    if (isCreateContentOptsSync(opts)) {\n      return this.createContentSync(opts);\n    } else {\n      return this.createContentStreaming(opts);\n    }\n  }\n\n  private static async createContentSync(\n    opts: CreateContentOptsSync,\n  ): Promise<Content> {\n    const { client, cortex, title, prompt } = opts;\n    const res = await client.POST(`/content`, {\n      cortex: cortex.name,\n      title,\n      prompt,\n    });\n\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to create content: ${message}`);\n    }\n\n    const body = await res.json();\n\n    return new Content(\n      client,\n      body.id,\n      body.title,\n      body.content,\n      body.commands,\n      body.version,\n      body.createdAt,\n      body.status,\n      body.cortex,\n      body.userEmail,\n      numberOrUndefined(body.publishedVersion),\n    );\n  }\n\n  private static async createContentStreaming(\n    opts: CreateContentOptsStreaming,\n  ): Promise<StreamingContentResult> {\n    const { client, cortex, title, prompt, stream } = opts;\n    const res = await client.POST(`/content`, {\n      cortex: cortex.name,\n      title,\n      prompt,\n      stream,\n      noContentInHeaders: true,\n    });\n\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to create content: ${message}`);\n    }\n\n    const reader = res.body!.getReader();\n    const decoder = new TextDecoder(\"utf-8\");\n\n    const readableStream = new Readable({\n      read() {},\n    });\n\n    const contentPromise = processStream<ContentMetadata>(\n      reader,\n      decoder,\n      readableStream,\n      opts.statusStream,\n    ).then(([content, metadata]) => {\n      if (!metadata) {\n        throw new Error(\"Metadata not found in stream\");\n      }\n\n      return new Content(\n        client,\n        metadata.id,\n        metadata.title,\n        content,\n        metadata.commands,\n        metadata.version,\n        metadata.createdAt,\n        metadata.status,\n        metadata.cortex,\n        metadata.userEmail,\n        metadata.publishedVersion || undefined,\n      );\n    });\n\n    return { contentStream: readableStream, content: contentPromise };\n  }\n\n  static async get(\n    client: CortexApiClient,\n    id: string,\n    version?: number,\n  ): Promise<Content> {\n    let res: Response;\n    if (version !== undefined) {\n      res = await client.GET(`/content/${id}/version/${version}`);\n    } else {\n      res = await client.GET(`/content/${id}`);\n    }\n\n    if (res.status !== 200) {\n      throw new Error(`Failed to get content: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    return new Content(\n      client,\n      id,\n      body.title,\n      body.content,\n      body.commands,\n      body.version,\n      body.createdAt,\n      body.status,\n      body.cortex,\n      body.userEmail,\n      numberOrUndefined(body.publishedVersion),\n    );\n  }\n\n  async edit(opts: EditContentOpts) {\n    if (!opts.title && !opts.content) {\n      throw new Error(\n        \"must specify one of opts.title or opts.content to edit content\",\n      );\n    }\n\n    const res = await this.apiClient.PUT(`/content/${this._id}`, opts);\n\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to edit content: ${message}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  async refine(opts: RefineContentOptsSync): Promise<Content>;\n  async refine(\n    opts: RefineContentOptsStreaming,\n  ): Promise<StreamingContentResult>;\n  async refine(\n    opts: RefineContentOptsSync | RefineContentOptsStreaming,\n  ): Promise<Content | StreamingContentResult> {\n    if (isRefineContentOptsSync(opts)) {\n      return this.refineContentSync(opts);\n    } else {\n      return this.refineContentStreaming(opts);\n    }\n  }\n\n  private async refineContentSync(\n    opts: RefineContentOptsSync,\n  ): Promise<Content> {\n    const res = await this.apiClient.POST(`/content/${this._id}/refine`, {\n      prompt: opts.prompt,\n    });\n\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to refine content: ${message}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  private async refineContentStreaming(\n    opts: RefineContentOptsStreaming,\n  ): Promise<StreamingContentResult> {\n    const { prompt } = opts;\n    const res = await this.apiClient.POST(`/content/${this._id}/refine`, {\n      prompt,\n      stream: true,\n      noContentInHeaders: true,\n    });\n\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to refine content: ${message}`);\n    }\n\n    const reader = res.body!.getReader();\n    const decoder = new TextDecoder(\"utf-8\");\n\n    const readableStream = new Readable({\n      read() {},\n    });\n\n    const contentPromise = processStream<ContentMetadata>(\n      reader,\n      decoder,\n      readableStream,\n      opts.statusStream,\n    ).then(([content, metadata]) => {\n      if (!metadata) {\n        throw new Error(\"Metadata not found in stream\");\n      }\n\n      this._content = content;\n      this._version = metadata.version;\n      this._commands = metadata.commands;\n      this._createdAt = metadata.createdAt;\n      this._userEmail = metadata.userEmail;\n      this._status = metadata.status;\n      this._publishedVersion = metadata.publishedVersion || undefined;\n      this._title = metadata.title;\n      return this;\n    });\n\n    return { contentStream: readableStream, content: contentPromise };\n  }\n\n  async revert(version: number) {\n    const res = await this.apiClient.POST(\n      `/content/${this._id}/version/${version}`,\n    );\n\n    if (res.status > 201) {\n      throw new Error(`Failed to revert content: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  async setStatus(status: SettableContentStatus) {\n    const res = await this.apiClient.PUT(`/content/${this._id}/status`, {\n      status,\n    });\n\n    if (res.status > 201) {\n      throw new Error(`Failed to set content status: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  async publish(\n    publishTarget: ContentFulfilledPublishTarget = { id: \"none\", type: \"none\" },\n  ) {\n    const res = await this.apiClient.POST(`/content/${this._id}/publish`, {\n      publishTarget,\n    });\n\n    if (res.status > 201) {\n      throw new Error(`Failed to publish content: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  async unpublish() {\n    const res = await this.apiClient.POST(`/content/${this._id}/unpublish`);\n\n    if (res.status > 201) {\n      throw new Error(`Failed to unpublish content: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    this.updateFromResponseBody(body);\n\n    return this;\n  }\n\n  async getPublishTargets() {\n    const res = await this.apiClient.GET(`/content/${this._id}/publishTargets`);\n\n    if (res.status !== 200) {\n      throw new Error(\n        `Failed to get content publish targets: ${res.statusText}`,\n      );\n    }\n\n    const result = (await res.json()) as { targets: ContentPublishTarget[] };\n    return result.targets;\n  }\n\n  private updateFromResponseBody(body: Record<string, unknown>) {\n    this._commands = body.commands as ContentCommand[];\n    this._content = body.content as string;\n    this._title = body.title as string;\n    this._version = body.version as number;\n    this._cortex = body.cortex as string;\n    this._userEmail = body.userEmail as string | undefined;\n    this._createdAt = body.createdAt as string;\n    this._publishedVersion = numberOrUndefined(\n      body.publishedVersion as string | undefined,\n    );\n    this._status = body.status as ContentStatus;\n  }\n\n  static async list(\n    client: CortexApiClient,\n    opts?: ContentListOptions,\n  ): Promise<ContentListResult> {\n    const contentList: ContentListItem[] = [];\n\n    const query = new URLSearchParams();\n    if (opts?.cursor) {\n      query.set(\"cursor\", opts.cursor);\n    }\n    if (opts?.userEmail) {\n      query.set(\"userEmail\", opts.userEmail);\n    } else if (opts?.userEmail === null) {\n      query.set(\"userEmail\", \"null\");\n    }\n    if (opts?.cortexName) {\n      query.set(\"cortexName\", opts.cortexName);\n    }\n    if (opts?.status) {\n      query.set(\"status\", opts.status);\n    }\n    query.set(\"pageSize\", (opts?.pageSize || 50).toString());\n    const res = await client.GET(`/content?${query.toString()}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to list content: ${res.statusText}`);\n    }\n    const body = await res.json();\n    for (const content of body.content) {\n      contentList.push({\n        title: content.title,\n        latestVersion: content.latestVersion,\n        id: content.contentId,\n        userEmail: content.userEmail,\n        cortexName: content.cortexName,\n        createdAt: content.createdAt,\n        status: content.status,\n        publishedVersion: numberOrUndefined(content.publishedVersion),\n        Content: () => Content.get(client, content.contentId),\n      });\n    }\n\n    const newCursor = body.cursor;\n    return {\n      content: contentList,\n      nextPage: async () =>\n        Content.list(client, { ...opts, cursor: newCursor }),\n    };\n  }\n}\n\nfunction isCreateContentOptsSync(\n  opts: CreateContentOptsSync | CreateContentOptsStreaming,\n): opts is CreateContentOptsSync {\n  return opts.stream === false || opts.stream === undefined;\n}\n\nfunction isRefineContentOptsSync(\n  opts: RefineContentOptsSync | RefineContentOptsStreaming,\n): opts is RefineContentOptsSync {\n  return opts.stream === false || opts.stream === undefined;\n}\n\n// if a number (even 0), returns it\n// if a string, parses it as an int, unless its an empty string, in which case returns undefined\n// if undefined, returns undefined\nfunction numberOrUndefined(\n  val: number | string | undefined | null,\n): number | undefined {\n  switch (typeof val) {\n    case \"number\":\n      return val;\n    case \"string\":\n      return val === \"\" ? undefined : parseInt(val);\n    default:\n      return undefined;\n  }\n}\n","import { Readable } from \"stream\";\nimport { CortexApiClient } from \"./api-client\";\nimport { Chat, StreamingChatResult } from \"./chat\";\nimport { Content, StreamingContentResult } from \"./content\";\n\nexport type CortexConfig = {\n  /**\n   * The name that this Cortex should refer to itself as, (e.g. \"Acme Assistant\", \"Acme AI\")\n   */\n  friendlyName: string; // TODO add column to DB\n  /**\n   * The catalogs that should be referenced when generating content and answering questions\n   */\n  // TODO: this should accept \"string\" | Catalog\n  catalogs?: string[];\n  /**\n   * A complete description of the goal task and a list of steps this cortex should follow when generating content and answering questions.\n   */\n  instructions: string[];\n  /**\n   * Whether or not this Cortex should be available on the internet, without authentication. This is common for scenarios like publishing blog content, and customer support.\n   */\n  public: boolean;\n  /**\n   * fine-tuned control over the verbosity, tone, and rules that are used to generate content.\n   */\n  customizations?: {\n    /**\n     * A list or \"dos and dont's\" that the cortex should follow.\n     */\n    rules?: string[];\n    personality?: string[];\n    chatVerbosity?: string;\n    writeVerbosity?: string;\n  };\n  /**\n   * configuration for the built-in hosted chat UI.\n   */\n  chatConfig?: {\n    /**\n     * The initial greeting message rendered in chat.\n     */\n    greeting: string;\n    /**\n     * An introductory message that explains to users the purpose of this Cortex is and what it can help with.\n     */\n    intro: string;\n    /**\n     * A list of questions that will be rendered and suggested to users when they load the chat window.\n     */\n    examples: string[];\n  };\n  /**\n   * override org-level defaults\n   */\n  overrides?: {\n    /**\n     * Whether or not global org-level rules should be followed. Defaults to 'true'.\n     */\n    inheritRules?: boolean;\n    /**\n     * The company name\n     */\n    companyName?: string;\n    /**\n     * A description of your company, industry, and products and services provided.\n     */\n    companyInfo?: string;\n  };\n};\n\nexport interface CortexCreateContentOptsBase {\n  title: string;\n  prompt: string;\n  stream?: boolean;\n  statusStream?: Readable;\n}\n\nexport interface CortexContentOptsStreaming\n  extends CortexCreateContentOptsBase {\n  stream?: true;\n}\n\nexport interface CortexCreateContentOptsSync\n  extends CortexCreateContentOptsBase {\n  stream?: false;\n}\n\nexport interface CortexCreateChatOptsBase {\n  message: string;\n  stream?: boolean;\n  statusStream?: Readable;\n  externalUserId?: string;\n}\n\nexport interface CortexCreateChatOptsStreaming\n  extends CortexCreateChatOptsBase {\n  stream?: true;\n}\n\nexport interface CortexCreateChatOptsSync extends CortexCreateChatOptsBase {\n  stream?: false;\n}\n\nexport class Cortex {\n  private deleted = false;\n  private constructor(\n    readonly config: CortexConfig,\n    private apiClient: CortexApiClient,\n    readonly name: string,\n  ) {}\n\n  static async get(apiClient: CortexApiClient, name: string): Promise<Cortex> {\n    const res = await apiClient.GET(`/cortexes/${name}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to get cortex: ${res.statusText}`);\n    }\n    const body = await res.json();\n    const config: CortexConfig = {\n      catalogs: body.catalogs,\n      friendlyName: body.friendlyName,\n      instructions: body.instructions,\n      public: !!body.public,\n      chatConfig: {\n        examples: body.examples,\n        greeting: body.greeting,\n        intro: body.intro,\n      },\n      customizations: {\n        chatVerbosity: body.chatVerbosity,\n        writeVerbosity: body.writeVerbosity,\n        personality: body.personality,\n      },\n      overrides: {\n        companyInfo: body.companyInfo,\n        companyName: body.companyName,\n        inheritRules: body.inheritRules === false ? false : true,\n      },\n    };\n    return new Cortex(config, apiClient, name);\n  }\n\n  static async list(apiClient: CortexApiClient): Promise<Cortex[]> {\n    const res = await apiClient.GET(`/cortexes`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to list cortexes: ${res.statusText}`);\n    }\n\n    const cortexes: (CortexConfig & { name: string })[] = (await res.json())\n      .cortexes;\n    return cortexes.map((cortex) => new Cortex(cortex, apiClient, cortex.name));\n  }\n\n  static async configure(\n    apiClient: CortexApiClient,\n    name: string,\n    config: CortexConfig,\n  ): Promise<Cortex> {\n    const input: CortexConfigInput = {\n      cortexName: name,\n      friendlyName: config.friendlyName,\n      catalogs: config.catalogs,\n      chatVerbosity: config.customizations?.chatVerbosity,\n      writeVerbosity: config.customizations?.writeVerbosity,\n      companyInfo: config.overrides?.companyInfo,\n      companyName: config.overrides?.companyName,\n      examples: config.chatConfig?.examples,\n      greeting: config.chatConfig?.greeting,\n      intro: config.chatConfig?.intro,\n      inheritRules: config.overrides?.inheritRules === false ? false : true,\n      public: !!config.public,\n      instructions: config.instructions,\n      personality: config.customizations?.personality,\n      rules: config.customizations?.rules,\n    };\n    const getRes = await apiClient.GET(`/cortexes/${name}`);\n    let res: Response;\n    if (getRes.status !== 200) {\n      res = await apiClient.POST(\"/cortexes\", input);\n    } else {\n      res = await apiClient.PUT(`/cortexes/${name}`, input);\n    }\n\n    if (res.status > 201) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to configure cortex: ${message}`);\n    }\n    return new Cortex(config, apiClient, name);\n  }\n\n  async delete() {\n    this.checkDeleted();\n    this.deleted = true;\n    await this.apiClient.DELETE(`/cortexes/${this.name}`);\n    return;\n  }\n\n  async chat(opts: CortexCreateChatOptsSync): Promise<Chat>;\n  async chat(opts: CortexCreateChatOptsStreaming): Promise<StreamingChatResult>;\n  async chat(opts: CortexCreateChatOptsSync | CortexCreateChatOptsStreaming) {\n    if (opts.stream === true) {\n      return Chat.create({\n        client: this.apiClient,\n        cortex: this,\n        message: opts.message,\n        statusStream: opts.statusStream,\n        stream: true,\n        externalUserId: opts.externalUserId,\n      });\n    } else {\n      return Chat.create({\n        client: this.apiClient,\n        cortex: this,\n        message: opts.message,\n        statusStream: opts.statusStream,\n        stream: false,\n        externalUserId: opts.externalUserId,\n      });\n    }\n  }\n\n  async generateContent(opts: CortexCreateContentOptsSync): Promise<Content>;\n  async generateContent(\n    opts: CortexContentOptsStreaming,\n  ): Promise<StreamingContentResult>;\n  async generateContent(\n    opts: CortexCreateContentOptsSync | CortexContentOptsStreaming,\n  ) {\n    // note: this if statement is annoying but is necessary to appropriately narrow the return type\n    if (opts.stream === true) {\n      return Content.create({\n        client: this.apiClient,\n        cortex: this,\n        prompt: opts.prompt,\n        title: opts.title,\n        stream: true,\n        statusStream: opts.statusStream,\n      });\n    } else {\n      return Content.create({\n        client: this.apiClient,\n        cortex: this,\n        prompt: opts.prompt,\n        title: opts.title,\n        stream: false,\n        statusStream: opts.statusStream,\n      });\n    }\n  }\n\n  private checkDeleted() {\n    if (this.deleted) {\n      throw new Error(`cortex: ${this.name} has already been deleted`);\n    }\n  }\n}\n\ntype CortexConfigInput = {\n  cortexName: string;\n  friendlyName: string;\n  public: boolean;\n  inheritRules: boolean;\n  companyName?: string;\n  companyInfo?: string;\n  rules?: string[];\n  instructions: string[];\n  personality?: string[];\n  chatVerbosity?: string;\n  writeVerbosity?: string;\n  catalogs?: string[];\n  greeting?: string;\n  intro?: string;\n  examples?: string[];\n};\n","import { CortexApiClient } from \"./api-client\";\nimport { Catalog } from \"./catalog\";\n\nexport type UrlContentType = \"url\";\nexport type SitemapContentType = \"sitemap-url\";\nexport type TextContentType = \"text\" | \"markdown\";\nexport type JSONContentType = \"json\";\nexport type FileContentType = \"file\";\n\nexport type ContentType =\n  | FileContentType\n  | TextContentType\n  | JSONContentType\n  | UrlContentType\n  | SitemapContentType;\n\nexport type UrlDocument = {\n  url: string;\n  contentType: UrlContentType;\n};\n\nexport type SitemapDocument = {\n  sitemapUrl: string;\n  contentType: SitemapContentType;\n};\n\nexport type JSONDocument = {\n  documentId: string;\n  content: object;\n  contentType: JSONContentType;\n  url?: string;\n  imageUrl?: string;\n};\n\nexport type TextDocument = {\n  documentId: string;\n  content: string;\n  contentType: TextContentType;\n  url?: string;\n  imageUrl?: string;\n};\n\nexport type FileDocument = {\n  documentId: string;\n  contentType: FileContentType;\n  filePath: string;\n  url?: string;\n  imageUrl?: string;\n};\n\nexport type DocumentBatch =\n  | TextDocument[]\n  | JSONDocument[]\n  | FileDocument[]\n  | UrlDocument[]\n  | SitemapDocument[];\n\nexport type DocumentInput = {\n  documentId: string;\n  content?: string;\n  contentType: ContentType;\n  url?: string;\n  imageUrl?: string;\n};\n\nexport class Document {\n  private constructor(\n    readonly catalog: Catalog,\n    private apiClient: CortexApiClient,\n    readonly documentId: string,\n    readonly content: string,\n    readonly contentType: ContentType,\n    readonly url?: string,\n    readonly imageUrl?: string,\n  ) {}\n\n  static async get(\n    apiClient: CortexApiClient,\n    catalog: Catalog,\n    documentId: string,\n  ): Promise<Document> {\n    const res = await apiClient.GET(\n      `/catalogs/${catalog.name}/documents/${encodeURIComponent(documentId)}`,\n    );\n    if (res.status !== 200) {\n      throw new Error(`Failed to get document: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n\n    return new Document(\n      catalog,\n      apiClient,\n      documentId,\n      body.content,\n      body.contentType,\n      body.url,\n      body.imageUrl,\n    );\n  }\n\n  async delete() {\n    const res = await this.apiClient.DELETE(\n      `/catalogs/${this.catalog.name}/documents/${encodeURIComponent(this.documentId)}`,\n    );\n    if (res.status > 201) {\n      throw new Error(`Failed to delete document: ${res.statusText}`);\n    }\n  }\n}\n\nexport type DocumentListItem = {\n  documentId: string;\n  contentType: ContentType;\n  url?: string;\n  imageUrl?: string;\n  get: () => Promise<Document>;\n  delete: () => Promise<void>;\n};\n","import { CortexApiClient } from \"./api-client\";\nimport {\n  DocumentBatch,\n  DocumentInput,\n  FileDocument,\n  Document,\n  DocumentListItem,\n} from \"./document\";\nimport * as fs from \"node:fs\";\nimport { JSONIndexer, JSONIndexerOpts } from \"./indexers/local/json-indexer\";\nimport {\n  DirectoryIndexer,\n  DirectoryIndexerOpts,\n} from \"./indexers/local/directory-indexer\";\nimport { TSVIndexer, TSVIndexerOpts } from \"./indexers/local/tsv-indexer\";\nimport {\n  ShopifyIndexer,\n  ShopifyIndexerOpts,\n} from \"./indexers/local/shopify-indexer\";\n\nexport type CatalogConfig = {\n  description: string;\n  instructions: string[];\n};\n\nexport type CatalogListResult = {\n  name: string;\n  description: string;\n  documentCount: number;\n  Catalog(): Promise<Catalog>;\n};\n\nexport type DocumentListResult = {\n  documents: DocumentListItem[];\n  nextPage: () => Promise<DocumentListResult>;\n};\n\nexport type DocumentPaginationOpts = {\n  page: number;\n  pageSize?: number;\n};\n\nexport type CreateCatalogConfig = CatalogConfig & { catalogName: string };\n\nexport type UpsertDocumentsResult = { warnings: string[] };\n\nexport class Catalog {\n  private deleted = false;\n  private constructor(\n    readonly config: CatalogConfig,\n    private apiClient: CortexApiClient,\n    readonly name: string,\n  ) {}\n\n  static async get(apiClient: CortexApiClient, name: string): Promise<Catalog> {\n    const res = await apiClient.GET(`/catalogs/${name}`);\n    if (res.status > 201) {\n      throw new Error(`Failed to get catalog: ${res.statusText}`);\n    }\n    const body = await res.json();\n    const config: CatalogConfig = {\n      description: body.description,\n      instructions: body.instructions,\n    };\n    return new Catalog(config, apiClient, name);\n  }\n\n  static async configure(\n    apiClient: CortexApiClient,\n    name: string,\n    config: CatalogConfig,\n  ): Promise<Catalog> {\n    const createConfig: CreateCatalogConfig = {\n      ...config,\n      catalogName: name,\n    };\n    const getRes = await apiClient.GET(`/catalogs/${name}`);\n    let res: Response;\n    if (getRes.status === 200) {\n      res = await apiClient.PUT(`/catalogs/${name}`, config);\n    } else if (getRes.status === 404) {\n      res = await apiClient.POST(\"/catalogs\", createConfig);\n    } else {\n      const message =\n        getRes.status === 400 ? await getRes.text() : getRes.statusText;\n      throw new Error(`Failed to configure catalog: ${message}`);\n    }\n\n    if (res.status > 201) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to configure catalog: ${message}`);\n    }\n    return new Catalog(config, apiClient, name);\n  }\n\n  static async list(apiClient: CortexApiClient): Promise<CatalogListResult[]> {\n    const result: CatalogListResult[] = [];\n\n    const res = await apiClient.GET(`/catalogs`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to list catalog: ${res.statusText}`);\n    }\n    const body = await res.json();\n    for (const catalog of body.catalogs) {\n      result.push({\n        name: catalog.name,\n        description: catalog.description,\n        documentCount: parseInt(catalog.documentCount),\n        Catalog: () => {\n          return Catalog.get(apiClient, catalog.name);\n        },\n      });\n    }\n\n    return result;\n  }\n\n  public async documentCount() {\n    this.checkDeleted();\n    const res = await this.apiClient.GET(`/catalogs/${this.name}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to get catalog: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n    return parseInt(body.documentCount);\n  }\n\n  public async truncate() {\n    this.checkDeleted();\n    const res = await this.apiClient.POST(`/catalogs/${this.name}/truncate`);\n    if (res.status > 201) {\n      throw new Error(`Failed to get catalog: ${res.statusText}`);\n    }\n  }\n\n  public async upsertDocuments(\n    batch: DocumentBatch,\n  ): Promise<UpsertDocumentsResult> {\n    if (batch.length === 0) {\n      throw new Error(\"Document batch must not be empty\");\n    }\n\n    this.checkDeleted();\n    let hasText = false;\n    let hasFile = false;\n    let hasJson = false;\n    let hasUrl = false;\n    let hasSitemapUrl = false;\n    for (const [index, doc] of batch.entries()) {\n      const contentType = doc.contentType;\n      switch (contentType) {\n        case \"markdown\":\n        case \"text\":\n          hasText = true;\n          break;\n        case \"json\":\n          hasJson = true;\n          break;\n        case \"file\":\n          hasFile = true;\n          break;\n        case \"url\":\n          hasUrl = true;\n          break;\n        case \"sitemap-url\":\n          hasSitemapUrl = true;\n          break;\n        default:\n          throw new Error(\n            `Unsupported content type: ${contentType} for document at index ${index}`,\n          );\n      }\n    }\n\n    if (\n      [hasText, hasJson, hasFile, hasUrl, hasSitemapUrl].filter((v) => v)\n        .length > 1\n    ) {\n      throw new Error(\n        `cannot mix file, text, url, sitemap-url, json content in batch upsert. all documents in batch must have the same contentType.`,\n      );\n    }\n\n    const { blobs, documents } = await mapBatch(batch);\n    let res: Response;\n    if (blobs.length === 0) {\n      res = await this.apiClient.POST(`/catalogs/${this.name}/documents`, {\n        documents,\n      });\n    } else {\n      const fd = new FormData();\n      for (let i = 0; i < blobs.length; i++) {\n        const blob = blobs[i];\n        fd.append(\"files\", blob, (batch[i] as FileDocument).filePath);\n      }\n      fd.append(\"documentsJSON\", JSON.stringify(documents));\n      res = await this.apiClient.POSTForm(\n        `/catalogs/${this.name}/documents`,\n        fd,\n      );\n    }\n\n    if (res.status > 202) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to upsert documents: ${message}`);\n    }\n\n    const body = await res.json();\n\n    return { warnings: body?.warnings ?? [] };\n  }\n\n  public async delete() {\n    this.checkDeleted();\n    this.deleted = true;\n    await this.apiClient.DELETE(`/catalogs/${this.name}`);\n    return;\n  }\n\n  public async getDocument(documentId: string): Promise<Document> {\n    this.checkDeleted();\n    return Document.get(this.apiClient, this, documentId);\n  }\n\n  public async deleteDocument(documentId: string) {\n    this.checkDeleted();\n    const doc = await this.getDocument(documentId);\n    await doc.delete();\n  }\n\n  public async listDocuments(\n    paginationOpts?: DocumentPaginationOpts,\n  ): Promise<DocumentListResult> {\n    const { page, pageSize } = paginationOpts || { page: 1, pageSize: 50 };\n    const nextPageOpts: DocumentPaginationOpts = { page: page + 1, pageSize };\n    const nextPage = () => {\n      return this.listDocuments(nextPageOpts);\n    };\n\n    this.checkDeleted();\n    const res = await this.apiClient.GET(\n      `/catalogs/${this.name}/documents?page=${page}&pageSize=${pageSize}`,\n    );\n    if (res.status !== 200) {\n      throw new Error(`Failed to get document: ${res.statusText}`);\n    }\n\n    const body = await res.json();\n\n    return {\n      documents: body.documents || [],\n      nextPage,\n    };\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public jsonIndexer(documents: any[], opts?: JSONIndexerOpts) {\n    return new JSONIndexer(this, documents, opts);\n  }\n\n  public directoryIndexer(opts: DirectoryIndexerOpts) {\n    return new DirectoryIndexer(this, opts);\n  }\n\n  public tsvIndexer(file: string, opts?: TSVIndexerOpts) {\n    return new TSVIndexer(this, file, opts);\n  }\n\n  public shopifyIndexer(opts: ShopifyIndexerOpts) {\n    return new ShopifyIndexer(this, opts);\n  }\n\n  private checkDeleted() {\n    if (this.deleted) {\n      throw new Error(`cortex: ${this.name} has already been deleted`);\n    }\n  }\n}\n\nconst mapBatch = async (batch: DocumentBatch) => {\n  const blobs: Promise<Blob>[] = [];\n  const documents: DocumentInput[] = [];\n\n  for (const doc of batch) {\n    switch (doc.contentType) {\n      case \"markdown\":\n      case \"text\":\n        documents.push({\n          ...doc,\n        });\n        break;\n      case \"json\":\n        documents.push({\n          ...doc,\n          content: JSON.stringify(doc.content),\n        });\n        break;\n      case \"file\":\n        blobs.push(fs.openAsBlob(doc.filePath));\n        documents.push({\n          ...doc,\n          content: undefined,\n        });\n        break;\n      case \"url\":\n        documents.push({\n          documentId: doc.url,\n          contentType: \"url\",\n        });\n        break;\n      case \"sitemap-url\":\n        documents.push({\n          documentId: doc.sitemapUrl,\n          contentType: \"sitemap-url\",\n        });\n        break;\n      default:\n        throw new Error(\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          `unsupported content type: ${(doc as any).contentType}`,\n        );\n    }\n  }\n  const resolvedBlobs = await Promise.all(blobs);\n\n  return {\n    blobs: resolvedBlobs,\n    documents,\n  };\n};\n","import { Catalog } from \"../../catalog\";\nimport { JSONDocument } from \"../../document\";\n\n// intentionally operates on any type\n/* eslint-disable  @typescript-eslint/no-explicit-any */\n\nexport type JSONIndexerOpts = {\n  batchSize?: number;\n  getId?: (document: any) => string;\n  getUrl?: (document: any) => string | undefined;\n  getImageUrl?: (document: any) => string | undefined;\n};\n\nexport class JSONIndexer {\n  private readonly batchSize: number;\n  private readonly getId: (document: any) => string;\n  private readonly getImageUrl: (document: any) => string | undefined;\n  private readonly getUrl: (document: any) => string | undefined;\n  private batch: JSONDocument[] = [];\n\n  constructor(\n    private catalog: Catalog,\n    private documents: any[],\n    opts?: JSONIndexerOpts,\n  ) {\n    this.batchSize = opts?.batchSize ?? 50;\n    this.getId = opts?.getId ?? JSONIndexer.defaultGetId;\n    this.getUrl = opts?.getUrl ?? JSONIndexer.defaultGetUrl;\n    this.getImageUrl = opts?.getImageUrl ?? JSONIndexer.defaultGetImageUrl;\n  }\n\n  public static defaultGetId(document: any): string {\n    const id = JSONIndexer.findFirstMatchingProperty(\n      document,\n      \"id\",\n      \"Id\",\n      \"ID\",\n      \"documentId\",\n      \"documentID\",\n      \"DocumentId\",\n      \"DocumentID\",\n    );\n    if (!id) {\n      throw new Error(\n        \"All documents must contain an 'id' or 'documentId' field, or you must provide opts.getId when using JSONIndexer.\",\n      );\n    }\n\n    return id;\n  }\n\n  public static defaultGetUrl(document: any): string | undefined {\n    return JSONIndexer.findFirstMatchingProperty(document, \"url\");\n  }\n\n  public static defaultGetImageUrl(document: any): string | undefined {\n    return JSONIndexer.findFirstMatchingProperty(document, \"imageUrl\");\n  }\n\n  private static findFirstMatchingProperty(\n    document: any,\n    ...propertyNames: string[]\n  ): string | undefined {\n    for (const prop of propertyNames) {\n      if (prop in document) {\n        return document[prop];\n      }\n    }\n\n    return undefined;\n  }\n\n  public async index() {\n    await this.indexItems();\n  }\n\n  private async indexItems(): Promise<void> {\n    for (const document of this.documents) {\n      if (this.batch.length > this.batchSize) {\n        await this.catalog.upsertDocuments(this.batch);\n        this.batch = [];\n      }\n\n      this.batch.push({\n        documentId: this.getId(document),\n        imageUrl: this.getImageUrl(document),\n        url: this.getUrl(document),\n        content: document,\n        contentType: \"json\",\n      });\n    }\n\n    if (this.batch.length) {\n      await this.catalog.upsertDocuments(this.batch);\n      this.batch = [];\n    }\n  }\n}\n","import * as fs from \"node:fs\";\nimport { Catalog } from \"../../catalog\";\nimport { FileDocument } from \"../../document\";\n\nexport type DirectoryIndexerOpts = {\n  rootDir: string;\n  urlBase?: string;\n  batchSize?: number;\n  getUrl?: (docPathList: string[], sitePathList: string[]) => string;\n  getId?: (docPathList: string[], sitePathList: string[]) => string;\n  getImageUrl?: (docPathList: string[], sitePathList: string[]) => string;\n  includeFile?: (filePath: string) => boolean;\n  includeDirectory?: (path: string) => boolean;\n};\n\nexport class DirectoryIndexer {\n  private readonly batchSize: number;\n  private readonly rootDir: string;\n  private readonly urlBase?: string;\n  private files: FileDocument[] = [];\n  constructor(\n    public catalog: Catalog,\n    opts: DirectoryIndexerOpts,\n  ) {\n    this.rootDir = opts.rootDir;\n    this.urlBase = opts.urlBase;\n    this.batchSize = opts.batchSize ?? 25;\n\n    if (opts.includeFile) {\n      this.includeFile = opts.includeFile;\n    }\n\n    if (opts.includeDirectory) {\n      this.includeDirectory = opts.includeDirectory;\n    }\n\n    if (opts.getId) {\n      this.getId = opts.getId;\n    }\n\n    if (opts.getUrl) {\n      this.getUrl = opts.getUrl;\n    }\n\n    if (opts.getImageUrl) {\n      this.getImageUrl = opts.getImageUrl;\n    }\n  }\n\n  public async index() {\n    const sitePathList = this.urlBase ? [this.urlBase] : [];\n    await this.processDirectory([this.rootDir], sitePathList);\n    if (this.files.length) {\n      await this.catalog.upsertDocuments(this.files);\n      this.files = [];\n    }\n  }\n\n  private async processDirectory(\n    docPathList: string[],\n    sitePathList: string[],\n  ) {\n    const fileList = fs.readdirSync(docPathList.join(\"/\"));\n\n    for (const f of fileList) {\n      const path = [...docPathList, f].join(\"/\");\n      const stat = fs.lstatSync(path);\n      if (stat.isDirectory() && this.includeDirectory(f)) {\n        await this.processDirectory([...docPathList, f], [...sitePathList, f]);\n      }\n      if (stat.isFile() && this.includeFile(f)) {\n        await this.processDocument([...docPathList, f], [...sitePathList, f]);\n      }\n    }\n  }\n\n  private async processDocument(docPathList: string[], sitePathList: string[]) {\n    const id = this.getId([...docPathList], [...sitePathList]);\n    const url = this.getUrl([...docPathList], [...sitePathList]);\n    const imageUrl = this.getImageUrl([...docPathList], [...sitePathList]);\n    const docPath = docPathList.join(\"/\");\n\n    this.files.push({\n      documentId: id,\n      contentType: \"file\",\n      filePath: docPath,\n      imageUrl,\n      url,\n    });\n\n    if (this.files.length >= this.batchSize) {\n      await this.catalog.upsertDocuments(this.files);\n      this.files = [];\n    }\n  }\n\n  private getUrl(\n    _docPathList: string[],\n    _sitePathList: string[],\n  ): string | undefined {\n    return undefined;\n  }\n\n  private getId(_docPathList: string[], sitePathList: string[]): string {\n    return sitePathList.join(\"/\");\n  }\n\n  private getImageUrl(\n    _docPathList: string[],\n    _sitePathList: string[],\n  ): string | undefined {\n    return undefined;\n  }\n\n  private includeFile(filename: string): boolean {\n    return (\n      filename.endsWith(\".md\") ||\n      filename.endsWith(\".mdx\") ||\n      filename.endsWith(\".txt\") ||\n      filename.endsWith(\".docx\")\n    );\n  }\n\n  private includeDirectory(directoryName: string): boolean {\n    return directoryName !== \".\";\n  }\n}\n","import * as fs from \"node:fs\";\nimport { Catalog } from \"../../catalog\";\nimport { JSONIndexer } from \"./json-indexer\";\n\n// intentionally operates on any type\n/* eslint-disable  @typescript-eslint/no-explicit-any */\n\nexport type TSVIndexerOpts = {\n  batchSize?: number;\n  getId?: (item: any) => string;\n  getUrl?: (item: any) => string;\n  getImageUrl?: (item: any) => string;\n  fieldMapping?: { [key: string]: string };\n};\n\nexport class TSVIndexer {\n  private readonly getId: (document: any) => string;\n  private readonly getImageUrl: (document: any) => string | undefined;\n  private readonly getUrl: (document: any) => string | undefined;\n  private readonly fieldMapping: undefined | { [key: string]: string };\n  private readonly batchSize?: number;\n  private documents: any[] = [];\n\n  constructor(\n    public catalog: Catalog,\n    private file: string,\n    opts?: TSVIndexerOpts,\n  ) {\n    this.getId = opts?.getId ?? JSONIndexer.defaultGetId;\n    this.getUrl = opts?.getUrl ?? JSONIndexer.defaultGetUrl;\n    this.getImageUrl = opts?.getImageUrl ?? JSONIndexer.defaultGetImageUrl;\n    this.batchSize = opts?.batchSize;\n\n    if (opts?.fieldMapping) {\n      this.fieldMapping = opts?.fieldMapping;\n    }\n  }\n\n  public async index() {\n    await this.indexItems();\n  }\n\n  private async indexItems(): Promise<void> {\n    const content = fs.readFileSync(this.file).toString();\n    const rows = content.split(\"\\n\");\n    const header = rows[0].split(\"\\t\");\n    for (let i = 1; i < rows.length; i++) {\n      const row = rows[i].split(\"\\t\");\n      const document: { [key: string]: string } = {};\n      for (let j = 0; j < header.length; j++) {\n        if (this.fieldMapping) {\n          if (this.fieldMapping[header[j]]) {\n            document[this.fieldMapping[header[j]]] = row[j];\n          }\n        } else {\n          document[header[j]] = row[j];\n        }\n      }\n\n      // Note that this should generate a document whose id, imageUrl, url properties can be picked up by JSON indexer using the defaßult options\n      this.documents.push({\n        documentId: this.getId(document),\n        content: document,\n        contentType: \"json\",\n        imageUrl: this.getImageUrl(document),\n        url: this.getUrl(document),\n      });\n    }\n\n    const jsonIndexer = this.catalog.jsonIndexer(this.documents, {\n      batchSize: this.batchSize,\n    });\n\n    await jsonIndexer.index();\n  }\n}\n","import { Catalog } from \"../../catalog\";\n\ntype Product = {\n  id: string;\n  title: string;\n  description: string;\n  productType: string;\n  imageUrl: string | undefined;\n  price: string;\n  vendor: string;\n  tags: string | undefined;\n  url: string;\n};\n\nexport type ShopifyIndexerOpts = {\n  shopifyBaseUrl: string;\n  maxItems?: number;\n  batchSize?: number;\n};\n\nexport class ShopifyIndexer {\n  private readonly batchSize: number;\n  private documents: Product[] = [];\n  private deletes: Promise<void>[] = [];\n  private idsToDelete: string[] = [];\n  private page = 1;\n  constructor(\n    private catalog: Catalog,\n    private opts: ShopifyIndexerOpts,\n  ) {\n    this.batchSize = opts.batchSize ?? 25;\n  }\n\n  private stripHTML(input: string) {\n    return input.replace(/<\\/?[^>]+(>|$)/g, \"\");\n  }\n\n  public async index() {\n    let moreItems = true;\n    while (moreItems) {\n      const req = await fetch(\n        `${this.opts.shopifyBaseUrl}/products.json?page=${this.page}`,\n        {\n          method: \"GET\",\n        },\n      );\n\n      const res = await req.json();\n\n      if (!res.products || !res.products.length) {\n        moreItems = false;\n        continue;\n      }\n      this.page = this.page + 1;\n\n      for (const item of res.products) {\n        let available = false;\n        for (const v of item.variants) {\n          available = available || v.available;\n        }\n        if (!available) {\n          this.idsToDelete.push(item.id);\n          continue;\n        }\n        let imageUrl = undefined;\n        if (item.images && item.images[0]) {\n          if (item.images[0].src) {\n            imageUrl = item.images[0].src;\n          } else if (\n            item.variants &&\n            item.variants[0] &&\n            item.variants[0].featured_image\n          ) {\n            imageUrl = item.variants[0].featured_image.src;\n          }\n        }\n\n        if (this.opts.maxItems && this.documents.length >= this.opts.maxItems) {\n          moreItems = false;\n          break;\n        }\n\n        this.documents.push({\n          id: item.id.toString(),\n          title: item.title,\n          description: this.stripHTML(item.body_html),\n          productType: item.product_type,\n          imageUrl: imageUrl,\n          price: item.variants[0].price,\n          vendor: item.vendor,\n          tags: item.tags ? JSON.stringify(item.tags) : undefined,\n          url: `${this.opts.shopifyBaseUrl}/products/${item.handle}`,\n        });\n      }\n    }\n\n    await this.indexProducts();\n    await this.deleteProducts();\n  }\n\n  private async indexProducts(): Promise<void> {\n    const indexer = this.catalog.jsonIndexer(this.documents, {\n      batchSize: this.batchSize,\n    });\n    await indexer.index();\n  }\n\n  private async deleteProducts(): Promise<void> {\n    for (const id of this.idsToDelete) {\n      if (this.deletes.length >= this.batchSize) {\n        await Promise.all(this.deletes);\n        this.deletes = [];\n      }\n\n      const res = this.catalog.deleteDocument(id).catch(() => {});\n      this.deletes.push(res);\n    }\n\n    await Promise.all(this.deletes);\n    this.deletes = [];\n    return;\n  }\n}\n","import { CortexApiClient } from \"./api-client\";\n\nexport type OrgConfigOpts = {\n  companyName: string;\n  companyInfo: string;\n  personality?: string[];\n  rules?: string[];\n};\n\nexport class OrgConfig {\n  /**\n   * The default name that all your company should be referred to in all writen content.\n   */\n  readonly companyName: string;\n  /**\n   * A description of your company, industry, and products and services provided.\n   */\n  readonly companyInfo: string;\n  /**\n   * Voice and tone descriptors applied to all written content. i.e. [\"concise\", \"professional\", \"bubbly\", ... ]\n   */\n  readonly personality?: string[];\n  /**\n   * A list of dos and don'ts that all written content should follow. i.e. [\"do not speak disparigingly about X\"]\n   */\n  readonly rules?: string[];\n  private constructor(input: OrgConfigOpts) {\n    this.companyName = input.companyName;\n    this.companyInfo = input.companyInfo;\n    this.personality = input.personality;\n    this.rules = input.rules;\n  }\n\n  static async get(client: CortexApiClient): Promise<OrgConfig> {\n    const res = await client.GET(\"/orgConfig\");\n    if (res.status !== 200) {\n      throw new Error(`Failed to configure cortex: ${res.statusText}`);\n    }\n    const body = await res.json();\n    const input: OrgConfigOpts = {\n      companyName: body.companyName,\n      companyInfo: body.companyInfo,\n      personality: body.personality,\n      rules: body.rules,\n    };\n    return new OrgConfig(input);\n  }\n\n  static async configure(\n    client: CortexApiClient,\n    config: OrgConfigOpts,\n  ): Promise<OrgConfig> {\n    const getRes = await client.GET(\"/orgConfig\");\n    let res: Response;\n    if (getRes.status !== 200) {\n      res = await client.POST(\"/orgConfig\", config);\n    } else {\n      res = await client.PUT(\"/orgConfig\", config);\n    }\n\n    if (res.status > 201) {\n      throw new Error(`Failed to configure org: ${res.statusText}`);\n    }\n\n    return new OrgConfig(config);\n  }\n}\n","import Path from \"node:path\";\n\nimport { version } from \"../package.json\";\n\ntype Method = \"POST\" | \"GET\" | \"PUT\" | \"DELETE\";\n\n// body can be any object\n/* eslint-disable  @typescript-eslint/no-explicit-any */\n\nexport class CortexApiClient {\n  private readonly maxRequestSize = 32 * 1000 * 1000; // API is configured with max request body size of 32mb\n\n  constructor(\n    private org: string,\n    private apiUrl: string,\n    private accessToken: string,\n    private apiVersion: string = \"v1\",\n  ) {}\n\n  async POST(path: string, body?: any) {\n    return this.makeRequest(\"POST\", path, body);\n  }\n\n  async PUT(path: string, body?: any) {\n    return this.makeRequest(\"PUT\", path, body);\n  }\n\n  async GET(path: string, body?: any) {\n    return this.makeRequest(\"GET\", path, body);\n  }\n\n  async DELETE(path: string, body?: any) {\n    return this.makeRequest(\"DELETE\", path, body);\n  }\n\n  async POSTForm(path: string, form: FormData) {\n    const requestSize = CortexApiClient.getFormDataSize(form);\n    if (requestSize > this.maxRequestSize) {\n      throw new Error(\"Request body too large\");\n    }\n\n    const url = Path.posix.join(\n      this.apiUrl,\n      this.apiVersion,\n      \"org\",\n      this.org,\n      path,\n    );\n    return fetch(url, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.accessToken}`,\n        \"User-Agent\": `cortex-js-sdk/${version}`,\n      },\n      body: form,\n    });\n  }\n\n  private async makeRequest(method: Method, path: string, body?: any) {\n    const requestBody = body ? JSON.stringify(body) : undefined;\n    // Note that we use character size instead of byte size. This is still a useful heuristic as we don't want to incur the overhead\n    // of using TextEncoder to calculate the precise byte count\n    if (requestBody && requestBody.length > this.maxRequestSize) {\n      throw new Error(\"Request body too large\");\n    }\n\n    const url = Path.posix.join(\n      this.apiUrl,\n      this.apiVersion,\n      \"org\",\n      this.org,\n      path,\n    );\n    return fetch(url, {\n      method,\n      headers: {\n        Authorization: `Bearer ${this.accessToken}`,\n        \"Content-Type\": \"application/json\",\n        \"User-Agent\": `cortex-js-sdk-v${version}`,\n      },\n      body: requestBody,\n    });\n  }\n\n  private static getFormDataSize(formData: FormData) {\n    return [...formData].reduce(\n      (size, [_, value]) =>\n        // Use heuristic of string length instead of byte size, to avoid incurring the cost of using TextEncoder\n        size + (typeof value === \"string\" ? value.length : value.size),\n      0,\n    );\n  }\n}\n","{\n  \"devDependencies\": {\n    \"@types/express\": \"^4.17.21\",\n    \"@types/node\": \"^20.14.6\",\n    \"@typescript-eslint/eslint-plugin\": \"^7.13.1\",\n    \"@typescript-eslint/parser\": \"^7.13.1\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-prettier\": \"^9.1.0\",\n    \"globals\": \"^15.6.0\",\n    \"prettier\": \"3.3.2\",\n    \"ts-node\": \"^10.9.2\",\n    \"tsup\": \"^8.2.2\",\n    \"typescript\": \"^5.4.5\",\n    \"typescript-eslint\": \"^7.13.1\",\n    \"vitest\": \"^1.6.0\"\n  },\n  \"name\": \"@cortexclick/cortex\",\n  \"repository\": {\n    \"url\": \"https://github.com/cortexclick/cortex-sdk\",\n    \"type\": \"git\"\n  },\n  \"version\": \"0.0.14\",\n  \"type\": \"module\",\n  \"main\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"files\": [\n    \"dist\",\n    \"src\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"clean\": \"rm -rf dist\",\n    \"lint\": \"prettier --list-different . && eslint . --ext .ts || exit 1\",\n    \"lint-fix\": \"prettier --write . && eslint . --ext .ts --fix\",\n    \"dev\": \"node --watch -r ts-node/register index.ts\",\n    \"run\": \"npm run build && node index.js\",\n    \"test\": \"vitest\",\n    \"test:package:dev\": \"npm run build && pulumi env run cortexclick/default/npm-test node ./test-package.js\",\n    \"test:package:ci\": \"npm run build && node ./test-package.js\",\n    \"test:fast\": \"vitest run --exclude src/content.test.ts\",\n    \"test:dev\": \"CORTEX_API_URL=http://localhost:3001 pulumi env run cortexclick/default/npm-test npm run test\",\n    \"test:ci\": \"vitest run\",\n    \"test:prod\": \"pulumi env run npm-test npm run test\",\n    \"test:fast:dev\": \"CORTEX_API_URL=http://localhost:3001 pulumi env run cortexclick/default/npm-test npm run test:fast\",\n    \"test:fast:prod\": \"pulumi env run cortexclick/default/npm-test npm run test:fast\",\n    \"test:indexers:dev\": \"CORTEX_API_URL=http://localhost:3001 pulumi env run cortexclick/default/npm-test vitest indexers.test.ts\",\n    \"test:scraping:dev\": \"RUN_SCRAPER_TESTS=true CORTEX_API_URL=https://api-dev.cortexclick.com pulumi env run cortexclick/default/npm-test vitest scraping.test.ts\",\n    \"test:scraping:prod\": \"RUN_SCRAPER_TESTS=true CORTEX_API_URL=https://api.cortexclick.com pulumi env run cortexclick/default/npm-test vitest scraping.test.ts\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"Apache-2.0\",\n  \"description\": \"\",\n  \"dependencies\": {\n    \"form-data\": \"^4.0.0\"\n  }\n}\n","import { setTimeout } from \"timers/promises\";\nimport { CortexApiClient } from \"../../api-client\";\n\nexport type IndexerExecutionStatus = \"success\" | \"failure\" | \"inProgress\";\n\nexport type IndexerExecutionResult = {\n  status: IndexerExecutionStatus;\n  startTimeUtc: string;\n  endTimeUtc?: string;\n  errors: string[];\n  warnings: string[];\n};\n\nexport type IndexerExecutionHistory = {\n  results: IndexerExecutionResult[]; // the size of this array is bounded to the most recent 100 executions\n};\n\nexport type WebScraperDataSourceConfig = {\n  // List of sitemap urls.\n  // Exactly one of sitemaps or urls must be present\n  sitemaps?: string[];\n  // List of urls\n  urls?: string[];\n  // If specified, only the urls (after sitemap expanstion, if any) matching any of these prefixes are indexed\n  // At most one of urlPrefixesToInclude and urlPrefixesToExclude can be present\n  urlPrefixesToInclude?: string[];\n  // If specified, the urls (after sitemap expanstion, if any) matching any of these prefixes are excluded from indexing\n  urlPrefixesToExclude?: string[];\n};\n\nexport type GithubDataSourceConfig = {\n  owner: string;\n  repo: string;\n  code?: { branch?: string; pathPatterns?: string[] };\n};\n\nexport type IndexerDataSource =\n  | {\n      type: \"webScraper\";\n      config: WebScraperDataSourceConfig;\n    }\n  | {\n      type: \"github\";\n      config: GithubDataSourceConfig;\n    };\n\nexport type IndexerDataTarget = {\n  catalogName: string;\n};\n\nexport enum IndexerScheduleFrequency {\n  OnDemand = \"once\", // Note the different from the REST API, which uses \"once\"\n  Daily = \"daily\",\n  Weekly = \"weekly\",\n  Monthly = \"monthly\",\n}\n\nexport type IndexerSchedule = {\n  frequency: IndexerScheduleFrequency;\n};\n\nexport type IndexerConfig = {\n  name: string;\n  dataSource: IndexerDataSource;\n  dataTarget: IndexerDataTarget;\n  schedule: IndexerSchedule;\n};\n\nexport type RunOptions = { waitForCompletion: boolean };\n\nexport class Indexer {\n  private constructor(\n    readonly config: IndexerConfig,\n    private readonly apiClient: CortexApiClient,\n  ) {}\n\n  static async get(apiClient: CortexApiClient, name: string): Promise<Indexer> {\n    const res = await apiClient.GET(`/indexers/${name}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to get indexer: ${res.statusText}`);\n    }\n    const config = await res.json();\n    return new Indexer(config, apiClient);\n  }\n\n  static async create(\n    apiClient: CortexApiClient,\n    name: string,\n    catalogName: string,\n    schedule: IndexerScheduleFrequency,\n    dataSource: IndexerDataSource,\n  ): Promise<Indexer> {\n    const indexer: IndexerConfig = {\n      name,\n      dataSource,\n      dataTarget: { catalogName },\n      schedule: { frequency: schedule },\n    };\n    const res = await apiClient.POST(`/indexers`, indexer);\n    if (res.status !== 201) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to create indexer: ${message}`);\n    }\n    return new Indexer(indexer, apiClient);\n  }\n\n  static async list(apiClient: CortexApiClient): Promise<Indexer[]> {\n    const res = await apiClient.GET(`/indexers`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to list indexers: ${res.statusText}`);\n    }\n\n    const indexers: IndexerConfig[] = (await res.json()).indexers;\n    return indexers.map((indexer) => new Indexer(indexer, apiClient));\n  }\n\n  async update(): Promise<void> {\n    const res = await this.apiClient.PUT(\n      `/indexers/${this.config.name}`,\n      this.config,\n    );\n    if (res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to update indexer: ${message}`);\n    }\n  }\n\n  async delete(): Promise<void> {\n    const res = await this.apiClient.DELETE(`/indexers/${this.config.name}`);\n    if (res.status !== 200) {\n      throw new Error(`Failed to delete indexer: ${res.statusText}`);\n    }\n  }\n\n  async run(): Promise<void>;\n  async run(options: { waitForCompletion: false }): Promise<void>;\n  async run(options: {\n    waitForCompletion: true;\n  }): Promise<IndexerExecutionResult>;\n  async run(options?: RunOptions): Promise<void | IndexerExecutionResult> {\n    const res = await this.apiClient.POST(`/indexers/${this.config.name}/run`);\n    // 200 is returned if the indexer was already running, 202 is returned if the indexer was started\n    if (res.status !== 202 && res.status !== 200) {\n      const message = res.status === 400 ? await res.text() : res.statusText;\n      throw new Error(`Failed to run indexer: ${message}`);\n    }\n\n    if (!options?.waitForCompletion) {\n      return;\n    }\n\n    let executionResult: IndexerExecutionResult | undefined;\n    while (!executionResult) {\n      const history: IndexerExecutionHistory = await this.getExecutionHistory();\n      if (\n        history &&\n        history.results.length > 0 &&\n        history.results[0].status !== \"inProgress\"\n      ) {\n        executionResult = history.results[0];\n      } else {\n        await setTimeout(500);\n      }\n    }\n    return executionResult;\n  }\n\n  async getExecutionHistory(): Promise<IndexerExecutionHistory> {\n    const res = await this.apiClient.GET(\n      `/indexers/${this.config.name}/history`,\n    );\n    if (res.status !== 200) {\n      throw new Error(\n        `Failed to get indexer execution history: ${res.statusText}`,\n      );\n    }\n    return await res.json();\n  }\n}\n","import { Cortex, CortexConfig } from \"./cortex\";\nimport { Catalog, CatalogConfig } from \"./catalog\";\nimport { OrgConfigOpts, OrgConfig } from \"./org\";\nimport { CortexApiClient } from \"./api-client\";\nimport { Chat, StreamingChatResult } from \"./chat\";\nimport { Content, ContentStatus, StreamingContentResult } from \"./content\";\nimport { Readable } from \"stream\";\nimport {\n  GithubDataSourceConfig,\n  Indexer,\n  IndexerScheduleFrequency,\n  WebScraperDataSourceConfig,\n} from \"./indexers/hosted/indexer\";\n\nexport type CortexClientArgs = {\n  org: string;\n  accessToken: string;\n  apiUrl?: string;\n};\n\nexport interface ClientCreateContentOptsBase {\n  cortex: Cortex;\n  title: string;\n  prompt: string;\n  stream?: boolean;\n  statusStream?: Readable;\n}\nexport interface ClientCreateContentOptsSync\n  extends ClientCreateContentOptsBase {\n  stream?: false;\n}\nexport interface ClientCreateContentOptsStreaming\n  extends ClientCreateContentOptsBase {\n  stream?: true;\n}\n\nexport interface ClientCreateChatOptsBase {\n  message: string;\n  cortex: Cortex;\n  stream?: boolean;\n  statusStream?: Readable;\n}\n\nexport interface ClientCreateChatOptsStreaming\n  extends ClientCreateChatOptsBase {\n  stream?: true;\n}\n\nexport interface ClientCreateChatOptsSync extends ClientCreateChatOptsBase {\n  stream?: false;\n}\n\nexport interface ClientListContentOpts {\n  pageSize?: number;\n  cursor?: string;\n  userEmail?: string | null;\n  cortexName?: string;\n  status?: ContentStatus;\n}\nexport interface ClientListChatOpts {\n  pageSize?: number;\n  cursor?: string;\n  userEmail?: string | null;\n  externalUserId?: string;\n  cortexName?: string;\n}\n\nconst apiUrl = process.env.CORTEX_API_URL || \"https://api.cortexclick.com\";\n\nexport class CortexClient {\n  private apiClient: CortexApiClient;\n  constructor(args: CortexClientArgs) {\n    const url: string = args.apiUrl || apiUrl;\n    this.apiClient = new CortexApiClient(args.org, url, args.accessToken);\n  }\n\n  async chat(opts: ClientCreateChatOptsSync): Promise<Chat>;\n  async chat(opts: ClientCreateChatOptsStreaming): Promise<StreamingChatResult>;\n  async chat(\n    opts: ClientCreateChatOptsSync | ClientCreateChatOptsStreaming,\n  ): Promise<Chat | StreamingChatResult> {\n    if (opts.stream === true) {\n      return Chat.create({\n        client: this.apiClient,\n        cortex: opts.cortex,\n        message: opts.message,\n        stream: true,\n        statusStream: opts.statusStream,\n      });\n    } else {\n      return Chat.create({\n        client: this.apiClient,\n        cortex: opts.cortex,\n        message: opts.message,\n        stream: false,\n        statusStream: opts.statusStream,\n      });\n    }\n  }\n\n  async getChat(id: string) {\n    return Chat.get(this.apiClient, id);\n  }\n\n  async generateContent(opts: ClientCreateContentOptsSync): Promise<Content>;\n  async generateContent(\n    opts: ClientCreateContentOptsStreaming,\n  ): Promise<StreamingContentResult>;\n  async generateContent(\n    opts: ClientCreateContentOptsSync | ClientCreateContentOptsStreaming,\n  ) {\n    // note: this if statement is annoying but is necessary to appropriately narrow the return type\n    if (opts.stream === true) {\n      return Content.create({\n        client: this.apiClient,\n        cortex: opts.cortex,\n        prompt: opts.prompt,\n        title: opts.title,\n        stream: true,\n        statusStream: opts.statusStream,\n      });\n    } else {\n      return Content.create({\n        client: this.apiClient,\n        cortex: opts.cortex,\n        prompt: opts.prompt,\n        title: opts.title,\n        stream: false,\n        statusStream: opts.statusStream,\n      });\n    }\n  }\n\n  async getContent(id: string, version?: number) {\n    return Content.get(this.apiClient, id, version);\n  }\n\n  async listContent(options?: ClientListContentOpts) {\n    return Content.list(this.apiClient, options);\n  }\n  async listChats(options?: ClientListChatOpts) {\n    return Chat.list(this.apiClient, options);\n  }\n\n  async getCortex(name: string): Promise<Cortex> {\n    return Cortex.get(this.apiClient, name);\n  }\n\n  async listCortexes(): Promise<Cortex[]> {\n    return Cortex.list(this.apiClient);\n  }\n\n  async configureCortex(name: string, opts: CortexConfig): Promise<Cortex> {\n    return Cortex.configure(this.apiClient, name, opts);\n  }\n\n  async configureOrg(opts: OrgConfigOpts): Promise<OrgConfig> {\n    return OrgConfig.configure(this.apiClient, opts);\n  }\n\n  async getOrgConfig() {\n    return OrgConfig.get(this.apiClient);\n  }\n\n  async getCatalog(name: string) {\n    return Catalog.get(this.apiClient, name);\n  }\n\n  async configureCatalog(name: string, opts: CatalogConfig) {\n    return Catalog.configure(this.apiClient, name, opts);\n  }\n\n  async listCatalogs() {\n    return Catalog.list(this.apiClient);\n  }\n\n  async createWebScraperIndexer(\n    name: string,\n    catalogName: string,\n    schedule: IndexerScheduleFrequency,\n    config: WebScraperDataSourceConfig,\n  ): Promise<Indexer> {\n    return Indexer.create(this.apiClient, name, catalogName, schedule, {\n      type: \"webScraper\",\n      config,\n    });\n  }\n\n  async createGithubIndexer(\n    name: string,\n    catalogName: string,\n    schedule: IndexerScheduleFrequency,\n    config: GithubDataSourceConfig,\n  ): Promise<Indexer> {\n    if (!config.code) {\n      config.code = {};\n    }\n    return Indexer.create(this.apiClient, name, catalogName, schedule, {\n      type: \"github\",\n      config,\n    });\n  }\n\n  async getIndexer(name: string): Promise<Indexer> {\n    return Indexer.get(this.apiClient, name);\n  }\n\n  async listIndexers(): Promise<Indexer[]> {\n    return Indexer.list(this.apiClient);\n  }\n}\n"],"mappings":"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","names":["import_stream","version","fs","fs","apiUrl","Path","IndexerScheduleFrequency","version"]}