diff --git a/legacy/docs/mint.json b/legacy/docs/mint.json index caa762ef..3b859963 100644 --- a/legacy/docs/mint.json +++ b/legacy/docs/mint.json @@ -55,6 +55,7 @@ { "group": "Tools", "pages": [ + "tools/airtable", "tools/apollo", "tools/arxiv", "tools/bing", @@ -70,6 +71,8 @@ "tools/hacker-news", "tools/gravatar", "tools/google-custom-search", + "tools/google-docs", + "tools/google-drive", "tools/hunter", "tools/jina", "tools/leadmagic", @@ -83,6 +86,7 @@ "tools/polygon", "tools/predict-leads", "tools/proxycurl", + "tools/reddit", "tools/rocketreach", "tools/searxng", "tools/serpapi", @@ -92,10 +96,12 @@ "tools/tavily", "tools/twilio", "tools/twitter", + "tools/typeform", "tools/weather", "tools/wikidata", "tools/wikipedia", "tools/wolfram-alpha", + "tools/youtube", "tools/zoominfo" ] } diff --git a/legacy/docs/tools/airtable.mdx b/legacy/docs/tools/airtable.mdx new file mode 100644 index 00000000..6487ba07 --- /dev/null +++ b/legacy/docs/tools/airtable.mdx @@ -0,0 +1,51 @@ +--- +title: Airtable +description: Airtable is a no-code spreadsheets, CRM, and database. +--- + +- package: `@agentic/airtable` +- exports: `class AirtableClient`, `namespace airtable` +- env vars: `AIRTABLE_API_KEY` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/airtable/src/airtable-client.ts) +- [airtable api docs](https://airtable.com/developers/web/api/introduction) + +## Install + + +```bash npm +npm install @agentic/airtable +``` + +```bash yarn +yarn add @agentic/airtable +``` + +```bash pnpm +pnpm add @agentic/airtable +``` + + + +## Usage + +```ts +import { AirtableClient } from '@agentic/airtable' + +const airtable = new AirtableClient() +const { bases } = await airtable.listBases() +console.log('bases', tables) + +const baseId = bases[0]!.id +const tables = await airtable.listTables({ baseId }) +console.log('tables', tables) + +const tableId = tables[0]!.id +const searchResults = await airtable.searchRecords({ + baseId, + tableId, + searchTerm: 'Travis' +}) +console.log('search results', searchResults) +``` + +(this is just an example of how you'd use the client) diff --git a/legacy/docs/tools/google-docs.mdx b/legacy/docs/tools/google-docs.mdx new file mode 100644 index 00000000..6c773d13 --- /dev/null +++ b/legacy/docs/tools/google-docs.mdx @@ -0,0 +1,45 @@ +--- +title: Google Docs +description: Simplified Google Docs API. +--- + +- package: `@agentic/google-docs` +- exports: `class GoogleDocsClient`, `namespace googleDocs` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/google-docs/src/google-docs-client.ts) +- [google docs docs](https://developers.google.com/workspace/docs/api) + +## Install + + +```bash npm +npm install @agentic/google-docs googleapis @google-cloud/local-auth +``` + +```bash yarn +yarn add @agentic/google-docs googleapis @google-cloud/local-auth +``` + +```bash pnpm +pnpm add @agentic/google-docs googleapis @google-cloud/local-auth +``` + + + +## Example Usage + +```ts +import { GoogleDriveClient } from '@agentic/google-drive' +import { authenticate } from '@google-cloud/local-auth' +import { google } from 'googleapis' + +// (in a real app, store these auth credentials and reuse them) +const auth = await authenticate({ + scopes: ['https://www.googleapis.com/auth/documents.readonly'], + keyfilePath: process.env.GOOGLE_CREDENTIALS_PATH +}) +const docs = google.docs({ version: 'v1', auth }) +const client = new GoogleDocsClient({ docs }) + +const document = await client.getDocument({ documentId: 'TODO' }) +console.log(document) +``` diff --git a/legacy/docs/tools/google-drive.mdx b/legacy/docs/tools/google-drive.mdx new file mode 100644 index 00000000..590f1f8d --- /dev/null +++ b/legacy/docs/tools/google-drive.mdx @@ -0,0 +1,47 @@ +--- +title: Google Drive +description: Simplified Google Drive API. +--- + +- package: `@agentic/google-drive` +- exports: `class GoogleDriveClient`, `namespace googleDrive` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/google-drive/src/google-drive-client.ts) +- [google drive docs](https://developers.google.com/workspace/drive/api) + +## Install + + +```bash npm +npm install @agentic/google-drive googleapis google-auth-library +``` + +```bash yarn +yarn add @agentic/google-drive googleapis google-auth-library +``` + +```bash pnpm +pnpm add @agentic/google-drive googleapis google-auth-library +``` + + + +## Example Usage + +```ts +import { GoogleDriveClient } from '@agentic/google-drive' +import { GoogleAuth } from 'google-auth-library' +import { google } from 'googleapis' + +const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive' }) +const drive = google.drive({ version: 'v3', auth }) +const client = new GoogleDriveClient({ drive }) + +const result = await client.listFiles() + +const file = result.files[0]! +const metadata = await client.getFile({ fileId: file.id }) +const content = await client.exportFile({ + fileId: file.id, + mimeType: 'application/pdf' +}) +``` diff --git a/legacy/docs/tools/reddit.mdx b/legacy/docs/tools/reddit.mdx new file mode 100644 index 00000000..65e6ed28 --- /dev/null +++ b/legacy/docs/tools/reddit.mdx @@ -0,0 +1,45 @@ +--- +title: Reddit +description: Basic readonly Reddit API for getting top/hot/new/rising posts from subreddits. +--- + +- package: `@agentic/reddit` +- exports: `class RedditClient`, `namespace reddit` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/reddit/src/reddit-client.ts) +- [reddit legacy api docs](https://old.reddit.com/dev/api) + + + This client uses Reddit's free, legacy JSON API aimed at RSS feeds, so no auth + is required. With that being said, Reddit does impose rate limits on the API, + so be considerate. + + +## Install + + +```bash npm +npm install @agentic/reddit +``` + +```bash yarn +yarn add @agentic/reddit +``` + +```bash pnpm +pnpm add @agentic/reddit +``` + + + +## Usage + +```ts +import { RedditClient } from '@agentic/reddit' + +const reddit = new RedditClient() +const result = await reddit.getSubredditPosts({ + subreddit: 'AskReddit', + type: 'hot', + limit: 10 +}) +``` diff --git a/legacy/docs/tools/typeform.mdx b/legacy/docs/tools/typeform.mdx new file mode 100644 index 00000000..2369967d --- /dev/null +++ b/legacy/docs/tools/typeform.mdx @@ -0,0 +1,43 @@ +--- +title: Typeform +description: Readonly Typeform API client for fetching form insights and responses. +--- + +- package: `@agentic/typeform` +- exports: `class TypeformClient`, `namespace typeform` +- env vars: `TYPEFORM_API_KEY` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/typeform/src/typeform-client.ts) +- [typeform api docs](https://www.typeform.com/developers/get-started/) + +## Install + + +```bash npm +npm install @agentic/typeform +``` + +```bash yarn +yarn add @agentic/typeform +``` + +```bash pnpm +pnpm add @agentic/typeform +``` + + + +## Usage + +```ts +import { TypeformClient } from '@agentic/typeform' + +const typeform = new TypeformClient() + +const responses = await typeform.getResponsesForForm({ + formId: 'TODO' +}) + +const insights = await typeform.getInsightsForForm({ + formId: 'TODO' +}) +``` diff --git a/legacy/docs/tools/youtube.mdx b/legacy/docs/tools/youtube.mdx new file mode 100644 index 00000000..b1fa44fe --- /dev/null +++ b/legacy/docs/tools/youtube.mdx @@ -0,0 +1,39 @@ +--- +title: YouTube +description: YouTube data API v3 client for searching YT videos and channels. +--- + +- package: `@agentic/youtube` +- exports: `class YouTubeClient`, `namespace youtube` +- env vars: `YOUTUBE_API_KEY` +- [source](https://github.com/transitive-bullshit/agentic/blob/main/packages/youtube/src/youtube-client.ts) +- [youtube api docs](https://developers.google.com/youtube/v3) + - [search docs](https://developers.google.com/youtube/v3/docs/search/list) + +## Install + + +```bash npm +npm install @agentic/youtube +``` + +```bash yarn +yarn add @agentic/youtube +``` + +```bash pnpm +pnpm add @agentic/youtube +``` + + + +## Usage + +```ts +import { YouTubeClient } from '@agentic/youtube' + +const youtube = new YouTubeClient() +const res = await youtube.searchVideos({ + query: 'cute kittens' +}) +``` diff --git a/legacy/packages/ai-sdk/package.json b/legacy/packages/ai-sdk/package.json index ed73a47b..9748aea2 100644 --- a/legacy/packages/ai-sdk/package.json +++ b/legacy/packages/ai-sdk/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/ai-sdk" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/airtable/package.json b/legacy/packages/airtable/package.json new file mode 100644 index 00000000..43e511dd --- /dev/null +++ b/legacy/packages/airtable/package.json @@ -0,0 +1,44 @@ +{ + "name": "@agentic/airtable", + "version": "7.6.3", + "description": "Agentic SDK for Airtable.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/airtable" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "ky": "catalog:" + }, + "peerDependencies": { + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/airtable/readme.md b/legacy/packages/airtable/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/airtable/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/airtable/src/airtable-client.ts b/legacy/packages/airtable/src/airtable-client.ts new file mode 100644 index 00000000..3f80a6fd --- /dev/null +++ b/legacy/packages/airtable/src/airtable-client.ts @@ -0,0 +1,423 @@ +import { + aiFunction, + AIFunctionsProvider, + assert, + getEnv, + sanitizeSearchParams +} from '@agentic/core' +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +import { airtable } from './airtable' + +/** + * Airtable API client. + * + * @see https://airtable.com/developers/web/api/introduction + */ +export class AirtableClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('AIRTABLE_API_KEY'), + apiBaseUrl = airtable.API_BASE_URL, + timeoutMs = 60_000, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert( + apiKey, + `AirtableClient missing required "apiKey" (defaults to "AIRTABLE_API_KEY")` + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: apiBaseUrl, + timeout: timeoutMs, + headers: { + Authorization: `Bearer ${apiKey}` + } + }) + } + + /** + * Lists all of the bases that the user has access to. + */ + @aiFunction({ + name: 'airtable_list_bases', + description: 'Lists all accessible Airtable bases.', + inputSchema: z.object({}) + }) + async listBases(): Promise { + return this.ky.get('v0/meta/bases').json() + } + + /** + * Lists all of the tables in a base. + */ + @aiFunction({ + name: 'airtable_list_tables', + description: 'Lists all of the tables in a base.', + inputSchema: airtable.ListTablesArgsSchema + }) + async listTables< + TDetailLevel extends airtable.TableDetailLevel = 'full' + >(args: { + baseId: string + detailLevel?: TDetailLevel + }): Promise>> { + const { baseId, detailLevel = 'full' } = args + + const res = await this.ky + .get(`/v0/meta/bases/${baseId}/tables`) + .json() + + return res.tables.map((table) => + transformTableDetailLevel({ + table, + detailLevel: detailLevel as TDetailLevel + }) + ) + } + + /** + * Gets a single table's schema in a base. + */ + @aiFunction({ + name: 'airtable_get_table', + description: "Gets a single table's schema in a base.", + inputSchema: airtable.DescribeTableArgsSchema + }) + async getTable< + TDetailLevel extends airtable.TableDetailLevel = 'full' + >(args: { + baseId: string + tableId: string + detailLevel?: TDetailLevel + }): Promise> { + const tables = await this.listTables(args) + const table = tables.find((t) => t.id === args.tableId) + assert(table, `Table ${args.tableId} not found in base ${args.baseId}`) + return table + } + + /** + * Lists records from a table. + */ + @aiFunction({ + name: 'airtable_list_records', + description: 'Lists records from a table.', + inputSchema: airtable.ListRecordsArgsSchema + }) + async listRecords( + args: airtable.ListRecordsArgs + ): Promise { + const { baseId, tableId, ...options } = args + return this.ky + .get(`/v0/${baseId}/${tableId}`, { + searchParams: sanitizeSearchParams(options) + }) + .json() + } + + /** + * Lists all records from a table. + */ + @aiFunction({ + name: 'airtable_list_all_records', + description: 'Lists all records from a table.', + inputSchema: airtable.ListRecordsArgsSchema + }) + async listAllRecords( + args: airtable.ListRecordsArgs + ): Promise { + const allRecords: airtable.AirtableRecord[] = [] + let offset = args.offset ?? 0 + + do { + const res = await this.listRecords({ + ...args, + offset + }) + if (!res.length) { + break + } + + allRecords.push(...res) + offset += res.length + } while (true) + + return allRecords + } + + /** + * Gets a single record from a table. + */ + @aiFunction({ + name: 'airtable_get_record', + description: 'Gets a single record from a table.', + inputSchema: airtable.GetRecordArgsSchema + }) + async getRecord( + args: airtable.GetRecordArgs + ): Promise { + const { baseId, tableId, recordId } = args + return this.ky + .get(`/v0/${baseId}/${tableId}/${recordId}`) + .json() + } + + /** + * Creates a record in a table. + */ + @aiFunction({ + name: 'airtable_create_record', + description: 'Creates a record in a table.', + inputSchema: airtable.CreateRecordArgsSchema + }) + async createRecord( + args: airtable.CreateRecordArgs + ): Promise { + const { baseId, tableId, ...body } = args + return this.ky + .post(`/v0/${baseId}/${tableId}`, { + json: body + }) + .json() + } + + /** + * Updates records in a table. + */ + @aiFunction({ + name: 'airtable_update_records', + description: 'Updates records in a table.', + inputSchema: airtable.UpdateRecordsArgsSchema + }) + async updateRecords( + args: airtable.UpdateRecordsArgs + ): Promise { + const { baseId, tableId, ...body } = args + return this.ky + .patch(`/v0/${baseId}/${tableId}`, { + json: body + }) + .json() + } + + /** + * Deletes records from a table. + */ + @aiFunction({ + name: 'airtable_delete_records', + description: 'Deletes records from a table.', + inputSchema: airtable.DeleteRecordsArgsSchema + }) + async deleteRecords( + args: airtable.DeleteRecordsArgs + ): Promise<{ id: string }[]> { + const { baseId, tableId, recordIds } = args + const queryString = recordIds.map((id) => `records[]=${id}`).join('&') + + const res = await this.ky + .delete(`/v0/${baseId}/${tableId}?${queryString}`) + .json<{ records: { id: string; deleted: boolean }[] }>() + + return res.records.map(({ id }) => ({ id })) + } + + /** + * Creates a table in a base. + */ + @aiFunction({ + name: 'airtable_create_table', + description: 'Creates a table in a base.', + inputSchema: airtable.CreateTableArgsSchema + }) + async createTable(args: airtable.CreateTableArgs): Promise { + const { baseId, ...body } = args + + return this.ky + .post(`/v0/meta/bases/${baseId}/tables`, { + json: body + }) + .json() + } + + /** + * Updates a table in a base. + */ + @aiFunction({ + name: 'airtable_update_table', + description: 'Updates a table in a base.', + inputSchema: airtable.UpdateTableArgsSchema + }) + async updateTable(args: airtable.UpdateTableArgs): Promise { + const { baseId, tableId, ...body } = args + return this.ky + .patch(`/v0/meta/bases/${baseId}/tables/${tableId}`, { + json: body + }) + .json() + } + + /** + * Creates a field in a table. + */ + @aiFunction({ + name: 'airtable_create_field', + description: 'Creates a field in a table.', + inputSchema: airtable.CreateFieldArgsSchema + }) + async createField(args: airtable.CreateFieldArgs): Promise { + const { baseId, tableId, body } = args + return this.ky + .post(`/v0/meta/bases/${baseId}/tables/${tableId}/fields`, { + json: body.field + }) + .json() + } + + /** + * Updates a field in a table. + */ + @aiFunction({ + name: 'airtable_update_field', + description: 'Updates a field in a table.', + inputSchema: airtable.UpdateFieldArgsSchema + }) + async updateField(args: airtable.UpdateFieldArgs): Promise { + const { baseId, tableId, fieldId, ...body } = args + return this.ky + .patch(`/v0/meta/bases/${baseId}/tables/${tableId}/fields/${fieldId}`, { + json: body + }) + .json() + } + + /** + * Searches for records in a table which contain specific text. + */ + @aiFunction({ + name: 'airtable_search_records', + description: 'Searches for records in a table which contain specific text.', + inputSchema: airtable.SearchRecordsArgsSchema + }) + async searchRecords( + args: airtable.SearchRecordsArgs + ): Promise { + const { baseId, tableId, fieldIds, searchTerm, ...opts } = args + // Validate and get search fields + const searchFieldIds = await this.validateAndGetSearchFields({ + baseId, + tableId, + fieldIds + }) + + // Escape the search term to prevent formula injection + const escapedSearchTerm = searchTerm.replaceAll(/["\\]/g, '\\$&') + + // Build OR(FIND("term", field1), FIND("term", field2), ...) + const filterByFormula = `OR(${searchFieldIds + .map((fieldId) => `FIND("${escapedSearchTerm}", {${fieldId}})`) + .join(',')})` + + return this.listRecords({ ...opts, baseId, tableId, filterByFormula }) + } + + /** + * Validates and gets the searchable text fields in a table. + */ + protected async validateAndGetSearchFields({ + baseId, + tableId, + fieldIds + }: { + baseId: string + tableId: string + fieldIds?: string[] + }): Promise { + const table = await this.getTable({ baseId, tableId }) + + const searchableFieldTypes = new Set([ + 'singleLineText', + 'multilineText', + 'richText', + 'email', + 'url', + 'phoneNumber' + ]) + + const searchableFieldIds = new Set( + table.fields + .filter((field) => searchableFieldTypes.has(field.type)) + .map((field) => field.id) + ) + + if (!searchableFieldIds.size) { + throw new Error('No text fields available to search') + } + + // If specific fields were requested, validate that they exist and are, in + // fact, valid searchable text fields. + if (fieldIds && fieldIds.length > 0) { + // Check if any requested fields were invalid + const invalidFieldIds = fieldIds.filter( + (fieldId) => !searchableFieldIds.has(fieldId) + ) + if (invalidFieldIds.length > 0) { + throw new Error( + `Invalid fields requested: ${invalidFieldIds.join(', ')}` + ) + } + + return fieldIds + } + + return Array.from(searchableFieldIds) + } +} + +function transformTableDetailLevel< + T extends airtable.TableDetailLevel = 'full' +>({ + table, + detailLevel +}: { + table: airtable.Table + detailLevel: T +}): airtable.AirtableTableToDetailLevel { + switch (detailLevel) { + case 'tableIdentifiersOnly': + return { + id: table.id, + name: table.name + } as any + + case 'identifiersOnly': + return { + id: table.id, + name: table.name, + fields: table.fields.map((field) => ({ + id: field.id, + name: field.name + })), + views: table.views.map((view) => ({ + id: view.id, + name: view.name + })) + } as any + + default: + return table as any + } +} diff --git a/legacy/packages/airtable/src/airtable.ts b/legacy/packages/airtable/src/airtable.ts new file mode 100644 index 00000000..505c24a7 --- /dev/null +++ b/legacy/packages/airtable/src/airtable.ts @@ -0,0 +1,665 @@ +import { z } from 'zod' + +export namespace airtable { + export const API_BASE_URL = 'https://api.airtable.com' + + export const BaseSchema = z.object({ + id: z.string(), + name: z.string(), + permissionLevel: z.string() + }) + export type Base = z.infer + + export const ListBasesResponseSchema = z.object({ + bases: z.array(BaseSchema), + offset: z.string().optional() + }) + export type ListBasesResponse = z.infer + + export const FieldOptionsSchema = z + .object({ + isReversed: z.boolean().optional(), + inverseLinkFieldId: z.string().optional(), + linkedTableId: z.string().optional(), + prefersSingleRecordLink: z.boolean().optional(), + color: z.string().optional(), + icon: z.string().optional() + }) + .passthrough() + export type FieldOptions = z.infer + + export const FieldSchema = z + .object({ + name: z.string(), + description: z.string().optional() + }) + .and( + // Extracted from Airtable API docs + z.union([ + z.object({ type: z.literal('autoNumber') }), + z.object({ type: z.literal('barcode') }), + z.object({ type: z.literal('button') }), + z + .object({ + options: z.object({ + color: z + .enum([ + 'greenBright', + 'tealBright', + 'cyanBright', + 'blueBright', + 'purpleBright', + 'pinkBright', + 'redBright', + 'orangeBright', + 'yellowBright', + 'grayBright' + ]) + .describe('The color of the checkbox.'), + icon: z + .enum([ + 'check', + 'xCheckbox', + 'star', + 'heart', + 'thumbsUp', + 'flag', + 'dot' + ]) + .describe('The icon name of the checkbox.') + }), + type: z.literal('checkbox') + }) + .describe( + "Bases on a free or plus plan are limited to using the `'check'` icon and `'greenBright'` color." + ), + z.object({ type: z.literal('createdBy') }), + z.object({ + options: z.object({ + result: z + .union([ + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + '`format` is always provided when reading.\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ), + name: z.enum([ + 'local', + 'friendly', + 'us', + 'european', + 'iso' + ]) + }) + }), + type: z.literal('date') + }), + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + '`format` is always provided when reading.\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ), + name: z.enum([ + 'local', + 'friendly', + 'us', + 'european', + 'iso' + ]) + }), + timeFormat: z.object({ + format: z.enum(['h:mma', 'HH:mm']), + name: z.enum(['12hour', '24hour']) + }), + timeZone: z.any() + }), + type: z.literal('dateTime') + }) + ]) + .describe( + 'This will always be a `date` or `dateTime` field config.' + ) + .optional() + }), + type: z.literal('createdTime') + }), + z.object({ + options: z.object({ + isValid: z + .boolean() + .describe( + '`false` when recordLinkFieldId is null, e.g. the referenced column was deleted.' + ), + recordLinkFieldId: z.union([z.string(), z.null()]).optional() + }), + type: z.literal('count') + }), + z.any(), + z.object({ + options: z.object({ + isValid: z + .boolean() + .describe( + 'False if this formula/field configuation has an error' + ), + referencedFieldIds: z + .union([z.array(z.string()), z.null()]) + .describe('The fields to check the last modified time of'), + result: z + .union([ + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + '`format` is always provided when reading.\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ), + name: z.enum([ + 'local', + 'friendly', + 'us', + 'european', + 'iso' + ]) + }) + }), + type: z.literal('date') + }), + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + '`format` is always provided when reading.\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ), + name: z.enum([ + 'local', + 'friendly', + 'us', + 'european', + 'iso' + ]) + }), + timeFormat: z.object({ + format: z.enum(['h:mma', 'HH:mm']), + name: z.enum(['12hour', '24hour']) + }), + timeZone: z.any() + }), + type: z.literal('dateTime') + }), + z.null() + ]) + .describe( + 'This will always be a `date` or `dateTime` field config.' + ) + }), + type: z.literal('lastModifiedTime') + }), + z.object({ type: z.literal('lastModifiedBy') }), + z.object({ + options: z.object({ + fieldIdInLinkedTable: z + .union([z.string(), z.null()]) + .describe( + 'The field in the linked table that this field is looking up.' + ), + isValid: z + .boolean() + .describe( + 'Is the field currently valid (e.g. false if the linked record field has\nbeen deleted)' + ), + recordLinkFieldId: z + .union([z.string(), z.null()]) + .describe('The linked record field in the current table.'), + result: z + .union([z.any(), z.null()]) + .describe( + 'The field type and options inside of the linked table. See other field\ntype configs on this page for the possible values. Can be null if invalid.' + ) + }), + type: z.literal('lookup') + }), + z.object({ + options: z.object({ + precision: z + .number() + .describe( + 'Indicates the number of digits shown to the right of the decimal point for this field. (0-8 inclusive)' + ) + }), + type: z.literal('number') + }), + z.object({ + options: z.object({ + precision: z + .number() + .describe( + 'Indicates the number of digits shown to the right of the decimal point for this field. (0-8 inclusive)' + ) + }), + type: z.literal('percent') + }), + z.object({ + options: z.object({ + precision: z + .number() + .describe( + 'Indicates the number of digits shown to the right of the decimal point for this field. (0-7 inclusive)' + ), + symbol: z.string().describe('Currency symbol to use.') + }), + type: z.literal('currency') + }), + z.object({ + options: z.object({ + durationFormat: z.enum([ + 'h:mm', + 'h:mm:ss', + 'h:mm:ss.S', + 'h:mm:ss.SS', + 'h:mm:ss.SSS' + ]) + }), + type: z.literal('duration') + }), + z.object({ type: z.literal('multilineText') }), + z.object({ type: z.literal('phoneNumber') }), + z + .object({ + options: z.object({ + color: z + .enum([ + 'yellowBright', + 'orangeBright', + 'redBright', + 'pinkBright', + 'purpleBright', + 'blueBright', + 'cyanBright', + 'tealBright', + 'greenBright', + 'grayBright' + ]) + .describe('The color of selected icons.'), + icon: z + .enum(['star', 'heart', 'thumbsUp', 'flag', 'dot']) + .describe('The icon name used to display the rating.'), + max: z + .number() + .describe( + 'The maximum value for the rating, from 1 to 10 inclusive.' + ) + }), + type: z.literal('rating') + }) + .describe( + "Bases on a free or plus plan are limited to using the 'star' icon and 'yellowBright' color." + ), + z.object({ type: z.literal('richText') }), + z.object({ + options: z.object({ + fieldIdInLinkedTable: z + .string() + .describe('The id of the field in the linked table') + .optional(), + isValid: z.boolean().optional(), + recordLinkFieldId: z + .string() + .describe('The linked field id') + .optional(), + referencedFieldIds: z + .array(z.string()) + .describe( + 'The ids of any fields referenced in the rollup formula' + ) + .optional(), + result: z + .union([z.any(), z.null()]) + .describe( + 'The resulting field type and options for the rollup. See other field\ntype configs on this page for the possible values. Can be null if invalid.' + ) + .optional() + }), + type: z.literal('rollup') + }), + z.object({ type: z.literal('singleLineText') }), + z.object({ type: z.literal('email') }), + z.object({ type: z.literal('url') }), + z.object({ + options: z.object({ + choices: z.array( + z.object({ + color: z + .string() + .describe( + 'Optional when the select field is configured to not use colors.\n\nAllowed values: "blueLight2", "cyanLight2", "tealLight2", "greenLight2", "yellowLight2", "orangeLight2", "redLight2", "pinkLight2", "purpleLight2", "grayLight2", "blueLight1", "cyanLight1", "tealLight1", "greenLight1", "yellowLight1", "orangeLight1", "redLight1", "pinkLight1", "purpleLight1", "grayLight1", "blueBright", "cyanBright", "tealBright", "greenBright", "yellowBright", "orangeBright", "redBright", "pinkBright", "purpleBright", "grayBright", "blueDark1", "cyanDark1", "tealDark1", "greenDark1", "yellowDark1", "orangeDark1", "redDark1", "pinkDark1", "purpleDark1", "grayDark1"' + ) + .optional(), + id: z.string(), + name: z.string() + }) + ) + }), + type: z.literal('externalSyncSource') + }), + z.object({ + options: z.object({ + prompt: z + .array( + z.union([ + z.string(), + z.object({ field: z.object({ fieldId: z.string() }) }) + ]) + ) + .describe( + 'The prompt that is used to generate the results in the AI field, additional object\ntypes may be added in the future. Currently, this is an array of strings or objects that identify any fields interpolated into the prompt.\n\nThe prompt will not currently be provided if this field config is within another\nfields configuration (like a lookup field)' + ) + .optional(), + referencedFieldIds: z + .array(z.string()) + .describe( + 'The other fields in the record that are used in the ai field\n\nThe referencedFieldIds will not currently be provided if this field config is within another\nfields configuration (like a lookup field)' + ) + .optional() + }), + type: z.literal('aiText') + }), + z + .object({ + options: z.object({ + linkedTableId: z + .string() + .describe('The ID of the table this field links to'), + viewIdForRecordSelection: z + .string() + .describe( + 'The ID of the view in the linked table\nto use when showing a list of records to select from' + ) + .optional() + }), + type: z.literal('multipleRecordLinks') + }) + .describe( + 'Creating "multipleRecordLinks" fields is supported but updating options for\nexisting "multipleRecordLinks" fields is not supported.' + ), + z.object({ + options: z.object({ + choices: z.array( + z.object({ + color: z + .string() + .describe('Optional when creating an option.') + .optional(), + id: z + .string() + .describe( + 'This is not specified when creating new options, useful when specifing existing\noptions (for example: reordering options, keeping old options and adding new ones, etc)' + ) + .optional(), + name: z.string() + }) + ) + }), + type: z.literal('singleSelect') + }), + z.object({ + options: z.object({ + choices: z.array( + z.object({ + color: z + .string() + .describe('Optional when creating an option.') + .optional(), + id: z + .string() + .describe( + 'This is not specified when creating new options, useful when specifing existing\noptions (for example: reordering options, keeping old options and adding new ones, etc)' + ) + .optional(), + name: z.string() + }) + ) + }), + type: z.literal('multipleSelects') + }), + z.object({ + options: z.record(z.any()).optional(), + type: z.literal('singleCollaborator') + }), + z.object({ + options: z.record(z.any()).optional(), + type: z.literal('multipleCollaborators') + }), + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + 'Format is optional when writing, but it must match\nthe corresponding name if provided.\n\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ) + .optional(), + name: z.enum(['local', 'friendly', 'us', 'european', 'iso']) + }) + }), + type: z.literal('date') + }), + z.object({ + options: z.object({ + dateFormat: z.object({ + format: z + .enum(['l', 'LL', 'M/D/YYYY', 'D/M/YYYY', 'YYYY-MM-DD']) + .describe( + 'Format is optional when writing, but it must match\nthe corresponding name if provided.\n\n(`l` for local, `LL` for friendly, `M/D/YYYY` for us, `D/M/YYYY` for european, `YYYY-MM-DD` for iso)' + ) + .optional(), + name: z.enum(['local', 'friendly', 'us', 'european', 'iso']) + }), + timeFormat: z.object({ + format: z.enum(['h:mma', 'HH:mm']).optional(), + name: z.enum(['12hour', '24hour']) + }), + timeZone: z.any() + }), + type: z.literal('dateTime') + }), + z.object({ + options: z.object({ isReversed: z.boolean() }).optional(), + type: z.literal('multipleAttachments') + }) + ]) + ) + .describe( + 'The config of a field. NB: Formula fields cannot be created with this MCP due to a limitation in the Airtable API.' + ) + export type Field = z.infer & { id: string } + + export const ViewSchema = z.object({ + id: z.string(), + name: z.string(), + type: z.string() + }) + export type View = z.infer + + export const TableSchema = z.object({ + id: z.string(), + name: z.string(), + description: z.string().optional(), + primaryFieldId: z.string(), + fields: z.array(FieldSchema.and(z.object({ id: z.string() }))), + views: z.array(ViewSchema) + }) + export type Table = z.infer + + export const BaseSchemaResponseSchema = z.object({ + tables: z.array(TableSchema) + }) + export type BaseSchemaResponse = z.infer + + // Zod schemas for tool arguments + export const ListRecordsArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + offset: z + .number() + .optional() + .describe('Offset to start the list from. Defaults to 0.'), + maxRecords: z + .number() + .optional() + .describe('Maximum number of records to return. Defaults to 100.'), + filterByFormula: z + .string() + .optional() + .describe('Airtable formula to filter records') + }) + export type ListRecordsArgs = z.infer + + export const SearchRecordsArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + searchTerm: z.string().describe('Text to search for in records'), + fieldIds: z + .array(z.string()) + .optional() + .describe( + 'Specific field ids to search in. If not provided, searches all text-based fields.' + ), + maxRecords: z + .number() + .optional() + .describe('Maximum number of records to return. Defaults to 100.') + }) + export type SearchRecordsArgs = z.infer + + export const TableDetailLevelSchema = z.enum([ + 'tableIdentifiersOnly', + 'identifiersOnly', + 'full' + ]).describe(`Detail level for table information: + - tableIdentifiersOnly: table IDs and names + - identifiersOnly: table, field, and view IDs and names + - full: complete details including field types, descriptions, and configurations + + Note for LLMs: To optimize context window usage, request the minimum detail level needed: + - Use 'tableIdentifiersOnly' when you only need to list or reference tables + - Use 'identifiersOnly' when you need to work with field or view references + - Only use 'full' when you need field types, descriptions, or other detailed configuration + + If you only need detailed information on a few tables in a base with many complex tables, it might be more efficient for you to use list_tables with tableIdentifiersOnly, then describe_table with full on the specific tables you want.`) + export type TableDetailLevel = z.infer + + export const DescribeTableArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + detailLevel: TableDetailLevelSchema.optional().default('full') + }) + export type DescribeTableArgs = z.infer + + export const ListTablesArgsSchema = z.object({ + baseId: z.string(), + detailLevel: TableDetailLevelSchema.optional().default('full') + }) + export type ListTablesArgs = z.infer + + export const GetRecordArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + recordId: z.string() + }) + export type GetRecordArgs = z.infer + + export const CreateRecordArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + fields: z.record(z.any()) + }) + export type CreateRecordArgs = z.infer + + export const UpdateRecordsArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + records: z.array( + z.object({ + id: z.string(), + fields: z.record(z.any()) + }) + ) + }) + export type UpdateRecordsArgs = z.infer + + export const DeleteRecordsArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + recordIds: z.array(z.string()) + }) + export type DeleteRecordsArgs = z.infer + + export const CreateTableArgsSchema = z.object({ + baseId: z.string(), + name: z + .string() + .describe('Name for the new table. Must be unique in the base.'), + description: z.string().optional(), + fields: z.array(FieldSchema).describe(`Table fields. Rules: + - At least one field must be specified. + - The primary (first) field must be one of: single line text, long text, date, phone number, email, URL, number, currency, percent, duration, formula, autonumber, barcode.`) + }) + export type CreateTableArgs = z.infer + + export const UpdateTableArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + name: z.string().optional(), + description: z.string().optional() + }) + export type UpdateTableArgs = z.infer + + export const CreateFieldArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + // This is used as a workaround for https://github.com/orgs/modelcontextprotocol/discussions/90 + body: z.object({ + field: FieldSchema + }) + }) + export type CreateFieldArgs = z.infer + + export const UpdateFieldArgsSchema = z.object({ + baseId: z.string(), + tableId: z.string(), + fieldId: z.string(), + name: z.string().optional(), + description: z.string().optional() + }) + export type UpdateFieldArgs = z.infer + + export type FieldSet = Record + export type AirtableRecord = { id: string; fields: FieldSet } + + export type AirtableTableToDetailLevel< + TDetailLevel extends TableDetailLevel | undefined = 'full' + > = TDetailLevel extends undefined + ? airtable.Table + : TDetailLevel extends 'full' + ? airtable.Table + : TDetailLevel extends 'identifiersOnly' + ? { + id: string + name: string + fields: { id: string; name: string }[] + views: { id: string; name: string }[] + } + : TDetailLevel extends 'tableIdentifiersOnly' + ? { id: string; name: string } + : never +} diff --git a/legacy/packages/airtable/src/index.ts b/legacy/packages/airtable/src/index.ts new file mode 100644 index 00000000..2b3f8440 --- /dev/null +++ b/legacy/packages/airtable/src/index.ts @@ -0,0 +1,2 @@ +export * from './airtable' +export * from './airtable-client' diff --git a/legacy/packages/airtable/tsconfig.json b/legacy/packages/airtable/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/airtable/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/packages/apollo/src/apollo-client.ts b/legacy/packages/apollo/src/apollo-client.ts index 4c08d892..6db26d8a 100644 --- a/legacy/packages/apollo/src/apollo-client.ts +++ b/legacy/packages/apollo/src/apollo-client.ts @@ -293,7 +293,7 @@ export class ApolloClient extends AIFunctionsProvider { } = {}) { assert( apiKey, - `ApolloClient missing required "username" (defaults to "APOLLO_API_KEY")` + `ApolloClient missing required "apiKey" (defaults to "APOLLO_API_KEY")` ) super() diff --git a/legacy/packages/arxiv/package.json b/legacy/packages/arxiv/package.json index 49b79578..b964bd1e 100644 --- a/legacy/packages/arxiv/package.json +++ b/legacy/packages/arxiv/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/arxiv" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/bing/package.json b/legacy/packages/bing/package.json index 583c4608..80c81270 100644 --- a/legacy/packages/bing/package.json +++ b/legacy/packages/bing/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/bing" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/calculator/package.json b/legacy/packages/calculator/package.json index 4f3da6d6..02203867 100644 --- a/legacy/packages/calculator/package.json +++ b/legacy/packages/calculator/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/calculator" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/clearbit/package.json b/legacy/packages/clearbit/package.json index 19ee6342..0fd7d176 100644 --- a/legacy/packages/clearbit/package.json +++ b/legacy/packages/clearbit/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/clearbit" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/core/package.json b/legacy/packages/core/package.json index 2fec842f..dcc00d38 100644 --- a/legacy/packages/core/package.json +++ b/legacy/packages/core/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/core" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/dexa/package.json b/legacy/packages/dexa/package.json index 2b3f7139..c2c535f2 100644 --- a/legacy/packages/dexa/package.json +++ b/legacy/packages/dexa/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/dexa" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/dexter/package.json b/legacy/packages/dexter/package.json index d9581f51..25e0a305 100644 --- a/legacy/packages/dexter/package.json +++ b/legacy/packages/dexter/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/dexter" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/diffbot/package.json b/legacy/packages/diffbot/package.json index 31e8f749..2a9c46f7 100644 --- a/legacy/packages/diffbot/package.json +++ b/legacy/packages/diffbot/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/diffbot" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/duck-duck-go/package.json b/legacy/packages/duck-duck-go/package.json index 8c6691eb..fff6edd7 100644 --- a/legacy/packages/duck-duck-go/package.json +++ b/legacy/packages/duck-duck-go/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/duck-duck-go" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/e2b/package.json b/legacy/packages/e2b/package.json index e571ee89..9072d32f 100644 --- a/legacy/packages/e2b/package.json +++ b/legacy/packages/e2b/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/e2b" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/exa/package.json b/legacy/packages/exa/package.json index 47f50a19..2c9962e9 100644 --- a/legacy/packages/exa/package.json +++ b/legacy/packages/exa/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/exa" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/firecrawl/package.json b/legacy/packages/firecrawl/package.json index ae177f97..32ac2730 100644 --- a/legacy/packages/firecrawl/package.json +++ b/legacy/packages/firecrawl/package.json @@ -9,7 +9,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/firecrawl" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/genkit/package.json b/legacy/packages/genkit/package.json index 6b904be6..9cb0c082 100644 --- a/legacy/packages/genkit/package.json +++ b/legacy/packages/genkit/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/genkit" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/github/package.json b/legacy/packages/github/package.json index 41bebb74..06782124 100644 --- a/legacy/packages/github/package.json +++ b/legacy/packages/github/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/github" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/google-docs/package.json b/legacy/packages/google-docs/package.json new file mode 100644 index 00000000..15fbe256 --- /dev/null +++ b/legacy/packages/google-docs/package.json @@ -0,0 +1,48 @@ +{ + "name": "@agentic/google-docs", + "version": "7.6.3", + "description": "Agentic SDK for Google Docs.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/google-docs" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "type-fest": "catalog:" + }, + "devDependencies": { + "googleapis": "catalog:" + }, + "peerDependencies": { + "googleapis": "catalog:", + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/google-docs/readme.md b/legacy/packages/google-docs/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/google-docs/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/google-docs/src/google-docs-client.ts b/legacy/packages/google-docs/src/google-docs-client.ts new file mode 100644 index 00000000..3af72036 --- /dev/null +++ b/legacy/packages/google-docs/src/google-docs-client.ts @@ -0,0 +1,76 @@ +import type * as google from 'googleapis' +import type { SetNonNullable, Simplify } from 'type-fest' +import { + aiFunction, + AIFunctionsProvider, + pruneNullOrUndefinedDeep, + type SetRequired +} from '@agentic/core' +import { z } from 'zod' + +export namespace googleDocs { + export type Document = Simplify< + SetNonNullable + > +} + +/** + * Simplified Google Docs API client. + * + * @see https://developers.google.com/workspace/drive/api + * + * @example + * ```ts + * import { GoogleDocsClient } from '@agentic/google-docs' + * import { authenticate } from '@google-cloud/local-auth' + * import { google } from 'googleapis' + * + * // (in a real app, store these auth credentials and reuse them) + * const auth = await authenticate({ + * scopes: ['https://www.googleapis.com/auth/documents.readonly'], + * keyfilePath: process.env.GOOGLE_CREDENTIALS_PATH + * }) + * const docs = google.docs({ version: 'v1', auth }) + * const client = new GoogleDocsClient({ docs }) + * ``` + */ +export class GoogleDocsClient extends AIFunctionsProvider { + protected readonly docs: google.docs_v1.Docs + + constructor({ docs }: { docs: google.docs_v1.Docs }) { + super() + + this.docs = docs + } + + /** + * Gets a Google Docs document by ID. + */ + @aiFunction({ + name: 'google_docs_get_document', + description: 'Gets a Google Docs document by ID.', + inputSchema: z.object({ + documentId: z.string() + }) + }) + async getDocument( + args: Simplify< + SetRequired + > + ): Promise { + const { documentId, ...opts } = args + + const { data } = await this.docs.documents.get({ + ...opts, + documentId + }) + + return convertDocument(data) + } +} + +function convertDocument( + data: google.docs_v1.Schema$Document +): googleDocs.Document { + return pruneNullOrUndefinedDeep(data) +} diff --git a/legacy/packages/google-docs/src/index.ts b/legacy/packages/google-docs/src/index.ts new file mode 100644 index 00000000..71596a9d --- /dev/null +++ b/legacy/packages/google-docs/src/index.ts @@ -0,0 +1 @@ +export * from './google-docs-client' diff --git a/legacy/packages/google-docs/tsconfig.json b/legacy/packages/google-docs/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/google-docs/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/packages/google-drive/package.json b/legacy/packages/google-drive/package.json new file mode 100644 index 00000000..4faf40b0 --- /dev/null +++ b/legacy/packages/google-drive/package.json @@ -0,0 +1,48 @@ +{ + "name": "@agentic/google-drive", + "version": "7.6.3", + "description": "Agentic SDK for Google Drive.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/google-drive" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "type-fest": "catalog:" + }, + "devDependencies": { + "googleapis": "catalog:" + }, + "peerDependencies": { + "googleapis": "catalog:", + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/google-drive/readme.md b/legacy/packages/google-drive/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/google-drive/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/google-drive/src/google-drive-client.ts b/legacy/packages/google-drive/src/google-drive-client.ts new file mode 100644 index 00000000..83d75e9d --- /dev/null +++ b/legacy/packages/google-drive/src/google-drive-client.ts @@ -0,0 +1,201 @@ +import type * as google from 'googleapis' +import type { SetNonNullable, Simplify } from 'type-fest' +import { + aiFunction, + AIFunctionsProvider, + pick, + pruneNullOrUndefined, + pruneNullOrUndefinedDeep +} from '@agentic/core' +import { z } from 'zod' + +export namespace googleDrive { + export type File = Simplify< + SetNonNullable< + Pick< + google.drive_v3.Schema$File, + | 'id' + | 'name' + | 'mimeType' + | 'webViewLink' + | 'webContentLink' + | 'size' + | 'createdTime' + | 'modifiedTime' + | 'parents' + > + > + > + + export const fileFields: readonly (keyof File)[] = [ + 'id', + 'name', + 'mimeType', + 'webViewLink', + 'webContentLink', + 'size', + 'createdTime', + 'modifiedTime', + 'parents' + ] + export const requestFileFields = `files(${fileFields.join(',')}),nextPageToken` + + export interface ListFilesResponse { + files: File[] + nextPageToken?: string + } + + export interface DownloadResponse { + content: string + metadata: File + } + + export const ListFilesParamsSchema = z.object({ + folderId: z.string().optional(), + query: z.string().optional(), + pageSize: z.number().optional(), + pageToken: z.string().optional() + }) +} + +/** + * Simplified Google Drive API client. + * + * @see https://developers.google.com/workspace/drive/api + * + * @example + * ```ts + * import { GoogleDriveClient } from '@agentic/google-drive' + * import { GoogleAuth } from 'google-auth-library' + * import { google } from 'googleapis' + * + * const auth = new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/drive' }) + * const drive = google.drive({ version: 'v3', auth }) + * const client = new GoogleDriveClient({ drive }) + * ``` + */ +export class GoogleDriveClient extends AIFunctionsProvider { + protected readonly drive: google.drive_v3.Drive + + constructor({ drive }: { drive: google.drive_v3.Drive }) { + super() + + this.drive = drive + } + + /** + * Lists files and folders in a Google Drive folder. + */ + @aiFunction({ + name: 'google_drive_list_files', + description: 'Lists files and folders in a Google Drive folder.', + inputSchema: googleDrive.ListFilesParamsSchema + }) + async listFiles( + args: { + folderId?: string + query?: string + } & google.drive_v3.Params$Resource$Files$Get + ): Promise { + const { folderId, query, ...opts } = args + // Build the query conditions + const conditions = ['trashed = false'] // Always exclude trashed files + + if (folderId) { + conditions.push(`'${folderId}' in parents`) + } + + if (query) { + conditions.push(`name contains '${query}'`) + } + + // Combine all conditions with AND + const q = conditions.join(' and ') + + const { data } = await this.drive.files.list({ + fields: googleDrive.requestFileFields, + ...opts, + q + }) + const files = (data.files ?? []).map(convertFile) + + return pruneNullOrUndefined({ + files, + nextPageToken: data.nextPageToken + }) + } + + /** + * Gets a file's metadata from Google Drive. + */ + @aiFunction({ + name: 'google_drive_get_file', + description: "Gets a file's metadata from Google Drive.", + inputSchema: z.object({ fileId: z.string() }) + }) + async getFile( + opts: google.drive_v3.Params$Resource$Files$Get + ): Promise { + const { data } = await this.drive.files.get({ + fields: googleDrive.requestFileFields, + ...opts + }) + + return convertFile(data) + } + + /** + * Exports a file from Google Drive. + */ + @aiFunction({ + name: 'google_drive_export_file', + description: 'Exports a file from Google Drive to a given mime-type.', + inputSchema: z.object({ + fileId: z.string().describe('The ID of the file to export.'), + mimeType: z + .string() + .describe('The MIME type of the format requested for this export.') + }) + }) + async exportFile( + opts: google.drive_v3.Params$Resource$Files$Export + ): Promise { + return this.drive.files.export(opts) + } + + @aiFunction({ + name: 'google_drive_create_folder', + description: 'Creates a new folder in Google Drive.', + inputSchema: z.object({ + name: z.string().describe('The name of the folder to create.'), + parentId: z.string().describe('The ID of the parent folder.').optional() + }) + }) + async createFolder( + opts: Omit< + google.drive_v3.Params$Resource$Files$Create, + 'media' | 'requestBody' + > & { + name: string + parentId?: string + } + ): Promise { + const { data } = await this.drive.files.create({ + requestBody: { + mimeType: 'application/vnd.google-apps.folder', + name: opts.name, + parents: opts.parentId ? [opts.parentId] : undefined + }, + fields: googleDrive.requestFileFields, + ...opts + }) + + return convertFile(data) + } +} + +function convertFile(data: google.drive_v3.Schema$File): googleDrive.File { + return pruneNullOrUndefinedDeep( + pick(data, ...googleDrive.fileFields) + ) as googleDrive.File +} diff --git a/legacy/packages/google-drive/src/index.ts b/legacy/packages/google-drive/src/index.ts new file mode 100644 index 00000000..8666b9bc --- /dev/null +++ b/legacy/packages/google-drive/src/index.ts @@ -0,0 +1 @@ +export * from './google-drive-client' diff --git a/legacy/packages/google-drive/tsconfig.json b/legacy/packages/google-drive/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/google-drive/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/packages/hacker-news/package.json b/legacy/packages/hacker-news/package.json index 0165db31..118c9c5d 100644 --- a/legacy/packages/hacker-news/package.json +++ b/legacy/packages/hacker-news/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/hacker-news" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/hunter/package.json b/legacy/packages/hunter/package.json index 002cd3a3..8ec79969 100644 --- a/legacy/packages/hunter/package.json +++ b/legacy/packages/hunter/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/hunter" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/jigsawstack/package.json b/legacy/packages/jigsawstack/package.json index 3b47fa55..8e12259a 100644 --- a/legacy/packages/jigsawstack/package.json +++ b/legacy/packages/jigsawstack/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/jigsawstack" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/jina/package.json b/legacy/packages/jina/package.json index 1f4d87d6..67b0e073 100644 --- a/legacy/packages/jina/package.json +++ b/legacy/packages/jina/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/jina" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/langchain/package.json b/legacy/packages/langchain/package.json index 538b8a37..7553c670 100644 --- a/legacy/packages/langchain/package.json +++ b/legacy/packages/langchain/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/langchain" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/leadmagic/src/leadmagic-client.ts b/legacy/packages/leadmagic/src/leadmagic-client.ts index d73236be..6dae83b0 100644 --- a/legacy/packages/leadmagic/src/leadmagic-client.ts +++ b/legacy/packages/leadmagic/src/leadmagic-client.ts @@ -131,7 +131,7 @@ export class LeadMagicClient extends AIFunctionsProvider { } = {}) { assert( apiKey, - `LeadMagicClient missing required "username" (defaults to "LEADMAGIC_API_KEY")` + `LeadMagicClient missing required "apiKey" (defaults to "LEADMAGIC_API_KEY")` ) super() diff --git a/legacy/packages/llamaindex/package.json b/legacy/packages/llamaindex/package.json index cba66f1d..2ac45488 100644 --- a/legacy/packages/llamaindex/package.json +++ b/legacy/packages/llamaindex/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/llamaindex" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/mastra/package.json b/legacy/packages/mastra/package.json index be45b132..2eaf8e59 100644 --- a/legacy/packages/mastra/package.json +++ b/legacy/packages/mastra/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/mastra" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/mcp/package.json b/legacy/packages/mcp/package.json index 07082cfe..5c318b97 100644 --- a/legacy/packages/mcp/package.json +++ b/legacy/packages/mcp/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/mcp" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/midjourney/package.json b/legacy/packages/midjourney/package.json index b01e187a..09e463d5 100644 --- a/legacy/packages/midjourney/package.json +++ b/legacy/packages/midjourney/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/midjourney" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/novu/package.json b/legacy/packages/novu/package.json index d4cbfe64..51d8da6b 100644 --- a/legacy/packages/novu/package.json +++ b/legacy/packages/novu/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/novu" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/open-meteo/package.json b/legacy/packages/open-meteo/package.json index a5327fec..11c81aef 100644 --- a/legacy/packages/open-meteo/package.json +++ b/legacy/packages/open-meteo/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/open-meteo" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/open-meteo/src/open-meteo-client.ts b/legacy/packages/open-meteo/src/open-meteo-client.ts index 3117b9df..50a5912c 100644 --- a/legacy/packages/open-meteo/src/open-meteo-client.ts +++ b/legacy/packages/open-meteo/src/open-meteo-client.ts @@ -28,10 +28,12 @@ export class OpenMeteoClient extends AIFunctionsProvider { constructor({ apiKey = getEnv('OPEN_METEO_API_KEY'), apiBaseUrl = openmeteo.apiBaseUrl, + timeoutMs = 60_000, ky = defaultKy }: { apiKey?: string apiBaseUrl?: string + timeoutMs?: number ky?: KyInstance } = {}) { super() @@ -41,6 +43,7 @@ export class OpenMeteoClient extends AIFunctionsProvider { this.ky = ky.extend({ prefixUrl: apiBaseUrl, + timeout: timeoutMs, ...(apiKey ? { headers: { diff --git a/legacy/packages/openapi-to-ts/package.json b/legacy/packages/openapi-to-ts/package.json index 06264e41..0003713e 100644 --- a/legacy/packages/openapi-to-ts/package.json +++ b/legacy/packages/openapi-to-ts/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/openapi-to-ts" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/people-data-labs/package.json b/legacy/packages/people-data-labs/package.json index ef8978ea..718784bb 100644 --- a/legacy/packages/people-data-labs/package.json +++ b/legacy/packages/people-data-labs/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/people-data-labs" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/perigon/package.json b/legacy/packages/perigon/package.json index bffb04cf..fda8d336 100644 --- a/legacy/packages/perigon/package.json +++ b/legacy/packages/perigon/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/perigon" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/polygon/package.json b/legacy/packages/polygon/package.json index 13be5547..6381b7fb 100644 --- a/legacy/packages/polygon/package.json +++ b/legacy/packages/polygon/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/polygon" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/predict-leads/package.json b/legacy/packages/predict-leads/package.json index 0589e3a0..ccc8ecc5 100644 --- a/legacy/packages/predict-leads/package.json +++ b/legacy/packages/predict-leads/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/predict-leads" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/proxycurl/package.json b/legacy/packages/proxycurl/package.json index f445c6ee..172e8190 100644 --- a/legacy/packages/proxycurl/package.json +++ b/legacy/packages/proxycurl/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/proxycurl" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/reddit/package.json b/legacy/packages/reddit/package.json new file mode 100644 index 00000000..c8048e7e --- /dev/null +++ b/legacy/packages/reddit/package.json @@ -0,0 +1,44 @@ +{ + "name": "@agentic/reddit", + "version": "0.1.0", + "description": "Agentic SDK for Reddit.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/reddit" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "ky": "catalog:" + }, + "peerDependencies": { + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/reddit/readme.md b/legacy/packages/reddit/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/reddit/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/reddit/src/index.ts b/legacy/packages/reddit/src/index.ts new file mode 100644 index 00000000..357327bd --- /dev/null +++ b/legacy/packages/reddit/src/index.ts @@ -0,0 +1 @@ +export * from './reddit-client' diff --git a/legacy/packages/reddit/src/reddit-client.ts b/legacy/packages/reddit/src/reddit-client.ts new file mode 100644 index 00000000..55497b22 --- /dev/null +++ b/legacy/packages/reddit/src/reddit-client.ts @@ -0,0 +1,455 @@ +import { + aiFunction, + AIFunctionsProvider, + pick, + sanitizeSearchParams +} from '@agentic/core' +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +export namespace reddit { + export const BASE_URL = 'https://www.reddit.com' + + export interface Post { + id: string + name: string // name is `t3_` + title: string + subreddit: string + selftext?: string + author: string + author_fullname: string + url: string + permalink: string + thumbnail?: string + thumbnail_width?: number + thumbnail_height?: number + score: number + ups: number + downs: number + num_comments: number + created_utc: number + is_self: boolean + is_video: boolean + } + + export interface FullPost { + id: string + name: string + author: string + title: string + subreddit: string + subreddit_name_prefixed: string + score: number + approved_at_utc: string | null + selftext?: string + author_fullname: string + is_self: boolean + saved: boolean + url: string + permalink: string + mod_reason_title: string | null + gilded: number + clicked: boolean + link_flair_richtext: any[] + hidden: boolean + pwls: number + link_flair_css_class: string + downs: number + thumbnail_height: any + top_awarded_type: any + hide_score: boolean + quarantine: boolean + link_flair_text_color: string + upvote_ratio: number + author_flair_background_color: any + subreddit_type: string + ups: number + total_awards_received: number + media_embed?: any + secure_media_embed?: any + thumbnail_width: any + author_flair_template_id: any + is_original_content: boolean + user_reports: any[] + secure_media: any + is_reddit_media_domain: boolean + is_meta: boolean + category: any + link_flair_text: string + can_mod_post: boolean + approved_by: any + is_created_from_ads_ui: boolean + author_premium: boolean + thumbnail?: string + edited: boolean + author_flair_css_class: any + author_flair_richtext: any[] + gildings?: any + content_categories: any + mod_note: any + created: number + link_flair_type: string + wls: number + removed_by_category: any + banned_by: any + author_flair_type: string + domain: string + allow_live_comments: boolean + selftext_html: string + likes: any + suggested_sort: any + banned_at_utc: any + view_count: any + archived: boolean + no_follow: boolean + is_crosspostable: boolean + pinned: boolean + over_18: boolean + all_awardings: any[] + awarders: any[] + media_only: boolean + link_flair_template_id: string + can_gild: boolean + spoiler: boolean + locked: boolean + author_flair_text: any + treatment_tags: any[] + visited: boolean + removed_by: any + num_reports: any + distinguished: any + subreddit_id: string + author_is_blocked: boolean + mod_reason_by: any + removal_reason: any + link_flair_background_color: string + is_robot_indexable: boolean + report_reasons: any + discussion_type: any + num_comments: number + send_replies: boolean + contest_mode: boolean + mod_reports: any[] + author_patreon_flair: boolean + author_flair_text_color: any + stickied: boolean + subreddit_subscribers: number + created_utc: number + num_crossposts: number + media?: any + is_video: boolean + + // preview images + preview?: { + enabled: boolean + images: Array<{ + id: string + source: Image + resolutions: Image[] + variants?: Record< + string, + { + id: string + source: Image + resolutions: Image[] + } + > + }> + } + } + + export interface Image { + url: string + width: number + height: number + } + + export interface PostT3 { + kind: 't3' + data: FullPost + } + + export interface PostListingResponse { + kind: 'Listing' + data: { + after: string + dist: number + modhash: string + geo_filter?: null + children: PostT3[] + } + before?: null + } + + export type PostFilter = 'hot' | 'top' | 'new' | 'rising' + + export type GeoFilter = + | 'GLOBAL' + | 'US' + | 'AR' + | 'AU' + | 'BG' + | 'CA' + | 'CL' + | 'CO' + | 'HR' + | 'CZ' + | 'FI' + | 'FR' + | 'DE' + | 'GR' + | 'HU' + | 'IS' + | 'IN' + | 'IE' + | 'IT' + | 'JP' + | 'MY' + | 'MX' + | 'NZ' + | 'PH' + | 'PL' + | 'PT' + | 'PR' + | 'RO' + | 'RS' + | 'SG' + | 'ES' + | 'SE' + | 'TW' + | 'TH' + | 'TR' + | 'GB' + | 'US_WA' + | 'US_DE' + | 'US_DC' + | 'US_WI' + | 'US_WV' + | 'US_HI' + | 'US_FL' + | 'US_WY' + | 'US_NH' + | 'US_NJ' + | 'US_NM' + | 'US_TX' + | 'US_LA' + | 'US_NC' + | 'US_ND' + | 'US_NE' + | 'US_TN' + | 'US_NY' + | 'US_PA' + | 'US_CA' + | 'US_NV' + | 'US_VA' + | 'US_CO' + | 'US_AK' + | 'US_AL' + | 'US_AR' + | 'US_VT' + | 'US_IL' + | 'US_GA' + | 'US_IN' + | 'US_IA' + | 'US_OK' + | 'US_AZ' + | 'US_ID' + | 'US_CT' + | 'US_ME' + | 'US_MD' + | 'US_MA' + | 'US_OH' + | 'US_UT' + | 'US_MO' + | 'US_MN' + | 'US_MI' + | 'US_RI' + | 'US_KS' + | 'US_MT' + | 'US_MS' + | 'US_SC' + | 'US_KY' + | 'US_OR' + | 'US_SD' + + export type TimePeriod = 'hour' | 'day' | 'week' | 'month' | 'year' | 'all' + + export type GetSubredditPostsOptions = { + subreddit: string + type?: PostFilter + + // Pagination size and offset (count) + limit?: number + count?: number + + // Pagination by fullnames of posts + before?: string + after?: string + + /** + * Geographical filter. Only applicable to 'hot' posts. + */ + geo?: GeoFilter + + /** + * Filter by time period. Only applicable to 'top' posts. + */ + time?: TimePeriod + } + + export interface PostListingResult { + subreddit: string + type: PostFilter + geo?: GeoFilter + time?: TimePeriod + posts: Post[] + } +} + +/** + * Basic readonly Reddit API for fetching top/hot/new/rising posts from subreddits. + * + * Uses Reddit's legacy JSON API aimed at RSS feeds. + * + * @see https://old.reddit.com/dev/api + */ +export class RedditClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly baseUrl: string + + constructor({ + baseUrl = reddit.BASE_URL, + userAgent = 'agentic-reddit-client/1.0.0', + timeoutMs = 60_000, + ky = defaultKy + }: { + baseUrl?: string + userAgent?: string + timeoutMs?: number + ky?: KyInstance + } = {}) { + super() + + this.baseUrl = baseUrl + + this.ky = ky.extend({ + prefixUrl: this.baseUrl, + timeout: timeoutMs, + headers: { + 'User-Agent': userAgent + } + }) + } + + /** + * Fetches posts from a subreddit. + * + * @see https://old.reddit.com/dev/api/#GET_hot + */ + @aiFunction({ + name: 'reddit_get_subreddit_posts', + description: 'Fetches posts from a subreddit.', + inputSchema: z.object({ + subreddit: z.string().describe('The subreddit to fetch posts from.'), + type: z + .union([ + z.literal('hot'), + z.literal('top'), + z.literal('new'), + z.literal('rising') + ]) + .optional() + .describe('Type of posts to fetch (defaults to "hot").'), + limit: z + .number() + .int() + .max(100) + .optional() + .describe('Max number of posts to return (defaults to 5).'), + count: z + .number() + .int() + .optional() + .describe('Number of posts to offset by (defaults to 0).'), + time: z + .union([ + z.literal('hour'), + z.literal('day'), + z.literal('week'), + z.literal('month'), + z.literal('year'), + z.literal('all') + ]) + .optional() + .describe( + 'Time period to filter posts by (defaults to "all"). Only applicable to "top" posts type.' + ) + }) + }) + async getSubredditPosts( + subredditOrOpts: string | reddit.GetSubredditPostsOptions + ): Promise { + const params = + typeof subredditOrOpts === 'string' + ? { subreddit: subredditOrOpts } + : subredditOrOpts + const { subreddit, type = 'hot', limit = 5, geo, time, ...opts } = params + + const res = await this.ky + .get(`r/${subreddit}/${type}.json`, { + searchParams: sanitizeSearchParams({ + ...opts, + limit, + g: type === 'hot' ? geo : undefined, + t: type === 'top' ? time : undefined + }) + }) + .json() + + return { + subreddit, + type, + geo: type === 'hot' ? geo : undefined, + time: type === 'top' ? time : undefined, + posts: res.data.children.map((child) => { + const post = child.data + + // Trim the post data to only include the bare minimum + // TODO: add preview images + // TODO: add video media info + return { + ...pick( + post, + 'id', + 'name', + 'title', + 'subreddit', + 'selftext', + 'author', + 'author_fullname', + 'url', + 'permalink', + 'thumbnail', + 'thumbnail_width', + 'thumbnail_height', + 'score', + 'ups', + 'downs', + 'num_comments', + 'created_utc', + 'is_self', + 'is_video' + ), + permalink: `${this.baseUrl}${post.permalink}`, + thumbnail: + post.thumbnail !== 'self' && + post.thumbnail !== 'default' && + post.thumbnail !== 'spoiler' && + post.thumbnail !== 'nsfw' + ? post.thumbnail + : undefined + } + }) + } + } +} diff --git a/legacy/packages/reddit/tsconfig.json b/legacy/packages/reddit/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/reddit/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/packages/rocketreach/src/rocketreach-client.ts b/legacy/packages/rocketreach/src/rocketreach-client.ts index 23c275a0..d119773e 100644 --- a/legacy/packages/rocketreach/src/rocketreach-client.ts +++ b/legacy/packages/rocketreach/src/rocketreach-client.ts @@ -163,7 +163,7 @@ export class RocketReachClient extends AIFunctionsProvider { } = {}) { assert( apiKey, - `RocketReachClient missing required "username" (defaults to "ROCKETREACH_API_KEY")` + `RocketReachClient missing required "apiKey" (defaults to "ROCKETREACH_API_KEY")` ) super() diff --git a/legacy/packages/searxng/package.json b/legacy/packages/searxng/package.json index dce465e9..a9b7bb4f 100644 --- a/legacy/packages/searxng/package.json +++ b/legacy/packages/searxng/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/searxng" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/serpapi/package.json b/legacy/packages/serpapi/package.json index 0c013f03..614bcbb5 100644 --- a/legacy/packages/serpapi/package.json +++ b/legacy/packages/serpapi/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/serpapi" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/serper/package.json b/legacy/packages/serper/package.json index 242aa1c5..55aa7eff 100644 --- a/legacy/packages/serper/package.json +++ b/legacy/packages/serper/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/serper" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/slack/package.json b/legacy/packages/slack/package.json index 173675ba..5357a284 100644 --- a/legacy/packages/slack/package.json +++ b/legacy/packages/slack/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/slack" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/social-data/package.json b/legacy/packages/social-data/package.json index 0bed0800..46aef917 100644 --- a/legacy/packages/social-data/package.json +++ b/legacy/packages/social-data/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/social-data" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/stdlib/package.json b/legacy/packages/stdlib/package.json index 3d59f24d..ef3abb46 100644 --- a/legacy/packages/stdlib/package.json +++ b/legacy/packages/stdlib/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/stdlib" }, "type": "module", "source": "./src/index.ts", @@ -31,6 +32,7 @@ "test:typecheck": "tsc --noEmit" }, "dependencies": { + "@agentic/airtable": "workspace:*", "@agentic/apollo": "workspace:*", "@agentic/arxiv": "workspace:*", "@agentic/bing": "workspace:*", @@ -46,6 +48,8 @@ "@agentic/firecrawl": "workspace:*", "@agentic/github": "workspace:*", "@agentic/google-custom-search": "workspace:*", + "@agentic/google-docs": "workspace:*", + "@agentic/google-drive": "workspace:*", "@agentic/gravatar": "workspace:*", "@agentic/hacker-news": "workspace:*", "@agentic/hunter": "workspace:*", @@ -61,6 +65,7 @@ "@agentic/polygon": "workspace:*", "@agentic/predict-leads": "workspace:*", "@agentic/proxycurl": "workspace:*", + "@agentic/reddit": "workspace:*", "@agentic/rocketreach": "workspace:*", "@agentic/searxng": "workspace:*", "@agentic/serpapi": "workspace:*", @@ -70,10 +75,12 @@ "@agentic/tavily": "workspace:*", "@agentic/twilio": "workspace:*", "@agentic/twitter": "workspace:*", + "@agentic/typeform": "workspace:*", "@agentic/weather": "workspace:*", "@agentic/wikidata": "workspace:*", "@agentic/wikipedia": "workspace:*", "@agentic/wolfram-alpha": "workspace:*", + "@agentic/youtube": "workspace:*", "@agentic/zoominfo": "workspace:*", "@e2b/code-interpreter": "catalog:" }, diff --git a/legacy/packages/stdlib/src/index.ts b/legacy/packages/stdlib/src/index.ts index 343f3d84..6e78edc2 100644 --- a/legacy/packages/stdlib/src/index.ts +++ b/legacy/packages/stdlib/src/index.ts @@ -1,3 +1,4 @@ +export * from '@agentic/airtable' export * from '@agentic/apollo' export * from '@agentic/arxiv' export * from '@agentic/bing' @@ -12,6 +13,8 @@ export * from '@agentic/exa' export * from '@agentic/firecrawl' export * from '@agentic/github' export * from '@agentic/google-custom-search' +export * from '@agentic/google-docs' +export * from '@agentic/google-drive' export * from '@agentic/gravatar' export * from '@agentic/hacker-news' export * from '@agentic/hunter' @@ -27,6 +30,7 @@ export * from '@agentic/perigon' export * from '@agentic/polygon' export * from '@agentic/predict-leads' export * from '@agentic/proxycurl' +export * from '@agentic/reddit' export * from '@agentic/rocketreach' export * from '@agentic/searxng' export * from '@agentic/serpapi' @@ -36,8 +40,10 @@ export * from '@agentic/social-data' export * from '@agentic/tavily' export * from '@agentic/twilio' export * from '@agentic/twitter' +export * from '@agentic/typeform' export * from '@agentic/weather' export * from '@agentic/wikidata' export * from '@agentic/wikipedia' export * from '@agentic/wolfram-alpha' +export * from '@agentic/youtube' export * from '@agentic/zoominfo' diff --git a/legacy/packages/tavily/package.json b/legacy/packages/tavily/package.json index 31cf8568..c97013e3 100644 --- a/legacy/packages/tavily/package.json +++ b/legacy/packages/tavily/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/tavily" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/twilio/package.json b/legacy/packages/twilio/package.json index 5c9f0e3b..18ef8f7d 100644 --- a/legacy/packages/twilio/package.json +++ b/legacy/packages/twilio/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/twilio" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/twitter/package.json b/legacy/packages/twitter/package.json index fdc81341..5a15d68a 100644 --- a/legacy/packages/twitter/package.json +++ b/legacy/packages/twitter/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/twitter" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/twitter/src/twitter-client.ts b/legacy/packages/twitter/src/twitter-client.ts index 726ed513..040ceb0f 100644 --- a/legacy/packages/twitter/src/twitter-client.ts +++ b/legacy/packages/twitter/src/twitter-client.ts @@ -141,10 +141,10 @@ const twitterApiRateLimitsByPlan: Record< } /** - * Twitter API v2 client wrapper with rate-limited methods and `@aiFunction` + * Twitter/X API v2 client wrapper with rate-limited methods and `@aiFunction` * compatibility. * - * Rate limits differ by plan, so make sure theh `twitterApiPlan` parameter is + * Rate limits differ by plan, so make sure the `twitterApiPlan` parameter is * properly set to maximize your rate-limit usage. * * @note This class does not handle distributed rate-limits. It assumes a diff --git a/legacy/packages/typeform/package.json b/legacy/packages/typeform/package.json new file mode 100644 index 00000000..6a9daf3c --- /dev/null +++ b/legacy/packages/typeform/package.json @@ -0,0 +1,44 @@ +{ + "name": "@agentic/typeform", + "version": "7.6.3", + "description": "Agentic SDK for the Typeform API.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/typeform" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "ky": "catalog:" + }, + "peerDependencies": { + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/typeform/readme.md b/legacy/packages/typeform/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/typeform/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/typeform/src/index.ts b/legacy/packages/typeform/src/index.ts new file mode 100644 index 00000000..13caf7d6 --- /dev/null +++ b/legacy/packages/typeform/src/index.ts @@ -0,0 +1 @@ +export * from './typeform-client' diff --git a/legacy/packages/typeform/src/typeform-client.ts b/legacy/packages/typeform/src/typeform-client.ts new file mode 100644 index 00000000..29747e8d --- /dev/null +++ b/legacy/packages/typeform/src/typeform-client.ts @@ -0,0 +1,197 @@ +import { + aiFunction, + AIFunctionsProvider, + assert, + getEnv, + sanitizeSearchParams +} from '@agentic/core' +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +export namespace typeform { + export const API_BASE_URL = 'https://api.typeform.com' + + export interface GetInsightsForFormResponse { + fields: Array<{ + dropoffs: number + id: string + label: string + ref: string + title: string + type: string + views: number + }> + form: { + platforms: Array<{ + average_time: number + completion_rate: number + platform: string + responses_count: number + total_visits: number + unique_visits: number + }> + summary: { + average_time: number + completion_rate: number + responses_count: number + total_visits: number + unique_visits: number + } + } + } + + export interface GetResponsesForFormParams { + formId: string + pageSize?: number + since?: string + until?: string + completed?: boolean + } + + export interface GetResponsesForFormResponse { + total_items: number + page_count: number + items: Array<{ + landing_id: string + token: string + landed_at: string + submitted_at: string + metadata: { + user_agent: string + platform: string + referer: string + network_id: string + browser: string + } + answers: Array<{ + field: { + id: string + type: string + ref: string + } + type: string + [key: string]: any + }> + hidden: Record + calculated: { + score: number + } + variables: Array<{ + key: string + type: string + [key: string]: any + }> + }> + } +} + +/** + * Readonly Typeform API client for fetching form insights and responses. + * + * @see https://www.typeform.com/developers/get-started/ + */ +export class TypeformClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('TYPEFORM_API_KEY'), + apiBaseUrl = typeform.API_BASE_URL, + timeoutMs = 60_000, + ky = defaultKy + }: { + /** Typeform Personal Access Token */ + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'TypeformClient missing required "apiKey" (defaults to "TYPEFORM_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl, + timeout: timeoutMs, + headers: { + Authorization: `Bearer ${this.apiKey}` + } + }) + } + + /** + * Retrieves insights and analytics for a Typeform form. + */ + @aiFunction({ + name: 'typeform_get_insights_for_form', + description: 'Retrieve insights and analytics for a Typeform form.', + inputSchema: z.object({ + formId: z + .string() + .describe('The ID of the Typeform form to get insights for.') + }) + }) + async getInsightsForForm( + formIdOrOptions: string | { formId: string } + ): Promise { + const { formId } = + typeof formIdOrOptions === 'string' + ? { formId: formIdOrOptions } + : formIdOrOptions + + const encodedFormId = encodeURIComponent(formId) + return this.ky + .get(`insights/${encodedFormId}/summary`) + .json() + } + + /** + * Retrieves responses for a Typeform form. + */ + @aiFunction({ + name: 'typeform_get_responses_for_form', + description: 'Retrieve responses for a Typeform form.', + inputSchema: z.object({ + formId: z + .string() + .describe('The ID of the Typeform form to get responses for.'), + pageSize: z + .number() + .describe('The number of responses to retrieve per page.') + .optional(), + since: z + .string() + .describe('The date to start retrieving responses from.') + .optional(), + until: z + .string() + .describe('The date to stop retrieving responses at.') + .optional(), + completed: z + .boolean() + .describe('Filter responses by completion status.') + .optional() + }) + }) + async getResponsesForForm( + formIdOrOptions: string | typeform.GetResponsesForFormParams + ): Promise { + const { formId, ...params } = + typeof formIdOrOptions === 'string' + ? { formId: formIdOrOptions } + : formIdOrOptions + + const encodedFormId = encodeURIComponent(formId) + return this.ky + .get(`forms/${encodedFormId}/responses`, { + searchParams: sanitizeSearchParams(params) + }) + .json() + } +} diff --git a/legacy/packages/typeform/tsconfig.json b/legacy/packages/typeform/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/typeform/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/packages/weather/package.json b/legacy/packages/weather/package.json index 185e17ca..5b123237 100644 --- a/legacy/packages/weather/package.json +++ b/legacy/packages/weather/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/weather" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/wikidata/package.json b/legacy/packages/wikidata/package.json index 919c05b7..64fb0c4f 100644 --- a/legacy/packages/wikidata/package.json +++ b/legacy/packages/wikidata/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/wikidata" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/wikipedia/package.json b/legacy/packages/wikipedia/package.json index 80c9350a..2a979274 100644 --- a/legacy/packages/wikipedia/package.json +++ b/legacy/packages/wikipedia/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/wikipedia" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/wolfram-alpha/package.json b/legacy/packages/wolfram-alpha/package.json index 64cffa24..b0ec2434 100644 --- a/legacy/packages/wolfram-alpha/package.json +++ b/legacy/packages/wolfram-alpha/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/wolfram-alpha" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/xsai/package.json b/legacy/packages/xsai/package.json index 664f7227..6d5026f5 100644 --- a/legacy/packages/xsai/package.json +++ b/legacy/packages/xsai/package.json @@ -6,7 +6,8 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/transitive-bullshit/agentic.git" + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/xsai" }, "type": "module", "source": "./src/index.ts", diff --git a/legacy/packages/youtube/package.json b/legacy/packages/youtube/package.json new file mode 100644 index 00000000..6c754c93 --- /dev/null +++ b/legacy/packages/youtube/package.json @@ -0,0 +1,44 @@ +{ + "name": "@agentic/youtube", + "version": "7.6.3", + "description": "Agentic SDK for the YouTube data API.", + "author": "Travis Fischer ", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/transitive-bullshit/agentic.git", + "directory": "packages/youtube" + }, + "type": "module", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "sideEffects": false, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "clean": "del dist", + "test": "run-s test:*", + "test:lint": "eslint .", + "test:typecheck": "tsc --noEmit" + }, + "dependencies": { + "@agentic/core": "workspace:*", + "ky": "catalog:" + }, + "peerDependencies": { + "zod": "catalog:" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/legacy/packages/youtube/readme.md b/legacy/packages/youtube/readme.md new file mode 100644 index 00000000..38781f32 --- /dev/null +++ b/legacy/packages/youtube/readme.md @@ -0,0 +1,24 @@ +

+ + Agentic + +

+ +

+ AI agent stdlib that works with any LLM and TypeScript AI SDK. +

+ +

+ Build Status + NPM + MIT License + Prettier Code Formatting +

+ +# Agentic + +**See the [github repo](https://github.com/transitive-bullshit/agentic) or [docs](https://agentic.so) for more info.** + +## License + +MIT © [Travis Fischer](https://x.com/transitive_bs) diff --git a/legacy/packages/youtube/src/index.ts b/legacy/packages/youtube/src/index.ts new file mode 100644 index 00000000..5bf5307a --- /dev/null +++ b/legacy/packages/youtube/src/index.ts @@ -0,0 +1 @@ +export * from './youtube-client' diff --git a/legacy/packages/youtube/src/youtube-client.ts b/legacy/packages/youtube/src/youtube-client.ts new file mode 100644 index 00000000..e285dd15 --- /dev/null +++ b/legacy/packages/youtube/src/youtube-client.ts @@ -0,0 +1,270 @@ +import { + aiFunction, + AIFunctionsProvider, + assert, + getEnv, + sanitizeSearchParams +} from '@agentic/core' +import defaultKy, { type KyInstance } from 'ky' +import { z } from 'zod' + +export namespace youtube { + export const API_BASE_URL = 'https://www.googleapis.com/youtube/v3' + + export interface SearchOptions { + query: string + maxResults?: number + pageToken?: string + channelId?: string + channelType?: 'any' | 'show' + eventType?: 'live' | 'completed' | 'upcoming' + location?: string + locationRadius?: string + order?: + | 'relevance' + | 'date' + | 'rating' + | 'title' + | 'videoCount' + | 'viewCount' + // The value is an RFC 3339 formatted date-time value (1970-01-01T00:00:00Z). + publishedAfter?: string + publishedBefore?: string + // The regionCode parameter instructs the API to return search results for videos that can be viewed in the specified country. The parameter value is an ISO 3166-1 alpha-2 country code. + regionCode?: string + relevanceLanguage?: string + safeSearch?: 'moderate' | 'none' | 'strict' + topicId?: string + videoCaption?: 'any' | 'closedCaption' | 'none' + videoCategoryId?: string + videoDefinition?: 'any' | 'high' | 'standard' + videoDimension?: '2d' | '3d' | 'any' + videoDuration?: 'any' | 'long' | 'medium' | 'short' + videoEmbeddable?: 'any' | 'true' + videoLicense?: 'any' | 'creativeCommon' | 'youtube' + videoPaidProductPlacement?: 'any' | 'true' + videoSyndicated?: 'any' | 'true' + videoType?: 'any' | 'episode' | 'movie' + } + + export type SearchType = 'video' | 'channel' | 'playlist' + + export interface SearchVideosResult { + videoId: string + title: string + description: string + thumbnail: string + channelId: string + channelTitle: string + publishedAt: string + url: string + } + + export interface SearchChannelsResult { + channelId: string + title: string + description: string + thumbnail: string + publishedAt: string + url: string + } + + export type SearchResponse = { + results: T extends 'video' + ? SearchVideosResult[] + : T extends 'channel' + ? SearchChannelsResult[] + : never + totalResults: number + prevPageToken?: string + nextPageToken?: string + } + + export type SearchVideosResponse = SearchResponse<'video'> + export type SearchChannelsResponse = SearchResponse<'channel'> +} + +/** + * YouTube data API v3 client. + * + * @see https://developers.google.com/youtube/v3 + */ +export class YouTubeClient extends AIFunctionsProvider { + protected readonly ky: KyInstance + protected readonly apiKey: string + protected readonly apiBaseUrl: string + + constructor({ + apiKey = getEnv('YOUTUBE_API_KEY'), + apiBaseUrl = youtube.API_BASE_URL, + timeoutMs = 30_000, + ky = defaultKy + }: { + apiKey?: string + apiBaseUrl?: string + timeoutMs?: number + ky?: KyInstance + } = {}) { + assert( + apiKey, + 'YouTubeClient missing required "apiKey" (defaults to "YOUTUBE_API_KEY")' + ) + super() + + this.apiKey = apiKey + this.apiBaseUrl = apiBaseUrl + + this.ky = ky.extend({ + prefixUrl: this.apiBaseUrl, + timeout: timeoutMs + }) + } + + /** + * Searches for videos on YouTube. + * + * @see https://developers.google.com/youtube/v3/docs/search/list + */ + @aiFunction({ + name: 'youtube_search_videos', + description: 'Searches for videos on YouTube.', + inputSchema: z.object({ + query: z.string().describe(`The query to search for. + +Your request can optionally use the Boolean NOT (-) and OR (|) operators to exclude videos or to find videos that are associated with one of several search terms. For example, to search for videos matching either "boating" or "sailing", set the query parameter value to boating|sailing. Similarly, to search for videos matching either "boating" or "sailing" but not "fishing", set the query parameter value to boating|sailing -fishing.`), + maxResults: z + .number() + .int() + .optional() + .describe('The maximum number of results to return (defaults to 5).') + }) + }) + async searchVideos( + queryOrOpts: string | youtube.SearchOptions + ): Promise { + const opts = + typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts + + const data = await this._search({ + ...opts, + type: 'video' + }) + + const results = (data.items || []) + .map((item: any) => { + const snippet = item.snippet + if (!snippet) return null + + const videoId = item.id?.videoId + if (!videoId) return null + + const thumbnails = snippet.thumbnails + if (!thumbnails) return null + + return { + videoId, + title: snippet.title, + description: snippet.description, + // https://i.ytimg.com/vi/MRtg6A1f2Ko/maxresdefault.jpg + thumbnail: + thumbnails.high?.url || + thumbnails.medium?.url || + thumbnails.default?.url || + `https://i.ytimg.com/vi/${videoId}/maxresdefault.jpg`, + channelId: snippet.channelId, + channelTitle: snippet.channelTitle, + publishedAt: snippet.publishedAt, + url: `https://www.youtube.com/watch?v=${videoId}` + } + }) + .filter(Boolean) + + return { + results, + totalResults: data.pageInfo?.totalResults || 0, + prevPageToken: data.prevPageToken, + nextPageToken: data.nextPageToken + } + } + + /** + * Searches for channels on YouTube. + * + * @see https://developers.google.com/youtube/v3/docs/search/list + */ + @aiFunction({ + name: 'youtube_search_channels', + description: 'Searches for channels on YouTube.', + inputSchema: z.object({ + query: z.string().describe('The query to search for.'), + maxResults: z + .number() + .int() + .optional() + .describe('The maximum number of results to return (defaults to 5).') + }) + }) + async searchChannels( + queryOrOpts: string | youtube.SearchOptions + ): Promise { + const opts = + typeof queryOrOpts === 'string' ? { query: queryOrOpts } : queryOrOpts + + const data = await this._search({ + ...opts, + type: 'channel' + }) + + const results = (data.items || []) + .map((item: any) => { + const snippet = item.snippet + if (!snippet) return null + + const channelId = item.id?.channelId + if (!channelId) return null + + const thumbnails = snippet.thumbnails + if (!thumbnails) return null + + return { + channelId, + title: snippet.title, + description: snippet.description, + thumbnail: + thumbnails.high?.url || + thumbnails.medium?.url || + thumbnails.default?.url, + publishedAt: snippet.publishedAt, + url: `https://www.youtube.com/channel/${channelId}` + } + }) + .filter(Boolean) + + return { + results, + totalResults: data.pageInfo?.totalResults || 0, + prevPageToken: data.prevPageToken, + nextPageToken: data.nextPageToken + } + } + + protected async _search( + opts: youtube.SearchOptions & { + type: youtube.SearchType + } + ) { + const { query, ...params } = opts + + return this.ky + .get('search', { + searchParams: sanitizeSearchParams({ + q: query, + part: 'snippet', + maxResults: 5, + ...params, + key: this.apiKey + }) + }) + .json() + } +} diff --git a/legacy/packages/youtube/tsconfig.json b/legacy/packages/youtube/tsconfig.json new file mode 100644 index 00000000..51348fa1 --- /dev/null +++ b/legacy/packages/youtube/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@fisch0920/config/tsconfig-node", + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/legacy/pnpm-lock.yaml b/legacy/pnpm-lock.yaml index 9f95411d..0dcd1a35 100644 --- a/legacy/pnpm-lock.yaml +++ b/legacy/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@ai-sdk/openai': - specifier: ^1.3.7 - version: 1.3.7 + specifier: ^1.3.9 + version: 1.3.9 '@apidevtools/swagger-parser': specifier: ^10.1.1 version: 10.1.1 @@ -25,17 +25,17 @@ catalogs: specifier: ^3.2.0 version: 3.2.0 '@langchain/core': - specifier: ^0.3.43 - version: 0.3.43 + specifier: ^0.3.44 + version: 0.3.44 '@langchain/openai': - specifier: ^0.5.4 - version: 0.5.4 + specifier: ^0.5.5 + version: 0.5.5 '@mastra/core': - specifier: ^0.7.0 - version: 0.7.0 + specifier: ^0.8.1 + version: 0.8.1 '@modelcontextprotocol/sdk': - specifier: ^1.8.0 - version: 1.8.0 + specifier: ^1.9.0 + version: 1.9.0 '@nangohq/node': specifier: 0.42.22 version: 0.42.22 @@ -49,8 +49,8 @@ catalogs: specifier: ^0.2.0-beta.3 version: 0.2.0-beta.3 ai: - specifier: ^4.3.2 - version: 4.3.2 + specifier: ^4.3.4 + version: 4.3.4 bumpp: specifier: ^10.1.0 version: 10.1.0 @@ -91,11 +91,14 @@ catalogs: specifier: ^5.2.0 version: 5.2.0 genkit: - specifier: ^1.5.0 - version: 1.5.0 + specifier: ^1.6.0 + version: 1.6.0 genkitx-openai: specifier: ^0.20.2 version: 0.20.2 + googleapis: + specifier: ^148.0.0 + version: 148.0.0 json-schema-to-zod: specifier: ^2.6.1 version: 2.6.1 @@ -109,14 +112,14 @@ catalogs: specifier: ^1.8.0 version: 1.8.0 langchain: - specifier: ^0.3.20 - version: 0.3.20 + specifier: ^0.3.21 + version: 0.3.21 lint-staged: specifier: ^15.5.0 version: 15.5.0 llamaindex: - specifier: ^0.9.16 - version: 0.9.16 + specifier: ^0.9.17 + version: 0.9.17 mathjs: specifier: ^13.2.3 version: 13.2.3 @@ -130,8 +133,8 @@ catalogs: specifier: ^1.2.1 version: 1.2.1 openai: - specifier: ^4.91.1 - version: 4.91.1 + specifier: ^4.93.0 + version: 4.93.0 openai-fetch: specifier: ^3.4.2 version: 3.4.2 @@ -268,16 +271,16 @@ importers: version: link:../../packages/stdlib '@ai-sdk/openai': specifier: 'catalog:' - version: 1.3.7(zod@3.24.2) + version: 1.3.9(zod@3.24.2) ai: specifier: 'catalog:' - version: 4.3.2(react@18.3.1)(zod@3.24.2) + version: 4.3.4(react@18.3.1)(zod@3.24.2) exit-hook: specifier: 'catalog:' version: 4.0.0 openai: specifier: 'catalog:' - version: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + version: 4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) zod: specifier: 'catalog:' version: 3.24.2 @@ -322,10 +325,10 @@ importers: version: link:../../packages/stdlib genkit: specifier: 'catalog:' - version: 1.5.0 + version: 1.6.0 genkitx-openai: specifier: 'catalog:' - version: 0.20.2(encoding@0.1.13)(genkit@1.5.0)(ws@8.18.0)(zod@3.24.2) + version: 0.20.2(encoding@0.1.13)(genkit@1.6.0)(ws@8.18.0)(zod@3.24.2) zod: specifier: 'catalog:' version: 3.24.2 @@ -340,13 +343,13 @@ importers: version: link:../../packages/stdlib '@langchain/core': specifier: 'catalog:' - version: 0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + version: 0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) '@langchain/openai': specifier: 'catalog:' - version: 0.5.4(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0) + version: 0.5.5(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0) langchain: specifier: 'catalog:' - version: 0.3.20(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))(ws@8.18.0) + version: 0.3.21(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))(ws@8.18.0) zod: specifier: 'catalog:' version: 3.24.2 @@ -364,7 +367,7 @@ importers: version: link:../../packages/stdlib llamaindex: specifier: 'catalog:' - version: 0.9.16(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2) + version: 0.9.17(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2) zod: specifier: 'catalog:' version: 3.24.2 @@ -379,10 +382,10 @@ importers: version: link:../../packages/weather '@ai-sdk/openai': specifier: 'catalog:' - version: 1.3.7(zod@3.24.2) + version: 1.3.9(zod@3.24.2) '@mastra/core': specifier: 'catalog:' - version: 0.7.0(encoding@0.1.13)(react@18.3.1) + version: 0.8.1(encoding@0.1.13)(openapi-types@12.1.3)(react@18.3.1) zod: specifier: 'catalog:' version: 3.24.2 @@ -397,7 +400,7 @@ importers: version: link:../../packages/stdlib openai: specifier: 'catalog:' - version: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + version: 4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) zod: specifier: 'catalog:' version: 3.24.2 @@ -443,7 +446,19 @@ importers: devDependencies: ai: specifier: 'catalog:' - version: 4.3.2(react@18.3.1)(zod@3.24.2) + version: 4.3.4(react@18.3.1)(zod@3.24.2) + + packages/airtable: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + ky: + specifier: 'catalog:' + version: 1.8.0 + zod: + specifier: 'catalog:' + version: 3.24.2 packages/apollo: dependencies: @@ -663,7 +678,7 @@ importers: devDependencies: genkit: specifier: 'catalog:' - version: 1.5.0 + version: 1.6.0 packages/github: dependencies: @@ -689,6 +704,38 @@ importers: specifier: 'catalog:' version: 3.24.2 + packages/google-docs: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + type-fest: + specifier: 'catalog:' + version: 4.39.1 + zod: + specifier: 'catalog:' + version: 3.24.2 + devDependencies: + googleapis: + specifier: 'catalog:' + version: 148.0.0(encoding@0.1.13) + + packages/google-drive: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + type-fest: + specifier: 'catalog:' + version: 4.39.1 + zod: + specifier: 'catalog:' + version: 3.24.2 + devDependencies: + googleapis: + specifier: 'catalog:' + version: 148.0.0(encoding@0.1.13) + packages/gravatar: dependencies: '@agentic/core': @@ -742,10 +789,10 @@ importers: version: link:../core '@ai-sdk/openai': specifier: 'catalog:' - version: 1.3.7(zod@3.24.2) + version: 1.3.9(zod@3.24.2) ai: specifier: 'catalog:' - version: 4.3.2(react@18.3.1)(zod@3.24.2) + version: 4.3.4(react@18.3.1)(zod@3.24.2) packages/jina: dependencies: @@ -770,7 +817,7 @@ importers: devDependencies: '@langchain/core': specifier: 'catalog:' - version: 0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + version: 0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) packages/leadmagic: dependencies: @@ -795,7 +842,7 @@ importers: devDependencies: llamaindex: specifier: 'catalog:' - version: 0.9.16(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2) + version: 0.9.17(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2) packages/mastra: dependencies: @@ -805,7 +852,7 @@ importers: devDependencies: '@mastra/core': specifier: 'catalog:' - version: 0.7.0(encoding@0.1.13)(react@18.3.1) + version: 0.8.1(encoding@0.1.13)(openapi-types@12.1.3)(react@18.3.1) packages/mcp: dependencies: @@ -814,7 +861,7 @@ importers: version: link:../core '@modelcontextprotocol/sdk': specifier: 'catalog:' - version: 1.8.0 + version: 1.9.0 zod: specifier: 'catalog:' version: 3.24.2 @@ -976,6 +1023,18 @@ importers: specifier: 'catalog:' version: 3.24.2 + packages/reddit: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + ky: + specifier: 'catalog:' + version: 1.8.0 + zod: + specifier: 'catalog:' + version: 3.24.2 + packages/rocketreach: dependencies: '@agentic/core': @@ -1056,6 +1115,9 @@ importers: packages/stdlib: dependencies: + '@agentic/airtable': + specifier: workspace:* + version: link:../airtable '@agentic/apollo': specifier: workspace:* version: link:../apollo @@ -1101,6 +1163,12 @@ importers: '@agentic/google-custom-search': specifier: workspace:* version: link:../google-custom-search + '@agentic/google-docs': + specifier: workspace:* + version: link:../google-docs + '@agentic/google-drive': + specifier: workspace:* + version: link:../google-drive '@agentic/gravatar': specifier: workspace:* version: link:../gravatar @@ -1146,6 +1214,9 @@ importers: '@agentic/proxycurl': specifier: workspace:* version: link:../proxycurl + '@agentic/reddit': + specifier: workspace:* + version: link:../reddit '@agentic/rocketreach': specifier: workspace:* version: link:../rocketreach @@ -1173,6 +1244,9 @@ importers: '@agentic/twitter': specifier: workspace:* version: link:../twitter + '@agentic/typeform': + specifier: workspace:* + version: link:../typeform '@agentic/weather': specifier: workspace:* version: link:../weather @@ -1185,6 +1259,9 @@ importers: '@agentic/wolfram-alpha': specifier: workspace:* version: link:../wolfram-alpha + '@agentic/youtube': + specifier: workspace:* + version: link:../youtube '@agentic/zoominfo': specifier: workspace:* version: link:../zoominfo @@ -1246,6 +1323,18 @@ importers: specifier: 'catalog:' version: 3.24.2 + packages/typeform: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + ky: + specifier: 'catalog:' + version: 1.8.0 + zod: + specifier: 'catalog:' + version: 3.24.2 + packages/weather: dependencies: '@agentic/core': @@ -1313,6 +1402,18 @@ importers: specifier: 'catalog:' version: 0.2.0-beta.3(zod-to-json-schema@3.24.5(zod@3.24.2)) + packages/youtube: + dependencies: + '@agentic/core': + specifier: workspace:* + version: link:../core + ky: + specifier: 'catalog:' + version: 1.8.0 + zod: + specifier: 'catalog:' + version: 3.24.2 + packages/zoominfo: dependencies: '@agentic/core': @@ -1340,8 +1441,8 @@ importers: packages: - '@ai-sdk/openai@1.3.7': - resolution: {integrity: sha512-JjjEulfMgH5kGyCWKdyhxNLSIs2qBkUr6LtzNJtYlV23e5RbOHA5qgbbxn6IbGxeZs4xpPhpGmOnUVzh7GZwcg==} + '@ai-sdk/openai@1.3.9': + resolution: {integrity: sha512-XSkGWewA7UzyJu6Pfkzp4GsIqnyiE3tONlRh9WYBAZkD67bh3LY7wY+CGSuJzMkv/o4dBPT0gpVc9f7nn4D3rw==} engines: {node: '>=18'} peerDependencies: zod: ^3.0.0 @@ -1352,10 +1453,20 @@ packages: peerDependencies: zod: ^3.23.8 + '@ai-sdk/provider-utils@2.2.6': + resolution: {integrity: sha512-sUlZ7Gnq84DCGWMQRIK8XVbkzIBnvPR1diV4v6JwPgpn5armnLI/j+rqn62MpLrU5ZCQZlDKl/Lw6ed3ulYqaA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@ai-sdk/provider@1.1.0': resolution: {integrity: sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==} engines: {node: '>=18'} + '@ai-sdk/provider@1.1.2': + resolution: {integrity: sha512-ITdgNilJZwLKR7X5TnUr1BsQW6UTX5yFp0h66Nfx8XjBYkWD9W3yugr50GOz3CnE9m/U/Cd5OyEbTMI0rgi6ZQ==} + engines: {node: '>=18'} + '@ai-sdk/react@1.2.6': resolution: {integrity: sha512-5BFChNbcYtcY9MBStcDev7WZRHf0NpTrk8yfSoedWctB3jfWkFd1HECBvdc8w3mUQshF2MumLHtAhRO7IFtGGQ==} engines: {node: '>=18'} @@ -1366,12 +1477,28 @@ packages: zod: optional: true + '@ai-sdk/react@1.2.8': + resolution: {integrity: sha512-S2FzCSi4uTF0JuSN6zYMXyiAWVAzi/Hho8ISYgHpGZiICYLNCP2si4DuXQOsnWef3IXzQPLVoE11C63lILZIkw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + '@ai-sdk/ui-utils@1.2.5': resolution: {integrity: sha512-XDgqnJcaCkDez7qolvk+PDbs/ceJvgkNkxkOlc9uDWqxfDJxtvCZ+14MP/1qr4IBwGIgKVHzMDYDXvqVhSWLzg==} engines: {node: '>=18'} peerDependencies: zod: ^3.23.8 + '@ai-sdk/ui-utils@1.2.7': + resolution: {integrity: sha512-OVRxa4SDj0wVsMZ8tGr/whT89oqNtNoXBKmqWC2BRv5ZG6azL2LYZ5ZK35u3lb4l1IE7cWGsLlmq0py0ttsL7A==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@anush008/tokenizers-darwin-universal@0.0.0': resolution: {integrity: sha512-SACpWEooTjFX89dFKRVUhivMxxcZRtA3nJGVepdLyrwTkQ1TZQ8581B5JoXp0TcTMHfgnDaagifvVoBiFEdNCQ==} engines: {node: '>= 10'} @@ -1795,11 +1922,11 @@ packages: prettier: '>= 3' typescript: '>= 5' - '@genkit-ai/ai@1.5.0': - resolution: {integrity: sha512-nCH7cEJpvsLANtvuA6q/FVWvF+O29NtFt3eoQAgKbhkWs+89cjwdC82lS/fIxCNciENE3Ob1EAVh5xvv6/vN2g==} + '@genkit-ai/ai@1.6.0': + resolution: {integrity: sha512-jgvzbNGnAtULI6kfBkH7UwMmajDz1UELsWya+8f4YkSWlOpxVBIXCjqzvfLqa6OVliV2FbAbLibWNgz7BKKJKA==} - '@genkit-ai/core@1.5.0': - resolution: {integrity: sha512-enLpAH3jvQ5yxIIKrplFHDPhbXHcFBsgD9omIFwzX2LRxFKuxrqgdopxFEmcuCSMc8OZSgXgiINwI1ZUUEd3Cw==} + '@genkit-ai/core@1.6.0': + resolution: {integrity: sha512-7qcdETsrzJO8rtzt2q3MeqF6SA/Uj6T+n7q82YPxfXE0XbiBI8ydlxzSEvfhlASnHSoF2Ve4HzjgEb9opgmWvw==} '@googleapis/customsearch@3.2.0': resolution: {integrity: sha512-NTS4S3YepwYTqvk3aYKzm6g7oXjE7rQjswoXtw4leX7ykpyu2GWwflW6haaqctZHj6IJbJ1k0xgbgLTn1BByYQ==} @@ -1838,6 +1965,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -1862,12 +1993,12 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - '@langchain/core@0.3.43': - resolution: {integrity: sha512-DwiSUwmZqcuOn7j8SFdeOH1nvaUqG7q8qn3LhobdQYEg5PmjLgd2yLr2KzuT/YWMBfjkOR+Di5K6HEdFmouTxg==} + '@langchain/core@0.3.44': + resolution: {integrity: sha512-3BsSFf7STvPPZyl2kMANgtVnCUvDdyP4k+koP+nY2Tczd5V+RFkuazIn/JOj/xxy/neZjr4PxFU4BFyF1aKXOA==} engines: {node: '>=18'} - '@langchain/openai@0.5.4': - resolution: {integrity: sha512-fBIEgaAMs1OHHjSuOwtonhtFTlRyFETAS9y/4SZxlXV5lLdwEU5OAbfaBTcCR0A58rrlmgt8iPnm2IWn4Onjjw==} + '@langchain/openai@0.5.5': + resolution: {integrity: sha512-QwdZrWcx6FB+UMKQ6+a0M9ZXzeUnZCwXP7ltqCCycPzdfiwxg3TQ6WkSefdEyiPpJcVVq/9HZSxrzGmf18QGyw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': '>=0.3.39 <0.4.0' @@ -1929,8 +2060,8 @@ packages: cpu: [x64] os: [win32] - '@llamaindex/cloud@4.0.2': - resolution: {integrity: sha512-/uAuGXFvrzt/GbIXHyc2PHZWWcP+sKFKM6YTaYj7iQnhjJzwKB0HEWJ7lp4teh610VeP7nUiZXEC610iGNFKPA==} + '@llamaindex/cloud@4.0.3': + resolution: {integrity: sha512-pUHX8Ecs4WAXIoAcegPzuxz05SsufU5+HAdb9H/gowLB1rydQOJjk2CvBuzgQbbablmggvCBpt/tpdEZYOKd2w==} peerDependencies: '@llamaindex/core': 0.6.2 '@llamaindex/env': 0.1.29 @@ -1960,19 +2091,19 @@ packages: '@llamaindex/openai@0.3.0': resolution: {integrity: sha512-SJJqyas7/SRz5YhegjrL6pQCt2Zx6MbOHbZgyPEwSXtVU1XzE8xfmaf5RmbIdOKT7+xhPKbt6pUc0en+Z4h+tw==} - '@llamaindex/workflow@1.0.2': - resolution: {integrity: sha512-9C24bASoWWXtH8BdRrrd5gZmGuN0Z7axtLPkXxrRy/RwSZxNMAL3fti3OAOp2yEM7puvtu2s5xFEaPeFyZMOwQ==} + '@llamaindex/workflow@1.0.3': + resolution: {integrity: sha512-GzYzLfn12BTQiLVwFr9tGl1Sa7PPVErLLQAJMgvfjUK8cv764SpJGqln8iKTxnKF05HcRrmJeE7ZD9Lzpf7UrA==} peerDependencies: '@llamaindex/core': 0.6.2 '@llamaindex/env': 0.1.29 zod: ^3.23.8 - '@mastra/core@0.7.0': - resolution: {integrity: sha512-Sqe9An7GfA9wEYTDyxhT6yKnhjFxg27DdeC2/BMeB9cAvX+LsnnoAJ9s33NyXInqaGRd9QT38xXrm2mz7x10iQ==} + '@mastra/core@0.8.1': + resolution: {integrity: sha512-R5nIlHB6lx79QNaAwrLiOxxURvQzEtfI1HAWT7c/qo0w5cUsFKU+AxOT0ITZqG79STAanJ2YkvJwkbhVmRh05Q==} engines: {node: '>=20'} - '@modelcontextprotocol/sdk@1.8.0': - resolution: {integrity: sha512-e06W7SwrontJDHwCawNO5SGxG+nU9AAx+jpHHZqGl/WrDBdWOpvirC+s58VpJTB5QemI4jTRcjWT4Pt3Q1NPQQ==} + '@modelcontextprotocol/sdk@1.9.0': + resolution: {integrity: sha512-Jq2EUCQpe0iyO5FGpzVYDNFR6oR53AIrwph9yWl7uSc7IWUMsrmpmSaTGra5hQNunXpM+9oit85p924jWuHzUA==} engines: {node: '>=18'} '@nangohq/node@0.42.22': @@ -3084,9 +3215,6 @@ packages: '@types/node@20.17.27': resolution: {integrity: sha512-U58sbKhDrthHlxHRJw7ZLiLDZGmAUOZUbpw0S6nL27sYUdhvgBLCRu/keSd6qcTsfArd1sRFCCBxzWATGr/0UA==} - '@types/node@22.13.16': - resolution: {integrity: sha512-15tM+qA4Ypml/N7kyRdvfRjBQT2RL461uF1Bldn06K0Nzn1lY3nAPgHlsVrJxdZ9WhZiW0Fmc1lOYMtDsAuB3w==} - '@types/node@22.14.0': resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} @@ -3283,8 +3411,8 @@ packages: resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} engines: {node: '>= 8.0.0'} - ai@4.3.1: - resolution: {integrity: sha512-6RSRE0x0FAUZxWpLOq6yrh1IFXakvvJgHs8xPHtt8VmsTqhgjP5GClguaGs+KCpVbVfdygwgji7YJjOwq80suQ==} + ai@4.3.2: + resolution: {integrity: sha512-h643SfhKil0Pnxk2tVIazFDL1JevutUghvc3mOpWqJFMcudmgtwQYlvxCkwSfljrrq+qIfne8d6jCihMMhM7pw==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -3293,8 +3421,8 @@ packages: react: optional: true - ai@4.3.2: - resolution: {integrity: sha512-h643SfhKil0Pnxk2tVIazFDL1JevutUghvc3mOpWqJFMcudmgtwQYlvxCkwSfljrrq+qIfne8d6jCihMMhM7pw==} + ai@4.3.4: + resolution: {integrity: sha512-uMjzrowIqfU8CCCxhx8QGl7ETydHBROeNL0VoEwetkmDCY6Q8ZTacj6jNNqGJOiCk595aUrGR9VHPY9Ylvy1fg==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -3460,6 +3588,10 @@ packages: resolution: {integrity: sha512-/hPxh61E+ll0Ujp24Ilm64cykicul1ypfwjVttduAiEdtnJFvLePSrIPk+HMImtNv5270wOGCb1Tns2rybMkoQ==} engines: {node: '>=18'} + boolean@3.2.0: + resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -3576,6 +3708,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + ci-info@4.2.0: resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} @@ -3605,6 +3741,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + codsen-utils@1.6.7: resolution: {integrity: sha512-M+9D3IhFAk4T8iATX62herVuIx1sp5kskWgxEegKD/JwTTSSGjGQs5Q5J4vVJ4mLcn1uhfxDYv6Yzr8zleHF3w==} engines: {node: '>=14.18.0'} @@ -3843,6 +3983,9 @@ packages: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + diff-match-patch@1.0.5: resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} @@ -3966,6 +4109,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + esbuild@0.25.1: resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} engines: {node: '>=18'} @@ -4228,8 +4374,8 @@ packages: resolution: {integrity: sha512-Uw9+Mjt4SBRud1IcaYuW/O0lW8SKKdMl5g7g24HiIuyH5fQSD+AVLybSlJtqLYEbytVFjWQa5DMGcNgeksdRBg==} hasBin: true - fastembed@1.14.1: - resolution: {integrity: sha512-Y14v+FWZwjNUpQ7mRGYu4N5yF+hZkF7zqzPWzzLbwdIEtYsHy0DSpiVJ+Fg6Oi1fQjrBKASQt0hdSMSjw1/Wtw==} + fastembed@1.14.4: + resolution: {integrity: sha512-ZU9hpQRkYKPD/k0A6NzFe/Z9voSU3Saxve/1kLY9aS9iyUJYLJPI/3gsDgRA9uxwIMi8w7/tjH1lRW8K1N+wWA==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -4366,8 +4512,8 @@ packages: resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} engines: {node: '>=14'} - genkit@1.5.0: - resolution: {integrity: sha512-ODRSj/Hk7H5EhMNQDcvmCIS+izCyn0fIyuR65DajX3M4TFy82nWj2OqWTKodpj1F2zMMm9crrcGLmLHS7fGOeA==} + genkit@1.6.0: + resolution: {integrity: sha512-29XyQrvUmpEBzvL+H9iIoKi3a7GdQNv7rcMlsT18CddpizaltPiwyQG33xXvFUwQB0l3UiTd+apTWm2XpMh04A==} genkitx-openai@0.20.2: resolution: {integrity: sha512-OWzQmBbJh3YwF8tuBsokVzMIxbQiur2IeXEXWUvY4qVS05gOdPt2EC+/jlEJgoAkTta3KF/elZdmAQmkK6+pYA==} @@ -4429,6 +4575,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + global-agent@3.0.0: + resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} + engines: {node: '>=10.0'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -4457,6 +4607,10 @@ packages: resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} engines: {node: '>=14.0.0'} + googleapis@148.0.0: + resolution: {integrity: sha512-8PDG5VItm6E1TdZWDqtRrUJSlBcNwz0/MwCa6AL81y/RxPGXJRUwKqGZfCoVX1ZBbfr3I4NkDxBmeTyOAZSWqw==} + engines: {node: '>=14.0.0'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -4510,6 +4664,57 @@ packages: help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + hono-openapi@0.4.6: + resolution: {integrity: sha512-wSDySp2cS5Zcf1OeLG7nCP3eMsCpcDomN137T9B6/Z5Qq3D0nWgMf0I3Gl41SE1rE37OBQ0Smqx3LOP9Hk//7A==} + peerDependencies: + '@hono/arktype-validator': ^2.0.0 + '@hono/effect-validator': ^1.2.0 + '@hono/typebox-validator': ^0.2.0 || ^0.3.0 + '@hono/valibot-validator': ^0.5.1 + '@hono/zod-validator': ^0.4.1 + '@sinclair/typebox': ^0.34.9 + '@valibot/to-json-schema': ^1.0.0-beta.3 + arktype: ^2.0.0-rc.25 + effect: ^3.11.3 + hono: ^4.6.13 + openapi-types: ^12.1.3 + valibot: ^1.0.0-beta.9 + zod: ^3.23.8 + zod-openapi: ^4.0.0 + peerDependenciesMeta: + '@hono/arktype-validator': + optional: true + '@hono/effect-validator': + optional: true + '@hono/typebox-validator': + optional: true + '@hono/valibot-validator': + optional: true + '@hono/zod-validator': + optional: true + '@sinclair/typebox': + optional: true + '@valibot/to-json-schema': + optional: true + arktype: + optional: true + effect: + optional: true + hono: + optional: true + openapi-types: + optional: true + valibot: + optional: true + zod: + optional: true + zod-openapi: + optional: true + + hono@4.7.6: + resolution: {integrity: sha512-564rVzELU+9BRqqx5k8sT2NFwGD3I3Vifdb6P7CmM6FiarOSY+fDC+6B+k9wcCb86ReoayteZP2ki0cRLN1jbw==} + engines: {node: '>=16.9.0'} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -4809,10 +5014,6 @@ packages: resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} engines: {node: ^18.17.0 || >=20.5.0} - json-schema-to-zod@2.6.0: - resolution: {integrity: sha512-6sFZqOzHZeON8g2ZW5HJ114Hb/FffNCjWh8dgulJaKFkUqKCEWZAzF4+g07SQpfBZF7HXemwedtdLypZzmnVpQ==} - hasBin: true - json-schema-to-zod@2.6.1: resolution: {integrity: sha512-uiHmWH21h9FjKJkRBntfVGTLpYlCZ1n98D0izIlByqQLqpmkQpNTBtfbdP04Na6+43lgsvrShFh2uWLkQDKJuQ==} hasBin: true @@ -4823,12 +5024,19 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-walker@2.0.0: + resolution: {integrity: sha512-nXN2cMky0Iw7Af28w061hmxaPDaML5/bQD9nwm1lOoIKEGjHcRGxqWe4MfrkYThYAPjSUhmsp4bJNoLAyVn9Xw==} + engines: {node: '>=10'} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -4870,16 +5078,12 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - ky@1.7.5: - resolution: {integrity: sha512-HzhziW6sc5m0pwi5M196+7cEBtbt0lCYi67wNsiwMUmz833wloE0gbzJPWKs1gliFKQb34huItDQX97LyOdPdA==} - engines: {node: '>=18'} - ky@1.8.0: resolution: {integrity: sha512-DoKGmG27nT8t/1F9gV8vNzggJ3mLAyD49J8tTMWHeZvS8qLc7GlyTieicYtFzvDznMe/q2u38peOjkWc5/pjvw==} engines: {node: '>=18'} - langchain@0.3.20: - resolution: {integrity: sha512-BFCsJqKu5yJMG7AKWfTkku3rRnTGxnvi3tQXBceQt406moJ8VfZqMWrl7FC1WPkdNKinepPON2q5sb62IPoKwQ==} + langchain@0.3.21: + resolution: {integrity: sha512-fpor/V/xJRoLM7s1yQGlUE6aZIe6LLm7ciZcstNbBUYdFpCSigvADsW2cqlBCdbMXJxb5I/z9jznjGnmciJ+aw==} engines: {node: '>=18'} peerDependencies: '@langchain/anthropic': '*' @@ -4978,8 +5182,8 @@ packages: resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} engines: {node: '>=18.0.0'} - llamaindex@0.9.16: - resolution: {integrity: sha512-UQABJboX/0dWLZk4+6pvv/gotc8FUAl87SnP1XhPLihZB1ShK/I6BftVrnbN/D6zHctLQ6KmieoWtCjgZGtwCw==} + llamaindex@0.9.17: + resolution: {integrity: sha512-pSx6Xt7NIvcaETVS99ol0HtwsGzGBPClvBJHMU3xFLo+X8N3WSrU6HGjw/JexKIc9ek9dcdpx5WtIK9XFzyN2Q==} engines: {node: '>=18.0.0'} load-tsconfig@0.2.5: @@ -5031,6 +5235,10 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + matcher@3.0.0: + resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} + engines: {node: '>=10'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -5137,11 +5345,20 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + module-details-from-path@1.0.3: resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} @@ -5308,11 +5525,11 @@ packages: resolution: {integrity: sha512-M7CJbmv7UCopc0neRKdzfoGWaVZC+xC1925GitKH9EAqYFzX9//25Q7oX4+jw0tiCCj+t5l6VZh8UPH23NZkMA==} hasBin: true - onnxruntime-common@1.15.1: - resolution: {integrity: sha512-Y89eJ8QmaRsPZPWLaX7mfqhj63ny47rSkQe80hIo+lvBQdrdXYR9VO362xvZulk9DFkCnXmGidprvgJ07bKsIQ==} + onnxruntime-common@1.21.0: + resolution: {integrity: sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==} - onnxruntime-node@1.15.1: - resolution: {integrity: sha512-wzhVELulmrvNoMZw0/HfV+9iwgHX+kPS82nxodZ37WCXmbeo1jp3thamTsNg8MGhxvv4GmEzRum5mo40oqIsqw==} + onnxruntime-node@1.21.0: + resolution: {integrity: sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==} os: [win32, darwin, linux] openai-fetch@3.4.2: @@ -5325,8 +5542,8 @@ packages: peerDependencies: zod: ^3.23.8 - openai@4.91.0: - resolution: {integrity: sha512-zdDg6eyvUmCP58QAW7/aPb+XdeavJ51pK6AcwZOWG5QNSLIovVz0XonRL9vARGJRmw8iImmvf2A31Q7hoh544w==} + openai@4.91.1: + resolution: {integrity: sha512-DbjrR0hIMQFbxz8+3qBsfPJnh3+I/skPgoSlT7f9eiZuhGBUissPQULNgx6gHNkLoZ3uS0uYS6eXPUdtg4nHzw==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -5337,8 +5554,8 @@ packages: zod: optional: true - openai@4.91.1: - resolution: {integrity: sha512-DbjrR0hIMQFbxz8+3qBsfPJnh3+I/skPgoSlT7f9eiZuhGBUissPQULNgx6gHNkLoZ3uS0uYS6eXPUdtg4nHzw==} + openai@4.93.0: + resolution: {integrity: sha512-2kONcISbThKLfm7T9paVzg+QCE1FOZtNMMUfXyXckUAoXRRS/mTP89JSDHPMp8uM5s0bz28RISbvQjArD6mgUQ==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -5521,8 +5738,8 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkce-challenge@4.1.0: - resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} engines: {node: '>=16.20.0'} pkg-types@2.1.0: @@ -5779,6 +5996,10 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + roarr@2.15.4: + resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} + engines: {node: '>=8.0'} + rollup@4.36.0: resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5828,6 +6049,9 @@ packages: selderee@0.11.0: resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5845,6 +6069,10 @@ packages: resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} engines: {node: '>= 18'} + serialize-error@7.0.1: + resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} + engines: {node: '>=10'} + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} @@ -5963,6 +6191,9 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -6122,6 +6353,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + terminal-columns@1.4.1: resolution: {integrity: sha512-IKVL/itiMy947XWVv4IHV7a0KQXvKjj4ptbi7Ew9MPMcOLzkiQeyx3Gyvh62hKrfJ0RZc4M1nbhzjNM39Kyujw==} @@ -6279,9 +6514,9 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@4.39.0: - resolution: {integrity: sha512-w2IGJU1tIgcrepg9ZJ82d8UmItNQtOFJG0HCUE3SzMokKkTsruVDALl2fAdiEzJlfduoU+VyXJWIIUZ+6jV+nw==} - engines: {node: '>=16'} + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} type-fest@4.39.1: resolution: {integrity: sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==} @@ -6345,9 +6580,6 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -6611,6 +6843,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.7.0: resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} @@ -6655,10 +6891,10 @@ packages: snapshots: - '@ai-sdk/openai@1.3.7(zod@3.24.2)': + '@ai-sdk/openai@1.3.9(zod@3.24.2)': dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.4(zod@3.24.2) + '@ai-sdk/provider': 1.1.2 + '@ai-sdk/provider-utils': 2.2.6(zod@3.24.2) zod: 3.24.2 '@ai-sdk/provider-utils@2.2.4(zod@3.24.2)': @@ -6668,10 +6904,21 @@ snapshots: secure-json-parse: 2.7.0 zod: 3.24.2 + '@ai-sdk/provider-utils@2.2.6(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.2 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.24.2 + '@ai-sdk/provider@1.1.0': dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@1.1.2': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/react@1.2.6(react@18.3.1)(zod@3.24.2)': dependencies: '@ai-sdk/provider-utils': 2.2.4(zod@3.24.2) @@ -6682,6 +6929,16 @@ snapshots: optionalDependencies: zod: 3.24.2 + '@ai-sdk/react@1.2.8(react@18.3.1)(zod@3.24.2)': + dependencies: + '@ai-sdk/provider-utils': 2.2.6(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.7(zod@3.24.2) + react: 18.3.1 + swr: 2.3.3(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.24.2 + '@ai-sdk/ui-utils@1.2.5(zod@3.24.2)': dependencies: '@ai-sdk/provider': 1.1.0 @@ -6689,6 +6946,13 @@ snapshots: zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) + '@ai-sdk/ui-utils@1.2.7(zod@3.24.2)': + dependencies: + '@ai-sdk/provider': 1.1.2 + '@ai-sdk/provider-utils': 2.2.6(zod@3.24.2) + zod: 3.24.2 + zod-to-json-schema: 3.24.5(zod@3.24.2) + '@anush008/tokenizers-darwin-universal@0.0.0': optional: true @@ -7201,7 +7465,7 @@ snapshots: dedent: 1.5.3 hash-object: 5.0.1 jsonrepair: 3.12.0 - ky: 1.7.5 + ky: 1.8.0 openai-fetch: 3.4.2 openai-zod-to-json-schema: 1.0.3(zod@3.24.2) p-map: 7.0.3 @@ -7381,9 +7645,9 @@ snapshots: - supports-color - vitest - '@genkit-ai/ai@1.5.0': + '@genkit-ai/ai@1.6.0': dependencies: - '@genkit-ai/core': 1.5.0 + '@genkit-ai/core': 1.6.0 '@opentelemetry/api': 1.9.0 '@types/node': 20.17.27 colorette: 2.0.20 @@ -7395,7 +7659,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@genkit-ai/core@1.5.0': + '@genkit-ai/core@1.6.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -7459,6 +7723,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -7480,14 +7748,14 @@ snapshots: '@jsdevtools/ono@7.1.3': {} - '@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))': + '@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.19 - langsmith: 0.3.10(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + langsmith: 0.3.10(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7497,20 +7765,20 @@ snapshots: transitivePeerDependencies: - openai - '@langchain/openai@0.5.4(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0)': + '@langchain/openai@0.5.5(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0)': dependencies: - '@langchain/core': 0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + '@langchain/core': 0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) js-tiktoken: 1.0.19 - openai: 4.91.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + openai: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) transitivePeerDependencies: - encoding - ws - '@langchain/textsplitters@0.1.0(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))': + '@langchain/textsplitters@0.1.0(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))': dependencies: - '@langchain/core': 0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + '@langchain/core': 0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) js-tiktoken: 1.0.19 '@libsql/client@0.14.0': @@ -7569,7 +7837,7 @@ snapshots: '@libsql/win32-x64-msvc@0.4.7': optional: true - '@llamaindex/cloud@4.0.2(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))': + '@llamaindex/cloud@4.0.3(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))': dependencies: '@llamaindex/core': 0.6.2(gpt-tokenizer@2.8.1) '@llamaindex/env': 0.1.29(gpt-tokenizer@2.8.1) @@ -7577,7 +7845,7 @@ snapshots: '@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1)': dependencies: '@llamaindex/env': 0.1.29(gpt-tokenizer@2.8.1) - '@types/node': 22.13.16 + '@types/node': 22.14.0 magic-bytes.js: 1.10.0 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) @@ -7605,7 +7873,7 @@ snapshots: dependencies: '@llamaindex/core': 0.6.2(gpt-tokenizer@2.8.1) '@llamaindex/env': 0.1.29(gpt-tokenizer@2.8.1) - openai: 4.91.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + openai: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) zod: 3.24.2 transitivePeerDependencies: - '@huggingface/transformers' @@ -7613,13 +7881,13 @@ snapshots: - gpt-tokenizer - ws - '@llamaindex/workflow@1.0.2(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))(zod@3.24.2)': + '@llamaindex/workflow@1.0.3(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))(zod@3.24.2)': dependencies: '@llamaindex/core': 0.6.2(gpt-tokenizer@2.8.1) '@llamaindex/env': 0.1.29(gpt-tokenizer@2.8.1) zod: 3.24.2 - '@mastra/core@0.7.0(encoding@0.1.13)(react@18.3.1)': + '@mastra/core@0.8.1(encoding@0.1.13)(openapi-types@12.1.3)(react@18.3.1)': dependencies: '@libsql/client': 0.14.0 '@opentelemetry/api': 1.9.0 @@ -7635,13 +7903,15 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.30.0 - ai: 4.3.1(react@18.3.1)(zod@3.24.2) + ai: 4.3.2(react@18.3.1)(zod@3.24.2) cohere-ai: 7.16.0(encoding@0.1.13) date-fns: 3.6.0 dotenv: 16.4.7 - fastembed: 1.14.1 + fastembed: 1.14.4 + hono: 4.7.6 + hono-openapi: 0.4.6(hono@4.7.6)(openapi-types@12.1.3)(zod@3.24.2) json-schema: 0.4.0 - json-schema-to-zod: 2.6.0 + json-schema-to-zod: 2.6.1 pino: 9.6.0 pino-pretty: 13.0.0 radash: 12.1.0 @@ -7649,14 +7919,26 @@ snapshots: xstate: 5.19.2 zod: 3.24.2 transitivePeerDependencies: + - '@hono/arktype-validator' + - '@hono/effect-validator' + - '@hono/typebox-validator' + - '@hono/valibot-validator' + - '@hono/zod-validator' + - '@sinclair/typebox' + - '@valibot/to-json-schema' + - arktype - aws-crt - bufferutil + - effect - encoding + - openapi-types - react - supports-color - utf-8-validate + - valibot + - zod-openapi - '@modelcontextprotocol/sdk@1.8.0': + '@modelcontextprotocol/sdk@1.9.0': dependencies: content-type: 1.0.5 cors: 2.8.5 @@ -7664,7 +7946,7 @@ snapshots: eventsource: 3.0.5 express: 5.0.1 express-rate-limit: 7.5.0(express@5.0.1) - pkce-challenge: 4.1.0 + pkce-challenge: 5.0.0 raw-body: 3.0.0 zod: 3.24.2 zod-to-json-schema: 3.24.5(zod@3.24.2) @@ -9092,11 +9374,11 @@ snapshots: '@types/bunyan@1.8.11': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@types/debug@4.1.12': dependencies: @@ -9125,18 +9407,18 @@ snapshots: '@types/memcached@2.2.10': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@types/ms@2.1.0': optional: true '@types/mysql@2.15.26': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 form-data: 4.0.2 '@types/node@18.19.83': @@ -9147,10 +9429,6 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.13.16': - dependencies: - undici-types: 6.20.0 - '@types/node@22.14.0': dependencies: undici-types: 6.21.0 @@ -9163,7 +9441,7 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 pg-protocol: 1.8.0 pg-types: 2.2.0 @@ -9173,7 +9451,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@types/uuid@10.0.0': {} @@ -9181,7 +9459,7 @@ snapshots: '@types/ws@8.18.0': dependencies: - '@types/node': 22.13.16 + '@types/node': 22.14.0 '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: @@ -9410,7 +9688,7 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ai@4.3.1(react@18.3.1)(zod@3.24.2): + ai@4.3.2(react@18.3.1)(zod@3.24.2): dependencies: '@ai-sdk/provider': 1.1.0 '@ai-sdk/provider-utils': 2.2.4(zod@3.24.2) @@ -9422,12 +9700,12 @@ snapshots: optionalDependencies: react: 18.3.1 - ai@4.3.2(react@18.3.1)(zod@3.24.2): + ai@4.3.4(react@18.3.1)(zod@3.24.2): dependencies: - '@ai-sdk/provider': 1.1.0 - '@ai-sdk/provider-utils': 2.2.4(zod@3.24.2) - '@ai-sdk/react': 1.2.6(react@18.3.1)(zod@3.24.2) - '@ai-sdk/ui-utils': 1.2.5(zod@3.24.2) + '@ai-sdk/provider': 1.1.2 + '@ai-sdk/provider-utils': 2.2.6(zod@3.24.2) + '@ai-sdk/react': 1.2.8(react@18.3.1)(zod@3.24.2) + '@ai-sdk/ui-utils': 1.2.7(zod@3.24.2) '@opentelemetry/api': 1.9.0 jsondiffpatch: 0.6.0 zod: 3.24.2 @@ -9624,6 +9902,8 @@ snapshots: transitivePeerDependencies: - supports-color + boolean@3.2.0: {} + bottleneck@2.19.5: {} bowser@2.11.0: {} @@ -9752,6 +10032,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + ci-info@4.2.0: {} citty@0.1.6: @@ -9784,6 +10066,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@2.1.2: {} + codsen-utils@1.6.7: dependencies: rfdc: 1.4.1 @@ -9984,6 +10268,8 @@ snapshots: detect-libc@2.0.2: {} + detect-node@2.1.0: {} + diff-match-patch@1.0.5: {} doctrine@2.1.0: @@ -10175,6 +10461,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-error@4.1.1: {} + esbuild@0.25.1: optionalDependencies: '@esbuild/aix-ppc64': 0.25.1 @@ -10596,10 +10884,10 @@ snapshots: dependencies: strnum: 2.0.5 - fastembed@1.14.1: + fastembed@1.14.4: dependencies: '@anush008/tokenizers': 0.0.0 - onnxruntime-node: 1.15.1 + onnxruntime-node: 1.21.0 progress: 2.0.3 tar: 6.2.1 @@ -10748,18 +11036,18 @@ snapshots: - encoding - supports-color - genkit@1.5.0: + genkit@1.6.0: dependencies: - '@genkit-ai/ai': 1.5.0 - '@genkit-ai/core': 1.5.0 + '@genkit-ai/ai': 1.6.0 + '@genkit-ai/core': 1.6.0 uuid: 10.0.0 transitivePeerDependencies: - supports-color - genkitx-openai@0.20.2(encoding@0.1.13)(genkit@1.5.0)(ws@8.18.0)(zod@3.24.2): + genkitx-openai@0.20.2(encoding@0.1.13)(genkit@1.6.0)(ws@8.18.0)(zod@3.24.2): dependencies: - genkit: 1.5.0 - openai: 4.91.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + genkit: 1.6.0 + openai: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) transitivePeerDependencies: - encoding - ws @@ -10845,6 +11133,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + global-agent@3.0.0: + dependencies: + boolean: 3.2.0 + es6-error: 4.1.1 + matcher: 3.0.0 + roarr: 2.15.4 + semver: 7.7.1 + serialize-error: 7.0.1 + globals@14.0.0: {} globals@16.0.0: {} @@ -10889,6 +11186,14 @@ snapshots: - encoding - supports-color + googleapis@148.0.0(encoding@0.1.13): + dependencies: + google-auth-library: 9.15.1(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + gopd@1.2.0: {} gpt-tokenizer@2.8.1: @@ -10936,7 +11241,7 @@ snapshots: decircular: 0.1.1 is-obj: 3.0.0 sort-keys: 5.1.0 - type-fest: 4.39.0 + type-fest: 4.39.1 hasown@2.0.2: dependencies: @@ -10944,6 +11249,16 @@ snapshots: help-me@5.0.0: {} + hono-openapi@0.4.6(hono@4.7.6)(openapi-types@12.1.3)(zod@3.24.2): + dependencies: + json-schema-walker: 2.0.0 + optionalDependencies: + hono: 4.7.6 + openapi-types: 12.1.3 + zod: 3.24.2 + + hono@4.7.6: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -11224,18 +11539,23 @@ snapshots: json-parse-even-better-errors@4.0.0: {} - json-schema-to-zod@2.6.0: {} - json-schema-to-zod@2.6.1: {} json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} + json-schema-walker@2.0.0: + dependencies: + '@apidevtools/json-schema-ref-parser': 11.7.2 + clone: 2.1.2 + json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -11278,19 +11598,17 @@ snapshots: dependencies: json-buffer: 3.0.1 - ky@1.7.5: {} - ky@1.8.0: {} - langchain@0.3.20(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))(ws@8.18.0): + langchain@0.3.21(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(axios@1.7.9)(encoding@0.1.13)(handlebars@4.7.8)(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))(ws@8.18.0): dependencies: - '@langchain/core': 0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) - '@langchain/openai': 0.5.4(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0) - '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.43(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))) + '@langchain/core': 0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + '@langchain/openai': 0.5.5(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)))(encoding@0.1.13)(ws@8.18.0) + '@langchain/textsplitters': 0.1.0(@langchain/core@0.3.44(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2))) js-tiktoken: 1.0.19 js-yaml: 4.1.0 jsonpointer: 5.0.1 - langsmith: 0.3.10(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) + langsmith: 0.3.10(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)) openapi-types: 12.1.3 p-retry: 4.6.2 uuid: 10.0.0 @@ -11305,7 +11623,7 @@ snapshots: - openai - ws - langsmith@0.3.10(openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)): + langsmith@0.3.10(openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -11315,7 +11633,7 @@ snapshots: semver: 7.7.1 uuid: 10.0.0 optionalDependencies: - openai: 4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) + openai: 4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2) language-subtag-registry@0.3.23: {} @@ -11371,16 +11689,16 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 9.0.0 - llamaindex@0.9.16(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2): + llamaindex@0.9.17(encoding@0.1.13)(gpt-tokenizer@2.8.1)(tree-sitter@0.22.4)(web-tree-sitter@0.24.7)(ws@8.18.0)(zod@3.24.2): dependencies: - '@llamaindex/cloud': 4.0.2(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1)) + '@llamaindex/cloud': 4.0.3(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1)) '@llamaindex/core': 0.6.2(gpt-tokenizer@2.8.1) '@llamaindex/env': 0.1.29(gpt-tokenizer@2.8.1) '@llamaindex/node-parser': 2.0.2(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))(tree-sitter@0.22.4)(web-tree-sitter@0.24.7) '@llamaindex/openai': 0.3.0(encoding@0.1.13)(gpt-tokenizer@2.8.1)(ws@8.18.0) - '@llamaindex/workflow': 1.0.2(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))(zod@3.24.2) + '@llamaindex/workflow': 1.0.3(@llamaindex/core@0.6.2(gpt-tokenizer@2.8.1))(@llamaindex/env@0.1.29(gpt-tokenizer@2.8.1))(zod@3.24.2) '@types/lodash': 4.17.15 - '@types/node': 22.13.16 + '@types/node': 22.14.0 ajv: 8.17.1 lodash: 4.17.21 magic-bytes.js: 1.10.0 @@ -11435,6 +11753,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + matcher@3.0.0: + dependencies: + escape-string-regexp: 4.0.0 + math-intrinsics@1.1.0: {} mathjs@13.2.3: @@ -11515,8 +11837,14 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + module-details-from-path@1.0.3: {} ms@2.0.0: {} @@ -11687,11 +12015,13 @@ snapshots: dependencies: which-pm-runs: 1.1.0 - onnxruntime-common@1.15.1: {} + onnxruntime-common@1.21.0: {} - onnxruntime-node@1.15.1: + onnxruntime-node@1.21.0: dependencies: - onnxruntime-common: 1.15.1 + global-agent: 3.0.0 + onnxruntime-common: 1.21.0 + tar: 7.4.3 openai-fetch@3.4.2: dependencies: @@ -11701,7 +12031,7 @@ snapshots: dependencies: zod: 3.24.2 - openai@4.91.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): + openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.83 '@types/node-fetch': 2.6.12 @@ -11716,7 +12046,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@4.91.1(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): + openai@4.93.0(encoding@0.1.13)(ws@8.18.0)(zod@3.24.2): dependencies: '@types/node': 18.19.83 '@types/node-fetch': 2.6.12 @@ -11801,7 +12131,7 @@ snapshots: dependencies: '@babel/code-frame': 7.26.2 index-to-position: 0.1.2 - type-fest: 4.39.0 + type-fest: 4.39.1 parse-ms@4.0.0: {} @@ -11901,7 +12231,7 @@ snapshots: pirates@4.0.6: {} - pkce-challenge@4.1.0: {} + pkce-challenge@5.0.0: {} pkg-types@2.1.0: dependencies: @@ -11974,7 +12304,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.13.16 + '@types/node': 22.14.0 long: 5.3.1 proxy-addr@2.0.7: @@ -12064,14 +12394,14 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.39.0 + type-fest: 4.39.1 read-pkg@9.0.1: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 parse-json: 8.1.0 - type-fest: 4.39.0 + type-fest: 4.39.1 unicorn-magic: 0.1.0 readable-stream@4.7.0: @@ -12157,6 +12487,15 @@ snapshots: rfdc@1.4.1: {} + roarr@2.15.4: + dependencies: + boolean: 3.2.0 + detect-node: 2.1.0 + globalthis: 1.0.4 + json-stringify-safe: 5.0.1 + semver-compare: 1.0.0 + sprintf-js: 1.1.3 + rollup@4.36.0: dependencies: '@types/estree': 1.0.6 @@ -12231,6 +12570,8 @@ snapshots: dependencies: parseley: 0.12.1 + semver-compare@1.0.0: {} + semver@6.3.1: {} semver@7.7.1: {} @@ -12270,6 +12611,10 @@ snapshots: transitivePeerDependencies: - supports-color + serialize-error@7.0.1: + dependencies: + type-fest: 0.13.1 + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -12404,6 +12749,8 @@ snapshots: split2@4.2.0: {} + sprintf-js@1.1.3: {} + stackback@0.0.2: {} statuses@2.0.1: {} @@ -12588,6 +12935,15 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + terminal-columns@1.4.1: {} thenify-all@1.6.0: @@ -12735,7 +13091,7 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@4.39.0: {} + type-fest@0.13.1: {} type-fest@4.39.1: {} @@ -12813,8 +13169,6 @@ snapshots: undici-types@6.19.8: {} - undici-types@6.20.0: {} - undici-types@6.21.0: {} unicorn-magic@0.1.0: {} @@ -13069,6 +13423,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@2.7.0: {} yargs-parser@20.2.9: {} diff --git a/legacy/pnpm-workspace.yaml b/legacy/pnpm-workspace.yaml index 90b2a35c..72c04643 100644 --- a/legacy/pnpm-workspace.yaml +++ b/legacy/pnpm-workspace.yaml @@ -6,20 +6,21 @@ updateConfig: - p-throttle - eslint catalog: - '@ai-sdk/openai': ^1.3.7 - '@apidevtools/swagger-parser': ^10.1.1 - '@dexaai/dexter': ^4.1.1 - '@e2b/code-interpreter': ^1.1.0 - '@fisch0920/config': ^1.0.2 - '@langchain/core': ^0.3.43 - '@langchain/openai': ^0.5.4 - '@mastra/core': ^0.7.0 - '@modelcontextprotocol/sdk': ^1.8.0 - '@nangohq/node': 0.42.22 # pinned for now - '@types/jsrsasign': ^10.5.15 - '@types/node': ^22.14.0 - '@xsai/tool': ^0.2.0-beta.3 - ai: ^4.3.2 + "@ai-sdk/openai": ^1.3.9 + "@apidevtools/swagger-parser": ^10.1.1 + "@dexaai/dexter": ^4.1.1 + "@e2b/code-interpreter": ^1.1.0 + "@fisch0920/config": ^1.0.2 + "@googleapis/customsearch": ^3.2.0 + "@langchain/core": ^0.3.44 + "@langchain/openai": ^0.5.5 + "@mastra/core": ^0.8.1 + "@modelcontextprotocol/sdk": ^1.9.0 + "@nangohq/node": 0.42.22 + "@types/jsrsasign": ^10.5.15 + "@types/node": ^22.14.0 + "@xsai/tool": ^0.2.0-beta.3 + ai: ^4.3.4 bumpp: ^10.1.0 camelcase: ^8.0.0 cleye: ^1.3.4 @@ -33,26 +34,27 @@ catalog: execa: ^9.5.2 exit-hook: ^4.0.0 fast-xml-parser: ^5.2.0 - genkit: ^1.5.0 + genkit: ^1.6.0 genkitx-openai: ^0.20.2 - '@googleapis/customsearch': ^3.2.0 + google-auth-library: ^9.15.1 + googleapis: ^148.0.0 json-schema-to-zod: ^2.6.1 jsonrepair: ^3.12.0 jsrsasign: ^10.9.0 ky: ^1.8.0 - langchain: ^0.3.20 + langchain: ^0.3.21 lint-staged: ^15.5.0 - llamaindex: ^0.9.16 + llamaindex: ^0.9.17 mathjs: ^13.2.3 npm-run-all2: ^7.0.2 octokit: ^4.1.2 only-allow: ^1.2.1 - openai: ^4.91.1 + openai: ^4.93.0 openai-fetch: ^3.4.2 openai-zod-to-json-schema: ^1.0.3 openapi-types: ^12.1.3 p-map: ^7.0.3 - p-throttle: 6.2.0 # pinned for now + p-throttle: 6.2.0 prettier: ^3.5.3 restore-cursor: ^5.1.0 simple-git-hooks: ^2.12.1 diff --git a/legacy/readme.md b/legacy/readme.md index d96f56ea..ad89a0c6 100644 --- a/legacy/readme.md +++ b/legacy/readme.md @@ -180,6 +180,7 @@ Full docs are available at [agentic.so](https://agentic.so). | Service / Tool | Package | Docs | Description | | ------------------------------------------------------------------------------- | ------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Airtable](https://airtable.com/developers/web/api/introduction) | `@agentic/airtable` | [docs](https://agentic.so/tools/airtable) | No-code spreadsheets, CRM, and database. | | [Apollo](https://docs.apollo.io) | `@agentic/apollo` | [docs](https://agentic.so/tools/apollo) | B2B person and company enrichment API. | | [ArXiv](https://arxiv.org) | `@agentic/arxiv` | [docs](https://agentic.so/tools/arxiv) | Search for research articles. | | [Bing](https://www.microsoft.com/en-us/bing/apis/bing-web-search-api) | `@agentic/bing` | [docs](https://agentic.so/tools/bing) | Bing web search. | @@ -193,6 +194,8 @@ Full docs are available at [agentic.so](https://agentic.so). | [Exa](https://docs.exa.ai) | `@agentic/exa` | [docs](https://agentic.so/tools/exa) | Web search tailored for LLMs. | | [Firecrawl](https://www.firecrawl.dev) | `@agentic/firecrawl` | [docs](https://agentic.so/tools/firecrawl) | Website scraping and structured data extraction. | | [Google Custom Search](https://developers.google.com/custom-search/v1/overview) | `@agentic/google-custom-search` | [docs](https://agentic.so/tools/google-custom-search) | Official Google Custom Search API. | +| [Google Drive](https://developers.google.com/workspace/drive/api) | `@agentic/google-drive` | [docs](https://agentic.so/tools/google-drive) | Simplified Google Drive API. | +| [Google Docs](https://developers.google.com/workspace/docs/api) | `@agentic/google-docs` | [docs](https://agentic.so/tools/google-docs) | Simplified Google Docs API. | | [Gravatar](https://docs.gravatar.com/api/profiles/rest-api/) | `@agentic/gravatar` | [docs](https://agentic.so/tools/gravatar) | Gravatar profile API. | | [HackerNews](https://github.com/HackerNews/API) | `@agentic/hacker-news` | [docs](https://agentic.so/tools/hacker-news) | Official HackerNews API. | | [Hunter](https://hunter.io) | `@agentic/hunter` | [docs](https://agentic.so/tools/hunter) | Email finder, verifier, and enrichment. | @@ -208,6 +211,7 @@ Full docs are available at [agentic.so](https://agentic.so). | [Polygon](https://polygon.io) | `@agentic/polygon` | [docs](https://agentic.so/tools/polygon) | Stock market and company financial data. | | [PredictLeads](https://predictleads.com) | `@agentic/predict-leads` | [docs](https://agentic.so/tools/predict-leads) | In-depth company data including signals like fundraising events, hiring news, product launches, technologies used, etc. | | [Proxycurl](https://nubela.co/proxycurl) | `@agentic/proxycurl` | [docs](https://agentic.so/tools/proxycurl) | People and company data from LinkedIn & Crunchbase. | +| [Reddit](https://old.reddit.com/dev/api) | `@agentic/reddit` | [docs](https://agentic.so/tools/reddit) | Basic readonly Reddit API for getting top/hot/new/rising posts from subreddits. | | [RocketReach](https://rocketreach.co/api/v2/docs) | `@agentic/rocketreach` | [docs](https://agentic.so/tools/rocketreach) | B2B person and company enrichment API. | | [Searxng](https://docs.searxng.org) | `@agentic/searxng` | [docs](https://agentic.so/tools/searxng) | OSS meta search engine capable of searching across many providers like Reddit, Google, Brave, Arxiv, Genius, IMDB, Rotten Tomatoes, Wikidata, Wolfram Alpha, YouTube, GitHub, [etc](https://docs.searxng.org/user/configured_engines.html#configured-engines). | | [SerpAPI](https://serpapi.com/search-api) | `@agentic/serpapi` | [docs](https://agentic.so/tools/serpapi) | Lightweight wrapper around SerpAPI for Google search. | @@ -217,10 +221,12 @@ Full docs are available at [agentic.so](https://agentic.so). | [Tavily](https://tavily.com) | `@agentic/tavily` | [docs](https://agentic.so/tools/tavily) | Web search API tailored for LLMs. | | [Twilio](https://www.twilio.com/docs/conversations/api) | `@agentic/twilio` | [docs](https://agentic.so/tools/twilio) | Twilio conversation API to send and receive SMS messages. | | [Twitter](https://developer.x.com/en/docs/twitter-api) | `@agentic/twitter` | [docs](https://agentic.so/tools/twitter) | Basic Twitter API methods for fetching users, tweets, and searching recent tweets. Includes support for plan-aware rate-limiting. Uses [Nango](https://www.nango.dev) for OAuth support. | +| [Typeform](https://www.typeform.com/developers/get-started/) | `@agentic/typeform` | [docs](https://agentic.so/tools/typeform) | Readonly Typeform client for fetching form insights and responses. | | [Weather](https://www.weatherapi.com) | `@agentic/weather` | [docs](https://agentic.so/tools/weather) | Basic access to current weather data based on location. | | [Wikidata](https://www.wikidata.org/wiki/Wikidata:Data_access) | `@agentic/wikidata` | [docs](https://agentic.so/tools/wikidata) | Basic Wikidata client. | | [Wikipedia](https://www.mediawiki.org/wiki/API) | `@agentic/wikipedia` | [docs](https://agentic.so/tools/wikipedia) | Wikipedia page search and summaries. | | [Wolfram Alpha](https://products.wolframalpha.com/llm-api/documentation) | `@agentic/wolfram-alpha` | [docs](https://agentic.so/tools/wolfram-alpha) | Wolfram Alpha LLM API client for answering computational, mathematical, and scientific questions. | +| [YouTube](https://developers.google.com/youtube/v3) | `@agentic/youtube` | [docs](https://agentic.so/tools/youtube) | YouTube data API v3 for searching YT videos and channels. | | [ZoomInfo](https://api-docs.zoominfo.com) | `@agentic/zoominfo` | [docs](https://agentic.so/tools/zoominfo) | Powerful B2B person and company data enrichment. | > [!NOTE]