{"version":3,"sources":["../../src/tools/arxiv.ts"],"names":["SortType","RELEVANCE","LAST_UPDATED_DATE","SUBMITTED_DATE","SortOrder","ASCENDING","DESCENDING","FilterType","ALL","TITLE","AUTHOR","ABSTRACT","COMMENT","JOURNAL_REFERENCE","SUBJECT_CATEGORY","REPORT_NUMBER","FilterTypeMapping","all","title","author","abstract","comment","journal_reference","subject_category","report_number","Separators","AND","OR","ANDNOT","ArXivToolOutput","JSONToolOutput","isEmpty","result","totalResults","entries","length","extractId","value","replace","ArXivTool","Tool","name","description","emitter","Emitter","root","child","namespace","creator","inputSchema","entrySchema","z","object","field","nativeEnum","default","string","min","ids","array","optional","search_query","include","nonempty","describe","exclude","start","number","int","maxResults","max","register","validateInput","schema","rawInput","ToolInputValidationError","_prepareParams","input","createURLParams","max_results","id_list","undefined","map","tag","join","filter","Boolean","sortBy","sortOrder","_run","_options","run","params","url","decodeURIComponent","toString","response","fetch","signal","data","_parseResponse","parser","XMLParser","allowBooleanAttributes","alwaysCreateTextNode","attributeNamePrefix","attributesGroupName","cdataPropName","ignoreAttributes","numberParseOptions","hex","leadingZeros","parseAttributeValue","parseTagValue","preserveOrder","removeNSPrefix","textNodeName","trimValues","ignoreDeclaration","text","parsedData","parse","ok","ToolError","Error","JSON","stringify","getProp","castArray","Math","startIndex","itemsPerPage","entry","pickBy","id","summary","published","updated","authors","affiliation","doi","journalReference","journal_ref","primaryCategory","primary_category","categories","category","links","link","isDefined"],"mappings":"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","file":"arxiv.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n  BaseToolOptions,\n  BaseToolRunOptions,\n  ToolEmitter,\n  JSONToolOutput,\n  Tool,\n  ToolError,\n  ToolInput,\n  ToolInputValidationError,\n} from \"@/tools/base.js\";\nimport { z } from \"zod\";\nimport { createURLParams } from \"@/internals/fetcher.js\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { getProp } from \"@/internals/helpers/object.js\";\nimport { isDefined, isEmpty, pickBy } from \"remeda\";\nimport { castArray } from \"@/internals/helpers/array.js\";\nimport { ValueOf } from \"@/internals/types.js\";\nimport { AnyToolSchemaLike } from \"@/internals/helpers/schema.js\";\nimport { RunContext } from \"@/context.js\";\nimport { Emitter } from \"@/emitter/emitter.js\";\n\ntype ToolOptions = BaseToolOptions;\ntype ToolRunOptions = BaseToolRunOptions;\n\nexport const SortType = {\n  RELEVANCE: \"relevance\",\n  LAST_UPDATED_DATE: \"lastUpdatedDate\",\n  SUBMITTED_DATE: \"submittedDate\",\n} as const;\n\nexport const SortOrder = {\n  ASCENDING: \"ascending\",\n  DESCENDING: \"descending\",\n} as const;\n\nexport const FilterType = {\n  ALL: \"all\",\n  TITLE: \"title\",\n  AUTHOR: \"author\",\n  ABSTRACT: \"abstract\",\n  COMMENT: \"comment\",\n  JOURNAL_REFERENCE: \"journal_reference\",\n  SUBJECT_CATEGORY: \"subject_category\",\n  REPORT_NUMBER: \"report_number\",\n} as const;\n\nconst FilterTypeMapping: Record<ValueOf<typeof FilterType>, string> = {\n  all: \"all\",\n  title: \"ti\",\n  author: \"au\",\n  abstract: \"abs\",\n  comment: \"co\",\n  journal_reference: \"jr\",\n  subject_category: \"cat\",\n  report_number: \"rn\",\n};\n\nexport const Separators = {\n  AND: \"+AND+\",\n  OR: \"+OR+\",\n  ANDNOT: \"+ANDNOT+\",\n} as const;\n\nexport interface ArXivResponse {\n  totalResults: number;\n  startIndex: number;\n  itemsPerPage: number;\n  entries: {\n    id: string;\n    title: string;\n    summary: string;\n    published: string;\n    updated: string;\n    authors: { name: string; affiliation: string[] }[];\n    doi: string;\n    comment: string;\n    journalReference: string;\n    primaryCategory: string;\n    categories: string[];\n    links: string[];\n  }[];\n}\n\nexport class ArXivToolOutput extends JSONToolOutput<ArXivResponse> {\n  isEmpty(): boolean {\n    return !this.result || this.result.totalResults === 0 || this.result.entries.length === 0;\n  }\n}\n\nconst extractId = (value: string) =>\n  value\n    .replace(\"https://arxiv.org/abs/\", \"\")\n    .replace(\"https://arxiv.org/pdf/\", \"\")\n    .replace(/v\\d$/, \"\");\n\nexport class ArXivTool extends Tool<ArXivToolOutput, ToolOptions, ToolRunOptions> {\n  name = \"ArXiv\";\n  description = `Retrieves research articles published on arXiv including related metadata.`;\n\n  public readonly emitter: ToolEmitter<ToolInput<this>, ArXivToolOutput> = Emitter.root.child({\n    namespace: [\"tool\", \"search\", \"arxiv\"],\n    creator: this,\n  });\n\n  @Cache()\n  inputSchema() {\n    const entrySchema = z.object({\n      field: z.nativeEnum(FilterType).default(FilterType.ALL),\n      value: z.string().min(1),\n    });\n\n    return z\n      .object({\n        ids: z.array(z.string().min(1)).optional(),\n        search_query: z\n          .object({\n            include: z.array(entrySchema).nonempty().describe(\"Filters to include results.\"),\n            exclude: z.array(entrySchema).optional().describe(\"Filters to exclude results.\"),\n          })\n          .optional(),\n        start: z.number().int().min(0).default(0),\n        maxResults: z.number().int().min(1).max(100).default(5),\n      })\n      .describe(\"Sorting by date is not supported.\");\n  }\n\n  static {\n    this.register();\n  }\n\n  protected validateInput(\n    schema: AnyToolSchemaLike,\n    rawInput: unknown,\n  ): asserts rawInput is ToolInput<this> {\n    super.validateInput(schema, rawInput);\n    if (isEmpty(rawInput.ids ?? []) && !rawInput.search_query) {\n      throw new ToolInputValidationError(\n        `The 'search_query' property must be non-empty if the 'ids' property is not provided!`,\n      );\n    }\n  }\n\n  protected _prepareParams(input: ToolInput<typeof this>) {\n    return createURLParams({\n      start: input.start,\n      max_results: input.maxResults,\n      id_list: isEmpty(input.ids ?? []) ? undefined : input.ids?.map(extractId),\n      search_query:\n        input.search_query &&\n        [\n          input.search_query.include\n            .map((tag) => `${FilterTypeMapping[tag.field]}:${tag.value}`)\n            .join(Separators.AND),\n          (input.search_query.exclude ?? [])\n            .map((tag) => `${FilterTypeMapping[tag.field]}:${tag.value}`)\n            .join(Separators.ANDNOT),\n        ]\n          .filter(Boolean)\n          .join(Separators.ANDNOT),\n      sortBy: SortType.RELEVANCE,\n      sortOrder: SortOrder.DESCENDING,\n    });\n  }\n\n  protected async _run(\n    input: ToolInput<this>,\n    _options: Partial<BaseToolRunOptions>,\n    run: RunContext<this>,\n  ) {\n    const params = this._prepareParams(input);\n    const url = `https://export.arxiv.org/api/query?${decodeURIComponent(params.toString())}`;\n    const response = await fetch(url, {\n      signal: run.signal,\n    });\n    const data = await this._parseResponse(response);\n    return new ArXivToolOutput(data);\n  }\n\n  protected async _parseResponse(response: Response): Promise<ArXivResponse> {\n    const parser = new XMLParser({\n      allowBooleanAttributes: true,\n      alwaysCreateTextNode: false,\n      attributeNamePrefix: \"@_\",\n      attributesGroupName: false,\n      cdataPropName: \"#cdata\",\n      ignoreAttributes: true,\n      numberParseOptions: { hex: false, leadingZeros: true },\n      parseAttributeValue: false,\n      parseTagValue: true,\n      preserveOrder: false,\n      removeNSPrefix: true,\n      textNodeName: \"#text\",\n      trimValues: true,\n      ignoreDeclaration: true,\n    });\n\n    const text = await response.text();\n    const parsedData = parser.parse(text);\n\n    if (!response.ok) {\n      throw new ToolError(\"Request to ArXiv API has failed!\", [\n        new Error(JSON.stringify(getProp(parsedData, [\"feed\", \"entry\"], parsedData), null, 2)),\n      ]);\n    }\n\n    let entries: Record<string, any>[] = getProp(parsedData, [\"feed\", \"entry\"], []);\n    entries = castArray(entries);\n\n    return {\n      totalResults: Math.max(getProp(parsedData, [\"feed\", \"totalResults\"], 0), entries.length),\n      startIndex: getProp(parsedData, [\"feed\", \"startIndex\"], 0),\n      itemsPerPage: getProp(parsedData, [\"feed\", \"itemsPerPage\"], 0),\n      entries: entries.map((entry) =>\n        pickBy(\n          {\n            id: extractId(entry.id),\n            url: entry.id,\n            title: entry.title,\n            summary: entry.summary,\n            published: entry.published,\n            updated: entry.updated,\n            authors: castArray(entry.author)\n              .filter(Boolean)\n              .map((author: any) => ({\n                name: author.name,\n                affiliation: castArray(author.affiliation ?? []),\n              })),\n            doi: entry.doi,\n            comment: entry.comment,\n            journalReference: entry.journal_ref,\n            primaryCategory: entry.primary_category,\n            categories: castArray(entry.category).filter(Boolean),\n            links: castArray(entry.link).filter(Boolean),\n          },\n          isDefined,\n        ),\n      ),\n    };\n  }\n}\n"]}