diff --git a/package.json b/package.json index b07f137ce0..d298043c53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "firecrawl-cli", - "version": "1.23.4-alexandria-beta.20", + "version": "1.23.4-alexandria-beta.21", "publishConfig": { "tag": "alexandria" }, diff --git a/src/__tests__/alexandria-beta.test.ts b/src/__tests__/alexandria-beta.test.ts index 5fa7915aea..37347c0cb8 100644 --- a/src/__tests__/alexandria-beta.test.ts +++ b/src/__tests__/alexandria-beta.test.ts @@ -255,6 +255,53 @@ it('expands only a selected tool without falling back to a group', async () => { expect(requests).toHaveLength(4); }); +it('inspects a combined tool address in one request and preserves provider errors', async () => { + response = catalogue('tools', [ + { + id: 'pizzahut-com/restaurants/store', + provider: 'pizzahut-com', + capability: 'restaurants/store', + options: { store_number: { type: 'string' } }, + }, + ]); + const result = await cli([ + 'list', + 'pizzahut-com/restaurants/store', + '--json', + ]); + expect(result.code).toBe(0); + expect(requests).toHaveLength(1); + expect(requests[0].body.alexandria[0].options).toEqual({ + providers: ['pizzahut-com'], + capabilities: ['restaurants/store'], + level: 'tools', + expand: ['options', 'response', 'examples'], + limit: 20, + }); + expect(result.stdout).toContain('store_number'); + response = { + success: true, + data: { + creditsCost: 0, + alexandria: [ + { + provider: 'firecrawl', + capability: 'find-tools', + error: { + code: 'unknown_provider', + message: 'Unknown provider', + status: 404, + }, + }, + ], + }, + }; + const missing = await cli(['list', 'missing/restaurants/store', '--json']); + expect(missing.code).not.toBe(0); + expect(requests).toHaveLength(2); + expect(missing.stdout).toContain('unknown_provider'); +}); + it('preserves scoped next requests, pagination and discovery receipts', async () => { const next = { provider: 'firecrawl', diff --git a/src/commands/list.ts b/src/commands/list.ts index 97ee1bfaec..da25586469 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -361,6 +361,25 @@ export async function handleList( if (options.request) return fetchPage(parseFindToolsRequest(options.request).options); if (!path.length) return fetchPage({ level: 'providers', limit }); + if (!options.category && path[0].includes('/')) { + const [provider, ...segments] = path[0].split('/'); + if ( + path.length !== 1 || + !provider || + segments.some((segment) => !segment) + ) + throw new Error( + 'Use list / without extra path arguments.' + ); + return fetchPage({ + providers: [provider], + capabilities: [segments.join('/')], + level: 'tools', + expand: ['options', 'response', 'examples'], + limit, + }); + } + if (options.contracts && options.category && path.length === 1) { return fetchPage({ categories: [categoryId(path[0])],